You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by su...@apache.org on 2008/11/09 20:07:05 UTC

svn commit: r712535 - in /webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp: XMPPSender.java util/XMPPConstants.java util/XMPPPacketListener.java

Author: sumedha
Date: Sun Nov  9 11:07:05 2008
New Revision: 712535

URL: http://svn.apache.org/viewvc?rev=712535&view=rev
Log:
Added ability to deal with plain text chat messages from IM clients. Yet to add logic to find service/operation & do the dispatching

Modified:
    webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/XMPPSender.java
    webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPConstants.java
    webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPPacketListener.java

Modified: webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/XMPPSender.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/XMPPSender.java?rev=712535&r1=712534&r2=712535&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/XMPPSender.java (original)
+++ webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/XMPPSender.java Sun Nov  9 11:07:05 2008
@@ -50,7 +50,7 @@
 import org.apache.axis2.description.AxisOperation;
 
 public class XMPPSender extends AbstractHandler implements TransportSender {
-	Log log = null;
+	static Log log = null;
     XMPPConnectionFactory connectionFactory;
     XMPPServerCredentials serverCredentials;    
 	
@@ -150,8 +150,11 @@
 		if(msgCtx.isServerSide()){
 			message.setProperty(XMPPConstants.IS_SERVER_SIDE, new Boolean(false));
 			message.setProperty(XMPPConstants.IN_REPLY_TO, xmppOutTransportInfo.getInReplyTo());
-		}else{			
+		}else{
+			//message is going to be processed on server side
 			message.setProperty(XMPPConstants.IS_SERVER_SIDE,new Boolean(true));
+			//we are sending a soap envelope as a message
+			message.setProperty(XMPPConstants.CONTAINS_SOAP_ENVELOPE, new Boolean(true));
 			message.setProperty(XMPPConstants.SERVICE_NAME, serviceName);
 			String action = options.getAction();
 			if (action == null) {
@@ -174,20 +177,16 @@
 		
 		try 
 		{
-			OMElement msgElement = msgCtx.getEnvelope();
-			//if (msgCtx.isDoingREST()) {
-			//	msgElement = msgCtx.getEnvelope().getBody().getFirstElement();
-			//}
 			boolean waitForResponse =
 				msgCtx.getOperationContext() != null &&
 				WSDL2Constants.MEP_URI_OUT_IN.equals(
 						msgCtx.getOperationContext().getAxisOperation().getMessageExchangePattern());
 			
-			
+			OMElement msgElement = msgCtx.getEnvelope();			
 			String soapMessage = msgElement.toString();
 			//int endOfXMLDeclaration = soapMessage.indexOf("?>");
 			//String modifiedSOAPMessage = soapMessage.substring(endOfXMLDeclaration+2);
-			message.setBody(soapMessage);	
+			message.setBody(soapMessage);				
 			
 			XMPPClientSidePacketListener xmppClientSidePacketListener = null;
 			if(waitForResponse && !msgCtx.isServerSide()){
@@ -223,8 +222,73 @@
 		}
     }	
     
+    /**
+     * Process message requests that came in through chat clients
+     * @param msgCtx
+     * @throws AxisFault
+     */
+    public static void processChatMessage(MessageContext msgCtx) throws AxisFault {
+    	Object obj = msgCtx.getProperty(XMPPConstants.MESSAGE_FROM_CHAT);
+    	if(obj != null){
+        	String message = (String)obj;
+        	String response = "";
+        	if(("help".compareToIgnoreCase(message.trim()) == 0)
+        			|| "?".equals(message)){
+        		response = prepareHelpTextForChat();        		
+        	}
+        	sendChatMessage(msgCtx,response);    		
+    	}
+    }
+    
+    /**
+     * Generate help text for chat client
+     * @return {@link String}
+     */
+    private static String prepareHelpTextForChat(){
+    	StringBuffer helpText = new StringBuffer();
+    	helpText.append("Following commands are supported :"+"\n");
+    	helpText.append("-----------------------------------"+"\n");
+    	helpText.append("1. listServices"+"\n");
+    	helpText.append("2. getOperations <service-name>"+"\n");
+    	helpText.append("3. call <service-name>:<operation>(<param1>,<param2>,...)"+"\n");
+    	return helpText.toString();
+    }
     
     /**
+     * Replies to IM clients via a chat message. The reply contains the invocation response as a string. 
+     * @param msgCtx
+     * @param responseMsg
+     * @throws AxisFault
+     */
+    private static void sendChatMessage(MessageContext msgCtx,String responseMsg) throws AxisFault {
+    		XMPPConnection xmppConnection = null;
+    		XMPPOutTransportInfo xmppOutTransportInfo = null;    		
+    		Message message = new Message();
+        	
+   			xmppOutTransportInfo = (XMPPOutTransportInfo)msgCtx.getProperty(Constants.OUT_TRANSPORT_INFO);
+   			if(xmppOutTransportInfo != null){
+   				message.setProperty(XMPPConstants.IN_REPLY_TO, xmppOutTransportInfo.getInReplyTo());
+   	    		xmppConnection = xmppOutTransportInfo.getConnectionFactory().getXmppConnection();
+   	        	if(xmppConnection == null){
+   	        		handleException("Connection to XMPP Server is not established.");    		
+   	        	}   	    		
+   			}else{
+   				handleException("Could not find message sender details.");
+   			}   			
+    		
+    		//initialize the chat manager using connection
+    		ChatManager chatManager = xmppConnection.getChatManager();
+    		Chat chat = chatManager.createChat(xmppOutTransportInfo.getDestinationAccount(), null);    		
+    		try{   			
+   				message.setBody(responseMsg);		
+    			chat.sendMessage(message);
+    			log.debug("Sent message :"+message.toXML());
+    		} catch (XMPPException e) {
+    			XMPPSender.handleException("Error occurred while sending the message : "+message.toXML(),e);
+    		}
+        }	
+
+    /**
      * Extract connection details from axis2.xml's transportsender section
      * @param serverCredentials
      * @param transportOut
@@ -275,11 +339,11 @@
 		}		
 	}  
 	
-    private void handleException(String msg, Exception e) throws AxisFault {
+    private static void handleException(String msg, Exception e) throws AxisFault {
         log.error(msg, e);
         throw new AxisFault(msg, e);
     }
-    private void handleException(String msg) throws AxisFault {
+    private static void handleException(String msg) throws AxisFault {
         log.error(msg);
         throw new AxisFault(msg);
     }

Modified: webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPConstants.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPConstants.java?rev=712535&r1=712534&r2=712535&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPConstants.java (original)
+++ webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPConstants.java Sun Nov  9 11:07:05 2008
@@ -46,4 +46,8 @@
     public static final String IN_REPLY_TO = "inReplyTo";
     public static final String SERVICE_NAME = "ServiceName";
     public static final String ACTION = "Action";
+    //This is set to true, if a request message is sent through XMPPSender
+    //Used to distinguish messages coming from chat clients.
+    public static final String CONTAINS_SOAP_ENVELOPE = "transport.xmpp.containsSOAPEnvelope";
+    public static final String MESSAGE_FROM_CHAT = "transport.xmpp.message.from.chat";
 }

Modified: webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPPacketListener.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPPacketListener.java?rev=712535&r1=712534&r2=712535&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPPacketListener.java (original)
+++ webservices/commons/trunk/modules/transport/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPPacketListener.java Sun Nov  9 11:07:05 2008
@@ -31,6 +31,7 @@
 import org.apache.axis2.description.TransportOutDescription;
 import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.transport.TransportUtils;
+import org.apache.axis2.transport.xmpp.XMPPSender;
 import org.apache.axis2.util.MessageContextBuilder;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.logging.Log;
@@ -77,7 +78,7 @@
 	 * @throws AxisFault
 	 */
 	private MessageContext createMessageContext(Packet packet) throws AxisFault {
-		Message message = (Message) packet;
+		Message message = (Message) packet;		
 
 		Boolean isServerSide = (Boolean) message
 				.getProperty(XMPPConstants.IS_SERVER_SIDE);
@@ -155,36 +156,39 @@
      * @throws AxisFault
      */
 	private void buildSOAPEnvelope(Packet packet, MessageContext msgContext) throws AxisFault{
-		Message message = (Message)packet;
-		String xml = StringEscapeUtils.unescapeXml(message.getBody());
-		InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
+		Message message = (Message)packet;		
+		String logMsg = "Trying to create " +
+		"message content using XMPP message received :"+packet.toXML();
+			
+		String messageBody = StringEscapeUtils.unescapeXml(message.getBody());
+		if(msgContext.isServerSide()){
+			log.info("Received Envelope : "+messageBody);
+		}
+		
+		InputStream inputStream = new ByteArrayInputStream(messageBody.getBytes());
 		SOAPEnvelope envelope;
 		try {
-			envelope = TransportUtils.createSOAPMessage(msgContext, inputStream, "text/xml");
-			if(msgContext.isServerSide()){
-				log.info("Received Envelope : "+xml);
+			Object obj = message.getProperty(XMPPConstants.CONTAINS_SOAP_ENVELOPE); 
+			if(obj != null && ((Boolean)obj).booleanValue()){
+				envelope = TransportUtils.createSOAPMessage(msgContext, inputStream, "text/xml");
+				msgContext.setEnvelope(envelope);
+				msgContext.setProperty(XMPPConstants.CONTAINS_SOAP_ENVELOPE, new Boolean(true));
+			}else{
+				//A text message has been received from a chat client, send it along with message context
+				msgContext.setProperty(XMPPConstants.MESSAGE_FROM_CHAT, messageBody);
 			}
-			msgContext.setEnvelope(envelope);
 		}catch (OMException e) {
-			log.error("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML(), e);
-			throw new AxisFault("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML());
+			log.error(logMsg, e);
+			throw new AxisFault(logMsg);
 		}catch (XMLStreamException e) {
-			log.error("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML(), e);
-			throw new AxisFault("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML());
+			log.error(logMsg, e);
+			throw new AxisFault(logMsg);
 		}catch (FactoryConfigurationError e) {
-			log.error("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML(), e);
-			throw new AxisFault("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML());
+			log.error(logMsg, e);
+			throw new AxisFault(logMsg);
 		}catch (AxisFault e){
-			log.error("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML(), e);
-			throw new AxisFault("Error occured while trying to create " +
-					"message content using XMPP message received :"+packet.toXML());
+			log.error(logMsg, e);
+			throw new AxisFault(logMsg);
 		}
 	}
 
@@ -203,10 +207,16 @@
 			MessageContext msgCtx = null;
 			try {
 				msgCtx = createMessageContext(packet);
-				if(msgCtx.isProcessingFault() && msgCtx.isServerSide()){
-					AxisEngine.sendFault(msgCtx);
+				Object obj = msgCtx.getProperty(XMPPConstants.CONTAINS_SOAP_ENVELOPE);
+				if(obj != null && ((Boolean)obj).booleanValue()){
+					if(msgCtx.isProcessingFault() && msgCtx.isServerSide()){
+						AxisEngine.sendFault(msgCtx);
+					}else{
+						AxisEngine.receive(msgCtx);
+					}					
 				}else{
-					AxisEngine.receive(msgCtx);	
+					//Send a text reply message to chat client
+					XMPPSender.processChatMessage(msgCtx);
 				}
 			} catch (AxisFault e) {
 				log.error("Error occurred while sending message"+e);