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

📄 iqpephandler.java

📁 openfire 服务器源码下载
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            PEPService pepService = getPEPService(jidTo);            if (pepService != null) {                pubSubEngine.process(pepService, packet);            }            else {                // Process with PubSub using a dummyService. In the case where an IQ packet is sent to                // a user who does not have a PEP service, we wish to utilize the error reporting flow                // already present in the PubSubEngine. This gives the illusion that every user has a                // PEP service, as required by the specification.                PEPService dummyService = new PEPService(XMPPServer.getInstance(), senderJID.toBareJID());                pubSubEngine.process(dummyService, packet);            }        }        else {            // Ignore IQ packets of type 'error' or 'result'.            return null;        }        // Other error flows were handled in pubSubEngine.process(...)        return null;    }    /**     * Retrieves a PEP service -- attempting first from memory, then from the database. Note     * that if no PEP service was found the next request of the PEP service will hit the     * database since we are not caching 'no PEP services'.     *     * @param jid the bare JID of the user that owns the PEP service.     * @return the requested PEP service if found or null if not found.     */    private PEPService getPEPService(String jid) {        PEPService pepService = pepServices.get(jid);        if (pepService == null) {            pepService = loadPEPServiceFromDB(jid);            // TODO Cache that no PEP service was found so we do not look for it again. Remove from cache when created        }        return pepService;    }    /**     * Generates and processes an IQ stanza that subscribes to a PEP service.     *     * @param pepService the PEP service of the owner.     * @param subscriber the JID of the entity that is subscribing to the PEP service.     * @param owner      the JID of the owner of the PEP service.     */    private void createSubscriptionToPEPService(PEPService pepService, JID subscriber, JID owner) {        // If `owner` has a PEP service, generate and process a pubsub subscription packet        // that is equivalent to: (where 'from' field is JID of subscriber and 'to' field is JID of owner)        //        //        <iq type='set'        //            from='nurse@capulet.com/chamber'        //            to='juliet@capulet.com        //            id='collsub'>        //          <pubsub xmlns='http://jabber.org/protocol/pubsub'>        //            <subscribe jid='nurse@capulet.com'/>        //            <options>        //              <x xmlns='jabber:x:data'>        //                <field var='FORM_TYPE' type='hidden'>        //                  <value>http://jabber.org/protocol/pubsub#subscribe_options</value>        //                </field>        //                <field var='pubsub#subscription_type'>        //                  <value>items</value>        //                </field>        //                <field var='pubsub#subscription_depth'>        //                  <value>all</value>        //                </field>        //              </x>        //           </options>        //         </pubsub>        //        </iq>        IQ subscriptionPacket = new IQ(IQ.Type.set);        subscriptionPacket.setFrom(subscriber);        subscriptionPacket.setTo(owner.toBareJID());        Element pubsubElement = subscriptionPacket.setChildElement("pubsub", "http://jabber.org/protocol/pubsub");        Element subscribeElement = pubsubElement.addElement("subscribe");        subscribeElement.addAttribute("jid", subscriber.toBareJID());        Element optionsElement = pubsubElement.addElement("options");        Element xElement = optionsElement.addElement(QName.get("x", "jabber:x:data"));        DataForm dataForm = new DataForm(xElement);        FormField formField = dataForm.addField();        formField.setVariable("FORM_TYPE");        formField.setType(FormField.Type.hidden);        formField.addValue("http://jabber.org/protocol/pubsub#subscribe_options");        formField = dataForm.addField();        formField.setVariable("pubsub#subscription_type");        formField.addValue("items");        formField = dataForm.addField();        formField.setVariable("pubsub#subscription_depth");        formField.addValue("all");        pubSubEngine.process(pepService, subscriptionPacket);    }    /**     * Cancels a subscription to a PEPService's root collection node.     *     * @param unsubscriber the JID of the subscriber whose subscription is being canceled.     * @param serviceOwner the JID of the owner of the PEP service for which the subscription is being canceled.     */    private void cancelSubscriptionToPEPService(JID unsubscriber, JID serviceOwner) {        // Retrieve recipientJID's PEP service, if it exists.        PEPService pepService = getPEPService(serviceOwner.toBareJID());        if (pepService == null) {            return;        }        // Cancel unsubscriberJID's subscription to recipientJID's PEP service, if it exists.        CollectionNode rootNode = pepService.getRootCollectionNode();        NodeSubscription nodeSubscription = rootNode.getSubscription(unsubscriber);        if (nodeSubscription != null) {            rootNode.cancelSubscription(nodeSubscription);        }    }    /**     * Implements ServerIdentitiesProvider and UserIdentitiesProvider, adding     * the PEP identity to the respective disco#info results.     */    public Iterator<Element> getIdentities() {        ArrayList<Element> identities = new ArrayList<Element>();        Element identity = DocumentHelper.createElement("identity");        identity.addAttribute("category", "pubsub");        identity.addAttribute("type", "pep");        identities.add(identity);        return identities.iterator();    }    /**     * Implements ServerFeaturesProvider to include all supported XEP-0060 features     * in the server's disco#info result (as per section 4 of XEP-0163).     */    public Iterator<String> getFeatures() {        return XMPPServer.getInstance().getPubSubModule().getFeatures(null, null, null);    }    /**     * Implements UserItemsProvider, adding PEP related items to a disco#items     * result.     */    public Iterator<Element> getUserItems(String name, JID senderJID) {        ArrayList<Element> items = new ArrayList<Element>();        String recipientJID = XMPPServer.getInstance().createJID(name, null, true).toBareJID();        PEPService pepService = getPEPService(recipientJID);        if (pepService != null) {            CollectionNode rootNode = pepService.getRootCollectionNode();            Element defaultItem = DocumentHelper.createElement("item");            defaultItem.addAttribute("jid", recipientJID);            for (Node node : pepService.getNodes()) {                // Do not include the root node as an item element.                if (node == rootNode) {                    continue;                }                AccessModel accessModel = node.getAccessModel();                if (accessModel.canAccessItems(node, senderJID, new JID(recipientJID))) {                    Element item = defaultItem.createCopy();                    item.addAttribute("node", node.getNodeID());                    items.add(item);                }            }        }        return items.iterator();    }    public void subscribedToPresence(JID subscriberJID, JID authorizerJID) {        PEPService pepService = getPEPService(authorizerJID.toBareJID());        if (pepService != null) {            createSubscriptionToPEPService(pepService, subscriberJID, authorizerJID);            // Delete any leaf node subscriptions the subscriber may have already            // had (since a subscription to the PEP service, and thus its leaf PEP            // nodes, would be duplicating publish notifications from previous leaf            // node subscriptions).            CollectionNode rootNode = pepService.getRootCollectionNode();            for (Node node : pepService.getNodes()) {                if (rootNode.isChildNode(node)) {                    for (NodeSubscription subscription : node.getSubscriptions(subscriberJID)) {                        node.cancelSubscription(subscription);                    }                }            }            pepService.sendLastPublishedItems(subscriberJID);        }    }    public void unsubscribedToPresence(JID unsubscriberJID, JID recipientJID) {        cancelSubscriptionToPEPService(unsubscriberJID, recipientJID);    }    public void availableSession(ClientSession session, Presence presence) {        // Do nothing if server is not enabled        if (!isEnabled()) {            return;        }        JID newlyAvailableJID = presence.getFrom();        if (newlyAvailableJID == null) {            return;        }        // Store the JID of the session that became online. The processing of this        // event will take place in another thread to improve performance of the server        availableSessions.add(newlyAvailableJID);    }    public void remoteUserAvailable(Presence presence) {        // Do nothing if server is not enabled        if (!isEnabled()) {            return;        }        JID jidFrom = presence.getFrom();        JID jidTo = presence.getTo();        // Manage the cache of remote presence resources.        Set<JID> remotePresenceSet = knownRemotePresences.get(jidTo.toBareJID());        if (jidFrom.getResource() != null) {            if (remotePresenceSet != null) {                remotePresenceSet.add(jidFrom);            }            else {                remotePresenceSet = new HashSet<JID>();                remotePresenceSet.add(jidFrom);                knownRemotePresences.put(jidTo.toBareJID(), remotePresenceSet);            }            // TODO Check the roster presence subscription to allow or ignore the received presence.            // TODO Directed presences should be ignored when no presence subscription exists            // Send the presence packet recipient's last published items to the remote user.            PEPService pepService = getPEPService(jidTo.toBareJID());            if (pepService != null) {                pepService.sendLastPublishedItems(jidFrom);            }        }    }    public void remoteUserUnavailable(Presence presence) {        // Do nothing if server is not enabled        if (!isEnabled()) {            return;        }        JID jidFrom = presence.getFrom();        JID jidTo = presence.getTo();        // Manage the cache of remote presence resources.        Set<JID> remotePresenceSet = knownRemotePresences.get(jidTo.toBareJID());        if (remotePresenceSet != null) {            remotePresenceSet.remove(jidFrom);        }    }    public void contactDeleted(Roster roster, RosterItem item) {        JID rosterOwner = XMPPServer.getInstance().createJID(roster.getUsername(), null);        JID deletedContact = item.getJid();        cancelSubscriptionToPEPService(deletedContact, rosterOwner);    }    public void userDeleting(User user, Map<String, Object> params) {        JID bareJID = XMPPServer.getInstance().createJID(user.getUsername(), null);        PEPService pepService = getPEPService(bareJID.toString());        if (pepService == null) {            return;        }        // Delete the user's PEP nodes from memory and the database.        CollectionNode rootNode = pepService.getRootCollectionNode();        for (Node node : pepService.getNodes()) {            if (rootNode.isChildNode(node)) {                node.delete();            }        }        rootNode.delete();        // Remove the user's PEP service, finally.        pepServices.remove(bareJID.toString());    }    /**     *  The following functions are unimplemented required interface methods.     */    public void unavailableSession(ClientSession session, Presence presence) {        // Do nothing    }    public void presenceChanged(ClientSession session, Presence presence) {        // Do nothing    }    public void presencePriorityChanged(ClientSession session, Presence presence) {        // Do nothing    }    public boolean addingContact(Roster roster, RosterItem item, boolean persistent) {        // Do nothing        return true;    }    public void contactAdded(Roster roster, RosterItem item) {        // Do nothing    }    public void contactUpdated(Roster roster, RosterItem item) {        // Do nothing    }    public void rosterLoaded(Roster roster) {        // Do nothing    }    public void userCreated(User user, Map<String, Object> params) {        // Do nothing    }    public void userModified(User user, Map<String, Object> params) {        // Do nothing    }}

⌨️ 快捷键说明

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