Author: mjakl
Date: Sat Jul  4 14:08:53 2009
New Revision: 791129

URL: http://svn.apache.org/viewvc?rev=791129&view=rev
Log:
Create Node (open access) implemented. Fixes VYSPER-55.

Modified:
    
mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/ErrorStanzaGenerator.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/model/CollectionNode.java
    
mina/sandbox/vysper/trunk/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubCreateNodeTestCase.java

Modified: 
mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/ErrorStanzaGenerator.java
URL: 
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/ErrorStanzaGenerator.java?rev=791129&r1=791128&r2=791129&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/ErrorStanzaGenerator.java
 (original)
+++ 
mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/ErrorStanzaGenerator.java
 Sat Jul  4 14:08:53 2009
@@ -138,4 +138,16 @@
         XMLElement invalidJID = new XMLElement(INVALID_JID, 
NamespaceURIs.XEP0060_PUBSUB_ERRORS, (Attribute[])null, (XMLFragment[])null);
         return errorResponses.getStanzaError(StanzaErrorCondition.BAD_REQUEST, 
stanza, StanzaErrorType.MODIFY, null, null, invalidJID);
     }
+
+    /**
+     * Create a conflict error stanza. For example if a node with an existing 
nodeID is to be created.
+     * 
+     * @param sender
+     * @param receiver
+     * @param stanza
+     * @return
+     */
+    public Stanza generateDuplicateNodeErrorStanza(Entity sender, Entity 
receiver, IQStanza stanza) {       
+        return errorResponses.getStanzaError(StanzaErrorCondition.CONFLICT, 
stanza, StanzaErrorType.CANCEL, null, null, null);
+    }
 }

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=791129&r1=791128&r2=791129&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
 Sat Jul  4 14:08:53 2009
@@ -20,7 +20,15 @@
 package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
 
 import org.apache.vysper.compliance.SpecCompliant;
+import org.apache.vysper.xmpp.addressing.Entity;
 import 
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
+import 
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.DuplicateNodeException;
+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;
 
 
 /**
@@ -47,4 +55,31 @@
         return "create";
     }
 
+    /**
+     * This method takes care of handling the "create" use-case including all 
(relevant) error conditions.
+     * 
+     * @return the appropriate response stanza (either success or some error 
condition).
+     */
+    @Override
+    @SpecCompliant(spec="xep-0060", section="8.1", status= 
SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage = 
SpecCompliant.ComplianceCoverage.UNSUPPORTED)
+    protected Stanza handleSet(IQStanza stanza,
+            ServerRuntimeContext serverRuntimeContext,
+            SessionContext sessionContext) {
+        Entity sender = stanza.getFrom();
+        Entity receiver = stanza.getTo();
+
+        String iqStanzaID = stanza.getAttributeValue("id");
+
+        StanzaBuilder sb = StanzaBuilder.createIQStanza(receiver, sender, 
IQStanzaType.RESULT, iqStanzaID);
+
+        String nodeName = extractNodeName(stanza);
+
+        try {
+            root.createNode(receiver, nodeName);
+        } catch (DuplicateNodeException e) {
+            return 
errorStanzaGenerator.generateDuplicateNodeErrorStanza(sender, receiver, stanza);
+        }
+
+        return new IQStanza(sb.getFinalStanza());
+    }
 }

Modified: 
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=791129&r1=791128&r2=791129&view=diff
==============================================================================
--- 
mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNode.java
 (original)
+++ 
mina/sandbox/vysper/trunk/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/CollectionNode.java
 Sat Jul  4 14:08:53 2009
@@ -91,13 +91,13 @@
     /**
      * Convenience method to create a node without a free-text name (optional).
      * 
-     * @param jid the JID of the new node.
+     * @param serverJID the JID of the server new node lies on.
      * @param nodeName the unique name of the node
      * @return the newly create LeafNode
      * @throws DuplicateNodeException
      */
-    public LeafNode createNode(Entity jid, String nodeName) throws 
DuplicateNodeException {
-        return this.createNode(jid, nodeName, null);
+    public LeafNode createNode(Entity serverJID, String nodeName) throws 
DuplicateNodeException {
+        return this.createNode(serverJID, nodeName, null);
     }
 
     /**

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=791129&r1=791128&r2=791129&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
 Sat Jul  4 14:08:53 2009
@@ -22,9 +22,14 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 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.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
 
 /**
  * @author The Apache MINA Project (http://mina.apache.org)
@@ -61,4 +66,43 @@
         return new PubSubCreateNodeHandler(root);
     }
 
+    public void testCreate() throws Exception {
+        String testNode = "test";
+        assertNull(root.find(testNode)); // shouldn't be there
+        
+        AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
+        Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
+        ResponseStanzaContainer result = sendStanza(stanza, true);
+        assertTrue(result.hasResponse());
+        IQStanza response = new IQStanza(result.getResponseStanza());
+        assertEquals(IQStanzaType.RESULT.value(),response.getType());
+
+        assertEquals("id123", response.getAttributeValue("id")); // IDs must 
match
+        
+        LeafNode n = root.find(testNode);
+        assertEquals(testNode, n.getName());
+    }
+    
+    public void testCreateDuplicate() throws Exception {
+        String testNode = "test";
+        root.createNode(pubsubService, testNode);
+        assertNotNull(root.find(testNode)); // should be there
+        
+        AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
+        Stanza stanza = sg.getStanza(client, pubsubService, "id123", testNode);
+        ResponseStanzaContainer result = sendStanza(stanza, true);
+        assertTrue(result.hasResponse());
+        IQStanza response = new IQStanza(result.getResponseStanza());
+        assertEquals(IQStanzaType.ERROR.value(),response.getType());
+        assertEquals("id123", response.getAttributeValue("id")); // IDs must 
match
+        
+        XMLElement error = response.getInnerElements().get(1); // jump over 
the original request
+        XMLElement conflict = error.getFirstInnerElement();
+        
+        assertEquals("error", error.getName());
+        assertEquals("cancel", error.getAttributeValue("type"));
+        
+        assertEquals("conflict", conflict.getName());
+        assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS, 
conflict.getNamespace());
+    }
 }


Reply via email to