You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by be...@apache.org on 2009/03/24 21:28:13 UTC

svn commit: r758001 - in /labs/vysper: ./ src/main/java/org/apache/vysper/storage/jcr/roster/ src/main/java/org/apache/vysper/storage/jcr/vcardtemp/ src/main/java/org/apache/vysper/xmpp/modules/roster/ src/main/java/org/apache/vysper/xmpp/modules/roste...

Author: berndf
Date: Tue Mar 24 20:28:13 2009
New Revision: 758001

URL: http://svn.apache.org/viewvc?rev=758001&view=rev
Log:
[vysper] LABS-125 improve JCR persistence

Modified:
    labs/vysper/build.xml
    labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRoster.java
    labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRosterManager.java
    labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterModule.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/MemoryRosterManager.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java

Modified: labs/vysper/build.xml
URL: http://svn.apache.org/viewvc/labs/vysper/build.xml?rev=758001&r1=758000&r2=758001&view=diff
==============================================================================
--- labs/vysper/build.xml (original)
+++ labs/vysper/build.xml Tue Mar 24 20:28:13 2009
@@ -87,6 +87,7 @@
     <pathelement location="${basedir}/lib/log4j-1.2.14.jar"/>
     <pathelement location="${basedir}/lib/slf4j-api-1.5.3.jar"/>
     <pathelement location="${basedir}/lib/slf4j-log4j12-1.5.3.jar"/>
+    <pathelement location="${basedir}/lib/jackrabbit-standalone-1.5.3.jar"/>
   </path>
   
   <patternset id="excluded.from.vysper">
@@ -103,6 +104,12 @@
     </dirset>
   </path>
   
+  <path id="apt-classpath">
+      <path refid="classpath" />
+      <fileset file="${vysper.output.dir}" />
+      <fileset file="${java.home}/" />
+  </path>
+  
   <path id="test.sourcepath">
     <dirset dir="${basedir}">
       <include name="src/test/java"/>
@@ -147,11 +154,11 @@
   <target name="generate-compliance-doc" description="generates the compliance document" >
       <apt factory="org.apache.vysper.compliance.reporting.DocumentSpecCompliantAnnotationFactory"
            debug="false" verbose="true"
-           preprocessdir="sourcepath"
-           compile="true"
+           preprocessdir="${basedir}/build/ant/apidocs"
+           compile="false"
               >
-          <bootclasspath refid="bootclasspath"/>
-          <classpath refid="classpath"/>
+          <bootclasspath refid="apt-classpath"/>
+          <classpath  refid="classpath"/>
           <src refid="sourcepath"/>
       </apt>
   </target>

Modified: labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRoster.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRoster.java?rev=758001&r1=758000&r2=758001&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRoster.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRoster.java Tue Mar 24 20:28:13 2009
@@ -17,9 +17,13 @@
 package org.apache.vysper.storage.jcr.roster;
 
 import org.apache.vysper.storage.jcr.JcrStorage;
+import org.apache.vysper.storage.jcr.JcrStorageException;
 import org.apache.vysper.xmpp.modules.roster.MutableRoster;
 import org.apache.vysper.xmpp.modules.roster.RosterItem;
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -28,6 +32,8 @@
  */
 public class JcrRoster extends MutableRoster {
 
+    final Logger logger = LoggerFactory.getLogger(JcrRoster.class);
+    
     protected JcrStorage jcrStorage;
     protected Entity jid;
 
@@ -38,14 +44,20 @@
 
     @Override
     public void addItem(RosterItem rosterItem) {
-        final Node node = JcrRosterManager.retrieveRosterNode(jcrStorage, jid);
+        Node entityNode = null;
+        try {
+            entityNode = jcrStorage.getEntityNode(jid, NamespaceURIs.JABBER_IQ_ROSTER, true);
+        } catch (JcrStorageException e) {
+            logger.warn("failed to create roster node for owner = " + jid.getFullQualifiedName());
+            return;
+        }
         Node contactNode = null;
         try {
-            contactNode = node.addNode(rosterItem.getJid().getBareJID().getFullQualifiedName());
+            contactNode = entityNode.addNode(rosterItem.getJid().getBareJID().getFullQualifiedName());
             contactNode.save();
         } catch (RepositoryException e) {
             throw new RuntimeException("failed to create roster item for owner = " + jid.getFullQualifiedName() +
-                                       " and contact " + rosterItem.getJid().getFullQualifiedName());
+                                       " and contact = " + rosterItem.getJid().getFullQualifiedName());
         }
 
         try {
@@ -56,7 +68,7 @@
             contactNode.save();
         } catch (RepositoryException e) {
             throw new RuntimeException("failed to set roster properties for owner = " + jid.getFullQualifiedName() + 
-                                       " and contact " + rosterItem.getJid().getFullQualifiedName());
+                                       " and contact = " + rosterItem.getJid().getFullQualifiedName());
         }
     }
 }

Modified: labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRosterManager.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRosterManager.java?rev=758001&r1=758000&r2=758001&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRosterManager.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/storage/jcr/roster/JcrRosterManager.java Tue Mar 24 20:28:13 2009
@@ -16,20 +16,35 @@
  ***********************************************************************/
 package org.apache.vysper.storage.jcr.roster;
 
-import org.apache.vysper.xmpp.modules.roster.persistence.AbstractRosterManager;
-import org.apache.vysper.xmpp.modules.roster.Roster;
-import org.apache.vysper.xmpp.modules.roster.MutableRoster;
-import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.storage.jcr.JcrStorage;
 import org.apache.vysper.storage.jcr.JcrStorageException;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.modules.roster.AskSubscriptionType;
+import org.apache.vysper.xmpp.modules.roster.Roster;
+import org.apache.vysper.xmpp.modules.roster.RosterException;
+import org.apache.vysper.xmpp.modules.roster.RosterGroup;
+import org.apache.vysper.xmpp.modules.roster.RosterItem;
+import org.apache.vysper.xmpp.modules.roster.SubscriptionType;
+import org.apache.vysper.xmpp.modules.roster.persistence.AbstractRosterManager;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import java.util.List;
+import java.util.ArrayList;
 
 /**
  */
 public class JcrRosterManager extends AbstractRosterManager {
 
+    final Logger logger = LoggerFactory.getLogger(JcrRosterManager.class);
+    
     protected JcrStorage jcrStorage;
 
     public JcrRosterManager(JcrStorage jcrStorage) {
@@ -45,12 +60,70 @@
         }
     }
 
+    @Override
     protected Roster retrieveRosterInternal(Entity bareJid) {
-        final Node node = retrieveRosterNode(jcrStorage, bareJid);
-        if (node == null) return null;
-        return null;
+        final Node rosterNode = retrieveRosterNode(jcrStorage, bareJid);
+        
+        JcrRoster roster = new JcrRoster(jcrStorage, bareJid);
+        
+        NodeIterator nodes = null;
+        try {
+            nodes = rosterNode.getNodes("contact");
+        } catch (RepositoryException e) {
+            return roster;
+        }
+        while (nodes != null && nodes.hasNext()) {
+            Node node = nodes.nextNode();
+            String contactJidString = readAttribute(node, "jid");
+            EntityImpl contactJid = null;
+            if (contactJidString != null) {
+                try {
+                    contactJid = EntityImpl.parse(contactJidString);
+                } catch (EntityFormatException e) {
+                    logger.warn("when loading roster for user {} parsing  contact jid {}", bareJid, contactJidString);
+                }
+            }
+            if (contactJid == null) {
+                logger.warn("when loading roster for user {}, skipping a contact due to missing or unparsable jid", bareJid);
+            }
+
+            String name = readAttribute(node, "name");
+            String typeString = readAttribute(node, "type");
+            SubscriptionType subscriptionType = null;
+            try {
+                subscriptionType = SubscriptionType.valueOf(typeString);
+            } catch (IllegalArgumentException e) {
+                logger.warn("when loading roster for user {}, contact {} misses a subscription type", bareJid, contactJid);
+            }
+            String askTypeString = readAttribute(node, "askType");
+            AskSubscriptionType askSubscriptionType = AskSubscriptionType.NOT_SET;
+            try {
+                if (askTypeString != null) askSubscriptionType = AskSubscriptionType.valueOf(askTypeString);
+            } catch (IllegalArgumentException e) {
+                logger.warn("when loading roster for user {}, contact {}, the ask subscription type is unparsable. skipping!", bareJid, contactJid);
+                continue; // don't return it, don't set a default!
+            }
+
+            List<RosterGroup> groups = new ArrayList<RosterGroup>();
+            // TODO read groups
+
+            RosterItem item = new RosterItem(contactJid, name, subscriptionType, askSubscriptionType, groups);
+            roster.addItem(item);
+        }
+        return roster;
+    }
+
+    private String readAttribute(Node node, String propertyName) {
+        try {
+            Property property = node.getProperty(propertyName);
+            if (property == null) return null;
+            return property.getString();
+        } catch (RepositoryException e) {
+            return null;
+        }
     }
 
+    @Override
     protected Roster addNewRosterInternal(Entity jid) {
         JcrRoster mutableRoster = new JcrRoster(jcrStorage, jid);
 
@@ -62,4 +135,59 @@
 
         return mutableRoster;
     }
+
+    @Override
+    public void addContact(Entity jid, RosterItem rosterItem) throws RosterException {
+        if (jid == null) throw new RosterException("jid not provided");
+        Node entityNode = null;
+        try {
+            entityNode = jcrStorage.getEntityNode(jid, NamespaceURIs.JABBER_IQ_ROSTER, true);
+        } catch (JcrStorageException e) {
+            throw new RosterException("failed to create roster store for " + jid.getFullQualifiedName(), e);
+        }
+        try {
+            Node contactNode = entityNode.addNode("contact" + System.currentTimeMillis());
+            //contactNode.setProperty("jid", rosterItem.getJid().getBareJID().getFullQualifiedName());
+            //if (rosterItem.getName() != null) contactNode.setProperty("name", rosterItem.getName());
+            //contactNode.setProperty("type", rosterItem.getSubscriptionType().value());
+            //if (rosterItem.getAskSubscriptionType() != AskSubscriptionType.NOT_SET) contactNode.setProperty("askType", rosterItem.getAskSubscriptionType().value());
+            contactNode.save();
+        } catch (RepositoryException e) {
+            throw new RosterException("failed to add contact node to roster for user = " + jid.getFullQualifiedName() + " and contact jid = " + rosterItem.getJid().getFullQualifiedName(), e);
+        }
+    }
+
+    @Override
+    public void removeContact(Entity jidUser, Entity jidContact) throws RosterException {
+        if (jidUser == null) throw new RosterException("jid not provided");
+        if (jidContact == null) throw new RosterException("contact jid not provided");
+        Node rosterNode = null;
+        try {
+            rosterNode = jcrStorage.getEntityNode(jidUser, NamespaceURIs.JABBER_IQ_ROSTER, false);
+        } catch (JcrStorageException e) {
+            throw new RosterException("failed to retrieve roster store for " + jidUser.getFullQualifiedName(), e);
+        }
+        if (rosterNode == null) return; // done, no contacts anyway. oops
+
+        NodeIterator nodes = null;
+        try {
+            nodes = rosterNode.getNodes("contact");
+        } catch (RepositoryException e) {
+            return; // failed to find any contacts, done.
+        }
+        boolean foundOne = false;
+        while (nodes != null && nodes.hasNext()) {
+            Node node = nodes.nextNode();
+            String contactJidString = readAttribute(node, "jid");
+            if (contactJidString != null && contactJidString.equals(jidContact.getFullQualifiedName())) {
+                foundOne = true;
+                try {
+                    node.remove();
+                } catch (RepositoryException e) {
+                    logger.warn("failed to remove from roster for user {} the contact jid " + jidContact, jidUser, e);
+                }
+            }
+        }
+        if (!foundOne) logger.warn("failed to remove from roster for user {} the contact jid {}", jidUser, jidContact);
+    }
 }

Modified: labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java?rev=758001&r1=758000&r2=758001&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java Tue Mar 24 20:28:13 2009
@@ -71,6 +71,7 @@
         Node entityNode = getEntityNodeSave(entity, true);
         try {
             entityNode.setProperty("content", xml);
+            entityNode.save();
             return true;
         } catch (RepositoryException e) {
             return false;

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterModule.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterModule.java?rev=758001&r1=758000&r2=758001&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterModule.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterModule.java Tue Mar 24 20:28:13 2009
@@ -16,9 +16,10 @@
  ***********************************************************************/
 package org.apache.vysper.xmpp.modules.roster;
 
+import org.apache.vysper.storage.jcr.JcrStorage;
+import org.apache.vysper.storage.jcr.roster.JcrRosterManager;
 import org.apache.vysper.xmpp.modules.DefaultModule;
 import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
-import org.apache.vysper.xmpp.modules.roster.persistence.MemoryRosterManager;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
 
 import java.util.List;
@@ -45,7 +46,7 @@
 
     @Override
     protected void addServerServices(List<ServerRuntimeContextService> serviceList) {
-        //serviceList.add(new JcrRosterManager(JcrStorage.getInstance()));
-        serviceList.add(new MemoryRosterManager());
+        serviceList.add(new JcrRosterManager(JcrStorage.getInstance()));
+        //serviceList.add(new MemoryRosterManager());
     }
 }
\ No newline at end of file

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/MemoryRosterManager.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/MemoryRosterManager.java?rev=758001&r1=758000&r2=758001&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/MemoryRosterManager.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/MemoryRosterManager.java Tue Mar 24 20:28:13 2009
@@ -30,12 +30,14 @@
 
     private Map<Entity, MutableRoster> rosterMap = new HashMap<Entity, MutableRoster>();
 
+    @Override
     protected Roster addNewRosterInternal(Entity jid) {
         MutableRoster mutableRoster = new MutableRoster();
         rosterMap.put(jid.getBareJID(), (MutableRoster) mutableRoster);
         return mutableRoster;
     }
 
+    @Override
     protected Roster retrieveRosterInternal(Entity bareJid) {
         if (!rosterMap.containsKey(bareJid)) rosterMap.put(bareJid, new MutableRoster());
         return rosterMap.get(bareJid);

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java?rev=758001&r1=758000&r2=758001&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java Tue Mar 24 20:28:13 2009
@@ -17,13 +17,14 @@
 package org.apache.vysper.xmpp.server;
 
 import org.apache.vysper.mina.TCPEndpoint;
-import org.apache.vysper.stanzasession.StanzaSessionFactory;
 import org.apache.vysper.storage.jcr.JcrStorage;
 import org.apache.vysper.storage.jcr.user.JcrUserManagement;
 import org.apache.vysper.xmpp.authorization.AccountCreationException;
 import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
 import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
 import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
 
 import java.io.File;
 
@@ -37,21 +38,20 @@
      * found on the classpath
      * @param args
      */
-    public static void main(String[] args) throws AccountCreationException {
-        //new ClassPathXmlApplicationContext("spring-config.xml");
+    public static void main(String[] args) throws AccountCreationException, EntityFormatException {
 
         final JcrStorage jcrStorage = JcrStorage.getInstance();
         final JcrUserManagement userManagement = new JcrUserManagement(jcrStorage);
 
         //SimpleUserAuthorization userManagement = new SimpleUserAuthorization();
 
-        //userManagement.addUser("user1@vysper.org", "password1");
-        //userManagement.addUser("user2@vysper.org", "password1");
-        //userManagement.addUser("user3@vysper.org", "password1");
+        if(!userManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) userManagement.addUser("user1@vysper.org", "password1");
+        if(!userManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) userManagement.addUser("user2@vysper.org", "password1");
+        if(!userManagement.verifyAccountExists(EntityImpl.parse("user3@vysper.org"))) userManagement.addUser("user3@vysper.org", "password1");
 
         XMPPServer server = new XMPPServer("vysper.org");
         server.addEndpoint(new TCPEndpoint());
-        server.addEndpoint(new StanzaSessionFactory());
+        //server.addEndpoint(new StanzaSessionFactory());
         server.setUserAuthorization(userManagement);
         server.setAccountVerification(userManagement);
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org