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