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