Author: veithen
Date: Sun Oct 26 16:22:44 2008
New Revision: 708060

URL: http://svn.apache.org/viewvc?rev=708060&view=rev
Log:
SYNAPSE-304: Modified the JMS transport to use message builders instead of 
BaseUtils#setSOAPEnvelope.

Modified:
    
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/TextMessageBuilderAdapter.java
    
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
    
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
    
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
    
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
    
webservices/commons/trunk/modules/transport/modules/tests/src/test/java/org/apache/axis2/transport/jms/JMSTransportTest.java
    webservices/commons/trunk/modules/transport/src/site/xdoc/jms.xml

Modified: 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/TextMessageBuilderAdapter.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/TextMessageBuilderAdapter.java?rev=708060&r1=708059&r2=708060&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/TextMessageBuilderAdapter.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/base/src/main/java/org/apache/axis2/format/TextMessageBuilderAdapter.java
 Sun Oct 26 16:22:44 2008
@@ -23,8 +23,12 @@
 import java.io.Reader;
 import java.io.StringReader;
 
+import javax.mail.internet.ContentType;
+import javax.mail.internet.ParseException;
+
 import org.apache.axiom.om.OMElement;
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
 import org.apache.axis2.builder.Builder;
 import org.apache.axis2.context.MessageContext;
 
@@ -51,10 +55,19 @@
 
     public OMElement processDocument(Reader reader, String contentType,
                                      MessageContext messageContext) throws 
AxisFault {
-        // TODO: check that using the default charset encoding and leaving the 
content type unaltered is a valid strategy
-        return processDocument(
-                new ReaderInputStream(reader, 
MessageContext.DEFAULT_CHAR_SET_ENCODING),
-                contentType, messageContext);
+        String charset;
+        try {
+            ContentType ct = new ContentType(contentType);
+            charset = ct.getParameter("charset");
+        } catch (ParseException ex) {
+            charset = null;
+        }
+        if (charset == null) {
+            charset = MessageContext.DEFAULT_CHAR_SET_ENCODING;
+        }
+        
messageContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, 
charset);        
+        return processDocument(new ReaderInputStream(reader, charset), 
contentType,
+                messageContext);
     }
 
     public OMElement processDocument(String content, String contentType,

Modified: 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java?rev=708060&r1=708059&r2=708060&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
 Sun Oct 26 16:22:44 2008
@@ -81,7 +81,10 @@
      * The Parameter name indicating the JMS connection factory JNDI name
      */
     public static final String CONFAC_JNDI_NAME_PARAM = 
"transport.jms.ConnectionFactoryJNDIName";
-    
+    /**
+     * The parameter indicating the expected content type for messages 
received by the service.
+     */
+    public static final String CONTENT_TYPE_PARAM = 
"transport.jms.contentType";
 
     //------------ message context / transport header properties and client 
options ------------
     /**

Modified: 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java?rev=708060&r1=708059&r2=708060&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
 Sun Oct 26 16:22:44 2008
@@ -15,7 +15,6 @@
 */
 package org.apache.axis2.transport.jms;
 
-import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.transport.base.threads.WorkerPool;
 import org.apache.axis2.transport.base.BaseUtils;
@@ -203,11 +202,16 @@
                     }
                 }
 
-                String contentType =
-                    JMSUtils.getInstace().getProperty(message, 
BaseConstants.CONTENT_TYPE);
+                String contentType = null;
+                if (service != null) {
+                    contentType = 
(String)service.getParameterValue(JMSConstants.CONTENT_TYPE_PARAM);
+                }
+                if (contentType == null) {
+                    contentType
+                        = JMSUtils.getInstace().getProperty(message, 
BaseConstants.CONTENT_TYPE);
+                }
                 
-                // set the message payload to the message context
-                JMSUtils.getInstace().setSOAPEnvelope(message, msgContext, 
contentType);
+                JMSUtils.setSOAPEnvelope(message, msgContext, contentType);
 
                 jmsListener.handleIncomingMessage(
                     msgContext,

Modified: 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java?rev=708060&r1=708059&r2=708060&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
 Sun Oct 26 16:22:44 2008
@@ -520,7 +520,11 @@
 
         String contentType = JMSUtils.getInstace().getProperty(message, 
BaseConstants.CONTENT_TYPE);
 
-        JMSUtils.getInstace().setSOAPEnvelope(message, responseMsgCtx, 
contentType);
+        try {
+            JMSUtils.setSOAPEnvelope(message, responseMsgCtx, contentType);
+        } catch (JMSException ex) {
+            throw AxisFault.makeFault(ex);
+        }
 //        responseMsgCtx.setServerSide(true);
 
         handleIncomingMessage(

Modified: 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java?rev=708060&r1=708059&r2=708060&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
 Sun Oct 26 16:22:44 2008
@@ -16,22 +16,34 @@
 package org.apache.axis2.transport.jms;
 
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.builder.Builder;
 import org.apache.axis2.builder.BuilderUtil;
+import org.apache.axis2.builder.SOAPBuilder;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.description.ParameterIncludeImpl;
+import org.apache.axis2.format.TextMessageBuilder;
+import org.apache.axis2.format.TextMessageBuilderAdapter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.axis2.transport.TransportUtils;
 import org.apache.axis2.transport.base.BaseConstants;
 import org.apache.axis2.transport.base.BaseUtils;
 
 import javax.jms.*;
 import javax.jms.Queue;
+import javax.mail.internet.ContentType;
+import javax.mail.internet.ParseException;
 import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.Reference;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.stream.XMLStreamException;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -296,6 +308,64 @@
         }
     }
 
+    public static void setSOAPEnvelope(Message message, MessageContext 
msgContext, String contentType) throws AxisFault, JMSException {
+        if (message instanceof BytesMessage) {
+            if (contentType == null) {
+                log.debug("No content type specified; assuming 
application/octet-stream.");
+                contentType = "application/octet-stream";
+            } else {
+                // Extract the charset encoding from the content type and
+                // set the CHARACTER_SET_ENCODING property as e.g. SOAPBuilder 
relies on this.
+                String charSetEnc = null;
+                try {
+                    if (contentType != null) {
+                        charSetEnc = new 
ContentType(contentType).getParameter("charset");
+                    }
+                } catch (ParseException ex) {
+                    // ignore
+                }
+                
msgContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, 
charSetEnc);
+            }
+            
+            SOAPEnvelope envelope;
+            try {
+                envelope = TransportUtils.createSOAPMessage(msgContext,
+                        new BytesMessageInputStream((BytesMessage)message), 
contentType);
+            } catch (XMLStreamException ex) {
+                handleException("Error parsing XML", ex);
+                return; // Make compiler happy
+            }
+            msgContext.setEnvelope(envelope);
+        } else if (message instanceof TextMessage) {
+            String type;
+            if (contentType == null) {
+                log.debug("No content type specified; assuming text/plain.");
+                type = contentType = "text/plain";
+            } else {
+                int index = contentType.indexOf(';');
+                if (index > 0) {
+                    type = contentType.substring(0, index);
+                } else {
+                    type = contentType;
+                }
+            }
+            Builder builder = BuilderUtil.getBuilderFromSelector(type, 
msgContext);
+            if (builder == null) {
+                builder = new SOAPBuilder();
+            }
+            TextMessageBuilder textMessageBuilder;
+            if (builder instanceof TextMessageBuilder) {
+                textMessageBuilder = (TextMessageBuilder)builder;
+            } else {
+                textMessageBuilder = new TextMessageBuilderAdapter(builder);
+            }
+            String content = ((TextMessage)message).getText();
+            OMElement documentElement
+                    = textMessageBuilder.processDocument(content, contentType, 
msgContext);
+            
msgContext.setEnvelope(TransportUtils.createSOAPEnvelope(documentElement));
+        }
+    }
+
     /**
      * Get an InputStream to the JMS message payload
      *

Modified: 
webservices/commons/trunk/modules/transport/modules/tests/src/test/java/org/apache/axis2/transport/jms/JMSTransportTest.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/tests/src/test/java/org/apache/axis2/transport/jms/JMSTransportTest.java?rev=708060&r1=708059&r2=708060&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/tests/src/test/java/org/apache/axis2/transport/jms/JMSTransportTest.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/tests/src/test/java/org/apache/axis2/transport/jms/JMSTransportTest.java
 Sun Oct 26 16:22:44 2008
@@ -48,8 +48,6 @@
                                     
"(&(test=AsyncXML)(messageType=SOAP11)(data=ASCII))" +
                                     
"(&(test=EchoXML)(messageType=POX)(data=ASCII))))");
         
-        // SYNAPSE-304:
-        
suite.addExclude("(&(test=AsyncTextPlain)(client=jms)(jmsType=bytes))");
         // SYNAPSE-436:
         
suite.addExclude("(&(test=EchoXML)(replyDestType=topic)(endpoint=axis))");
         

Modified: webservices/commons/trunk/modules/transport/src/site/xdoc/jms.xml
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/src/site/xdoc/jms.xml?rev=708060&r1=708059&r2=708060&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/src/site/xdoc/jms.xml (original)
+++ webservices/commons/trunk/modules/transport/src/site/xdoc/jms.xml Sun Oct 
26 16:22:44 2008
@@ -52,72 +52,44 @@
         <section name="Service configuration">
             <table class="bodyTable">
                 <tr>
-                  <th>
-                    Parameter
-                  </th>
-                  <th>
-                    Require
-                  </th>
-                  <th>
-                    Description
-                  </th>
-                </tr>
-                <tr>
-                  <td>
-                    transport.jms.ConnectionFactory
-                  </td>
-                  <td>
-                    Optional
-                  </td>
-                  <td>
-                    The JMS connection factory definition (from axis2.xml) to 
be used to
-                    listen for messages for this service
-                  </td>
-                </tr>
-                <tr>
-                  <td>
-                    transport.jms.Destination
-                  </td>
-                  <td>
-                    Optional
-                  </td>
-                  <td>
-                    The JMS destination name (Defaults to a Queue with the 
service name)
-                  </td>
-                </tr>
-                <tr>
-                  <td>
-                    transport.jms.DestinationType
-                  </td>
-                  <td>
-                    Optional
-                  </td>
-                  <td>
-                    The JMS destination type. Accept values 'queue' or 'topic' 
(default:
-                    queue)
-                  </td>
-                </tr>
-                <tr>
-                  <td>
-                    transport.jms.ReplyDestination
-                  </td>
-                  <td>
-                    Optional
-                  </td>
-                  <td>
-                    The destination where a reply will be posted
-                  </td>
-                </tr>
-                <tr>
-                  <td>
-                    transport.jms.Wrapper
-                  </td>
-                  <td>
-                    Optional
-                  </td>
-                  <td>
-                    The wrapper element for the JMS message
-                  </td>
+                    <th>Parameter</th>
+                    <th>Require</th>
+                    <th>Description</th>
+                </tr>
+                <tr>
+                    <td>transport.jms.ConnectionFactory</td>
+                    <td>Optional</td>
+                    <td>The JMS connection factory definition (from axis2.xml) 
to be used to
+                    listen for messages for this service.</td>
+                </tr>
+                <tr>
+                    <td>transport.jms.Destination</td>
+                    <td>Optional</td>
+                    <td>The JMS destination name (Defaults to a Queue with the 
service name).</td>
+                </tr>
+                <tr>
+                    <td>transport.jms.DestinationType</td>
+                    <td>Optional</td>
+                    <td>The JMS destination type. Accept values 'queue' or 
'topic' (default:
+                    queue).</td>
+                </tr>
+                <tr>
+                    <td>transport.jms.ReplyDestination</td>
+                    <td>Optional</td>
+                    <td>The destination where a reply will be posted.</td>
+                </tr>
+                <tr>
+                    <td>transport.jms.contentType</td>
+                    <td>Optional</td>
+                    <td>The expected content type of the received messages. 
This parameter is
+                    only useful if the messages don't have a Content-Type 
property. If this parameter
+                    is not specified and the messages don't have a 
Content-Type, they will be processed
+                    as application/octet-stream or text/plain, depending on 
the JMS message type.</td>
+                </tr>
+                <tr>
+                    <td>transport.jms.Wrapper</td>
+                    <td>Optional</td>
+                    <td>The wrapper element for the JMS message.</td>
                 </tr>
             </table>
             <p>Sample services.xml:</p>


Reply via email to