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/23 15:08:11 UTC

svn commit: r757398 - in /labs/vysper/src/main/java/org/apache/vysper: storage/jcr/vcardtemp/ xmpp/modules/extension/xep0054_vcardtemp/ xmpp/modules/roster/ xmpp/protocol/ xmpp/server/

Author: berndf
Date: Mon Mar 23 14:07:51 2009
New Revision: 757398

URL: http://svn.apache.org/viewvc?rev=757398&view=rev
Log:
[vysper] LABS-318 add support for vcard-temp (XEP-0054)

Added:
    labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/
    labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandler.java
      - copied, changed from r755842, labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionIQHandler.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java
      - copied, changed from r755481, labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionModule.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempPersistenceManager.java
Modified:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/roster/RosterModule.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java

Added: 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=757398&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/storage/jcr/vcardtemp/JcrVcardTempPersistenceManager.java Mon Mar 23 14:07:51 2009
@@ -0,0 +1,63 @@
+package org.apache.vysper.storage.jcr.vcardtemp;
+
+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.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempPersistenceManager;
+
+import javax.jcr.Session;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+/**
+ */
+public class JcrVcardTempPersistenceManager implements VcardTempPersistenceManager {
+
+    protected JcrStorage jcrStorage;
+            
+    public JcrVcardTempPersistenceManager(JcrStorage jcrStorage) {
+        this.jcrStorage = jcrStorage;
+    }
+
+    public boolean isAvailable() {
+        Session session = null;
+        try {
+            session = jcrStorage.getRepositorySession();
+            return session != null;
+        } catch (JcrStorageException e) {
+            return false;
+        }
+    }
+
+    public String getVcard(Entity entity) {
+        Node entityNode = getEntityNodeSave(entity, false);
+        if (entityNode == null) return null;
+        try {
+            return entityNode.getProperty("content").getString();
+        } catch (RepositoryException e) {
+            return null;
+        }
+    }
+
+    private Node getEntityNodeSave(Entity entity, boolean createIfMissing) {
+        Node entityNode;
+        try {
+            entityNode = jcrStorage.getEntityNode(entity.getBareJID(), NamespaceURIs.VCARD_TEMP, createIfMissing);
+        } catch (JcrStorageException e) {
+            return null;
+        }
+        if (entityNode == null) return null;
+        return entityNode;
+    }
+
+    public boolean setVcard(Entity entity, String xml) {
+        Node entityNode = getEntityNodeSave(entity, true);
+        try {
+            entityNode.setProperty("content", xml);
+            return true;
+        } catch (RepositoryException e) {
+            return false;
+        }
+    }
+}

Copied: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandler.java (from r755842, labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionIQHandler.java)
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandler.java?p2=labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandler.java&p1=labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionIQHandler.java&r1=755842&r2=757398&rev=757398&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionIQHandler.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempIQHandler.java Mon Mar 23 14:07:51 2009
@@ -1,48 +1,111 @@
-package org.apache.vysper.xmpp.modules.extension.xep0092_software_version;
+package org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp;
 
+import org.apache.vysper.compliance.SpecCompliant;
+import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler;
 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.server.response.ServerErrorResponses;
 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.compliance.SpecCompliant;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
+import org.apache.vysper.xmpp.xmlfragment.Renderer;
+import org.apache.vysper.xmpp.xmlfragment.XMLElement;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
 
 /**
  */
-@SpecCompliant(spec="xep-0092", status= SpecCompliant.ComplianceStatus.FINISHED, coverage = SpecCompliant.ComplianceCoverage.COMPLETE)
-public class SoftwareVersionIQHandler extends DefaultIQHandler {
+@SpecCompliant(spec="xep-0054", status= SpecCompliant.ComplianceStatus.FINISHED, coverage = SpecCompliant.ComplianceCoverage.COMPLETE)
+public class VcardTempIQHandler extends DefaultIQHandler {
     
-    public static final String OS_VERSION = 
-            System.getProperty("os.name", "undetermined") + " " + 
-            System.getProperty("os.arch", "") + " " + 
-            System.getProperty("os.version", "");
+    protected boolean returnEmptyVCardWhenNonExistent = true;
     
+    protected VcardTempPersistenceManager persistenceManager;
+
+    public void setPersistenceManager(VcardTempPersistenceManager persistenceManager) {
+        this.persistenceManager = persistenceManager;
+    }
+
     @Override
     protected boolean verifyNamespace(Stanza stanza) {
-        return verifyInnerNamespace(stanza, NamespaceURIs.JABBER_IQ_VERSION);
+        return verifyInnerNamespace(stanza, NamespaceURIs.VCARD_TEMP);
     }
 
     @Override
     protected boolean verifyInnerElement(Stanza stanza) {
-        return verifyInnerElementWorker(stanza, "query");
+        return verifyInnerElementWorker(stanza, "vCard");
+    }
+
+    @Override
+    protected Stanza handleSet(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) {
+        Entity from = stanza.getFrom();
+        if (from == null) {
+            from = sessionContext.getInitiatingEntity();
+        }
+
+        XMLElement vCardElement = null;
+        try {
+            vCardElement = stanza.getSingleInnerElementsNamed("vCard");
+        } catch (XMLSemanticError xmlSemanticError) {
+            return ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST, stanza, StanzaErrorType.MODIFY, "vCard element is missing", null, null);
+        }
+        String vcardContent = new Renderer(vCardElement).getComplete();
+
+        if (persistenceManager == null) {
+            return ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.INTERNAL_SERVER_ERROR, stanza, StanzaErrorType.WAIT, "internal storage inaccessible", null, null);
+        }
+
+        boolean success = persistenceManager.setVcard(from, vcardContent);
+
+        if (success) {
+            return StanzaBuilder.createIQStanza(null, from, IQStanzaType.RESULT, stanza.getID()).getFinalStanza();
+        } else {
+            return StanzaBuilder.createIQStanza(null, from, IQStanzaType.ERROR, stanza.getID()).getFinalStanza();
+        }
     }
 
     @Override
     protected Stanza handleGet(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) {
 
-        StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), IQStanzaType.RESULT, stanza.getID()).
-            startInnerElement("query").
-            addNamespaceAttribute(NamespaceURIs.JABBER_IQ_VERSION).
+        Entity to = stanza.getTo();
+        Entity from = stanza.getFrom();
+        
+        if (from == null) {
+            from = sessionContext.getInitiatingEntity();
+        }
         
-            startInnerElement("name").addText("Apache Vysper XMPP Server").endInnerElement().
-            startInnerElement("version").addText("0.1 beta").endInnerElement().
-            startInnerElement("os").addText(OS_VERSION).endInnerElement().
+        Entity requestedCard = to != null ? to.getBareJID() : from.getBareJID(); // no from? return own vcard
 
-        endInnerElement();
+        String vcardXml = null;
+        if (persistenceManager != null) {
+            vcardXml =  persistenceManager.getVcard(requestedCard);
+        }   
+
+        // from XEP-0054 3.1: 
+        // If no vCard exists, the server MUST return a stanza error (which SHOULD be <item-not-found/>) 
+        // or an IQ-result containing an empty <vCard/> element.
+        if (vcardXml == null) {
+            IQStanzaType iqStanzaType = returnEmptyVCardWhenNonExistent ? IQStanzaType.RESULT : IQStanzaType.ERROR;
+            StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), iqStanzaType, stanza.getID());
+            stanzaBuilder.startInnerElement("vCard").addNamespaceAttribute(NamespaceURIs.VCARD_TEMP).endInnerElement();
+            if (returnEmptyVCardWhenNonExistent) {
+                // keep it like it is
+            } else {
+                stanzaBuilder.
+                    startInnerElement("error").addAttribute("type", "cancel").
+                        startInnerElement("item-not-found").addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).
+                        endInnerElement().
+                    endInnerElement();
+            }
+            return stanzaBuilder.getFinalStanza();        
+        } 
 
+        StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), IQStanzaType.RESULT, stanza.getID());
+        stanzaBuilder.addText(vcardXml);
         return stanzaBuilder.getFinalStanza();
     }
-}
+}
\ No newline at end of file

Copied: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java (from r755481, labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionModule.java)
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java?p2=labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java&p1=labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionModule.java&r1=755481&r2=757398&rev=757398&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0092_software_version/SoftwareVersionModule.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java Mon Mar 23 14:07:51 2009
@@ -1,4 +1,4 @@
-package org.apache.vysper.xmpp.modules.extension.xep0092_software_version;
+package org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp;
 
 import org.apache.vysper.xmpp.modules.DefaultDiscoAwareModule;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature;
@@ -8,17 +8,32 @@
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
 import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.storage.jcr.JcrStorage;
+import org.apache.vysper.storage.jcr.vcardtemp.JcrVcardTempPersistenceManager;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  */
-public class SoftwareVersionModule extends DefaultDiscoAwareModule implements ServerInfoRequestListener {
+public class VcardTempModule extends DefaultDiscoAwareModule implements ServerInfoRequestListener {
+
+    protected VcardTempIQHandler iqHandler = new VcardTempIQHandler();
+
+    @Override
+    public void initialize(ServerRuntimeContext serverRuntimeContext) {
+        super.initialize(serverRuntimeContext);
+
+        JcrVcardTempPersistenceManager persistenceManager = new JcrVcardTempPersistenceManager(JcrStorage.getInstance());
+        if (persistenceManager.isAvailable()) {
+            iqHandler.setPersistenceManager(persistenceManager);
+        }
+    }
 
     @Override
     public String getName() {
-        return "XEP-0092 Software Version";
+        return "XEP-0054 Vcard-temp";
     }
 
     @Override
@@ -33,12 +48,13 @@
 
     public List<InfoElement> getServerInfosFor(InfoRequest request) {
         List<InfoElement> infoElements = new ArrayList<InfoElement>();
-        infoElements.add(new Feature(NamespaceURIs.JABBER_IQ_VERSION));
+        infoElements.add(new Feature(NamespaceURIs.VCARD_TEMP));
         return infoElements;
     }
 
     @Override
     protected void addHandlerDictionaries(List<HandlerDictionary> dictionary) {
-        dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.JABBER_IQ_VERSION, new SoftwareVersionIQHandler()));
+        iqHandler = new VcardTempIQHandler();
+        dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.VCARD_TEMP, iqHandler));
     }
-}
+}
\ No newline at end of file

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempPersistenceManager.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempPersistenceManager.java?rev=757398&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempPersistenceManager.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempPersistenceManager.java Mon Mar 23 14:07:51 2009
@@ -0,0 +1,17 @@
+package org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+
+/**
+ */
+public interface VcardTempPersistenceManager {
+
+    /**
+     * @return if the persistene manager is ready to operate 
+     */
+    boolean isAvailable();
+
+    String getVcard(Entity entity);
+
+    boolean setVcard(Entity entity, String xml);
+}

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=757398&r1=757397&r2=757398&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 Mon Mar 23 14:07:51 2009
@@ -20,8 +20,6 @@
 import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
 import org.apache.vysper.xmpp.modules.roster.persistence.MemoryRosterManager;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
-import org.apache.vysper.storage.jcr.JcrStorage;
-import org.apache.vysper.storage.jcr.roster.JcrRosterManager;
 
 import java.util.List;
 
@@ -30,10 +28,12 @@
  */
 public class RosterModule extends DefaultModule {
 
+    @Override
     public String getName() {
         return "roster";
     }
 
+    @Override
     public String getVersion() {
         return "1.0beta";
     }
@@ -45,6 +45,7 @@
 
     @Override
     protected void addServerServices(List<ServerRuntimeContextService> serviceList) {
-        serviceList.add(new JcrRosterManager(JcrStorage.getInstance()));
+        //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/protocol/NamespaceURIs.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java?rev=757398&r1=757397&r2=757398&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java Mon Mar 23 14:07:51 2009
@@ -28,16 +28,19 @@
     public static final String URN_IETF_PARAMS_XML_NS_XMPP_STREAMS = "urn:ietf:params:xml:ns:xmpp-streams";
     public static final String URN_IETF_PARAMS_XML_NS_XMPP_STANZAS = "urn:ietf:params:xml:ns:xmpp-stanzas";
     public static final String URN_IETF_PARAMS_XML_NS_XMPP_SESSION = "urn:ietf:params:xml:ns:xmpp-session";
-    public static final String URN_XMPP_TIME = "urn:xmpp:time";
     public static final String JABBER_CLIENT = "jabber:client";
     public static final String JABBER_SERVER = "jabber:server";
     public static final String JABBER_SERVER_DIALBACK = "jabber:server:dialback";
     public static final String JABBER_IQ_ROSTER = "jabber:iq:roster";
+    
+    // compatibility namespaces
+    public static final String JABBER_IQ_AUTH_COMPATIBILITY = "jabber:iq:auth";
+    
+    // extension namespaces
     public static final String JABBER_IQ_VERSION = "jabber:iq:version";
     public static final String JABBER_IQ_TIME = "jabber:iq:time";
+    public static final String URN_XMPP_TIME = "urn:xmpp:time";
+    public static final String VCARD_TEMP  = "vcard-temp";
     public static final String XEP0030_SERVICE_DISCOVERY_ITEMS = "http://jabber.org/protocol/disco#items";
     public static final String XEP0030_SERVICE_DISCOVERY_INFO  = "http://jabber.org/protocol/disco#info";
-    
-    // compatibility namespaces
-    public static final String JABBER_IQ_AUTH_COMPATIBILITY = "jabber:iq:auth";
 }

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=757398&r1=757397&r2=757398&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 Mon Mar 23 14:07:51 2009
@@ -18,11 +18,12 @@
 
 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.storage.jcr.JcrStorage;
-import org.apache.vysper.storage.jcr.user.JcrUserManagement;
 
 import java.io.File;
 
@@ -65,5 +66,6 @@
 
         server.addModule(new SoftwareVersionModule());
         server.addModule(new EntityTimeModule());
+        server.addModule(new VcardTempModule());
     }
 }



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