Author: senaka
Date: Fri Nov 28 12:52:29 2008
New Revision: 721559

URL: http://svn.apache.org/viewvc?rev=721559&view=rev
Log:
Adding JMSMapWrapper, a way to wrap a MapMessage as a java.util.Map

Added:
    
webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMapWrapper.java
Modified:
    
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

Added: 
webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMapWrapper.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/JMSMapWrapper.java?rev=721559&view=auto
==============================================================================
--- 
webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMapWrapper.java
 (added)
+++ 
webservices/commons/trunk/scratch/senaka/sci-flex/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSMapWrapper.java
 Fri Nov 28 12:52:29 2008
@@ -0,0 +1,585 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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 java.util.AbstractCollection;
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import javax.jms.JMSException;
+import javax.jms.MapMessage;
+import javax.jms.MessageFormatException;
+import javax.jms.MessageNotWriteableException;
+
+/*
+ * Most logic was borrowed from Apache Harmony or extended based
+ * on Apache Harmony source code - Senaka.
+ */
+
+/**
+ * Wrapper to make it possible to represent a [EMAIL PROTECTED] MapMessage} as
+ * a [EMAIL PROTECTED] Map}. This class implements [EMAIL PROTECTED] Map}. 
This supports
+ * on-demand creation of Map, and also the type of [EMAIL PROTECTED] Map} can
+ * be decided as well.
+ */
+
+public class JMSMapWrapper implements Map {
+    private final MapMessage mapMessage;
+
+    private int entries = -1;
+
+    private Collection<Object> valuesCollection = null;
+
+    private AbstractSet<String> keySet = null;
+
+    /** 
+     * Construct a new JMSMapWrapper object utilizing the passed down
+     * [EMAIL PROTECTED] MapMessage}.
+     * 
+     * @param mapMessage the Map Message passed as a parameter to the
+     * constructor.
+     */
+    public JMSMapWrapper(MapMessage mapMessage) {
+        this.mapMessage = mapMessage;
+    }
+
+    /**
+     * Returns object wrapped by this wrapper.
+     *
+     * @return wrapped [EMAIL PROTECTED] MapMessage}.
+     */
+    public MapMessage getWrappedObject() {
+        return mapMessage;
+    }
+
+    /**
+     * Removes all elements from this Map, leaving it empty.
+     * 
+     * @throws UnsupportedOperationException
+     *                when removing from this Map is not supported
+     * 
+     * @see #isEmpty
+     * @see #size
+     */
+    public void clear() {
+        try {
+            mapMessage.clearBody();
+            entries = -1;
+        } catch (JMSException e) {
+            // A JMSException is thrown only if the operation is not
+            // supported. Therefore, logically it is correct to
+            // capture the JMSException and throw a 
UnsupportedOperationException
+            throw new UnsupportedOperationException(e);
+        }
+    }
+
+    /**
+     * Searches this Map for the specified key.
+     * 
+     * @param key the object to search for
+     * @return true if <code>key</code> is a key of this Map, false otherwise
+     * @throws ClassCastException   if the key is of an inappropriate type
+     * @throws NullPointerException if the specified key is null
+     */
+    public boolean containsKey(Object key) {
+        if (key == null) {
+            throw new NullPointerException();
+        }
+        boolean itemExists = false;
+        try {
+            if (key instanceof String) {
+                itemExists = mapMessage.itemExists((String)key);
+            } else {
+                throw new ClassCastException("This Map can only handle key's 
of type String");
+            }
+        } catch (JMSException e) { }
+        return itemExists;
+    }
+
+    /**
+     * Searches this Map for the specified value.
+     * 
+     * @param value the object to search for
+     * @return true if <code>value</code> is a value of this Map, false
+     *         otherwise
+     * @throws NullPointerException if the specified value is null
+     */
+    public boolean containsValue(Object value) {
+        if (value == null) {
+            throw new NullPointerException();
+        }
+        try {
+            Enumeration enumeration = mapMessage.getMapNames();
+            while (enumeration.hasMoreElements()) {
+                Object obj = enumeration.nextElement();
+                if (obj != null && obj.equals(value)) {
+                    return true;
+                }
+            }
+        } catch (JMSException e) { }
+        return false;
+    }
+
+    /**
+     * Compares the argument to the receiver, and answers true if they 
represent
+     * the <em>same</em> object using a class specific comparison.
+     * 
+     * @param object Object the object to compare with this object.
+     * @return boolean <code>true</code> if the object is the same as this
+     *         object <code>false</code> if it is different from this object.
+     * @throws NullPointerException if the specified object is null
+     * @see #hashCode
+     */
+    public boolean equals(Object object) {
+        if (object == null) {
+            throw new NullPointerException();
+        } else if (object instanceof JMSMapWrapper && (getWrappedObject() != 
null)) {
+            return 
getWrappedObject().equals(((JMSMapWrapper)object).getWrappedObject());
+        }
+        return false;
+    }
+
+    /**
+     * Answers the value of the mapping with the specified key.
+     * 
+     * @param key the key
+     * @return the value of the mapping with the specified key
+     * @throws ClassCastException   if the key is of an inappropriate type
+     * @throws NullPointerException if the specified key is null
+     */
+    public Object get(Object key) {
+        if (containsKey(key)) {
+            try {
+                return mapMessage.getObject((String)key);
+            } catch (JMSException e) { }
+        }
+        return null;
+    }
+
+    /**
+     * Answers an integer hash code for the receiver. Objects which are equal
+     * answer the same value for this method.
+     * 
+     * @return the receiver's hash
+     * 
+     * @see #equals
+     */
+    public int hashCode() {
+        int result = 0;
+        Iterator<Map.Entry<String, Object>> it = entrySet().iterator();
+        while (it.hasNext()) {
+            result += it.next().hashCode();
+        }
+        return result;
+    }
+
+    /**
+     * Answers if this Map has no elements, a size of zero.
+     * 
+     * @return true if this Map has no elements, false otherwise
+     * 
+     * @see #size
+     */
+    public boolean isEmpty() {
+        if (entries == -1) {
+            size();
+        }
+        return (entries > 0);
+    }
+
+    /**
+     * Answers a Set of the keys contained in this Map. The set is backed by
+     * this Map so changes to one are reflected by the other. The set does not
+     * support adding.
+     * 
+     * @return a Set of the keys
+     */
+    public Set<String> keySet() {
+        if (keySet == null) {
+            keySet = new AbstractSet<String>() {
+                @Override
+                public boolean contains(Object object) {
+                    return containsKey(object);
+                }
+
+                @Override
+                public int size() {
+                    return JMSMapWrapper.this.size();
+                }
+
+                @Override
+                public void clear() {
+                    JMSMapWrapper.this.clear();
+                }
+
+                @Override
+                public boolean remove(Object object) {
+                    // We don't allow removing of objects
+                    return false;
+                }
+
+                @Override
+                public boolean retainAll(Collection<?> collection) {
+                    // We don't allow removing of objects
+                    return false;
+                }
+
+                @Override
+                public Iterator<String> iterator() {
+                    return new KeyIterator<String,Object> (JMSMapWrapper.this);
+                }
+            };
+        }
+        return keySet;
+    }
+
+    /**
+     * Maps the specified key to the specified value.
+     * 
+     * @param key the key
+     * @param value the value
+     * @return the value of any previous mapping with the specified key or null
+     *         if there was no mapping
+     * 
+     * @exception UnsupportedOperationException
+     *                when adding to this Map is not supported
+     * @exception ClassCastException
+     *                when the class of the key or value is inappropriate for
+     *                this Map
+     * @exception IllegalArgumentException
+     *                when the key or value cannot be added to this Map
+     * @exception NullPointerException
+     *                when the key or value is null and this Map does not
+     *                support null keys or values
+     */
+    public Object put(Object key, Object value) {
+        if (!(key instanceof String)) {
+            throw new ClassCastException("This Map can only handle key's of 
type String");
+        }
+        Object ret = null;
+        try {
+            ret = get(key);
+            if (ret != null) {
+                throw new IllegalArgumentException();
+            }
+            mapMessage.setObject((String)key, value);
+        } catch (MessageNotWriteableException e) {
+            throw new UnsupportedOperationException(e);
+        } catch (MessageFormatException e) {
+            throw new IllegalArgumentException(e);
+        } catch (JMSException e) {
+            throw new UnsupportedOperationException(e);
+        }
+        if (entries == -1) {
+            size();
+        }
+        entries += 1;
+        return ret;
+    }
+
+    /**
+     * Copies every mapping in the specified Map to this Map.
+     * 
+     * @param map the Map to copy mappings from
+     * 
+     * @exception UnsupportedOperationException
+     *                when adding to this Map is not supported
+     * @exception ClassCastException
+     *                when the class of a key or value is inappropriate for 
this
+     * @exception IllegalArgumentException
+     *                when a key or value cannot be added to this Map
+     * @exception NullPointerException
+     *                when a key or value is null and this Map does not support
+     *                null keys or values
+     */
+    public void putAll(Map map) {
+        if (!map.isEmpty()) {
+            for (Object object : map.entrySet()) {
+               Map.Entry<String, Object> entry = (Map.Entry<String, Object>) 
object;
+               put(entry.getKey(), entry.getValue());
+            }
+        }
+    }
+
+    /**
+     * Removes a mapping with the specified key from this Map.
+     * 
+     * @param key the key of the mapping to remove
+     * @return the value of the removed mapping or null if key is not a key in
+     *         this Map
+     * 
+     * @exception UnsupportedOperationException
+     *                when removing from this Map is not supported
+     */
+    public Object remove(Object key) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Answers the number of elements in this Map.
+     * 
+     * @return the number of elements in this Map
+     */
+    public int size() {
+        if (entries != -1) {
+            return entries;
+        } else {
+            try {
+                // If you ran size once, you never should come here
+                // again unless someone cleared something on the Map
+                // Message.
+                entries = 0;
+                Enumeration enumeration = mapMessage.getMapNames();
+                while (enumeration.hasMoreElements()) {
+                    entries += 1;
+                    enumeration.nextElement();
+                }
+            } catch (JMSException e) { }
+        }
+        return entries;
+    }
+
+    private static class MapEntry<K, V> implements Map.Entry<K, V>, Cloneable {
+
+        private K key;
+        private V value;
+
+        public MapEntry(K theKey, V theValue) {
+            key = theKey;
+            value = theValue;
+        }
+
+        @Override
+        public Object clone() {
+            try {
+                return super.clone();
+            } catch (CloneNotSupportedException e) {
+                return null;
+            }
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if (this == object) {
+                return true;
+            }
+            if (object instanceof Map.Entry) {
+                Map.Entry<?, ?> entry = (Map.Entry<?, ?>) object;
+                return (key == null ? entry.getKey() == null : key.equals(entry
+                    .getKey()))
+                    && (value == null ? entry.getValue() == null : value
+                    .equals(entry.getValue()));
+            }
+            return false;
+        }
+
+        public K getKey() {
+            return key;
+        }
+
+        public V getValue() {
+            return value;
+        }
+
+        @Override
+        public int hashCode() {
+            return (key == null ? 0 : key.hashCode())
+                ^ (value == null ? 0 : value.hashCode());
+        }
+
+        public V setValue(V object) {
+            V result = value;
+            value = object;
+            return result;
+        }
+
+        @Override
+        public String toString() {
+            return key + "=" + value;
+        }
+    }
+
+
+    private static class BaseMapIterator<K, V> {
+
+        private final JMSMapWrapper map;
+        private final Enumeration enumeration;
+
+        public BaseMapIterator(JMSMapWrapper map) {
+            this.map = map;
+            Enumeration en = null;
+            try {
+                if (map != null && map.getWrappedObject() != null) {
+                    en = map.getWrappedObject().getMapNames();
+                }
+            } catch (JMSException e) { }
+            enumeration = en;
+        }
+
+        public final Map.Entry<K, V> getNext() {
+            if (hasNext()) {
+                K key = (K) enumeration.nextElement();
+                V value = (V) map.get((String)key);
+                return new MapEntry<K, V>(key, value); 
+            }
+            throw new NoSuchElementException();
+        }
+
+        public final void remove() {
+            // We don't allow removing of objects
+        }
+
+        public boolean hasNext() {
+            return (enumeration != null && enumeration.hasMoreElements());
+        }
+    }
+
+    private static class EntryIterator <K, V> extends BaseMapIterator<K, V> 
implements Iterator<Map.Entry<K, V>> {
+
+        EntryIterator (JMSMapWrapper map) {
+            super(map);
+        }
+
+        public Map.Entry<K, V> next() {
+            return getNext();
+        }
+    }
+
+    private static class KeyIterator <K, V> extends BaseMapIterator<K, V> 
implements Iterator<K> {
+
+        KeyIterator (JMSMapWrapper map) {
+            super(map);
+        }
+
+        public K next() {
+            return getNext().getKey();
+        }
+    }
+
+    private static class ValueIterator <K, V> extends BaseMapIterator<K, V> 
implements Iterator<V> {
+
+        ValueIterator (JMSMapWrapper map) {
+            super(map);
+        }
+
+        public V next() {
+            return getNext().getValue();
+        }
+    }
+
+    /**
+     * Returns all of the current <code>Map</code> values in a
+     * <code>Collection</code>. As the returned <code>Collection</code> is
+     * backed by this <code>Map</code>, users should be aware that changes in
+     * one will be immediately visible in the other.
+     * 
+     * @return a Collection of the values
+     */
+    public Collection<Object> values() {
+        if (valuesCollection == null) {
+            valuesCollection = new AbstractCollection<Object>() {
+                @Override
+                public boolean contains(Object object) {
+                    return containsValue(object);
+                }
+
+                @Override
+                public int size() {
+                    return JMSMapWrapper.this.size();
+                }
+
+                @Override
+                public void clear() {
+                    JMSMapWrapper.this.clear();
+                }
+
+                @Override
+                public Iterator<Object> iterator() {
+                    return new ValueIterator<String,Object> 
(JMSMapWrapper.this);
+                }
+            };
+        }
+        return valuesCollection;
+    }
+
+    private static class EntrySet <KT, VT> extends AbstractSet<Map.Entry<KT, 
VT>> {
+        private final JMSMapWrapper map;
+
+        public EntrySet(JMSMapWrapper map) {
+            this.map = map;
+        }
+
+        @Override
+        public int size() {
+            return map.size();
+        }
+
+        @Override
+        public void clear() {
+            map.clear();
+        }
+
+        @Override
+        public boolean remove(Object object) {
+            // We don't allow removing of objects
+            return false;
+        }
+
+        @Override
+        public boolean retainAll(Collection<?> collection) {
+            // We don't allow removing of objects
+            return false;
+        }
+
+        @Override
+        public boolean contains(Object object) {
+            if (object instanceof Map.Entry) {
+                Map.Entry<?, ?> entry = (Map.Entry<?, ?>) object;
+                Object value = map.get(entry.getKey());
+                return (value == null) ? (entry.getValue() == null) :
+                    value.equals(entry.getValue());
+            }
+            return false;
+        }
+
+        @Override
+        public Iterator<Map.Entry<KT, VT>> iterator() {
+            return new EntryIterator<KT,VT> (map);
+        }
+    }
+
+    /**
+     * Returns a <code>Set</code> whose elements comprise all of the mappings
+     * that are to be found in this <code>Map</code>. Information on each of
+     * the mappings is encapsulated in a separate [EMAIL PROTECTED] Map.Entry} 
instance. As
+     * the <code>Set</code> is backed by this <code>Map</code>, users
+     * should be aware that changes in one will be immediately visible in the
+     * other.
+     * 
+     * @return a <code>Set</code> of the mappings
+     */
+    public Set<Map.Entry<String, Object>> entrySet() {
+        return new EntrySet(this);
+    }
+}

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=721559&r1=721558&r2=721559&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
 Fri Nov 28 12:52:29 2008
@@ -430,21 +430,31 @@
                 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);
+                        if (dse.getObject() instanceof JMSMapWrapper) {
+                            message = session.createMapMessage();
+                            MapMessage mapMessage = ((JMSMapWrapper) 
dse.getObject()).getWrappedObject();
+                            for (Enumeration e = mapMessage.getMapNames() ; 
e.hasMoreElements() ;) {
+                                String key = (String) e.nextElement();
+                                Object value = mapMessage.getObject(key);
+                                ((MapMessage)message).setObject(key, value);
+                            }
+                        } else {
+                            message = session.createMapMessage();
+                            MapMessage mapMsg = (MapMessage) message;
+                            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);
+                                }
                             }
                         }
                     }
@@ -465,13 +475,25 @@
                     Object result = decoder.readObject();
                     decoder.close();
                     if (result != null) {
-                        Map map = (Map)result;
-                        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);
+                        if (result instanceof JMSMapWrapper) {
+                            message = session.createMapMessage();
+                            MapMessage mapMessage = 
((JMSMapWrapper)result).getWrappedObject();
+                            for (Enumeration e = mapMessage.getMapNames() ; 
e.hasMoreElements() ;) {
+                                String key = (String) e.nextElement();
+                                Object value = mapMessage.getObject(key);
+                                ((MapMessage)message).setObject(key, value);
+                            }
+                        } else {
+                            message = session.createMapMessage();
+                            MapMessage mapMsg = (MapMessage) message;
+                            Map map = (Map)result;
+                            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);
+                                }
                             }
                         }
                     }
@@ -513,8 +535,6 @@
             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) {
@@ -522,20 +542,32 @@
                 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);
+                    if (dse.getObject() instanceof JMSMapWrapper) {
+                        message = session.createMapMessage();
+                        MapMessage mapMessage = ((JMSMapWrapper) 
dse.getObject()).getWrappedObject();
+                        for (Enumeration e = mapMessage.getMapNames() ; 
e.hasMoreElements() ;) {
+                            String key = (String) e.nextElement();
+                            Object value = mapMessage.getObject(key);
+                            ((MapMessage)message).setObject(key, value);
+                        }
+                    } else {
+                        message = session.createMapMessage();
+                        MapMessage mapMsg = (MapMessage) message;
+                        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 if (wrapper != null && wrapper.getFirstOMChild() != null) {
-            // FIXME: The incoming payload might come from a non-JMS source, 
in that case,
-            // we don't get a OMSourcedElement. This issue must be sorted and 
the creation 
-            // of the OMSourcedElement must happen at the most optimal 
location.
+                // FIXME: The incoming payload might come from a non-JMS 
source, in that case,
+                // we don't get a OMSourcedElement. This issue must be sorted 
and the creation 
+                // of the OMSourcedElement must happen at the most optimal 
location.
                 OMNode firstChild = wrapper.getFirstOMChild();
                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
                 try {
@@ -549,13 +581,25 @@
                 Object result = decoder.readObject();
                 decoder.close();
                 if (result != null) {
-                    Map map = (Map)result;
-                    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);
+                    if (result instanceof JMSMapWrapper) {
+                        message = session.createMapMessage();
+                        MapMessage mapMessage = 
((JMSMapWrapper)result).getWrappedObject();
+                        for (Enumeration e = mapMessage.getMapNames() ; 
e.hasMoreElements() ;) {
+                            String key = (String) e.nextElement();
+                            Object value = mapMessage.getObject(key);
+                            ((MapMessage)message).setObject(key, value);
+                        }
+                    } else {
+                        message = session.createMapMessage();
+                        MapMessage mapMsg = (MapMessage) message;
+                        Map map = (Map)result;
+                        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);
+                            }
                         }
                     }
                 }

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=721559&r1=721558&r2=721559&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
 Fri Nov 28 12:52:29 2008
@@ -733,23 +733,7 @@
 
         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 new JMSMapWrapper(mapMessage);
         }
         return null;
     }


Reply via email to