pubsubmodule.java

来自「基于Jabber协议的即时消息服务器」· Java 代码 · 共 694 行 · 第 1/2 页

JAVA
694
字号
                PubSubPersistenceManager.loadDefaultConfiguration(this, false);        if (collectionDefaultConfiguration == null ) {            // Create and save default configuration for collection nodes;            collectionDefaultConfiguration = new DefaultNodeConfiguration(false);            collectionDefaultConfiguration.setAccessModel(AccessModel.open);            collectionDefaultConfiguration.setPublisherModel(PublisherModel.publishers);            collectionDefaultConfiguration.setDeliverPayloads(false);            collectionDefaultConfiguration.setLanguage("English");            collectionDefaultConfiguration.setNotifyConfigChanges(true);            collectionDefaultConfiguration.setNotifyDelete(true);            collectionDefaultConfiguration.setNotifyRetract(true);            collectionDefaultConfiguration.setPresenceBasedDelivery(false);            collectionDefaultConfiguration.setSubscriptionEnabled(true);            collectionDefaultConfiguration.setReplyPolicy(null);            collectionDefaultConfiguration                    .setAssociationPolicy(CollectionNode.LeafNodeAssociationPolicy.all);            collectionDefaultConfiguration.setMaxLeafNodes(-1);            PubSubPersistenceManager                    .createDefaultConfiguration(this, collectionDefaultConfiguration);        }        // Load nodes to memory        PubSubPersistenceManager.loadNodes(this);        // Ensure that we have a root collection node        String rootNodeID = JiveGlobals.getProperty("xmpp.pubsub.root.nodeID", "");        if (nodes.isEmpty()) {            // Create root collection node            String creator = JiveGlobals.getProperty("xmpp.pubsub.root.creator");            JID creatorJID = creator != null ? new JID(creator) : server.getAdmins().iterator().next();            rootCollectionNode = new CollectionNode(this, null, rootNodeID, creatorJID);            // Add the creator as the node owner            rootCollectionNode.addOwner(creatorJID);            // Save new root node            rootCollectionNode.saveToDB();        }        else {            rootCollectionNode = (CollectionNode) getNode(rootNodeID);        }    }    public void start() {        super.start();        // Add the route to this service        routingTable.addRoute(getAddress(), this);        // Start the pubsub engine        engine.start();        ArrayList<String> params = new ArrayList<String>();        params.clear();        params.add(getServiceDomain());        Log.info(LocaleUtils.getLocalizedString("startup.starting.pubsub", params));    }    public void stop() {        super.stop();        // Remove the route to this service        routingTable.removeRoute(getAddress());        // Stop the pubsub engine. This will gives us the chance to        // save queued items to the database.        engine.shutdown();    }    public Iterator<DiscoServerItem> getItems() {        ArrayList<DiscoServerItem> items = new ArrayList<DiscoServerItem>();        items.add(new DiscoServerItem() {            public String getJID() {                return getServiceDomain();            }            public String getName() {                return "Publish-Subscribe service";            }            public String getAction() {                return null;            }            public String getNode() {                return null;            }            public DiscoInfoProvider getDiscoInfoProvider() {                return PubSubModule.this;            }            public DiscoItemsProvider getDiscoItemsProvider() {                return PubSubModule.this;            }        });        return items.iterator();    }    public Iterator<Element> getIdentities(String name, String node, JID senderJID) {        ArrayList<Element> identities = new ArrayList<Element>();        if (name == null && node == null) {            // Answer the identity of the PubSub service            Element identity = DocumentHelper.createElement("identity");            identity.addAttribute("category", "pubsub");            identity.addAttribute("name", "Publish-Subscribe service");            identity.addAttribute("type", "service");            identities.add(identity);        }        else if (name == null) {            // Answer the identity of a given node            Node pubNode = getNode(node);            if (canDiscoverNode(pubNode)) {                Element identity = DocumentHelper.createElement("identity");                identity.addAttribute("category", "pubsub");                identity.addAttribute("type", pubNode.isCollectionNode() ? "collection" : "leaf");                identities.add(identity);            }        }        return identities.iterator();    }    public Iterator<String> getFeatures(String name, String node, JID senderJID) {        ArrayList<String> features = new ArrayList<String>();        if (name == null && node == null) {            // Answer the features of the PubSub service            features.add("http://jabber.org/protocol/pubsub");            if (isCollectionNodesSupported()) {                // Collection nodes are supported                features.add("http://jabber.org/protocol/pubsub#collections");            }            // Configuration of node options is supported            features.add("http://jabber.org/protocol/pubsub#config-node");            // Simultaneous creation and configuration of nodes is supported            features.add("http://jabber.org/protocol/pubsub#create-and-configure");            // Creation of nodes is supported            features.add("http://jabber.org/protocol/pubsub#create-nodes");            // Deletion of nodes is supported            features.add("http://jabber.org/protocol/pubsub#delete-nodes");            // Retrieval of pending subscription approvals is supported            features.add("http://jabber.org/protocol/pubsub#get-pending");            if (isInstantNodeSupported()) {                // Creation of instant nodes is supported                features.add("http://jabber.org/protocol/pubsub#instant-nodes");            }            // Publishers may specify item identifiers            features.add("http://jabber.org/protocol/pubsub#item-ids");            // TODO Time-based subscriptions are supported (clean up thread missing, rest is supported)            //features.add("http://jabber.org/protocol/pubsub#leased-subscription");            // Node meta-data is supported            features.add("http://jabber.org/protocol/pubsub#meta-data");            // Node owners may modify affiliations            features.add("http://jabber.org/protocol/pubsub#modify-affiliations");            // Node owners may manage subscriptions.            features.add("http://jabber.org/protocol/pubsub#manage-subscriptions");            // A single entity may subscribe to a node multiple times            features.add("http://jabber.org/protocol/pubsub#multi-subscribe");            // The outcast affiliation is supported            features.add("http://jabber.org/protocol/pubsub#outcast-affiliation");            // Persistent items are supported            features.add("http://jabber.org/protocol/pubsub#persistent-items");            // Presence-based delivery of event notifications is supported            features.add("http://jabber.org/protocol/pubsub#presence-notifications");            // Publishing items is supported (note: not valid for collection nodes)            features.add("http://jabber.org/protocol/pubsub#publish");            // The publisher affiliation is supported            features.add("http://jabber.org/protocol/pubsub#publisher-affiliation");            // Purging of nodes is supported            features.add("http://jabber.org/protocol/pubsub#purge-nodes");            // Item retraction is supported            features.add("http://jabber.org/protocol/pubsub#retract-items");            // Retrieval of current affiliations is supported            features.add("http://jabber.org/protocol/pubsub#retrieve-affiliations");            // Retrieval of default node configuration is supported.            features.add("http://jabber.org/protocol/pubsub#retrieve-default");            // Item retrieval is supported            features.add("http://jabber.org/protocol/pubsub#retrieve-items");            // Retrieval of current subscriptions is supported.            features.add("http://jabber.org/protocol/pubsub#retrieve-subscriptions");            // Subscribing and unsubscribing are supported            features.add("http://jabber.org/protocol/pubsub#subscribe");            // Configuration of subscription options is supported            features.add("http://jabber.org/protocol/pubsub#subscription-options");            // Default access model for nodes created on the service            String modelName = getDefaultNodeConfiguration(true).getAccessModel().getName();            features.add("http://jabber.org/protocol/pubsub#default_access_model_" + modelName);        }        else if (name == null) {            // Answer the features of a given node            Node pubNode = getNode(node);            if (canDiscoverNode(pubNode)) {                // Answer the features of the PubSub service                features.add("http://jabber.org/protocol/pubsub");            }        }        return features.iterator();    }    public XDataFormImpl getExtendedInfo(String name, String node, JID senderJID) {        if (name == null && node != null) {            // Answer the extended info of a given node            Node pubNode = getNode(node);            if (canDiscoverNode(pubNode)) {                // Get the metadata data form                org.xmpp.forms.DataForm metadataForm = pubNode.getMetadataForm();                // Convert Whack data form into old data form format (will go away someday)                XDataFormImpl dataForm = new XDataFormImpl(DataForm.TYPE_RESULT);                for (org.xmpp.forms.FormField formField : metadataForm.getFields()) {                    XFormFieldImpl field = new XFormFieldImpl(formField.getVariable());                    field.setLabel(formField.getLabel());                    for (String value : formField.getValues()) {                        field.addValue(value);                    }                    dataForm.addField(field);                }                return dataForm;            }        }        return null;    }    public boolean hasInfo(String name, String node, JID senderJID) {        if (name == null && node == null) {            // We always have info about the Pubsub service            return true;        }        else if (name == null) {            // We only have info if the node exists            return hasNode(node);        }        return false;    }    public Iterator<Element> getItems(String name, String node, JID senderJID) {        List<Element> answer = new ArrayList<Element>();        String serviceDomain = getServiceDomain();        if (name == null && node == null) {            Element item;            // Answer all first level nodes            for (Node pubNode : rootCollectionNode.getNodes()) {                if (canDiscoverNode(pubNode)) {                    item = DocumentHelper.createElement("item");                    item.addAttribute("jid", serviceDomain);                    item.addAttribute("node", pubNode.getNodeID());                    item.addAttribute("name", pubNode.getName());                    answer.add(item);                }            }        }        else if (name == null) {            Node pubNode = getNode(node);            if (pubNode != null && canDiscoverNode(pubNode)) {                if (pubNode.isCollectionNode()) {                    Element item;                    // Answer all nested nodes as items                    for (Node nestedNode : pubNode.getNodes()) {                        if (canDiscoverNode(nestedNode)) {                            item = DocumentHelper.createElement("item");                            item.addAttribute("jid", serviceDomain);                            item.addAttribute("node", nestedNode.getNodeID());                            item.addAttribute("name", nestedNode.getName());                            answer.add(item);                        }                    }                }                else {                    // This is a leaf node so answer the published items which exist on the service                    Element item;                    for (PublishedItem publishedItem : pubNode.getPublishedItems()) {                        item = DocumentHelper.createElement("item");                        item.addAttribute("jid", serviceDomain);                        item.addAttribute("name", publishedItem.getID());                        answer.add(item);                    }                }            }            else {                // Answer null to indicate that specified item was not found                return null;            }        }        return answer.iterator();    }    public void broadcast(Node node, Message message, Collection<JID> jids) {        // TODO Possibly use a thread pool for sending packets (based on the jids size)        message.setFrom(getAddress());        for (JID jid : jids) {            message.setTo(jid);            message.setID(                    node.getNodeID() + "__" + jid.toBareJID() + "__" + StringUtils.randomString(5));            router.route(message);        }    }    public void send(Packet packet) {        router.route(packet);    }    public void sendNotification(Node node, Message message, JID jid) {        message.setFrom(getAddress());        message.setTo(jid);        message.setID(                node.getNodeID() + "__" + jid.toBareJID() + "__" + StringUtils.randomString(5));        router.route(message);    }    public Node getNode(String nodeID) {        return nodes.get(nodeID);    }    public Collection<Node> getNodes() {        return nodes.values();    }    private boolean hasNode(String nodeID) {        return getNode(nodeID) != null;    }    public void addNode(Node node) {        nodes.put(node.getNodeID(), node);    }    public void removeNode(String nodeID) {        nodes.remove(nodeID);    }    private boolean canDiscoverNode(Node pubNode) {        return true;    }    /**     * Converts an array to a comma-delimitted String.     *     * @param array the array.     * @return a comma delimtted String of the array values.     */    private static String fromArray(String [] array) {        StringBuilder buf = new StringBuilder();        for (int i=0; i<array.length; i++) {            buf.append(array[i]);            if (i != array.length-1) {                buf.append(",");            }        }        return buf.toString();    }}

⌨️ 快捷键说明

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