On Mon, Oct 27, 2008 at 08:56, Senaka Fernando <[EMAIL PROTECTED]> wrote:
> Hi Andreas,
>
> Thanks. However, If the BaseUtils#setSOAPEnvelope is only used by the AMQP
> Transport in Synapse, that is better off. This was another question that I
> wanted to ask. Certain features of BaseUtils are only used by certain
> Transports and not all. Thus, is it really some feature that must remain at
> the base level? This is the point, certain aspects of certain transports
> will never really require such functionality.

In the beginning, BaseUtils#setSOAPEnvelope was used by several
transports (mail, JMS, AMQP and VFS I think). I changed the mail and
VFS transports already some time ago. Now that the JMS transport no
longer relies on this method, I will move this code to the AMQP
transport and clean up BaseUtils.

> Also, since you are familiar with Synapse, does the Synapse JMS "samples"
> work with the new Transport? Has it been tested? I couldn't run some of them
> (may be due to some of the dependant jars being disorganized on my box).

Good point. I need to check that. Which are the samples that didn't
work for you?

> Thanks,
> Senaka
>
> On Mon, Oct 27, 2008 at 4:59 AM, Andreas Veithen
> <[EMAIL PROTECTED]>wrote:
>
>> Senaka,
>>
>> I've just committed the implementation of SYNAPSE-304 for the JMS
>> transport (revision 708060). What you will have to do is to add your
>> MapMessage handling code to JMSUtils.setSOAPEnvelope. Before merging
>> these changes with your branch, note however that since the old
>> BaseUtils#setSOAPEnvelope method is no longer used by any transport
>> (except the AMQP transport in Synapse), there will be some (quite
>> massive) code cleanup.
>>
>> Andreas
>>
>> On Sun, Oct 26, 2008 at 20:11, Senaka Fernando <[EMAIL PROTECTED]>
>> wrote:
>> > Hi Andreas,
>> >
>> > +1 from me.
>> >
>> > I have now got a working version of the MapMessage support, and am
>> looking
>> > forward to replace the hacks I've done to get the thing to work with some
>> > solid code. I agree with what you mean in SYNAPSE-304. I indeed had to
>> > introduce another method, getMessageMapPayload which will attempt to
>> > retrieve a Map.
>> >
>> > It would be great if you could consider the requirements [1] would need
>> as
>> > well when fixing SYNAPSE-304, or else I'll still not be able to make the
>> > maximum out of the OMSourcedElement unless I do some further
>> modifications.
>> >
>> > [1] webservices/commons/trunk/scratch/senaka/sci-flex/transport
>> >
>> > Thanks,
>> > Senaka
>> >
>> > On Mon, Oct 27, 2008 at 12:05 AM, Andreas Veithen <
>> [EMAIL PROTECTED]
>> >> wrote:
>> >
>> >> I think that the introduction of MapMessageInputStream makes you loose
>> >> the benefit of representing the MapMessage using an OMSourcedElement.
>> >> Indeed the code will serialize the XML representation of the
>> >> MapMessage into a byte array only the parse it into an AXIOM tree
>> >> again immediately afterwards. I guess that you have chosen this
>> >> approach because the JMS transport is centered around input streams.
>> >> As discussed earlier this should change in the future. Maybe this is
>> >> the right moment to solve SYNAPSE-304 for the JMS transport so that
>> >> you have a more solid basis to implement MapMessage support. WDYT?
>> >>
>> >> Andreas
>> >>
>> >> On Mon, Oct 20, 2008 at 21:46,  <[EMAIL PROTECTED]> wrote:
>> >> > Author: senaka
>> >> > Date: Mon Oct 20 13:46:11 2008
>> >> > New Revision: 706401
>> >> >
>> >> > URL: http://svn.apache.org/viewvc?rev=706401&view=rev
>> >> > Log:
>> >> > Adding JMS MapMessage support.
>> >> >
>> >> > Added:
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/MapMessageInputStream.java
>> >> > Modified:
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/pom.xml
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseUtils.java
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/pom.xml
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
>> >> >
>> >>
>>  
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/pom.xml
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/pom.xml?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/pom.xml
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/pom.xml
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -92,6 +92,11 @@
>> >> >             <artifactId>axiom-dom</artifactId>
>> >> >             <version>${axiom.version}</version>
>> >> >         </dependency>
>> >> > +        <dependency>
>> >> > +            <groupId>org.apache.ws.commons.axiom</groupId>
>> >> > +            <artifactId>sciflex-axiom-patch</artifactId>
>> >> > +            <version>${sciflex-axiom-patch.version}</version>
>> >> > +        </dependency>
>> >> >         <!-- Axis2 -->
>> >> >         <dependency>
>> >> >             <groupId>org.apache.axis2</groupId>
>> >> > @@ -148,6 +153,7 @@
>> >> >         <axiom.version>SNAPSHOT</axiom.version>
>> >> >         <axis2.version>SNAPSHOT</axis2.version>
>> >> >         <commons.logging.version>1.1</commons.logging.version>
>> >> > +
>> >>  <sciflex-axiom-patch.version>0.9-SNAPSHOT</sciflex-axiom-patch.version>
>> >> >     </properties>
>> >> >
>> >> >  </project>
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseConstants.java
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -72,6 +72,12 @@
>> >> >     public static final QName DEFAULT_TEXT_WRAPPER =
>> >> >             new QName(AXIOMPAYLOADNS, "text");
>> >> >
>> >> > +    /**
>> >> > +     * The name of the element which wraps map content into a SOAP
>> >> envelope
>> >> > +     */
>> >> > +    public static final QName DEFAULT_MAP_WRAPPER =
>> >> > +            new QName(AXIOMPAYLOADNS, "map");
>> >> > +
>> >> >     //-------------------------- services.xml parameters
>> >> --------------------------------
>> >> >     /**
>> >> >      * The Parameter name indicating the operation to dispatch non
>> >> SOAP/XML messages
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseUtils.java
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseUtils.java?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseUtils.java
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/base/src/main/java/org/apache/axis2/transport/base/BaseUtils.java
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -22,6 +22,7 @@
>> >> >  import java.io.IOException;
>> >> >  import java.io.InputStream;
>> >> >  import java.util.List;
>> >> > +import java.util.Map;
>> >> >
>> >> >  import javax.activation.DataHandler;
>> >> >  import javax.mail.internet.ContentType;
>> >> > @@ -35,7 +36,9 @@
>> >> >  import org.apache.axiom.om.OMElement;
>> >> >  import org.apache.axiom.om.OMNamespace;
>> >> >  import org.apache.axiom.om.OMOutputFormat;
>> >> > +import org.apache.axiom.om.OMSourcedElement;
>> >> >  import org.apache.axiom.om.OMText;
>> >> > +import org.apache.axiom.om.ds.MapDataSource;
>> >> >  import org.apache.axiom.om.impl.builder.StAXBuilder;
>> >> >  import org.apache.axiom.om.impl.builder.StAXOMBuilder;
>> >> >  import org.apache.axiom.om.impl.llom.OMTextImpl;
>> >> > @@ -322,8 +325,19 @@
>> >> >                 msgContext.setDoingMTOM(true);
>> >> >
>> >> >             } else {
>> >> > -                handleException("Unable to read payload from message
>> of
>> >> type : "
>> >> > -                    + message.getClass().getName());
>> >> > +                Map msgMap = getMessageMapPayload(message);
>> >> > +                if (msgMap != null) {
>> >> > +                    if (wrapperQName == null) {
>> >> > +                        wrapperQName =
>> >> BaseConstants.DEFAULT_MAP_WRAPPER;
>> >> > +                    }
>> >> > +                    OMSourcedElement omData =
>> >> soapFactory.createOMElement(new MapDataSource(msgMap,
>> >> > +                        wrapperQName.getLocalPart(),
>> >> soapFactory.createOMNamespace(wrapperQName.getNamespaceURI(),
>> >> wrapperQName.getPrefix())),
>> >> > +                        wrapperQName.getLocalPart(),
>> >> soapFactory.createOMNamespace(wrapperQName.getNamespaceURI(),
>> >> wrapperQName.getPrefix()));
>> >> > +                    wrapper = (OMElement) omData;
>> >> > +                } else {
>> >> > +                    handleException("Unable to read payload from
>> message
>> >> of type : "
>> >> > +                        + message.getClass().getName());
>> >> > +                }
>> >> >             }
>> >> >         }
>> >> >
>> >> > @@ -366,6 +380,14 @@
>> >> >      */
>> >> >     public abstract byte[] getMessageBinaryPayload(Object message);
>> >> >
>> >> > +    /**
>> >> > +     * Get the message payload as a Map, if the message is a
>> non-SOAP,
>> >> non-XML, binary Map-based message
>> >> > +     *
>> >> > +     * @param message the message Object
>> >> > +     * @return the payload of the message as a Map
>> >> > +     */
>> >> > +    public abstract Map getMessageMapPayload(Object message);
>> >> > +
>> >> >     protected static void handleException(String s) {
>> >> >         log.error(s);
>> >> >         throw new BaseTransportException(s);
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/pom.xml
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/pom.xml?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/pom.xml
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/pom.xml
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -71,6 +71,12 @@
>> >> >             <artifactId>geronimo-jms_1.1_spec</artifactId>
>> >> >             <version>${jms-1.1-spec.version}</version>
>> >> >         </dependency>
>> >> > +
>> >> > +        <dependency>
>> >> > +            <groupId>org.apache.ws.commons.axiom</groupId>
>> >> > +            <artifactId>sciflex-axiom-patch</artifactId>
>> >> > +            <version>${sciflex-axiom-patch.version}</version>
>> >> > +        </dependency>
>> >> >     </dependencies>
>> >> >
>> >> >     <properties>
>> >> > @@ -78,6 +84,7 @@
>> >> >         <commons.logging.version>1.1</commons.logging.version>
>> >> >
>> >> <axis2-transport-base.version>SNAPSHOT</axis2-transport-base.version>
>> >> >         <jms-1.1-spec.version>1.1</jms-1.1-spec.version>
>> >> > +
>> >>  <sciflex-axiom-patch.version>0.9-SNAPSHOT</sciflex-axiom-patch.version>
>> >> >     </properties>
>> >> >
>> >> > -</project>
>> >> > \ No newline at end of file
>> >> > +</project>
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSConstants.java
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -93,6 +93,10 @@
>> >> >      */
>> >> >     public static final String JMS_BYTE_MESSAGE = "JMS_BYTE_MESSAGE";
>> >> >     /**
>> >> > +     * The message type indicating a MapMessage. See JMS_MESSAGE_TYPE
>> >> > +     */
>> >> > +    public static final String JMS_MAP_MESSAGE = "JMS_MAP_MESSAGE";
>> >> > +    /**
>> >> >      * The message type indicating a TextMessage. See JMS_MESSAGE_TYPE
>> >> >      */
>> >> >     public static final String JMS_TEXT_MESSAGE = "JMS_TEXT_MESSAGE";
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMessageReceiver.java
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -103,6 +103,8 @@
>> >> >         try {
>> >> >             if (message instanceof BytesMessage) {
>> >> >
>> >> metrics.incrementBytesReceived((JMSUtils.getBodyLength((BytesMessage)
>> >> message)));
>> >> > +            } else if (message instanceof MapMessage) {
>> >> > +
>> >>  metrics.incrementBytesReceived((JMSUtils.getBodyLength((MapMessage)
>> >> message)));
>> >> >             } else if (message instanceof TextMessage) {
>> >> >                 metrics.incrementBytesReceived(((TextMessage)
>> >> message).getText().getBytes().length);
>> >> >             } else {
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -16,9 +16,12 @@
>> >> >  package org.apache.axis2.transport.jms;
>> >> >
>> >> >  import org.apache.axiom.om.OMOutputFormat;
>> >> > +import org.apache.axiom.om.OMDataSourceExt;
>> >> >  import org.apache.axiom.om.OMElement;
>> >> > +import org.apache.axiom.om.OMSourcedElement;
>> >> >  import org.apache.axiom.om.OMText;
>> >> >  import org.apache.axiom.om.OMNode;
>> >> > +import org.apache.axiom.om.ds.MapDataSource;
>> >> >  import org.apache.axis2.AxisFault;
>> >> >  import org.apache.axis2.context.MessageContext;
>> >> >  import org.apache.axis2.context.ConfigurationContext;
>> >> > @@ -243,6 +246,8 @@
>> >> >                     try {
>> >> >                         if (message instanceof BytesMessage) {
>> >> >
>> >> metrics.incrementBytesSent(JMSUtils.getBodyLength((BytesMessage)
>> message));
>> >> > +                        } else if (message instanceof MapMessage) {
>> >> > +
>> >>  metrics.incrementBytesSent((JMSUtils.getBodyLength((MapMessage)
>> message)));
>> >> >                         } else if (message instanceof TextMessage) {
>> >> >                             metrics.incrementBytesSent((
>> >> >                                 (TextMessage)
>> >> message).getText().getBytes().length);
>> >> > @@ -337,6 +342,8 @@
>> >> >                 try {
>> >> >                     if (reply instanceof BytesMessage) {
>> >> >
>> >> metrics.incrementBytesReceived(JMSUtils.getBodyLength((BytesMessage)
>> >> reply));
>> >> > +                    } else if (reply instanceof MapMessage) {
>> >> > +
>> >>  metrics.incrementBytesReceived((JMSUtils.getBodyLength((MapMessage)
>> >> reply)));
>> >> >                     } else if (reply instanceof TextMessage) {
>> >> >                         metrics.incrementBytesReceived((
>> >> >                             (TextMessage)
>> >> reply).getText().getBytes().length);
>> >> > @@ -418,6 +425,26 @@
>> >> >                 message = session.createBytesMessage();
>> >> >                 BytesMessage bytesMsg = (BytesMessage) message;
>> >> >                 bytesMsg.writeBytes(baos.toByteArray());
>> >> > +            } else if (msgType != null &&
>> >> JMSConstants.JMS_MAP_MESSAGE.equals(msgType)) {
>> >> > +                message = session.createMapMessage();
>> >> > +                MapMessage mapMsg = (MapMessage) message;
>> >> > +                OMElement wrapper =
>> >> msgContext.getEnvelope().getBody().getFirstElement();
>> >> > +                if (wrapper != null && wrapper instanceof
>> >> OMSourcedElement) {
>> >> > +                    OMSourcedElement omNode = (OMSourcedElement)
>> >> wrapper;
>> >> > +                    Object ds = omNode.getDataSource();
>> >> > +                    if (ds != null && ds instanceof MapDataSource) {
>> >> > +                        OMDataSourceExt dse = (OMDataSourceExt)
>> >> omNode.getDataSource();
>> >> > +                        Map map = (Map) dse.getObject();
>> >> > +                        Iterator it = map.keySet().iterator();
>> >> > +                        while (it.hasNext()) {
>> >> > +                            Object key = it.next();
>> >> > +                            Object value = map.get(key);
>> >> > +                            if (key != null && value != null && key
>> >> instanceof String) {
>> >> > +                                mapMsg.setObject((String)key, value);
>> >> > +                            }
>> >> > +                        }
>> >> > +                    }
>> >> > +                }
>> >> >             } else {
>> >> >                 message = session.createTextMessage();  // default
>> >> >                 TextMessage txtMsg = (TextMessage) message;
>> >> > @@ -454,6 +481,27 @@
>> >> >             TextMessage txtMsg = (TextMessage) message;
>> >> >             txtMsg.setText(msgContext.getEnvelope().getBody().
>> >> >
>> >> getFirstChildWithName(BaseConstants.DEFAULT_TEXT_WRAPPER).getText());
>> >> > +        } else if
>> (JMSConstants.JMS_MAP_MESSAGE.equals(jmsPayloadType))
>> >> {
>> >> > +            message = session.createMapMessage();
>> >> > +            MapMessage mapMsg = (MapMessage) message;
>> >> > +            OMElement wrapper = msgContext.getEnvelope().getBody().
>> >> > +
>> >>  getFirstChildWithName(BaseConstants.DEFAULT_MAP_WRAPPER);
>> >> > +            if (wrapper != null && wrapper instanceof
>> OMSourcedElement)
>> >> {
>> >> > +                OMSourcedElement omNode = (OMSourcedElement) wrapper;
>> >> > +                Object ds = omNode.getDataSource();
>> >> > +                if (ds != null && ds instanceof MapDataSource) {
>> >> > +                    OMDataSourceExt dse = (OMDataSourceExt)
>> >> omNode.getDataSource();
>> >> > +                    Map map = (Map) dse.getObject();
>> >> > +                    Iterator it = map.keySet().iterator();
>> >> > +                    while (it.hasNext()) {
>> >> > +                        Object key = it.next();
>> >> > +                        Object value = map.get(key);
>> >> > +                        if (key != null && value != null && key
>> >> instanceof String) {
>> >> > +                            mapMsg.setObject((String)key, value);
>> >> > +                        }
>> >> > +                    }
>> >> > +                }
>> >> > +            }
>> >> >         }
>> >> >
>> >> >         // set the JMS correlation ID if specified
>> >> > @@ -483,7 +531,8 @@
>> >> >     /**
>> >> >      * Guess the message type to use for JMS looking at the message
>> >> contexts' envelope
>> >> >      * @param msgContext the message context
>> >> > -     * @return JMSConstants.JMS_BYTE_MESSAGE or
>> >> JMSConstants.JMS_TEXT_MESSAGE or null
>> >> > +     * @return JMSConstants.JMS_BYTE_MESSAGE,
>> >> JMSConstants.JMS_TEXT_MESSAGE,
>> >> > +     * JMSConstants.JMS_MAP_MESSAGE or null
>> >> >      */
>> >> >     private String guessMessageType(MessageContext msgContext) {
>> >> >         OMElement firstChild =
>> >> msgContext.getEnvelope().getBody().getFirstElement();
>> >> > @@ -492,6 +541,8 @@
>> >> >                 return JMSConstants.JMS_BYTE_MESSAGE;
>> >> >             } else if
>> >> (BaseConstants.DEFAULT_TEXT_WRAPPER.equals(firstChild.getQName())) {
>> >> >                 return JMSConstants.JMS_TEXT_MESSAGE;
>> >> > +            } else if
>> >> (BaseConstants.DEFAULT_MAP_WRAPPER.equals(firstChild.getQName())) {
>> >> > +                return JMSConstants.JMS_MAP_MESSAGE;
>> >> >             }
>> >> >         }
>> >> >         return null;
>> >> >
>> >> > Modified:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java?rev=706401&r1=706400&r2=706401&view=diff
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
>> >> (original)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSUtils.java
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -330,6 +330,16 @@
>> >> >
>> >> txtMsg.getText().getBytes(MessageContext.DEFAULT_CHAR_SET_ENCODING));
>> >> >                 }
>> >> >
>> >> > +            } else if (message instanceof MapMessage) {
>> >> > +                MapMessage mapMsg = (MapMessage) message;
>> >> > +                String contentType = getProperty(mapMsg,
>> >> BaseConstants.CONTENT_TYPE);
>> >> > +
>> >> > +                if (contentType != null) {
>> >> > +                    return new MapMessageInputStream(mapMsg,
>> >> BuilderUtil.getCharSetEncoding(contentType));
>> >> > +                } else {
>> >> > +                    return new MapMessageInputStream(mapMsg,
>> >> MessageContext.DEFAULT_CHAR_SET_ENCODING);
>> >> > +                }
>> >> > +
>> >> >             } else {
>> >> >                 handleException("Unsupported JMS message type : " +
>> >> message.getClass().getName());
>> >> >             }
>> >> > @@ -722,6 +732,31 @@
>> >> >         return null;
>> >> >     }
>> >> >
>> >> > +    public Map getMessageMapPayload(Object message) {
>> >> > +
>> >> > +        if (message instanceof MapMessage) {
>> >> > +            MapMessage mapMessage = (MapMessage) message;
>> >> > +
>> >> > +            try {
>> >> > +                Map outMap = new TreeMap();
>> >> > +                for (Enumeration e = mapMessage.getMapNames() ;
>> >> e.hasMoreElements() ;) {
>> >> > +                    String key = (String) e.nextElement();
>> >> > +                    Object value = mapMessage.getObject(key);
>> >> > +                    if (value != null) {
>> >> > +                        outMap.put(key, value);
>> >> > +                    } else {
>> >> > +                        log.warn("Ignoring key " + key + " that did
>> not
>> >> return any value");
>> >> > +                    }
>> >> > +                }
>> >> > +                return outMap;
>> >> > +
>> >> > +            } catch (JMSException e) {
>> >> > +                handleException("Error reading JMS map message
>> payload",
>> >> e);
>> >> > +            }
>> >> > +        }
>> >> > +        return null;
>> >> > +    }
>> >> > +
>> >> >     // ----------- JMS 1.0.2b compatibility methods -------------
>> >> >     public static Connection createConnection(ConnectionFactory
>> >> conFactory, String user,
>> >> >         String pass, String destinationType) throws JMSException {
>> >> > @@ -830,6 +865,42 @@
>> >> >         } catch (JMSException ignore) {}
>> >> >         return length;
>> >> >     }
>> >> > +
>> >> > +    public static long getBodyLength(MapMessage mMsg) {
>> >> > +        long length = 0;
>> >> > +        MapMessage mapMessage = (MapMessage) mMsg;
>> >> > +            try {
>> >> > +                for (Enumeration e = mMsg.getMapNames() ;
>> >> e.hasMoreElements() ;) {
>> >> > +                    String key = (String) e.nextElement();
>> >> > +                    Object value = mMsg.getObject(key);
>> >> > +                    if (value != null) {
>> >> > +                        if (value instanceof Boolean || value
>> instanceof
>> >> Byte) {
>> >> > +                            length += 1;
>> >> > +                        } else if (value instanceof Character ||
>> value
>> >> instanceof Short) {
>> >> > +                            length += 2;
>> >> > +                        } else if (value instanceof Integer || value
>> >> instanceof Float) {
>> >> > +                            length += 4;
>> >> > +                        } else if (value instanceof Long || value
>> >> instanceof Double) {
>> >> > +                            length += 8;
>> >> > +                        } else if (value instanceof byte[]) {
>> >> > +                            length += ((byte[])value).length;
>> >> > +                        } else if (value instanceof String) {
>> >> > +                            length += ((String)
>> >> value).getBytes().length;
>> >> > +                        } else {
>> >> > +                            log.error("Unable to determine message
>> size.
>> >> Invalid Object Type : " + value.getClass().getName());
>> >> > +                            return 0;
>> >> > +                        }
>> >> > +                    } else {
>> >> > +                        log.warn("Ignoring key " + key + " that did
>> not
>> >> return any value");
>> >> > +                    }
>> >> > +                    length += key.getBytes().length;
>> >> > +                }
>> >> > +
>> >> > +            } catch (JMSException e) {
>> >> > +                handleException("Error reading JMS map message
>> payload",
>> >> e);
>> >> > +            }
>> >> > +            return length;
>> >> > +    }
>> >> >
>> >> >     public static <T> T lookup(Context context, Class<T> clazz, String
>> >> name)
>> >> >         throws NamingException {
>> >> >
>> >> > Added:
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/MapMessageInputStream.java
>> >> > URL:
>> >>
>> http://svn.apache.org/viewvc/webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/MapMessageInputStream.java?rev=706401&view=auto
>> >> >
>> >>
>> ==============================================================================
>> >> > ---
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/MapMessageInputStream.java
>> >> (added)
>> >> > +++
>> >>
>> webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/MapMessageInputStream.java
>> >> Mon Oct 20 13:46:11 2008
>> >> > @@ -0,0 +1,101 @@
>> >> > +/*
>> >> > +* Copyright 2004,2005 The Apache Software Foundation.
>> >> > +*
>> >> > +* Licensed under the Apache License, Version 2.0 (the "License");
>> >> > +* you may not use this file except in compliance with the License.
>> >> > +* You may obtain a copy of the License at
>> >> > +*
>> >> > +*      http://www.apache.org/licenses/LICENSE-2.0
>> >> > +*
>> >> > +* Unless required by applicable law or agreed to in writing, software
>> >> > +* distributed under the License is distributed on an "AS IS" BASIS,
>> >> > +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> >> implied.
>> >> > +* See the License for the specific language governing permissions and
>> >> > +* limitations under the License.
>> >> > +*/
>> >> > +package org.apache.axis2.transport.jms;
>> >> > +
>> >> > +import org.apache.axiom.om.OMAbstractFactory;
>> >> > +import org.apache.axiom.om.OMFactory;
>> >> > +import org.apache.axiom.om.ds.MapDataSource;
>> >> > +import org.apache.axis2.transport.base.BaseConstants;
>> >> > +import org.apache.commons.logging.Log;
>> >> > +import org.apache.commons.logging.LogFactory;
>> >> > +
>> >> > +import java.io.ByteArrayInputStream;
>> >> > +import java.io.InputStream;
>> >> > +import java.io.IOException;
>> >> > +import java.io.UnsupportedEncodingException;
>> >> > +import java.util.Map;
>> >> > +
>> >> > +import javax.jms.MapMessage;
>> >> > +import javax.jms.JMSException;
>> >> > +import javax.jms.MessageEOFException;
>> >> > +import javax.xml.namespace.QName;
>> >> > +
>> >> > +/**
>> >> > + * Input stream that reads data from a JMS [EMAIL PROTECTED] 
>> >> > MapMessage}.
>> >> > + */
>> >> > +public class MapMessageInputStream extends InputStream {
>> >> > +
>> >> > +    private static final Log log =
>> >> LogFactory.getLog(MapMessageInputStream.class);
>> >> > +    private MapMessage message;
>> >> > +    private String encoding;
>> >> > +    private ByteArrayInputStream byteStream = null;
>> >> > +
>> >> > +    public MapMessageInputStream(MapMessage message, String encoding)
>> {
>> >> > +        this.message = message;
>> >> > +        this.encoding = encoding;
>> >> > +    }
>> >> > +
>> >> > +    private ByteArrayInputStream getByteStream() {
>> >> > +        if (byteStream != null) {
>> >> > +            return byteStream;
>> >> > +        } else {
>> >> > +            JMSUtils utils = new JMSUtils();
>> >> > +            Map payloadMap = utils.getMessageMapPayload(message);
>> >> > +            if (payloadMap != null) {
>> >> > +                QName wrapperQName =
>> BaseConstants.DEFAULT_MAP_WRAPPER;
>> >> > +                OMFactory ombuilderFactory =
>> >> OMAbstractFactory.getOMFactory();
>> >> > +                // It was assumed that the creation of a
>> MapDataSource
>> >> in here will
>> >> > +                // always be based on the default wrapper QName.
>> >> > +                MapDataSource mds = new MapDataSource(payloadMap,
>> >> wrapperQName.getLocalPart(),
>> >> > +
>> >>  ombuilderFactory.createOMNamespace(wrapperQName.getNamespaceURI(),
>> >> wrapperQName.getPrefix()));
>> >> > +                try {
>> >> > +                    byteStream = new
>> >> ByteArrayInputStream(mds.getXMLBytes(encoding));
>> >> > +                } catch (UnsupportedEncodingException e) {
>> >> > +                    log.error("Unsupported Encoding");
>> >> > +                    byteStream = null;
>> >> > +                }
>> >> > +            }
>> >> > +            return byteStream;
>> >> > +        }
>> >> > +    }
>> >> > +
>> >> > +    @Override
>> >> > +    public int read() {
>> >> > +        ByteArrayInputStream readStream = getByteStream();
>> >> > +        if (readStream == null) {
>> >> > +            return -1;
>> >> > +        }
>> >> > +        return readStream.read();
>> >> > +    }
>> >> > +
>> >> > +    @Override
>> >> > +    public int read(byte[] b, int off, int len) {
>> >> > +        ByteArrayInputStream readStream = getByteStream();
>> >> > +        if (readStream == null) {
>> >> > +            return -1;
>> >> > +        }
>> >> > +        return readStream.read(b, off, len);
>> >> > +    }
>> >> > +
>> >> > +    @Override
>> >> > +    public int read(byte[] b) throws IOException {
>> >> > +        ByteArrayInputStream readStream = getByteStream();
>> >> > +        if (readStream == null) {
>> >> > +            return -1;
>> >> > +        }
>> >> > +        return readStream.read(b);
>> >> > +    }
>> >> > +}
>> >> >
>> >> >
>> >> >
>> >>
>> >
>>
>

Reply via email to