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/20 07:21:58 UTC

svn commit: r756338 - in /labs/vysper/src: main/java/org/apache/vysper/xmpp/modules/ main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/ main/java/org/apache/vysper/xmpp/protocol/ main/java/org/apache/vysper/xmpp/server/ main/java/o...

Author: berndf
Date: Fri Mar 20 06:21:57 2009
New Revision: 756338

URL: http://svn.apache.org/viewvc?rev=756338&view=rev
Log:
[vysper] LABS-317 Impl for XEP-0202 and XEP-0090 Entity Time

Added:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeIQHandler.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeModule.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeXEP0090IQHandler.java
Modified:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/Module.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
    labs/vysper/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java
    labs/vysper/src/test/java/org/apache/vysper/smack/BasicClient.java

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/Module.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/Module.java?rev=756338&r1=756337&r2=756338&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/Module.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/Module.java Fri Mar 20 06:21:57 2009
@@ -31,6 +31,8 @@
  *     matching stanzas arrive</li>
  * </ul>
  *
+ * TODO: think about returning the supported XEPs
+ *
  * @see org.apache.vysper.xmpp.modules.DefaultModule recommended for simple modules not involved with service disco
  * @see org.apache.vysper.xmpp.modules.DefaultDiscoAwareModule recommended for modules responding to service disco requests
  * @see org.apache.vysper.xmpp.modules.ServerRuntimeContextService

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeIQHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeIQHandler.java?rev=756338&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeIQHandler.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeIQHandler.java Fri Mar 20 06:21:57 2009
@@ -0,0 +1,60 @@
+package org.apache.vysper.xmpp.modules.extension.xep0202_entity_time;
+
+import org.apache.vysper.compliance.SpecCompliant;
+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.stanza.IQStanza;
+import org.apache.vysper.xmpp.stanza.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ */
+@SpecCompliant(spec="xep-0202", status= SpecCompliant.ComplianceStatus.FINISHED, coverage = SpecCompliant.ComplianceCoverage.COMPLETE)
+public class EntityTimeIQHandler extends DefaultIQHandler {
+
+    protected SimpleDateFormat utcDateFormatter;
+
+    public EntityTimeIQHandler() {
+        utcDateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        utcDateFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); // convert to UTC
+    }
+
+    @Override
+    protected boolean verifyNamespace(Stanza stanza) {
+        return verifyInnerNamespace(stanza, NamespaceURIs.URN_XMPP_TIME);
+    }
+
+    @Override
+    protected boolean verifyInnerElement(Stanza stanza) {
+        return verifyInnerElementWorker(stanza, "time");
+    }
+
+    @Override
+    protected Stanza handleGet(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) {
+
+        Date now = new Date();
+
+        String timeZone = new SimpleDateFormat("Z").format(now);
+        timeZone = timeZone.substring(0, 3) + ":" + timeZone.substring(3, 5); // adjust to required formatting "-00:08"
+
+        String utcTime = utcDateFormatter.format(now);
+
+        StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), IQStanzaType.RESULT, stanza.getID()).
+            startInnerElement("time").
+            addNamespaceAttribute(NamespaceURIs.URN_XMPP_TIME).
+
+            startInnerElement("tzo").addText(timeZone).endInnerElement().
+            startInnerElement("utc").addText(utcTime).endInnerElement().
+
+        endInnerElement();
+
+        return stanzaBuilder.getFinalStanza();
+    }
+}

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeModule.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeModule.java?rev=756338&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeModule.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeModule.java Fri Mar 20 06:21:57 2009
@@ -0,0 +1,51 @@
+package org.apache.vysper.xmpp.modules.extension.xep0202_entity_time;
+
+import org.apache.vysper.xmpp.modules.DefaultDiscoAwareModule;
+import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionIQHandler;
+import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature;
+import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoElement;
+import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequest;
+import org.apache.vysper.xmpp.modules.servicediscovery.management.ServerInfoRequestListener;
+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.protocol.StanzaHandler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ */
+public class EntityTimeModule extends DefaultDiscoAwareModule implements ServerInfoRequestListener {
+
+    protected boolean supportXEP0090 = true;
+
+    @Override
+    public String getName() {
+        return "XEP-0202 Entity Time";
+    }
+
+    @Override
+    public String getVersion() {
+        return "1.0";
+    }
+
+    @Override
+    protected void addServerInfoRequestListeners(List<ServerInfoRequestListener> serverInfoRequestListeners) {
+        serverInfoRequestListeners.add(this);
+    }
+
+    public List<InfoElement> getServerInfosFor(InfoRequest request) {
+        List<InfoElement> infoElements = new ArrayList<InfoElement>();
+        infoElements.add(new Feature(NamespaceURIs.URN_XMPP_TIME));
+        if (supportXEP0090) infoElements.add(new Feature(NamespaceURIs.JABBER_IQ_TIME));
+        return infoElements;
+    }
+
+    @Override
+    protected void addHandlerDictionaries(List<HandlerDictionary> dictionary) {
+        dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.URN_XMPP_TIME, new EntityTimeIQHandler()));
+        // backward compatibility to XEP-0090
+        if (supportXEP0090) dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.JABBER_IQ_TIME, new EntityTimeXEP0090IQHandler()));
+    }
+}

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeXEP0090IQHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeXEP0090IQHandler.java?rev=756338&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeXEP0090IQHandler.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0202_entity_time/EntityTimeXEP0090IQHandler.java Fri Mar 20 06:21:57 2009
@@ -0,0 +1,66 @@
+package org.apache.vysper.xmpp.modules.extension.xep0202_entity_time;
+
+import org.apache.vysper.compliance.SpecCompliant;
+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.stanza.IQStanza;
+import org.apache.vysper.xmpp.stanza.IQStanzaType;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
+import java.util.Calendar;
+import java.util.TimeZone;
+import java.util.Date;
+import java.util.Locale;
+import java.text.SimpleDateFormat;
+
+/**
+ * implements deprecated XEP0090 Entity Time
+ */
+@SpecCompliant(spec="xep-0090", status= SpecCompliant.ComplianceStatus.FINISHED, coverage = SpecCompliant.ComplianceCoverage.COMPLETE)
+public class EntityTimeXEP0090IQHandler extends DefaultIQHandler {
+
+    protected SimpleDateFormat utcDateFormatter;
+    protected SimpleDateFormat localDateFormatter;
+
+    public EntityTimeXEP0090IQHandler() {
+        localDateFormatter = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy", Locale.ENGLISH);
+
+        utcDateFormatter = new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss");
+        utcDateFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); // convert to UTC
+    }
+
+    @Override
+    protected boolean verifyNamespace(Stanza stanza) {
+        return verifyInnerNamespace(stanza, NamespaceURIs.JABBER_IQ_TIME);
+    }
+
+    @Override
+    protected boolean verifyInnerElement(Stanza stanza) {
+        return verifyInnerElementWorker(stanza, "query");
+    }
+
+    @Override
+    protected Stanza handleGet(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) {
+
+        Date now = new Date();
+
+        String timeZone = TimeZone.getDefault().getDisplayName(TimeZone.getDefault().inDaylightTime(now), TimeZone.SHORT);
+        String utcTime = utcDateFormatter.format(now);
+        String displayTime = localDateFormatter.format(now);
+
+        StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(stanza.getTo(), stanza.getFrom(), IQStanzaType.RESULT, stanza.getID()).
+            startInnerElement("query").
+            addNamespaceAttribute(NamespaceURIs.JABBER_IQ_TIME).
+
+            startInnerElement("utc").addText(utcTime).endInnerElement().
+            startInnerElement("tz").addText(timeZone).endInnerElement().
+            startInnerElement("display").addText(displayTime).endInnerElement().
+
+        endInnerElement();
+
+        return stanzaBuilder.getFinalStanza();
+    }
+}

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=756338&r1=756337&r2=756338&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 Fri Mar 20 06:21:57 2009
@@ -28,11 +28,13 @@
     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";
     public static final String JABBER_IQ_VERSION = "jabber:iq:version";
+    public static final String JABBER_IQ_TIME = "jabber:iq:time";
     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";
     

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=756338&r1=756337&r2=756338&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 Fri Mar 20 06:21:57 2009
@@ -20,6 +20,7 @@
 import org.apache.vysper.stanzasession.StanzaSessionFactory;
 import org.apache.vysper.xmpp.authorization.SimpleUserAuthorization;
 import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
+import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
 
 import java.io.File;
 
@@ -57,5 +58,6 @@
         }
 
         server.addModule(new SoftwareVersionModule());
+        server.addModule(new EntityTimeModule());
     }
 }
\ No newline at end of file

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java?rev=756338&r1=756337&r2=756338&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/state/resourcebinding/ResourceRegistry.java Fri Mar 20 06:21:57 2009
@@ -21,6 +21,8 @@
 import org.apache.vysper.xmpp.uuid.UUIDGenerator;
 import org.apache.vysper.xmpp.addressing.Entity;
 import static org.apache.vysper.xmpp.state.resourcebinding.ResourceState.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.List;
 import java.util.ArrayList;
@@ -33,6 +35,8 @@
  */
 public class ResourceRegistry {
 
+    final Logger logger = LoggerFactory.getLogger(ResourceRegistry.class);
+
     private static class SessionData {
 
         private final SessionContext context;
@@ -91,7 +95,7 @@
                     // record session for the resource id
                     boundResources.put(resourceId, new SessionData(sessionContext,
                             CONNECTED, 0));
-    
+
                     Entity initiatingEntity = sessionContext.getInitiatingEntity();
                     List<String> resourceForEntityList = getResourceList(initiatingEntity);
                     if (resourceForEntityList == null) {
@@ -100,6 +104,7 @@
                                 resourceForEntityList);
                     }
                     resourceForEntityList.add(resourceId);
+                    logger.info("added resource no. " + resourceForEntityList.size() + " to entity {} <- {}", initiatingEntity.getFullQualifiedName(), resourceId);
 
                     List<String> resourcesForSessionList = sessionResources.get(sessionContext);
                     if (resourcesForSessionList == null) {
@@ -107,6 +112,7 @@
                         sessionResources.put(sessionContext, resourcesForSessionList);
                     }
                     resourcesForSessionList.add(resourceId);
+                    logger.info("added resource no. " + resourcesForSessionList.size() + " to session {} <- {}", sessionContext.getSessionId(), resourceId);
                 }
 			}
 		}

Modified: labs/vysper/src/test/java/org/apache/vysper/smack/BasicClient.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/smack/BasicClient.java?rev=756338&r1=756337&r2=756338&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/smack/BasicClient.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/smack/BasicClient.java Fri Mar 20 06:21:57 2009
@@ -18,10 +18,7 @@
 
 import org.jivesoftware.smack.*;
 import org.jivesoftware.smack.filter.PacketFilter;
-import org.jivesoftware.smack.packet.Message;
-import org.jivesoftware.smack.packet.Presence;
-import org.jivesoftware.smack.packet.IQ;
-import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.*;
 import org.jivesoftware.smackx.packet.Version;
 import org.jivesoftware.smackx.packet.Time;
 
@@ -31,7 +28,7 @@
  */
 public class BasicClient {
 
-    static class IQListener implements PacketListener{
+    static class IQListener implements PacketListener {
 
         public void processPacket(Packet packet) {
             IQ iq = (IQ) packet;
@@ -40,6 +37,16 @@
         }
     }
 
+    static class PresenceListener implements PacketListener {
+
+        public void processPacket(Packet packet) {
+            Presence presence = (Presence) packet;
+            String iqString = presence.toString();
+            final PacketExtension extension = presence.getExtension("http://jabber.org/protocol/caps");
+            if (extension != null) System.out.println("T" + System.currentTimeMillis() + " Pres: " + iqString + ": " + presence.toXML());
+        }
+    }
+
     public static void main(String[] args) throws XMPPException {
 
         String me = args.length > 0 ? args[0] : "user1";
@@ -60,9 +67,9 @@
 
             SASLAuthentication saslAuthentication = connection.getSASLAuthentication();
 //            saslAuthentication.authenticateAnonymously();
-            saslAuthentication.authenticate("user1@vysper.org", "password1", "test");
+//            saslAuthentication.authenticate("user1@vysper.org", "password1", "test");
 
-            if (!saslAuthentication.isAuthenticated()) return;
+//            if (!saslAuthentication.isAuthenticated()) return;
 
 
             connection.login(me + "@vysper.org", "password1");
@@ -75,9 +82,16 @@
                 }
             });
 
+            connection.addPacketListener(new PresenceListener() , new PacketFilter() {
+                public boolean accept(Packet packet) {
+                    return packet instanceof Presence;
+                }
+            });
+
             Chat chat = null;
             if (to != null) {
                 Presence presence = new Presence(Presence.Type.subscribe);
+                presence.setFrom(connection.getUser());
                 String toEntity = to + "@vysper.org";
                 presence.setTo(toEntity);
                 connection.sendPacket(presence);



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