You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by be...@apache.org on 2008/11/12 19:05:05 UTC
svn commit: r713443 - in /labs/vysper/src/main/java/org/apache/vysper/xmpp:
modules/roster/ modules/servicediscovery/
modules/servicediscovery/collection/ modules/servicediscovery/handler/
modules/servicediscovery/management/ protocol/
Author: berndf
Date: Wed Nov 12 10:05:04 2008
New Revision: 713443
URL: http://svn.apache.org/viewvc?rev=713443&view=rev
Log:
[vysper] facilitate creation of NamespaceHandlerDictionary extensions & improved LABS-228 (service disco).
Removed:
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/ItemRequest.java
Modified:
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterDictionary.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/ServiceDiscoveryDictionary.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/collection/ServiceCollector.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Feature.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Identity.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoElement.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoRequest.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/ItemRequestListener.java
labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterDictionary.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterDictionary.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterDictionary.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterDictionary.java Wed Nov 12 10:05:04 2008
@@ -27,8 +27,6 @@
public class RosterDictionary extends NamespaceHandlerDictionary {
public RosterDictionary() {
- super(NamespaceURIs.JABBER_IQ_ROSTER);
- register(new RosterIQHandler());
- seal();
+ super(NamespaceURIs.JABBER_IQ_ROSTER, new RosterIQHandler());
}
}
\ No newline at end of file
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/ServiceDiscoveryDictionary.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/ServiceDiscoveryDictionary.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/ServiceDiscoveryDictionary.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/ServiceDiscoveryDictionary.java Wed Nov 12 10:05:04 2008
@@ -27,8 +27,6 @@
public class ServiceDiscoveryDictionary extends NamespaceHandlerDictionary {
public ServiceDiscoveryDictionary() {
- super(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO);
- register(new DiscoInfoIQHandler());
- seal();
+ super(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO, new DiscoInfoIQHandler());
}
}
\ No newline at end of file
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/collection/ServiceCollector.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/collection/ServiceCollector.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/collection/ServiceCollector.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/collection/ServiceCollector.java Wed Nov 12 10:05:04 2008
@@ -17,12 +17,10 @@
package org.apache.vysper.xmpp.modules.servicediscovery.collection;
import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
-import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequestListener;
-import org.apache.vysper.xmpp.modules.servicediscovery.management.ItemRequestListener;
-import org.apache.vysper.xmpp.modules.servicediscovery.management.ServerInfoRequestListener;
+import org.apache.vysper.xmpp.modules.servicediscovery.management.*;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
/**
* on an item or info requests, calls all related listeners and collects what they have to add to the
@@ -30,6 +28,8 @@
*/
public class ServiceCollector implements ServerRuntimeContextService, ServiceDiscoveryRequestListenerRegistry {
+ private static final Feature DEFAULT_FEATURE = new Feature(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO);
+
protected List<InfoRequestListener> infoRequestListeners = new ArrayList<InfoRequestListener>();
protected List<ServerInfoRequestListener> serverInfoRequestListeners = new ArrayList<ServerInfoRequestListener>();
protected List<ItemRequestListener> itemRequestListeners = new ArrayList<ItemRequestListener>();
@@ -46,7 +46,68 @@
itemRequestListeners.add(itemRequestListener);
}
+ /**
+ * collect all server feature and identity info from the listeners
+ */
+ public Set<InfoElement> processServerInfoRequest(InfoRequest infoRequest) {
+ // sorted structure, to place all <feature/> after <identity/>
+ Set<InfoElement> elements = new TreeSet<InfoElement>(new ElementPartitioningComparator());
+ elements.add(DEFAULT_FEATURE);
+ for (ServerInfoRequestListener serverInfoRequestListener : serverInfoRequestListeners) {
+ List<InfoElement> elementList = null;
+ try {
+ elementList = serverInfoRequestListener.getServerInfosFor(infoRequest);
+ } catch (Throwable e) {
+ continue;
+ }
+ if (elements != null) elements.addAll(elementList);
+ }
+ return elements;
+ }
+
+ /**
+ * collect all non-server feature and identity info from the listeners
+ */
+ public Set<InfoElement> processInfoRequest(InfoRequest infoRequest) {
+ // sorted structure, to place all <feature/> after <identity/>
+ Set<InfoElement> elements = new TreeSet<InfoElement>(new ElementPartitioningComparator());
+ elements.add(DEFAULT_FEATURE);
+ for (InfoRequestListener infoRequestListener : infoRequestListeners) {
+ List<InfoElement> elementList = null;
+ try {
+ elementList = infoRequestListener.getInfosFor(infoRequest);
+ } catch (Throwable e) {
+ continue;
+ }
+ if (elementList != null) elements.addAll(elementList);
+ }
+ return elements;
+ }
+
+ /**
+ * collect all item info from the listeners
+ */
+ public Set<Item> processItemRequest(InfoRequest infoRequest) {
+ Set<Item> elements = new HashSet<Item>();
+ for (ItemRequestListener itemRequestListener : itemRequestListeners) {
+ List<Item> elementList = null;
+ try {
+ elementList = itemRequestListener.getItemsFor(infoRequest);
+ } catch (Throwable e) {
+ continue;
+ }
+ if (elements != null) elements.addAll(elementList);
+ }
+ return elements;
+ }
+
public String getServiceName() {
return SERVICE_DISCOVERY_REQUEST_LISTENER_REGISTRY;
}
+
+ static class ElementPartitioningComparator implements Comparator<InfoElement> {
+ public int compare(InfoElement o1, InfoElement o2) {
+ return o1.getElementClassId().compareTo(o2.getElementClassId());
+ }
+ }
}
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java Wed Nov 12 10:05:04 2008
@@ -18,14 +18,21 @@
package org.apache.vysper.xmpp.modules.servicediscovery.handler;
import org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler;
+import org.apache.vysper.xmpp.modules.servicediscovery.collection.ServiceCollector;
+import org.apache.vysper.xmpp.modules.servicediscovery.collection.ServiceDiscoveryRequestListenerRegistry;
+import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoElement;
+import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequest;
+import org.apache.vysper.xmpp.modules.roster.RosterItem;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
-import org.apache.vysper.xmpp.stanza.IQStanza;
-import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
+import org.apache.vysper.xmpp.stanza.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Set;
+
/**
* handles roster get, set, push & result requests
*/
@@ -40,6 +47,45 @@
@Override
protected Stanza handleGet(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) {
- return super.handleGet(stanza, serverRuntimeContext, sessionContext);
+ ServiceCollector serviceCollector = null;
+
+ try {
+ serviceCollector = (ServiceCollector)serverRuntimeContext.getServerRuntimeContextService(ServiceDiscoveryRequestListenerRegistry.SERVICE_DISCOVERY_REQUEST_LISTENER_REGISTRY);
+ } catch (Exception e) {
+ logger.error("error retrieving ServiceCollector service {}", e);
+ serviceCollector = null;
+ }
+
+ if (serviceCollector == null) {
+ return ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.INTERNAL_SERVER_ERROR, stanza,
+ StanzaErrorType.CANCEL,
+ "cannot retrieve IQ-get-info result from internal components",
+ getErrorLanguage(serverRuntimeContext, sessionContext), null);
+ }
+
+ boolean isServerInfoRequest = serverRuntimeContext.getServerEnitity().equals(stanza.getTo());
+
+ // collect all the info response elements
+ Set<InfoElement> elementSet = null;
+ if (isServerInfoRequest) {
+ elementSet = serviceCollector.processServerInfoRequest(new InfoRequest(stanza.getFrom(), stanza.getTo()));
+ } else {
+ elementSet = serviceCollector.processInfoRequest(new InfoRequest(stanza.getFrom(), stanza.getTo()));
+ }
+
+ //TODO check that elementSet contains at least one identity element and on feature element!
+
+ // render the stanza with information collected
+ StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), IQStanzaType.RESULT, stanza.getID()).
+ startInnerElement("query").
+ addNamespaceAttribute(NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO);
+
+ for (InfoElement infoElement : elementSet) {
+ infoElement.insertElement(stanzaBuilder);
+ }
+
+ stanzaBuilder.endInnerElement();
+
+ return stanzaBuilder.getFinalStanza();
}
}
\ No newline at end of file
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Feature.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Feature.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Feature.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Feature.java Wed Nov 12 10:05:04 2008
@@ -16,17 +16,30 @@
***********************************************************************/
package org.apache.vysper.xmpp.modules.servicediscovery.management;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
/**
*/
public class Feature implements InfoElement {
+ private static final Integer CLASS_ID = 2;
+
protected String var;
public Feature(String var) {
+ if (var == null || var.length() == 0) throw new IllegalArgumentException("var may not be null");
this.var = var;
}
public String getVar() {
return var;
}
+
+ public Integer getElementClassId() {
+ return CLASS_ID;
+ }
+
+ public void insertElement(StanzaBuilder stanzaBuilder) {
+ stanzaBuilder.startInnerElement("feature").addAttribute("var", var).endInnerElement();
+ }
}
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Identity.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Identity.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Identity.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/Identity.java Wed Nov 12 10:05:04 2008
@@ -16,23 +16,28 @@
***********************************************************************/
package org.apache.vysper.xmpp.modules.servicediscovery.management;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
/**
*/
public class Identity implements InfoElement {
-
+
+ private static final Integer CLASS_ID = new Integer(1);
+
protected String category; // required
protected String type; // required
protected String name; // optional
public Identity(String category, String type, String name) {
+ if (category == null || category.length() == 0) throw new IllegalArgumentException("category may not be null");
+ if (type == null || type.length() == 0) throw new IllegalArgumentException("type may not be null");
this.category = category;
this.type = type;
this.name = name;
}
public Identity(String category, String type) {
- this.category = category;
- this.type = type;
+ this(category, type, null);
}
public String getCategory() {
@@ -46,4 +51,18 @@
public String getName() {
return name;
}
+
+ public Integer getElementClassId() {
+ return CLASS_ID;
+ }
+
+ public void insertElement(StanzaBuilder stanzaBuilder) {
+ stanzaBuilder.startInnerElement("identity").
+ addAttribute("category", category).
+ addAttribute("type", type);
+ if (name != null) {
+ stanzaBuilder.addAttribute("name", name);
+ }
+ stanzaBuilder.endInnerElement();
+ }
}
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoElement.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoElement.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoElement.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoElement.java Wed Nov 12 10:05:04 2008
@@ -16,7 +16,12 @@
***********************************************************************/
package org.apache.vysper.xmpp.modules.servicediscovery.management;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
/**
*/
public interface InfoElement {
+ Integer getElementClassId();
+
+ void insertElement(StanzaBuilder stanzaBuilder);
}
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoRequest.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoRequest.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoRequest.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/InfoRequest.java Wed Nov 12 10:05:04 2008
@@ -16,7 +16,25 @@
***********************************************************************/
package org.apache.vysper.xmpp.modules.servicediscovery.management;
+import org.apache.vysper.xmpp.addressing.Entity;
+
/**
*/
public class InfoRequest {
+
+ private Entity from;
+ private Entity to;
+
+ public InfoRequest(Entity from, Entity to) {
+ this.from = from;
+ this.to = to;
+ }
+
+ public Entity getFrom() {
+ return from;
+ }
+
+ public Entity getTo() {
+ return to;
+ }
}
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/ItemRequestListener.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/ItemRequestListener.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/ItemRequestListener.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/management/ItemRequestListener.java Wed Nov 12 10:05:04 2008
@@ -24,6 +24,6 @@
*/
public interface ItemRequestListener {
- public List<Item> getItemsFor(ItemRequest request);
+ public List<Item> getItemsFor(InfoRequest request);
}
Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java?rev=713443&r1=713442&r2=713443&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java Wed Nov 12 10:05:04 2008
@@ -35,6 +35,22 @@
this.namespaceURI = namespaceURI;
}
+ public NamespaceHandlerDictionary(String namespaceURI, List<StanzaHandler> handlerList) {
+ this.namespaceURI = namespaceURI;
+ if (handlerList != null) {
+ for (StanzaHandler stanzaHandler : handlerList) {
+ register(stanzaHandler);
+ }
+ }
+ seal();
+ }
+
+ public NamespaceHandlerDictionary(String namespaceURI, StanzaHandler stanzaHandler) {
+ this.namespaceURI = namespaceURI;
+ register(stanzaHandler);
+ seal();
+ }
+
public String getNamespaceURI() {
return namespaceURI;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org