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


Reply via email to