Author: mjakl
Date: Sat Aug 22 23:35:37 2009
New Revision: 806907
URL: http://svn.apache.org/viewvc?rev=806907&view=rev
Log:
Implemented 8.9.1 of XEP 0060 (Retrieve Affiliations for an owner). This fixes
VYSPER-178.
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/CollectingMemberAffiliationVisitor.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/MemberAffiliationVisitor.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/NodeAffiliationVisitor.java
- copied, changed from r806897,
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/NodeAffiliationVisitor.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsHandler.java
- copied, changed from r806897,
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java
- copied, changed from r806897,
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java
Removed:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/NodeAffiliationVisitor.java
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AffiliationItem.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubPrivilege.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsHandler.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeInMemoryStorageProvider.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeStorageProvider.java
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AffiliationItem.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AffiliationItem.java?rev=806907&r1=806906&r2=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AffiliationItem.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/AffiliationItem.java
Sat Aug 22 23:35:37 2009
@@ -19,21 +19,23 @@
*/
package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub;
+import org.apache.vysper.xmpp.addressing.Entity;
+
/**
* @author The Apache MINA Project (http://mina.apache.org)
*/
public class AffiliationItem {
protected String nodeName = null;
+ protected Entity jid = null;
protected PubSubAffiliation affiliation = null;
/**
* Creates a new affiliation item with the supplied values.
- * @param nodeName
- * @param affil
*/
- public AffiliationItem(String nodeName, PubSubAffiliation affil) {
+ public AffiliationItem(String nodeName, Entity jid, PubSubAffiliation
affil) {
this.nodeName = nodeName;
+ this.jid = jid;
this.affiliation = affil;
}
@@ -50,4 +52,11 @@
public PubSubAffiliation getAffiliation() {
return affiliation;
}
+
+ /**
+ * Returns the JID of the affiliation.
+ */
+ public Entity getJID() {
+ return jid;
+ }
}
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/CollectingMemberAffiliationVisitor.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/CollectingMemberAffiliationVisitor.java?rev=806907&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/CollectingMemberAffiliationVisitor.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/CollectingMemberAffiliationVisitor.java
Sat Aug 22 23:35:37 2009
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * This visitor visits all member-affiliations of a given node and collects it
for later retrieval.
+ *
+ * @author The Apache MINA Project (http://mina.apache.org)
+ */
+public class CollectingMemberAffiliationVisitor implements
MemberAffiliationVisitor {
+ // the list of user <-> nodeName affiliation
+ protected List<AffiliationItem> affiliations = null;
+ private String nodeName;
+
+ /**
+ * Create a new visitor preconfigured with the node name.
+ * @param nodeName
+ */
+ public CollectingMemberAffiliationVisitor(String nodeName) {
+ this.nodeName = nodeName;
+ this.affiliations = new ArrayList<AffiliationItem>();
+ }
+
+ /**
+ * Returns the collected affiliations.
+ */
+ public List<AffiliationItem> getAffiliations() {
+ return affiliations;
+ }
+
+ public void visit(Entity jid, PubSubAffiliation affiliation) {
+ affiliations.add(new AffiliationItem(this.nodeName, jid, affiliation));
+ }
+}
Added:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/MemberAffiliationVisitor.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/MemberAffiliationVisitor.java?rev=806907&view=auto
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/MemberAffiliationVisitor.java
(added)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/MemberAffiliationVisitor.java
Sat Aug 22 23:35:37 2009
@@ -0,0 +1,38 @@
+/*
+ * 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;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+
+/**
+ * This visitor visits all member-affiliations of a given node.
+ *
+ * @author The Apache MINA Project (http://mina.apache.org)
+ */
+public interface MemberAffiliationVisitor {
+ /**
+ * visit is part of the "visitor pattern" and should be used to iterate
+ * over all member-affiliations of a node.
+ *
+ * @param jid
+ * @param affiliation
+ */
+ public void visit(Entity jid, PubSubAffiliation affiliation);
+}
Copied:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/NodeAffiliationVisitor.java
(from r806897,
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/NodeAffiliationVisitor.java)
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/NodeAffiliationVisitor.java?p2=mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/NodeAffiliationVisitor.java&p1=mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/NodeAffiliationVisitor.java&r1=806897&r2=806907&rev=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/NodeAffiliationVisitor.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/NodeAffiliationVisitor.java
Sat Aug 22 23:35:37 2009
@@ -17,17 +17,14 @@
* under the License.
*
*/
-package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
-
-import java.util.ArrayList;
-import java.util.List;
+package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub;
import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AffiliationItem;
-import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.NodeVisitor;
-import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubAffiliation;
import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* @author The Apache MINA Project (http://mina.apache.org)
*/
@@ -52,7 +49,7 @@
public void visit(LeafNode ln) {
PubSubAffiliation affil = ln.getAffiliation(bareJID);
if(!affil.equals(PubSubAffiliation.NONE)) {
- AffiliationItem ai = new AffiliationItem(ln.getName(), affil);
+ AffiliationItem ai = new AffiliationItem(ln.getName(), bareJID,
affil);
affiliations.add(ai);
}
}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubPrivilege.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubPrivilege.java?rev=806907&r1=806906&r2=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubPrivilege.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubPrivilege.java
Sat Aug 22 23:35:37 2009
@@ -25,8 +25,7 @@
* @author The Apache MINA Project (http://mina.apache.org)
*/
public class PubSubPrivilege {
-
public static final PubSubAffiliation DELETE = PubSubAffiliation.OWNER;
public static final PubSubAffiliation PUBLISH =
PubSubAffiliation.PUBLISHER;
-
+ public static final PubSubAffiliation MANAGE_AFFILIATIONS =
PubSubAffiliation.OWNER;
}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsHandler.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsHandler.java?rev=806907&r1=806906&r2=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsHandler.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsHandler.java
Sat Aug 22 23:35:37 2009
@@ -25,6 +25,7 @@
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AffiliationItem;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubServiceConfiguration;
+import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.NodeAffiliationVisitor;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNode;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
Copied:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsHandler.java
(from r806897,
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/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/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsHandler.java?p2=mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsHandler.java&p1=mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java&r1=806897&r2=806907&rev=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerDeleteNodeHandler.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsHandler.java
Sat Aug 22 23:35:37 2009
@@ -22,106 +22,116 @@
import org.apache.vysper.compliance.SpecCompliance;
import org.apache.vysper.compliance.SpecCompliant;
import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.AffiliationItem;
+import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.CollectingMemberAffiliationVisitor;
import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubPrivilege;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubServiceConfiguration;
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.Attribute;
-import org.apache.vysper.xmpp.xmlfragment.XMLElement;
-import org.apache.vysper.xmpp.xmlfragment.XMLFragment;
+
+import java.util.List;
/**
- * This class is responsible for handling all "delete" stanzas within the
pubsub#owner namespace.
- *
+ * This class is responsible for handling all "affiliations" stanzas within
the pubsub#owner namespace.
+ *
* @author The Apache MINA Project (http://mina.apache.org)
*/
-...@speccompliant(spec="xep-0060", section="8.4", status=
SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage =
SpecCompliant.ComplianceCoverage.PARTIAL)
-public class PubSubOwnerDeleteNodeHandler extends AbstractPubSubOwnerHandler {
+...@speccompliant(spec="xep-0060", section="8.9", status=
SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage =
SpecCompliant.ComplianceCoverage.PARTIAL)
+public class PubSubOwnerRetrieveAffiliationsHandler extends
AbstractPubSubOwnerHandler {
/**
- * @param root
+ * Creates a new handler with the supplied configuration object.
*/
- public PubSubOwnerDeleteNodeHandler(PubSubServiceConfiguration
serviceConfiguration) {
+ public PubSubOwnerRetrieveAffiliationsHandler(PubSubServiceConfiguration
serviceConfiguration) {
super(serviceConfiguration);
}
/**
- * @return "delete" as worker element.
+ * @return "affiliations" as worker element.
*/
@Override
protected String getWorkerElement() {
- return "delete";
+ return "affiliations";
}
-
+
/**
- * This method takes care of handling the "delete" use-case including all
(relevant) error conditions.
- *
+ * This method takes care of handling the "affiliations" use-case
including all (relevant) error conditions.
+ *
* @return the appropriate response stanza (either success or some error
condition).
*/
@Override
@SpecCompliance(compliant = {
- @SpecCompliant(spec="xep-0060", section="8.4.2", status=
SpecCompliant.ComplianceStatus.FINISHED, coverage =
SpecCompliant.ComplianceCoverage.COMPLETE)
- , @SpecCompliant(spec="xep-0060", section="8.4.3.1", status=
SpecCompliant.ComplianceStatus.FINISHED, coverage =
SpecCompliant.ComplianceCoverage.COMPLETE)
- , @SpecCompliant(spec="xep-0060", section="8.4.3.2", status=
SpecCompliant.ComplianceStatus.FINISHED, coverage =
SpecCompliant.ComplianceCoverage.COMPLETE)
+ @SpecCompliant(spec="xep-0060", section="8.9.1.2", status=
SpecCompliant.ComplianceStatus.FINISHED, coverage =
SpecCompliant.ComplianceCoverage.COMPLETE)
+ , @SpecCompliant(spec="xep-0060", section="8.9.1.3.2", status=
SpecCompliant.ComplianceStatus.FINISHED, coverage =
SpecCompliant.ComplianceCoverage.COMPLETE)
+ , @SpecCompliant(spec="xep-0060", section="8.9.1.3.3", status=
SpecCompliant.ComplianceStatus.FINISHED, coverage =
SpecCompliant.ComplianceCoverage.COMPLETE)
+ , @SpecCompliant(spec="xep-0060", section="8.9.2.2", status=
SpecCompliant.ComplianceStatus.NOT_STARTED, coverage =
SpecCompliant.ComplianceCoverage.UNSUPPORTED)
+ , @SpecCompliant(spec="xep-0060", section="8.9.2.3.3", status=
SpecCompliant.ComplianceStatus.NOT_STARTED, coverage =
SpecCompliant.ComplianceCoverage.UNSUPPORTED)
+ , @SpecCompliant(spec="xep-0060", section="8.9.2.3.4", status=
SpecCompliant.ComplianceStatus.NOT_STARTED, coverage =
SpecCompliant.ComplianceCoverage.UNSUPPORTED)
})
- protected Stanza handleSet(IQStanza stanza,
+ protected Stanza handleGet(IQStanza stanza,
ServerRuntimeContext serverRuntimeContext,
SessionContext sessionContext) {
Entity serverJID = serviceConfiguration.getServerJID();
CollectionNode root = serviceConfiguration.getRootNode();
-
+
Entity sender = extractSenderJID(stanza, sessionContext);
-
+
String iqStanzaID = stanza.getAttributeValue("id");
StanzaBuilder sb = StanzaBuilder.createIQStanza(serverJID, sender,
IQStanzaType.RESULT, iqStanzaID);
+ sb.startInnerElement("pubsub");
+ sb.addNamespaceAttribute(NamespaceURIs.XEP0060_PUBSUB_OWNER);
+
String nodeName = extractNodeName(stanza);
LeafNode node = root.find(nodeName);
-
+
if(node == null) {
return errorStanzaGenerator.generateNoNodeErrorStanza(sender,
serverJID, stanza);
}
-
- if(!node.isAuthorized(sender, PubSubPrivilege.DELETE)) {
+
+ if(!node.isAuthorized(sender, PubSubPrivilege.MANAGE_AFFILIATIONS)) {
return
errorStanzaGenerator.generateInsufficientPrivilegesErrorStanza(sender,
serverJID, stanza);
}
-
- sendDeleteNotifications(serverRuntimeContext, sender, nodeName, node);
- root.deleteNode(nodeName);
+ List<AffiliationItem> affiliations = collectAllAffiliations(node);
+ buildSuccessStanza(sb, node, affiliations);
+
+ sb.endInnerElement();
return new IQStanza(sb.getFinalStanza());
}
/**
- * Creates and sends a notification for all subscribers that the node is
going to be deleted.
- *
- * @param serverRuntimeContext
- * @param sender
- * @param nodeName
- * @param node
+ * Creates the stanza to be sent for successful requests.
*/
- private void sendDeleteNotifications(ServerRuntimeContext
serverRuntimeContext, Entity sender, String nodeName,
- LeafNode node) {
- StanzaRelay relay = serverRuntimeContext.getStanzaRelay();
- String strID = idGenerator.create();
- XMLElement delete = createDeleteElement(nodeName);
- node.publish(sender, relay, strID, delete);
+ private void buildSuccessStanza(StanzaBuilder sb, LeafNode node,
List<AffiliationItem> affiliations) {
+ sb.startInnerElement("affiliations");
+ sb.addAttribute("node", node.getName());
+
+ for(AffiliationItem i : affiliations) {
+ sb.startInnerElement("affiliation");
+ sb.addAttribute("jid", i.getJID().getFullQualifiedName());
+ sb.addAttribute("affiliation", i.getAffiliation().toString());
+ sb.endInnerElement();
+ }
+
+ sb.endInnerElement();
}
/**
- * Creates a XMLElement like this <delete node="nodeName"/>
- * @param nodeName the value for the node attribute
- * @return the XMLElement for inclusion in the delete notification.
+ * Creates a list of all affiliated users to the given node.
*/
- private XMLElement createDeleteElement(String nodeName) {
- return new XMLElement("delete", null, new Attribute[] {new
Attribute("node", nodeName)}, (XMLFragment[])null);
+ private List<AffiliationItem> collectAllAffiliations(LeafNode node) {
+ List<AffiliationItem> affiliations;
+ CollectingMemberAffiliationVisitor memberAffiliationVisitor = new
CollectingMemberAffiliationVisitor(node.getName());
+ node.acceptMemberAffiliations(memberAffiliationVisitor);
+ affiliations = memberAffiliationVisitor.getAffiliations();
+ return affiliations;
}
-
-}
+}
\ No newline at end of file
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java?rev=806907&r1=806906&r2=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/model/LeafNode.java
Sat Aug 22 23:35:37 2009
@@ -24,11 +24,7 @@
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.delivery.StanzaRelay;
-import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.ItemVisitor;
-import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubAffiliation;
-import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubServiceConfiguration;
-import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.SubscriberPayloadNotificationVisitor;
-import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.SubscriberVisitor;
+import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.*;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.feature.PubsubFeatures;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.storageprovider.LeafNodeStorageProvider;
import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature;
@@ -244,6 +240,15 @@
}
/**
+ * Visits each member of this node.
+ *
+ * @param mav the visitor
+ */
+ public void acceptMemberAffiliations(MemberAffiliationVisitor mav) {
+ storage.acceptForEachMemberAffiliation(name, mav);
+ }
+
+ /**
* Called after all information, including the persistencemanager for the
* node is set.
*/
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeInMemoryStorageProvider.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeInMemoryStorageProvider.java?rev=806907&r1=806906&r2=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeInMemoryStorageProvider.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeInMemoryStorageProvider.java
Sat Aug 22 23:35:37 2009
@@ -27,6 +27,7 @@
import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.ItemVisitor;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubAffiliation;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.SubscriberVisitor;
+import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.MemberAffiliationVisitor;
import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.PayloadItem;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
@@ -196,4 +197,15 @@
.get(entity.getBareJID());
return psa != null ? psa : PubSubAffiliation.NONE; // NONE if there is
no affiliation known.
}
+
+ /**
+ * Call the visitor with the each member JID and its associated
affiliation.
+ */
+ public void acceptForEachMemberAffiliation(String name,
MemberAffiliationVisitor mav) {
+ Map<Entity, PubSubAffiliation> affils =
this.nodeAffiliations.get(name);
+ for(Entity jid : affils.keySet()) {
+ PubSubAffiliation affil = affils.get(jid);
+ mav.visit(jid, affil);
+ }
+ }
}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeStorageProvider.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeStorageProvider.java?rev=806907&r1=806906&r2=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeStorageProvider.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/storageprovider/LeafNodeStorageProvider.java
Sat Aug 22 23:35:37 2009
@@ -24,6 +24,7 @@
import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.ItemVisitor;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PubSubAffiliation;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.SubscriberVisitor;
+import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.MemberAffiliationVisitor;
import org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNode;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
@@ -121,7 +122,8 @@
/**
* Visits each item ever published to the node.
- *
+ *
+ * @param nodeName
* @param iv the Visitor.
*/
public void acceptForEachItem(String nodeName, ItemVisitor iv);
@@ -148,4 +150,8 @@
*/
public PubSubAffiliation getAffiliation(String nodeName, Entity entity);
+ /**
+ * Visits each member-affiliation of the given node.
+ */
+ void acceptForEachMemberAffiliation(String name, MemberAffiliationVisitor
mav);
}
Modified:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java?rev=806907&r1=806906&r2=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PubSubTests.java
Sat Aug 22 23:35:37 2009
@@ -31,6 +31,7 @@
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.handler.owner.PubSubOwnerRetrieveAffiliationsTestCase;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.CollectionNodeTestCase;
import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.model.LeafNodeTestCase;
@@ -47,6 +48,8 @@
//$JUnit-BEGIN$
suite.addTestSuite(PubSubDeleteNodeTestCase.class);
suite.addTestSuite(PubSubConfigureNodeTestCase.class);
+ suite.addTestSuite(PubSubOwnerRetrieveAffiliationsTestCase.class);
+
suite.addTestSuite(PubSubCreateNodeTestCase.class);
suite.addTestSuite(PubSubPublishTestCase.class);
suite.addTestSuite(PubSubSubscribeTestCase.class);
Copied:
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java
(from r806897,
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java)
URL:
http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java?p2=mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java&p1=mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java&r1=806897&r2=806907&rev=806907&view=diff
==============================================================================
---
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/PubSubRetrieveAffiliationsTestCase.java
(original)
+++
mina/sandbox/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/handler/owner/PubSubOwnerRetrieveAffiliationsTestCase.java
Sat Aug 22 23:35:37 2009
@@ -17,12 +17,13 @@
* under the License.
*
*/
-package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler;
+package org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.owner;
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.AbstractPublishSubscribeTestCase;
+import
org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.handler.AbstractStanzaGenerator;
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;
@@ -32,84 +33,121 @@
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import java.util.List;
+
/**
* @author The Apache MINA Project (http://mina.apache.org)
*/
-public class PubSubRetrieveAffiliationsTestCase extends
AbstractPublishSubscribeTestCase {
+public class PubSubOwnerRetrieveAffiliationsTestCase extends
AbstractPublishSubscribeTestCase {
protected LeafNode n1 = null;
- protected LeafNode n2 = null;
- protected LeafNode n3 = null;
@Override
public void setUp() throws Exception {
super.setUp();
-
+ Entity client2 = new EntityImpl("user1", "vysper.org", null);
+ Entity client3 = new EntityImpl("user2", "vysper.org", null);;
+
n1 = new LeafNode(serviceConfiguration, "Node1", "Node 1 used for
testing purposes", client);
- n2 = new LeafNode(serviceConfiguration, "Node2", "Node 2 used for
testing purposes", client);
- n3 = new LeafNode(serviceConfiguration, "Node3", "Node 3 used for
testing purposes", client);
-
+ n1.addOwner(client2);
+ n1.addOwner(client3);
+
root.add(n1);
- root.add(n2);
- root.add(n3);
}
-
+
@Override
protected IQHandler getHandler() {
- return new PubSubRetrieveAffiliationsHandler(serviceConfiguration);
+ return new
PubSubOwnerRetrieveAffiliationsHandler(serviceConfiguration);
}
@Override
protected AbstractStanzaGenerator getDefaultStanzaGenerator() {
- return new DefaultRetrieveAffiliationsStanzaGenerator();
+ return new DefaultRetrieveAffiliationsStanzaGenerator("Node1");
}
- public void testNoAffiliations() {
+ public void testRetrieveAffiliationsNoAuth() {
Entity client2 = new EntityImpl("yoda", "starwars.com", null);
-
- AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
+
+ AbstractStanzaGenerator sg = new
DefaultRetrieveAffiliationsStanzaGenerator("Node1");
Stanza stanza = sg.getStanza(client2, pubsubService, "id123", null);
ResponseStanzaContainer result = sendStanza(stanza, true);
-
+
assertTrue(result.hasResponse());
-
+
IQStanza response = new IQStanza(result.getResponseStanza());
- assertEquals(IQStanzaType.RESULT.value(),response.getType());
- XMLElement sub =
response.getFirstInnerElement().getFirstInnerElement();
- assertEquals("affiliations", sub.getName());
- assertEquals(0, sub.getInnerElements().size()); // there should be no
affiliations
+ assertEquals(IQStanzaType.ERROR.value(),response.getType());
+
+ assertEquals("id123", response.getAttributeValue("id")); // IDs must
match
+
+ XMLElement error = response.getInnerElementsNamed("error").get(0);
//jump directly to the error part
+ assertEquals("error", error.getName());
+ assertEquals("auth", error.getAttributeValue("type"));
+
+ List<XMLElement> errorContent = error.getInnerElements();
+ assertEquals(1, errorContent.size());
+ assertEquals("forbidden", errorContent.get(0).getName());
+ assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS,
errorContent.get(0).getNamespaceURI());
}
-
- public void testSomeAffiliations() {
+
+ public void testRetrieveAffiliationsNoSuchNode() throws Exception {
+ String testNode = "test";
+ assertNull(root.find(testNode));
+
+ AbstractStanzaGenerator sg = new
DefaultRetrieveAffiliationsStanzaGenerator("test");
+ 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.getInnerElementsNamed("error").get(0);
//jump directly to the error part
+ assertEquals("error", error.getName());
+ assertEquals("cancel", error.getAttributeValue("type"));
+
+ List<XMLElement> errorContent = error.getInnerElements();
+ assertEquals(1, errorContent.size());
+ assertEquals("item-not-found", errorContent.get(0).getName());
+ assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS,
errorContent.get(0).getNamespaceURI());
+ }
+
+ public void testRetrieveAffiliations() {
AbstractStanzaGenerator sg = getDefaultStanzaGenerator();
-
+
Stanza stanza = sg.getStanza(client, pubsubService, "4711", null);
ResponseStanzaContainer result = sendStanza(stanza, true);
-
+
assertTrue(result.hasResponse());
-
+
IQStanza response = new IQStanza(result.getResponseStanza());
assertEquals(IQStanzaType.RESULT.value(),response.getType());
XMLElement sub =
response.getFirstInnerElement().getFirstInnerElement();
assertEquals("affiliations", sub.getName());
assertEquals(3, sub.getInnerElements().size());
-
+
for(XMLElement e : sub.getInnerElements()) {
assertEquals("owner", e.getAttributeValue("affiliation"));
}
-
}
class DefaultRetrieveAffiliationsStanzaGenerator extends
AbstractStanzaGenerator {
+ private String node;
+
+ public DefaultRetrieveAffiliationsStanzaGenerator(String nodeName) {
+ this.node = nodeName;
+ }
+
@Override
protected StanzaBuilder buildInnerElement(Entity client, Entity
pubsub, StanzaBuilder sb, String node) {
sb.startInnerElement("affiliations");
+ sb.addAttribute("node", this.node);
sb.endInnerElement();
return sb;
}
@Override
protected String getNamespace() {
- return NamespaceURIs.XEP0060_PUBSUB;
+ return NamespaceURIs.XEP0060_PUBSUB_OWNER;
}
@Override
@@ -118,4 +156,4 @@
}
}
-}
+}
\ No newline at end of file