You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2017/05/04 13:12:24 UTC

qpid-broker-j git commit: QPID-7753: Address thread safety comments from Rob Godfrey

Repository: qpid-broker-j
Updated Branches:
  refs/heads/master 54b58c603 -> 2c0e54fd1


QPID-7753: Address thread safety comments from Rob Godfrey

Refactor AMQP 1.0 message section implementations to avoid duplication


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/2c0e54fd
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/2c0e54fd
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/2c0e54fd

Branch: refs/heads/master
Commit: 2c0e54fd1c4138845be340c2790222758bfeffbe
Parents: 54b58c6
Author: Alex Rudyy <or...@apache.org>
Authored: Thu May 4 11:41:25 2017 +0100
Committer: Alex Rudyy <or...@apache.org>
Committed: Thu May 4 13:56:09 2017 +0100

----------------------------------------------------------------------
 .../protocol/v1_0/ConsumerTarget_1_0.java       |  3 +-
 .../v1_0/type/messaging/AbstractSection.java    | 91 ++++++++++++++++++--
 .../v1_0/type/messaging/AmqpSequence.java       |  6 +-
 .../type/messaging/AmqpSequenceSection.java     | 65 ++------------
 .../protocol/v1_0/type/messaging/AmqpValue.java |  6 +-
 .../v1_0/type/messaging/AmqpValueSection.java   | 67 ++------------
 .../type/messaging/ApplicationProperties.java   |  6 +-
 .../messaging/ApplicationPropertiesSection.java | 62 ++-----------
 .../protocol/v1_0/type/messaging/Data.java      |  6 +-
 .../v1_0/type/messaging/DataSection.java        | 67 ++------------
 .../type/messaging/DeliveryAnnotations.java     |  5 +-
 .../messaging/DeliveryAnnotationsSection.java   | 62 ++-----------
 .../protocol/v1_0/type/messaging/Footer.java    |  5 +-
 .../v1_0/type/messaging/FooterSection.java      | 67 ++------------
 .../protocol/v1_0/type/messaging/Header.java    |  6 +-
 .../v1_0/type/messaging/HeaderSection.java      | 67 ++------------
 .../v1_0/type/messaging/MessageAnnotations.java |  5 +-
 .../messaging/MessageAnnotationsSection.java    | 60 ++-----------
 .../v1_0/type/messaging/Properties.java         |  3 +-
 .../v1_0/type/messaging/PropertiesSection.java  | 68 ++-------------
 .../AbstractEncodingRetainingConstructor.java   |  4 +
 .../codec/AmqpValueSectionConstructor.java      |  4 +
 .../messaging/codec/DataSectionConstructor.java |  4 +
 .../codec/DescribedListSectionConstructor.java  |  4 +
 .../codec/DescribedMapSectionConstructor.java   |  4 +
 25 files changed, 187 insertions(+), 560 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java
index 182b14a..41a3fbc 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/ConsumerTarget_1_0.java
@@ -46,7 +46,6 @@ import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoderImpl;
 import org.apache.qpid.server.protocol.v1_0.type.Binary;
 import org.apache.qpid.server.protocol.v1_0.type.DeliveryState;
 import org.apache.qpid.server.protocol.v1_0.type.Outcome;
-import org.apache.qpid.server.protocol.v1_0.type.BaseTarget;
 import org.apache.qpid.server.protocol.v1_0.type.UnsignedInteger;
 import org.apache.qpid.server.protocol.v1_0.type.codec.AMQPDescribedTypeRegistry;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.Accepted;
@@ -56,7 +55,6 @@ import org.apache.qpid.server.protocol.v1_0.type.messaging.HeaderSection;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.Modified;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.Rejected;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.Released;
-import org.apache.qpid.server.protocol.v1_0.type.messaging.Target;
 import org.apache.qpid.server.protocol.v1_0.type.transaction.TransactionalState;
 import org.apache.qpid.server.protocol.v1_0.type.transport.SenderSettleMode;
 import org.apache.qpid.server.protocol.v1_0.type.transport.Transfer;
@@ -151,6 +149,7 @@ class ConsumerTarget_1_0 extends AbstractConsumerTarget<ConsumerTarget_1_0>
 
                 headerSection = new HeaderSection(_typeRegistry);
                 headerSection.setEncodedForm(Collections.singletonList(headerPayload));
+                headerPayload.dispose();
             }
             List<QpidByteBuffer> payload = new ArrayList<>();
             if(headerSection != null)

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java
index 36a2b7e..768d500 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AbstractSection.java
@@ -21,23 +21,59 @@
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
+import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
 import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
+import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
+import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
 
-public abstract class AbstractSection<T> implements EncodingRetainingSection<T>
+public abstract class AbstractSection<T, S extends NonEncodingRetainingSection<T>> implements EncodingRetainingSection<T>
 {
+    private final DescribedTypeConstructorRegistry _typeRegistry;
+    private T _value;
     private List<QpidByteBuffer> _encodedForm;
 
+    protected AbstractSection(final DescribedTypeConstructorRegistry registry)
+    {
+        _typeRegistry = registry;
+    }
+
+    protected AbstractSection(final S section, final SectionEncoder encoder)
+    {
+        _value = section.getValue();
+        _typeRegistry = encoder.getRegistry();
+        _encodedForm = Collections.singletonList(encoder.encodeObject(section));
+    }
+
     @Override
-    public final void setEncodedForm(final List<QpidByteBuffer> encodedForm)
+    public synchronized T getValue()
     {
-        _encodedForm = encodedForm;
+        if(_value == null)
+        {
+            S section = decode(createNonEncodingRetainingSectionConstructor());
+            _value = section.getValue();
+        }
+        return _value;
     }
 
     @Override
-    public final List<QpidByteBuffer> getEncodedForm()
+    public synchronized final void setEncodedForm(final List<QpidByteBuffer> encodedForm)
+    {
+        _encodedForm = new ArrayList<>();
+        for(QpidByteBuffer encodedChunk : encodedForm)
+        {
+            _encodedForm.add(encodedChunk.duplicate());
+        }
+    }
+
+    @Override
+    public synchronized final List<QpidByteBuffer> getEncodedForm()
     {
         List<QpidByteBuffer> returnVal = new ArrayList<>(_encodedForm.size());
         for(int i = 0; i < _encodedForm.size(); i++)
@@ -48,7 +84,7 @@ public abstract class AbstractSection<T> implements EncodingRetainingSection<T>
     }
 
     @Override
-    public final void dispose()
+    public synchronized final void dispose()
     {
         for(int i = 0; i < _encodedForm.size(); i++)
         {
@@ -58,25 +94,62 @@ public abstract class AbstractSection<T> implements EncodingRetainingSection<T>
 
     }
 
-
     @Override
-    public final void reallocate(final long smallestAllowedBufferId)
+    public synchronized final void reallocate(final long smallestAllowedBufferId)
     {
         _encodedForm = QpidByteBuffer.reallocateIfNecessary(smallestAllowedBufferId, _encodedForm);
     }
 
     @Override
-    public final long getEncodedSize()
+    public synchronized final long getEncodedSize()
     {
         return QpidByteBufferUtils.remaining(_encodedForm);
     }
 
     @Override
-    public void writeTo(final QpidByteBuffer dest)
+    public synchronized void writeTo(final QpidByteBuffer dest)
     {
         for(QpidByteBuffer buf : _encodedForm)
         {
             dest.putCopyOf(buf);
         }
     }
+
+    @Override
+    public String toString()
+    {
+        return getValue().toString();
+    }
+
+    protected abstract AbstractDescribedTypeConstructor<S> createNonEncodingRetainingSectionConstructor();
+
+    private S decode(AbstractDescribedTypeConstructor<S> constructor)
+    {
+        List<QpidByteBuffer> input = getEncodedForm();
+        int[] originalPositions = new int[input.size()];
+        for(int i = 0; i < input.size(); i++)
+        {
+            originalPositions[i] = input.get(i).position();
+        }
+        int describedByte = QpidByteBufferUtils.get(input);
+        ValueHandler handler = new ValueHandler(_typeRegistry);
+        try
+        {
+            Object descriptor = handler.parse(input);
+            return constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler);
+        }
+        catch (AmqpErrorException e)
+        {
+            throw new ConnectionScopedRuntimeException("Cannot decode section", e);
+        }
+        finally
+        {
+            for (QpidByteBuffer anInput : input)
+            {
+                anInput.dispose();
+            }
+
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequence.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequence.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequence.java
index 7b40a70..da5a860 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequence.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequence.java
@@ -23,11 +23,8 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-
-import java.util.Collections;
 import java.util.List;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 
 public class AmqpSequence implements NonEncodingRetainingSection<List>
@@ -55,7 +52,6 @@ public class AmqpSequence implements NonEncodingRetainingSection<List>
     @Override
     public AmqpSequenceSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);;
-        return new AmqpSequenceSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new AmqpSequenceSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequenceSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequenceSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequenceSection.java
index c187434..7de8d36 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequenceSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpSequenceSection.java
@@ -23,76 +23,27 @@ package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
 import java.util.List;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.AmqpSequenceConstructor;
 
-public class AmqpSequenceSection extends AbstractSection<List>
+public class AmqpSequenceSection extends AbstractSection<List, AmqpSequence>
 {
-
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-    private List _value;
-
     public AmqpSequenceSection(final DescribedTypeConstructorRegistry describedTypeRegistry)
     {
-        _typeRegistry = describedTypeRegistry;
-    }
-
-    public AmqpSequenceSection(final AmqpSequence sequence,
-                               final List<QpidByteBuffer> encodedForm,
-                               final DescribedTypeConstructorRegistry registry)
-    {
-        _value = sequence.getValue();
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(describedTypeRegistry);
     }
 
-    @Override
-    public String toString()
+    AmqpSequenceSection(final AmqpSequence sequence, final SectionEncoder sectionEncoder)
     {
-        return getValue().toString();
+        super(sequence, sectionEncoder);
     }
 
     @Override
-    public synchronized List getValue()
+    protected AbstractDescribedTypeConstructor<AmqpSequence> createNonEncodingRetainingSectionConstructor()
     {
-        if(_value == null)
-        {
-            decode();
-        }
-        return _value;
+        return new AmqpSequenceConstructor();
     }
 
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            AmqpSequenceConstructor constructor = new AmqpSequenceConstructor();
-            _value = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler).getValue();
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValue.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValue.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValue.java
index 8ab034b..09b77c6 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValue.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValue.java
@@ -24,9 +24,6 @@
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
 
-import java.util.Collections;
-
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 
 public class AmqpValue implements NonEncodingRetainingSection<Object>
@@ -57,7 +54,6 @@ public class AmqpValue implements NonEncodingRetainingSection<Object>
     @Override
     public AmqpValueSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new AmqpValueSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new AmqpValueSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValueSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValueSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValueSection.java
index 8793f4c..423052c 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValueSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/AmqpValueSection.java
@@ -21,78 +21,27 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
-
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.AmqpValueConstructor;
 
-public class AmqpValueSection extends AbstractSection<Object>
+public class AmqpValueSection extends AbstractSection<Object, AmqpValue>
 {
-
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-    private Object _value;
-
     public AmqpValueSection(final DescribedTypeConstructorRegistry describedTypeRegistry)
     {
-        _typeRegistry = describedTypeRegistry;
+        super(describedTypeRegistry);
     }
 
-    public AmqpValueSection(final AmqpValue amqpValue,
-                            final List<QpidByteBuffer> encodedForm,
-                            final DescribedTypeConstructorRegistry registry)
+    AmqpValueSection(final AmqpValue amqpValue, SectionEncoder sectionEncoder)
     {
-        _value = amqpValue.getValue();
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(amqpValue, sectionEncoder);
     }
 
     @Override
-    public String toString()
+    protected AbstractDescribedTypeConstructor<AmqpValue> createNonEncodingRetainingSectionConstructor()
     {
-        return getValue().toString();
+        return new AmqpValueConstructor();
     }
 
-    @Override
-    public synchronized Object getValue()
-    {
-        if(_value == null)
-        {
-            decode();
-        }
-        return _value;
-    }
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            AmqpValueConstructor constructor = new AmqpValueConstructor();
-            _value = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler).getValue();
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationProperties.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationProperties.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationProperties.java
index 5ddf075..bd63785 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationProperties.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationProperties.java
@@ -23,11 +23,8 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-
-import java.util.Collections;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 
 public class ApplicationProperties implements NonEncodingRetainingSection<Map<String,Object>>
@@ -48,7 +45,6 @@ public class ApplicationProperties implements NonEncodingRetainingSection<Map<St
     @Override
     public ApplicationPropertiesSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new ApplicationPropertiesSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new ApplicationPropertiesSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationPropertiesSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationPropertiesSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationPropertiesSection.java
index c706f31..cd75019 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationPropertiesSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/ApplicationPropertiesSection.java
@@ -21,73 +21,29 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.ApplicationPropertiesConstructor;
 
-public class ApplicationPropertiesSection extends AbstractSection<Map<String,Object>>
+public class ApplicationPropertiesSection extends AbstractSection<Map<String,Object>, ApplicationProperties>
 {
-    private Map<String,Object> _value;
-    private final DescribedTypeConstructorRegistry _typeRegistry;
 
-    public ApplicationPropertiesSection(DescribedTypeConstructorRegistry registry)
+    public ApplicationPropertiesSection(final DescribedTypeConstructorRegistry registry)
     {
-        _typeRegistry = registry;
+        super(registry);
     }
 
-    public ApplicationPropertiesSection(final ApplicationProperties applicationProperties,
-                                        final List<QpidByteBuffer> encodedForm,
-                                        final DescribedTypeConstructorRegistry registry)
+    ApplicationPropertiesSection(final ApplicationProperties section, final SectionEncoder encoder)
     {
-        _value = applicationProperties.getValue();
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(section, encoder);
     }
 
     @Override
-    public synchronized Map<String,Object> getValue()
+    protected AbstractDescribedTypeConstructor<ApplicationProperties> createNonEncodingRetainingSectionConstructor()
     {
-        if(_value == null)
-        {
-            decode();
-        }
-        return _value;
-    }
-
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            ApplicationPropertiesConstructor constructor = new ApplicationPropertiesConstructor();
-            _value = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler).getValue();
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
+        return  new ApplicationPropertiesConstructor();
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Data.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Data.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Data.java
index 9bb6c46..9a10fa3 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Data.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Data.java
@@ -21,9 +21,6 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.Collections;
-
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Binary;
 
@@ -52,7 +49,6 @@ public class Data implements NonEncodingRetainingSection<Binary>
     @Override
     public DataSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new DataSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new DataSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DataSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DataSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DataSection.java
index 34e847a..754f306 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DataSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DataSection.java
@@ -21,79 +21,28 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
-
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Binary;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.DataConstructor;
 
-public class DataSection extends AbstractSection<Binary>
+public class DataSection extends AbstractSection<Binary, Data>
 {
-
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-    private Binary _value;
-
     public DataSection(final DescribedTypeConstructorRegistry describedTypeRegistry)
     {
-        _typeRegistry = describedTypeRegistry;
+        super(describedTypeRegistry);
     }
 
-    public DataSection(final Data data,
-                       final List<QpidByteBuffer> encodedForm,
-                       final DescribedTypeConstructorRegistry registry)
+    DataSection(final Data data, SectionEncoder sectionEncoder)
     {
-        _value = data.getValue();
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(data, sectionEncoder);
     }
 
     @Override
-    public String toString()
+    protected AbstractDescribedTypeConstructor<Data> createNonEncodingRetainingSectionConstructor()
     {
-        return getValue().toString();
+        return new DataConstructor();
     }
 
-    @Override
-    public synchronized Binary getValue()
-    {
-        if(_value == null)
-        {
-            decode();
-        }
-        return _value;
-    }
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            DataConstructor constructor = new DataConstructor();
-            _value = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler).getValue();
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotations.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotations.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotations.java
index a799efc..8a65b3f 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotations.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotations.java
@@ -21,10 +21,8 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.Collections;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 
@@ -46,7 +44,6 @@ public class DeliveryAnnotations implements NonEncodingRetainingSection<Map<Symb
     @Override
     public DeliveryAnnotationsSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new DeliveryAnnotationsSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new DeliveryAnnotationsSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotationsSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotationsSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotationsSection.java
index 7e4a3df..6c1fc40 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotationsSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/DeliveryAnnotationsSection.java
@@ -21,74 +21,30 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.DeliveryAnnotationsConstructor;
 
-public class DeliveryAnnotationsSection extends AbstractSection<Map<Symbol,Object>>
+public class DeliveryAnnotationsSection extends AbstractSection<Map<Symbol,Object>, DeliveryAnnotations>
 {
-    private Map<Symbol,Object> _value;
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-
-    public DeliveryAnnotationsSection(DescribedTypeConstructorRegistry registry)
+    public DeliveryAnnotationsSection(final DescribedTypeConstructorRegistry describedTypeRegistry)
     {
-        _typeRegistry = registry;
+        super(describedTypeRegistry);
     }
 
-    public DeliveryAnnotationsSection(final DeliveryAnnotations deliveryAnnotations,
-                                      final List<QpidByteBuffer> encodedForm,
-                                      final DescribedTypeConstructorRegistry registry)
+    DeliveryAnnotationsSection(final DeliveryAnnotations deliveryAnnotations, final SectionEncoder sectionEncoder)
     {
-        _value = deliveryAnnotations.getValue();
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(deliveryAnnotations, sectionEncoder);
     }
 
     @Override
-    public synchronized Map<Symbol,Object> getValue()
+    protected AbstractDescribedTypeConstructor<DeliveryAnnotations> createNonEncodingRetainingSectionConstructor()
     {
-        if(_value == null)
-        {
-            decode();
-        }
-        return _value;
+        return new DeliveryAnnotationsConstructor();
     }
 
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            DeliveryAnnotationsConstructor constructor = new DeliveryAnnotationsConstructor();
-            _value = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler).getValue();
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Footer.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Footer.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Footer.java
index 0777c0b..fd89a03 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Footer.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Footer.java
@@ -21,10 +21,8 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.Collections;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 
@@ -53,7 +51,6 @@ public class Footer implements NonEncodingRetainingSection<Map<Symbol,Object>>
     @Override
     public FooterSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new FooterSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new FooterSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/FooterSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/FooterSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/FooterSection.java
index 94c6f3e..4d343f2 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/FooterSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/FooterSection.java
@@ -21,80 +21,29 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.FooterConstructor;
 
-public class FooterSection extends AbstractSection<Map<Symbol,Object>>
+public class FooterSection extends AbstractSection<Map<Symbol,Object>, Footer>
 {
-
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-    private Map<Symbol,Object> _value;
-
     public FooterSection(final DescribedTypeConstructorRegistry describedTypeRegistry)
     {
-        _typeRegistry = describedTypeRegistry;
-    }
-
-    public FooterSection(final Footer footer,
-                         final List<QpidByteBuffer> encodedForm,
-                         final DescribedTypeConstructorRegistry registry)
-    {
-        _value = footer.getValue();
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(describedTypeRegistry);
     }
 
-    @Override
-    public String toString()
+    FooterSection(final Footer footer, final SectionEncoder sectionEncoder)
     {
-        return getValue().toString();
+        super(footer, sectionEncoder);
     }
 
     @Override
-    public synchronized Map<Symbol,Object> getValue()
+    protected AbstractDescribedTypeConstructor<Footer> createNonEncodingRetainingSectionConstructor()
     {
-        if(_value == null)
-        {
-            decode();
-        }
-        return _value;
-    }
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            FooterConstructor constructor = new FooterConstructor();
-            _value = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler).getValue();
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
+        return new FooterConstructor();
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Header.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Header.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Header.java
index 45ce4a6..87d92b9 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Header.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Header.java
@@ -24,9 +24,6 @@
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
 
-import java.util.Collections;
-
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.CompositeTypeField;
 import org.apache.qpid.server.protocol.v1_0.type.UnsignedByte;
@@ -164,7 +161,6 @@ public class Header implements NonEncodingRetainingSection<Header>
     @Override
     public HeaderSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new HeaderSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new HeaderSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/HeaderSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/HeaderSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/HeaderSection.java
index e06eb5e..801ea4d 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/HeaderSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/HeaderSection.java
@@ -21,78 +21,27 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
-
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.HeaderConstructor;
 
-public class HeaderSection extends AbstractSection<Header>
+public class HeaderSection extends AbstractSection<Header, Header>
 {
-
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-    private Header _header;
-
     public HeaderSection(final DescribedTypeConstructorRegistry describedTypeRegistry)
     {
-        _typeRegistry = describedTypeRegistry;
+        super(describedTypeRegistry);
     }
 
-    public HeaderSection(final Header header,
-                         final List<QpidByteBuffer> encodedForm,
-                         final DescribedTypeConstructorRegistry registry)
+    HeaderSection(final Header header, final SectionEncoder sectionEncoder)
     {
-        _header = header;
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(header, sectionEncoder);
     }
 
     @Override
-    public String toString()
+    protected AbstractDescribedTypeConstructor<Header> createNonEncodingRetainingSectionConstructor()
     {
-        return getValue().toString();
+        return new HeaderConstructor();
     }
 
-    @Override
-    public synchronized Header getValue()
-    {
-        if(_header == null)
-        {
-            decode();
-        }
-        return _header;
-    }
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            HeaderConstructor constructor = new HeaderConstructor();
-            _header = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler);
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotations.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotations.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotations.java
index d7f0bdd..7481ebf 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotations.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotations.java
@@ -21,10 +21,8 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.Collections;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
 import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 
@@ -46,7 +44,6 @@ public class MessageAnnotations implements NonEncodingRetainingSection<Map<Symbo
     @Override
     public MessageAnnotationsSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new MessageAnnotationsSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new MessageAnnotationsSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotationsSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotationsSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotationsSection.java
index 6fd0cc2..90952ce 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotationsSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/MessageAnnotationsSection.java
@@ -21,74 +21,30 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
 import java.util.Map;
 
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.Symbol;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.MessageAnnotationsConstructor;
 
-public class MessageAnnotationsSection extends AbstractSection<Map<Symbol,Object>>
+public class MessageAnnotationsSection extends AbstractSection<Map<Symbol,Object>, MessageAnnotations>
 {
-    private Map<Symbol,Object> _value;
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-
     public MessageAnnotationsSection(DescribedTypeConstructorRegistry registry)
     {
-        _typeRegistry = registry;
+        super(registry);
     }
 
-    public MessageAnnotationsSection(final MessageAnnotations messageAnnotations,
-                                     final List<QpidByteBuffer> encodedForm,
-                                     final DescribedTypeConstructorRegistry registry)
+    MessageAnnotationsSection(final MessageAnnotations messageAnnotations, final SectionEncoder sectionEncoder)
     {
-        _value = messageAnnotations.getValue();
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+        super(messageAnnotations, sectionEncoder);
     }
 
     @Override
-    public synchronized Map<Symbol,Object> getValue()
+    protected AbstractDescribedTypeConstructor<MessageAnnotations> createNonEncodingRetainingSectionConstructor()
     {
-        if(_value == null)
-        {
-            decode();
-        }
-        return _value;
+        return new MessageAnnotationsConstructor();
     }
 
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            MessageAnnotationsConstructor constructor = new MessageAnnotationsConstructor();
-            _value = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler).getValue();
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Properties.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Properties.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Properties.java
index 7a83256..fefcf18 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Properties.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/Properties.java
@@ -338,7 +338,6 @@ public class Properties implements NonEncodingRetainingSection<Properties>
     @Override
     public PropertiesSection createEncodingRetainingSection(final SectionEncoder encoder)
     {
-        final QpidByteBuffer buf = encoder.encodeObject(this);
-        return new PropertiesSection(this, Collections.singletonList(buf), encoder.getRegistry());
+        return new PropertiesSection(this, encoder);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/PropertiesSection.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/PropertiesSection.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/PropertiesSection.java
index f13633c..a6b482f 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/PropertiesSection.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/PropertiesSection.java
@@ -21,78 +21,28 @@
 
 package org.apache.qpid.server.protocol.v1_0.type.messaging;
 
-import java.util.List;
-
-import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.AbstractDescribedTypeConstructor;
 import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.protocol.v1_0.codec.QpidByteBufferUtils;
-import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
-import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+import org.apache.qpid.server.protocol.v1_0.messaging.SectionEncoder;
 import org.apache.qpid.server.protocol.v1_0.type.messaging.codec.PropertiesConstructor;
 
-public class PropertiesSection extends AbstractSection<Properties>
+public class PropertiesSection extends AbstractSection<Properties, Properties>
 {
-
-    private final DescribedTypeConstructorRegistry _typeRegistry;
-    private Properties _properties;
-
     public PropertiesSection(final DescribedTypeConstructorRegistry describedTypeRegistry)
     {
-        _typeRegistry = describedTypeRegistry;
+        super(describedTypeRegistry);
     }
 
-    public PropertiesSection(final Properties properties,
-                             final List<QpidByteBuffer> encodedForm,
-                             final DescribedTypeConstructorRegistry registry)
+    PropertiesSection(final Properties properties,
+                             final SectionEncoder sectionEncoder)
     {
-        _properties = properties;
-        _typeRegistry = registry;
-        setEncodedForm(encodedForm);
+       super(properties, sectionEncoder);
     }
 
     @Override
-    public String toString()
+    protected AbstractDescribedTypeConstructor<Properties> createNonEncodingRetainingSectionConstructor()
     {
-        return getValue().toString();
+        return new PropertiesConstructor();
     }
 
-    @Override
-    public synchronized Properties getValue()
-    {
-        if(_properties == null)
-        {
-            decode();
-        }
-        return _properties;
-    }
-
-    private void decode()
-    {
-        try
-        {
-
-            List<QpidByteBuffer> input = getEncodedForm();
-            int[] originalPositions = new int[input.size()];
-            for(int i = 0; i < input.size(); i++)
-            {
-                originalPositions[i] = input.get(i).position();
-            }
-            int describedByte = QpidByteBufferUtils.get(input);
-            ValueHandler handler = new ValueHandler(_typeRegistry);
-            Object descriptor = handler.parse(input);
-            PropertiesConstructor constructor = new PropertiesConstructor();
-            _properties = constructor.construct(descriptor, input, originalPositions, handler).construct(input, handler);
-            for(int i = 0; i < input.size(); i++)
-            {
-                input.get(i).dispose();
-            }
-
-        }
-        catch (AmqpErrorException e)
-        {
-            // TODO
-            e.printStackTrace();
-        }
-        // TODO
-    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractEncodingRetainingConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractEncodingRetainingConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractEncodingRetainingConstructor.java
index 1ba76d3..a528f5f 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractEncodingRetainingConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractEncodingRetainingConstructor.java
@@ -84,6 +84,10 @@ abstract public class AbstractEncodingRetainingConstructor<T extends EncodingRet
                 }
             }
             object.setEncodedForm(encoding);
+            for (QpidByteBuffer buffer: encoding)
+            {
+                buffer.dispose();
+            }
             return object;
         }
     }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
index 37a4f40..0d51fa6 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
@@ -109,6 +109,10 @@ public class AmqpValueSectionConstructor implements DescribedTypeConstructor<Amq
             AmqpValueSection object =
                     new AmqpValueSection(((SectionDecoderRegistry) handler.getDescribedTypeRegistry()).getUnderlyingRegistry());
             object.setEncodedForm(encoding);
+            for (QpidByteBuffer buffer: encoding)
+            {
+                buffer.dispose();
+            }
             return object;
         }
     }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
index c59c918..c193cb0 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
@@ -139,6 +139,10 @@ public class DataSectionConstructor implements DescribedTypeConstructor<DataSect
             }
             DataSection object = new DataSection(((SectionDecoderRegistry)handler.getDescribedTypeRegistry()).getUnderlyingRegistry());
             object.setEncodedForm(encoding);
+            for (QpidByteBuffer buffer: encoding)
+            {
+                buffer.dispose();
+            }
             return object;
 
         }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
index 95768cc..9b83866 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
@@ -128,6 +128,10 @@ public abstract class DescribedListSectionConstructor<S extends AbstractSection>
             }
             S object = createObject(((SectionDecoderRegistry)handler.getDescribedTypeRegistry()).getUnderlyingRegistry());
             object.setEncodedForm(encoding);
+            for (QpidByteBuffer buffer: encoding)
+            {
+                buffer.dispose();
+            }
             return object;
 
         }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/2c0e54fd/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
index 5b02cca..6ca90c3 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
@@ -122,6 +122,10 @@ public abstract class DescribedMapSectionConstructor<S extends AbstractSection>
             }
             S object = createObject(((SectionDecoderRegistry)handler.getDescribedTypeRegistry()).getUnderlyingRegistry());
             object.setEncodedForm(encoding);
+            for (QpidByteBuffer buffer: encoding)
+            {
+                buffer.dispose();
+            }
             return object;
 
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org