You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ri...@apache.org on 2006/12/12 18:51:52 UTC

svn commit: r486254 - in /incubator/qpid/trunk/qpid/java: client/src/main/java/org/apache/qpid/client/message/ client/src/test/java/org/apache/qpid/test/unit/basic/ client/src/test/java/org/apache/qpid/test/unit/client/message/ common/src/main/java/org...

Author: ritchiem
Date: Tue Dec 12 09:51:51 2006
New Revision: 486254

URL: http://svn.apache.org/viewvc?view=rev&rev=486254
Log:
QPID-164
JMSMapMessage.java - fixed incorrect exceptions and return values. Data now sent as a Bytes message.
MapMessageTest.java - updated to be more through with the testing of the returned message
EncodingUtils.java - added unsignedIntegerLength()
FieldTableFactory.java - removed specific PropertyFieldTable reference
PropertyFieldTable.java - fixed encoding issues that were causing BufferOverflow errors.
PropertyFieldTableTest.java - added test to ensure that the encoding size is correct for ALL types.

Modified:
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java
    incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java
    incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/basic/MapMessageTest.java
    incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java
    incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
    incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessage.java Tue Dec 12 09:51:51 2006
@@ -21,16 +21,21 @@
 package org.apache.qpid.client.message;
 
 import org.apache.mina.common.ByteBuffer;
-import org.apache.qpid.framing.BasicContentHeaderProperties;
 import org.apache.qpid.framing.PropertyFieldTable;
 import org.apache.qpid.framing.FieldTableFactory;
+import org.apache.qpid.framing.ContentHeaderBody;
+import org.apache.qpid.framing.EncodingUtils;
 import org.apache.qpid.AMQException;
+import org.apache.log4j.Logger;
 
 import javax.jms.JMSException;
+import javax.jms.MessageFormatException;
 import java.util.Enumeration;
 
-public class JMSMapMessage extends JMSTextMessage implements javax.jms.MapMessage
+public class JMSMapMessage extends JMSBytesMessage implements javax.jms.MapMessage
 {
+    private static final Logger _logger = Logger.getLogger(JMSMapMessage.class);
+
 
     public static final String MIME_TYPE = "jms/map-message";
 
@@ -38,48 +43,38 @@
 
     JMSMapMessage() throws JMSException
     {
-        this(null, null);
+        this(null);
     }
 
-    JMSMapMessage(ByteBuffer data, String encoding) throws JMSException
+    JMSMapMessage(ByteBuffer data) throws JMSException
     {
         super(data); // this instantiates a content header
-        getJmsContentHeaderProperties().setContentType(MIME_TYPE);
-        getJmsContentHeaderProperties().setEncoding(encoding);
         _map = new PropertyFieldTable();
     }
 
 
-    JMSMapMessage(long deliveryTag, BasicContentHeaderProperties contentHeader, ByteBuffer data)
+    JMSMapMessage(long messageNbr, ContentHeaderBody contentHeader, ByteBuffer data)
             throws AMQException
     {
-        super(deliveryTag, contentHeader, data);
-        contentHeader.setContentType(MIME_TYPE);
+        super(messageNbr, contentHeader, data);
 
-        try
-        {
-            _map = FieldTableFactory.newFieldTable(getText());
-        }
-        catch (JMSException e)
+        if (data != null)
         {
-            throw new AMQException(e.getMessage(), e);
-        }
-    }
 
-    // AbstractJMSMessage Interface
+            long tableSize = EncodingUtils.readInteger(_data);
+            _map = (PropertyFieldTable) FieldTableFactory.newFieldTable(_data, tableSize);
 
-    public void clearBodyImpl() throws JMSException
-    {
-        if (_data != null)
+        }
+        else
         {
-            _data.release();
+            _map = (PropertyFieldTable) FieldTableFactory.newFieldTable();
         }
-        _data = null;
     }
 
+
     public String toBodyString() throws JMSException
     {
-        return _map.toString();
+        return "MapSize:" + _map.getEncodedSize() + "\nMapData:\n" + _map.toString();
     }
 
     public String getMimeType()
@@ -95,7 +90,23 @@
 
         if (b == null)
         {
-            b = Boolean.valueOf(_map.getString(string));
+            if (_map.containsKey(string))
+            {
+                Object str = _map.getObject(string);
+
+                if (str == null || !(str instanceof String))
+                {
+                    throw new MessageFormatException("getBoolean can't use " + string + " item.");
+                }
+                else
+                {
+                    return Boolean.valueOf((String) str);
+                }
+            }
+            else
+            {
+                b = Boolean.valueOf(null);
+            }
         }
 
         return b;
@@ -106,26 +117,55 @@
         Byte b = _map.getByte(string);
         if (b == null)
         {
-            b = Byte.valueOf(_map.getString(string));
+            if (_map.containsKey(string))
+            {
+                Object str = _map.getObject(string);
+
+                if (str == null || !(str instanceof String))
+                {
+                    throw new MessageFormatException("getByte can't use " + string + " item.");
+                }
+                else
+                {
+                    return Byte.valueOf((String) str);
+                }
+            }
+            else
+            {
+                b = Byte.valueOf(null);
+            }
         }
+
         return b;
     }
 
     public short getShort(String string) throws JMSException
     {
-        Short s = _map.getShort(string);
-
-        if (s == null)
         {
-            s = Short.valueOf(getByte(string));
-        }
+            Short s = _map.getShort(string);
 
-        return s;
+            if (s == null)
+            {
+                s = Short.valueOf(getByte(string));
+            }
+
+            return s;
+        }
     }
 
     public char getChar(String string) throws JMSException
     {
-        return _map.getCharacter(string);
+
+        Character result = _map.getCharacter(string);
+
+        if (result == null)
+        {
+            throw new MessageFormatException("getChar couldn't find " + string + " item.");
+        }
+        else
+        {
+            return result;
+        }
     }
 
     public int getInt(String string) throws JMSException
@@ -142,6 +182,7 @@
 
     public long getLong(String string) throws JMSException
     {
+
         Long l = _map.getLong(string);
 
         if (l == null)
@@ -150,18 +191,38 @@
         }
 
         return l;
+
     }
 
     public float getFloat(String string) throws JMSException
     {
+
         Float f = _map.getFloat(string);
 
         if (f == null)
         {
-            f = Float.valueOf(_map.getString(string));
+            if (_map.containsKey(string))
+            {
+                Object str = _map.getObject(string);
+
+                if (str == null || !(str instanceof String))
+                {
+                    throw new MessageFormatException("getFloat can't use " + string + " item.");
+                }
+                else
+                {
+                    return Float.valueOf((String) str);
+                }
+            }
+            else
+            {
+                f = Float.valueOf(null);
+            }
+
         }
 
         return f;
+
     }
 
     public double getDouble(String string) throws JMSException
@@ -182,8 +243,25 @@
 
         if (s == null)
         {
-            Object o = _map.getObject(string);
-            s = o.toString();
+            if (_map.containsKey(string))
+            {
+                Object o = _map.getObject(string);
+                if (o instanceof byte[])
+                {
+                    throw new MessageFormatException("getObject couldn't find " + string + " item.");
+                }
+                else
+                {
+                    if (o == null)
+                    {
+                        return null;
+                    }
+                    else
+                    {
+                        s = String.valueOf(o);
+                    }
+                }
+            }
         }
 
         return s;
@@ -191,7 +269,16 @@
 
     public byte[] getBytes(String string) throws JMSException
     {
-        return _map.getBytes(string);
+
+        byte[] result = _map.getBytes(string);
+
+        if (result == null)
+        {
+            throw new MessageFormatException("getBytes couldn't find " + string + " item.");
+        }
+
+        return result;
+
     }
 
     public Object getObject(String string) throws JMSException
@@ -282,19 +369,9 @@
 
     public ByteBuffer getData()
     {
-
-        try
-        {
-            setText(toString());
-            return super.getData();
-        }
-        catch (JMSException e)
-        {
-            // should never occur according to setText
-            //fixme -- what to do if it does occur.
-        }
-
-        return ByteBuffer.allocate(0);
+        //What if _data is null?
+        _map.writeToBuffer(_data);
+        return super.getData();
     }
 
 }

Modified: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/message/JMSMapMessageFactory.java Tue Dec 12 09:51:51 2006
@@ -36,6 +36,6 @@
 
     protected AbstractJMSMessage createMessage(long deliveryTag, ByteBuffer data, ContentHeaderBody contentHeader) throws AMQException
     {
-        return new JMSMapMessage(deliveryTag, (BasicContentHeaderProperties) contentHeader.properties, data);
+        return new JMSMapMessage(deliveryTag, contentHeader, data);
     }
 }

Modified: incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/basic/MapMessageTest.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/basic/MapMessageTest.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/basic/MapMessageTest.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/basic/MapMessageTest.java Tue Dec 12 09:51:51 2006
@@ -21,14 +21,11 @@
 package org.apache.qpid.test.unit.basic;
 
 import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQDestination;
 import org.apache.qpid.client.AMQQueue;
 import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.vmbroker.AMQVMBrokerCreationException;
-import org.apache.qpid.client.transport.TransportConnection;
-import org.apache.qpid.client.message.JMSTextMessage;
 import org.apache.qpid.client.message.JMSMapMessage;
 import org.apache.qpid.testutil.VMBrokerSetup;
+import org.apache.log4j.Logger;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -40,20 +37,26 @@
 
 public class MapMessageTest extends TestCase implements MessageListener
 {
+
+    private static final Logger _logger = Logger.getLogger(MapMessageTest.class);
+
     private AMQConnection _connection;
     private Destination _destination;
     private AMQSession _session;
     private final List<JMSMapMessage> received = new ArrayList<JMSMapMessage>();
-    private final List<String> messages = new ArrayList<String>();
+
+    private static final String MESSAGE = "Message ";
     private int _count = 100;
     public String _connectionString = "vm://:1";
     private byte[] _bytes = {99, 98, 97, 96, 95};
+    private static final float _smallfloat = 100.0f;
 
     protected void setUp() throws Exception
     {
         super.setUp();
         try
         {
+            //TransportConnection.createVMBroker(1);
             init(new AMQConnection(_connectionString, "guest", "guest", randomize("Client"), "/test_path"));
         }
         catch (Exception e)
@@ -64,7 +67,9 @@
 
     protected void tearDown() throws Exception
     {
+        _logger.info("Tearing Down unit.basic.MapMessageTest");
         super.tearDown();
+        //TransportConnection.killAllVMBrokers();
     }
 
     private void init(AMQConnection connection) throws Exception
@@ -90,7 +95,6 @@
         send(count);
         waitFor(count);
         check();
-        System.out.println("Completed without failure");
         _connection.close();
     }
 
@@ -100,40 +104,47 @@
         MessageProducer producer = _session.createProducer(_destination);
         for (int i = 0; i < count; i++)
         {
-            String text = "Message " + i;
-            messages.add(text);
             MapMessage message = _session.createMapMessage();
 
-            message.setBoolean("odd", i / 2 == 0);
-            message.setByte("byte", (byte) Byte.MAX_VALUE);
-
-            message.setBytes("bytes", _bytes);
-            message.setChar("char", (char) 'c');
-            message.setDouble("double", (double) Double.MAX_VALUE);
-            message.setFloat("float", (float) Float.MAX_VALUE);
-
-            message.setInt("messageNumber", i);
-            message.setInt("int", (int) Integer.MAX_VALUE);
-
-            message.setLong("long", (long) Long.MAX_VALUE);
-            message.setShort("short", (short) Short.MAX_VALUE);
-            message.setString("message", text);
-
-
-            message.setObject("object-bool", true);
-            message.setObject("object-byte", Byte.MAX_VALUE);
-            message.setObject("object-bytes", _bytes);
-            message.setObject("object-char", 'c');
-            message.setObject("object-double", Double.MAX_VALUE);
-            message.setObject("object-float", Float.MAX_VALUE);
-            message.setObject("object-int", Integer.MAX_VALUE);
-            message.setObject("object-long", Long.MAX_VALUE);
-            message.setObject("object-short", Short.MAX_VALUE);
+            setMapValues(message, i);
 
             producer.send(message);
         }
     }
 
+    private void setMapValues(MapMessage message, int i) throws JMSException
+    {
+        message.setBoolean("odd", i / 2 == 0);
+        message.setByte("byte", (byte) Byte.MAX_VALUE);
+        message.setBytes("bytes", _bytes);
+        message.setChar("char", (char) 'c');
+        message.setDouble("double", (double) Double.MAX_VALUE);
+        message.setFloat("float", (float) Float.MAX_VALUE);
+        message.setFloat("smallfloat", 100);
+        message.setInt("messageNumber", i);
+        message.setInt("int", (int) Integer.MAX_VALUE);
+        message.setLong("long", (long) Long.MAX_VALUE);
+        message.setShort("short", (short) Short.MAX_VALUE);
+        message.setString("message", MESSAGE + i);
+
+        //Test Setting Object Values
+        message.setObject("object-bool", true);
+        message.setObject("object-byte", Byte.MAX_VALUE);
+        message.setObject("object-bytes", _bytes);
+        message.setObject("object-char", 'c');
+        message.setObject("object-double", Double.MAX_VALUE);
+        message.setObject("object-float", Float.MAX_VALUE);
+        message.setObject("object-int", Integer.MAX_VALUE);
+        message.setObject("object-long", Long.MAX_VALUE);
+        message.setObject("object-short", Short.MAX_VALUE);
+
+        //Set a null String value
+        message.setString("nullString", null);
+        // Highlight protocol problem
+        message.setString("emptyString", "");
+
+    }
+
     void waitFor(int count) throws InterruptedException
     {
         synchronized(received)
@@ -152,80 +163,1016 @@
         for (JMSMapMessage m : received)
         {
             actual.add(m.getString("message"));
-            assertEqual(m.getInt("messageNumber"), count);
 
+            testMapValues(m, count);
 
-            assertEqual(count / 2 == 0, m.getBoolean("odd"));
-            assertEqual((byte) Byte.MAX_VALUE, m.getByte("byte"));
+            testMessageWriteStatus(m);
 
-            assertBytesEqual(_bytes, m.getBytes("bytes"));
-            assertEqual((char) 'c', m.getChar("char"));
-            assertEqual((double) Double.MAX_VALUE, m.getDouble("double"));
-            assertEqual((float) Float.MAX_VALUE, m.getFloat("float"));
-
-            assertEqual(count, m.getInt("messageNumber"));
-            assertEqual((int) Integer.MAX_VALUE, m.getInt("int"));
-            assertEqual((long) Long.MAX_VALUE, m.getLong("long"));
-            assertEqual((short) Short.MAX_VALUE, m.getShort("short"));
-
-            assertEqual(true, m.getObject("object-bool"));
-            assertEqual(Byte.MAX_VALUE, m.getObject("object-byte"));
-            assertBytesEqual(_bytes, (byte[]) m.getObject("object-bytes"));
-            assertEqual('c', m.getObject("object-char"));
-            assertEqual(Double.MAX_VALUE, m.getObject("object-double"));
-            assertEqual(Float.MAX_VALUE, m.getObject("object-float"));
-            assertEqual(Integer.MAX_VALUE, m.getObject("object-int"));
-            assertEqual(Long.MAX_VALUE, m.getObject("object-long"));
-            assertEqual(Short.MAX_VALUE, m.getObject("object-short"));
+            testPropertyWriteStatus(m);
 
+            testCorrectExceptions(m);
 
-            try
-            {
-                m.setInt("testint", 3);
-                fail("Message should not be writeable");
-            }
-            catch (MessageNotWriteableException mnwe)
-            {
-                //normal execution
-            }
+            count++;
+        }
+    }
 
-            m.clearBody();
+    private void testCorrectExceptions(JMSMapMessage m) throws JMSException
+    {
+        testBoolean(m);
 
-            try
-            {
-                m.setInt("testint", 3);
-            }
-            catch (MessageNotWriteableException mnwe)
-            {
-                Assert.fail("Message should be writeable");
-            }
+        testByte(m);
 
-            //Check property write status
-            try
-            {
-                m.setStringProperty("test", "test");
-                Assert.fail("Message should not be writeable");
-            }
-            catch (MessageNotWriteableException mnwe)
-            {
-                //normal execution
-            }
+        testBytes(m);
 
-            m.clearProperties();
+        testChar(m);
 
-            try
-            {
-                m.setStringProperty("test", "test");
-            }
-            catch (MessageNotWriteableException mnwe)
-            {
-                Assert.fail("Message should be writeable");
-            }
+        testDouble(m);
 
-            count++;
+        testFloat(m);
+
+        testInt(m);
+
+        testLong(m);
+
+        testShort(m);
+
+        testString(m);
+    }
+
+    private void testString(JMSMapMessage m) throws JMSException
+    {
+
+        Assert.assertFalse(m.getBoolean("message"));
+
+        try
+        {
+            m.getByte("message");
+            fail("Exception Expected.");
+        }
+        catch (NumberFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getShort("message");
+            fail("Exception Expected.");
+        }
+        catch (NumberFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getChar("message");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getInt("message");
+            fail("Exception Expected.");
+        }
+        catch (NumberFormatException nfe)
+        {
+            //normal execution
+        }
+        try
+        {
+            m.getLong("message");
+            fail("Exception Expected.");
+        }
+        catch (NumberFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("message");
+            fail("Exception Expected.");
+        }
+        catch (NumberFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("message");
+            fail("Exception Expected.");
+        }
+        catch (NumberFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getBytes("message");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals(MESSAGE + m.getInt("messageNumber"), m.getString("message"));
+    }
+
+    private void testShort(JMSMapMessage m) throws JMSException
+    {
+
+        //Try bad reads
+        try
+        {
+            m.getBoolean("short");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getByte("short");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals(Short.MAX_VALUE, m.getShort("short"));
+
+        //Try bad reads
+        try
+        {
+            m.getChar("short");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals(Short.MAX_VALUE, m.getInt("short"));
+
+        Assert.assertEquals(Short.MAX_VALUE, m.getLong("short"));
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("short");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("short");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getBytes("short");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + Short.MAX_VALUE, m.getString("short"));
+    }
+
+    private void testLong(JMSMapMessage m) throws JMSException
+    {
+
+        //Try bad reads
+        try
+        {
+            m.getBoolean("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getByte("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getShort("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getChar("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getInt("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals(Long.MAX_VALUE, m.getLong("long"));
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getBytes("long");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + Long.MAX_VALUE, m.getString("long"));
+    }
+
+    private void testDouble(JMSMapMessage m) throws JMSException
+    {
+
+        //Try bad reads
+        try
+        {
+            m.getBoolean("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getByte("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getShort("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getChar("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getInt("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        try
+        {
+            m.getLong("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+
+        Assert.assertEquals(Double.MAX_VALUE, m.getDouble("double"));
+
+        //Try bad reads
+        try
+        {
+            m.getBytes("double");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + Double.MAX_VALUE, m.getString("double"));
+    }
+
+
+    private void testFloat(JMSMapMessage m) throws JMSException
+    {
+
+        //Try bad reads
+        try
+        {
+            m.getBoolean("float");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getByte("float");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getShort("float");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
         }
 
-        assertEqual(messages.iterator(), actual.iterator());
+        //Try bad reads
+        try
+        {
+            m.getChar("float");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getInt("float");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        try
+        {
+            m.getLong("float");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+
+        Assert.assertEquals(Float.MAX_VALUE, m.getFloat("float"));
+
+        Assert.assertEquals(_smallfloat, (float) m.getDouble("smallfloat"));
+
+        //Try bad reads
+        try
+        {
+            m.getBytes("float");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + Float.MAX_VALUE, m.getString("float"));
+    }
+
+
+    private void testInt(JMSMapMessage m) throws JMSException
+    {
+
+        //Try bad reads
+        try
+        {
+            m.getBoolean("int");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getByte("int");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getShort("int");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getChar("int");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals(Integer.MAX_VALUE, m.getInt("int"));
+
+        Assert.assertEquals(Integer.MAX_VALUE, (int) m.getLong("int"));
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("int");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("int");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getBytes("int");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + Integer.MAX_VALUE, m.getString("int"));
+    }
+
+
+    private void testChar(JMSMapMessage m) throws JMSException
+    {
+
+        //Try bad reads
+        try
+        {
+            m.getBoolean("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getByte("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getShort("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals('c', m.getChar("char"));
+
+        try
+        {
+            m.getInt("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        try
+        {
+            m.getLong("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getBytes("char");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + 'c', m.getString("char"));
+    }
+
+    private void testBytes(JMSMapMessage m) throws JMSException
+    {
+        //Try bad reads
+        try
+        {
+            m.getBoolean("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getByte("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getShort("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getChar("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getInt("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        try
+        {
+            m.getLong("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+
+        assertBytesEqual(_bytes, m.getBytes("bytes"));
+
+        try
+        {
+            m.getString("bytes");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+
+    }
+
+    private void testByte(JMSMapMessage m) throws JMSException
+    {
+        //Try bad reads
+        try
+        {
+            m.getBoolean("byte");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals(Byte.MAX_VALUE, m.getByte("byte"));
+
+        Assert.assertEquals((short) Byte.MAX_VALUE, m.getShort("byte"));
+
+        //Try bad reads
+        try
+        {
+            m.getChar("byte");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Reading a byte as an int is ok
+        Assert.assertEquals((short) Byte.MAX_VALUE, m.getInt("byte"));
+
+        Assert.assertEquals((short) Byte.MAX_VALUE, m.getLong("byte"));
+
+        //Try bad reads
+        try
+        {
+            m.getFloat("byte");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("byte");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getBytes("byte");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + Byte.MAX_VALUE, m.getString("byte"));
+
+    }
+
+    private void testBoolean(JMSMapMessage m) throws JMSException
+    {
+
+        Assert.assertEquals((m.getInt("messageNumber") / 2) == 0, m.getBoolean("odd"));
+
+        //Try bad reads
+        try
+        {
+            m.getByte("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        //Try bad reads
+        try
+        {
+            m.getShort("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getChar("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getInt("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getLong("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getFloat("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getDouble("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+        //Try bad reads
+        try
+        {
+            m.getBytes("odd");
+            fail("Exception Expected.");
+        }
+        catch (MessageFormatException nfe)
+        {
+            //normal execution
+        }
+
+        Assert.assertEquals("" + ((m.getInt("messageNumber") / 2) == 0), m.getString("odd"));
+    }
+
+
+    private void testPropertyWriteStatus(JMSMapMessage m) throws JMSException
+    {
+        //Check property write status
+        try
+        {
+            m.setStringProperty("test", "test");
+            Assert.fail("Message should not be writeable");
+        }
+        catch (MessageNotWriteableException mnwe)
+        {
+            //normal execution
+        }
+
+        m.clearProperties();
+
+        try
+        {
+            m.setStringProperty("test", "test");
+        }
+        catch (MessageNotWriteableException mnwe)
+        {
+            Assert.fail("Message should be writeable");
+        }
+    }
+
+    private void testMessageWriteStatus(JMSMapMessage m) throws JMSException
+    {
+        try
+        {
+            m.setInt("testint", 3);
+            fail("Message should not be writeable");
+        }
+        catch (MessageNotWriteableException mnwe)
+        {
+            //normal execution
+        }
+
+        m.clearBody();
+
+        try
+        {
+            m.setInt("testint", 3);
+        }
+        catch (MessageNotWriteableException mnwe)
+        {
+            Assert.fail("Message should be writeable");
+        }
+    }
+
+    private void testMapValues(JMSMapMessage m, int count) throws JMSException
+    {
+        //Test get<Primiative>
+
+        //Boolean
+        assertEqual(count / 2 == 0, m.getBoolean("odd"));
+        assertEqual("" + (count / 2 == 0), m.getString("odd"));
+
+        //Byte
+        assertEqual(Byte.MAX_VALUE, m.getByte("byte"));
+        assertEqual("" + Byte.MAX_VALUE, m.getString("byte"));
+
+        //Bytes
+        assertBytesEqual(_bytes, m.getBytes("bytes"));
+
+        //Char
+        assertEqual('c', m.getChar("char"));
+
+        //Double
+        assertEqual(Double.MAX_VALUE, m.getDouble("double"));
+        assertEqual("" + Double.MAX_VALUE, m.getString("double"));
+
+        //Float
+        assertEqual(Float.MAX_VALUE, m.getFloat("float"));
+        assertEqual(_smallfloat, (float) m.getDouble("smallfloat"));
+        assertEqual("" + Float.MAX_VALUE, m.getString("float"));
+
+        //Integer
+        assertEqual(Integer.MAX_VALUE, m.getInt("int"));
+        assertEqual("" + Integer.MAX_VALUE, m.getString("int"));
+        assertEqual(count, m.getInt("messageNumber"));
+
+        //long
+        assertEqual(Long.MAX_VALUE, m.getLong("long"));
+        assertEqual("" + Long.MAX_VALUE, m.getString("long"));
+
+        //Short
+        assertEqual(Short.MAX_VALUE, m.getShort("short"));
+        assertEqual("" + Short.MAX_VALUE, m.getString("short"));
+        assertEqual((int) Short.MAX_VALUE, m.getInt("short"));
+
+        //String
+        assertEqual(MESSAGE + count, m.getString("message"));
+
+        //Test getObjects
+        assertEqual(true, m.getObject("object-bool"));
+        assertEqual(Byte.MAX_VALUE, m.getObject("object-byte"));
+        assertBytesEqual(_bytes, (byte[]) m.getObject("object-bytes"));
+        assertEqual('c', m.getObject("object-char"));
+        assertEqual(Double.MAX_VALUE, m.getObject("object-double"));
+        assertEqual(Float.MAX_VALUE, m.getObject("object-float"));
+        assertEqual(Integer.MAX_VALUE, m.getObject("object-int"));
+        assertEqual(Long.MAX_VALUE, m.getObject("object-long"));
+        assertEqual(Short.MAX_VALUE, m.getObject("object-short"));
+
+        //Check Special values
+        assertTrue(m.getString("nullString") == null);
+        assertTrue(m.getString("emptyString") == null);
+        _logger.warn("An emptyString should not become a null string after transmission.");
+        //assertEqual("", m.getString("emptyString"));
     }
 
     private void assertBytesEqual(byte[] expected, byte[] actual)
@@ -279,6 +1226,7 @@
     {
         synchronized(received)
         {
+            _logger.info("****************** Recevied Messgage:" + (JMSMapMessage) message);
             received.add((JMSMapMessage) message);
             received.notify();
         }

Modified: incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java (original)
+++ incubator/qpid/trunk/qpid/java/client/src/test/java/org/apache/qpid/test/unit/client/message/MapMessageTest.java Tue Dec 12 09:51:51 2006
@@ -25,6 +25,7 @@
 import org.apache.qpid.framing.PropertyFieldTable;
 import org.apache.qpid.client.message.JMSMapMessage;
 import org.apache.qpid.client.message.TestMessageHelper;
+import org.apache.log4j.Logger;
 
 import javax.jms.JMSException;
 import javax.jms.MessageFormatException;
@@ -203,7 +204,7 @@
         {
             JMSMapMessage mm = TestMessageHelper.newJMSMapMessage();
             mm.getByte("random");
-            Assert.fail("NumberFormatException should be received.");
+            Assert.fail("MessageFormatException expected");
         }
         catch (NumberFormatException e)
         {
@@ -221,7 +222,12 @@
         try
         {
             JMSMapMessage mm = TestMessageHelper.newJMSMapMessage();
-            Assert.assertEquals(null, mm.getBytes("random"));
+            mm.getBytes("random");
+            Assert.fail("MessageFormatException expected");
+        }
+        catch (MessageFormatException mfe)
+        {
+            //normal path
         }
         catch (JMSException e)
         {
@@ -235,9 +241,9 @@
         {
             JMSMapMessage mm = TestMessageHelper.newJMSMapMessage();
             mm.getChar("random");
-            Assert.fail("NullPointerException should be received.");
+            Assert.fail("MessageFormatException expected");
         }
-        catch (NullPointerException e)
+        catch (MessageFormatException e)
         {
             //normal execution
         }

Modified: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java (original)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java Tue Dec 12 09:51:51 2006
@@ -100,7 +100,7 @@
 
     public static int encodedContentLength(Content table)
     {
-    	// TODO: New Content class required for AMQP 0-9.
+        // TODO: New Content class required for AMQP 0-9.
         return 0;
     }
 
@@ -114,7 +114,7 @@
             {
                 encodedString[i] = (byte) cha[i];
             }
-            writeBytes(buffer,encodedString);
+            writeBytes(buffer, encodedString);
         }
         else
         {
@@ -199,6 +199,12 @@
         }
     }
 
+
+    public static long unsignedIntegerLength()
+    {
+        return 4;
+    }
+
     public static void writeUnsignedInteger(ByteBuffer buffer, long l)
     {
         // TODO: Is this comparison safe? Do I need to cast RHS to long?
@@ -233,7 +239,7 @@
 
     public static void writeContentBytes(ByteBuffer buffer, Content content)
     {
-    	// TODO: New Content class required for AMQP 0-9.
+        // TODO: New Content class required for AMQP 0-9.
     }
 
     public static void writeBooleans(ByteBuffer buffer, boolean[] values)
@@ -302,8 +308,8 @@
 
     public static Content readContent(ByteBuffer buffer) throws AMQFrameDecodingException
     {
-    	// TODO: New Content class required for AMQP 0-9.
-    	return null;
+        // TODO: New Content class required for AMQP 0-9.
+        return null;
     }
 
     public static String readShortString(ByteBuffer buffer)
@@ -601,5 +607,10 @@
             // really writing out unsigned byte
             buffer.put((byte) 0);
         }
+    }
+
+    public static long encodedCharacterLength()
+    {
+        return encodedShortStringLength("c");
     }
 }

Modified: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java (original)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java Tue Dec 12 09:51:51 2006
@@ -34,7 +34,7 @@
         return new PropertyFieldTable(byteBuffer, length);
     }
 
-    public static PropertyFieldTable newFieldTable(String text)
+    public static FieldTable newFieldTable(String text)
     {
         return new PropertyFieldTable(text);
     }

Modified: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java (original)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java Tue Dec 12 09:51:51 2006
@@ -79,7 +79,7 @@
 
     private LinkedHashMap<String, Object> _properties;
     private LinkedHashMap<String, String> _propertyNamesTypeMap;
-    private long _encodedSize = 0;
+    private long _encodedSize = 0;//EncodingUtils.unsignedIntegerLength();
 
     public PropertyFieldTable()
     {
@@ -138,7 +138,7 @@
     public Boolean getBoolean(String string)
     {
         Object o = get(string, BOOLEAN_PROPERTY_PREFIX);
-        if (o != null)
+        if (o != null && o instanceof Boolean)
         {
             return (Boolean) o;
         }
@@ -209,7 +209,7 @@
         }
         else
         {
-            return null;
+            return null;     //Float.valueOf(null); ???
         }
     }
 
@@ -235,7 +235,43 @@
         }
         else
         {
-            return null;
+            String type = _propertyNamesTypeMap.get(string);
+
+            if (type == null)
+            {
+                return null;
+            }
+            else
+            {
+                char itype = type.charAt(0);
+
+                Object value = _properties.get(string);
+
+                switch (itype)
+                {
+                    case STRING_PROPERTY_PREFIX:
+                    case BYTES_PROPERTY_PREFIX:
+                        return null;
+                    default:
+                    case BYTE_PROPERTY_PREFIX:
+                    case BOOLEAN_PROPERTY_PREFIX:
+                    case SHORT_PROPERTY_PREFIX:
+                    case INT_PROPERTY_PREFIX:
+                    case LONG_PROPERTY_PREFIX:
+                    case FLOAT_PROPERTY_PREFIX:
+                    case DOUBLE_PROPERTY_PREFIX:
+                        return String.valueOf(value);
+                    case CHAR_PROPERTY_PREFIX:
+                        if (value == null)
+                        {
+                            throw new NullPointerException("null char cannot be converted to String");
+                        }
+                        else
+                        {
+                            return String.valueOf(value);
+                        }
+                }
+            }
         }
     }
 
@@ -902,6 +938,8 @@
         }
 
         EncodingUtils.writeUnsignedInteger(buffer, _encodedSize);
+        //EncodingUtils.writeLong(buffer, _encodedSize);
+
 
         putDataInBuffer(buffer);
     }
@@ -959,7 +997,17 @@
         String propertyName = key.substring(1);
         char propertyPrefix = _propertyNamesTypeMap.get(propertyName).charAt(0);
 
-        if (value != null)
+        if (_logger.isDebugEnabled())
+        {
+            _logger.debug("Put:" + propertyName +
+                          " encoding Now:" + _encodedSize +
+                          " name size= " + EncodingUtils.encodedShortStringLength(propertyName) +
+                          " value size= " + getEncodingSize(key, value));
+        }
+
+        // This prevents the item from being sent.
+        // JMS needs these propertyNames for lookups.
+        //if (value != null)
         {
             //Add the size of the propertyName
             _encodedSize += EncodingUtils.encodedShortStringLength(propertyName);
@@ -972,6 +1020,11 @@
             _encodedSize += getEncodingSize(key, value);
         }
 
+        if (_logger.isDebugEnabled())
+        {
+            _logger.debug("Put: new encodingSize " + _encodedSize);
+        }
+
         _properties.put((String) propertyName, value);
 
         return previous;
@@ -1046,6 +1099,7 @@
 
     private void putDataInBuffer(ByteBuffer buffer)
     {
+
         final Iterator it = _properties.entrySet().iterator();
 
         //If there are values then write out the encoded Size... could check _encodedSize != 0
@@ -1054,84 +1108,113 @@
 
         while (it.hasNext())
         {
+
             Map.Entry me = (Map.Entry) it.next();
             String propertyName = (String) me.getKey();
 
             //The type value
             char propertyPrefix = _propertyNamesTypeMap.get(propertyName).charAt(0);
-            //The actual param name skipping type
 
-            EncodingUtils.writeShortStringBytes(buffer, propertyName);
             Object value = me.getValue();
-
-            switch (propertyPrefix)
+            try
             {
 
-                case BOOLEAN_PROPERTY_PREFIX:
-                    buffer.put((byte) BOOLEAN_PROPERTY_PREFIX);
-                    EncodingUtils.writeBoolean(buffer, (Boolean) value);
-                    break;
-                case BYTE_PROPERTY_PREFIX:
-                    buffer.put((byte) BYTE_PROPERTY_PREFIX);
-                    EncodingUtils.writeByte(buffer, (Byte) value);
-                    break;
-                case SHORT_PROPERTY_PREFIX:
-                    buffer.put((byte) SHORT_PROPERTY_PREFIX);
-                    EncodingUtils.writeShort(buffer, (Short) value);
-                    break;
-                case INT_PROPERTY_PREFIX:
-                    buffer.put((byte) INT_PROPERTY_PREFIX);
-                    EncodingUtils.writeInteger(buffer, (Integer) value);
-                    break;
-                case AMQP_UNSIGNEDINT_PROPERTY_PREFIX: // Currently we don't create these
-                    buffer.put((byte) AMQP_UNSIGNEDINT_PROPERTY_PREFIX);
-                    EncodingUtils.writeUnsignedInteger(buffer, (Long) value);
-                    break;
-                case LONG_PROPERTY_PREFIX:
-                    buffer.put((byte) LONG_PROPERTY_PREFIX);
-                    EncodingUtils.writeLong(buffer, (Long) value);
-                    break;
-                case FLOAT_PROPERTY_PREFIX:
-                    buffer.put((byte) FLOAT_PROPERTY_PREFIX);
-                    EncodingUtils.writeFloat(buffer, (Float) value);
-                    break;
-                case DOUBLE_PROPERTY_PREFIX:
-                    buffer.put((byte) DOUBLE_PROPERTY_PREFIX);
-                    EncodingUtils.writeDouble(buffer, (Double) value);
-                    break;
+                if (_logger.isDebugEnabled())
+                {
+                    _logger.debug("Writing Property:" + propertyName +
+                                  " Type:" + propertyPrefix +
+                                  " Value:" + value);
+                    _logger.debug("Buffer Position:" + buffer.position() +
+                                  " Remaining:" + buffer.remaining());
+                }
 
-                case AMQP_WIDE_STRING_PROPERTY_PREFIX:
-                    //case AMQP_STRING_PROPERTY_PREFIX:
-                case STRING_PROPERTY_PREFIX:
-                    // TODO: look at using proper charset encoder
-                    buffer.put((byte) STRING_PROPERTY_PREFIX);
-                    EncodingUtils.writeLongStringBytes(buffer, (String) value);
-                    break;
+                //The actual param name skipping type
+                EncodingUtils.writeShortStringBytes(buffer, propertyName);
 
-                    //case AMQP_ASCII_STRING_PROPERTY_PREFIX:
-                case CHAR_PROPERTY_PREFIX:
-                    // TODO: look at using proper charset encoder
-                    buffer.put((byte) CHAR_PROPERTY_PREFIX);
-                    EncodingUtils.writeShortStringBytes(buffer, "" + (Character) value);
-                    break;
 
-                case BYTES_PROPERTY_PREFIX:
-                    buffer.put((byte) BYTES_PROPERTY_PREFIX);
-                    EncodingUtils.writeBytes(buffer, (byte[]) value);
-                    break;
+                switch (propertyPrefix)
+                {
 
-                case XML_PROPERTY_PREFIX:
-                    // Encode as XML
-                    buffer.put((byte) XML_PROPERTY_PREFIX);
-                    EncodingUtils.writeLongStringBytes(buffer, valueAsXML(propertyPrefix + propertyName, value));
-                    break;
-                default:
+                    case BOOLEAN_PROPERTY_PREFIX:
+                        buffer.put((byte) BOOLEAN_PROPERTY_PREFIX);
+                        EncodingUtils.writeBoolean(buffer, (Boolean) value);
+                        break;
+                    case BYTE_PROPERTY_PREFIX:
+                        buffer.put((byte) BYTE_PROPERTY_PREFIX);
+                        EncodingUtils.writeByte(buffer, (Byte) value);
+                        break;
+                    case SHORT_PROPERTY_PREFIX:
+                        buffer.put((byte) SHORT_PROPERTY_PREFIX);
+                        EncodingUtils.writeShort(buffer, (Short) value);
+                        break;
+                    case INT_PROPERTY_PREFIX:
+                        buffer.put((byte) INT_PROPERTY_PREFIX);
+                        EncodingUtils.writeInteger(buffer, (Integer) value);
+                        break;
+                    case AMQP_UNSIGNEDINT_PROPERTY_PREFIX: // Currently we don't create these
+                        buffer.put((byte) AMQP_UNSIGNEDINT_PROPERTY_PREFIX);
+                        EncodingUtils.writeUnsignedInteger(buffer, (Long) value);
+                        break;
+                    case LONG_PROPERTY_PREFIX:
+                        buffer.put((byte) LONG_PROPERTY_PREFIX);
+                        EncodingUtils.writeLong(buffer, (Long) value);
+                        break;
+                    case FLOAT_PROPERTY_PREFIX:
+                        buffer.put((byte) FLOAT_PROPERTY_PREFIX);
+                        EncodingUtils.writeFloat(buffer, (Float) value);
+                        break;
+                    case DOUBLE_PROPERTY_PREFIX:
+                        buffer.put((byte) DOUBLE_PROPERTY_PREFIX);
+                        EncodingUtils.writeDouble(buffer, (Double) value);
+                        break;
+
+                    case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+                        //case AMQP_STRING_PROPERTY_PREFIX:
+                    case STRING_PROPERTY_PREFIX:
+                        // TODO: look at using proper charset encoder
+                        buffer.put((byte) STRING_PROPERTY_PREFIX);
+                        EncodingUtils.writeLongStringBytes(buffer, (String) value);
+                        break;
+
+                        //case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+                    case CHAR_PROPERTY_PREFIX:
+                        // TODO: look at using proper charset encoder
+                        buffer.put((byte) CHAR_PROPERTY_PREFIX);
+                        EncodingUtils.writeShortStringBytes(buffer, "" + (Character) value);
+                        break;
+
+                    case BYTES_PROPERTY_PREFIX:
+                        buffer.put((byte) BYTES_PROPERTY_PREFIX);
+                        EncodingUtils.writeBytes(buffer, (byte[]) value);
+                        break;
+
+                    case XML_PROPERTY_PREFIX:
+                        // Encode as XML
+                        buffer.put((byte) XML_PROPERTY_PREFIX);
+                        EncodingUtils.writeLongStringBytes(buffer, valueAsXML(propertyPrefix + propertyName, value));
+                        break;
+                    default:
+                    {
+                        // Should never get here
+                        throw new IllegalArgumentException("Key '" + propertyName + "': Unsupported type in field table, type: " + ((value == null) ? "null-object" : value.getClass()));
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                if (_logger.isDebugEnabled())
                 {
-                    // Should never get here
-                    throw new IllegalArgumentException("Key '" + propertyName + "': Unsupported type in field table, type: " + ((value == null) ? "null-object" : value.getClass()));
+                    _logger.debug("Exception thrown:" + e);
+                    _logger.debug("Writing Property:" + propertyName +
+                                  " Type:" + propertyPrefix +
+                                  " Value:" + value);
+                    _logger.debug("Buffer Position:" + buffer.position() +
+                                  " Remaining:" + buffer.remaining());
                 }
+                throw new RuntimeException(e);
             }
         }
+
     }
 
 
@@ -1207,6 +1290,12 @@
             if (type != XML_PROPERTY_PREFIX)
             {
                 setObject(key, value);
+                if (value == null)
+                {
+                    _logger.debug("setFromBuffer: value is null for key:" + key);
+                    _propertyNamesTypeMap.put(key, "" + type);
+                    _properties.put(key, null);
+                }
             }
         }
 
@@ -1224,47 +1313,47 @@
      */
     private static int getEncodingSize(String name, Object value)
     {
-        int encodingSize;
+        int encodingSize = 1; // Initialy 1 to cover the char prefix
 
         char propertyPrefix = name.charAt(0);
 
         switch (propertyPrefix)
         {
             case BOOLEAN_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedBooleanLength();
+                encodingSize += EncodingUtils.encodedBooleanLength();
                 break;
             case BYTE_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedByteLength();
+                encodingSize += EncodingUtils.encodedByteLength();
                 break;
             case SHORT_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedShortLength();
+                encodingSize += EncodingUtils.encodedShortLength();
                 break;
             case INT_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedIntegerLength();
+                encodingSize += EncodingUtils.encodedIntegerLength();
                 break;
             case LONG_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedLongLength();
+                encodingSize += EncodingUtils.encodedLongLength();
                 break;
             case FLOAT_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedFloatLength();
+                encodingSize += EncodingUtils.encodedFloatLength();
                 break;
             case DOUBLE_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedDoubleLength();
+                encodingSize += EncodingUtils.encodedDoubleLength();
                 break;
             case AMQP_WIDE_STRING_PROPERTY_PREFIX:
                 //case AMQP_STRING_PROPERTY_PREFIX:
             case STRING_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedLongStringLength((String) value);
+                encodingSize += EncodingUtils.encodedLongStringLength((String) value);
                 break;
                 //case AMQP_ASCII_STRING_PROPERTY_PREFIX:
             case CHAR_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedShortStringLength("" + (Character) value);
+                encodingSize += EncodingUtils.encodedShortStringLength("" + (Character) value);
                 break;
             case BYTES_PROPERTY_PREFIX:
-                encodingSize = 1 + ((byte[]) value).length;
+                encodingSize += 1 + ((byte[]) value).length;
                 break;
             case XML_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedLongStringLength(valueAsXML(name, value));
+                encodingSize += EncodingUtils.encodedLongStringLength(valueAsXML(name, value));
                 break;
             default:
                 //encodingSize = 1 + EncodingUtils.encodedLongStringLength(String.valueOf(value));

Modified: incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java?view=diff&rev=486254&r1=486253&r2=486254
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java (original)
+++ incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java Tue Dec 12 09:51:51 2006
@@ -65,7 +65,14 @@
     {
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setBoolean("value", true);
+        //Test Getting right value back
         Assert.assertEquals((Boolean) true, table1.getBoolean("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getBoolean("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("true", table1.getString("value"));
     }
 
     public void testByteLookup()
@@ -73,6 +80,12 @@
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setByte("value", (byte) 1);
         Assert.assertEquals((Byte) (byte) 1, table1.getByte("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getByte("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("1", table1.getString("value"));
     }
 
     public void testShortLookup()
@@ -80,6 +93,12 @@
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setShort("value", Short.MAX_VALUE);
         Assert.assertEquals((Short) Short.MAX_VALUE, table1.getShort("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getShort("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("" + Short.MAX_VALUE, table1.getString("value"));
     }
 
 
@@ -88,6 +107,12 @@
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setChar("value", 'b');
         Assert.assertEquals((Character) 'b', table1.getCharacter("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getCharacter("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("b", table1.getString("value"));
     }
 
     public void testDoubleLookup()
@@ -95,6 +120,13 @@
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setDouble("value", Double.MAX_VALUE);
         Assert.assertEquals(Double.MAX_VALUE, table1.getDouble("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getDouble("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("" + Double.MAX_VALUE, table1.getString("value"));
+
     }
 
     public void testFloatLookup()
@@ -102,6 +134,13 @@
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setFloat("value", Float.MAX_VALUE);
         Assert.assertEquals(Float.MAX_VALUE, table1.getFloat("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getFloat("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("" + Float.MAX_VALUE, table1.getString("value"));
+
     }
 
     public void testIntLookup()
@@ -109,6 +148,13 @@
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setInteger("value", Integer.MAX_VALUE);
         Assert.assertEquals((Integer) Integer.MAX_VALUE, table1.getInteger("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getInteger("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("" + Integer.MAX_VALUE, table1.getString("value"));
+
     }
 
     public void testLongLookup()
@@ -116,6 +162,13 @@
         PropertyFieldTable table1 = new PropertyFieldTable();
         table1.setLong("value", Long.MAX_VALUE);
         Assert.assertEquals((Long) Long.MAX_VALUE, table1.getLong("value"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getLong("Rubbish") == null);
+
+        //Try reading value as a string
+        Assert.assertEquals("" + Long.MAX_VALUE, table1.getString("value"));
+
     }
 
     public void testBytesLookup()
@@ -124,6 +177,9 @@
         byte[] bytes = {99, 98, 97, 96, 95};
         table1.setBytes("bytes", bytes);
         assertBytesEqual(bytes, table1.getBytes("bytes"));
+
+        //Looking up an invalid value returns null
+        Assert.assertTrue(table1.getBytes("Rubbish") == null);
     }
 
     // Failed Lookups
@@ -325,6 +381,96 @@
     }
 
     public void testEncodingSize()
+    {
+        FieldTable result = FieldTableFactory.newFieldTable();
+        int size = 0;
+
+        result.setBoolean("boolean", true);
+        size += 1 + EncodingUtils.encodedShortStringLength("boolean") + EncodingUtils.encodedBooleanLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+
+        result.setByte("byte", (byte) Byte.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("byte") + EncodingUtils.encodedByteLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+
+        byte[] _bytes = {99, 98, 97, 96, 95};
+
+        result.setBytes("bytes", _bytes);
+        size += 1 + EncodingUtils.encodedShortStringLength("bytes") + 1 + EncodingUtils.encodedByteLength() * _bytes.length;
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setChar("char", (char) 'c');
+        size += 1 + EncodingUtils.encodedShortStringLength("char") + EncodingUtils.encodedCharacterLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setDouble("double", (double) Double.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("double") + EncodingUtils.encodedDoubleLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setFloat("float", (float) Float.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("float") + EncodingUtils.encodedFloatLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setInteger("int", (int) Integer.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("int") + EncodingUtils.encodedIntegerLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+
+        result.setLong("long", (long) Long.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("long") + EncodingUtils.encodedLongLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setShort("short", (short) Short.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("short") + EncodingUtils.encodedShortLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setString("result", "Hello");
+        size += 1 + EncodingUtils.encodedShortStringLength("result") + EncodingUtils.encodedLongStringLength("Hello");
+        Assert.assertEquals(size, result.getEncodedSize());
+
+
+        result.setObject("object-bool", true);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-bool") + EncodingUtils.encodedBooleanLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setObject("object-byte", Byte.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-byte") + EncodingUtils.encodedByteLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setObject("object-bytes", _bytes);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-bytes") + 1 + EncodingUtils.encodedByteLength() * _bytes.length;
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setObject("object-char", 'c');
+        size += 1 + EncodingUtils.encodedShortStringLength("object-char") + EncodingUtils.encodedCharacterLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setObject("object-double", Double.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-double") + EncodingUtils.encodedDoubleLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setObject("object-float", Float.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-float") + EncodingUtils.encodedFloatLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setObject("object-int", Integer.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-int") + EncodingUtils.encodedIntegerLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+
+        result.setObject("object-long", Long.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-long") + EncodingUtils.encodedLongLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+        result.setObject("object-short", Short.MAX_VALUE);
+        size += 1 + EncodingUtils.encodedShortStringLength("object-short") + EncodingUtils.encodedShortLength();
+        Assert.assertEquals(size, result.getEncodedSize());
+
+    }
+
+    public void testEncodingSize1()
     {
         FieldTable result = FieldTableFactory.newFieldTable();
         int size = 0;