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);