⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bspubsubbean.java

📁 一款即时通讯软件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package edu.ou.kmi.buddyspace.plugins.pubsub.core;

/*
 * BSPubsubBean.java
 *
 * Project: BuddySpace
 * (C) Copyright Knowledge Media Institute 2003
 *
 *
 * Created on 3 October 2003, 11:26
 */

import java.util.*;
import org.jabber.jabberbeans.*;
import org.jabber.jabberbeans.util.*;
import org.jabber.jabberbeans.Extension.*;

import edu.ou.kmi.buddyspace.xml.*;
import edu.ou.kmi.buddyspace.plugins.pubsub.xml.*;

/**
 * <code>BSPubsubBean</code> provides jabber pubsub.
 * It relies on <code>IQBean</code> (this must be reset after reconnection).
 *
 * @author  Jiri Komzak, Knowledge Media Institute, Open University, United Kingdom
 */
public class BSPubsubBean implements PacketListener {
    protected ConnectionBean connBean = null;
    protected Vector pubsubListeners = null;
    protected final String name = "PubSub";

    /**
     * Constructor
     */
    public BSPubsubBean() {
        pubsubListeners = new Vector();
    }

    /**
     * Sets existing and connected <code>ConnectionBean</code>.
     * Then this is registered as listener for packets.
     */
    public void setConnection(ConnectionBean connBean) {
        if (this.connBean != null)
            this.connBean.delPacketListener(this);
        this.connBean = connBean;
        if (connBean != null)
            connBean.addPacketListener(this);
    }

    /**
     * Returns currently used <code>ConnectionBean</code>.
     */
    public ConnectionBean getConnection() {
        return connBean;
    }


    /** Called when disconnected */
    public void disconnected() {
        if (connBean != null)
            connBean.delPacketListener(this);
        connBean = null;
    }


    /** Creates node with given name or instant node if name empty. */
    public boolean createNode(JID jid, String nodeName, PacketID id) {
        if (connBean == null || jid == null) return false;

        try {
            IQPubsubBuilder pb = new IQPubsubBuilder();
            PubsubCreateBuilder pcb = new PubsubCreateBuilder();
            pcb.setNode(nodeName);
            pb.setChild(new PubsubCreate(pcb));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }

    private class RetractItem extends XData
    {
        String id;
        RetractItem(String id) throws InstantiationException {
            super(new XDataBuilder());
            this.id = id;
        }

        public void appendItem(StringBuffer retval) {
            retval.append("<item id=\"" + id + "\"/>");
        }
    }

    /** Retracts given node item. */
    public boolean retractItem(JID jid, String nodeName, String itemID, PacketID id) {
        if (connBean == null || nodeName == null || jid == null) return false;

        try {
            IQPubsubBuilder pb = new IQPubsubBuilder();
            PubsubOwnerOpsBuilder poob = new PubsubOwnerOpsBuilder();
            poob.setName("retract");
            poob.setNode(nodeName);
            poob.setForm(new RetractItem(itemID));

            pb.setChild(new PubsubOwnerOps(poob));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Deletes given node. */
    public boolean deleteNode(JID jid, String nodeName, PacketID id) {
        if (connBean == null || nodeName == null || jid == null) return false;

        try {
            IQPubsubBuilder pb = new IQPubsubBuilder();
            PubsubOwnerOpsBuilder poob = new PubsubOwnerOpsBuilder();
            poob.setName("delete");
            poob.setNode(nodeName);
            pb.setChild(new PubsubOwnerOps(poob));
            IQPubsub iqp = new IQPubsub(pb);

            // pubsub on buddyspace doesn't like the '#owner' namespace for
            // delete command, but wildfire pubsub requires it!
            iqp.useOwnerNamespace = !jid.toSimpleString().equals("pubsub.buddyspace.org");

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Purges given node. */
    public boolean purgeNode(JID jid, String nodeName, PacketID id) {
        if (connBean == null || nodeName == null || jid == null) return false;

        try {
            PubsubOwnerOpsBuilder poob = new PubsubOwnerOpsBuilder();
            poob.setName("purge");
            poob.setNode(nodeName);

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubOwnerOps(poob));
            IQPubsub iqp = new IQPubsub(pb);

            // pubsub on buddyspace doesn't like the '#owner' namespace for
            // purge command, but wildfire pubsub requires it!
            iqp.useOwnerNamespace = !jid.toSimpleString().equals("pubsub.buddyspace.org");

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Publishes given xml into given jid and node */
    public boolean publishItem(XMLData xmlData, String itemID,
                               JID jid, String nodeName, PacketID id) {
        if (connBean == null || nodeName == null ||
            jid == null || xmlData == null) return false;

        try {
            PubsubItemBuilder pib = new PubsubItemBuilder();
            pib.setIsItem(true);
            pib.setId(itemID);
            pib.setXML(xmlData);

            PubsubPublishBuilder ppb = new PubsubPublishBuilder();
            ppb.setIsPublish(true);

            ppb.setNode(nodeName);
            ppb.addItem(new PubsubItem(pib));

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubPublish(ppb));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }

    /** Deletes item with given id from jid and node */
    public boolean deleteItem(String itemID, JID jid, String nodeName, PacketID id) {
        if (connBean == null || nodeName == null ||
            jid == null || itemID == null) return false;

        try {
            PubsubItemBuilder pib = new PubsubItemBuilder();
            pib.setIsItem(true);
            pib.setId(itemID);

            PubsubPublishBuilder ppb = new PubsubPublishBuilder();
            ppb.setIsPublish(false);    // that means it's rectract
            ppb.setNode(nodeName);
            ppb.addItem(new PubsubItem(pib));

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubPublish(ppb));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Subscribes to the node. */
    public boolean subscribeToNode(JID subscriberJID, JID jid,
                                   String nodeName, PacketID id) {
        return subscribeToNode(subscriberJID, true, jid, nodeName, id);
    }


    /** Unsubscribes from the node. */
    public boolean unsubscribeFromNode(JID subscriberJID, JID jid,
                                   String nodeName, PacketID id) {
        return subscribeToNode(subscriberJID, false, jid, nodeName, id);
    }


    /** Subscribes/unsubscribes to/from the node.
     * If <code>subscribe</code> is <code>true</code> subscribes,
     * otherwise unsubscribes.
     */
    protected boolean subscribeToNode(JID subscriberJID, boolean subscribe, JID jid,
                                   String nodeName, PacketID id) {
        if (connBean == null || nodeName == null || jid == null) return false;

        try {
            PubsubSubscribeBuilder psb = new PubsubSubscribeBuilder();
            psb.setIsUnsubscribe(!subscribe);
            psb.setNode(nodeName);
            psb.setJID(subscriberJID);

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubSubscribe(psb));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Send owner request for all pending subscription requests */
    public boolean requestAllPendingSubscriptions(JID jid,
                                   /*String nodeName,*/ PacketID id) {
        if (connBean == null || /*nodeName == null ||*/ jid == null) return false;

        try {
            XPubsubOwnerBuilder pob = new XPubsubOwnerBuilder();
            pob.setAction("get-pending");

            MessageBuilder mb = new MessageBuilder();
            mb.setToAddress(jid);
            mb.setIdentifier(id.getID());
            mb.addExtension(new XPubsubOwner(pob));
            Message m = (Message) mb.build();
            if (id != null) id.setID(m.getIdentifier());

            connBean.send(m);
            return true;
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Requests all current affiliations */
    public boolean requestAffiliations(JID jid,
                                   /*String nodeName,*/ PacketID id) {
        if (connBean == null || /*nodeName == null ||*/ jid == null) return false;

        try {
            PubsubAffiliationsBuilder pab = new PubsubAffiliationsBuilder();

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubAffiliations(pab));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "get", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Requests subscription options. */
    public boolean requestSubscriptionOptions(JID subscriberJID, JID jid,
                                   String nodeName, PacketID id) {
        if (connBean == null || nodeName == null || jid == null || subscriberJID == null)
            return false;

        try {
            PubsubOptionsBuilder pob = new PubsubOptionsBuilder();
            pob.setNode(nodeName);
            pob.setJID(subscriberJID);

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubOptions(pob));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "get", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Sets subscription options. */
    public boolean setSubscriptionOptions(XData form, JID subscriberJID, JID jid,
                                   String nodeName, PacketID id) {
        if (connBean == null || nodeName == null || jid == null
            || subscriberJID == null || form == null) return false;

        try {
            PubsubOptionsBuilder pob = new PubsubOptionsBuilder();
            pob.setNode(nodeName);
            pob.setJID(subscriberJID);
            pob.setForm(form);

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubOptions(pob));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "set", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Requests all active items. */
    public boolean requestItems(JID jid, String nodeName, PacketID id) {
        return requestItems(-1, jid, nodeName, id);
    }


    /** Requests most recent active items. <code>maxItems</code> is maximum
     * number of items returned. Gets all items for <code>maxItems</code> equal -1.*/
    public boolean requestItems(int maxItems, JID jid, String nodeName, PacketID id) {
        if (connBean == null || nodeName == null || jid == null) return false;

        try {
            PubsubItemsBuilder pib = new PubsubItemsBuilder();
            pib.setMaxItems(((maxItems == -1)? null : Integer.toString(maxItems)));
            pib.setNode(nodeName);

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubItems(pib));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "get", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Requests items with given IDs. If no IDs specified asks for all active.*/
    public boolean requestItems(String[] ids, JID jid, String nodeName, PacketID id) {
        if (connBean == null || nodeName == null || jid == null) return false;

        try {
            PubsubItemsBuilder pib = new PubsubItemsBuilder();
            pib.setNode(nodeName);

            PubsubItemBuilder pitemb = new PubsubItemBuilder();
            for (int i=0; ids != null && i < ids.length; i++) {
                pitemb.reset();
                pitemb.setIsItem(true);
                pitemb.setId(ids[i]);
                pib.addItem(new PubsubItem(pitemb));
            }

            IQPubsubBuilder pb = new IQPubsubBuilder();
            pb.setChild(new PubsubItems(pib));
            IQPubsub iqp = new IQPubsub(pb);

            return sendIQ(iqp, jid, "get", id);
        } catch (InstantiationException e) {
            return false;
        }
    }


    /** Sends request for configuration of given node. */
    public boolean requestNodeConfiguration(JID jid, String nodeName, PacketID id) {
        if (nodeName == null) return false;
        return requestNodeConfImpl(jid, nodeName, id);
    }


    /** Sends request for default configuration of node. */
    public boolean requestDefaultNodeConfiguration(JID jid, PacketID id) {
        return requestNodeConfImpl(jid, null, id);
    }


    /** Sends request for configuration of given node or default configuration

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -