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/18 13:41:17 UTC

svn commit: r488251 [1/2] - in /incubator/qpid/branches/jmsselectors/java/common: ./ src/main/java/org/apache/qpid/ src/main/java/org/apache/qpid/framing/ src/main/java/org/apache/qpid/pool/ src/main/java/org/apache/qpid/protocol/ src/main/java/org/apa...

Author: ritchiem
Date: Mon Dec 18 04:41:15 2006
New Revision: 488251

URL: http://svn.apache.org/viewvc?view=rev&rev=488251
Log:
Trunk Merges

Added:
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/AMQPInvalidClassException.java
      - copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/AMQPInvalidClassException.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/Content.java
      - copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/Content.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java
      - copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/framing/JMSPropertyFieldTable.java
    incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
      - copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/BasicContentHeaderPropertiesTest.java
    incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java
      - copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/framing/JMSPropertyFieldTableTest.java
    incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/pool/
      - copied from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/pool/
    incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java
      - copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/pool/PoolingFilterTest.java
    incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/session/
      - copied from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/session/
    incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/session/TestSession.java
      - copied unchanged from r488007, incubator/qpid/trunk/qpid/java/common/src/test/java/org/apache/qpid/session/TestSession.java
Modified:
    incubator/qpid/branches/jmsselectors/java/common/pom.xml
    incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java
    incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java
    incubator/qpid/branches/jmsselectors/java/common/src/test/java/org/apache/qpid/framing/PropertyFieldTableTest.java

Modified: incubator/qpid/branches/jmsselectors/java/common/pom.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/pom.xml?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/pom.xml (original)
+++ incubator/qpid/branches/jmsselectors/java/common/pom.xml Mon Dec 18 04:41:15 2006
@@ -39,14 +39,14 @@
         <spec.stylesheet>${basedir}/src/main/xsl/framing.xsl</spec.stylesheet>
         <registry.stylesheet>${basedir}/src/main/xsl/registry.xsl</registry.stylesheet>
         <registry.template>${basedir}/src/main/xsl/registry.template</registry.template>
-        <generated.path>${project.build.directory}/generated/xsl</generated.path>
+        <generated.path>${project.build.directory}/generated-sources/xsl</generated.path>
         <generated.package>org/apache/qpid/framing</generated.package>
         <generated.dir>${generated.path}/${generated.package}</generated.dir>
         <specs.dir>${topDirectoryLocation}/../specs</specs.dir>
     </properties>
 
     <build>
-        <plugins>
+        <plugins>          
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-antrun-plugin</artifactId>
@@ -77,19 +77,6 @@
         </plugins>
     </build>
 
-    <repositories>
-     <repository>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-            <id>java.net repository</id>
-            <name>Maven 1.x Repository</name>
-            <url>httsp://maven-repository.dev.java.net/nonav/repository/</url>
-            <layout>legacy</layout>
-        </repository>
-
-
-    </repositories>
     <dependencies>
         <dependency>
             <groupId>log4j</groupId>
@@ -99,18 +86,13 @@
             <groupId>org.apache.mina</groupId>
             <artifactId>mina-core</artifactId>
         </dependency>
-        <!-- dependency>
-            <groupId>grizzly</groupId>
-            <artifactId>grizzly</artifactId>
-            <version>1.0.4</version>
-        </dependency -->
          <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jms_1.1_spec</artifactId>
-        </dependency>
-        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+           <groupId>org.apache.geronimo.specs</groupId>
+           <artifactId>geronimo-jms_1.1_spec</artifactId>
         </dependency>
     </dependencies>
 </project>

Modified: incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml (original)
+++ incubator/qpid/branches/jmsselectors/java/common/protocol-version.xml Mon Dec 18 04:41:15 2006
@@ -21,6 +21,8 @@
 <project name="Qpid Common Protocol Versions" default="generate">
 
   <property name="saxon.jar" value="lib/saxon/saxon8.jar"/>
+  <!-- temporarily hard-wired XML spec version for build avoidance -->
+  <property name="amqp.xml" value="${specs.dir}/amqp-8.0.xml"/>
   
   <macrodef name="saxon">
     <attribute name="out"/>
@@ -61,8 +63,7 @@
               flags="s" byline="true"/>
 
       <!-- Create directory; generate from specification file -->
-      <mkdir dir="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}"/>
-      <saxon out="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}/results.out"
+      <saxon out="${generated.dir}/results.out"
              src="${specs.dir}/amqp-@{ver}.xml" 
              xsl="${spec.stylesheet}">
         <arg value="major=${@{ver}.amqp(major)}"/>
@@ -70,14 +71,14 @@
         <arg value="registry_name=MainRegistry"/>
       </saxon>
       <!--  -->
-      <saxon out="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}/cluster.out"
+      <saxon out="${generated.dir}/cluster.out"
              src="${cluster.asl}"
              xsl="${spec.stylesheet}">
         <arg value="major=${@{ver}.amqp(major)}"/>
         <arg value="minor=${@{ver}.amqp(minor)}"/>
         <arg value="registry_name=ClusterRegistry"/>
       </saxon>
-      <saxon out="${generated.dir}_${@{ver}.amqp(major)}_${@{ver}.amqp(minor)}/registry.out"
+      <saxon out="${generated.dir}/registry.out"
              src="${registry.template}"
              xsl="${registry.stylesheet}">
         <arg value="major=${@{ver}.amqp(major)}"/>
@@ -86,11 +87,10 @@
     </sequential>
   </macrodef>
 
-<!--  <uptodate property="generated" targetfile="${generated.dir}/results.out"
-            srcfile="${amqp.xml}"/> -->
+  <uptodate property="generated" targetfile="${generated.dir}/results.out"
+            srcfile="${amqp.xml}"/>
 
-<!--  <target name="generate" unless="generated"> -->
-  <target name="generate">
+  <target name="generate" unless="generated">
     <mkdir dir="${generated.dir}"/>
     <copy file="src/main/versions/ProtocolVersionList.java.tmpl" tofile="${proto_version}"
             overwrite="true"/>

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQBody.java Mon Dec 18 04:41:15 2006
@@ -24,7 +24,7 @@
 
 public abstract class AMQBody
 {
-    protected abstract byte getType();
+    protected abstract byte getFrameType();
     
     /** 
      * Get the size of the body

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQFrame.java Mon Dec 18 04:41:15 2006
@@ -45,7 +45,7 @@
 
     public void writePayload(ByteBuffer buffer)
     {
-        buffer.put(bodyFrame.getType());
+        buffer.put(bodyFrame.getFrameType());
         // TODO: how does channel get populated
         EncodingUtils.writeUnsignedShort(buffer, channel);
         EncodingUtils.writeUnsignedInteger(buffer, bodyFrame.getSize());

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/AMQMethodBody.java Mon Dec 18 04:41:15 2006
@@ -42,7 +42,7 @@
 
     protected abstract void writeMethodPayload(ByteBuffer buffer);
 
-    protected byte getType()
+    protected byte getFrameType()
     {
         return TYPE;
     }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/BasicContentHeaderProperties.java Mon Dec 18 04:41:15 2006
@@ -57,6 +57,8 @@
 
     private FieldTable _headers;
 
+    private JMSPropertyFieldTable _jmsHeaders;
+
     private byte _deliveryMode;
 
     private byte _priority;
@@ -276,6 +278,7 @@
             if ((_propertyFlags & (1 << 13)) > 0)
             {
                 _headers = EncodingUtils.readFieldTable(buffer);
+                setJMSHeaders();
             }
             if ((_propertyFlags & (1 << 12)) > 0)
             {
@@ -358,6 +361,8 @@
             if ((_propertyFlags & (1 << 13)) > 0)
             {
                 _headers = EncodingUtils.readFieldTable(buffer);
+                setJMSHeaders();
+
             }
             _decodedHeaders = true;
         }
@@ -446,6 +451,26 @@
         clearEncodedForm();
         _propertyFlags |= (1 << 13);
         _headers = headers;
+        setJMSHeaders();
+    }
+
+    private void setJMSHeaders()
+    {
+        if (_jmsHeaders == null)
+        {
+            _jmsHeaders = new JMSPropertyFieldTable(_headers);
+        }
+        else
+        {
+            _jmsHeaders.setFieldTable(_headers);
+        }
+    }
+
+    public JMSPropertyFieldTable getJMSHeaders()
+    {
+        //This will ensure we have a blank header
+        getHeaders();
+        return _jmsHeaders;
     }
 
     public byte getDeliveryMode()

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentBody.java Mon Dec 18 04:41:15 2006
@@ -28,7 +28,7 @@
 
     public ByteBuffer payload;
 
-    protected byte getType()
+    protected byte getFrameType()
     {
         return TYPE;
     }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/ContentHeaderBody.java Mon Dec 18 04:41:15 2006
@@ -53,7 +53,7 @@
         this.bodySize = bodySize;
     }
 
-    protected byte getType()
+    protected byte getFrameType()
     {
         return TYPE;
     }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/EncodingUtils.java Mon Dec 18 04:41:15 2006
@@ -98,6 +98,12 @@
         }
     }
 
+    public static int encodedContentLength(Content table)
+    {
+        // TODO: New Content class required for AMQP 0-9.
+        return 0;
+    }
+
     public static void writeShortStringBytes(ByteBuffer buffer, String s)
     {
         if (s != null)
@@ -108,9 +114,7 @@
             {
                 encodedString[i] = (byte) cha[i];
             }
-            // TODO: check length fits in an unsigned byte
-            writeUnsignedByte(buffer, (short) encodedString.length);
-            buffer.put(encodedString);
+            writeBytes(buffer, encodedString);
         }
         else
         {
@@ -195,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?
@@ -227,6 +237,11 @@
         }
     }
 
+    public static void writeContentBytes(ByteBuffer buffer, Content content)
+    {
+        // TODO: New Content class required for AMQP 0-9.
+    }
+
     public static void writeBooleans(ByteBuffer buffer, boolean[] values)
     {
         byte packedValue = 0;
@@ -243,6 +258,7 @@
 
     /**
      * This is used for writing longstrs.
+     *
      * @param buffer
      * @param data
      */
@@ -290,6 +306,12 @@
         }
     }
 
+    public static Content readContent(ByteBuffer buffer) throws AMQFrameDecodingException
+    {
+        // TODO: New Content class required for AMQP 0-9.
+        return null;
+    }
+
     public static String readShortString(ByteBuffer buffer)
     {
         short length = buffer.getUnsigned();
@@ -321,7 +343,7 @@
         long length = buffer.getUnsignedInt();
         if (length == 0)
         {
-            return null;
+            return "";
         }
         else
         {
@@ -363,97 +385,6 @@
         return buffer.getUnsignedInt();
     }
 
-    // Will barf with a NPE on a null input. Not sure whether it should return null or
-    // an empty field-table (which would be slower - perhaps unnecessarily).
-    //
-    // Some sample input and the result output:
-    //
-    // Input: "a=1" "a=2 c=3" "a=3 c=4 d" "a='four' b='five'" "a=bad"
-    //
-    //    Parsing <a=1>...
-    //    {a=1}
-    //    Parsing <a=2 c=3>...
-    //    {a=2, c=3}
-    //    Parsing <a=3 c=4 d>...
-    //    {a=3, c=4, d=null}
-    //    Parsing <a='four' b='five'>...
-    //    {a=four, b=five}
-    //    Parsing <a=bad>...
-    //    java.lang.IllegalArgumentException: a: Invalid integer in <bad> from <a=bad>.
-    //
-    public static FieldTable createFieldTableFromMessageSelector(String selector)
-    {
-        boolean debug = _logger.isDebugEnabled();
-
-        // TODO: Doesn't support embedded quotes properly.
-        String[] expressions = selector.split(" +");
-
-        FieldTable result = FieldTableFactory.newFieldTable();
-
-        for (int i = 0; i < expressions.length; i++)
-        {
-            String expr = expressions[i];
-
-            if (debug)
-            {
-                _logger.debug("Expression = <" + expr + ">");
-            }
-
-            int equals = expr.indexOf('=');
-
-            if (equals < 0)
-            {
-                // Existence check
-                result.put("S" + expr.trim(), null);
-            }
-            else
-            {
-                String key = expr.substring(0, equals).trim();
-                String value = expr.substring(equals + 1).trim();
-
-                if (debug)
-                {
-                    _logger.debug("Key = <" + key + ">, Value = <" + value + ">");
-                }
-
-                if (value.charAt(0) == '\'')
-                {
-                    if (value.charAt(value.length() - 1) != '\'')
-                    {
-                        throw new IllegalArgumentException(key + ": Missing quote in <" + value + "> from <" + selector + ">.");
-                    }
-                    else
-                    {
-                        value = value.substring(1, value.length() - 1);
-
-                        result.put("S" + key, value);
-                    }
-                }
-                else
-                {
-                    try
-                    {
-                        int intValue = Integer.parseInt(value);
-
-                        result.put("i" + key, value);
-                    }
-                    catch (NumberFormatException e)
-                    {
-                        throw new IllegalArgumentException(key + ": Invalid integer in <" + value + "> from <" + selector + ">.");
-
-                    }
-                }
-            }
-        }
-
-        if (debug)
-        {
-            _logger.debug("Field-table created from <" + selector + "> is <" + result + ">");
-        }
-
-        return (result);
-
-    }
 
     static byte[] hexToByteArray(String id)
     {
@@ -526,24 +457,174 @@
         return (new String(convertToHexCharArray(from)));
     }
 
-    public static void main(String[] args)
+    private static char hex_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+    //**** new methods
+
+    // AMQP_BOOLEAN_PROPERTY_PREFIX
+
+    public static void writeBoolean(ByteBuffer buffer, Boolean aBoolean)
+    {
+        buffer.put((byte) (aBoolean ? 1 : 0));
+    }
+
+    public static Boolean readBoolean(ByteBuffer buffer)
+    {
+        byte packedValue = buffer.get();
+        return (packedValue == 1);
+    }
+
+    public static int encodedBooleanLength()
+    {
+        return 1;
+    }
+
+    // AMQP_BYTE_PROPERTY_PREFIX
+    public static void writeByte(ByteBuffer buffer, Byte aByte)
+    {
+        buffer.put(aByte);
+    }
+
+    public static Byte readByte(ByteBuffer buffer)
+    {
+        return buffer.get();
+    }
+
+    public static int encodedByteLength()
+    {
+        return 1;
+    }
+
+
+    // AMQP_SHORT_PROPERTY_PREFIX
+    public static void writeShort(ByteBuffer buffer, Short aShort)
+    {
+        buffer.putShort(aShort);
+    }
+
+    public static Short readShort(ByteBuffer buffer)
+    {
+        return buffer.getShort();
+    }
+
+    public static int encodedShortLength()
+    {
+        return 2;
+    }
+
+    // INTEGER_PROPERTY_PREFIX
+    public static void writeInteger(ByteBuffer buffer, Integer aInteger)
     {
-        for (int i = 0; i < args.length; i++)
+        buffer.putInt(aInteger);
+    }
+
+    public static Integer readInteger(ByteBuffer buffer)
+    {
+        return buffer.getInt();
+    }
+
+    public static int encodedIntegerLength()
+    {
+        return 4;
+    }
+
+    // AMQP_LONG_PROPERTY_PREFIX
+    public static void writeLong(ByteBuffer buffer, Long aLong)
+    {
+        buffer.putLong(aLong);
+    }
+
+    public static Long readLong(ByteBuffer buffer)
+    {
+        return buffer.getLong();
+    }
+
+    public static int encodedLongLength()
+    {
+        return 8;
+    }
+
+    // Float_PROPERTY_PREFIX
+    public static void writeFloat(ByteBuffer buffer, Float aFloat)
+    {
+        buffer.putFloat(aFloat);
+    }
+
+    public static Float readFloat(ByteBuffer buffer)
+    {
+        return buffer.getFloat();
+    }
+
+    public static int encodedFloatLength()
+    {
+        return 4;
+    }
+
+
+    // Double_PROPERTY_PREFIX
+    public static void writeDouble(ByteBuffer buffer, Double aDouble)
+    {
+        buffer.putDouble(aDouble);
+    }
+
+    public static Double readDouble(ByteBuffer buffer)
+    {
+        return buffer.getDouble();
+    }
+
+    public static int encodedDoubleLength()
+    {
+        return 8;
+    }
+
+
+    public static byte[] readBytes(ByteBuffer buffer)
+    {
+        short length = buffer.getUnsigned();
+        if (length == 0)
+        {
+            return null;
+        }
+        else
         {
-            String selector = args[i];
+            byte[] dataBytes = new byte[length];
+            buffer.get(dataBytes, 0, length);
 
-            System.err.println("Parsing <" + selector + ">...");
+            return dataBytes;
+        }
+    }
 
-            try
-            {
-                System.err.println(createFieldTableFromMessageSelector(selector));
-            }
-            catch (IllegalArgumentException e)
-            {
-                System.err.println(e);
-            }
+    public static void writeBytes(ByteBuffer buffer, byte[] data)
+    {
+        if (data != null)
+        {
+            // TODO: check length fits in an unsigned byte            
+            writeUnsignedByte(buffer, (short) data.length);
+            buffer.put(data);
+        }
+        else
+        {
+            // really writing out unsigned byte
+            buffer.put((byte) 0);
         }
     }
 
-    private static char hex_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+    //CHAR_PROPERTY
+    public static int encodedCharLength()
+    {
+        return encodedByteLength();
+    }
+
+    public static char readChar(ByteBuffer buffer)
+    {
+        //This is valid as we know that the Character is ASCII 0..127
+        return (char) buffer.get();
+    }
+
+    public static void writeChar(ByteBuffer buffer, char character)
+    {
+        //This is valid as we know that the Character is ASCII 0..127
+        writeByte(buffer, (byte) character);
+    }
+
 }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTable.java Mon Dec 18 04:41:15 2006
@@ -93,4 +93,6 @@
 
     public Object setObject(String string, Object object);
 
+    public boolean isNullStringValue(String name);
+
 }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/FieldTableFactory.java Mon Dec 18 04:41:15 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/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/HeartbeatBody.java Mon Dec 18 04:41:15 2006
@@ -27,7 +27,7 @@
     public static final byte TYPE = 8;
     public static AMQFrame FRAME = new HeartbeatBody().toFrame();
 
-    protected byte getType()
+    protected byte getFrameType()
     {
         return TYPE;
     }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/framing/PropertyFieldTable.java Mon Dec 18 04:41:15 2006
@@ -7,9 +7,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *   http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,6 +22,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.mina.common.ByteBuffer;
+import org.apache.qpid.AMQPInvalidClassException;
 
 import java.util.Collection;
 import java.util.Enumeration;
@@ -31,32 +32,13 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.Vector;
+import java.util.HashMap;
 
 //extends FieldTable
-public class PropertyFieldTable implements FieldTable, Map
+public class PropertyFieldTable implements FieldTable
 {
     private static final Logger _logger = Logger.getLogger(PropertyFieldTable.class);
 
-
-    public static final char AMQP_DECIMAL_PROPERTY_PREFIX = 'D';
-    public static final char AMQP_UNSIGNEDINT_PROPERTY_PREFIX = 'I';
-    public static final char AMQP_TIMESTAMP_PROPERTY_PREFIX = 'T';
-    public static final char AMQP_STRING_PROPERTY_PREFIX = 'S';
-
-    public static final char BOOLEAN_PROPERTY_PREFIX = 'B';
-    public static final char BYTE_PROPERTY_PREFIX = 'b';
-    public static final char SHORT_PROPERTY_PREFIX = 's';
-    public static final char INT_PROPERTY_PREFIX = 'i';
-    public static final char LONG_PROPERTY_PREFIX = 'l';
-    public static final char FLOAT_PROPERTY_PREFIX = 'f';
-    public static final char DOUBLE_PROPERTY_PREFIX = 'd';
-    public static final char STRING_PROPERTY_PREFIX = AMQP_STRING_PROPERTY_PREFIX;
-    public static final char CHAR_PROPERTY_PREFIX = 'c';
-    public static final char BYTES_PROPERTY_PREFIX = 'y';
-
-    //Our custom prefix for encoding across the wire
-    private static final char XML_PROPERTY_PREFIX = 'X';
-
     private static final String BOOLEAN = "boolean";
     private static final String BYTE = "byte";
     private static final String BYTES = "bytes";
@@ -66,6 +48,7 @@
     private static final String FLOAT = "float";
     private static final String DOUBLE = "double";
     private static final String STRING = "string";
+    private static final String NULL_STRING = "nullstring";
     private static final String CHAR = "char";
     private static final String UNKNOWN = "unknown type";
 
@@ -74,15 +57,67 @@
     private static final String BYTES_CLOSE_XML = "</" + BYTES + ">";
     private static final String BYTES_OPEN_XML_START = "<" + BYTES;
 
+    public static enum Prefix
+    {
+        //AMQP FieldTable Wire Types
+        AMQP_DECIMAL_PROPERTY_PREFIX('D'),
+        AMQP_UNSIGNED_SHORT_PROPERTY_PREFIX('S'),
+        AMQP_UNSIGNED_INT_PROPERTY_PREFIX('I'),
+        AMQP_UNSIGNED_LONG_PROPERTY_PREFIX('L'),
+        AMQP_DOUBLE_EXTTENDED_PROPERTY_PREFIX('D'),
+
+        AMQP_TIMESTAMP_PROPERTY_PREFIX('T'),
+        AMQP_BINARY_PROPERTY_PREFIX('x'),
+
+        //Strings
+        AMQP_ASCII_STRING_PROPERTY_PREFIX('c'),
+        AMQP_WIDE_STRING_PROPERTY_PREFIX('C'),
+        AMQP_NULL_STRING_PROPERTY_PREFIX('n'),
+
+        //Java Primative Types
+        AMQP_BOOLEAN_PROPERTY_PREFIX('t'),
+        AMQP_BYTE_PROPERTY_PREFIX('b'),
+        AMQP_ASCII_CHARACTER_PROPERTY_PREFIX('k'),
+        AMQP_SHORT_PROPERTY_PREFIX('s'),
+        AMQP_INT_PROPERTY_PREFIX('i'),
+        AMQP_LONG_PROPERTY_PREFIX('l'),
+        AMQP_FLOAT_PROPERTY_PREFIX('f'),
+        AMQP_DOUBLE_PROPERTY_PREFIX('d');
+
+        private final char _identifier;
+
+        Prefix(char identifier)
+        {
+            _identifier = identifier;
+            //_reverseTypeMap.put(identifier, this);
+        }
+
+        public final char identifier()
+        {
+            return _identifier;
+        }
+
+    }
+
+    public static Map<Character, Prefix> _reverseTypeMap = new HashMap<Character, Prefix>();
+
+    static
+    {
+        for (Prefix p : Prefix.values())
+        {
+            _reverseTypeMap.put(p.identifier(), p);
+        }
+    }
+
     private LinkedHashMap<String, Object> _properties;
-    private LinkedHashMap<String, String> _propertyNamesTypeMap;
+    private LinkedHashMap<String, Prefix> _propertyNamesTypeMap;
     private long _encodedSize = 0;
 
     public PropertyFieldTable()
     {
         super();
         _properties = new LinkedHashMap<String, Object>();
-        _propertyNamesTypeMap = new LinkedHashMap<String, String>();
+        _propertyNamesTypeMap = new LinkedHashMap<String, Prefix>();
     }
 
     public PropertyFieldTable(String textFormat)
@@ -94,7 +129,8 @@
         }
         catch (Exception e)
         {
-            _logger.error("Unable to decode PropertyFieldTable format:" + textFormat, e);
+            _logger.warn("Unable to decode PropertyFieldTable format:" + textFormat, e);
+            throw new IllegalArgumentException("Unable to decode PropertyFieldTable format:" + textFormat);
         }
     }
 
@@ -112,17 +148,17 @@
     }
 
     // ************  Getters
-
-    private Object get(String propertyName, char prefix)
+    private Object get(String propertyName, Prefix prefix)
     {
-        String type = _propertyNamesTypeMap.get(propertyName);
+        //Retrieve the type associated with this name
+        Prefix type = _propertyNamesTypeMap.get(propertyName);
 
         if (type == null)
         {
             return null;
         }
-        
-        if (type.equals("" + prefix))
+
+        if (type.equals(prefix))
         {
             return _properties.get(propertyName);
         }
@@ -134,8 +170,8 @@
 
     public Boolean getBoolean(String string)
     {
-        Object o = get(string, BOOLEAN_PROPERTY_PREFIX);
-        if (o != null)
+        Object o = get(string, Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX);
+        if (o != null && o instanceof Boolean)
         {
             return (Boolean) o;
         }
@@ -147,7 +183,7 @@
 
     public Byte getByte(String string)
     {
-        Object o = get(string, BYTE_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_BYTE_PROPERTY_PREFIX);
         if (o != null)
         {
             return (Byte) o;
@@ -160,7 +196,7 @@
 
     public Short getShort(String string)
     {
-        Object o = get(string, SHORT_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_SHORT_PROPERTY_PREFIX);
         if (o != null)
         {
             return (Short) o;
@@ -173,7 +209,7 @@
 
     public Integer getInteger(String string)
     {
-        Object o = get(string, INT_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_INT_PROPERTY_PREFIX);
         if (o != null)
         {
             return (Integer) o;
@@ -186,7 +222,7 @@
 
     public Long getLong(String string)
     {
-        Object o = get(string, LONG_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_LONG_PROPERTY_PREFIX);
         if (o != null)
         {
             return (Long) o;
@@ -199,7 +235,7 @@
 
     public Float getFloat(String string)
     {
-        Object o = get(string, FLOAT_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_FLOAT_PROPERTY_PREFIX);
         if (o != null)
         {
             return (Float) o;
@@ -212,7 +248,7 @@
 
     public Double getDouble(String string)
     {
-        Object o = get(string, DOUBLE_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_DOUBLE_PROPERTY_PREFIX);
         if (o != null)
         {
             return (Double) o;
@@ -225,20 +261,63 @@
 
     public String getString(String string)
     {
-        Object o = get(string, STRING_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_ASCII_STRING_PROPERTY_PREFIX);
         if (o != null)
         {
             return (String) o;
         }
         else
         {
-            return null;
+            o = get(string, Prefix.AMQP_WIDE_STRING_PROPERTY_PREFIX);
+            if (o != null)
+            {
+                return (String) o;
+            }
+            else
+            {
+
+                Prefix type = _propertyNamesTypeMap.get(string);
+
+                if (type == null || type.equals(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX))
+                {
+                    return null;
+                }
+                else
+                {
+                    switch (type)
+                    {
+                        case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+                        case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+                        case AMQP_BINARY_PROPERTY_PREFIX:
+                            return null;
+                        default:
+                        case AMQP_BYTE_PROPERTY_PREFIX:
+                        case AMQP_BOOLEAN_PROPERTY_PREFIX:
+                        case AMQP_SHORT_PROPERTY_PREFIX:
+                        case AMQP_INT_PROPERTY_PREFIX:
+                        case AMQP_LONG_PROPERTY_PREFIX:
+                        case AMQP_FLOAT_PROPERTY_PREFIX:
+                        case AMQP_DOUBLE_PROPERTY_PREFIX:
+                            return String.valueOf(_properties.get(string));
+                        case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+                            Object value = _properties.get(string);
+                            if (value == null)
+                            {
+                                throw new NullPointerException("null char cannot be converted to String");
+                            }
+                            else
+                            {
+                                return String.valueOf(value);
+                            }
+                    }
+                }
+            }
         }
     }
 
     public Character getCharacter(String string)
     {
-        Object o = get(string, CHAR_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX);
         if (o != null)
         {
             return (Character) o;
@@ -251,7 +330,7 @@
 
     public byte[] getBytes(String string)
     {
-        Object o = get(string, BYTES_PROPERTY_PREFIX);
+        Object o = get(string, Prefix.AMQP_BINARY_PROPERTY_PREFIX);
         if (o != null)
         {
             return (byte[]) o;
@@ -271,47 +350,62 @@
 
     public Object setBoolean(String string, boolean b)
     {
-        return put(BOOLEAN_PROPERTY_PREFIX + string, b);
+        return put(Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX, string, b);
     }
 
     public Object setByte(String string, byte b)
     {
-        return put(BYTE_PROPERTY_PREFIX + string, b);
+        return put(Prefix.AMQP_BYTE_PROPERTY_PREFIX, string, b);
     }
 
     public Object setShort(String string, short i)
     {
-        return put(SHORT_PROPERTY_PREFIX + string, i);
+        return put(Prefix.AMQP_SHORT_PROPERTY_PREFIX, string, i);
     }
 
     public Object setInteger(String string, int i)
     {
-        return put(INT_PROPERTY_PREFIX + string, i);
+        return put(Prefix.AMQP_INT_PROPERTY_PREFIX, string, i);
     }
 
     public Object setLong(String string, long l)
     {
-        return put(LONG_PROPERTY_PREFIX + string, l);
+        return put(Prefix.AMQP_LONG_PROPERTY_PREFIX, string, l);
     }
 
     public Object setFloat(String string, float v)
     {
-        return put(FLOAT_PROPERTY_PREFIX + string, v);
+        return put(Prefix.AMQP_FLOAT_PROPERTY_PREFIX, string, v);
     }
 
     public Object setDouble(String string, double v)
     {
-        return put(DOUBLE_PROPERTY_PREFIX + string, v);
+        return put(Prefix.AMQP_DOUBLE_PROPERTY_PREFIX, string, v);
     }
 
     public Object setString(String string, String string1)
     {
-        return put(STRING_PROPERTY_PREFIX + string, string1);
+        if (string1 == null)
+        {
+            return put(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX, string, null);
+        }
+        else
+        {
+            //FIXME: determine string encoding and set either WIDE or ASCII string
+//            if ()
+            {
+                return put(Prefix.AMQP_WIDE_STRING_PROPERTY_PREFIX, string, string1);
+            }
+//            else
+//            {
+//                return put(Prefix.AMQP_ASCII_STRING_PROPERTY_PREFIX, string, string1);
+//            }
+        }
     }
 
     public Object setChar(String string, char c)
     {
-        return put(CHAR_PROPERTY_PREFIX + string, c);
+        return put(Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX, string, c);
     }
 
     public Object setBytes(String string, byte[] bytes)
@@ -321,7 +415,7 @@
 
     public Object setBytes(String string, byte[] bytes, int start, int length)
     {
-        return put(BYTES_PROPERTY_PREFIX + string, sizeByteArray(bytes, start, length));
+        return put(Prefix.AMQP_BINARY_PROPERTY_PREFIX, string, sizeByteArray(bytes, start, length));
     }
 
     private byte[] sizeByteArray(byte[] bytes, int start, int length)
@@ -344,70 +438,53 @@
         {
             return setBoolean(string, (Boolean) object);
         }
-        else
+        else if (object instanceof Byte)
         {
-            if (object instanceof Byte)
-            {
-                return setByte(string, (Byte) object);
-            }
-            else
-            {
-                if (object instanceof Short)
-                {
-                    return setShort(string, (Short) object);
-                }
-                else
-                {
-                    if (object instanceof Integer)
-                    {
-                        return setInteger(string, (Integer) object);
-                    }
-                    else
-                    {
-                        if (object instanceof Long)
-                        {
-                            return setLong(string, (Long) object);
-                        }
-                        else
-                        {
-                            if (object instanceof Float)
-                            {
-                                return setFloat(string, (Float) object);
-                            }
-                            else
-                            {
-                                if (object instanceof Double)
-                                {
-                                    return setDouble(string, (Double) object);
-                                }
-                                else
-                                {
-                                    if (object instanceof String)
-                                    {
-                                        return setString(string, (String) object);
-                                    }
-                                    else
-                                    {
-                                        if (object instanceof Character)
-                                        {
-                                            return setChar(string, (Character) object);
-                                        }
-                                        else
-                                        {
-                                            if (object instanceof byte[])
-                                            {
-                                                return setBytes(string, (byte[]) object);
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
+            return setByte(string, (Byte) object);
+        }
+        else if (object instanceof Short)
+        {
+            return setShort(string, (Short) object);
+        }
+        else if (object instanceof Integer)
+        {
+            return setInteger(string, (Integer) object);
+        }
+        else if (object instanceof Long)
+        {
+            return setLong(string, (Long) object);
+        }
+        else if (object instanceof Float)
+        {
+            return setFloat(string, (Float) object);
+        }
+        else if (object instanceof Double)
+        {
+            return setDouble(string, (Double) object);
+        }
+        else if (object instanceof String)
+        {
+            return setString(string, (String) object);
+        }
+        else if (object instanceof Character)
+        {
+            return setChar(string, (Character) object);
         }
-        return null;
+        else if (object instanceof byte[])
+        {
+            return setBytes(string, (byte[]) object);
+        }
+
+        throw new AMQPInvalidClassException("Only Primatives objects allowed Object is:" + object.getClass());
+    }
+
+
+    public boolean isNullStringValue(String name)
+    {
+        return _properties.containsKey(name) && (_properties.get(name) == null) &&
+               _propertyNamesTypeMap.get(name).equals(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX);
+                
+
     }
 
     // ***** Methods
@@ -430,23 +507,12 @@
 
     public boolean propertyExists(String propertyName)
     {
-        return _propertyNamesTypeMap.containsKey(propertyName);
+        return itemExists(propertyName);
     }
 
     public boolean itemExists(String string)
     {
-        Iterator keys = _properties.keySet().iterator();
-
-        while (keys.hasNext())
-        {
-            String key = (String) keys.next();
-
-            if (key.endsWith(string))
-            {
-                return true;
-            }
-        }
-        return false;
+        return _properties.containsKey(string);
     }
 
     public String toString()
@@ -464,16 +530,9 @@
         {
             final Map.Entry entry = (Map.Entry) it.next();
             final String propertyName = (String) entry.getKey();
-            if (propertyName == null)
-            {
-                buf.append("\nInternal error: Property with NULL key defined");
-            }
-            else
-            {
-                buf.append('\n');
 
-                buf.append(valueAsXML(table._propertyNamesTypeMap.get(propertyName) + propertyName, entry.getValue()));
-            }
+            buf.append('\n');
+            buf.append(valueAsXML(table._propertyNamesTypeMap.get(propertyName), propertyName, entry.getValue()));
         }
         buf.append("\n");
         buf.append(PROPERTY_FIELD_TABLE_CLOSE_XML);
@@ -481,18 +540,14 @@
         return buf.toString();
     }
 
-    private static String valueAsXML(String name, Object value)
+    private static String valueAsXML(Prefix type, String propertyName, Object value)
     {
-        char propertyPrefix = name.charAt(0);
-        String propertyName = name.substring(1);
-
-
         StringBuffer buf = new StringBuffer();
         // Start Tag
-        buf.append(propertyXML(name, true));
+        buf.append(propertyXML(type, propertyName, true));
 
         // Value
-        if (propertyPrefix == BYTES_PROPERTY_PREFIX)
+        if (type.equals(Prefix.AMQP_BINARY_PROPERTY_PREFIX))
         {
             //remove '>'
             buf.deleteCharAt(buf.length() - 1);
@@ -504,22 +559,19 @@
         }
         else
         {
-            buf.append(String.valueOf(value));
+            if (!type.equals(Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX))
+            {
+                buf.append(String.valueOf(value));
+            }
         }
-
         //End Tag
-        buf.append(propertyXML(name, false));
+        buf.append(propertyXML(type, propertyName, false));
 
         return buf.toString();
     }
 
-    private Object checkPropertyName(String name)
+    private void checkPropertyName(String propertyName)
     {
-        String propertyName = name.substring(1);
-        char propertyPrefix = name.charAt(0);
-
-        Object previous = null;
-
         if (propertyName == null)
         {
             throw new IllegalArgumentException("Property name must not be null");
@@ -529,34 +581,39 @@
             throw new IllegalArgumentException("Property name must not be the empty string");
         }
 
-        String currentValue = _propertyNamesTypeMap.get(propertyName);
+        checkIdentiferFormat(propertyName);
+    }
 
-        if (currentValue != null)
-        {
-            previous = _properties.remove(currentValue + propertyName);
 
-            // If we are in effect deleting the value (see comment on null values being deleted
-            // below) then we also need to remove the name from the encoding length.
-            if (previous == null)
-            {
-                _encodedSize -= EncodingUtils.encodedShortStringLength(propertyName);
-            }
+    protected static void checkIdentiferFormat(String propertyName)
+    {
+//        AMQP Spec: 4.2.5.5 Field Tables
+//        Guidelines for implementers:
+//           * Field names MUST start with a letter, '$' or '#' and may continue with
+//             letters, '$' or '#', digits, or underlines, to a maximum length of 128
+//             characters.
+//           * The server SHOULD validate field names and upon receiving an invalid
+//             field name, it SHOULD signal a connection exception with reply code
+//             503 (syntax error). Conformance test: amq_wlp_table_01.
+//           * A peer MUST handle duplicate fields by using only the first instance.
 
-            // FIXME: Should be able to short-cut this process if the old and new values are
-            // the same object and/or type and size...
-            _encodedSize -= getEncodingSize(currentValue + propertyName, previous);
+        // AMQP length limit
+        if (propertyName.length() > 128)
+        {
+            throw new IllegalArgumentException("AMQP limits property names to 128 characters");
         }
 
-        _propertyNamesTypeMap.put(propertyName, "" + propertyPrefix);
-
-        return previous;
+        // AMQ start character
+        if (!(Character.isLetter(propertyName.charAt(0))
+              || propertyName.charAt(0) == '$'
+              || propertyName.charAt(0) == '#'))
+        {
+            throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid AMQP start character");
+        }
     }
 
-    private static String propertyXML(String name, boolean start)
+    private static String propertyXML(Prefix type, String propertyName, boolean start)
     {
-        char propertyPrefix = name.charAt(0);
-        String propertyName = name.substring(1);
-
         StringBuffer buf = new StringBuffer();
 
         if (start)
@@ -568,40 +625,44 @@
             buf.append("</");
         }
 
-        switch (propertyPrefix)
+        switch (type)
         {
-            case BOOLEAN_PROPERTY_PREFIX:
+            case AMQP_BOOLEAN_PROPERTY_PREFIX:
                 buf.append(BOOLEAN);
                 break;
-            case BYTE_PROPERTY_PREFIX:
+            case AMQP_BYTE_PROPERTY_PREFIX:
                 buf.append(BYTE);
                 break;
-            case BYTES_PROPERTY_PREFIX:
+            case AMQP_BINARY_PROPERTY_PREFIX:
                 buf.append(BYTES);
                 break;
-            case SHORT_PROPERTY_PREFIX:
+            case AMQP_SHORT_PROPERTY_PREFIX:
                 buf.append(SHORT);
                 break;
-            case INT_PROPERTY_PREFIX:
+            case AMQP_INT_PROPERTY_PREFIX:
                 buf.append(INT);
                 break;
-            case LONG_PROPERTY_PREFIX:
+            case AMQP_LONG_PROPERTY_PREFIX:
                 buf.append(LONG);
                 break;
-            case FLOAT_PROPERTY_PREFIX:
+            case AMQP_FLOAT_PROPERTY_PREFIX:
                 buf.append(FLOAT);
                 break;
-            case DOUBLE_PROPERTY_PREFIX:
+            case AMQP_DOUBLE_PROPERTY_PREFIX:
                 buf.append(DOUBLE);
                 break;
-            case STRING_PROPERTY_PREFIX:
+            case AMQP_NULL_STRING_PROPERTY_PREFIX:
+                buf.append(NULL_STRING);
+                break;
+            case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+            case AMQP_WIDE_STRING_PROPERTY_PREFIX:
                 buf.append(STRING);
                 break;
-            case CHAR_PROPERTY_PREFIX:
+            case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
                 buf.append(CHAR);
                 break;
             default:
-                buf.append(UNKNOWN + " (identifier ").append(propertyPrefix).append(")");
+                buf.append(UNKNOWN + " (identifier ").append(type.identifier()).append(")");
                 break;
         }
 
@@ -622,9 +683,9 @@
         for (int index = 0; index < bytes.length; index++)
         {
             buf.append("\n");
-            buf.append(propertyXML(BYTE_PROPERTY_PREFIX + propertyName + "[" + index + "]", true));
+            buf.append(propertyXML(Prefix.AMQP_BYTE_PROPERTY_PREFIX, propertyName + "[" + index + "]", true));
             buf.append(bytes[index]);
-            buf.append(propertyXML(BYTE_PROPERTY_PREFIX + propertyName + "[" + index + "]", false));
+            buf.append(propertyXML(Prefix.AMQP_BYTE_PROPERTY_PREFIX, propertyName + "[" + index + "]", false));
         }
         buf.append("\n");
         return buf.toString();
@@ -648,16 +709,26 @@
     {
         StringTokenizer tokenizer = new StringTokenizer(textFormat, "\n");
 
+        boolean finished = false;
         boolean processing = false;
 
         boolean processing_bytes = false;
 
+        if (!tokenizer.hasMoreTokens())
+        {
+            throw new IllegalArgumentException("XML has no tokens to parse.");
+        }
+
         while (tokenizer.hasMoreTokens())
         {
             String token = tokenizer.nextToken();
 
-            if (token.equals(PROPERTY_FIELD_TABLE_CLOSE_XML)
-                || token.equals(BYTES_CLOSE_XML))
+            if (token.equals(PROPERTY_FIELD_TABLE_CLOSE_XML))
+            {
+                processing = false;
+                finished = true;
+            }
+            if (token.equals(BYTES_CLOSE_XML))
             {
                 processing = false;
             }
@@ -688,6 +759,12 @@
                 processing = true;
             }
         }
+
+        if (!finished)
+        {
+            throw new IllegalArgumentException("XML was not in a valid format.");
+        }
+
     }
 
     private void processXMLLine(String xmlline)
@@ -735,6 +812,7 @@
 
             int byteStart = xmlline.indexOf('<', headerEnd);
 
+            //Don't think this is required.
             if (byteStart > 0)
             {
                 while (!xmlline.startsWith(BYTES_CLOSE_XML, byteStart))
@@ -772,8 +850,12 @@
         {
             setDouble(propertyName, Double.parseDouble(value));
         }
-        if (type.equals(STRING))
+        if (type.equals(STRING) || type.equals(NULL_STRING))
         {
+            if (type.equals(NULL_STRING))
+            {
+                value = null;
+            }
             setString(propertyName, value);
         }
         if (type.equals(CHAR))
@@ -782,7 +864,7 @@
         }
         if (type.equals(UNKNOWN))
         {
-            _logger.error("Ignoring unknown property value:" + xmlline);
+            _logger.warn("Ignoring unknown property value:" + xmlline);
         }
     }
 
@@ -790,11 +872,11 @@
 
     public void writeToBuffer(ByteBuffer buffer)
     {
-        final boolean debug = _logger.isDebugEnabled();
+        final boolean trace = _logger.isTraceEnabled();
 
-        if (debug)
+        if (trace)
         {
-            _logger.debug("FieldTable::writeToBuffer: Writing encoded size of " + _encodedSize + "...");
+            _logger.trace("FieldTable::writeToBuffer: Writing encoded size of " + _encodedSize + "...");
         }
 
         EncodingUtils.writeUnsignedInteger(buffer, _encodedSize);
@@ -847,53 +929,57 @@
         return setObject(key.toString(), value);
     }
 
-    protected Object put(String key, Object value)
+    protected Object put(Prefix type, String propertyName, Object value)
     {
-        Object previous = checkPropertyName(key);
+        checkPropertyName(propertyName);
 
+        //remove the previous value
+        Object previous = remove(propertyName);
 
-        String propertyName = key.substring(1);
-        char propertyPrefix = _propertyNamesTypeMap.get(propertyName).charAt(0);
 
-        if (value != null)
+        if (_logger.isTraceEnabled())
         {
-            //Add the size of the propertyName
-            _encodedSize += EncodingUtils.encodedShortStringLength(propertyName);
+            int valueSize = 0;
+            if (value != null)
+            {
+                valueSize = getEncodingSize(type, value);
+            }
+            _logger.trace("Put:" + propertyName +
+                          " encoding size Now:" + _encodedSize +
+                          " name size= " + EncodingUtils.encodedShortStringLength(propertyName) +
+                          " value size= " + valueSize);
+        }
 
-            // For now: Setting a null value is the equivalent of deleting it.
-            // This is ambiguous in the JMS spec and needs thrashing out and potentially
-            // testing against other implementations.
+        //Add the size of the propertyName plus one for the type identifier
+        _encodedSize += EncodingUtils.encodedShortStringLength(propertyName) + 1;
 
+        if (value != null)
+        {
             //Add the size of the content
-            _encodedSize += getEncodingSize(key, value);
+            _encodedSize += getEncodingSize(type, value);
         }
 
-        _properties.put((String) propertyName, value);
+        //Store new values
+        _propertyNamesTypeMap.put(propertyName, type);
+        _properties.put(propertyName, value);
 
         return previous;
     }
 
     public Object remove(Object key)
     {
-        if (key instanceof String)
-        {
-            throw new IllegalArgumentException("Property key be a string");
-        }
-
-        char propertyPrefix = ((String) key).charAt(0);
-
         if (_properties.containsKey(key))
         {
             final Object value = _properties.remove(key);
+            Prefix type = _propertyNamesTypeMap.remove(key);
             // plus one for the type
-            _encodedSize -= EncodingUtils.encodedShortStringLength(((String) key));
+            _encodedSize -= EncodingUtils.encodedShortStringLength(((String) key)) + 1;
 
             // This check is, for now, unnecessary (we don't store null values).
             if (value != null)
             {
-                _encodedSize -= getEncodingSize(propertyPrefix + (String) key, value);
+                _encodedSize -= getEncodingSize(type, value);
             }
-
             return value;
         }
         else
@@ -915,6 +1001,7 @@
 
     public void clear()
     {
+        _encodedSize = 0;
         _properties.clear();
         _propertyNamesTypeMap.clear();
     }
@@ -942,6 +1029,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
@@ -954,42 +1042,97 @@
             String propertyName = (String) me.getKey();
 
             //The type value
-            char propertyPrefix = _propertyNamesTypeMap.get(propertyName).charAt(0);
-            //The actual param name skipping type
+            Prefix type = _propertyNamesTypeMap.get(propertyName);
 
-            EncodingUtils.writeShortStringBytes(buffer, propertyName);
             Object value = me.getValue();
-
-            switch (propertyPrefix)
+            try
             {
+                if (_logger.isTraceEnabled())
+                {
+                    _logger.trace("Writing Property:" + propertyName +
+                                  " Type:" + type +
+                                  " Value:" + value);
+                    _logger.trace("Buffer Position:" + buffer.position() +
+                                  " Remaining:" + buffer.remaining());
+                }
 
-                case STRING_PROPERTY_PREFIX:
-                    // TODO: look at using proper charset encoder
-                    buffer.put((byte) STRING_PROPERTY_PREFIX);
-                    EncodingUtils.writeLongStringBytes(buffer, (String) value);
-                    break;
+                //Write the actual parameter name
+                EncodingUtils.writeShortStringBytes(buffer, propertyName);
 
-                case AMQP_UNSIGNEDINT_PROPERTY_PREFIX:
-                case LONG_PROPERTY_PREFIX:
-                case INT_PROPERTY_PREFIX:
-                case BOOLEAN_PROPERTY_PREFIX:
-                case BYTE_PROPERTY_PREFIX:
-                case SHORT_PROPERTY_PREFIX:
-                case FLOAT_PROPERTY_PREFIX:
-                case DOUBLE_PROPERTY_PREFIX:
-                case CHAR_PROPERTY_PREFIX:
-                case BYTES_PROPERTY_PREFIX:
-                case XML_PROPERTY_PREFIX:
-                    // Encode as XML
-                    buffer.put((byte) XML_PROPERTY_PREFIX);
-                    EncodingUtils.writeLongStringBytes(buffer, valueAsXML(propertyPrefix + propertyName, value));
-                    break;
-                default:
+                switch (type)
                 {
-
-                    // Should never get here
-                    throw new IllegalArgumentException("Key '" + propertyName + "': Unsupported type in field table, type: " + ((value == null) ? "null-object" : value.getClass()));
+                    case AMQP_BOOLEAN_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_BOOLEAN_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeBoolean(buffer, (Boolean) value);
+                        break;
+                    case AMQP_BYTE_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_BYTE_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeByte(buffer, (Byte) value);
+                        break;
+                    case AMQP_SHORT_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_SHORT_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeShort(buffer, (Short) value);
+                        break;
+                    case AMQP_INT_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_INT_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeInteger(buffer, (Integer) value);
+                        break;
+                    case AMQP_UNSIGNED_INT_PROPERTY_PREFIX: // Currently we don't create these
+                        buffer.put((byte) Prefix.AMQP_UNSIGNED_INT_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeUnsignedInteger(buffer, (Long) value);
+                        break;
+                    case AMQP_LONG_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_LONG_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeLong(buffer, (Long) value);
+                        break;
+                    case AMQP_FLOAT_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_FLOAT_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeFloat(buffer, (Float) value);
+                        break;
+                    case AMQP_DOUBLE_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_DOUBLE_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeDouble(buffer, (Double) value);
+                        break;
+                    case AMQP_NULL_STRING_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_NULL_STRING_PROPERTY_PREFIX.identifier());
+                        break;
+                    case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_WIDE_STRING_PROPERTY_PREFIX.identifier());
+                        // FIXME: use proper charset encoder
+                        EncodingUtils.writeLongStringBytes(buffer, (String) value);
+                        break;
+                    case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+                        //This is a simple ASCII string
+                        buffer.put((byte) Prefix.AMQP_ASCII_STRING_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeLongStringBytes(buffer, (String) value);
+                        break;
+                    case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_ASCII_CHARACTER_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeChar(buffer, (Character) value);
+                        break;
+                    case AMQP_BINARY_PROPERTY_PREFIX:
+                        buffer.put((byte) Prefix.AMQP_BINARY_PROPERTY_PREFIX.identifier());
+                        EncodingUtils.writeBytes(buffer, (byte[]) 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.isTraceEnabled())
+                {
+                    _logger.trace("Exception thrown:" + e);
+                    _logger.trace("Writing Property:" + propertyName +
+                                  " Type:" + type +
+                                  " Value:" + value);
+                    _logger.trace("Buffer Position:" + buffer.position() +
+                                  " Remaining:" + buffer.remaining());
                 }
+                throw new RuntimeException(e);
             }
         }
     }
@@ -997,100 +1140,141 @@
 
     public void setFromBuffer(ByteBuffer buffer, long length) throws AMQFrameDecodingException
     {
-        final boolean debug = _logger.isDebugEnabled();
+        final boolean trace = _logger.isTraceEnabled();
 
         int sizeRead = 0;
         while (sizeRead < length)
         {
             int sizeRemaining = buffer.remaining();
             final String key = EncodingUtils.readShortString(buffer);
-            // TODO: use proper charset decoder
+
             byte iType = buffer.get();
-            final char type = (char) iType;
-            Object value = null;
+
+            Character mapKey = new Character((char) iType);
+            Prefix type = _reverseTypeMap.get(mapKey);
+
+            if (type == null)
+            {
+                String msg = "Field '" + key + "' - unsupported field table type: " + type + ".";
+                    //some extra trace information...
+                    msg += " (" + iType + "), length=" + length + ", sizeRead=" + sizeRead + ", sizeRemaining=" + sizeRemaining;
+                    throw new AMQFrameDecodingException(msg);
+            }
+            Object value;
 
             switch (type)
             {
-                case STRING_PROPERTY_PREFIX:
+                case AMQP_BOOLEAN_PROPERTY_PREFIX:
+                    value = EncodingUtils.readBoolean(buffer);
+                    break;
+                case AMQP_BYTE_PROPERTY_PREFIX:
+                    value = EncodingUtils.readByte(buffer);
+                    break;
+                case AMQP_SHORT_PROPERTY_PREFIX:
+                    value = EncodingUtils.readShort(buffer);
+                    break;
+                case AMQP_INT_PROPERTY_PREFIX:
+                    value = EncodingUtils.readInteger(buffer);
+                    break;
+                case AMQP_UNSIGNED_INT_PROPERTY_PREFIX:// This will only fit in a long
+                    //Change this type for java lookups
+                    type = Prefix.AMQP_LONG_PROPERTY_PREFIX;
+                case AMQP_LONG_PROPERTY_PREFIX:
+                    value = EncodingUtils.readLong(buffer);
+                    break;
+                case AMQP_FLOAT_PROPERTY_PREFIX:
+                    value = EncodingUtils.readFloat(buffer);
+                    break;
+                case AMQP_DOUBLE_PROPERTY_PREFIX:
+                    value = EncodingUtils.readDouble(buffer);
+                    break;
+                case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+                    // FIXME: use proper charset encoder
+                case AMQP_ASCII_STRING_PROPERTY_PREFIX:
                     value = EncodingUtils.readLongString(buffer);
                     break;
-                case LONG_PROPERTY_PREFIX:
-                case INT_PROPERTY_PREFIX:
-                case BOOLEAN_PROPERTY_PREFIX:
-                case BYTE_PROPERTY_PREFIX:
-                case SHORT_PROPERTY_PREFIX:
-                case FLOAT_PROPERTY_PREFIX:
-                case DOUBLE_PROPERTY_PREFIX:
-                case CHAR_PROPERTY_PREFIX:
-                case BYTES_PROPERTY_PREFIX:
-                case XML_PROPERTY_PREFIX:
-                    processXMLLine(EncodingUtils.readLongString(buffer));
+                case AMQP_NULL_STRING_PROPERTY_PREFIX:
+                    value = null;
+                    break;
+                case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+                    value = EncodingUtils.readChar((buffer));
+                    break;
+                case AMQP_BINARY_PROPERTY_PREFIX:
+                    value = EncodingUtils.readBytes(buffer);
                     break;
                 default:
-                    String msg = "Field '" + key + "' - unsupported field table type: " + type + ".";
-                    //some extra debug information...
-                    msg += " (" + iType + "), length=" + length + ", sizeRead=" + sizeRead + ", sizeRemaining=" + sizeRemaining;
+                    String msg = "Internal error, the following type identifier is not handled: " + type;                                        
                     throw new AMQFrameDecodingException(msg);
             }
 
             sizeRead += (sizeRemaining - buffer.remaining());
 
-            if (debug)
+            if (trace)
             {
-                _logger.debug("FieldTable::PropFieldTable(buffer," + length + "): Read type '" + type + "', key '" + key + "', value '" + value + "' (now read " + sizeRead + " of " + length + " encoded bytes)...");
+                _logger.trace("FieldTable::PropFieldTable(buffer," + length + "): Read type '" + type + "', key '" + key + "', value '" + value + "' (now read " + sizeRead + " of " + length + " encoded bytes)...");
             }
 
-            if (type != XML_PROPERTY_PREFIX)
-            {
-                setObject(key, value);
-            }
+            put(type, key, value);
         }
 
-        if (debug)
+        if (trace)
         {
-            _logger.debug("FieldTable::FieldTable(buffer," + length + "): Done.");
+            _logger.trace("FieldTable::FieldTable(buffer," + length + "): Done.");
         }
     }
 
-
     /**
-     * @param name  the property name with type prefix
+     * @param type  the type to calucluate encoding for
      * @param value the property value
      * @return integer
      */
-    private static int getEncodingSize(String name, Object value)
+    private static int getEncodingSize(Prefix type, Object value)
     {
-        int encodingSize;
+        int encodingSize = 0;
 
-        char propertyPrefix = name.charAt(0);
-
-        switch (propertyPrefix)
+        switch (type)
         {
-            // the extra byte if for the type indicator that is written out
-            case STRING_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedLongStringLength((String) value);
-                break;
-            case LONG_PROPERTY_PREFIX:
-            case INT_PROPERTY_PREFIX:
-            case BOOLEAN_PROPERTY_PREFIX:
-            case BYTE_PROPERTY_PREFIX:
-            case SHORT_PROPERTY_PREFIX:
-            case FLOAT_PROPERTY_PREFIX:
-            case DOUBLE_PROPERTY_PREFIX:
-            case CHAR_PROPERTY_PREFIX:
-            case BYTES_PROPERTY_PREFIX:
-            case XML_PROPERTY_PREFIX:
-                encodingSize = 1 + EncodingUtils.encodedLongStringLength(valueAsXML(name, value));
+            case AMQP_BOOLEAN_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedBooleanLength();
+                break;
+            case AMQP_BYTE_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedByteLength();
+                break;
+            case AMQP_SHORT_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedShortLength();
+                break;
+            case AMQP_INT_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedIntegerLength();
+                break;
+            case AMQP_LONG_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedLongLength();
+                break;
+            case AMQP_FLOAT_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedFloatLength();
+                break;
+            case AMQP_DOUBLE_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedDoubleLength();
+                break;
+            case AMQP_WIDE_STRING_PROPERTY_PREFIX:
+                // FIXME: use proper charset encoder
+            case AMQP_ASCII_STRING_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedLongStringLength((String) value);
+                break;
+//            This is not required as this method is never called if the value is null
+//            case AMQP_NULL_STRING_PROPERTY_PREFIX:
+//                // There is no need for additional size beyond the prefix
+//                break;
+            case AMQP_ASCII_CHARACTER_PROPERTY_PREFIX:
+                encodingSize = EncodingUtils.encodedCharLength();
+                break;
+            case AMQP_BINARY_PROPERTY_PREFIX:
+                encodingSize = 1 + ((byte[]) value).length;
                 break;
             default:
-                //encodingSize = 1 + EncodingUtils.encodedLongStringLength(String.valueOf(value));
-                //  We are using XML String encoding
                 throw new IllegalArgumentException("Unsupported type in field table: " + value.getClass());
         }
 
-// the extra byte for the type indicator is calculated in the name
+        // the extra byte for the type indicator is calculated in the name
         return encodingSize;
     }
-
-
 }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/Event.java Mon Dec 18 04:41:15 2006
@@ -109,6 +109,6 @@
 
     public String toString()
     {
-        return "Event: type " + type +  ", data: " + data;
+        return "Event: type " + type + ", data: " + data;
     }
 }

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/pool/PoolingFilter.java Mon Dec 18 04:41:15 2006
@@ -58,7 +58,10 @@
             Job job = getJobForSession(session);
             job.acquire(); //prevents this job being removed from _jobs
             job.add(event);
-            if (job.activate())
+
+            //Additional checks on pool to check that it hasn't shutdown.
+            // The alternative is to catch the RejectedExecutionException that will result from executing on a shutdown pool
+            if (job.activate() && _poolReference.getPool() != null && !_poolReference.getPool().isShutdown())
             {
                 _poolReference.getPool().execute(job);
             }
@@ -100,7 +103,9 @@
         }
         else
         {
-            if (job.activate())
+            // ritchiem : 2006-12-13 Do we need to perform the additional checks here?
+            //                       Can the pool be shutdown at this point?
+            if (job.activate() && _poolReference.getPool() != null && !_poolReference.getPool().isShutdown())
             {
                 _poolReference.getPool().execute(job);
             }
@@ -184,3 +189,4 @@
         _poolReference.releaseExecutorService();
     }
 }
+

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/protocol/AMQConstant.java Mon Dec 18 04:41:15 2006
@@ -55,7 +55,7 @@
     {
         return _name;
     }
-    
+
     public static final AMQConstant FRAME_MIN_SIZE = new AMQConstant(4096, "frame min size", true);
 
     public static final AMQConstant FRAME_END = new AMQConstant(206, "frame end", true);
@@ -73,6 +73,8 @@
     public static final AMQConstant CONTEXT_IN_USE = new AMQConstant(320, "context in use", true);
 
     public static final AMQConstant CONTEXT_UNKNOWN = new AMQConstant(321, "context unknown", true);
+
+    public static final AMQConstant INVALID_SELECTOR = new AMQConstant(322, "selector invalid", true);
 
     public static final AMQConstant INVALID_PATH = new AMQConstant(402, "invalid path", true);
 

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLHelper.java Mon Dec 18 04:41:15 2006
@@ -64,9 +64,9 @@
                 if (valueIndex + 1 < options.length())
                 {
                     if (options.charAt(valueIndex + 1) == DEFAULT_OPTION_SEPERATOR ||
-                        options.charAt(valueIndex + 1) == ALTERNATIVE_OPTION_SEPARATOR ||
-                        options.charAt(valueIndex + 1) == BROKER_SEPARATOR ||
-                        options.charAt(valueIndex + 1) == '\'')
+                            options.charAt(valueIndex + 1) == ALTERNATIVE_OPTION_SEPARATOR ||
+                            options.charAt(valueIndex + 1) == BROKER_SEPARATOR ||
+                            options.charAt(valueIndex + 1) == '\'')
                     {
                         nestedQuotes--;
 //                        System.out.println(
@@ -119,7 +119,7 @@
             else
             {
                 parseError(sepIndex, "Unterminated option. Possible illegal option separator:'" +
-                                     options.charAt(sepIndex) + "'", options);
+                        options.charAt(sepIndex) + "'", options);
             }
         }
 

Modified: incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java?view=diff&rev=488251&r1=488250&r2=488251
==============================================================================
--- incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java (original)
+++ incubator/qpid/branches/jmsselectors/java/common/src/main/java/org/apache/qpid/url/URLSyntaxException.java Mon Dec 18 04:41:15 2006
@@ -62,12 +62,12 @@
 
         if (getIndex() > -1)
         {
-            if (_length > 1)
+            if (_length != -1)
             {
                 sb.append(" between indicies ");
                 sb.append(getIndex());
                 sb.append(" and ");
-                sb.append(getIndex() + _length);
+                sb.append(_length);
             }
             else
             {