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/07/10 21:47:25 UTC

svn commit: r1144969 - in /incubator/nuvem/trunk: nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/ nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/ nuvem-standalone/src/main/resources/ nuvem-standalone/src/main/resources/META-INF/

Author: johnp
Date: Sun Jul 10 21:47:25 2011
New Revision: 1144969

URL: http://svn.apache.org/viewvc?rev=1144969&view=rev
Log:
refactored to place the common code (which broadcasts recieved messages to listeners) in single place and also promoted xmpp service for standalone implementation

Modified:
    incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/AbstractXMPPEndPoint.java
    incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/XMPPEndPoint.java
    incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GoogleRecieverServlet.java
    incubator/nuvem/trunk/nuvem-standalone/src/main/resources/META-INF/sca-contribution.xml
    incubator/nuvem/trunk/nuvem-standalone/src/main/resources/nuvemxmpp.composite

Modified: incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/AbstractXMPPEndPoint.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/AbstractXMPPEndPoint.java?rev=1144969&r1=1144968&r2=1144969&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/AbstractXMPPEndPoint.java (original)
+++ incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/AbstractXMPPEndPoint.java Sun Jul 10 21:47:25 2011
@@ -20,9 +20,13 @@
 
 package org.apache.nuvem.cloud.xmpp;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.nuvem.cloud.xmpp.message.Message;
 import org.apache.nuvem.cloud.xmpp.message.MessageBuilder;
 import org.apache.nuvem.cloud.xmpp.message.MessageListener;
@@ -36,6 +40,7 @@ public abstract class AbstractXMPPEndPoi
 	 * Listeners for recivnig the XMPP messages from specific JIDs
 	 */
 	protected Map<JID, MessageListener> listeners = new ConcurrentHashMap<JID, MessageListener>();
+	protected List<MessageListener> genericListeners = Collections.synchronizedList(new ArrayList<MessageListener>());
 
 	public boolean isConnected() {
 		throw new UnsupportedOperationException("still not implemented");
@@ -48,10 +53,21 @@ public abstract class AbstractXMPPEndPoi
 	public void registerListner(JID jid, MessageListener listener) {
 		if (listener == null || jid == null)
 			throw new IllegalArgumentException("invalid jid/listener");
-		listeners.put(jid, listener);
+		
+		//avoid resource identifier for listeners
+		listeners.put(new JID(StringUtils.substringBefore(jid.asString(), "/")), listener);
 
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
+	public void registerListener(MessageListener listener) {
+		if (listener == null)
+			throw new IllegalArgumentException("invalid listener");
+		genericListeners.add(listener);
+	}
+	
 	public Status sendTextMessage(String content, String recipient) {
 		Message message = new MessageBuilder().containing(content).toRecipient(
 				recipient).build();
@@ -86,10 +102,37 @@ public abstract class AbstractXMPPEndPoi
 	public MessageListener getListenerFor(JID jid) {
 
 		MessageListener target = null;
-		if (listeners != null && (target = listeners.get(jid)) != null)
+		if (listeners != null
+				&& (target = listeners.get(new JID(StringUtils.substringBefore(
+						jid.asString(), "/")))) != null)
 			return target;
 		// default listener.
 		return MessageListener.LOGGING_LISTENER;
 
 	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public List<MessageListener> getListeners() {
+		if (this.genericListeners == null || this.genericListeners.size() == 0) {
+			return Collections.EMPTY_LIST;
+		}
+		//returning a copy to maintain thread safety.
+		List<MessageListener> listeners = new ArrayList<MessageListener>();
+		listeners.addAll(genericListeners);
+		return listeners;
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public void broadCastToListeners(Message message) {
+		List<MessageListener> listeners = new ArrayList<MessageListener>();
+		listeners.add(getListenerFor(message.sender()));
+		listeners.addAll(getListeners());
+		for (MessageListener listener : listeners) {
+			listener.listen(message);
+		}
+	}
 }

Modified: incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/XMPPEndPoint.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/XMPPEndPoint.java?rev=1144969&r1=1144968&r2=1144969&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/XMPPEndPoint.java (original)
+++ incubator/nuvem/trunk/nuvem-api/src/main/java/org/apache/nuvem/cloud/xmpp/XMPPEndPoint.java Sun Jul 10 21:47:25 2011
@@ -20,6 +20,8 @@
 
 package org.apache.nuvem.cloud.xmpp;
 
+import java.util.List;
+
 import org.apache.nuvem.cloud.xmpp.message.Message;
 import org.apache.nuvem.cloud.xmpp.message.MessageBuilder;
 import org.apache.nuvem.cloud.xmpp.message.MessageListener;
@@ -98,6 +100,16 @@ public interface XMPPEndPoint {
 	 * @see MessageListener#listen(Message)
 	 */
 	void registerListner(JID jid, MessageListener listener);
+	
+	/**
+	 * Registers the {@link MessageListener} to listen to messages recieved from any JID!
+	 * On receipt of an XMPP message, the endpoint will call
+	 * the {@link MessageListener#listen(Message)} method by passing the
+	 * received message as argument.
+	 * @param listener
+	 * @see #registerListner(JID, MessageListener)
+	 */
+	void registerListener(MessageListener listener);
 
 	/**
 	 * Returns the message listener registered for the specific JID.
@@ -111,6 +123,18 @@ public interface XMPPEndPoint {
 	MessageListener getListenerFor(JID jid);
 
 	/**
+	 * Returns the Message Listeners registered using {@link #registerListener(MessageListener)}
+	 * @return the listeners registered using {@link #registerListener(MessageListener)}
+	 */
+	List<MessageListener> getListeners();
+	
+	/**
+	 * Broadcasts the message to all listeners registered with this endpoint.
+	 * @param message the XMPP Message.
+	 */
+	void broadCastToListeners(Message message);
+	
+	/**
 	 * Clears the listener for the specified JID, which means, the messages
 	 * received from this specific JID will be ignored/lost!
 	 * 

Modified: incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GoogleRecieverServlet.java
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GoogleRecieverServlet.java?rev=1144969&r1=1144968&r2=1144969&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GoogleRecieverServlet.java (original)
+++ incubator/nuvem/trunk/nuvem-google/src/main/java/org/apache/nuvem/cloud/xmpp/impl/GoogleRecieverServlet.java Sun Jul 10 21:47:25 2011
@@ -20,6 +20,8 @@
 package org.apache.nuvem.cloud.xmpp.impl;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.logging.Logger;
 
 import javax.servlet.ServletConfig;
@@ -97,14 +99,6 @@ public class GoogleRecieverServlet exten
 		Message message = xmpp.parseMessage(req);
 		org.apache.nuvem.cloud.xmpp.message.Message nuvemMessage = GoogleXMPPMessageAdapter
 				.toNuvemMessage(message);
-		JID from = message.getFromJid();
-
-		// for identifying the listeners, we exclude the resource.
-		String jidExcludingResource = StringUtils.substringBefore(from.getId(),
-				"/");
-
-		endPoint.getListenerFor(
-				new org.apache.nuvem.cloud.xmpp.JID(jidExcludingResource))
-				.listen(nuvemMessage);
+		endPoint.broadCastToListeners(nuvemMessage);		
 	}
 }

Modified: incubator/nuvem/trunk/nuvem-standalone/src/main/resources/META-INF/sca-contribution.xml
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/main/resources/META-INF/sca-contribution.xml?rev=1144969&r1=1144968&r2=1144969&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/main/resources/META-INF/sca-contribution.xml (original)
+++ incubator/nuvem/trunk/nuvem-standalone/src/main/resources/META-INF/sca-contribution.xml Sun Jul 10 21:47:25 2011
@@ -19,10 +19,10 @@
 -->
 <contribution xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
 	xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1" 
-	xmlns:standalone="http://nuvemstandalone">
+	xmlns:nuvem="http://apache.org/nuvem">
 
-	<export namespace="http://nuvemstandalone" />
-	<export.java package="org.apache.nuvem.cloud.xmpp.client" />
+	<deployable composite="nuvem:xmppstandalone" />
+	<export namespace="http://apache.org/nuvem" />
+	
 	
-	<deployable composite="standalone:xmpp" />
 </contribution>
\ No newline at end of file

Modified: incubator/nuvem/trunk/nuvem-standalone/src/main/resources/nuvemxmpp.composite
URL: http://svn.apache.org/viewvc/incubator/nuvem/trunk/nuvem-standalone/src/main/resources/nuvemxmpp.composite?rev=1144969&r1=1144968&r2=1144969&view=diff
==============================================================================
--- incubator/nuvem/trunk/nuvem-standalone/src/main/resources/nuvemxmpp.composite (original)
+++ incubator/nuvem/trunk/nuvem-standalone/src/main/resources/nuvemxmpp.composite Sun Jul 10 21:47:25 2011
@@ -15,9 +15,14 @@
 	-->
 <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
 	xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
-	targetNamespace="http://nuvemstandalone" name="xmpp">
-
-
+	targetNamespace="http://apache.org/nuvem" name="xmppstandalone">
+    
+    <service name="XMPPEndPoint" promote="XMPPComponent/XMPPEndPoint" />
+    <property name="clientJID" type="xs:string">nuvem@localhost</property>
+    <property name="clientPassword" type="xs:string">password</property>
+    <property name="trustStorePath" type="xs:string">truststorepath</property>
+    <property name="trustStorePassword" type="xs:string">changeit</property>
+    
 	<component name="XMPPComponent">
 		<implementation.java
 			class="org.apache.nuvem.cloud.xmpp.client.DefaultXMPPEndPoint" />
@@ -57,10 +62,10 @@
 		<service name="XMPPConnector">
 			<interface.java interface="org.apache.nuvem.cloud.xmpp.XMPPConnector" />
 		</service>
-		<property name="clientJID">nuvem@localhost</property>
-		<property name="clientPassword">password</property>
-		<property name="trustStorePath">truststorepath</property>
-		<property name="trustStorePassword">changeit</property>
+		<property name="clientJID" source="$clientJID" />
+		<property name="clientPassword" source="$clientPassword" />
+		<property name="trustStorePath" source="$trustStorePath" />
+		<property name="trustStorePassword" source="$trustStorePassword" />
 	</component>
 
 </composite>