You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by be...@apache.org on 2009/05/22 10:35:35 UTC

svn commit: r777430 - in /mina/sandbox/vysper/trunk/src: main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/ main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/ main/java/org/apache/vysper/xmpp/modules/extension/xe...

Author: berndf
Date: Fri May 22 08:35:34 2009
New Revision: 777430

URL: http://svn.apache.org/viewvc?rev=777430&view=rev
Log:
[vysper] (VYSPER-52) ongoing pubsub code and commit comment contributed by Michael Jakl: 
adds the base usecase for subscribing to a node. It does not contain error handling or persistent storage yet. The patch also adds the necessary model classes. The chosen node relationship (for now) is "flat-set" (see XEP-0248, Table1).

Added:
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNode.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/DuplicateNodeException.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNodeTestCase.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNodeTestCase.java
Modified:
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeIQHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/AbstractPubSubGeneralHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/AbstractPubSubOwnerHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerConfigureNodeHandler.java
    mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubConfigureNodeTestCase.java
    mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeIQHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeIQHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeIQHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeIQHandler.java Fri May 22 08:35:34 2009
@@ -21,7 +21,10 @@
 
 import org.apache.vysper.compliance.SpecCompliant;
 import org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
 import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.uuid.JVMBuiltinUUIDGenerator;
+import org.apache.vysper.xmpp.uuid.UUIDGenerator;
 import org.apache.vysper.xmpp.xmlfragment.XMLElement;
 
 /**
@@ -32,6 +35,14 @@
 @SpecCompliant(spec="xep-0060", status= SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage = SpecCompliant.ComplianceCoverage.UNSUPPORTED)
 public abstract class AbstractPublishSubscribeIQHandler extends DefaultIQHandler {
 	
+	protected CollectionNode root;
+	protected UUIDGenerator idGenerator;
+	
+	public AbstractPublishSubscribeIQHandler(CollectionNode root) {
+		this.root = root;
+		this.idGenerator = new JVMBuiltinUUIDGenerator();
+	}
+	
 	@Override
 	protected boolean verifyNamespace(Stanza stanza) {
 		return verifyInnerNamespace(stanza, getNamespace());

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java Fri May 22 08:35:34 2009
@@ -26,6 +26,7 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.PubSubUnsubscribeHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner.PubSubOwnerConfigureNodeHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner.PubSubOwnerDeleteNodeHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.Identity;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoElement;
@@ -47,6 +48,15 @@
  */
 public class PublishSubscribeModule extends DefaultDiscoAwareModule implements ServerInfoRequestListener {
 
+	CollectionNode root = null;
+	
+	/**
+	 * Default constructor takes care of the root-CollectionNode 
+	 */
+	public PublishSubscribeModule() {
+		this.root = new CollectionNode();
+	}
+	
 	@Override
 	public String getName() {
 		return "XEP-0060 Publish-Subscribe";
@@ -73,15 +83,15 @@
     @Override
     protected void addHandlerDictionaries(List<HandlerDictionary> dictionary) {
         ArrayList<StanzaHandler> pubsubHandlers = new ArrayList<StanzaHandler>();
-        pubsubHandlers.add(new PubSubSubscribeHandler());
-        pubsubHandlers.add(new PubSubUnsubscribeHandler());
-        pubsubHandlers.add(new PubSubPublishHandler());
-        pubsubHandlers.add(new PubSubCreateNodeHandler());
+        pubsubHandlers.add(new PubSubSubscribeHandler(root));
+        pubsubHandlers.add(new PubSubUnsubscribeHandler(root));
+        pubsubHandlers.add(new PubSubPublishHandler(root));
+        pubsubHandlers.add(new PubSubCreateNodeHandler(root));
         dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.XEP0060_PUBSUB, pubsubHandlers));
         
         ArrayList<StanzaHandler> pubsubOwnerHandlers = new ArrayList<StanzaHandler>();
-        pubsubOwnerHandlers.add(new PubSubOwnerConfigureNodeHandler());
-        pubsubOwnerHandlers.add(new PubSubOwnerDeleteNodeHandler());
+        pubsubOwnerHandlers.add(new PubSubOwnerConfigureNodeHandler(root));
+        pubsubOwnerHandlers.add(new PubSubOwnerDeleteNodeHandler(root));
         dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.XEP0060_PUBSUB_OWNER, pubsubOwnerHandlers));
     }
 

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/AbstractPubSubGeneralHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/AbstractPubSubGeneralHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/AbstractPubSubGeneralHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/AbstractPubSubGeneralHandler.java Fri May 22 08:35:34 2009
@@ -19,8 +19,11 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
 
+import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeIQHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.stanza.IQStanza;
 
 /**
  * 
@@ -30,9 +33,33 @@
 public abstract class AbstractPubSubGeneralHandler extends
 		AbstractPublishSubscribeIQHandler {
 
+	/**
+	 * @param root
+	 */
+	public AbstractPubSubGeneralHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getNamespace() {
 		return NamespaceURIs.XEP0060_PUBSUB;
 	}
 
+	/**
+	 * Extracts the node name from a given IQ stanza. The node attribute
+	 * takes precedence over the JID resource. The standard requires only
+	 * one of these addressing methods.
+	 * 
+	 * @param stanza the received IQStanza
+	 * @return the node name
+	 */
+	protected String extractNodeName(IQStanza stanza) {
+		String node = stanza.getFirstInnerElement().getAttributeValue("node");
+		if(node == null) {
+			Entity to = stanza.getTo();
+			node = to.getResource();
+		}
+		return node;
+	}
+	
 }

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeHandler.java Fri May 22 08:35:34 2009
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
 
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -26,6 +28,13 @@
  */
 public class PubSubCreateNodeHandler extends AbstractPubSubGeneralHandler {
 
+	/**
+	 * @param root
+	 */
+	public PubSubCreateNodeHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getWorkerElement() {
 		return "create";

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishHandler.java Fri May 22 08:35:34 2009
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
 
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -26,6 +28,13 @@
  */
 public class PubSubPublishHandler extends AbstractPubSubGeneralHandler {
 
+	/**
+	 * @param root
+	 */
+	public PubSubPublishHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getWorkerElement() {
 		return "publish";

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeHandler.java Fri May 22 08:35:34 2009
@@ -19,6 +19,20 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
 
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
+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.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -26,9 +40,68 @@
  */
 public class PubSubSubscribeHandler extends AbstractPubSubGeneralHandler {
 
+	/**
+	 * @param root
+	 */
+	public PubSubSubscribeHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getWorkerElement() {
 		return "subscribe";
 	}
 
+	@Override
+	protected Stanza handleSet(IQStanza stanza,
+			ServerRuntimeContext serverRuntimeContext,
+			SessionContext sessionContext) {
+		Entity sender = stanza.getFrom();
+		Entity receiver = stanza.getTo();
+		Entity subJID = null;
+		
+		StanzaBuilder sb = StanzaBuilder.createIQStanza(receiver, sender, IQStanzaType.RESULT, "id");
+		sb.startInnerElement("pubsub", NamespaceURIs.XEP0060_PUBSUB);
+		
+		XMLElement sub = stanza.getFirstInnerElement().getFirstInnerElement(); // pubsub/subscribe
+		String strSubJID = sub.getAttributeValue("jid"); // MUST
+		
+		try {
+			subJID = EntityImpl.parse(strSubJID);
+		} catch (EntityFormatException e) {
+			// TODO return error stanza... (general error)
+			return null;
+		}
+		
+		if(!sender.getBareJID().equals(subJID.getBareJID())) {
+			// TODO error condition 1 (6.1.3)
+			return null;
+		}
+		
+		String nodeName = extractNodeName(stanza);
+		LeafNode node = root.find(nodeName);
+		
+		if(node == null) {
+			// TODO no such node (error condition 11 (6.1.3))
+			return null;
+		}
+		
+		String id = idGenerator.create();
+		node.subscribe(id, subJID);
+		
+		buildSuccessStanza(sb, nodeName, strSubJID, id);
+		
+		sb.endInnerElement(); // pubsub
+		return new IQStanza(sb.getFinalStanza());
+	}
+	
+	private void buildSuccessStanza(StanzaBuilder sb, String node, String jid, String subid) {
+		sb.startInnerElement("subscription");
+		sb.addAttribute("node", node);
+		sb.addAttribute("jid", jid);
+		sb.addAttribute("subid", subid);
+		sb.addAttribute("subscription", "subscribed");
+		sb.endInnerElement();
+	}
+
 }

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeHandler.java Fri May 22 08:35:34 2009
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
 
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -26,6 +28,13 @@
  */
 public class PubSubUnsubscribeHandler extends AbstractPubSubGeneralHandler {
 
+	/**
+	 * @param root
+	 */
+	public PubSubUnsubscribeHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getWorkerElement() {
 		return "unsubscribe";

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/AbstractPubSubOwnerHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/AbstractPubSubOwnerHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/AbstractPubSubOwnerHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/AbstractPubSubOwnerHandler.java Fri May 22 08:35:34 2009
@@ -20,6 +20,7 @@
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner;
 
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeIQHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 
 /**
@@ -30,6 +31,13 @@
 public abstract class AbstractPubSubOwnerHandler extends
 		AbstractPublishSubscribeIQHandler {
 
+	/**
+	 * @param root
+	 */
+	public AbstractPubSubOwnerHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getNamespace() {
 		return NamespaceURIs.XEP0060_PUBSUB_OWNER;

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerConfigureNodeHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerConfigureNodeHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerConfigureNodeHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerConfigureNodeHandler.java Fri May 22 08:35:34 2009
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner;
 
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -26,6 +28,13 @@
  */
 public class PubSubOwnerConfigureNodeHandler extends AbstractPubSubOwnerHandler {
 
+	/**
+	 * @param root
+	 */
+	public PubSubOwnerConfigureNodeHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getWorkerElement() {
 		return "configure";

Modified: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java (original)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java Fri May 22 08:35:34 2009
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner;
 
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -26,6 +28,13 @@
  */
 public class PubSubOwnerDeleteNodeHandler extends AbstractPubSubOwnerHandler {
 
+	/**
+	 * @param root
+	 */
+	public PubSubOwnerDeleteNodeHandler(CollectionNode root) {
+		super(root);
+	}
+
 	@Override
 	protected String getWorkerElement() {
 		return "delete";

Added: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNode.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNode.java?rev=777430&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNode.java (added)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNode.java Fri May 22 08:35:34 2009
@@ -0,0 +1,51 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * @author The Apache MINA Project (http://mina.apache.org)
+ *
+ */
+public class CollectionNode {
+	
+	protected Map<String, LeafNode> storage;
+	
+	public CollectionNode() {
+		storage = new TreeMap<String, LeafNode>();
+	}
+	
+	public LeafNode find(String name) {
+		return storage.get(name);
+	}
+	
+	public LeafNode createNode(String name) throws DuplicateNodeException {
+		if(storage.containsKey(name)) {
+			throw new DuplicateNodeException(name + " already present");
+		}
+		
+		LeafNode node = new LeafNode(name);
+		storage.put(name, node);
+		
+		return node;
+	}
+}

Added: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/DuplicateNodeException.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/DuplicateNodeException.java?rev=777430&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/DuplicateNodeException.java (added)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/DuplicateNodeException.java Fri May 22 08:35:34 2009
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model;
+
+/**
+ * @author The Apache MINA Project (http://mina.apache.org)
+ *
+ */
+public class DuplicateNodeException extends Exception {
+
+	private static final long serialVersionUID = 4689474856848508356L;
+
+	public DuplicateNodeException(String description) {
+		super(description);
+	}
+}

Added: mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java?rev=777430&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java (added)
+++ mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java Fri May 22 08:35:34 2009
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 
+ * @author The Apache MINA Project (http://mina.apache.org)
+ *
+ */
+public class LeafNode {
+	
+	protected String name;
+	protected Map<String,Entity> setSubscriber;
+	
+	/**
+	 * Creates a new LeafNode with the specified name.
+	 * @param name the name of the node 
+	 */
+	public LeafNode(String name) {
+		this.name = name;
+		this.setSubscriber = new TreeMap<String, Entity>();
+	}
+	
+	public void subscribe(String id, Entity subscriber) {
+		setSubscriber.put(id,subscriber);
+	}
+	
+	public boolean isSubscribed(Entity subscriber) {
+		return setSubscriber.containsValue(subscriber);
+	}
+	
+	public boolean isSubscribed(String subscriptionId) {
+		return setSubscriber.containsKey(subscriptionId);
+	}
+}

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AbstractPublishSubscribeTestCase.java Fri May 22 08:35:34 2009
@@ -24,6 +24,8 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.modules.core.base.handler.IQHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
@@ -43,6 +45,7 @@
     protected Entity client = null;
     protected Entity pubsub = null;
     protected IQHandler handler = null;
+    protected CollectionNode root = null;
     
 	@Override
 	protected void setUp() throws Exception {
@@ -55,6 +58,7 @@
         String boundResourceId = sessionContext.bindResource();
         client = new EntityImpl(clientBare, boundResourceId);
 		pubsub = EntityImpl.parse("pubsub.vysper.org/news");
+		root = new CollectionNode();
 
         setResourceConnected(sessionContext, boundResourceId);
         
@@ -107,6 +111,10 @@
         return stanzaBuilder.getFinalStanza();
 	}
 	
+	protected ResponseStanzaContainer sendStanza(Stanza toSend, boolean isOutboundStanza) {
+		return handler.execute(toSend, sessionContext.getServerRuntimeContext(), isOutboundStanza, sessionContext, null);
+	}
+	
 	public void testSimpleStanza() {
 		Stanza stanza = getStanza();
         

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java Fri May 22 08:35:34 2009
@@ -25,6 +25,8 @@
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.PubSubUnsubscribeTestCase;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner.PubSubConfigureNodeTestCase;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner.PubSubDeleteNodeTestCase;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNodeTestCase;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNodeTestCase;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -46,6 +48,9 @@
 		suite.addTestSuite(PubSubPublishTestCase.class);
 		suite.addTestSuite(PubSubSubscribeTestCase.class);
 		suite.addTestSuite(PubSubUnsubscribeTestCase.class);
+		
+		suite.addTestSuite(CollectionNodeTestCase.class);
+		suite.addTestSuite(LeafNodeTestCase.class);
 		//$JUnit-END$
 		return suite;
 	}

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java Fri May 22 08:35:34 2009
@@ -40,7 +40,7 @@
 
 	@Override
 	protected IQHandler getHandler() {
-		return new PubSubCreateNodeHandler();
+		return new PubSubCreateNodeHandler(root);
 	}
 
 	@Override

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubPublishTestCase.java Fri May 22 08:35:34 2009
@@ -40,7 +40,7 @@
 
 	@Override
 	protected IQHandler getHandler() {
-		return new PubSubPublishHandler();
+		return new PubSubPublishHandler(root);
 	}
 
 	@Override

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubSubscribeTestCase.java Fri May 22 08:35:34 2009
@@ -21,9 +21,13 @@
 
 import org.apache.vysper.xmpp.modules.core.base.handler.IQHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AbstractPublishSubscribeTestCase;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.stanza.IQStanza;
 import org.apache.vysper.xmpp.stanza.IQStanzaType;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -41,7 +45,7 @@
 
 	@Override
 	protected IQHandler getHandler() {
-		return new PubSubSubscribeHandler();
+		return new PubSubSubscribeHandler(root);
 	}
 
 	@Override
@@ -54,4 +58,21 @@
 		return IQStanzaType.SET;
 	}
 
+	public void testSubscribe() throws Exception {
+		LeafNode node = root.createNode(pubsub.getResource()); // use the name of the standard example
+		ResponseStanzaContainer result = sendStanza(getStanza(), true);
+		assertTrue(result.hasResponse());
+		IQStanza response = new IQStanza(result.getResponseStanza());
+		assertEquals(IQStanzaType.RESULT.value(),response.getType());
+		assertTrue(node.isSubscribed(client));
+		
+		// get the subscription Element
+		XMLElement sub = response.getFirstInnerElement().getFirstInnerElement();
+		
+		assertEquals("subscription", sub.getName());
+		assertEquals(pubsub.getResource(), sub.getAttributeValue("node"));
+		assertEquals(client.getFullQualifiedName(), sub.getAttributeValue("jid"));
+		assertNotNull(sub.getAttributeValue("subid")); // it should be present - value unknown
+		assertEquals("subscribed", sub.getAttributeValue("subscription"));
+	}
 }

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubUnsubscribeTestCase.java Fri May 22 08:35:34 2009
@@ -41,7 +41,7 @@
 
 	@Override
 	protected IQHandler getHandler() {
-		return new PubSubUnsubscribeHandler();
+		return new PubSubUnsubscribeHandler(root);
 	}
 
 	@Override

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubConfigureNodeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubConfigureNodeTestCase.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubConfigureNodeTestCase.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubConfigureNodeTestCase.java Fri May 22 08:35:34 2009
@@ -40,7 +40,7 @@
 
 	@Override
 	protected IQHandler getHandler() {
-		return new PubSubOwnerConfigureNodeHandler();
+		return new PubSubOwnerConfigureNodeHandler(root);
 	}
 
 	@Override

Modified: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java?rev=777430&r1=777429&r2=777430&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java (original)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubDeleteNodeTestCase.java Fri May 22 08:35:34 2009
@@ -40,7 +40,7 @@
 
 	@Override
 	protected IQHandler getHandler() {
-		return new PubSubOwnerDeleteNodeHandler();
+		return new PubSubOwnerDeleteNodeHandler(root);
 	}
 
 	@Override

Added: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNodeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNodeTestCase.java?rev=777430&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNodeTestCase.java (added)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNodeTestCase.java Fri May 22 08:35:34 2009
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model;
+
+import junit.framework.TestCase;
+
+/**
+ * @author The Apache MINA Project (http://mina.apache.org)
+ *
+ */
+public class CollectionNodeTestCase extends TestCase  {
+	
+	protected CollectionNode collection;
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		collection = new CollectionNode();
+	}
+	
+	public void testCreateNode() throws Exception {
+		LeafNode test1 = collection.createNode("test1");
+		assertNotNull(test1);
+	}
+
+	public void testCreateNodeTwice() {
+		try {
+			collection.createNode("test1");
+			collection.createNode("test1");
+			fail();
+		} catch(DuplicateNodeException e) {
+			// ok
+		}
+	}
+	
+	public void testInsertFind() throws Exception {
+		LeafNode insertedNode = collection.createNode("test1");
+		LeafNode foundNode = collection.find("test1");
+		assertEquals(insertedNode, foundNode);
+	}
+	
+	public void testFindNone() {
+		assertNull(collection.find("doesnotexist"));
+	}
+	
+}

Added: mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNodeTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNodeTestCase.java?rev=777430&view=auto
==============================================================================
--- mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNodeTestCase.java (added)
+++ mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNodeTestCase.java Fri May 22 08:35:34 2009
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model;
+
+import junit.framework.TestCase;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+
+/**
+ * @author The Apache MINA Project (http://mina.apache.org)
+ *
+ */
+public class LeafNodeTestCase extends TestCase {
+
+	protected LeafNode node;
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		
+		node = new LeafNode("node");
+	}
+	
+	public void testSubscribe() throws Exception {
+		Entity me = EntityImpl.parse("me@vysper.org");
+		node.subscribe("id1", me);
+		assertTrue(node.isSubscribed(me));
+		assertTrue(node.isSubscribed("id1"));
+	}
+}