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 [EMAIL PROTECTED] 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);


Reply via email to