📄 iqpephandler.java
字号:
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 + -