Home | History | Annotate | Download | only in smackx
      1 /**
      2  * $RCSfile: PEPManager.java,v $
      3  * $Revision: 1.4 $
      4  * $Date: 2007/11/06 21:43:40 $
      5  *
      6  * Copyright 2003-2007 Jive Software.
      7  *
      8  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *     http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  */
     20 
     21 package org.jivesoftware.smackx;
     22 
     23 import java.util.ArrayList;
     24 import java.util.List;
     25 
     26 import org.jivesoftware.smack.PacketListener;
     27 import org.jivesoftware.smack.Connection;
     28 import org.jivesoftware.smack.filter.PacketExtensionFilter;
     29 import org.jivesoftware.smack.filter.PacketFilter;
     30 import org.jivesoftware.smack.packet.Message;
     31 import org.jivesoftware.smack.packet.Packet;
     32 import org.jivesoftware.smack.packet.IQ.Type;
     33 import org.jivesoftware.smackx.packet.PEPEvent;
     34 import org.jivesoftware.smackx.packet.PEPItem;
     35 import org.jivesoftware.smackx.packet.PEPPubSub;
     36 
     37 /**
     38  *
     39  * Manages Personal Event Publishing (XEP-163). A PEPManager provides a high level access to
     40  * pubsub personal events. It also provides an easy way
     41  * to hook up custom logic when events are received from another XMPP client through PEPListeners.
     42  *
     43  * Use example:
     44  *
     45  * <pre>
     46  *   PEPManager pepManager = new PEPManager(smackConnection);
     47  *   pepManager.addPEPListener(new PEPListener() {
     48  *       public void eventReceived(String inFrom, PEPEvent inEvent) {
     49  *           LOGGER.debug("Event received: " + inEvent);
     50  *       }
     51  *   });
     52  *
     53  *   PEPProvider pepProvider = new PEPProvider();
     54  *   pepProvider.registerPEPParserExtension("http://jabber.org/protocol/tune", new TuneProvider());
     55  *   ProviderManager.getInstance().addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", pepProvider);
     56  *
     57  *   Tune tune = new Tune("jeff", "1", "CD", "My Title", "My Track");
     58  *   pepManager.publish(tune);
     59  * </pre>
     60  *
     61  * @author Jeff Williams
     62  */
     63 public class PEPManager {
     64 
     65     private List<PEPListener> pepListeners = new ArrayList<PEPListener>();
     66 
     67     private Connection connection;
     68 
     69     private PacketFilter packetFilter = new PacketExtensionFilter("event", "http://jabber.org/protocol/pubsub#event");
     70     private PacketListener packetListener;
     71 
     72     /**
     73      * Creates a new PEP exchange manager.
     74      *
     75      * @param connection a Connection which is used to send and receive messages.
     76      */
     77     public PEPManager(Connection connection) {
     78         this.connection = connection;
     79         init();
     80     }
     81 
     82     /**
     83      * Adds a listener to PEPs. The listener will be fired anytime PEP events
     84      * are received from remote XMPP clients.
     85      *
     86      * @param pepListener a roster exchange listener.
     87      */
     88     public void addPEPListener(PEPListener pepListener) {
     89         synchronized (pepListeners) {
     90             if (!pepListeners.contains(pepListener)) {
     91                 pepListeners.add(pepListener);
     92             }
     93         }
     94     }
     95 
     96     /**
     97      * Removes a listener from PEP events.
     98      *
     99      * @param pepListener a roster exchange listener.
    100      */
    101     public void removePEPListener(PEPListener pepListener) {
    102         synchronized (pepListeners) {
    103             pepListeners.remove(pepListener);
    104         }
    105     }
    106 
    107     /**
    108      * Publish an event.
    109      *
    110      * @param item the item to publish.
    111      */
    112     public void publish(PEPItem item) {
    113         // Create a new message to publish the event.
    114         PEPPubSub pubSub = new PEPPubSub(item);
    115         pubSub.setType(Type.SET);
    116         //pubSub.setFrom(connection.getUser());
    117 
    118         // Send the message that contains the roster
    119         connection.sendPacket(pubSub);
    120     }
    121 
    122     /**
    123      * Fires roster exchange listeners.
    124      */
    125     private void firePEPListeners(String from, PEPEvent event) {
    126         PEPListener[] listeners = null;
    127         synchronized (pepListeners) {
    128             listeners = new PEPListener[pepListeners.size()];
    129             pepListeners.toArray(listeners);
    130         }
    131         for (int i = 0; i < listeners.length; i++) {
    132             listeners[i].eventReceived(from, event);
    133         }
    134     }
    135 
    136     private void init() {
    137         // Listens for all roster exchange packets and fire the roster exchange listeners.
    138         packetListener = new PacketListener() {
    139             public void processPacket(Packet packet) {
    140                 Message message = (Message) packet;
    141                 PEPEvent event = (PEPEvent) message.getExtension("event", "http://jabber.org/protocol/pubsub#event");
    142                 // Fire event for roster exchange listeners
    143                 firePEPListeners(message.getFrom(), event);
    144             };
    145 
    146         };
    147         connection.addPacketListener(packetListener, packetFilter);
    148     }
    149 
    150     public void destroy() {
    151         if (connection != null)
    152             connection.removePacketListener(packetListener);
    153 
    154     }
    155 
    156     protected void finalize() throws Throwable {
    157         destroy();
    158         super.finalize();
    159     }
    160 }
    161