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