private void clearCache(Presence presence) { String rjid = presence.getFrom(); if (rjid == null) { LOG.error("presence.getFrom() is null"); return; } DiscoverInfoWrapper infoWrapper = cache.remove(rjid); if (infoWrapper != null) { if (infoWrapper.isAvailable()) { LOG.debug( "clearing cache entry of contact " + rjid + ": " + infoWrapper.item.getChildElementXML()); } else { LOG.debug( "clearing cache entry of contact " + rjid + " but cache entry is empty (a discovery is " + "still running or the last one failed)"); } } }
/** * Perform a service discovery and check if the given feature is among the features supported by * the given recipient. All registered listeners will be notified about the result. * * @param jid A RQ-JID (user@host/resource) of the user to query support for or a non RQ-JID to * query all presences for this JID. * @blocking This method blocks until the ServiceDiscovery returns. * @reentrant This method can be called concurrently. * @caching If results are available in the cache, they are used instead of querying the server. */ private Boolean queryFeatureSupport(JID jid, String namespace) { Boolean supported = null; checkJID(jid); DiscoverInfoWrapper wrapper; final List<JID> jidsToQuery = new ArrayList<JID>(); if (jid.isBareJID()) jidsToQuery.addAll(rosterTracker.getAvailablePresences(jid)); else jidsToQuery.add(jid); for (JID rqJID : jidsToQuery) { // add dummy synchronized (cache) { wrapper = cache.get(rqJID.toString()); if (wrapper == null) { wrapper = new DiscoverInfoWrapper(); cache.put(rqJID.toString(), wrapper); } } DiscoverInfo disco = null; // wait if there is already a discovery for the JID in progress synchronized (wrapper) { if (wrapper.isAvailable()) disco = wrapper.item; else { disco = wrapper.item = performServiceDiscovery(rqJID); if (disco != null) LOG.debug("Inserted DiscoveryInfo into Cache for: " + rqJID); } } // Null means that the discovery failed if (disco == null) { // and so we do not know if the feature is supported // notifyFeatureSupportUpdated(jid, namespace, false); continue; } notifyFeatureSupportUpdated(rqJID, namespace, disco.containsFeature(namespace)); /* * loop through all presence regardless if we already know that the * feature is supported to notify the listener for every current * presence */ if (supported != null) supported |= disco.containsFeature(namespace); else supported = disco.containsFeature(namespace); } return supported; }