You are viewing a plain text version of this content. The canonical link for it is here.
Posted to nuvem-commits@incubator.apache.org by jo...@apache.org on 2011/05/17 22:30:37 UTC
svn commit: r1104607 - in /incubator/nuvem/trunk:
nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/
nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/presence/ nuvem-google/
nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/ nuvem-standa...
Author: johnp
Date: Tue May 17 22:30:37 2011
New Revision: 1104607
URL: http://svn.apache.org/viewvc?rev=1104607&view=rev
Log:
Added necessary APIs to all XMPP clients to receive presence updates from the XMPP server
Added:
incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceFilter.java
incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceSubscriptionListener.java
incubator/nuvem/trunk/nuvem-standalone/src/test/java/org/apache/nuvem/cloud/xmpp/client/XMPPPresenceIntegrationTest.java
Removed:
incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/AbstractPresenceManager.java
Modified:
incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/presence/PresenceManager.java
incubator/nuvem/trunk/nuvem-google/pom.xml
incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceManager.java
incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceServlet.java
incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/PresenceAdapter.java
incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultPresenceManager.java
incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultXMPPEndPoint.java
incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceAdapter.java
Modified: incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/presence/PresenceManager.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/presence/PresenceManager.java?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/presence/PresenceManager.java (original)
+++ incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/presence/PresenceManager.java Tue May 17 22:30:37 2011
@@ -29,8 +29,26 @@ import java.util.List;
*/
public interface PresenceManager {
+ /**
+ * Registers a presence listener to recieve notification of any presence
+ * message recieved from the XMPP server.
+ *
+ * @param listener
+ */
void registerListener(PresenceListener listener);
+ /**
+ * Returns a list of all {@link PresenceListener}s waiting to receive
+ * presence stanzas.
+ *
+ * @return
+ */
List<PresenceListener> listeners();
+
+ /**
+ * Sends the presence stanza to the XMPP server.
+ * @param presence
+ */
+ void sendPresence(Presence presence);
}
Modified: incubator/nuvem/trunk/nuvem-google/pom.xml
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-google/pom.xml?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-google/pom.xml (original)
+++ incubator/nuvem/trunk/nuvem-google/pom.xml Tue May 17 22:30:37 2011
@@ -96,6 +96,12 @@
</dependency>
<dependency>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ <version>3.2.1</version>
+ </dependency>
+
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
Modified: incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceManager.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceManager.java?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceManager.java (original)
+++ incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceManager.java Tue May 17 22:30:37 2011
@@ -20,21 +20,29 @@
package org.apache.nuvem.cloud.xmpp.impl;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import java.util.logging.Logger;
import org.apache.commons.lang.Validate;
-import org.apache.nuvem.cloud.xmpp.AbstractPresenceManager;
import org.apache.nuvem.cloud.xmpp.XMPPConnector;
+import org.apache.nuvem.cloud.xmpp.presence.Presence;
import org.apache.nuvem.cloud.xmpp.presence.PresenceListener;
import org.apache.nuvem.cloud.xmpp.presence.PresenceManager;
import org.oasisopen.sca.annotation.Init;
import org.oasisopen.sca.annotation.Reference;
+import org.oasisopen.sca.annotation.Scope;
import org.oasisopen.sca.annotation.Service;
+import com.google.appengine.api.xmpp.JID;
+import com.google.appengine.api.xmpp.PresenceShow;
+import com.google.appengine.api.xmpp.PresenceType;
import com.google.appengine.api.xmpp.XMPPService;
@Service(PresenceManager.class)
-public class GooglePresenceManager extends AbstractPresenceManager {
+@Scope("COMPOSITE")
+public class GooglePresenceManager implements PresenceManager {
/**
* Logger.
@@ -42,13 +50,19 @@ public class GooglePresenceManager exten
private static final Logger log = Logger.getLogger(PresenceManager.class
.getName());
+ /**
+ * List of all presence listeners.
+ */
+ private List<PresenceListener> listeners = new ArrayList<PresenceListener>();
+
@Reference(required = false)
protected XMPPConnector<XMPPService> connector;
@Init
public void init() {
if (connector == null) {
- log.info("Google Presence manager is getting initialized with a default connector...");
+ log
+ .info("Google Presence manager is getting initialized with a default connector...");
connector = new GoogleXMPPConnector();
}
}
@@ -59,4 +73,24 @@ public class GooglePresenceManager exten
listeners.add(listener);
}
+ public void clearListeners() {
+ listeners.clear();
+ }
+
+ public List<PresenceListener> listeners() {
+ return Collections.unmodifiableList(listeners);
+ }
+
+ @Override
+ public void sendPresence(Presence presence) {
+ JID to = new JID(presence.to().asString());
+ PresenceType type = PresenceAdapter.toGooglePresenceType(presence
+ .type());
+ PresenceShow show = PresenceAdapter.toGooglePresenceShow(presence
+ .show());
+ String status = presence.status();
+ connector.getConnection().sendPresence(to, type, show, status);
+
+ }
+
}
Modified: incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceServlet.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceServlet.java?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceServlet.java (original)
+++ incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GooglePresenceServlet.java Tue May 17 22:30:37 2011
@@ -39,7 +39,7 @@ import com.google.appengine.api.xmpp.XMP
* A servlet to recieve XMPP presence change requests from google cloud
* platform.
* <p>
- * This servlet will recieve the presence change requests posted in the HTTP
+ * This servlet will receive the presence change requests posted in the HTTP
* POST request, parse the message using the APIs provided by GAE convert the
* request into nuvem specific presence object so that the
* {@link PresenceListener#listen(org.apache.nuvem.cloud.xmpp.presence.Presence)}
Modified: incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/PresenceAdapter.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/PresenceAdapter.java?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/PresenceAdapter.java (original)
+++ incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/PresenceAdapter.java Tue May 17 22:30:37 2011
@@ -22,6 +22,8 @@ package org.apache.nuvem.cloud.xmpp.impl
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.collections.BidiMap;
+import org.apache.commons.collections.bidimap.DualHashBidiMap;
import org.apache.commons.lang.StringUtils;
import org.apache.nuvem.cloud.xmpp.JID;
import org.apache.nuvem.cloud.xmpp.presence.Presence;
@@ -37,8 +39,17 @@ import com.google.appengine.api.xmpp.Pre
*/
public final class PresenceAdapter {
- private static final Map<PresenceShow, Presence.Show> showConverstionMap = new HashMap<PresenceShow, Show>();
- private static final Map<PresenceType, Presence.Type> typeConversionMap = new HashMap<PresenceType, Type>();
+ /**
+ * A bidirectional converstion map with key as google presence show and
+ * value as nuvem's show value.
+ */
+ private static final BidiMap showConverstionMap = new DualHashBidiMap();
+
+ /**
+ * A bidirectional converstion map with key as google's presence type value
+ * and value as nuvem's presence type value.F
+ */
+ private static final BidiMap typeConverstionMap = new DualHashBidiMap();
static {
showConverstionMap.put(PresenceShow.AWAY, Show.AWAY);
@@ -47,9 +58,12 @@ public final class PresenceAdapter {
showConverstionMap.put(PresenceShow.XA, Show.XA);
showConverstionMap.put(PresenceShow.NONE, Show.NONE);
- typeConversionMap.put(PresenceType.AVAILABLE, Type.AVAILABLE);
- typeConversionMap.put(PresenceType.PROBE, Type.PROBE);
- typeConversionMap.put(PresenceType.UNAVAILABLE, Type.UNAVAILABLE);
+ typeConverstionMap.put(PresenceType.AVAILABLE,
+ Type.AVAILABLE);
+ typeConverstionMap.put(PresenceType.PROBE, Type.PROBE);
+ typeConverstionMap.put(PresenceType.UNAVAILABLE,
+ Type.UNAVAILABLE);
+
}
/**
@@ -59,8 +73,10 @@ public final class PresenceAdapter {
*/
public static Presence toNuvemPresence(
com.google.appengine.api.xmpp.Presence presence) {
- Show show = showConverstionMap.get(presence.getPresenceShow());
- Type type = typeConversionMap.get(presence.getPresenceType());
+ Show show = (Show) showConverstionMap.get(presence
+ .getPresenceShow());
+ Type type = (Type) typeConverstionMap.get(presence
+ .getPresenceType());
String status = StringUtils.defaultString(presence.getStatus());
String stanza = StringUtils.defaultString(presence.getStanza());
@@ -72,4 +88,22 @@ public final class PresenceAdapter {
}
return builder.build();
}
+
+ public static Presence.Type toNuvemPresenceType(
+ com.google.appengine.api.xmpp.PresenceType type) {
+ return (Presence.Type) typeConverstionMap.get(type);
+ }
+
+ public static PresenceType toGooglePresenceType(Presence.Type type) {
+ return (PresenceType) typeConverstionMap.getKey(type);
+ }
+
+ public static Presence.Show toNuvemPresenceShow(
+ com.google.appengine.api.xmpp.PresenceShow show) {
+ return (Presence.Show) showConverstionMap.get(show);
+ }
+
+ public static PresenceShow toGooglePresenceShow(Presence.Show show) {
+ return (PresenceShow) showConverstionMap.getKey(show);
+ }
}
Modified: incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultPresenceManager.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultPresenceManager.java?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultPresenceManager.java (original)
+++ incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultPresenceManager.java Tue May 17 22:30:37 2011
@@ -20,13 +20,20 @@
package org.apache.nuvem.cloud.xmpp.client;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
import org.apache.commons.lang.Validate;
import org.apache.nuvem.cloud.xmpp.XMPPConnector;
+import org.apache.nuvem.cloud.xmpp.presence.Presence;
import org.apache.nuvem.cloud.xmpp.presence.PresenceListener;
import org.apache.nuvem.cloud.xmpp.presence.PresenceManager;
-import org.apache.nuvem.cloud.xmpp.AbstractPresenceManager;
import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.Roster.SubscriptionMode;
+import org.oasisopen.sca.annotation.Init;
import org.oasisopen.sca.annotation.Reference;
+import org.oasisopen.sca.annotation.Scope;
import org.oasisopen.sca.annotation.Service;
/**
@@ -34,7 +41,19 @@ import org.oasisopen.sca.annotation.Serv
*
*/
@Service(PresenceManager.class)
-public class DefaultPresenceManager extends AbstractPresenceManager {
+@Scope("COMPOSITE")
+public class DefaultPresenceManager implements PresenceManager {
+
+ /**
+ * A list of all listeners listening for any presence messages.
+ */
+ private List<PresenceListener> listeners = new ArrayList<PresenceListener>();
+
+ /**
+ * Logger.
+ */
+ private static final Logger log = Logger.getLogger(PresenceManager.class
+ .getName());
/**
* Connecter to fetch XMPP Connection.
@@ -42,6 +61,14 @@ public class DefaultPresenceManager exte
@Reference
protected XMPPConnector<XMPPConnection> connector;
+ @Init
+ public void init() {
+ log.info("Initializing PresenceManager using connector "
+ + connector.getDescription());
+ connector.getConnection().getRoster().setSubscriptionMode(
+ SubscriptionMode.manual);
+ }
+
/**
* {@inheritDoc}
*/
@@ -50,8 +77,24 @@ public class DefaultPresenceManager exte
Validate.notNull(listener);
connector.getConnection().getRoster().addRosterListener(
new RosterListenerAdapter(listener));
- //Keeps a reference to the listener for later use.
+ // Keeps a reference to the listener for later use.
listeners.add(listener);
}
+ public void clearListeners() {
+ listeners.clear();
+ }
+
+ public List<PresenceListener> listeners() {
+ List<PresenceListener> listeners = new ArrayList<PresenceListener>();
+ listeners.addAll(this.listeners);
+ return listeners;
+ }
+
+ @Override
+ public void sendPresence(Presence presence) {
+ connector.getConnection().sendPacket(
+ PresenceAdapter.toSmackPresence(presence));
+ }
+
}
Modified: incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultXMPPEndPoint.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultXMPPEndPoint.java?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultXMPPEndPoint.java (original)
+++ incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/DefaultXMPPEndPoint.java Tue May 17 22:30:37 2011
@@ -61,9 +61,8 @@ public class DefaultXMPPEndPoint extends
protected XMPPConnector<XMPPConnection> connector;
@Reference
- protected PresenceManager presenceManager;
-
-
+ protected PresenceManager presenceManager;
+
/**
* The packet filter to decide what packets to recieve from the XMPP
* Server..
@@ -94,6 +93,9 @@ public class DefaultXMPPEndPoint extends
filter = new NuvemPacketFilter(this);
listener = new NuvemPacketListener(this);
connector.getConnection().addPacketListener(this.listener, filter);
+ connector.getConnection().addPacketListener(
+ new PresenceSubscriptionListener(presenceManager),
+ new PresenceFilter(Type.subscribe));
}
/**
Modified: incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceAdapter.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceAdapter.java?rev=1104607&r1=1104606&r2=1104607&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceAdapter.java (original)
+++ incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceAdapter.java Tue May 17 22:30:37 2011
@@ -19,9 +19,8 @@
package org.apache.nuvem.cloud.xmpp.client;
-import java.util.HashMap;
-import java.util.Map;
-
+import org.apache.commons.collections.BidiMap;
+import org.apache.commons.collections.bidimap.DualHashBidiMap;
import org.apache.commons.lang.StringUtils;
import org.apache.nuvem.cloud.xmpp.JID;
import org.apache.nuvem.cloud.xmpp.presence.Presence;
@@ -37,8 +36,17 @@ import org.jivesoftware.smack.packet.Pre
*/
public final class PresenceAdapter {
- private static final Map<Mode, Presence.Show> showConverstionMap = new HashMap<Mode, Show>();
- private static final Map<org.jivesoftware.smack.packet.Presence.Type, Presence.Type> typeConversionMap = new HashMap<org.jivesoftware.smack.packet.Presence.Type, Type>();
+ /**
+ * A bidirectional map with key being smack's mode and value being nuvem's
+ * show values respectively.
+ */
+ private static final BidiMap showConverstionMap = new DualHashBidiMap();
+
+ /**
+ * A bidirectional map with key being smack's type and value being nuvems
+ * presence types respectively.
+ */
+ private static final BidiMap typeConversionMap = new DualHashBidiMap();
static {
showConverstionMap.put(Mode.available, Show.AVAILABLE);
@@ -78,8 +86,8 @@ public final class PresenceAdapter {
String from = presence.getFrom();
String to = presence.getTo();
String status = presence.getStatus();
- Show show = showConverstionMap.get(presence.getMode());
- Type type = typeConversionMap.get(presence.getType());
+ Show show = (Show) showConverstionMap.get(presence.getMode());
+ Type type = (Type) typeConversionMap.get(presence.getType());
PresenceBuilder builder = new PresenceBuilder().withShow(show)
.withType(type).withStatus(status);
builder.from(new JID(from));
@@ -88,4 +96,28 @@ public final class PresenceAdapter {
}
return builder.build();
}
+
+ /**
+ * Converts Nuvem's {@link org.apache.nuvem.cloud.xmpp.presence.Presence} to
+ * smack's {@link org.jivesoftware.smack.packet.Presence} object.
+ *
+ * @param presence
+ * @return
+ */
+ public static org.jivesoftware.smack.packet.Presence toSmackPresence(
+ Presence presence) {
+ Mode mode = (Mode) showConverstionMap.getKey(presence.show());
+ org.jivesoftware.smack.packet.Presence.Type type = (org.jivesoftware.smack.packet.Presence.Type) typeConversionMap
+ .getKey(presence.type());
+ String status = StringUtils.defaultString(presence.status());
+ org.jivesoftware.smack.packet.Presence smackPresence = new org.jivesoftware.smack.packet.Presence(
+ type, status, 0, mode);
+ if (presence.from() != null) {
+ smackPresence.setFrom(presence.from().asString());
+ }
+ if (presence.to() != null) {
+ smackPresence.setTo(presence.to().asString());
+ }
+ return smackPresence;
+ }
}
Added: incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceFilter.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceFilter.java?rev=1104607&view=auto
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceFilter.java (added)
+++ incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceFilter.java Tue May 17 22:30:37 2011
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.nuvem.cloud.xmpp.client;
+
+import org.apache.commons.lang.Validate;
+import org.jivesoftware.smack.filter.PacketFilter;
+import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.Presence;
+import org.jivesoftware.smack.packet.Presence.Type;
+
+/**
+ * Accepts only {@link Presence} stanza of {@link Type} which is injected as a
+ * constructor argument
+ *
+ */
+public class PresenceFilter implements PacketFilter {
+
+ private Type type;
+
+ public PresenceFilter(Type type) {
+ Validate.notNull(type);
+ this.type = type;
+ }
+
+ /**
+ * Accepts only Presence stanza of type "subscribe".
+ */
+ public boolean accept(Packet packet) {
+ if (packet != null) {
+ return (packet instanceof Presence)
+ && ((Presence) packet).getType() == type;
+ }
+ return false;
+ }
+}
\ No newline at end of file
Added: incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceSubscriptionListener.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceSubscriptionListener.java?rev=1104607&view=auto
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceSubscriptionListener.java (added)
+++ incubator/nuvem/trunk/nuvem-standalone/src/main/java/org/apache/nuvem/cloud/xmpp/client/PresenceSubscriptionListener.java Tue May 17 22:30:37 2011
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.nuvem.cloud.xmpp.client;
+
+import org.apache.nuvem.cloud.xmpp.presence.PresenceListener;
+import org.apache.nuvem.cloud.xmpp.presence.PresenceManager;
+import org.jivesoftware.smack.PacketListener;
+import org.jivesoftware.smack.packet.Packet;
+import org.jivesoftware.smack.packet.Presence;
+
+/**
+ * Listens to all only Presence stanza of type subscribe.
+ *
+ * @see Presence.Type;
+ *
+ */
+public class PresenceSubscriptionListener implements PacketListener {
+
+ /**
+ * The presence manager.
+ */
+ private PresenceManager presenceManager;
+
+ /**
+ * Constructor which takes a reference to the {@link PresenceManager}
+ * through which this listener can notify all listeners registered to
+ * recieve Presence messages.
+ *
+ * @param endPoint
+ */
+ public PresenceSubscriptionListener(PresenceManager presenceManager) {
+ this.presenceManager = presenceManager;
+ }
+
+ @Override
+ public void processPacket(Packet packet) {
+ if (packet instanceof Presence) {
+ for (PresenceListener listener : presenceManager.listeners()) {
+ listener.listen(PresenceAdapter
+ .toNuvemPresence((Presence) packet));
+ }
+ }
+ }
+}
\ No newline at end of file
Added: incubator/nuvem/trunk/nuvem-standalone/src/test/java/org/apache/nuvem/cloud/xmpp/client/XMPPPresenceIntegrationTest.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/test/java/org/apache/nuvem/cloud/xmpp/client/XMPPPresenceIntegrationTest.java?rev=1104607&view=auto
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/test/java/org/apache/nuvem/cloud/xmpp/client/XMPPPresenceIntegrationTest.java (added)
+++ incubator/nuvem/trunk/nuvem-standalone/src/test/java/org/apache/nuvem/cloud/xmpp/client/XMPPPresenceIntegrationTest.java Tue May 17 22:30:37 2011
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.nuvem.cloud.xmpp.client;
+
+import junit.framework.Assert;
+
+import org.apache.nuvem.cloud.xmpp.JID;
+import org.apache.nuvem.cloud.xmpp.XMPPEndPoint;
+import org.apache.nuvem.cloud.xmpp.XMPPServer;
+import org.apache.nuvem.cloud.xmpp.presence.Presence;
+import org.apache.nuvem.cloud.xmpp.presence.PresenceBuilder;
+import org.apache.nuvem.cloud.xmpp.presence.PresenceListener;
+import org.apache.nuvem.cloud.xmpp.presence.PresenceManager;
+import org.apache.nuvem.cloud.xmpp.server.DefaultXMPPServer;
+import org.apache.tuscany.sca.node.Node;
+import org.apache.tuscany.sca.node.NodeFactory;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class XMPPPresenceIntegrationTest {
+ private static XMPPServer server;
+ private static Node xmppNode;
+ private static PresenceManager presenceManagerA;
+ private static PresenceManager presenceManagerB;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ server = new DefaultXMPPServer();
+ server.start();
+ xmppNode = NodeFactory.getInstance().createNode(
+ "testnuvemxmpp.composite");
+ xmppNode.start();
+ presenceManagerA = xmppNode.getService(XMPPEndPoint.class,
+ "TestXMPPComponentSender/XMPPEndPoint").presenceManager();
+ presenceManagerB = xmppNode.getService(XMPPEndPoint.class,
+ "TestXMPPComponentReciever/XMPPEndPoint").presenceManager();
+ }
+
+ @Test
+ public void ShouldSendAndRecievePresence() throws InterruptedException {
+ PresenceListenerImpl listener = new PresenceListenerImpl(new JID(
+ "nuvem@localhost"), Presence.Type.SUBSCRIBE);
+ presenceManagerB.registerListener(listener);
+ Presence presence = new PresenceBuilder().from(
+ new JID("nuvem@localhost")).to(new JID("reciever@localhost"))
+ .withType(Presence.Type.SUBSCRIBE).build();
+ presenceManagerA.sendPresence(presence);
+ Thread.sleep(2000);
+ listener.assertValidPresenceRecieved();
+
+ }
+
+ private static class PresenceListenerImpl implements PresenceListener {
+
+ private JID expectedFromJID;
+ private Presence.Type expectedType;
+
+ private JID actualFromJID;
+ private Presence.Type actualType;
+
+ public PresenceListenerImpl(JID expectedfrom, Presence.Type expectedType) {
+ this.expectedFromJID = expectedfrom;
+ this.expectedType = expectedType;
+ }
+
+ @Override
+ public void listen(Presence presence) {
+ actualFromJID = presence.from();
+ actualType = presence.type();
+ }
+
+ public void assertValidPresenceRecieved() {
+ Assert.assertEquals(expectedFromJID, actualFromJID);
+ Assert.assertEquals(expectedType, actualType);
+ }
+
+ }
+}