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());
+ }
}