You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cm...@apache.org on 2010/05/20 18:13:58 UTC

svn commit: r946684 [1/2] - in /activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src: handcoded/org/apache/activemq/amqp/generator/handcoded/marshaller/v1_0_0/ main/java/org/apache/activemq/amqp/generator/

Author: cmacnaug
Date: Thu May 20 16:13:58 2010
New Revision: 946684

URL: http://svn.apache.org/viewvc?rev=946684&view=rev
Log:
Changes to encoder to better deal with lists and map (still some issues here though)

Modified:
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/handcoded/org/apache/activemq/amqp/generator/handcoded/marshaller/v1_0_0/Encoder.java
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpClass.java
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpField.java
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Generator.java
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/TypeRegistry.java

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/handcoded/org/apache/activemq/amqp/generator/handcoded/marshaller/v1_0_0/Encoder.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/handcoded/org/apache/activemq/amqp/generator/handcoded/marshaller/v1_0_0/Encoder.java?rev=946684&r1=946683&r2=946684&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/handcoded/org/apache/activemq/amqp/generator/handcoded/marshaller/v1_0_0/Encoder.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/handcoded/org/apache/activemq/amqp/generator/handcoded/marshaller/v1_0_0/Encoder.java Thu May 20 16:13:58 2010
@@ -48,7 +48,8 @@ public class Encoder extends BaseEncoder
 
     static final byte NULL_FORMAT_CODE = AmqpNullMarshaller.FORMAT_CODE;
     static final byte DESCRIBED_FORMAT_CODE = (byte) 0x00;
-
+    static final NullEncoded<?> NULL_ENCODED = new NullEncoded<Object>();
+    
     public static interface ListDecoder<E extends AmqpType<?, ?>> {
         public IAmqpList<E> decode(EncodedBuffer[] constituents) throws AmqpEncodingError;
 
@@ -1049,6 +1050,12 @@ public class Encoder extends BaseEncoder
         public abstract void marshalData(DataOutput out) throws IOException;
     }
 
+    @SuppressWarnings("unchecked")
+    static final <V> Encoded<V> getNullEncoded()
+    {
+        return (Encoded<V>) NULL_ENCODED;
+    }
+    
     static class NullEncoded<V> extends AbstractEncoded<V> {
 
         private static FixedBuffer nb = new FixedBuffer(new Buffer(new byte[] { NULL_FORMAT_CODE }), 0);

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpClass.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpClass.java?rev=946684&r1=946683&r2=946684&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpClass.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpClass.java Thu May 20 16:13:58 2010
@@ -45,14 +45,19 @@ public class AmqpClass {
     LinkedHashMap<String, AmqpField> fields = new LinkedHashMap<String, AmqpField>();
     public boolean handcoded;
 
+    boolean mappingsResolved = false;
     // Java mapping for this class:
     protected TypeRegistry.JavaTypeMapping typeMapping;
     // Java mapping of the value that this type holds (if any)
+    protected AmqpClass valueType;
     protected TypeRegistry.JavaTypeMapping valueMapping;
     // Java mapping of the bean for this type (if any)
     protected TypeRegistry.JavaTypeMapping beanMapping;
     // Java mapping of the buffer for this type (if any)
     protected TypeRegistry.JavaTypeMapping bufferMapping;
+    // Java mapping of the type that this extends (if any)
+    protected AmqpClass baseType;
+    protected TypeRegistry.JavaTypeMapping baseMapping;
 
     protected String mapKeyType = "AmqpType<?,?>";
     protected String mapValueType = "AmqpType<?,?>";
@@ -108,17 +113,11 @@ public class AmqpClass {
             this.restricted = true;
         }
 
-        typeMapping = new JavaTypeMapping(name, generator.getPackagePrefix() + ".types." + "Amqp" + capFirst(toJavaName(name)));
+        typeMapping = new JavaTypeMapping(name, generator.getPackagePrefix() + ".types", "Amqp" + capFirst(toJavaName(name)));
 
         if (isMarshallable()) {
-            beanMapping = new JavaTypeMapping(name + "-bean", generator.getPackagePrefix() + ".types", typeMapping + "." + typeMapping + "Bean", true);
-            bufferMapping = new JavaTypeMapping(name + "-bean", generator.getPackagePrefix() + ".types", typeMapping + "." + typeMapping + "Buffer", true);
-        }
-
-        if (isPrimitive()) {
-            valueMapping = TypeRegistry.getJavaTypeMapping(name);
-        } else if (isRestricted()) {
-            valueMapping = typeMapping;
+            beanMapping = new JavaTypeMapping(name + "-bean", generator.getPackagePrefix() + ".types", typeMapping + "." + typeMapping + "Bean");
+            bufferMapping = new JavaTypeMapping(name + "-bean", generator.getPackagePrefix() + ".types", typeMapping + "." + typeMapping + "Buffer");
         }
     }
 
@@ -127,6 +126,8 @@ public class AmqpClass {
             return;
         }
 
+        resolveMappings();
+
         File file = new File(generator.getOutputDirectory() + File.separator + new String(typeMapping.getFullName()).replace(".", File.separator) + ".java");
         file.getParentFile().mkdirs();
         if (file.exists()) {
@@ -146,7 +147,7 @@ public class AmqpClass {
         } else if (label != null) {
             writeJavaComment(writer, 0, "Represents a " + label);
         }
-        
+
         Utils.writeAutoGeneratedWarning(writer, 0);
 
         // We use enums for restricted types with a choice:
@@ -154,16 +155,14 @@ public class AmqpClass {
             writer.write("public enum " + typeMapping);
         } else if (isMarshallable()) {
 
-            if (isRestricted()) {
-                writer.write("public interface " + typeMapping + " extends " + resolveRestrictedType().getTypeMapping());
-            } else if (isDescribed()) {
-                writer.write("public interface " + typeMapping + " extends " + descriptor.resolveDescribedType().getTypeMapping());
+            if (isRestricted() || isDescribed()) {
+                writer.write("public interface " + typeMapping + " extends " + baseMapping);
             } else {
-                writer.write("public interface " + typeMapping + " extends AmqpType<" + beanMapping + ", " + bufferMapping + ">");
+                writer.write("public interface " + typeMapping + " extends AmqpType<" + beanMapping.parameterized() + ", " + bufferMapping.parameterized() + ">");
             }
 
             if (isList() || isMap()) {
-                writer.write(", " + valueMapping.getJavaType());
+                writer.write(", " + valueMapping);
             }
 
             if (isCommand()) {
@@ -208,7 +207,7 @@ public class AmqpClass {
                 if (!marshaller) {
                     filterOrAddImport(imports, fieldType.getTypeMapping(), marshaller);
                 }
-                filterOrAddImport(imports, fieldType.resolveBaseType().getTypeMapping(), marshaller);
+                filterOrAddImport(imports, fieldType.getBaseType().getTypeMapping(), marshaller);
             } else {
                 filterOrAddImport(imports, fieldType.getTypeMapping(), marshaller);
             }
@@ -279,7 +278,7 @@ public class AmqpClass {
 
             imports.add(getValueMapping().getImport());
 
-            if (resolveBaseType().isList()) {
+            if (getBaseType().isList()) {
                 imports.add("java.util.Iterator");
             }
 
@@ -287,7 +286,7 @@ public class AmqpClass {
                 imports.add("java.util.ArrayList");
             }
 
-            if (resolveBaseType().isMap()) {
+            if (getBaseType().isMap()) {
                 imports.add("java.util.Iterator");
                 imports.add("java.util.Map");
                 imports.add("java.util.HashMap");
@@ -474,7 +473,7 @@ public class AmqpClass {
                     if (fieldType.isAny()) {
                         writer.write(tab(4) + "rc.set(" + f + ", AmqpMarshaller.SINGLETON.unmarshalType(in));");
                     } else {
-                        writer.write(tab(4) + "rc.set(" + f + ", " + fieldType.getBufferMapping() + ".create(" + fieldType.getMarshaller() + ".createEncoded(in)));");
+                        writer.write(tab(4) + "rc.set(" + f + ", " + fieldType.getBufferMapping().getClassName() + ".create(" + fieldType.getMarshaller() + ".createEncoded(in)));");
                     }
                     writer.newLine();
                     writer.write(tab(4) + "dataCount--;");
@@ -522,7 +521,7 @@ public class AmqpClass {
                     if (fieldType.isAny()) {
                         writer.write(tab(4) + "rc.set(" + f + ", AmqpMarshaller.SINGLETON.decodeType(constituents[" + f + "]));");
                     } else {
-                        writer.write(tab(4) + "rc.set(" + f + ", " + fieldType.getBufferMapping() + ".create(" + fieldType.getMarshaller() + ".createEncoded(constituents[" + f + "])));");
+                        writer.write(tab(4) + "rc.set(" + f + ", " + fieldType.getBufferMapping().getClassName() + ".create(" + fieldType.getMarshaller() + ".createEncoded(constituents[" + f + "])));");
                     }
                     writer.newLine();
                     writer.write(tab(4) + "dataCount--;");
@@ -591,11 +590,11 @@ public class AmqpClass {
                         writer.write(tab(5) + "saw" + capFirst(field.getName()) + " = true;");
                         writer.newLine();
                     }
-                    
+
                     if (fieldType.isAny()) {
                         writer.write(tab(5) + "rc.put(" + typeMapping + "." + toJavaConstant(field.getName()) + "_KEY, AmqpMarshaller.SINGLETON.decodeType(constituents[i + 1]));");
                     } else {
-                        writer.write(tab(5) + "rc.put(" + typeMapping + "." + toJavaConstant(field.getName()) + "_KEY, " + fieldType.getBufferMapping() + ".create(" + fieldType.getMarshaller()
+                        writer.write(tab(5) + "rc.put(" + typeMapping + "." + toJavaConstant(field.getName()) + "_KEY, " + fieldType.getBufferMapping().getClassName() + ".create(" + fieldType.getMarshaller()
                                 + ".createEncoded(constituents[i + 1])));");
                     }
                     writer.newLine();
@@ -667,7 +666,7 @@ public class AmqpClass {
                     if (fieldType.isAny()) {
                         writer.write(tab(5) + "rc.put(" + typeMapping + "." + toJavaConstant(field.getName()) + "_KEY, AmqpMarshaller.SINGLETON.decodeType(in));");
                     } else {
-                        writer.write(tab(5) + "rc.put(" + typeMapping + "." + toJavaConstant(field.getName()) + "_KEY, " + fieldType.getBufferMapping() + ".create(" + fieldType.getMarshaller()
+                        writer.write(tab(5) + "rc.put(" + typeMapping + "." + toJavaConstant(field.getName()) + "_KEY, " + fieldType.getBufferMapping().getClassName() + ".create(" + fieldType.getMarshaller()
                                 + ".createEncoded(in)));");
                     }
                     writer.newLine();
@@ -704,7 +703,7 @@ public class AmqpClass {
             }
 
             writer.newLine();
-            writer.write(tab(1) + "public static class " + getJavaType() + "Encoded extends DescribedEncoded<" + getValueMapping() + "> {");
+            writer.write(tab(1) + "public static class " + getJavaType() + "Encoded extends DescribedEncoded<" + getValueMapping().parameterized() + "> {");
             writer.newLine();
 
             writer.newLine();
@@ -716,7 +715,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "public " + getJavaType() + "Encoded(" + typeMapping + " value) {");
+            writer.write(tab(2) + "public " + getJavaType() + "Encoded(" + typeMapping.parameterized() + " value) {");
             writer.newLine();
             writer.write(tab(3) + "super(" + describedType.getMarshaller() + ".encode(value));");
             writer.newLine();
@@ -740,7 +739,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "protected final Encoded<" + getValueMapping() + "> decodeDescribed(EncodedBuffer encoded) throws AmqpEncodingError {");
+            writer.write(tab(2) + "protected final Encoded<" + getValueMapping().parameterized() + "> decodeDescribed(EncodedBuffer encoded) throws AmqpEncodingError {");
             writer.newLine();
             writer.write(tab(3) + "return " + describedType.getMarshaller() + ".createEncoded(encoded, DECODER);");
             writer.newLine();
@@ -748,7 +747,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "protected final Encoded<" + getValueMapping() + "> unmarshalDescribed(DataInput in) throws IOException {");
+            writer.write(tab(2) + "protected final Encoded<" + getValueMapping().parameterized() + "> unmarshalDescribed(DataInput in) throws IOException {");
             writer.newLine();
             writer.write(tab(3) + "return " + describedType.getMarshaller() + ".createEncoded(in, DECODER);");
             writer.newLine();
@@ -780,7 +779,7 @@ public class AmqpClass {
             // writer.newLine();
 
             writer.newLine();
-            writer.write(tab(1) + "public static class " + getJavaType() + "Encoded  extends AbstractEncoded<" + getValueMapping().getJavaType() + "> {");
+            writer.write(tab(1) + "public static class " + getJavaType() + "Encoded  extends AbstractEncoded<" + getValueMapping().parameterized() + "> {");
             writer.newLine();
 
             writer.newLine();
@@ -792,7 +791,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "public " + getJavaType() + "Encoded (" + getValueMapping().getJavaType() + " value) throws AmqpEncodingError {");
+            writer.write(tab(2) + "public " + getJavaType() + "Encoded (" + getValueMapping().parameterized() + " value) throws AmqpEncodingError {");
             writer.newLine();
             writer.write(tab(3) + "super(FORMAT_CODE, value);");
             writer.newLine();
@@ -800,7 +799,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "public final void encode(" + getValueMapping().getJavaType() + " value, Buffer encoded, int offset) throws AmqpEncodingError{");
+            writer.write(tab(2) + "public final void encode(" + getValueMapping().parameterized() + " value, Buffer encoded, int offset) throws AmqpEncodingError{");
             writer.newLine();
             if (hasNonZeroEncoding()) {
                 writer.write(tab(3) + "ENCODER.encode" + capFirst(toJavaName(name)) + "(value, encoded, offset);");
@@ -810,7 +809,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "public final " + getValueMapping().getJavaType() + " decode(EncodedBuffer encoded) throws AmqpEncodingError{");
+            writer.write(tab(2) + "public final " + getValueMapping().parameterized() + " decode(EncodedBuffer encoded) throws AmqpEncodingError{");
             writer.newLine();
             if (hasNonZeroEncoding()) {
                 writer.write(tab(3) + "return ENCODER.decode" + capFirst(toJavaName(name)) + "(encoded.getBuffer(), encoded.getDataOffset());");
@@ -832,7 +831,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "public final " + getValueMapping().getJavaType() + " unmarshalData(DataInput in) throws IOException {");
+            writer.write(tab(2) + "public final " + getValueMapping().parameterized() + " unmarshalData(DataInput in) throws IOException {");
             writer.newLine();
             if (hasNonZeroEncoding()) {
                 writer.write(tab(3) + "return ENCODER.read" + capFirst(toJavaName(name)) + "(in);");
@@ -939,14 +938,14 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "static final " + getJavaType() + "Encoded createEncoded(EncodedBuffer buffer) throws AmqpEncodingError {");
+            writer.write(tab(2) + "static final " + getTypeMapping().getGeneric(" ") + getJavaType() + "Encoded " + getTypeMapping().parameterized().getGeneric("") + "createEncoded(EncodedBuffer buffer) throws AmqpEncodingError {");
             writer.newLine();
             writer.write(tab(3) + "switch(buffer.getEncodingFormatCode()) {");
             writer.newLine();
             for (AmqpEncoding encoding : encodings) {
                 writer.write(tab(3) + "case " + toJavaConstant(encoding.getName()) + "_FORMAT_CODE: {");
                 writer.newLine();
-                writer.write(tab(4) + "return new " + getJavaType() + capFirst(toJavaName(encoding.getName())) + "Encoded(buffer);");
+                writer.write(tab(4) + "return new " + getJavaType() + capFirst(toJavaName(encoding.getName())) + "Encoded" + getTypeMapping().parameterized().getGeneric("") + "(buffer);");
                 writer.newLine();
                 writer.write(tab(3) + "}");
                 writer.newLine();
@@ -962,14 +961,14 @@ public class AmqpClass {
             writer.write(tab(2) + "}");
             writer.newLine();
 
-            writer.write(tab(2) + "static final " + getJavaType() + "Encoded createEncoded(byte formatCode, " + getValueMapping().getJavaType() + " value) throws AmqpEncodingError {");
+            writer.write(tab(2) + "static final " + getTypeMapping().getGeneric(" ") + getJavaType() + "Encoded" + getTypeMapping().parameterized().getGeneric("") + " createEncoded(byte formatCode, " + getValueMapping().parameterized() + " value) throws AmqpEncodingError {");
             writer.newLine();
             writer.write(tab(3) + "switch(formatCode) {");
             writer.newLine();
             for (AmqpEncoding encoding : encodings) {
                 writer.write(tab(3) + "case " + toJavaConstant(encoding.getName()) + "_FORMAT_CODE: {");
                 writer.newLine();
-                writer.write(tab(4) + "return new " + getJavaType() + capFirst(toJavaName(encoding.getName())) + "Encoded(value);");
+                writer.write(tab(4) + "return new " + getJavaType() + capFirst(toJavaName(encoding.getName())) + "Encoded" + getValueMapping().parameterized().getGeneric("") + "(value);");
                 writer.newLine();
                 writer.write(tab(3) + "}");
                 writer.newLine();
@@ -988,16 +987,16 @@ public class AmqpClass {
             writer.write(tab(1) + "}");
             writer.newLine();
 
-            writer.write(tab(1) + "public static abstract class " + getJavaType() + "Encoded extends AbstractEncoded <" + getValueMapping().getJavaType() + "> {");
+            writer.write(tab(1) + "public static abstract class " + getJavaType() + "Encoded" + typeMapping.getGeneric("") + " extends AbstractEncoded <" + getValueMapping().parameterized() + "> {");
             if (isList()) {
                 writer.newLine();
-                writer.write(tab(2) + "ListDecoder decoder = Encoder.DEFAULT_LIST_DECODER;");
+                writer.write(tab(2) + "ListDecoder<V> decoder;");
                 writer.newLine();
             }
 
             if (isMap()) {
                 writer.newLine();
-                writer.write(tab(2) + "MapDecoder decoder = Encoder.DEFAULT_MAP_DECODER;");
+                writer.write(tab(2) + "MapDecoder<K, V> decoder;");
                 writer.newLine();
             }
 
@@ -1010,7 +1009,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(2) + "public " + getJavaType() + "Encoded(byte formatCode, " + getValueMapping().getJavaType() + " value) throws AmqpEncodingError {");
+            writer.write(tab(2) + "public " + getJavaType() + "Encoded(byte formatCode, " + getValueMapping().parameterized() + " value) throws AmqpEncodingError {");
             writer.newLine();
             writer.write(tab(3) + "super(formatCode, value);");
             writer.newLine();
@@ -1019,7 +1018,7 @@ public class AmqpClass {
 
             if (isList()) {
                 writer.newLine();
-                writer.write(tab(2) + "final void setDecoder(ListDecoder decoder) {");
+                writer.write(tab(2) + "final void setDecoder(ListDecoder<V> decoder) {");
                 writer.newLine();
                 writer.write(tab(3) + "this.decoder = decoder;");
                 writer.newLine();
@@ -1029,7 +1028,7 @@ public class AmqpClass {
 
             if (isMap()) {
                 writer.newLine();
-                writer.write(tab(2) + "final void setDecoder(MapDecoder decoder) {");
+                writer.write(tab(2) + "final void setDecoder(MapDecoder<K, V> decoder) {");
                 writer.newLine();
                 writer.write(tab(3) + "this.decoder = decoder;");
                 writer.newLine();
@@ -1045,7 +1044,7 @@ public class AmqpClass {
 
                 writer.newLine();
                 writeJavaComment(writer, 1, encoding.getLabel());
-                writer.write(tab(1) + "private static class " + getJavaType() + eName + "Encoded extends " + getJavaType() + "Encoded {");
+                writer.write(tab(1) + "private static class " + getJavaType() + eName + "Encoded " + typeMapping.getGeneric(" ") + "extends " + getJavaType() + "Encoded" + typeMapping.parameterized().getGeneric("") + " {");
                 writer.newLine();
                 writer.newLine();
                 writer.write(tab(2) + "private final " + encodingName + " encoding = " + encodingName + "." + toJavaConstant(encoding.getName()) + ";");
@@ -1059,7 +1058,7 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(2) + "public " + getJavaType() + eName + "Encoded(" + getValueMapping().getJavaType() + " value) throws AmqpEncodingError {");
+                writer.write(tab(2) + "public " + getJavaType() + eName + "Encoded(" + getValueMapping().parameterized() + " value) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(3) + "super(" + encodingName + "." + toJavaConstant(encoding.getName()) + ".FORMAT_CODE, value);");
                 writer.newLine();
@@ -1087,7 +1086,7 @@ public class AmqpClass {
                 }
 
                 writer.newLine();
-                writer.write(tab(2) + "public final void encode(" + getValueMapping().getJavaType() + " value, Buffer encoded, int offset) throws AmqpEncodingError {");
+                writer.write(tab(2) + "public final void encode(" + getValueMapping().parameterized() + " value, Buffer encoded, int offset) throws AmqpEncodingError {");
                 writer.newLine();
                 if (hasNonZeroEncoding()) {
                     writer.write(tab(3) + "ENCODER.encode" + capFirst(toJavaName(name)) + eName + "(value, encoded, offset);");
@@ -1107,7 +1106,7 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(2) + "public final " + getValueMapping().getJavaType() + " decode(EncodedBuffer encoded) throws AmqpEncodingError {");
+                writer.write(tab(2) + "public final " + getValueMapping().parameterized() + " decode(EncodedBuffer encoded) throws AmqpEncodingError {");
                 writer.newLine();
                 if (isList() || isMap()) {
                     writer.write(tab(3) + "return decoder.decode(encoded.asCompound().constituents());");
@@ -1124,7 +1123,7 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(2) + "public final " + getValueMapping().getJavaType() + " unmarshalData(DataInput in) throws IOException {");
+                writer.write(tab(2) + "public final " + getValueMapping().parameterized() + " unmarshalData(DataInput in) throws IOException {");
                 writer.newLine();
 
                 if (isList() || isMap()) {
@@ -1151,10 +1150,8 @@ public class AmqpClass {
 
         for (AmqpField field : fields.values()) {
             ret = true;
-            AmqpClass fieldClass = field.resolveAmqpFieldType();
-            JavaTypeMapping valueType = fieldClass.getTypeMapping();
 
-            writer.write(tab(indent) + "private " + valueType + " " + field.getJavaName());
+            writer.write(tab(indent) + "private " + field.resolveAccessorMapping().parameterized() + " " + field.getJavaName());
 
             if (field.getDefaultValue() != null) {
                 writer.write(" = " + field.getDefaultValue());
@@ -1164,19 +1161,17 @@ public class AmqpClass {
             writer.newLine();
         }
 
-        if (isDescribed()) {
-            AmqpClass describedType = descriptor.resolveDescribedType();
-            if (!describedType.isList()) {
-                describedType.writeFields(writer, indent);
+        if (baseType != this) {
+            if (baseType.isMap()) {
+                writer.write(tab(indent) + "private " + getValueMapping().parameterized() + " value;");
+                writer.newLine();
+            } else if (!baseType.isList()) {
+                baseType.writeFields(writer, indent);
             }
         }
 
-        if (isRestricted()) {
-            resolveRestrictedType().writeFields(writer, indent);
-        }
-
         if (isPrimitive()) {
-            writer.write(tab(indent) + "private " + getValueMapping().getJavaType() + " value;");
+            writer.write(tab(indent) + "private " + getValueMapping().parameterized() + " value;");
             writer.newLine();
         }
         return ret;
@@ -1184,16 +1179,16 @@ public class AmqpClass {
 
     private void writeBeanImpl(BufferedWriter writer, int indent) throws IOException, UnknownTypeException {
 
-        AmqpClass baseType = resolveBaseType();
+        AmqpClass baseType = getBaseType();
 
         writer.newLine();
-        writer.write(tab(indent++) + "public static class " + beanMapping.getShortName() + " implements " + typeMapping + "{");
+        writer.write(tab(indent++) + "public static class " + beanMapping.shortName() + " implements " + typeMapping.parameterized() + "{");
         writer.newLine();
 
         writer.newLine();
-        writer.write(tab(indent) + "private " + bufferMapping.getShortName() + " buffer;");
+        writer.write(tab(indent) + "private " + bufferMapping.shortName().parameterized() + " buffer;");
         writer.newLine();
-        writer.write(tab(indent) + "private " + beanMapping.getShortName() + " bean = this;");
+        writer.write(tab(indent) + "private " + beanMapping.shortName().parameterized() + " bean = this;");
         writer.newLine();
         writeFields(writer, indent);
 
@@ -1201,14 +1196,14 @@ public class AmqpClass {
         // Allow creation of unitialized mutable types:
         if (isMutable()) {
             writer.newLine();
-            writer.write(tab(indent) + "" + beanMapping.getShortName() + "() {");
+            writer.write(tab(indent) + "" + beanMapping.shortName().nonGeneric() + "() {");
             writer.newLine();
             if (baseType.isMap()) {
                 writer.write(tab(indent + 1) + "this.value = new IAmqpMap.AmqpWrapperMap<" + getMapKeyType() + "," + getMapValueType() + ">(new HashMap<" + getMapKeyType() + "," + getMapValueType()
                         + ">());");
                 writer.newLine();
             } else if (!isDescribed() && baseType.isList()) {
-                writer.write(tab(indent + 1) + "this.value = new IAmqpList.AmqpWrapperList(new ArrayList<AmqpType<?,?>>());");
+                writer.write(tab(indent + 1) + "this.value = new IAmqpList.AmqpWrapperList<V>(new ArrayList<V>());");
                 writer.newLine();
             }
             writer.write(tab(indent) + "}");
@@ -1216,7 +1211,7 @@ public class AmqpClass {
         }
 
         writer.newLine();
-        writer.write(tab(indent) + beanMapping.getShortName() + "(" + baseType.getValueMapping().getJavaType() + " value) {");
+        writer.write(tab(indent) + beanMapping.shortName().nonGeneric() + "(" + getValueMapping().parameterized() + " value) {");
         writer.newLine();
         if (isDescribed() && baseType.isList()) {
             writer.newLine();
@@ -1233,7 +1228,7 @@ public class AmqpClass {
         writer.newLine();
 
         writer.newLine();
-        writer.write(tab(indent) + beanMapping.getShortName() + "(" + beanMapping + " other) {");
+        writer.write(tab(indent) + beanMapping.shortName().nonGeneric() + "(" + beanMapping.parameterized() + " other) {");
         writer.newLine();
         writer.write(tab(indent + 1) + "this.bean = other;");
         writer.newLine();
@@ -1243,10 +1238,10 @@ public class AmqpClass {
 
         // METHODS:
         writer.newLine();
-        writer.write(tab(indent) + "public final " + beanMapping.getShortName() + " copy() {");
+        writer.write(tab(indent) + "public final " + beanMapping.shortName().parameterized() + " copy() {");
         writer.newLine();
         if (isMutable()) {
-            writer.write(tab(++indent) + "return new " + beanMapping + "(bean);");
+            writer.write(tab(++indent) + "return new " + beanMapping.parameterized() + "(bean);");
         } else {
             writer.write(tab(++indent) + "return bean;");
         }
@@ -1265,11 +1260,11 @@ public class AmqpClass {
         }
 
         writer.newLine();
-        writer.write(tab(indent) + "public final " + bufferMapping + " getBuffer(AmqpMarshaller marshaller) throws AmqpEncodingError{");
+        writer.write(tab(indent) + "public final " + bufferMapping.shortName().parameterized() + " getBuffer(AmqpMarshaller marshaller) throws AmqpEncodingError{");
         writer.newLine();
         writer.write(tab(++indent) + "if(buffer == null) {");
         writer.newLine();
-        writer.write(tab(++indent) + "buffer = new " + bufferMapping.getShortName() + "(marshaller.encode(this));");
+        writer.write(tab(++indent) + "buffer = new " + bufferMapping.shortName().nonGeneric() + "(marshaller.encode(this));");
         writer.newLine();
         writer.write(tab(--indent) + "}");
         writer.newLine();
@@ -1311,7 +1306,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(indent) + "private final void copy(" + beanMapping + " other) {");
+            writer.write(tab(indent) + "private final void copy(" + beanMapping.parameterized() + " other) {");
             writer.newLine();
             indent++;
 
@@ -1341,20 +1336,20 @@ public class AmqpClass {
         writer.write(tab(--indent) + "}");
         writer.newLine();
         writer.newLine();
-        writer.write(tab(indent) + "if(o == null || !(o instanceof " + typeMapping + ")) {");
+        writer.write(tab(indent) + "if(o == null || !(o instanceof " + typeMapping.wildcard() + ")) {");
         writer.newLine();
         writer.write(tab(++indent) + "return false;");
         writer.newLine();
         writer.write(tab(--indent) + "}");
         writer.newLine();
         writer.newLine();
-        writer.write(tab(indent) + "return equals((" + typeMapping + ") o);");
+        writer.write(tab(indent) + "return equals((" + typeMapping.wildcard() + ") o);");
         writer.newLine();
         writer.write(tab(--indent) + "}");
         writer.newLine();
 
         writer.newLine();
-        writer.write(tab(indent++) + "public boolean equals(" + typeMapping + " b) {");
+        writer.write(tab(indent++) + "public boolean equals(" + typeMapping.parameterized() + " b) {");
         writer.newLine();
         if (isDescribed()) {
             for (AmqpField field : fields.values()) {
@@ -1412,7 +1407,7 @@ public class AmqpClass {
         } else {
             writer.write(tab(++indent) + "if(getValue() == null) {");
             writer.newLine();
-            writer.write(tab(++indent) + "return " + beanMapping + ".class.hashCode();");
+            writer.write(tab(++indent) + "return " + beanMapping.shortName().nonGeneric() + ".class.hashCode();");
             writer.newLine();
             writer.write(tab(--indent) + "}");
             writer.newLine();
@@ -1429,19 +1424,19 @@ public class AmqpClass {
 
     private void writeBufferImpl(BufferedWriter writer, int indent) throws IOException, UnknownTypeException {
         if (isDescribed()) {
-            AmqpClass describedType = descriptor.resolveDescribedType();
 
             writer.newLine();
-            writer.write(tab(indent++) + "public static class " + bufferMapping.getClassName() + " extends " + describedType.bufferMapping + " implements " + typeMapping + "{");
+            writer.write(tab(indent++) + "public static class " + bufferMapping.shortName() + " extends " + baseType.bufferMapping.parameterized(baseMapping.getGenerics()).parameterized()
+                    + " implements " + typeMapping.parameterized() + "{");
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(indent) + "private " + beanMapping.getShortName() + " bean;");
+            writer.write(tab(indent) + "private " + beanMapping.shortName().nonGeneric() + " bean;");
             writer.newLine();
 
             // CONSTRUCTORS:
             writer.newLine();
-            writer.write(tab(indent) + "protected " + bufferMapping.getShortName() + "(Encoded<" + getValueMapping() + "> encoded) {");
+            writer.write(tab(indent) + "protected " + bufferMapping.shortName().nonGeneric() + "(Encoded<" + getValueMapping() + "> encoded) {");
             writer.newLine();
             writer.write(tab(++indent) + "super(encoded);");
             writer.newLine();
@@ -1451,24 +1446,25 @@ public class AmqpClass {
         } else if (isPrimitive()) {
 
             writer.newLine();
-            writer.write(tab(indent++) + "public static class " + bufferMapping.getShortName() + " implements " + typeMapping + ", AmqpBuffer< " + getValueMapping() + "> {");
+            writer.write(tab(indent++) + "public static class " + bufferMapping.shortName() + " implements " + typeMapping.parameterized() + ", AmqpBuffer<" + getValueMapping().parameterized()
+                    + "> {");
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(indent) + "private " + beanMapping.getShortName() + " bean;");
+            writer.write(tab(indent) + "private " + beanMapping.shortName().parameterized() + " bean;");
             writer.newLine();
-            writer.write(tab(indent) + "protected Encoded<" + valueMapping + "> encoded;");
+            writer.write(tab(indent) + "protected Encoded<" + valueMapping.parameterized() + "> encoded;");
             writer.newLine();
 
             // CONSTRUCTORS:
             writer.newLine();
-            writer.write(tab(indent) + "protected " + bufferMapping.getShortName() + "() {");
+            writer.write(tab(indent) + "protected " + bufferMapping.shortName().nonGeneric() + "() {");
             writer.newLine();
             writer.write(tab(indent) + "}");
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(indent) + "protected " + bufferMapping.getShortName() + "(Encoded<" + getValueMapping() + "> encoded) {");
+            writer.write(tab(indent) + "protected " + bufferMapping.shortName().nonGeneric() + "(Encoded<" + getValueMapping().parameterized() + "> encoded) {");
             writer.newLine();
             writer.write(tab(++indent) + "this.encoded = encoded;");
             writer.newLine();
@@ -1476,7 +1472,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(indent) + "public final Encoded<" + getValueMapping() + "> getEncoded() throws AmqpEncodingError{");
+            writer.write(tab(indent) + "public final Encoded<" + getValueMapping().parameterized() + "> getEncoded() throws AmqpEncodingError{");
             writer.newLine();
             writer.write(tab(++indent) + "return encoded;");
             writer.newLine();
@@ -1492,19 +1488,19 @@ public class AmqpClass {
             writer.newLine();
 
         } else if (isRestricted()) {
-            AmqpClass restrictedType = resolveRestrictedType();
 
             writer.newLine();
-            writer.write(tab(indent++) + "public static class " + bufferMapping.getShortName() + " extends " + restrictedType.bufferMapping + " implements " + typeMapping + "{");
+            writer.write(tab(indent++) + "public static class " + bufferMapping.shortName().parameterized() + " extends "
+                    + baseType.bufferMapping.parameterized(baseMapping.getGenerics()).parameterized() + " implements " + typeMapping + "{");
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(indent) + "private " + beanMapping.getShortName() + " bean;");
+            writer.write(tab(indent) + "private " + beanMapping.shortName().parameterized() + " bean;");
             writer.newLine();
 
             // CONSTRUCTORS:
             writer.newLine();
-            writer.write(tab(indent) + "protected " + bufferMapping.getShortName() + "() {");
+            writer.write(tab(indent) + "protected " + bufferMapping.shortName().nonGeneric() + "() {");
             writer.newLine();
             writer.write(tab(++indent) + "super();");
             writer.newLine();
@@ -1512,7 +1508,7 @@ public class AmqpClass {
             writer.newLine();
 
             writer.newLine();
-            writer.write(tab(indent) + "protected " + bufferMapping.getShortName() + "(Encoded<" + restrictedType.getValueMapping() + "> encoded) {");
+            writer.write(tab(indent) + "protected " + bufferMapping.shortName().nonGeneric() + "(Encoded<" + getValueMapping().parameterized() + "> encoded) {");
             writer.newLine();
             writer.write(tab(++indent) + "super(encoded);");
             writer.newLine();
@@ -1524,7 +1520,7 @@ public class AmqpClass {
         writeFieldAccesors(writer, indent, true);
 
         writer.newLine();
-        writer.write(tab(indent) + "public " + bufferMapping + " getBuffer(AmqpMarshaller marshaller) throws AmqpEncodingError{");
+        writer.write(tab(indent) + "public " + bufferMapping.shortName().parameterized() + " getBuffer(AmqpMarshaller marshaller) throws AmqpEncodingError{");
         writer.newLine();
         writer.write(tab(++indent) + "return this;");
         writer.newLine();
@@ -1532,11 +1528,11 @@ public class AmqpClass {
         writer.newLine();
 
         writer.newLine();
-        writer.write(tab(indent) + "protected " + typeMapping + " bean() {");
+        writer.write(tab(indent) + "protected " + typeMapping.shortName().parameterized() + " bean() {");
         writer.newLine();
         writer.write(tab(++indent) + "if(bean == null) {");
         writer.newLine();
-        writer.write(tab(++indent) + "bean = new " + beanMapping + "(encoded.getValue());");
+        writer.write(tab(++indent) + "bean = new " + beanMapping.shortName().parameterized() + "(encoded.getValue());");
         writer.newLine();
         writer.write(tab(indent) + "bean.buffer = this;");
         writer.newLine();
@@ -1568,7 +1564,7 @@ public class AmqpClass {
         writer.newLine();
 
         writer.newLine();
-        writer.write(tab(indent) + "public boolean equals(" + typeMapping + " o){");
+        writer.write(tab(indent) + "public boolean equals(" + typeMapping.wildcard() + " o){");
         writer.newLine();
         writer.write(tab(++indent) + "return bean().equals(o);");
         writer.newLine();
@@ -1585,7 +1581,7 @@ public class AmqpClass {
 
         // Factory methods:
         writer.newLine();
-        writer.write(tab(indent) + "public static " + bufferMapping + " create(Encoded<" + getEncodedType().valueMapping + "> encoded) {");
+        writer.write(tab(indent) + "public static " + bufferMapping.getGeneric(" ") + bufferMapping.parameterized() + " create(Encoded<" + getValueMapping().parameterized() + "> encoded) {");
         writer.newLine();
         writer.write(tab(++indent) + "if(encoded.isNull()) {");
         writer.newLine();
@@ -1593,23 +1589,29 @@ public class AmqpClass {
         writer.newLine();
         writer.write(tab(--indent) + "}");
         writer.newLine();
-        writer.write(tab(indent) + "return new " + bufferMapping + "(encoded);");
+        writer.write(tab(indent) + "return new " + bufferMapping.parameterized() + "(encoded);");
         writer.newLine();
         writer.write(tab(--indent) + "}");
         writer.newLine();
 
         writer.newLine();
-        writer.write(tab(indent) + "public static " + bufferMapping + " create(DataInput in, AmqpMarshaller marshaller) throws IOException, AmqpEncodingError {");
+        writer.write(tab(indent) + "public static " + bufferMapping.getGeneric(" ") + bufferMapping.shortName().parameterized()
+                + " create(DataInput in, AmqpMarshaller marshaller) throws IOException, AmqpEncodingError {");
         writer.newLine();
-        writer.write(tab(++indent) + "return create(marshaller.unmarshal" + getEncodedType().typeMapping + "(in));");
+        writer.write(tab(++indent) + "Encoded<" + getValueMapping().parameterized() + "> e = marshaller.unmarshal" + baseMapping.shortName().nonGeneric() + "(in);");
+        writer.newLine();
+        writer.write(tab(indent) + "return create(e);");
         writer.newLine();
         writer.write(tab(--indent) + "}");
         writer.newLine();
 
         writer.newLine();
-        writer.write(tab(indent) + "public static " + bufferMapping + " create(Buffer buffer, int offset, AmqpMarshaller marshaller) throws AmqpEncodingError {");
+        writer.write(tab(indent) + "public static " + bufferMapping.getGeneric(" ") + bufferMapping.shortName().parameterized()
+                + " create(Buffer buffer, int offset, AmqpMarshaller marshaller) throws AmqpEncodingError {");
+        writer.newLine();
+        writer.write(tab(++indent) + "Encoded<" + getValueMapping().parameterized() + "> e = marshaller.decode" + baseMapping.shortName().nonGeneric() + "(buffer, offset);");
         writer.newLine();
-        writer.write(tab(++indent) + "return create(marshaller.decode" + getEncodedType().typeMapping + "(buffer, offset));");
+        writer.write(tab(indent) + "return create(e);");
         writer.newLine();
         writer.write(tab(--indent) + "}");
         writer.newLine();
@@ -1626,14 +1628,14 @@ public class AmqpClass {
             ret = true;
 
             AmqpClass fieldClass = field.resolveAmqpFieldType();
-            AmqpClass baseType = fieldClass.resolveBaseType();
+            AmqpClass fieldBaseType = fieldClass.getBaseType();
 
             if (!buffer) {
 
                 // Setters:
-                if (baseType.isPrimitive() && !baseType.isAny() && !fieldClass.isEnumType() && !baseType.isDescribed() && !baseType.isMutable()) {
+                if (fieldBaseType.isPrimitive() && !fieldBaseType.isAny() && !fieldClass.isEnumType() && !fieldBaseType.isDescribed() && !fieldBaseType.isMutable()) {
                     writer.newLine();
-                    writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + baseType.valueMapping + " " + toJavaName(field.getName()) + ") {");
+                    writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + fieldBaseType.getValueMapping().parameterized() + " " + toJavaName(field.getName()) + ") {");
                     writer.newLine();
                     writer.write(tab(++indent) + "set" + capFirst(field.getJavaName()) + "(TypeFactory.create" + fieldClass.getJavaType() + "(" + toJavaName(field.getName()) + "));");
                     writer.newLine();
@@ -1641,11 +1643,13 @@ public class AmqpClass {
                     writer.newLine();
                     writer.newLine();
 
-                    if (baseType.getValueMapping().hasPrimitiveType()) {
+                    if (fieldBaseType.getValueMapping().hasPrimitiveType()) {
                         writer.newLine();
-                        writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + baseType.getValueMapping().getPrimitiveType() + " " + toJavaName(field.getName()) + ") {");
+                        writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + fieldBaseType.getValueMapping().getPrimitiveType() + " " + toJavaName(field.getName())
+                                + ") {");
                         writer.newLine();
-                        writer.write(tab(++indent) + "set" + capFirst(field.getJavaName()) + "(TypeFactory.create" + fieldClass.getJavaType() + "(" + toJavaName(field.getName()) + "));");
+                        writer.write(tab(++indent) + "set" + capFirst(field.getJavaName()) + "(TypeFactory.create" + fieldClass.getTypeMapping().nonGeneric() + "(" + toJavaName(field.getName())
+                                + "));");
                         writer.newLine();
                         writer.write(tab(--indent) + "}");
                         writer.newLine();
@@ -1653,8 +1657,10 @@ public class AmqpClass {
                     }
                 }
 
+                JavaTypeMapping returnType = field.resolveAccessorMapping().parameterized();
+
                 writer.newLine();
-                writer.write(tab(indent) + "public final void set" + capFirst(field.getJavaName()) + "(" + fieldClass.typeMapping + " " + toJavaName(field.getName()) + ") {");
+                writer.write(tab(indent) + "public final void set" + capFirst(field.getJavaName()) + "(" + returnType + " " + toJavaName(field.getName()) + ") {");
                 writer.newLine();
                 writer.write(tab(++indent) + "copyCheck();");
                 writer.newLine();
@@ -1665,10 +1671,12 @@ public class AmqpClass {
                 writer.newLine();
 
                 // Getter:
-                JavaTypeMapping returnType = fieldClass.isPrimitive() ? fieldClass.getValueMapping() : fieldClass.typeMapping;
+                if (fieldClass.isPrimitive() && !field.isMultiple() && !fieldClass.isMutable()) {
+                    returnType = fieldClass.getValueMapping().parameterized();
+                }
                 writer.write(tab(indent) + "public final " + returnType + " get" + capFirst(field.getJavaName()) + "() {");
                 writer.newLine();
-                if (!fieldClass.isAny() && fieldClass.isPrimitive() && !fieldClass.isMutable()) {
+                if (!fieldClass.isAny() && fieldClass.isPrimitive() && !fieldClass.isMutable() && !field.isMultiple()) {
                     writer.write(tab(++indent) + "return bean." + field.getJavaName() + ".getValue();");
                 } else {
                     writer.write(tab(++indent) + "return bean." + field.getJavaName() + ";");
@@ -1679,18 +1687,19 @@ public class AmqpClass {
             } else {
 
                 // Setters:
-                if (baseType.isPrimitive() && !baseType.isAny() && !fieldClass.isEnumType() && !baseType.isDescribed() && !baseType.isMutable()) {
+                if (fieldBaseType.isPrimitive() && !fieldBaseType.isAny() && !fieldClass.isEnumType() && !fieldBaseType.isDescribed() && !fieldBaseType.isMutable()) {
                     writer.newLine();
-                    writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + baseType.getValueMapping() + " " + toJavaName(field.getName()) + ") {");
+                    writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + fieldBaseType.getValueMapping() + " " + toJavaName(field.getName()) + ") {");
                     writer.newLine();
                     writer.write(tab(++indent) + "bean().set" + capFirst(field.getJavaName()) + "(" + toJavaName(field.getName()) + ");");
                     writer.newLine();
                     writer.write(tab(--indent) + "}");
                     writer.newLine();
 
-                    if (baseType.getValueMapping().hasPrimitiveType()) {
+                    if (fieldBaseType.getValueMapping().hasPrimitiveType()) {
                         writer.newLine();
-                        writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + baseType.getValueMapping().getPrimitiveType() + " " + toJavaName(field.getName()) + ") {");
+                        writer.write(tab(indent) + "public void set" + capFirst(field.getJavaName()) + "(" + fieldBaseType.getValueMapping().getPrimitiveType() + " " + toJavaName(field.getName())
+                                + ") {");
                         writer.newLine();
                         writer.write(tab(++indent) + "bean().set" + capFirst(field.getJavaName()) + "(" + toJavaName(field.getName()) + ");");
                         writer.newLine();
@@ -1699,17 +1708,22 @@ public class AmqpClass {
                         writer.newLine();
                     }
                 }
+
+                JavaTypeMapping returnType = field.resolveAccessorMapping().parameterized();
                 writer.newLine();
-                writer.write(tab(indent) + "public final void set" + capFirst(field.getJavaName()) + "(" + fieldClass.getTypeMapping() + " " + toJavaName(field.getName()) + ") {");
+                writer.write(tab(indent) + "public final void set" + capFirst(field.getJavaName()) + "(" + returnType.parameterized() + " " + toJavaName(field.getName()) + ") {");
                 writer.newLine();
                 writer.write(tab(++indent) + "bean().set" + capFirst(field.getJavaName()) + "(" + toJavaName(field.getName()) + ");");
                 writer.newLine();
                 writer.write(tab(--indent) + "}");
                 writer.newLine();
+
+                if (fieldClass.isPrimitive() && !field.isMultiple() && !fieldClass.isMutable()) {
+                    returnType = fieldClass.getValueMapping().parameterized();
+                }
                 // Getter:
-                JavaTypeMapping returnType = fieldClass.isPrimitive() ? fieldClass.getValueMapping() : fieldClass.typeMapping;
                 writer.newLine();
-                writer.write(tab(indent) + "public final " + returnType + " get" + capFirst(field.getJavaName()) + "() {");
+                writer.write(tab(indent) + "public final " + returnType.parameterized() + " get" + capFirst(field.getJavaName()) + "() {");
                 writer.newLine();
                 writer.write(tab(++indent) + "return bean().get" + capFirst(field.getJavaName()) + "();");
                 writer.newLine();
@@ -1718,7 +1732,7 @@ public class AmqpClass {
             }
         }
 
-        if (isMap()) {
+        if (isMap() || baseType.isMap()) {
             if (!buffer) {
                 writer.write(tab(indent) + "public void put(" + getMapKeyType() + " key, " + getMapValueType() + " value) {");
                 writer.newLine();
@@ -1789,7 +1803,7 @@ public class AmqpClass {
         } else if (isList()) {
             if (!buffer) {
                 writer.newLine();
-                writer.write(tab(indent) + "public void set(int index, " + TypeRegistry.any().typeMapping + " value) {");
+                writer.write(tab(indent) + "public void set(int index, V value) {");
                 writer.newLine();
                 writer.write(tab(++indent) + "copyCheck();");
                 writer.newLine();
@@ -1799,7 +1813,7 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(indent) + "public " + TypeRegistry.any().typeMapping + " get(int index) {");
+                writer.write(tab(indent) + "public V get(int index) {");
                 writer.newLine();
                 writer.write(tab(++indent) + "return bean.value.get(index);");
                 writer.newLine();
@@ -1815,16 +1829,16 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(indent) + "public Iterator<" + TypeRegistry.any().typeMapping + "> iterator() {");
+                writer.write(tab(indent) + "public Iterator<V> iterator() {");
                 writer.newLine();
-                writer.write(tab(++indent) + "return new AmqpListIterator<" + TypeRegistry.any().typeMapping + ">(bean.value);");
+                writer.write(tab(++indent) + "return new AmqpListIterator<V>(bean.value);");
                 writer.newLine();
                 writer.write(tab(--indent) + "}");
                 writer.newLine();
 
             } else {
                 writer.newLine();
-                writer.write(tab(indent) + "public void set(int index, " + TypeRegistry.any().typeMapping + " value) {");
+                writer.write(tab(indent) + "public void set(int index, V value) {");
                 writer.newLine();
                 writer.write(tab(++indent) + "bean().set(index, value);");
                 writer.newLine();
@@ -1832,7 +1846,7 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(indent) + "public " + TypeRegistry.any().typeMapping + " get(int index) {");
+                writer.write(tab(indent) + "public V get(int index) {");
                 writer.newLine();
                 writer.write(tab(++indent) + "return bean().get(index);");
                 writer.newLine();
@@ -1848,7 +1862,7 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(indent) + "public Iterator<" + TypeRegistry.any().typeMapping + "> iterator() {");
+                writer.write(tab(indent) + "public Iterator<V> iterator() {");
                 writer.newLine();
                 writer.write(tab(++indent) + "return bean().iterator();");
                 writer.newLine();
@@ -1858,8 +1872,8 @@ public class AmqpClass {
 
         }
 
-        if (isDescribed()) {
-            if (descriptor.resolveDescribedType().isList() && !buffer) {
+        if (isDescribed() && baseType.isList()) {
+            if (!buffer) {
 
                 writer.newLine();
                 writer.write(tab(indent) + "public void set(int index, " + TypeRegistry.any().typeMapping + " value) {");
@@ -1874,7 +1888,7 @@ public class AmqpClass {
                     if (fieldClass.isEnumType()) {
                         writer.write(tab(++indent) + "set" + capFirst(field.getJavaName()) + "(" + fieldClass.typeMapping + ".get((" + fieldClass.resolveRestrictedType().typeMapping + ")value));");
                     } else {
-                        writer.write(tab(++indent) + "set" + capFirst(field.getJavaName()) + "((" + fieldClass.typeMapping + ") value);");
+                        writer.write(tab(++indent) + "set" + capFirst(field.getJavaName()) + "((" + field.resolveAccessorMapping().parameterized() + ") value);");
                     }
                     writer.newLine();
                     writer.write(tab(indent) + "break;");
@@ -1941,27 +1955,49 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(indent) + "public " + descriptor.resolveDescribedType().getValueMapping() + " getValue() {");
+                writer.write(tab(indent) + "public Iterator<AmqpType<?, ?>> iterator() {");
                 writer.newLine();
-                writer.write(tab(++indent) + "return bean;");
+                writer.write(tab(++indent) + "return new AmqpListIterator<" + TypeRegistry.any().typeMapping + ">(bean);");
                 writer.newLine();
                 writer.write(tab(--indent) + "}");
                 writer.newLine();
 
+            } else {
                 writer.newLine();
-                writer.write(tab(indent) + "public Iterator<AmqpType<?, ?>> iterator() {");
+                writer.write(tab(indent) + "public void set(int index, " + TypeRegistry.any().typeMapping + " value) {");
                 writer.newLine();
-                writer.write(tab(++indent) + "return new AmqpListIterator<" + TypeRegistry.any().typeMapping + ">(bean);");
+                writer.write(tab(++indent) + "bean().set(index, value);");
                 writer.newLine();
                 writer.write(tab(--indent) + "}");
                 writer.newLine();
 
-            } else {
-                descriptor.resolveDescribedType().writeFieldAccesors(writer, indent, buffer);
+                writer.newLine();
+                writer.write(tab(indent) + "public " + TypeRegistry.any().typeMapping + " get(int index) {");
+                writer.newLine();
+                writer.write(tab(++indent) + "return bean().get(index);");
+                writer.newLine();
+                writer.write(tab(--indent) + "}");
+                writer.newLine();
+
+                writer.newLine();
+                writer.write(tab(indent) + "public int getListCount() {");
+                writer.newLine();
+                writer.write(tab(++indent) + "return bean().getListCount();");
+                writer.newLine();
+                writer.write(tab(--indent) + "}");
+                writer.newLine();
+
+                writer.newLine();
+                writer.write(tab(indent) + "public Iterator<" + TypeRegistry.any().typeMapping + "> iterator() {");
+                writer.newLine();
+                writer.write(tab(++indent) + "return bean().iterator();");
+                writer.newLine();
+                writer.write(tab(--indent) + "}");
+                writer.newLine();
             }
         }
 
-        if (isRestricted()) {
+        if (isRestricted() && !baseType.isMap()) {
             resolveRestrictedType().writeFieldAccesors(writer, indent, buffer);
         }
 
@@ -1992,7 +2028,7 @@ public class AmqpClass {
         if (isDescribed()) {
 
             // Write out symbol constants
-            if (resolveBaseType().isMap()) {
+            if (getBaseType().isMap()) {
                 writer.newLine();
                 for (AmqpField field : fields.values()) {
 
@@ -2010,7 +2046,7 @@ public class AmqpClass {
             for (AmqpField field : fields.values()) {
 
                 AmqpClass fieldClass = field.resolveAmqpFieldType();
-                AmqpClass baseType = fieldClass.resolveBaseType();
+                AmqpClass baseType = fieldClass.getBaseType();
 
                 if (baseType.isPrimitive() && !baseType.isAny() && !fieldClass.isEnumType() && !baseType.isDescribed() && !baseType.isMutable()) {
                     // Setter:
@@ -2030,13 +2066,16 @@ public class AmqpClass {
                 }
 
                 // Setters:
+                JavaTypeMapping returnType = field.resolveAccessorMapping().parameterized();
+
                 writer.newLine();
                 field.writeJavaDoc(writer, indent);
-                writer.write(tab(1) + "public void set" + capFirst(field.getJavaName()) + "(" + fieldClass.typeMapping + " " + toJavaName(field.getName()) + ");");
+                writer.write(tab(1) + "public void set" + capFirst(field.getJavaName()) + "(" + returnType + " " + toJavaName(field.getName()) + ");");
                 writer.newLine();
 
-                // Getter:
-                JavaTypeMapping returnType = fieldClass.isPrimitive() ? fieldClass.getValueMapping() : fieldClass.typeMapping;
+                if (fieldClass.isPrimitive() && !field.isMultiple() && !fieldClass.isMutable()) {
+                    returnType = fieldClass.getValueMapping().parameterized();
+                }
                 writer.newLine();
                 field.writeJavaDoc(writer, indent);
                 writer.write(tab(indent) + "public " + returnType + " get" + capFirst(field.getJavaName()) + "();");
@@ -2053,9 +2092,9 @@ public class AmqpClass {
 
         } else if (isList()) {
             doc.writeJavaDoc(writer, indent);
-            writer.write(tab(indent) + "public void set(int index, " + TypeRegistry.any().typeMapping + " value);");
+            writer.write(tab(indent) + "public void set(int index, V value);");
             writer.newLine();
-            writer.write(tab(indent) + "public " + TypeRegistry.any().typeMapping + " get(int index);");
+            writer.write(tab(indent) + "public V get(int index);");
             writer.newLine();
             writer.write(tab(indent) + "public int getListCount();");
             writer.newLine();
@@ -2064,7 +2103,7 @@ public class AmqpClass {
         if (isPrimitive() && !isMutable()) {
             // Getter:
             writer.newLine();
-            writer.write(tab(1) + "public " + valueMapping + " getValue();");
+            writer.write(tab(1) + "public " + valueMapping.parameterized() + " getValue();");
             writer.newLine();
         }
     }
@@ -2093,15 +2132,13 @@ public class AmqpClass {
 
         // Write out the descriptor (for compound types):
         if (descriptor != null) {
-            writer.write("public class " + typeMapping.getShortName() + "Marshaller implements DescribedTypeMarshaller<" + typeMapping + ">{");
+            writer.write("public class " + typeMapping.shortName().nonGeneric() + "Marshaller implements DescribedTypeMarshaller<" + typeMapping + ">{");
             writer.newLine();
 
             writer.newLine();
             writer.write(tab(1) + "static final " + typeMapping + "Marshaller SINGLETON = new " + typeMapping + "Marshaller();");
             writer.newLine();
-            writer.write(tab(1) + "private static final Encoded<" + getValueMapping() + "> NULL_ENCODED = new Encoder.NullEncoded<" + getValueMapping() + ">();");
-            writer.newLine();
-
+            
             writer.newLine();
             writer.write(tab(1) + "public static final String SYMBOLIC_ID = \"" + descriptor.getSymbolicName() + "\";");
             writer.newLine();
@@ -2152,7 +2189,7 @@ public class AmqpClass {
             writeEncodings(writer);
 
             writer.newLine();
-            writer.write(tab(1) + "public static final Encoded<" + getValueMapping() + "> encode(" + typeMapping + " value) throws AmqpEncodingError {");
+            writer.write(tab(1) + "public static final Encoded<" + getValueMapping() + "> encode(" + typeMapping.parameterized() + " value) throws AmqpEncodingError {");
             writer.newLine();
             writer.write(tab(2) + "return new " + typeMapping.getJavaType() + "Encoded(value);");
             writer.newLine();
@@ -2182,7 +2219,7 @@ public class AmqpClass {
             writer.newLine();
             writer.write(tab(2) + "if (fc == Encoder.NULL_FORMAT_CODE) {");
             writer.newLine();
-            writer.write(tab(3) + "return NULL_ENCODED;");
+            writer.write(tab(3) + "return Encoder.getNullEncoded();");
             writer.newLine();
             writer.write(tab(2) + "}");
             writer.newLine();
@@ -2216,15 +2253,12 @@ public class AmqpClass {
         // Add accessors for primitive encoded sizes:
         else if (isPrimitive()) {
 
-            writer.write("public class " + typeMapping.getShortName() + "Marshaller {");
+            writer.write("public class " + typeMapping.shortName().nonGeneric() + "Marshaller {");
             writer.newLine();
 
             writer.newLine();
             writer.write(tab(1) + "private static final Encoder ENCODER = Encoder.SINGLETON;");
             writer.newLine();
-            writer.write(tab(1) + "private static final Encoded<" + getValueMapping() + "> NULL_ENCODED = new Encoder.NullEncoded<" + getValueMapping() + ">();");
-
-            writer.newLine();
 
             writeEncodings(writer);
 
@@ -2232,11 +2266,11 @@ public class AmqpClass {
             // Handle fixed width encodings:
             if (!hasMultipleEncodings() && !hasNonFixedEncoding()) {
                 writer.newLine();
-                writer.write(tab(1) + "public static final Encoded<" + getValueMapping() + "> encode(" + getJavaType() + " data) throws AmqpEncodingError {");
+                writer.write(tab(1) + "public static final Encoded<" + getValueMapping().parameterized() + "> encode(" + typeMapping.parameterized() + " data) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "if(data == null) {");
                 writer.newLine();
-                writer.write(tab(3) + "return NULL_ENCODED;");
+                writer.write(tab(3) + "return Encoder.getNullEncoded();");
                 writer.newLine();
                 writer.write(tab(2) + "}");
                 writer.newLine();
@@ -2246,7 +2280,7 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(Buffer source, int offset) throws AmqpEncodingError {");
+                writer.write(tab(1) + "static final Encoded<" + getValueMapping().parameterized() + "> createEncoded(Buffer source, int offset) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "return createEncoded(FormatCategory.createBuffer(source, offset));");
                 writer.newLine();
@@ -2254,25 +2288,24 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(DataInput in) throws IOException, AmqpEncodingError {");
+                writer.write(tab(1) + "static final Encoded<" + getValueMapping().parameterized() + "> createEncoded(DataInput in) throws IOException, AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "return createEncoded(FormatCategory.createBuffer(in.readByte(), in));");
                 writer.newLine();
                 writer.write(tab(1) + "}");
                 writer.newLine();
 
-                writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(EncodedBuffer buffer) throws AmqpEncodingError {");
+                writer.write(tab(1) + "static final Encoded<" + getValueMapping().parameterized() + "> createEncoded(EncodedBuffer buffer) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "if(buffer.getEncodingFormatCode() == AmqpNullMarshaller.FORMAT_CODE) {");
                 writer.newLine();
-                writer.write(tab(3) + "return new Encoder.NullEncoded<" + getValueMapping() + ">();");
+                writer.write(tab(3) + "return Encoder.getNullEncoded();");
                 writer.newLine();
                 writer.write(tab(2) + "}");
                 writer.newLine();
                 writer.write(tab(2) + "if(buffer.getEncodingFormatCode() != FORMAT_CODE) {");
                 writer.newLine();
-                writer.write(tab(3) + "throw new AmqpEncodingError(\"Unexpected format for " + typeMapping.getShortName() + " expected: \" + FORMAT_CODE);");
+                writer.write(tab(3) + "throw new AmqpEncodingError(\"Unexpected format for " + typeMapping.shortName().nonGeneric() + " expected: \" + FORMAT_CODE);");
                 writer.newLine();
                 writer.write(tab(2) + "}");
                 writer.newLine();
@@ -2284,7 +2317,8 @@ public class AmqpClass {
             } else {
 
                 writer.newLine();
-                writer.write(tab(1) + "private static final " + getEncodingName(false) + " chooseEncoding(" + getJavaType() + " val) throws AmqpEncodingError {");
+                writer.write(tab(1) + "private static final " + getTypeMapping().getGeneric(" ") + getEncodingName(false) + " chooseEncoding(" + typeMapping.parameterized()
+                        + " val) throws AmqpEncodingError {");
                 writer.newLine();
                 if (isMutable()) {
                     writer.write(tab(2) + "return Encoder.choose" + capFirst(name) + "Encoding(val);");
@@ -2296,7 +2330,8 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "private static final " + getEncodingName(false) + " chooseEncoding(" + valueMapping + " val) throws AmqpEncodingError {");
+                writer.write(tab(1) + "private static final " + getTypeMapping().getGeneric(" ") + getEncodingName(false) + " chooseEncoding(" + valueMapping.parameterized()
+                        + " val) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "return Encoder.choose" + capFirst(name) + "Encoding(val);");
                 writer.newLine();
@@ -2304,11 +2339,12 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> encode(" + getJavaType() + " data) throws AmqpEncodingError {");
+                writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized() + "> encode(" + typeMapping.parameterized()
+                        + " data) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "if(data == null) {");
                 writer.newLine();
-                writer.write(tab(3) + "return NULL_ENCODED;");
+                writer.write(tab(3) + "return Encoder.getNullEncoded();");
                 writer.newLine();
                 writer.write(tab(2) + "}");
                 writer.newLine();
@@ -2322,7 +2358,8 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(Buffer source, int offset) throws AmqpEncodingError {");
+                writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized()
+                        + "> createEncoded(Buffer source, int offset) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "return createEncoded(FormatCategory.createBuffer(source, offset));");
                 writer.newLine();
@@ -2330,7 +2367,8 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(" + getValueMapping() + " val) throws AmqpEncodingError {");
+                writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized() + "> createEncoded(" + getValueMapping()
+                        + " val) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "return " + getEncodingName(false) + ".createEncoded(chooseEncoding(val).FORMAT_CODE, val);");
                 writer.newLine();
@@ -2338,7 +2376,8 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(DataInput in) throws IOException, AmqpEncodingError {");
+                writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized()
+                        + "> createEncoded(DataInput in) throws IOException, AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "return createEncoded(FormatCategory.createBuffer(in.readByte(), in));");
                 writer.newLine();
@@ -2346,22 +2385,43 @@ public class AmqpClass {
                 writer.newLine();
 
                 writer.newLine();
-                writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(EncodedBuffer buffer) throws AmqpEncodingError {");
+                writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized()
+                        + "> createEncoded(EncodedBuffer buffer) throws AmqpEncodingError {");
                 writer.newLine();
                 writer.write(tab(2) + "if(buffer.getEncodingFormatCode() == AmqpNullMarshaller.FORMAT_CODE) {");
                 writer.newLine();
-                writer.write(tab(3) + "return NULL_ENCODED;");
+                writer.write(tab(3) + "return Encoder.getNullEncoded();");
                 writer.newLine();
                 writer.write(tab(2) + "}");
                 writer.newLine();
-                writer.write(tab(2) + "return " + getEncodingName(false) + ".createEncoded(buffer);");
+                if(isMap())
+                {
+                    writer.write(tab(2) + getJavaType() + "Encoded" + getTypeMapping().parameterized().getGeneric("") + " rc = " + getEncodingName(false) + ".createEncoded(buffer);");
+                    writer.newLine();
+                    writer.write(tab(2) + "rc.setDecoder(Encoder.DEFAULT_MAP_DECODER);");
+                    writer.newLine();
+                    writer.write(tab(2) + "return rc;");
+                }
+                else if(isList())
+                {
+                    writer.write(tab(2) + getJavaType() + "Encoded" + getTypeMapping().parameterized().getGeneric("") + " rc = " + getEncodingName(false) + ".createEncoded(buffer);");
+                    writer.newLine();
+                    writer.write(tab(2) + "rc.setDecoder(Encoder.DEFAULT_LIST_DECODER);");
+                    writer.newLine();
+                    writer.write(tab(2) + "return rc;");
+                }
+                else
+                {
+                    writer.write(tab(2) + "return " + getEncodingName(false) + ".createEncoded(buffer);");
+                }
                 writer.newLine();
                 writer.write(tab(1) + "}");
                 writer.newLine();
 
                 if (isList()) {
                     writer.newLine();
-                    writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(DataInput in, ListDecoder decoder) throws IOException, AmqpEncodingError {");
+                    writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized()
+                            + "> createEncoded(DataInput in, ListDecoder<V> decoder) throws IOException, AmqpEncodingError {");
                     writer.newLine();
                     writer.write(tab(2) + "return createEncoded(FormatCategory.createBuffer(in.readByte(), in), decoder);");
                     writer.newLine();
@@ -2369,15 +2429,16 @@ public class AmqpClass {
                     writer.newLine();
 
                     writer.newLine();
-                    writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(EncodedBuffer buffer, ListDecoder decoder) throws AmqpEncodingError {");
+                    writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized()
+                            + "> createEncoded(EncodedBuffer buffer, ListDecoder<V> decoder) throws AmqpEncodingError {");
                     writer.newLine();
                     writer.write(tab(2) + "if(buffer.getEncodingFormatCode() == AmqpNullMarshaller.FORMAT_CODE) {");
                     writer.newLine();
-                    writer.write(tab(3) + "return NULL_ENCODED;");
+                    writer.write(tab(3) + "return Encoder.getNullEncoded();");
                     writer.newLine();
                     writer.write(tab(2) + "}");
                     writer.newLine();
-                    writer.write(tab(2) + getJavaType() + "Encoded rc = " + getEncodingName(false) + ".createEncoded(buffer);");
+                    writer.write(tab(2) + getJavaType() + "Encoded" + getTypeMapping().parameterized().getGeneric("") + " rc = " + getEncodingName(false) + ".createEncoded(buffer);");
                     writer.newLine();
                     writer.write(tab(2) + "rc.setDecoder(decoder);");
                     writer.newLine();
@@ -2389,7 +2450,8 @@ public class AmqpClass {
 
                 if (isMap()) {
                     writer.newLine();
-                    writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(DataInput in, MapDecoder decoder) throws IOException, AmqpEncodingError {");
+                    writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized()
+                            + "> createEncoded(DataInput in, MapDecoder<K, V> decoder) throws IOException, AmqpEncodingError {");
                     writer.newLine();
                     writer.write(tab(2) + "return createEncoded(FormatCategory.createBuffer(in.readByte(), in), decoder);");
                     writer.newLine();
@@ -2397,15 +2459,16 @@ public class AmqpClass {
                     writer.newLine();
 
                     writer.newLine();
-                    writer.write(tab(1) + "static final Encoded<" + getValueMapping() + "> createEncoded(EncodedBuffer buffer, MapDecoder decoder) throws AmqpEncodingError {");
+                    writer.write(tab(1) + "static final " + getTypeMapping().getGeneric(" ") + "Encoded<" + getValueMapping().parameterized()
+                            + "> createEncoded(EncodedBuffer buffer, MapDecoder<K, V> decoder) throws AmqpEncodingError {");
                     writer.newLine();
                     writer.write(tab(2) + "if(buffer.getEncodingFormatCode() == AmqpNullMarshaller.FORMAT_CODE) {");
                     writer.newLine();
-                    writer.write(tab(3) + "return NULL_ENCODED;");
+                    writer.write(tab(3) + "return Encoder.getNullEncoded();");
                     writer.newLine();
                     writer.write(tab(2) + "}");
                     writer.newLine();
-                    writer.write(tab(2) + getJavaType() + "Encoded rc = " + getEncodingName(false) + ".createEncoded(buffer);");
+                    writer.write(tab(2) + getJavaType() + "Encoded" + getTypeMapping().parameterized().getGeneric("") + " rc = " + getEncodingName(false) + ".createEncoded(buffer);");
                     writer.newLine();
                     writer.write(tab(2) + "rc.setDecoder(decoder);");
                     writer.newLine();
@@ -2422,6 +2485,66 @@ public class AmqpClass {
         writer.flush();
     }
 
+    private void resolveMappings() throws UnknownTypeException {
+        if (mappingsResolved) {
+            return;
+        }
+        mappingsResolved = true;
+
+        if (isRestricted()) {
+            baseType = TypeRegistry.resolveAmqpClass(restrictedType);
+        } else if (isDescribed()) {
+            baseType = descriptor.resolveDescribedType();
+        } else {
+            baseType = this;
+        }
+        baseMapping = baseType.getTypeMapping();
+
+        // ValueMapping:
+        if (isPrimitive()) {
+            valueMapping = TypeRegistry.getJavaTypeMapping(name);
+        } else if (isRestricted()) {
+            if (isEnumType()) {
+                valueMapping = typeMapping;
+            } else {
+                valueMapping = baseType.getValueMapping();
+            }
+        } else if (isDescribed()) {
+            valueMapping = baseType.getValueMapping();
+        } else {
+            valueMapping = this.typeMapping;
+        }
+
+        if (isList()) {
+            typeMapping.setGenerics("V extends " + TypeRegistry.any().getTypeMapping());
+            beanMapping.setGenerics(typeMapping.getGenerics());
+            bufferMapping.setGenerics(typeMapping.getGenerics());
+            valueMapping = valueMapping.parameterized("V");
+        }
+
+        if (isMap()) {
+            mapKeyType = "K";
+            mapValueType = "V";
+            typeMapping.setGenerics("K extends " + TypeRegistry.any().getTypeMapping(), "V extends " + TypeRegistry.any().getTypeMapping());
+            beanMapping.setGenerics(typeMapping.getGenerics());
+            bufferMapping.setGenerics(typeMapping.getGenerics());
+            valueMapping = valueMapping.parameterized(mapKeyType, mapValueType);
+
+        }
+
+        if (isDescribed() || isRestricted()) {
+            if (baseType.isList()) {
+                baseMapping = baseMapping.parameterized(TypeRegistry.any().getTypeMapping().toString());
+                valueMapping = valueMapping.parameterized(TypeRegistry.any().getTypeMapping().toString());
+            }
+            if (baseType.isMap()) {
+                mapKeyType = TypeRegistry.resolveAmqpClass("symbol").getJavaType();
+                baseMapping = baseMapping.parameterized(mapKeyType, mapValueType);
+                valueMapping = valueMapping.parameterized(mapKeyType, mapValueType);
+            }
+        }
+    }
+
     public String getJavaType() {
         return typeMapping.getJavaType();
     }
@@ -2443,7 +2566,7 @@ public class AmqpClass {
     }
 
     public boolean isMutable() throws UnknownTypeException {
-        AmqpClass baseType = resolveBaseType();
+        resolveMappings();
         if (baseType.isPrimitive() && !(baseType.isList() || baseType.isMap())) {
             return false;
         } else {
@@ -2479,9 +2602,9 @@ public class AmqpClass {
         if (isAny()) {
             return "AmqpMarshaller.SINGLETON";
         } else if (isRestricted()) {
-            return resolveRestrictedType().getTypeMapping() + "Marshaller";
+            return resolveRestrictedType().getTypeMapping().shortName().nonGeneric() + "Marshaller";
         } else {
-            return getTypeMapping() + "Marshaller";
+            return getTypeMapping().shortName().nonGeneric() + "Marshaller";
         }
     }
 
@@ -2496,6 +2619,7 @@ public class AmqpClass {
     }
 
     public AmqpClass getDescribedType() throws UnknownTypeException {
+        resolveMappings();
         return descriptor.resolveDescribedType();
     }
 
@@ -2515,10 +2639,6 @@ public class AmqpClass {
         return name.equals("list");
     }
 
-    public final String getListElementType() {
-        return listElementType;
-    }
-
     public boolean isMarshallable() {
         return isDescribed() || isPrimitive() || (isRestricted() && !isEnumType());
     }
@@ -2642,12 +2762,7 @@ public class AmqpClass {
      * @throws UnknownTypeException
      */
     public JavaTypeMapping getValueMapping() throws UnknownTypeException {
-        if (valueMapping == null) {
-            if (isDescribed()) {
-                valueMapping = descriptor.resolveDescribedType().getValueMapping();
-            }
-        }
-
+        resolveMappings();
         return valueMapping;
     }
 
@@ -2657,14 +2772,10 @@ public class AmqpClass {
      * @return
      * @throws UnknownTypeException
      */
-    public AmqpClass resolveBaseType() throws UnknownTypeException {
-        if (isRestricted()) {
-            return TypeRegistry.resolveAmqpClass(restrictedType);
-        } else if (isDescribed()) {
-            return getDescribedType();
-        } else {
-            return this;
-        }
+    public AmqpClass getBaseType() throws UnknownTypeException {
+        resolveMappings();
+        return baseType;
+
     }
 
     public JavaTypeMapping getTypeMapping() {

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpField.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpField.java?rev=946684&r1=946683&r2=946684&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpField.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpField.java Thu May 20 16:13:58 2010
@@ -5,6 +5,7 @@ import static org.apache.activemq.amqp.g
 import java.io.BufferedWriter;
 import java.io.IOException;
 
+import org.apache.activemq.amqp.generator.TypeRegistry.JavaTypeMapping;
 import org.apache.activemq.amqp.generator.jaxb.schema.Doc;
 import org.apache.activemq.amqp.generator.jaxb.schema.Field;
 
@@ -26,7 +27,7 @@ public class AmqpField {
         required = new Boolean(field.getRequired()).booleanValue();
         type = field.getType();
         doc.setLabel(label);
-        
+
         for (Object object : field.getDocOrException()) {
             if (object instanceof Doc) {
                 doc.parseFromDoc((Doc) object);
@@ -101,6 +102,18 @@ public class AmqpField {
         return ampqClass;
     }
 
+    public JavaTypeMapping resolveAccessorMapping() throws UnknownTypeException {
+        AmqpClass amqpClass = TypeRegistry.resolveAmqpClass(this);
+        if (isMultiple()) {
+            // Swap with the value type for enum types:
+            if (amqpClass.isEnumType()) {
+                return TypeRegistry.resolveAmqpClass("list").getTypeMapping().parameterized(amqpClass.getBaseType().getTypeMapping().toString());
+            }
+            return TypeRegistry.resolveAmqpClass("list").getTypeMapping().parameterized(amqpClass.getTypeMapping().toString());
+        }
+        return amqpClass.getTypeMapping().wildcard();
+    }
+
     public void writeJavaDoc(BufferedWriter writer, int indent) throws IOException {
         doc.writeJavaDoc(writer, indent);
     }