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.
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). 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); > >> > + } > >> > +} > >> > > >> > > >> > > >> > > >
