You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by as...@apache.org on 2006/11/27 18:40:51 UTC
svn commit: r479700 - in
/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms:
JMSConstants.java JMSUtils.java
Author: asankha
Date: Mon Nov 27 09:40:49 2006
New Revision: 479700
URL: http://svn.apache.org/viewvc?view=rev&rev=479700
Log:
Fix for AXIS2-1752
Modified:
webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSConstants.java
webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSUtils.java
Modified: webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSConstants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSConstants.java?view=diff&rev=479700&r1=479699&r2=479700
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSConstants.java (original)
+++ webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSConstants.java Mon Nov 27 09:40:49 2006
@@ -47,6 +47,15 @@
public static final String CONFAC_PARAM = "transport.jms.ConnectionFactory";
/** The Parameter name indicating the JMS connection factory JNDI name */
public static final String CONFAC_JNDI_NAME_PARAM = "transport.jms.ConnectionFactoryJNDIName";
+ /** The Parameter name indicating the operation to dispatch non SOAP/XML messages */
+ public static final String OPERATION_PARAM = "transport.jms.Operation";
+ /** The Parameter name indicating the wrapper element for non SOAP/XML messages */
+ public static final String WRAPPER_PARAM = "transport.jms.Wrapper";
+ /** The default operation name to be used for non SOAP/XML messages
+ if the operation cannot be determined*/
+ public static final QName DEFAULT_OPERATION = new QName("urn:mediate");
+ /** The name of the element which wraps non SOAP/XML content into a SOAP envelope */
+ public static final QName DEFAULT_WRAPPER = new QName(Constants.AXIS2_NAMESPACE_URI, "jmsMessage");
/** The local (Axis2) JMS connection factory name of the default connection
* factory to be used, if a service does not explicitly state the connection
* factory it should be using by a Parameter named JMSConstants.CONFAC_PARAM
Modified: webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSUtils.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSUtils.java?view=diff&rev=479700&r1=479699&r2=479700
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSUtils.java (original)
+++ webservices/axis2/branches/java/1_1/modules/kernel/src/org/apache/axis2/transport/jms/JMSUtils.java Mon Nov 27 09:40:49 2006
@@ -15,13 +15,15 @@
*/
package org.apache.axis2.transport.jms;
-import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axiom.om.*;
import org.apache.axiom.om.impl.builder.StAXBuilder;
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.apache.axiom.om.impl.llom.OMTextImpl;
import org.apache.axiom.om.util.StAXUtils;
-import org.apache.axiom.soap.SOAP11Constants;
-import org.apache.axiom.soap.SOAP12Constants;
-import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.*;
import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
+import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
+import org.apache.axiom.attachments.ByteArrayDataSource;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.util.JavaUtils;
@@ -29,6 +31,7 @@
import org.apache.axis2.context.OperationContext;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.Parameter;
+import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.transport.TransportUtils;
import org.apache.axis2.transport.http.HTTPConstants;
@@ -41,10 +44,10 @@
import javax.jms.TextMessage;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.namespace.QName;
+import javax.activation.DataHandler;
+import java.io.*;
import java.util.Hashtable;
import java.util.List;
import java.util.StringTokenizer;
@@ -343,18 +346,81 @@
}
if (builder == null) {
- XMLStreamReader xmlreader = StAXUtils.createXMLStreamReader(in,
- MessageContext.DEFAULT_CHAR_SET_ENCODING);
+ SOAPFactory soapFactory = new SOAP11Factory();
+ try {
+ XMLStreamReader xmlreader = StAXUtils.createXMLStreamReader
+ (in, MessageContext.DEFAULT_CHAR_SET_ENCODING);
+
+ // Set the encoding scheme in the message context
+ msgContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING,
+ MessageContext.DEFAULT_CHAR_SET_ENCODING);
+ builder = new StAXOMBuilder(xmlreader);
+ builder.setOMBuilderFactory(soapFactory);
+
+ String ns = builder.getDocumentElement().getNamespace().getNamespaceURI();
+ if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(ns)) {
+ envelope = getEnvelope(in, SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+ } else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(ns)) {
+ envelope = getEnvelope(in, SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+ } else {
+ // this is POX ... mark MC as REST
+ msgContext.setDoingREST(true);
+ envelope = soapFactory.getDefaultEnvelope();
+ envelope.getBody().addChild(builder.getDocumentElement());
+ }
+ } catch (Exception e) {
+ log.debug("Non SOAP/XML JMS message received");
- // Set the encoding scheme in the message context
- msgContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING,
- MessageContext.DEFAULT_CHAR_SET_ENCODING);
- builder = new StAXSOAPModelBuilder(
- xmlreader, SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
- envelope = (SOAPEnvelope) builder.getDocumentElement();
+ Parameter operationParam = msgContext.getAxisService().
+ getParameter(JMSConstants.OPERATION_PARAM);
+ QName operationQName = (operationParam != null ?
+ getQName(operationParam.getValue()) : JMSConstants.DEFAULT_OPERATION);
+
+ AxisOperation operation = msgContext.getAxisService().getOperation(operationQName);
+ if (operation != null) {
+ msgContext.setAxisOperation(operation);
+ } else {
+ handleException("Cannot find operation : " + operationQName + " on the service "
+ + msgContext.getAxisService());
+ }
+
+
+ Parameter wrapperParam = msgContext.getAxisService().
+ getParameter(JMSConstants.WRAPPER_PARAM);
+ QName wrapperQName = (wrapperParam != null ?
+ getQName(wrapperParam.getValue()) : JMSConstants.DEFAULT_WRAPPER);
+
+ OMElement wrapper = soapFactory.createOMElement(wrapperQName, null);
+
+ try {
+ if (message instanceof TextMessage) {
+ OMTextImpl textData = (OMTextImpl) soapFactory.createOMText(
+ ((TextMessage) message).getText());
+ wrapper.addChild(textData);
+ } else if (message instanceof BytesMessage) {
+ BytesMessage bm = (BytesMessage) message;
+ byte[] msgBytes = new byte[(int) bm.getBodyLength()];
+ bm.reset();
+ bm.readBytes(msgBytes);
+ DataHandler dataHandler = new DataHandler(
+ new ByteArrayDataSource(msgBytes));
+ OMText textData = soapFactory.createOMText(dataHandler, true);
+ wrapper.addChild(textData);
+ msgContext.setDoingMTOM(true);
+ } else {
+ handleException("Unsupported JMS Message format : " + message.getJMSType());
+ }
+ envelope = soapFactory.getDefaultEnvelope();
+ envelope.getBody().addChild(wrapper);
+
+ } catch (JMSException j) {
+ handleException("Error wrapping JMS message into a SOAP envelope ", j);
+ }
+ }
}
- String charEncOfMessage = builder.getDocument().getCharsetEncoding();
+ String charEncOfMessage = builder == null ? null :
+ builder.getDocument() == null ? null : builder.getDocument().getCharsetEncoding();
String charEncOfTransport = ((String) msgContext.getProperty(
Constants.Configuration.CHARACTER_SET_ENCODING));
@@ -378,6 +444,35 @@
"SOAP message");
}
return envelope;
+ }
+
+ private static SOAPEnvelope getEnvelope(InputStream in, String namespace) throws XMLStreamException {
+
+ try {
+ in.reset();
+ } catch (IOException e) {
+ throw new XMLStreamException("Error resetting message input stream", e);
+ }
+ XMLStreamReader xmlreader = StAXUtils.createXMLStreamReader
+ (in, MessageContext.DEFAULT_CHAR_SET_ENCODING);
+ StAXBuilder builder = new StAXSOAPModelBuilder(xmlreader, namespace);
+ return (SOAPEnvelope) builder.getDocumentElement();
+ }
+
+ private static QName getQName(Object obj) {
+ String value;
+ if (obj instanceof QName) {
+ return (QName) obj;
+ } else {
+ value = obj.toString();
+ }
+ int open = value.indexOf('{');
+ int close = value.indexOf('}');
+ if (close > open && open > -1 && value.length() > close) {
+ return new QName(value.substring(open+1, close-open), value.substring(close+1));
+ } else {
+ return new QName(value);
+ }
}
private static void handleException(String s) {
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org