You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2014/08/21 19:31:55 UTC

[1/2] git commit: https://issues.apache.org/jira/browse/AMQCPP-551

Repository: activemq-cpp
Updated Branches:
  refs/heads/3.8.x ac836a5bc -> f59a39523
  refs/heads/trunk a965f2b83 -> 35c570ba7


https://issues.apache.org/jira/browse/AMQCPP-551

Ensure that the correct number of bytes are read and written to the
stream for char type.  

Project: http://git-wip-us.apache.org/repos/asf/activemq-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-cpp/commit/f59a3952
Tree: http://git-wip-us.apache.org/repos/asf/activemq-cpp/tree/f59a3952
Diff: http://git-wip-us.apache.org/repos/asf/activemq-cpp/diff/f59a3952

Branch: refs/heads/3.8.x
Commit: f59a39523b2e111e8e455f945284be039864790e
Parents: ac836a5
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Aug 21 12:56:00 2014 -0400
Committer: Timothy Bish <ta...@gmail.com>
Committed: Thu Aug 21 12:56:00 2014 -0400

----------------------------------------------------------------------
 .../marshal/PrimitiveTypesMarshaller.cpp        | 373 +++++++++----------
 .../activemq/test/MapMessageTest.cpp            | 126 +++++--
 .../activemq/test/MapMessageTest.h              |   2 +
 .../test/openwire/OpenwireMapMessageTest.h      |   2 +
 4 files changed, 276 insertions(+), 227 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/f59a3952/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp b/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
index 5105831..58d94d1 100644
--- a/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
+++ b/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
@@ -39,159 +39,157 @@ using namespace decaf::lang;
 using namespace decaf::util;
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshal( const PrimitiveMap* map, std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::marshal(const PrimitiveMap* map, std::vector<unsigned char>& buffer) {
 
     try {
 
         ByteArrayOutputStream bytesOut;
-        DataOutputStream dataOut( &bytesOut );
+        DataOutputStream dataOut(&bytesOut);
 
-        if( map == NULL ) {
-            dataOut.writeInt( -1 );
+        if (map == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveMap( dataOut, *map );
+            PrimitiveTypesMarshaller::marshalPrimitiveMap(dataOut, *map);
         }
 
-        if( bytesOut.size() > 0 ) {
+        if (bytesOut.size() > 0) {
             std::pair<unsigned char*, int> array = bytesOut.toByteArray();
-            buffer.insert( buffer.begin(), array.first, array.first + array.second );
-            delete [] array.first;
+            buffer.insert(buffer.begin(), array.first, array.first + array.second);
+            delete[] array.first;
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshal( PrimitiveMap* map, const std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::unmarshal(PrimitiveMap* map, const std::vector<unsigned char>& buffer) {
 
     try {
 
-        if( map == NULL || buffer.empty() ) {
+        if (map == NULL || buffer.empty()) {
             return;
         }
 
         // Clear old data
         map->clear();
 
-        ByteArrayInputStream bytesIn( buffer );
-        DataInputStream dataIn( &bytesIn );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveMap( dataIn, *map );
+        ByteArrayInputStream bytesIn(buffer);
+        DataInputStream dataIn(&bytesIn);
+        PrimitiveTypesMarshaller::unmarshalPrimitiveMap(dataIn, *map);
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshal( const PrimitiveList* list, std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::marshal(const PrimitiveList* list, std::vector<unsigned char>& buffer) {
 
     try {
 
         ByteArrayOutputStream bytesOut;
-        DataOutputStream dataOut( &bytesOut );
+        DataOutputStream dataOut(&bytesOut);
 
-        if( list == NULL ) {
-            dataOut.writeInt( -1 );
+        if (list == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveList( dataOut, *list );
+            PrimitiveTypesMarshaller::marshalPrimitiveList(dataOut, *list);
         }
 
-        if( bytesOut.size() > 0 ) {
+        if (bytesOut.size() > 0) {
             std::pair<unsigned char*, int> array = bytesOut.toByteArray();
-            buffer.insert( buffer.begin(), array.first, array.first + array.second );
-            delete [] array.first;
+            buffer.insert(buffer.begin(), array.first, array.first + array.second);
+            delete[] array.first;
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshal( PrimitiveList* list, const std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::unmarshal(PrimitiveList* list, const std::vector<unsigned char>& buffer) {
 
     try {
 
-        if( list == NULL || buffer.empty() ) {
+        if (list == NULL || buffer.empty()) {
             return;
         }
 
         // Clear old data
         list->clear();
 
-        ByteArrayInputStream bytesIn( buffer );
-        DataInputStream dataIn( &bytesIn );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveList( dataIn, *list );
+        ByteArrayInputStream bytesIn(buffer);
+        DataInputStream dataIn(&bytesIn);
+        PrimitiveTypesMarshaller::unmarshalPrimitiveList(dataIn, *list);
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalMap( const PrimitiveMap* map, DataOutputStream& dataOut ) {
+void PrimitiveTypesMarshaller::marshalMap(const PrimitiveMap* map, DataOutputStream& dataOut) {
 
     try {
 
-        if( map == NULL ) {
-            dataOut.writeInt( -1 );
+        if (map == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveMap( dataOut, *map );
+            PrimitiveTypesMarshaller::marshalPrimitiveMap(dataOut, *map);
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-PrimitiveMap* PrimitiveTypesMarshaller::unmarshalMap( DataInputStream& dataIn ) {
+PrimitiveMap* PrimitiveTypesMarshaller::unmarshalMap(DataInputStream& dataIn) {
 
     try {
 
-        std::auto_ptr<PrimitiveMap> map( new PrimitiveMap() );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveMap( dataIn, *( map.get() ) );
+        std::auto_ptr<PrimitiveMap> map(new PrimitiveMap());
+        PrimitiveTypesMarshaller::unmarshalPrimitiveMap(dataIn, *(map.get()));
         return map.release();
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalList( const PrimitiveList* list, DataOutputStream& dataOut ) {
+void PrimitiveTypesMarshaller::marshalList(const PrimitiveList* list, DataOutputStream& dataOut) {
 
     try {
 
-        if( list == NULL ) {
-            dataOut.writeInt( -1 );
+        if (list == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveList( dataOut, *list );
+            PrimitiveTypesMarshaller::marshalPrimitiveList(dataOut, *list);
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-PrimitiveList* PrimitiveTypesMarshaller::unmarshalList( DataInputStream& dataIn ) {
+PrimitiveList* PrimitiveTypesMarshaller::unmarshalList(DataInputStream& dataIn) {
 
     try {
 
-        std::auto_ptr<PrimitiveList> list( new PrimitiveList() );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveList( dataIn, *( list.get() ) );
+        std::auto_ptr<PrimitiveList> list(new PrimitiveList());
+        PrimitiveTypesMarshaller::unmarshalPrimitiveList(dataIn, *(list.get()));
         return list.release();
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalPrimitiveMap(
-    decaf::io::DataOutputStream& dataOut,
-    const decaf::util::Map<std::string, PrimitiveValueNode>& map ) {
+void PrimitiveTypesMarshaller::marshalPrimitiveMap(decaf::io::DataOutputStream& dataOut, const decaf::util::Map<std::string, PrimitiveValueNode>& map) {
 
-    try{
+    try {
 
-        dataOut.writeInt( (int)map.size() );
+        dataOut.writeInt((int) map.size());
 
-        Pointer< Iterator<std::string> > keys(map.keySet().iterator());
+        Pointer<Iterator<std::string> > keys(map.keySet().iterator());
         while (keys->hasNext()) {
             std::string key = keys->next();
             dataOut.writeUTF(key);
@@ -199,259 +197,250 @@ void PrimitiveTypesMarshaller::marshalPrimitiveMap(
             marshalPrimitive(dataOut, value);
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalPrimitiveList(
-    decaf::io::DataOutputStream& dataOut,
-    const decaf::util::List<PrimitiveValueNode>& list ) {
+void PrimitiveTypesMarshaller::marshalPrimitiveList(decaf::io::DataOutputStream& dataOut, const decaf::util::List<PrimitiveValueNode>& list) {
+
+    try {
 
-    try{
-        dataOut.writeInt( (int)list.size() );
+        dataOut.writeInt((int) list.size());
 
-        for( int ix = 0; ix < list.size(); ++ix ) {
-            marshalPrimitive( dataOut, list.get( ix ) );
+        for (int ix = 0; ix < list.size(); ++ix) {
+            marshalPrimitive(dataOut, list.get(ix));
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalPrimitive( io::DataOutputStream& dataOut,
-                                               const activemq::util::PrimitiveValueNode& value ) {
+void PrimitiveTypesMarshaller::marshalPrimitive(io::DataOutputStream& dataOut, const activemq::util::PrimitiveValueNode& value) {
 
     try {
 
-        if( value.getType() == PrimitiveValueNode::BOOLEAN_TYPE ) {
+        if (value.getType() == PrimitiveValueNode::BOOLEAN_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::BOOLEAN_TYPE );
-            dataOut.writeBoolean( value.getBool() );
+            dataOut.writeByte(PrimitiveValueNode::BOOLEAN_TYPE);
+            dataOut.writeBoolean(value.getBool());
 
-        } else if( value.getType() == PrimitiveValueNode::BYTE_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::BYTE_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::BYTE_TYPE );
-            dataOut.writeByte( value.getByte() );
+            dataOut.writeByte(PrimitiveValueNode::BYTE_TYPE);
+            dataOut.writeByte(value.getByte());
 
-        } else if( value.getType() == PrimitiveValueNode::CHAR_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::CHAR_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::CHAR_TYPE );
-            dataOut.writeChar( value.getChar() );
+            // Java Char is two bytes, for now we can only send ASCII
+            dataOut.writeByte(PrimitiveValueNode::CHAR_TYPE);
+            dataOut.writeChar(0);
+            dataOut.writeChar(value.getChar());
 
-        } else if( value.getType() == PrimitiveValueNode::SHORT_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::SHORT_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::SHORT_TYPE );
-            dataOut.writeShort( value.getShort() );
+            dataOut.writeByte(PrimitiveValueNode::SHORT_TYPE);
+            dataOut.writeShort(value.getShort());
 
-        } else if( value.getType() == PrimitiveValueNode::INTEGER_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::INTEGER_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::INTEGER_TYPE );
-            dataOut.writeInt( value.getInt() );
+            dataOut.writeByte(PrimitiveValueNode::INTEGER_TYPE);
+            dataOut.writeInt(value.getInt());
 
-        } else if( value.getType() == PrimitiveValueNode::LONG_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::LONG_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::LONG_TYPE );
-            dataOut.writeLong( value.getLong() );
+            dataOut.writeByte(PrimitiveValueNode::LONG_TYPE);
+            dataOut.writeLong(value.getLong());
 
-        } else if( value.getType() == PrimitiveValueNode::FLOAT_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::FLOAT_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::FLOAT_TYPE );
-            dataOut.writeFloat( value.getFloat() );
+            dataOut.writeByte(PrimitiveValueNode::FLOAT_TYPE);
+            dataOut.writeFloat(value.getFloat());
 
-        } else if( value.getType() == PrimitiveValueNode::DOUBLE_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::DOUBLE_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::DOUBLE_TYPE );
-            dataOut.writeDouble( value.getDouble() );
+            dataOut.writeByte(PrimitiveValueNode::DOUBLE_TYPE);
+            dataOut.writeDouble(value.getDouble());
 
-        } else if( value.getType() == PrimitiveValueNode::BYTE_ARRAY_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::BYTE_ARRAY_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::BYTE_ARRAY_TYPE );
+            dataOut.writeByte(PrimitiveValueNode::BYTE_ARRAY_TYPE);
 
             std::vector<unsigned char> data = value.getByteArray();
 
-            dataOut.writeInt( (int)data.size() );
-            if( !data.empty() ) {
-                dataOut.write( &data[0], (int)data.size() );
+            dataOut.writeInt((int) data.size());
+            if (!data.empty()) {
+                dataOut.write(&data[0], (int) data.size());
             }
 
-        } else if( value.getType() == PrimitiveValueNode::STRING_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::STRING_TYPE) {
 
             std::string data = value.getString();
-            int size = (int)data.size();
+            int size = (int) data.size();
 
             // is the string big??
-            if( size == 0 ) {
-                dataOut.writeByte( PrimitiveValueNode::STRING_TYPE );
-                dataOut.writeShort( (short)size );
-            } else if( (int)data.size() > Short::MAX_VALUE / 4 ) {
-                dataOut.writeByte( PrimitiveValueNode::BIG_STRING_TYPE );
-                dataOut.writeInt( size );
-                dataOut.write( (unsigned char*)data.c_str(), size, 0, size );
+            if (size == 0) {
+                dataOut.writeByte(PrimitiveValueNode::STRING_TYPE);
+                dataOut.writeShort((short) size);
+            } else if ((int) data.size() > Short::MAX_VALUE / 4) {
+                dataOut.writeByte(PrimitiveValueNode::BIG_STRING_TYPE);
+                dataOut.writeInt(size);
+                dataOut.write((unsigned char*) data.c_str(), size, 0, size);
             } else {
-                dataOut.writeByte( PrimitiveValueNode::STRING_TYPE );
-                dataOut.writeShort( (short)size );
-                dataOut.write( (unsigned char*)data.c_str(), size, 0, size );
+                dataOut.writeByte(PrimitiveValueNode::STRING_TYPE);
+                dataOut.writeShort((short) size);
+                dataOut.write((unsigned char*) data.c_str(), size, 0, size);
             }
 
-        } else if( value.getType() == PrimitiveValueNode::LIST_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::LIST_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::LIST_TYPE );
-            marshalPrimitiveList( dataOut, value.getList() );
+            dataOut.writeByte(PrimitiveValueNode::LIST_TYPE);
+            marshalPrimitiveList(dataOut, value.getList());
 
-        } else if( value.getType() == PrimitiveValueNode::MAP_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::MAP_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::MAP_TYPE );
-            marshalPrimitiveMap( dataOut, value.getMap() );
+            dataOut.writeByte(PrimitiveValueNode::MAP_TYPE);
+            marshalPrimitiveMap(dataOut, value.getMap());
 
         } else {
             throw IOException(
-                __FILE__,
-                __LINE__,
-                "Object is not a primitive: ");
+            __FILE__,
+            __LINE__, "Object is not a primitive: ");
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshalPrimitiveMap(
-    decaf::io::DataInputStream& dataIn, PrimitiveMap& map ) {
+void PrimitiveTypesMarshaller::unmarshalPrimitiveMap(decaf::io::DataInputStream& dataIn, PrimitiveMap& map) {
 
-    try{
+    try {
 
         int size = dataIn.readInt();
 
-        if( size > 0 ) {
-            for( int i=0; i < size; i++ ) {
+        if (size > 0) {
+            for (int i = 0; i < size; i++) {
                 std::string key = dataIn.readUTF();
-                map.put( key, unmarshalPrimitive( dataIn ) );
+                map.put(key, unmarshalPrimitive(dataIn));
             }
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshalPrimitiveList(
-    decaf::io::DataInputStream& dataIn,
-    decaf::util::LinkedList<PrimitiveValueNode>& list ) {
+void PrimitiveTypesMarshaller::unmarshalPrimitiveList(decaf::io::DataInputStream& dataIn, decaf::util::LinkedList<PrimitiveValueNode>& list) {
 
-    try{
+    try {
 
         int size = dataIn.readInt();
-        while( size-- > 0 ) {
-            list.add( unmarshalPrimitive( dataIn ) );
+        while (size-- > 0) {
+            list.add(unmarshalPrimitive(dataIn));
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-PrimitiveValueNode PrimitiveTypesMarshaller::unmarshalPrimitive( io::DataInputStream& dataIn ) {
+PrimitiveValueNode PrimitiveTypesMarshaller::unmarshalPrimitive(io::DataInputStream& dataIn) {
 
     try {
 
         unsigned char type = dataIn.readByte();
-
         PrimitiveValueNode value;
 
-        switch( type ) {
+        switch (type) {
 
             case PrimitiveValueNode::NULL_TYPE:
                 value.clear();
                 break;
             case PrimitiveValueNode::BYTE_TYPE:
-                value.setByte( dataIn.readByte() );
+                value.setByte(dataIn.readByte());
                 break;
             case PrimitiveValueNode::BOOLEAN_TYPE:
-                value.setBool( dataIn.readBoolean() );
+                value.setBool(dataIn.readBoolean());
                 break;
             case PrimitiveValueNode::CHAR_TYPE:
-                value.setChar( dataIn.readChar() );
+                // Java Char is two bytes, for now we can read ASCII, throw away byte 1
+                dataIn.readByte();
+                value.setChar(dataIn.readChar());
                 break;
             case PrimitiveValueNode::SHORT_TYPE:
-                value.setShort( dataIn.readShort() );
+                value.setShort(dataIn.readShort());
                 break;
             case PrimitiveValueNode::INTEGER_TYPE:
-                value.setInt( dataIn.readInt() );
+                value.setInt(dataIn.readInt());
                 break;
             case PrimitiveValueNode::LONG_TYPE:
-                value.setLong( dataIn.readLong() );
+                value.setLong(dataIn.readLong());
                 break;
             case PrimitiveValueNode::FLOAT_TYPE:
-                value.setFloat( dataIn.readFloat() );
+                value.setFloat(dataIn.readFloat());
                 break;
             case PrimitiveValueNode::DOUBLE_TYPE:
-                value.setDouble( dataIn.readDouble() );
+                value.setDouble(dataIn.readDouble());
                 break;
-            case PrimitiveValueNode::BYTE_ARRAY_TYPE:
-            {
+            case PrimitiveValueNode::BYTE_ARRAY_TYPE: {
                 int size = dataIn.readInt();
                 std::vector<unsigned char> data;
-                if( size > 0 ) {
-                    data.resize( size );
-                    dataIn.readFully( &data[0], size );
+                if (size > 0) {
+                    data.resize(size);
+                    dataIn.readFully(&data[0], size);
                 }
-                value.setByteArray( data );
+                value.setByteArray(data);
                 break;
             }
-            case PrimitiveValueNode::STRING_TYPE:
-            {
+            case PrimitiveValueNode::STRING_TYPE: {
                 int utfLength = dataIn.readShort();
-                if( utfLength > 0 ) {
+                if (utfLength > 0) {
 
-                    std::vector<unsigned char> buffer( utfLength );
-                    dataIn.readFully( &buffer[0], utfLength );
-                    value.setString( std::string( (char*)( &buffer[0] ), utfLength ) );
+                    std::vector<unsigned char> buffer(utfLength);
+                    dataIn.readFully(&buffer[0], utfLength);
+                    value.setString(std::string((char*) (&buffer[0]), utfLength));
                 }
                 break;
             }
-            case PrimitiveValueNode::BIG_STRING_TYPE:
-            {
+            case PrimitiveValueNode::BIG_STRING_TYPE: {
                 int utfLength = dataIn.readInt();
-                if( utfLength > 0 ) {
+                if (utfLength > 0) {
 
-                    std::vector<unsigned char> buffer( utfLength );
-                    dataIn.readFully( &buffer[0], utfLength );
-                    value.setString( std::string( (char*)( &buffer[0] ), utfLength ) );
+                    std::vector<unsigned char> buffer(utfLength);
+                    dataIn.readFully(&buffer[0], utfLength);
+                    value.setString(std::string((char*) (&buffer[0]), utfLength));
                 }
                 break;
             }
-            case PrimitiveValueNode::LIST_TYPE:
-            {
+            case PrimitiveValueNode::LIST_TYPE: {
                 PrimitiveList list;
-                PrimitiveTypesMarshaller::unmarshalPrimitiveList( dataIn, list );
-                value.setList( list );
+                PrimitiveTypesMarshaller::unmarshalPrimitiveList(dataIn, list);
+                value.setList(list);
                 break;
             }
-            case PrimitiveValueNode::MAP_TYPE:
-            {
+            case PrimitiveValueNode::MAP_TYPE: {
                 PrimitiveMap map;
-                PrimitiveTypesMarshaller::unmarshalPrimitiveMap( dataIn, map );
-                value.setMap( map );
+                PrimitiveTypesMarshaller::unmarshalPrimitiveMap(dataIn, map);
+                value.setMap(map);
                 break;
             }
             default:
                 throw IOException(
-                    __FILE__,
-                    __LINE__,
-                    "PrimitiveTypesMarshaller::unmarshalPrimitive - "
-                    "Unsupported data type: ");
+                __FILE__,
+                __LINE__, "PrimitiveTypesMarshaller::unmarshalPrimitive - "
+                        "Unsupported data type: ");
         }
 
         return value;
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/f59a3952/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
index 36d7b4d..3f76b92 100644
--- a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
+++ b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
@@ -46,76 +46,132 @@ MapMessageTest::~MapMessageTest() {
 void MapMessageTest::testEmptyMapSendReceive() {
 
     // Create CMS Object for Comms
-    cms::Session* session( cmsProvider->getSession() );
+    cms::Session* session(cmsProvider->getSession());
     cms::MessageConsumer* consumer = cmsProvider->getConsumer();
     cms::MessageProducer* producer = cmsProvider->getProducer();
-    producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT );
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
 
-    auto_ptr<cms::MapMessage> mapMessage( session->createMapMessage() );
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
 
     // Send some text messages
-    producer->send( mapMessage.get() );
+    producer->send(mapMessage.get());
 
-    auto_ptr<cms::Message> message( consumer->receive( 2000 ) );
-    CPPUNIT_ASSERT( message.get() != NULL );
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
 
-    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>( message.get() );
-    CPPUNIT_ASSERT( recvMapMessage != NULL );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "SomeKey" ) == false );
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("SomeKey") == false);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 void MapMessageTest::testMapWithEmptyStringValue() {
 
     // Create CMS Object for Comms
-    cms::Session* session( cmsProvider->getSession() );
+    cms::Session* session(cmsProvider->getSession());
     cms::MessageConsumer* consumer = cmsProvider->getConsumer();
     cms::MessageProducer* producer = cmsProvider->getProducer();
-    producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT );
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
 
-    auto_ptr<cms::MapMessage> mapMessage( session->createMapMessage() );
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
 
     mapMessage->setString("String1", "");
     mapMessage->setString("String2", "value");
 
     // Send some text messages
-    producer->send( mapMessage.get() );
-
-    auto_ptr<cms::Message> message( consumer->receive( 2000 ) );
-    CPPUNIT_ASSERT( message.get() != NULL );
-
-    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>( message.get() );
-    CPPUNIT_ASSERT( recvMapMessage != NULL );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "String1" ) == true );
-    CPPUNIT_ASSERT( recvMapMessage->getString( "String1" ) == "" );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "String2" ) == true );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "String3" ) == false );
-    CPPUNIT_ASSERT( recvMapMessage->getString( "String2" ) == string( "value" ) );
+    producer->send(mapMessage.get());
+
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
+
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getString("String1") == "");
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String2") == true);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String3") == false);
+    CPPUNIT_ASSERT(recvMapMessage->getString("String2") == string("value"));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void MapMessageTest::testMapWithSingleCharEntry() {
+
+    // Create CMS Object for Comms
+    cms::Session* session(cmsProvider->getSession());
+    cms::MessageConsumer* consumer = cmsProvider->getConsumer();
+    cms::MessageProducer* producer = cmsProvider->getProducer();
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
+
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
+
+    mapMessage->setChar("Char1", 'a');
+
+    // Send some text messages
+    producer->send(mapMessage.get());
+
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
+
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getChar("Char1") == 'a');
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char2") == false);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void MapMessageTest::testMapWithCharAndStringEntry() {
+
+    // Create CMS Object for Comms
+    cms::Session* session(cmsProvider->getSession());
+    cms::MessageConsumer* consumer = cmsProvider->getConsumer();
+    cms::MessageProducer* producer = cmsProvider->getProducer();
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
+
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
+
+    mapMessage->setChar("Char1", 'a');
+    mapMessage->setString("String1", "string");
+
+    // Send some text messages
+    producer->send(mapMessage.get());
+
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
+
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getChar("Char1") == 'a');
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char2") == false);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String3") == false);
+    CPPUNIT_ASSERT(recvMapMessage->getString("String1") == string("string"));
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 void MapMessageTest::testMapSetEmptyBytesVector() {
 
     // Create CMS Object for Comms
-    cms::Session* session( cmsProvider->getSession() );
+    cms::Session* session(cmsProvider->getSession());
     cms::MessageConsumer* consumer = cmsProvider->getConsumer();
     cms::MessageProducer* producer = cmsProvider->getProducer();
-    producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT );
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
 
-    auto_ptr<cms::MapMessage> mapMessage( session->createMapMessage() );
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
 
     std::vector<unsigned char> bytes;
 
-    mapMessage->setBytes( "BYTES", bytes );
+    mapMessage->setBytes("BYTES", bytes);
 
     // Send some text messages
-    producer->send( mapMessage.get() );
+    producer->send(mapMessage.get());
 
-    auto_ptr<cms::Message> message( consumer->receive( 2000 ) );
-    CPPUNIT_ASSERT( message.get() != NULL );
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
 
-    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>( message.get() );
-    CPPUNIT_ASSERT( recvMapMessage != NULL );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "BYTES" ) == true );
-    CPPUNIT_ASSERT( recvMapMessage->getBytes( "BYTES" ).empty() == true );
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("BYTES") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getBytes("BYTES").empty() == true);
 }

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/f59a3952/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
index 06b4768..b1b1015 100644
--- a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
+++ b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
@@ -33,6 +33,8 @@ namespace test {
         void testEmptyMapSendReceive();
         void testMapWithEmptyStringValue();
         void testMapSetEmptyBytesVector();
+        void testMapWithSingleCharEntry();
+        void testMapWithCharAndStringEntry();
 
     };
 

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/f59a3952/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h b/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
index aebf7d7..6e428fd 100644
--- a/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
+++ b/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
@@ -31,6 +31,8 @@ namespace openwire {
         CPPUNIT_TEST( testEmptyMapSendReceive );
         CPPUNIT_TEST( testMapWithEmptyStringValue );
         CPPUNIT_TEST( testMapSetEmptyBytesVector );
+        CPPUNIT_TEST( testMapWithSingleCharEntry );
+        CPPUNIT_TEST( testMapWithCharAndStringEntry );
         CPPUNIT_TEST_SUITE_END();
 
     public:


[2/2] git commit: https://issues.apache.org/jira/browse/AMQCPP-551

Posted by ta...@apache.org.
https://issues.apache.org/jira/browse/AMQCPP-551

Ensure that the correct number of bytes are read and written to the
stream for char type.


Project: http://git-wip-us.apache.org/repos/asf/activemq-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-cpp/commit/35c570ba
Tree: http://git-wip-us.apache.org/repos/asf/activemq-cpp/tree/35c570ba
Diff: http://git-wip-us.apache.org/repos/asf/activemq-cpp/diff/35c570ba

Branch: refs/heads/trunk
Commit: 35c570ba75afa94fa5d3f9ad9068636766d361a9
Parents: a965f2b
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Aug 21 12:56:00 2014 -0400
Committer: Timothy Bish <ta...@gmail.com>
Committed: Thu Aug 21 12:56:36 2014 -0400

----------------------------------------------------------------------
 .../marshal/PrimitiveTypesMarshaller.cpp        | 373 +++++++++----------
 .../activemq/test/MapMessageTest.cpp            | 126 +++++--
 .../activemq/test/MapMessageTest.h              |   2 +
 .../test/openwire/OpenwireMapMessageTest.h      |   2 +
 4 files changed, 276 insertions(+), 227 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/35c570ba/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp b/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
index 5105831..58d94d1 100644
--- a/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
+++ b/activemq-cpp/src/main/activemq/wireformat/openwire/marshal/PrimitiveTypesMarshaller.cpp
@@ -39,159 +39,157 @@ using namespace decaf::lang;
 using namespace decaf::util;
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshal( const PrimitiveMap* map, std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::marshal(const PrimitiveMap* map, std::vector<unsigned char>& buffer) {
 
     try {
 
         ByteArrayOutputStream bytesOut;
-        DataOutputStream dataOut( &bytesOut );
+        DataOutputStream dataOut(&bytesOut);
 
-        if( map == NULL ) {
-            dataOut.writeInt( -1 );
+        if (map == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveMap( dataOut, *map );
+            PrimitiveTypesMarshaller::marshalPrimitiveMap(dataOut, *map);
         }
 
-        if( bytesOut.size() > 0 ) {
+        if (bytesOut.size() > 0) {
             std::pair<unsigned char*, int> array = bytesOut.toByteArray();
-            buffer.insert( buffer.begin(), array.first, array.first + array.second );
-            delete [] array.first;
+            buffer.insert(buffer.begin(), array.first, array.first + array.second);
+            delete[] array.first;
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshal( PrimitiveMap* map, const std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::unmarshal(PrimitiveMap* map, const std::vector<unsigned char>& buffer) {
 
     try {
 
-        if( map == NULL || buffer.empty() ) {
+        if (map == NULL || buffer.empty()) {
             return;
         }
 
         // Clear old data
         map->clear();
 
-        ByteArrayInputStream bytesIn( buffer );
-        DataInputStream dataIn( &bytesIn );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveMap( dataIn, *map );
+        ByteArrayInputStream bytesIn(buffer);
+        DataInputStream dataIn(&bytesIn);
+        PrimitiveTypesMarshaller::unmarshalPrimitiveMap(dataIn, *map);
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshal( const PrimitiveList* list, std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::marshal(const PrimitiveList* list, std::vector<unsigned char>& buffer) {
 
     try {
 
         ByteArrayOutputStream bytesOut;
-        DataOutputStream dataOut( &bytesOut );
+        DataOutputStream dataOut(&bytesOut);
 
-        if( list == NULL ) {
-            dataOut.writeInt( -1 );
+        if (list == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveList( dataOut, *list );
+            PrimitiveTypesMarshaller::marshalPrimitiveList(dataOut, *list);
         }
 
-        if( bytesOut.size() > 0 ) {
+        if (bytesOut.size() > 0) {
             std::pair<unsigned char*, int> array = bytesOut.toByteArray();
-            buffer.insert( buffer.begin(), array.first, array.first + array.second );
-            delete [] array.first;
+            buffer.insert(buffer.begin(), array.first, array.first + array.second);
+            delete[] array.first;
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshal( PrimitiveList* list, const std::vector<unsigned char>& buffer ) {
+void PrimitiveTypesMarshaller::unmarshal(PrimitiveList* list, const std::vector<unsigned char>& buffer) {
 
     try {
 
-        if( list == NULL || buffer.empty() ) {
+        if (list == NULL || buffer.empty()) {
             return;
         }
 
         // Clear old data
         list->clear();
 
-        ByteArrayInputStream bytesIn( buffer );
-        DataInputStream dataIn( &bytesIn );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveList( dataIn, *list );
+        ByteArrayInputStream bytesIn(buffer);
+        DataInputStream dataIn(&bytesIn);
+        PrimitiveTypesMarshaller::unmarshalPrimitiveList(dataIn, *list);
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalMap( const PrimitiveMap* map, DataOutputStream& dataOut ) {
+void PrimitiveTypesMarshaller::marshalMap(const PrimitiveMap* map, DataOutputStream& dataOut) {
 
     try {
 
-        if( map == NULL ) {
-            dataOut.writeInt( -1 );
+        if (map == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveMap( dataOut, *map );
+            PrimitiveTypesMarshaller::marshalPrimitiveMap(dataOut, *map);
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-PrimitiveMap* PrimitiveTypesMarshaller::unmarshalMap( DataInputStream& dataIn ) {
+PrimitiveMap* PrimitiveTypesMarshaller::unmarshalMap(DataInputStream& dataIn) {
 
     try {
 
-        std::auto_ptr<PrimitiveMap> map( new PrimitiveMap() );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveMap( dataIn, *( map.get() ) );
+        std::auto_ptr<PrimitiveMap> map(new PrimitiveMap());
+        PrimitiveTypesMarshaller::unmarshalPrimitiveMap(dataIn, *(map.get()));
         return map.release();
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalList( const PrimitiveList* list, DataOutputStream& dataOut ) {
+void PrimitiveTypesMarshaller::marshalList(const PrimitiveList* list, DataOutputStream& dataOut) {
 
     try {
 
-        if( list == NULL ) {
-            dataOut.writeInt( -1 );
+        if (list == NULL) {
+            dataOut.writeInt(-1);
         } else {
-            PrimitiveTypesMarshaller::marshalPrimitiveList( dataOut, *list );
+            PrimitiveTypesMarshaller::marshalPrimitiveList(dataOut, *list);
         }
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-PrimitiveList* PrimitiveTypesMarshaller::unmarshalList( DataInputStream& dataIn ) {
+PrimitiveList* PrimitiveTypesMarshaller::unmarshalList(DataInputStream& dataIn) {
 
     try {
 
-        std::auto_ptr<PrimitiveList> list( new PrimitiveList() );
-        PrimitiveTypesMarshaller::unmarshalPrimitiveList( dataIn, *( list.get() ) );
+        std::auto_ptr<PrimitiveList> list(new PrimitiveList());
+        PrimitiveTypesMarshaller::unmarshalPrimitiveList(dataIn, *(list.get()));
         return list.release();
     }
-    AMQ_CATCH_RETHROW( decaf::lang::Exception )
-    AMQ_CATCHALL_THROW( decaf::lang::Exception )
+    AMQ_CATCH_RETHROW(decaf::lang::Exception)
+    AMQ_CATCHALL_THROW(decaf::lang::Exception)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalPrimitiveMap(
-    decaf::io::DataOutputStream& dataOut,
-    const decaf::util::Map<std::string, PrimitiveValueNode>& map ) {
+void PrimitiveTypesMarshaller::marshalPrimitiveMap(decaf::io::DataOutputStream& dataOut, const decaf::util::Map<std::string, PrimitiveValueNode>& map) {
 
-    try{
+    try {
 
-        dataOut.writeInt( (int)map.size() );
+        dataOut.writeInt((int) map.size());
 
-        Pointer< Iterator<std::string> > keys(map.keySet().iterator());
+        Pointer<Iterator<std::string> > keys(map.keySet().iterator());
         while (keys->hasNext()) {
             std::string key = keys->next();
             dataOut.writeUTF(key);
@@ -199,259 +197,250 @@ void PrimitiveTypesMarshaller::marshalPrimitiveMap(
             marshalPrimitive(dataOut, value);
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalPrimitiveList(
-    decaf::io::DataOutputStream& dataOut,
-    const decaf::util::List<PrimitiveValueNode>& list ) {
+void PrimitiveTypesMarshaller::marshalPrimitiveList(decaf::io::DataOutputStream& dataOut, const decaf::util::List<PrimitiveValueNode>& list) {
+
+    try {
 
-    try{
-        dataOut.writeInt( (int)list.size() );
+        dataOut.writeInt((int) list.size());
 
-        for( int ix = 0; ix < list.size(); ++ix ) {
-            marshalPrimitive( dataOut, list.get( ix ) );
+        for (int ix = 0; ix < list.size(); ++ix) {
+            marshalPrimitive(dataOut, list.get(ix));
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::marshalPrimitive( io::DataOutputStream& dataOut,
-                                               const activemq::util::PrimitiveValueNode& value ) {
+void PrimitiveTypesMarshaller::marshalPrimitive(io::DataOutputStream& dataOut, const activemq::util::PrimitiveValueNode& value) {
 
     try {
 
-        if( value.getType() == PrimitiveValueNode::BOOLEAN_TYPE ) {
+        if (value.getType() == PrimitiveValueNode::BOOLEAN_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::BOOLEAN_TYPE );
-            dataOut.writeBoolean( value.getBool() );
+            dataOut.writeByte(PrimitiveValueNode::BOOLEAN_TYPE);
+            dataOut.writeBoolean(value.getBool());
 
-        } else if( value.getType() == PrimitiveValueNode::BYTE_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::BYTE_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::BYTE_TYPE );
-            dataOut.writeByte( value.getByte() );
+            dataOut.writeByte(PrimitiveValueNode::BYTE_TYPE);
+            dataOut.writeByte(value.getByte());
 
-        } else if( value.getType() == PrimitiveValueNode::CHAR_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::CHAR_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::CHAR_TYPE );
-            dataOut.writeChar( value.getChar() );
+            // Java Char is two bytes, for now we can only send ASCII
+            dataOut.writeByte(PrimitiveValueNode::CHAR_TYPE);
+            dataOut.writeChar(0);
+            dataOut.writeChar(value.getChar());
 
-        } else if( value.getType() == PrimitiveValueNode::SHORT_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::SHORT_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::SHORT_TYPE );
-            dataOut.writeShort( value.getShort() );
+            dataOut.writeByte(PrimitiveValueNode::SHORT_TYPE);
+            dataOut.writeShort(value.getShort());
 
-        } else if( value.getType() == PrimitiveValueNode::INTEGER_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::INTEGER_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::INTEGER_TYPE );
-            dataOut.writeInt( value.getInt() );
+            dataOut.writeByte(PrimitiveValueNode::INTEGER_TYPE);
+            dataOut.writeInt(value.getInt());
 
-        } else if( value.getType() == PrimitiveValueNode::LONG_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::LONG_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::LONG_TYPE );
-            dataOut.writeLong( value.getLong() );
+            dataOut.writeByte(PrimitiveValueNode::LONG_TYPE);
+            dataOut.writeLong(value.getLong());
 
-        } else if( value.getType() == PrimitiveValueNode::FLOAT_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::FLOAT_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::FLOAT_TYPE );
-            dataOut.writeFloat( value.getFloat() );
+            dataOut.writeByte(PrimitiveValueNode::FLOAT_TYPE);
+            dataOut.writeFloat(value.getFloat());
 
-        } else if( value.getType() == PrimitiveValueNode::DOUBLE_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::DOUBLE_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::DOUBLE_TYPE );
-            dataOut.writeDouble( value.getDouble() );
+            dataOut.writeByte(PrimitiveValueNode::DOUBLE_TYPE);
+            dataOut.writeDouble(value.getDouble());
 
-        } else if( value.getType() == PrimitiveValueNode::BYTE_ARRAY_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::BYTE_ARRAY_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::BYTE_ARRAY_TYPE );
+            dataOut.writeByte(PrimitiveValueNode::BYTE_ARRAY_TYPE);
 
             std::vector<unsigned char> data = value.getByteArray();
 
-            dataOut.writeInt( (int)data.size() );
-            if( !data.empty() ) {
-                dataOut.write( &data[0], (int)data.size() );
+            dataOut.writeInt((int) data.size());
+            if (!data.empty()) {
+                dataOut.write(&data[0], (int) data.size());
             }
 
-        } else if( value.getType() == PrimitiveValueNode::STRING_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::STRING_TYPE) {
 
             std::string data = value.getString();
-            int size = (int)data.size();
+            int size = (int) data.size();
 
             // is the string big??
-            if( size == 0 ) {
-                dataOut.writeByte( PrimitiveValueNode::STRING_TYPE );
-                dataOut.writeShort( (short)size );
-            } else if( (int)data.size() > Short::MAX_VALUE / 4 ) {
-                dataOut.writeByte( PrimitiveValueNode::BIG_STRING_TYPE );
-                dataOut.writeInt( size );
-                dataOut.write( (unsigned char*)data.c_str(), size, 0, size );
+            if (size == 0) {
+                dataOut.writeByte(PrimitiveValueNode::STRING_TYPE);
+                dataOut.writeShort((short) size);
+            } else if ((int) data.size() > Short::MAX_VALUE / 4) {
+                dataOut.writeByte(PrimitiveValueNode::BIG_STRING_TYPE);
+                dataOut.writeInt(size);
+                dataOut.write((unsigned char*) data.c_str(), size, 0, size);
             } else {
-                dataOut.writeByte( PrimitiveValueNode::STRING_TYPE );
-                dataOut.writeShort( (short)size );
-                dataOut.write( (unsigned char*)data.c_str(), size, 0, size );
+                dataOut.writeByte(PrimitiveValueNode::STRING_TYPE);
+                dataOut.writeShort((short) size);
+                dataOut.write((unsigned char*) data.c_str(), size, 0, size);
             }
 
-        } else if( value.getType() == PrimitiveValueNode::LIST_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::LIST_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::LIST_TYPE );
-            marshalPrimitiveList( dataOut, value.getList() );
+            dataOut.writeByte(PrimitiveValueNode::LIST_TYPE);
+            marshalPrimitiveList(dataOut, value.getList());
 
-        } else if( value.getType() == PrimitiveValueNode::MAP_TYPE ) {
+        } else if (value.getType() == PrimitiveValueNode::MAP_TYPE) {
 
-            dataOut.writeByte( PrimitiveValueNode::MAP_TYPE );
-            marshalPrimitiveMap( dataOut, value.getMap() );
+            dataOut.writeByte(PrimitiveValueNode::MAP_TYPE);
+            marshalPrimitiveMap(dataOut, value.getMap());
 
         } else {
             throw IOException(
-                __FILE__,
-                __LINE__,
-                "Object is not a primitive: ");
+            __FILE__,
+            __LINE__, "Object is not a primitive: ");
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshalPrimitiveMap(
-    decaf::io::DataInputStream& dataIn, PrimitiveMap& map ) {
+void PrimitiveTypesMarshaller::unmarshalPrimitiveMap(decaf::io::DataInputStream& dataIn, PrimitiveMap& map) {
 
-    try{
+    try {
 
         int size = dataIn.readInt();
 
-        if( size > 0 ) {
-            for( int i=0; i < size; i++ ) {
+        if (size > 0) {
+            for (int i = 0; i < size; i++) {
                 std::string key = dataIn.readUTF();
-                map.put( key, unmarshalPrimitive( dataIn ) );
+                map.put(key, unmarshalPrimitive(dataIn));
             }
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-void PrimitiveTypesMarshaller::unmarshalPrimitiveList(
-    decaf::io::DataInputStream& dataIn,
-    decaf::util::LinkedList<PrimitiveValueNode>& list ) {
+void PrimitiveTypesMarshaller::unmarshalPrimitiveList(decaf::io::DataInputStream& dataIn, decaf::util::LinkedList<PrimitiveValueNode>& list) {
 
-    try{
+    try {
 
         int size = dataIn.readInt();
-        while( size-- > 0 ) {
-            list.add( unmarshalPrimitive( dataIn ) );
+        while (size-- > 0) {
+            list.add(unmarshalPrimitive(dataIn));
         }
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-PrimitiveValueNode PrimitiveTypesMarshaller::unmarshalPrimitive( io::DataInputStream& dataIn ) {
+PrimitiveValueNode PrimitiveTypesMarshaller::unmarshalPrimitive(io::DataInputStream& dataIn) {
 
     try {
 
         unsigned char type = dataIn.readByte();
-
         PrimitiveValueNode value;
 
-        switch( type ) {
+        switch (type) {
 
             case PrimitiveValueNode::NULL_TYPE:
                 value.clear();
                 break;
             case PrimitiveValueNode::BYTE_TYPE:
-                value.setByte( dataIn.readByte() );
+                value.setByte(dataIn.readByte());
                 break;
             case PrimitiveValueNode::BOOLEAN_TYPE:
-                value.setBool( dataIn.readBoolean() );
+                value.setBool(dataIn.readBoolean());
                 break;
             case PrimitiveValueNode::CHAR_TYPE:
-                value.setChar( dataIn.readChar() );
+                // Java Char is two bytes, for now we can read ASCII, throw away byte 1
+                dataIn.readByte();
+                value.setChar(dataIn.readChar());
                 break;
             case PrimitiveValueNode::SHORT_TYPE:
-                value.setShort( dataIn.readShort() );
+                value.setShort(dataIn.readShort());
                 break;
             case PrimitiveValueNode::INTEGER_TYPE:
-                value.setInt( dataIn.readInt() );
+                value.setInt(dataIn.readInt());
                 break;
             case PrimitiveValueNode::LONG_TYPE:
-                value.setLong( dataIn.readLong() );
+                value.setLong(dataIn.readLong());
                 break;
             case PrimitiveValueNode::FLOAT_TYPE:
-                value.setFloat( dataIn.readFloat() );
+                value.setFloat(dataIn.readFloat());
                 break;
             case PrimitiveValueNode::DOUBLE_TYPE:
-                value.setDouble( dataIn.readDouble() );
+                value.setDouble(dataIn.readDouble());
                 break;
-            case PrimitiveValueNode::BYTE_ARRAY_TYPE:
-            {
+            case PrimitiveValueNode::BYTE_ARRAY_TYPE: {
                 int size = dataIn.readInt();
                 std::vector<unsigned char> data;
-                if( size > 0 ) {
-                    data.resize( size );
-                    dataIn.readFully( &data[0], size );
+                if (size > 0) {
+                    data.resize(size);
+                    dataIn.readFully(&data[0], size);
                 }
-                value.setByteArray( data );
+                value.setByteArray(data);
                 break;
             }
-            case PrimitiveValueNode::STRING_TYPE:
-            {
+            case PrimitiveValueNode::STRING_TYPE: {
                 int utfLength = dataIn.readShort();
-                if( utfLength > 0 ) {
+                if (utfLength > 0) {
 
-                    std::vector<unsigned char> buffer( utfLength );
-                    dataIn.readFully( &buffer[0], utfLength );
-                    value.setString( std::string( (char*)( &buffer[0] ), utfLength ) );
+                    std::vector<unsigned char> buffer(utfLength);
+                    dataIn.readFully(&buffer[0], utfLength);
+                    value.setString(std::string((char*) (&buffer[0]), utfLength));
                 }
                 break;
             }
-            case PrimitiveValueNode::BIG_STRING_TYPE:
-            {
+            case PrimitiveValueNode::BIG_STRING_TYPE: {
                 int utfLength = dataIn.readInt();
-                if( utfLength > 0 ) {
+                if (utfLength > 0) {
 
-                    std::vector<unsigned char> buffer( utfLength );
-                    dataIn.readFully( &buffer[0], utfLength );
-                    value.setString( std::string( (char*)( &buffer[0] ), utfLength ) );
+                    std::vector<unsigned char> buffer(utfLength);
+                    dataIn.readFully(&buffer[0], utfLength);
+                    value.setString(std::string((char*) (&buffer[0]), utfLength));
                 }
                 break;
             }
-            case PrimitiveValueNode::LIST_TYPE:
-            {
+            case PrimitiveValueNode::LIST_TYPE: {
                 PrimitiveList list;
-                PrimitiveTypesMarshaller::unmarshalPrimitiveList( dataIn, list );
-                value.setList( list );
+                PrimitiveTypesMarshaller::unmarshalPrimitiveList(dataIn, list);
+                value.setList(list);
                 break;
             }
-            case PrimitiveValueNode::MAP_TYPE:
-            {
+            case PrimitiveValueNode::MAP_TYPE: {
                 PrimitiveMap map;
-                PrimitiveTypesMarshaller::unmarshalPrimitiveMap( dataIn, map );
-                value.setMap( map );
+                PrimitiveTypesMarshaller::unmarshalPrimitiveMap(dataIn, map);
+                value.setMap(map);
                 break;
             }
             default:
                 throw IOException(
-                    __FILE__,
-                    __LINE__,
-                    "PrimitiveTypesMarshaller::unmarshalPrimitive - "
-                    "Unsupported data type: ");
+                __FILE__,
+                __LINE__, "PrimitiveTypesMarshaller::unmarshalPrimitive - "
+                        "Unsupported data type: ");
         }
 
         return value;
     }
-    AMQ_CATCH_RETHROW( io::IOException )
-    AMQ_CATCH_EXCEPTION_CONVERT( Exception, io::IOException )
-    AMQ_CATCHALL_THROW( io::IOException )
+    AMQ_CATCH_RETHROW(io::IOException)
+    AMQ_CATCH_EXCEPTION_CONVERT(Exception, io::IOException)
+    AMQ_CATCHALL_THROW(io::IOException)
 }

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/35c570ba/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
index 36d7b4d..3f76b92 100644
--- a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
+++ b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.cpp
@@ -46,76 +46,132 @@ MapMessageTest::~MapMessageTest() {
 void MapMessageTest::testEmptyMapSendReceive() {
 
     // Create CMS Object for Comms
-    cms::Session* session( cmsProvider->getSession() );
+    cms::Session* session(cmsProvider->getSession());
     cms::MessageConsumer* consumer = cmsProvider->getConsumer();
     cms::MessageProducer* producer = cmsProvider->getProducer();
-    producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT );
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
 
-    auto_ptr<cms::MapMessage> mapMessage( session->createMapMessage() );
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
 
     // Send some text messages
-    producer->send( mapMessage.get() );
+    producer->send(mapMessage.get());
 
-    auto_ptr<cms::Message> message( consumer->receive( 2000 ) );
-    CPPUNIT_ASSERT( message.get() != NULL );
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
 
-    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>( message.get() );
-    CPPUNIT_ASSERT( recvMapMessage != NULL );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "SomeKey" ) == false );
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("SomeKey") == false);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 void MapMessageTest::testMapWithEmptyStringValue() {
 
     // Create CMS Object for Comms
-    cms::Session* session( cmsProvider->getSession() );
+    cms::Session* session(cmsProvider->getSession());
     cms::MessageConsumer* consumer = cmsProvider->getConsumer();
     cms::MessageProducer* producer = cmsProvider->getProducer();
-    producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT );
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
 
-    auto_ptr<cms::MapMessage> mapMessage( session->createMapMessage() );
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
 
     mapMessage->setString("String1", "");
     mapMessage->setString("String2", "value");
 
     // Send some text messages
-    producer->send( mapMessage.get() );
-
-    auto_ptr<cms::Message> message( consumer->receive( 2000 ) );
-    CPPUNIT_ASSERT( message.get() != NULL );
-
-    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>( message.get() );
-    CPPUNIT_ASSERT( recvMapMessage != NULL );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "String1" ) == true );
-    CPPUNIT_ASSERT( recvMapMessage->getString( "String1" ) == "" );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "String2" ) == true );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "String3" ) == false );
-    CPPUNIT_ASSERT( recvMapMessage->getString( "String2" ) == string( "value" ) );
+    producer->send(mapMessage.get());
+
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
+
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getString("String1") == "");
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String2") == true);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String3") == false);
+    CPPUNIT_ASSERT(recvMapMessage->getString("String2") == string("value"));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void MapMessageTest::testMapWithSingleCharEntry() {
+
+    // Create CMS Object for Comms
+    cms::Session* session(cmsProvider->getSession());
+    cms::MessageConsumer* consumer = cmsProvider->getConsumer();
+    cms::MessageProducer* producer = cmsProvider->getProducer();
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
+
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
+
+    mapMessage->setChar("Char1", 'a');
+
+    // Send some text messages
+    producer->send(mapMessage.get());
+
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
+
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getChar("Char1") == 'a');
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char2") == false);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void MapMessageTest::testMapWithCharAndStringEntry() {
+
+    // Create CMS Object for Comms
+    cms::Session* session(cmsProvider->getSession());
+    cms::MessageConsumer* consumer = cmsProvider->getConsumer();
+    cms::MessageProducer* producer = cmsProvider->getProducer();
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
+
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
+
+    mapMessage->setChar("Char1", 'a');
+    mapMessage->setString("String1", "string");
+
+    // Send some text messages
+    producer->send(mapMessage.get());
+
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
+
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getChar("Char1") == 'a');
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("Char2") == false);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String1") == true);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("String3") == false);
+    CPPUNIT_ASSERT(recvMapMessage->getString("String1") == string("string"));
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 void MapMessageTest::testMapSetEmptyBytesVector() {
 
     // Create CMS Object for Comms
-    cms::Session* session( cmsProvider->getSession() );
+    cms::Session* session(cmsProvider->getSession());
     cms::MessageConsumer* consumer = cmsProvider->getConsumer();
     cms::MessageProducer* producer = cmsProvider->getProducer();
-    producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT );
+    producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
 
-    auto_ptr<cms::MapMessage> mapMessage( session->createMapMessage() );
+    auto_ptr<cms::MapMessage> mapMessage(session->createMapMessage());
 
     std::vector<unsigned char> bytes;
 
-    mapMessage->setBytes( "BYTES", bytes );
+    mapMessage->setBytes("BYTES", bytes);
 
     // Send some text messages
-    producer->send( mapMessage.get() );
+    producer->send(mapMessage.get());
 
-    auto_ptr<cms::Message> message( consumer->receive( 2000 ) );
-    CPPUNIT_ASSERT( message.get() != NULL );
+    auto_ptr<cms::Message> message(consumer->receive(2000));
+    CPPUNIT_ASSERT(message.get() != NULL);
 
-    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>( message.get() );
-    CPPUNIT_ASSERT( recvMapMessage != NULL );
-    CPPUNIT_ASSERT( recvMapMessage->itemExists( "BYTES" ) == true );
-    CPPUNIT_ASSERT( recvMapMessage->getBytes( "BYTES" ).empty() == true );
+    cms::MapMessage* recvMapMessage = dynamic_cast<MapMessage*>(message.get());
+    CPPUNIT_ASSERT(recvMapMessage != NULL);
+    CPPUNIT_ASSERT(recvMapMessage->itemExists("BYTES") == true);
+    CPPUNIT_ASSERT(recvMapMessage->getBytes("BYTES").empty() == true);
 }

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/35c570ba/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
index 06b4768..b1b1015 100644
--- a/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
+++ b/activemq-cpp/src/test-integration/activemq/test/MapMessageTest.h
@@ -33,6 +33,8 @@ namespace test {
         void testEmptyMapSendReceive();
         void testMapWithEmptyStringValue();
         void testMapSetEmptyBytesVector();
+        void testMapWithSingleCharEntry();
+        void testMapWithCharAndStringEntry();
 
     };
 

http://git-wip-us.apache.org/repos/asf/activemq-cpp/blob/35c570ba/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
----------------------------------------------------------------------
diff --git a/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h b/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
index aebf7d7..6e428fd 100644
--- a/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
+++ b/activemq-cpp/src/test-integration/activemq/test/openwire/OpenwireMapMessageTest.h
@@ -31,6 +31,8 @@ namespace openwire {
         CPPUNIT_TEST( testEmptyMapSendReceive );
         CPPUNIT_TEST( testMapWithEmptyStringValue );
         CPPUNIT_TEST( testMapSetEmptyBytesVector );
+        CPPUNIT_TEST( testMapWithSingleCharEntry );
+        CPPUNIT_TEST( testMapWithCharAndStringEntry );
         CPPUNIT_TEST_SUITE_END();
 
     public: