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