http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MarshallingGenerator.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MarshallingGenerator.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MarshallingGenerator.java
deleted file mode 100644
index b03c603..0000000
--- 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MarshallingGenerator.java
+++ /dev/null
@@ -1,712 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.activemq.openwire.generator;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.codehaus.jam.JAnnotation;
-import org.codehaus.jam.JAnnotationValue;
-import org.codehaus.jam.JClass;
-import org.codehaus.jam.JPackage;
-import org.codehaus.jam.JProperty;
-
-/**
- * Generates the binary marshalers for the OpenWire commands.
- */
-public class MarshallingGenerator extends MultiSourceGenerator {
-
-    protected List<JClass> concreteClasses = new ArrayList<JClass>();
-    protected File factoryFile;
-    protected String factoryFileName = "MarshallerFactory";
-    protected String indent = "    ";
-
-    private final String packagePrefixPath = codecPackageRoot.replace('.', 
'/');
-
-    public MarshallingGenerator() {
-        this.targetDir = "src/main/java";
-    }
-
-    @Override
-    public Object run() {
-        if (destDir == null) {
-            destDir = new File(getTargetDir() + "/" + packagePrefixPath + "/v" 
+ getOpenwireVersion());
-        }
-        Object answer = super.run();
-        //processFactory();
-        return answer;
-    }
-
-    @Override
-    protected void generateFile(PrintWriter out) throws Exception {
-
-        generateLicence(out);
-        out.println("");
-        out.println("package " + getCodecPackageRoot() + ".v" + 
getOpenwireVersion() + ";");
-        out.println("");
-        out.println("import java.io.DataInput;");
-        out.println("import java.io.DataOutput;");
-        out.println("import java.io.IOException;");
-        out.println("");
-        out.println("import " + getCodecPackageRoot() + ".*;");
-        out.println("import " + getCommandsPackage() + ".*;");
-        out.println("");
-
-        for (JPackage pkg : getJclass().getImportedPackages()) {
-            for (JClass clazz : pkg.getClasses()) {
-                out.println("import " + clazz.getQualifiedName() + ";");
-            }
-        }
-
-        out.println("");
-        out.println("/**");
-        out.println(" * Marshalling code for Open Wire for " + getClassName() 
+ "");
-        out.println(" *");
-        out.println(" * NOTE!: This file is auto generated - do not modify!");
-        out.println(" *");
-        out.println(" */");
-        out.println("public " + getAbstractClassText() + "class " + 
getClassName() + " extends " + getBaseClass() + " {");
-        out.println("");
-
-        if (!isAbstractClass()) {
-
-            out.println("    /**");
-            out.println("     * Return the type of Data Structure we marshal");
-            out.println("     * @return short representation of the type data 
structure");
-            out.println("     */");
-            out.println("    public byte getDataStructureType() {");
-            out.println("        return " + getJclass().getSimpleName() + 
".DATA_STRUCTURE_TYPE;");
-            out.println("    }");
-            out.println("    ");
-            out.println("    /**");
-            out.println("     * @return a new object instance");
-            out.println("     */");
-            out.println("    public DataStructure createObject() {");
-            out.println("        return new " + getJclass().getSimpleName() + 
"();");
-            out.println("    }");
-            out.println("");
-        }
-
-        out.println("    /**");
-        out.println("     * Un-marshal an object instance from the data input 
stream");
-        out.println("     *");
-        out.println("     * @param o the object to un-marshal");
-        out.println("     * @param dataIn the data input stream to build the 
object from");
-        out.println("     * @throws IOException");
-        out.println("     */");
-        out.println("    public void tightUnmarshal(OpenWireFormat wireFormat, 
Object o, DataInput dataIn, BooleanStream bs) throws IOException {");
-        out.println("        super.tightUnmarshal(wireFormat, o, dataIn, 
bs);");
-
-        if (!getProperties().isEmpty()) {
-            out.println("");
-            out.println("        " + getJclass().getSimpleName() + " info = (" 
+ getJclass().getSimpleName() + ")o;");
-        }
-
-        if (isMarshallerAware()) {
-            out.println("");
-            out.println("        info.beforeUnmarshall(wireFormat);");
-            out.println("        ");
-        }
-
-        generateTightUnmarshalBody(out);
-
-        if (isMarshallerAware()) {
-            out.println("");
-            out.println("        info.afterUnmarshall(wireFormat);");
-        }
-
-        out.println("");
-        out.println("    }");
-        out.println("");
-        out.println("");
-        out.println("    /**");
-        out.println("     * Write the booleans that this object uses to a 
BooleanStream");
-        out.println("     */");
-        out.println("    public int tightMarshal1(OpenWireFormat wireFormat, 
Object o, BooleanStream bs) throws IOException {");
-
-        if (!getProperties().isEmpty()) {
-            out.println("");
-            out.println("        " + getJclass().getSimpleName() + " info = (" 
+ getJclass().getSimpleName() + ")o;");
-        }
-
-        if (isMarshallerAware()) {
-            out.println("");
-            out.println("        info.beforeMarshall(wireFormat);");
-        }
-
-        out.println("");
-        out.println("        int rc = super.tightMarshal1(wireFormat, o, 
bs);");
-        int baseSize = generateTightMarshal1Body(out);
-
-        out.println("");
-        out.println("        return rc + " + baseSize + ";");
-        out.println("    }");
-        out.println("");
-        out.println("    /**");
-        out.println("     * Write a object instance to data output stream");
-        out.println("     *");
-        out.println("     * @param o the instance to be marshaled");
-        out.println("     * @param dataOut the output stream");
-        out.println("     * @throws IOException thrown if an error occurs");
-        out.println("     */");
-        out.println("    public void tightMarshal2(OpenWireFormat wireFormat, 
Object o, DataOutput dataOut, BooleanStream bs) throws IOException {");
-        out.println("        super.tightMarshal2(wireFormat, o, dataOut, 
bs);");
-        if (!getProperties().isEmpty()) {
-            out.println("");
-            out.println("        " + getJclass().getSimpleName() + " info = (" 
+ getJclass().getSimpleName() + ")o;");
-        }
-
-        generateTightMarshal2Body(out);
-
-        if (isMarshallerAware()) {
-            out.println("");
-            out.println("        info.afterMarshall(wireFormat);");
-        }
-
-        out.println("");
-        out.println("    }");
-        out.println("");
-        out.println("    /**");
-        out.println("     * Un-marshal an object instance from the data input 
stream");
-        out.println("     *");
-        out.println("     * @param o the object to un-marshal");
-        out.println("     * @param dataIn the data input stream to build the 
object from");
-        out.println("     * @throws IOException");
-        out.println("     */");
-        out.println("    public void looseUnmarshal(OpenWireFormat wireFormat, 
Object o, DataInput dataIn) throws IOException {");
-        out.println("        super.looseUnmarshal(wireFormat, o, dataIn);");
-
-        if (!getProperties().isEmpty()) {
-            out.println("");
-            out.println("        " + getJclass().getSimpleName() + " info = (" 
+ getJclass().getSimpleName() + ")o;");
-        }
-
-        if (isMarshallerAware()) {
-            out.println("");
-            out.println("        info.beforeUnmarshall(wireFormat);");
-            out.println("        ");
-        }
-
-        generateLooseUnmarshalBody(out);
-
-        if (isMarshallerAware()) {
-            out.println("");
-            out.println("        info.afterUnmarshall(wireFormat);");
-        }
-
-        out.println("");
-        out.println("    }");
-        out.println("");
-        out.println("");
-        out.println("    /**");
-        out.println("     * Write the booleans that this object uses to a 
BooleanStream");
-        out.println("     */");
-        out.println("    public void looseMarshal(OpenWireFormat wireFormat, 
Object o, DataOutput dataOut) throws IOException {");
-
-        if (!getProperties().isEmpty()) {
-            out.println("");
-            out.println("        " + getJclass().getSimpleName() + " info = (" 
+ getJclass().getSimpleName() + ")o;");
-        }
-
-        if (isMarshallerAware()) {
-            out.println("");
-            out.println("        info.beforeMarshall(wireFormat);");
-        }
-
-        out.println("");
-        out.println("        super.looseMarshal(wireFormat, o, dataOut);");
-
-        generateLooseMarshalBody(out);
-
-        out.println("");
-        out.println("    }");
-        out.println("}");
-    }
-
-    private void generateLicence(PrintWriter out) {
-        out.println("/**");
-        out.println(" *");
-        out.println(" * Licensed to the Apache Software Foundation (ASF) under 
one or more");
-        out.println(" * contributor license agreements.  See the NOTICE file 
distributed with");
-        out.println(" * this work for additional information regarding 
copyright ownership.");
-        out.println(" * The ASF licenses this file to You under the Apache 
License, Version 2.0");
-        out.println(" * (the \"License\"); you may not use this file except in 
compliance with");
-        out.println(" * the License.  You may obtain a copy of the License 
at");
-        out.println(" *");
-        out.println(" * http://www.apache.org/licenses/LICENSE-2.0";);
-        out.println(" *");
-        out.println(" * Unless required by applicable law or agreed to in 
writing, software");
-        out.println(" * distributed under the License is distributed on an 
\"AS IS\" BASIS,");
-        out.println(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.");
-        out.println(" * See the License for the specific language governing 
permissions and");
-        out.println(" * limitations under the License.");
-        out.println(" */");
-    }
-
-    protected void processFactory() {
-        if (factoryFile == null) {
-            factoryFile = new File(destDir, factoryFileName + filePostFix);
-        }
-        PrintWriter out = null;
-        try {
-            out = new PrintWriter(new FileWriter(factoryFile));
-            generateFactory(out);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (out != null) {
-                out.close();
-            }
-        }
-    }
-
-    protected void generateFactory(PrintWriter out) {
-        generateLicence(out);
-        out.println("");
-        out.println("package " + getCodecPackageRoot() + ".v" + 
getOpenwireVersion() + ";");
-        out.println("");
-        out.println("import " + getCodecPackageRoot() + 
".DataStreamMarshaller;");
-        out.println("import " + getCodecPackageRoot() + ".OpenWireFormat;");
-        out.println("");
-        out.println("/**");
-        out.println(" * MarshallerFactory for Open Wire Format.");
-        out.println(" *");
-        out.println(" *");
-        out.println(" * NOTE!: This file is auto generated - do not modify!");
-        out.println(" * ");
-        out.println(" */");
-        out.println("public class MarshallerFactory {");
-        out.println("");
-        out.println("    /**");
-        out.println("     * Creates a Map of command type -> Marshallers");
-        out.println("     */");
-        out.println("    static final private DataStreamMarshaller 
marshaller[] = new DataStreamMarshaller[256];");
-        out.println("    static {");
-        out.println("");
-
-        List<JClass> list = new ArrayList<JClass>(getConcreteClasses());
-        Collections.sort(list, new Comparator<JClass>() {
-            @Override
-            public int compare(JClass o1, JClass o2) {
-                return o1.getSimpleName().compareTo(o2.getSimpleName());
-            }
-        });
-
-        for (Iterator<JClass> iter = list.iterator(); iter.hasNext();) {
-            JClass jclass = iter.next();
-            out.println("        add(new " + jclass.getSimpleName() + 
"Marshaller());");
-        }
-
-        out.println("");
-        out.println("    }");
-        out.println("");
-        out.println("    static private void add(DataStreamMarshaller dsm) {");
-        out.println("        marshaller[dsm.getDataStructureType()] = dsm;");
-        out.println("    }");
-        out.println("    ");
-        out.println("    static public DataStreamMarshaller[] 
createMarshallerMap(OpenWireFormat wireFormat) {");
-        out.println("        return marshaller;");
-        out.println("    }");
-        out.println("}");
-    }
-
-    @Override
-    protected void processClass(JClass jclass) {
-        super.processClass(jclass);
-
-        if (!jclass.isAbstract()) {
-            concreteClasses.add(jclass);
-        }
-    }
-
-    @Override
-    protected String getClassName(JClass jclass) {
-        return super.getClassName(jclass) + "Marshaller";
-    }
-
-    @Override
-    protected String getBaseClassName(JClass jclass) {
-        String answer = "BaseDataStreamMarshaller";
-        JClass superclass = jclass.getSuperclass();
-        if (superclass != null) {
-            String superName = superclass.getSimpleName();
-            if (!superName.equals("Object") && 
!superName.equals("JNDIBaseStorable") && 
!superName.equals("DataStructureSupport")) {
-                answer = superName + "Marshaller";
-            }
-        }
-        return answer;
-    }
-
-    @Override
-    protected void initialiseManuallyMaintainedClasses() {
-    }
-
-    protected void generateTightUnmarshalBody(PrintWriter out) {
-        for (JProperty property : getProperties()) {
-            JAnnotation annotation = 
property.getAnnotation("openwire:property");
-            JAnnotationValue size = annotation.getValue("size");
-            JClass propertyType = property.getType();
-            String propertyTypeName = propertyType.getSimpleName();
-
-            if (propertyType.isArrayType() && 
!propertyTypeName.equals("byte[]")) {
-                generateTightUnmarshalBodyForArrayProperty(out, property, 
size);
-            } else {
-                generateTightUnmarshalBodyForProperty(out, property, size);
-            }
-        }
-    }
-
-    protected void generateTightUnmarshalBodyForProperty(PrintWriter out, 
JProperty property, JAnnotationValue size) {
-        String setter = property.getSetter().getSimpleName();
-        String type = property.getType().getSimpleName();
-
-        if (type.equals("boolean")) {
-            out.println("        info." + setter + "(bs.readBoolean());");
-        } else if (type.equals("byte")) {
-            out.println("        info." + setter + "(dataIn.readByte());");
-        } else if (type.equals("char")) {
-            out.println("        info." + setter + "(dataIn.readChar());");
-        } else if (type.equals("short")) {
-            out.println("        info." + setter + "(dataIn.readShort());");
-        } else if (type.equals("int")) {
-            out.println("        info." + setter + "(dataIn.readInt());");
-        } else if (type.equals("long")) {
-            out.println("        info." + setter + 
"(tightUnmarshalLong(wireFormat, dataIn, bs));");
-        } else if (type.equals("String")) {
-            out.println("        info." + setter + 
"(tightUnmarshalString(dataIn, bs));");
-        } else if (type.equals("byte[]")) {
-            if (size != null) {
-                out.println("        info." + setter + 
"(tightUnmarshalConstByteArray(dataIn, bs, " + size.asInt() + "));");
-            } else {
-                out.println("        info." + setter + 
"(tightUnmarshalByteArray(dataIn, bs));");
-            }
-        } else if (type.equals("ByteSequence")) {
-            out.println("        info." + setter + 
"(tightUnmarshalByteSequence(dataIn, bs));");
-        } else if (isThrowable(property.getType())) {
-            out.println("        info." + setter + "((" + 
property.getType().getQualifiedName() + ") tightUnmarsalThrowable(wireFormat, 
dataIn, bs));");
-        } else if (isCachedProperty(property)) {
-            out.println("        info." + setter + "((" + 
property.getType().getQualifiedName() + ") 
tightUnmarsalCachedObject(wireFormat, dataIn, bs));");
-        } else {
-            out.println("        info." + setter + "((" + 
property.getType().getQualifiedName() + ") 
tightUnmarsalNestedObject(wireFormat, dataIn, bs));");
-        }
-    }
-
-    protected void generateTightUnmarshalBodyForArrayProperty(PrintWriter out, 
JProperty property, JAnnotationValue size) {
-        JClass propertyType = property.getType();
-        String arrayType = 
propertyType.getArrayComponentType().getQualifiedName();
-        String setter = property.getSetter().getSimpleName();
-        out.println();
-        if (size != null) {
-            out.println("        {");
-            out.println("            " + arrayType + " value[] = new " + 
arrayType + "[" + size.asInt() + "];");
-            out.println("            " + "for( int i=0; i < " + size.asInt() + 
"; i++ ) {");
-            out.println("                value[i] = (" + arrayType + ") 
tightUnmarsalNestedObject(wireFormat,dataIn, bs);");
-            out.println("            }");
-            out.println("            info." + setter + "(value);");
-            out.println("        }");
-        } else {
-            out.println("        if (bs.readBoolean()) {");
-            out.println("            short size = dataIn.readShort();");
-            out.println("            " + arrayType + " value[] = new " + 
arrayType + "[size];");
-            out.println("            for( int i=0; i < size; i++ ) {");
-            out.println("                value[i] = (" + arrayType + ") 
tightUnmarsalNestedObject(wireFormat,dataIn, bs);");
-            out.println("            }");
-            out.println("            info." + setter + "(value);");
-            out.println("        }");
-            out.println("        else {");
-            out.println("            info." + setter + "(null);");
-            out.println("        }");
-        }
-    }
-
-    protected int generateTightMarshal1Body(PrintWriter out) {
-        int baseSize = 0;
-        for (JProperty property : getProperties()) {
-            JAnnotation annotation = 
property.getAnnotation("openwire:property");
-            JAnnotationValue size = annotation.getValue("size");
-            JClass propertyType = property.getType();
-            String type = propertyType.getSimpleName();
-            String getter = "info." + property.getGetter().getSimpleName() + 
"()";
-
-            if (type.equals("boolean")) {
-                out.println("        bs.writeBoolean(" + getter + ");");
-            } else if (type.equals("byte")) {
-                baseSize += 1;
-            } else if (type.equals("char")) {
-                baseSize += 2;
-            } else if (type.equals("short")) {
-                baseSize += 2;
-            } else if (type.equals("int")) {
-                baseSize += 4;
-            } else if (type.equals("long")) {
-                out.println("        rc+=tightMarshalLong1(wireFormat, " + 
getter + ", bs);");
-            } else if (type.equals("String")) {
-                out.println("        rc += tightMarshalString1(" + getter + ", 
bs);");
-            } else if (type.equals("byte[]")) {
-                if (size == null) {
-                    out.println("        rc += tightMarshalByteArray1(" + 
getter + ", bs);");
-                } else {
-                    out.println("        rc += tightMarshalConstByteArray1(" + 
getter + ", bs, " + size.asInt() + ");");
-                }
-            } else if (type.equals("ByteSequence")) {
-                out.println("        rc += tightMarshalByteSequence1(" + 
getter + ", bs);");
-            } else if (propertyType.isArrayType()) {
-                if (size != null) {
-                    out.println("        rc += 
tightMarshalObjectArrayConstSize1(wireFormat, " + getter + ", bs, " + 
size.asInt() + ");");
-                } else {
-                    out.println("        rc += 
tightMarshalObjectArray1(wireFormat, " + getter + ", bs);");
-                }
-            } else if (isThrowable(propertyType)) {
-                out.println("        rc += tightMarshalThrowable1(wireFormat, 
" + getter + ", bs);");
-            } else {
-                if (isCachedProperty(property)) {
-                    out.println("        rc += 
tightMarshalCachedObject1(wireFormat, (DataStructure)" + getter + ", bs);");
-                } else {
-                    out.println("        rc += 
tightMarshalNestedObject1(wireFormat, (DataStructure)" + getter + ", bs);");
-                }
-            }
-        }
-        return baseSize;
-    }
-
-    protected void generateTightMarshal2Body(PrintWriter out) {
-        for (JProperty property : getProperties()) {
-            JAnnotation annotation = 
property.getAnnotation("openwire:property");
-            JAnnotationValue size = annotation.getValue("size");
-            JClass propertyType = property.getType();
-            String type = propertyType.getSimpleName();
-            String getter = "info." + property.getGetter().getSimpleName() + 
"()";
-
-            if (type.equals("boolean")) {
-                out.println("        bs.readBoolean();");
-            } else if (type.equals("byte")) {
-                out.println("        dataOut.writeByte(" + getter + ");");
-            } else if (type.equals("char")) {
-                out.println("        dataOut.writeChar(" + getter + ");");
-            } else if (type.equals("short")) {
-                out.println("        dataOut.writeShort(" + getter + ");");
-            } else if (type.equals("int")) {
-                out.println("        dataOut.writeInt(" + getter + ");");
-            } else if (type.equals("long")) {
-                out.println("        tightMarshalLong2(wireFormat, " + getter 
+ ", dataOut, bs);");
-            } else if (type.equals("String")) {
-                out.println("        tightMarshalString2(" + getter + ", 
dataOut, bs);");
-            } else if (type.equals("byte[]")) {
-                if (size != null) {
-                    out.println("        tightMarshalConstByteArray2(" + 
getter + ", dataOut, bs, " + size.asInt() + ");");
-                } else {
-                    out.println("        tightMarshalByteArray2(" + getter + 
", dataOut, bs);");
-                }
-            } else if (type.equals("ByteSequence")) {
-                out.println("        tightMarshalByteSequence2(" + getter + ", 
dataOut, bs);");
-            } else if (propertyType.isArrayType()) {
-                if (size != null) {
-                    out.println("        
tightMarshalObjectArrayConstSize2(wireFormat, " + getter + ", dataOut, bs, " + 
size.asInt() + ");");
-                } else {
-                    out.println("        tightMarshalObjectArray2(wireFormat, 
" + getter + ", dataOut, bs);");
-                }
-            } else if (isThrowable(propertyType)) {
-                out.println("        tightMarshalThrowable2(wireFormat, " + 
getter + ", dataOut, bs);");
-            } else {
-                if (isCachedProperty(property)) {
-                    out.println("        tightMarshalCachedObject2(wireFormat, 
(DataStructure)" + getter + ", dataOut, bs);");
-                } else {
-                    out.println("        tightMarshalNestedObject2(wireFormat, 
(DataStructure)" + getter + ", dataOut, bs);");
-                }
-            }
-        }
-    }
-
-    protected void generateLooseMarshalBody(PrintWriter out) {
-        for (JProperty property : getProperties()) {
-            JAnnotation annotation = 
property.getAnnotation("openwire:property");
-            JAnnotationValue size = annotation.getValue("size");
-            JClass propertyType = property.getType();
-            String type = propertyType.getSimpleName();
-            String getter = "info." + property.getGetter().getSimpleName() + 
"()";
-
-            if (type.equals("boolean")) {
-                out.println("        dataOut.writeBoolean(" + getter + ");");
-            } else if (type.equals("byte")) {
-                out.println("        dataOut.writeByte(" + getter + ");");
-            } else if (type.equals("char")) {
-                out.println("        dataOut.writeChar(" + getter + ");");
-            } else if (type.equals("short")) {
-                out.println("        dataOut.writeShort(" + getter + ");");
-            } else if (type.equals("int")) {
-                out.println("        dataOut.writeInt(" + getter + ");");
-            } else if (type.equals("long")) {
-                out.println("        looseMarshalLong(wireFormat, " + getter + 
", dataOut);");
-            } else if (type.equals("String")) {
-                out.println("        looseMarshalString(" + getter + ", 
dataOut);");
-            } else if (type.equals("byte[]")) {
-                if (size != null) {
-                    out.println("        
looseMarshalConstByteArray(wireFormat, " + getter + ", dataOut, " + 
size.asInt() + ");");
-                } else {
-                    out.println("        looseMarshalByteArray(wireFormat, " + 
getter + ", dataOut);");
-                }
-            } else if (type.equals("ByteSequence")) {
-                out.println("        looseMarshalByteSequence(wireFormat, " + 
getter + ", dataOut);");
-            } else if (propertyType.isArrayType()) {
-                if (size != null) {
-                    out.println("        
looseMarshalObjectArrayConstSize(wireFormat, " + getter + ", dataOut, " + 
size.asInt() + ");");
-                } else {
-                    out.println("        looseMarshalObjectArray(wireFormat, " 
+ getter + ", dataOut);");
-                }
-            } else if (isThrowable(propertyType)) {
-                out.println("        looseMarshalThrowable(wireFormat, " + 
getter + ", dataOut);");
-            } else {
-                if (isCachedProperty(property)) {
-                    out.println("        looseMarshalCachedObject(wireFormat, 
(DataStructure)" + getter + ", dataOut);");
-                } else {
-                    out.println("        looseMarshalNestedObject(wireFormat, 
(DataStructure)" + getter + ", dataOut);");
-                }
-            }
-        }
-    }
-
-    protected void generateLooseUnmarshalBody(PrintWriter out) {
-        for (JProperty property : getProperties()) {
-            JAnnotation annotation = 
property.getAnnotation("openwire:property");
-            JAnnotationValue size = annotation.getValue("size");
-            JClass propertyType = property.getType();
-            String propertyTypeName = propertyType.getSimpleName();
-
-            if (propertyType.isArrayType() && 
!propertyTypeName.equals("byte[]")) {
-                generateLooseUnmarshalBodyForArrayProperty(out, property, 
size);
-            } else {
-                generateLooseUnmarshalBodyForProperty(out, property, size);
-            }
-        }
-    }
-
-    protected void generateLooseUnmarshalBodyForProperty(PrintWriter out, 
JProperty property, JAnnotationValue size) {
-        String setter = property.getSetter().getSimpleName();
-        String type = property.getType().getSimpleName();
-
-        if (type.equals("boolean")) {
-            out.println("        info." + setter + "(dataIn.readBoolean());");
-        } else if (type.equals("byte")) {
-            out.println("        info." + setter + "(dataIn.readByte());");
-        } else if (type.equals("char")) {
-            out.println("        info." + setter + "(dataIn.readChar());");
-        } else if (type.equals("short")) {
-            out.println("        info." + setter + "(dataIn.readShort());");
-        } else if (type.equals("int")) {
-            out.println("        info." + setter + "(dataIn.readInt());");
-        } else if (type.equals("long")) {
-            out.println("        info." + setter + 
"(looseUnmarshalLong(wireFormat, dataIn));");
-        } else if (type.equals("String")) {
-            out.println("        info." + setter + 
"(looseUnmarshalString(dataIn));");
-        } else if (type.equals("byte[]")) {
-            if (size != null) {
-                out.println("        info." + setter + 
"(looseUnmarshalConstByteArray(dataIn, " + size.asInt() + "));");
-            } else {
-                out.println("        info." + setter + 
"(looseUnmarshalByteArray(dataIn));");
-            }
-        } else if (type.equals("ByteSequence")) {
-            out.println("        info." + setter + 
"(looseUnmarshalByteSequence(dataIn));");
-        } else if (isThrowable(property.getType())) {
-            out.println("        info." + setter + "((" + 
property.getType().getQualifiedName() + ") looseUnmarsalThrowable(wireFormat, 
dataIn));");
-        } else if (isCachedProperty(property)) {
-            out.println("        info." + setter + "((" + 
property.getType().getQualifiedName() + ") 
looseUnmarsalCachedObject(wireFormat, dataIn));");
-        } else {
-            out.println("        info." + setter + "((" + 
property.getType().getQualifiedName() + ") 
looseUnmarsalNestedObject(wireFormat, dataIn));");
-        }
-    }
-
-    protected void generateLooseUnmarshalBodyForArrayProperty(PrintWriter out, 
JProperty property, JAnnotationValue size) {
-        JClass propertyType = property.getType();
-        String arrayType = 
propertyType.getArrayComponentType().getQualifiedName();
-        String setter = property.getSetter().getSimpleName();
-        out.println();
-        if (size != null) {
-            out.println("        {");
-            out.println("            " + arrayType + " value[] = new " + 
arrayType + "[" + size.asInt() + "];");
-            out.println("            " + "for( int i=0; i < " + size.asInt() + 
"; i++ ) {");
-            out.println("                value[i] = (" + arrayType + ") 
looseUnmarsalNestedObject(wireFormat,dataIn);");
-            out.println("            }");
-            out.println("            info." + setter + "(value);");
-            out.println("        }");
-        } else {
-            out.println("        if (dataIn.readBoolean()) {");
-            out.println("            short size = dataIn.readShort();");
-            out.println("            " + arrayType + " value[] = new " + 
arrayType + "[size];");
-            out.println("            for( int i=0; i < size; i++ ) {");
-            out.println("                value[i] = (" + arrayType + ") 
looseUnmarsalNestedObject(wireFormat,dataIn);");
-            out.println("            }");
-            out.println("            info." + setter + "(value);");
-            out.println("        }");
-            out.println("        else {");
-            out.println("            info." + setter + "(null);");
-            out.println("        }");
-        }
-    }
-
-    /**
-     * Returns whether or not the given annotation has a mandatory flag on it 
or
-     * not
-     */
-    protected String getMandatoryFlag(JAnnotation annotation) {
-        JAnnotationValue value = annotation.getValue("mandatory");
-        if (value != null) {
-            String text = value.asString();
-            if (text != null && text.equalsIgnoreCase("true")) {
-                return "true";
-            }
-        }
-        return "false";
-    }
-
-    public List<JClass> getConcreteClasses() {
-        return concreteClasses;
-    }
-
-    public void setConcreteClasses(List<JClass> concreteClasses) {
-        this.concreteClasses = concreteClasses;
-    }
-
-    public File getFactoryFile() {
-        return factoryFile;
-    }
-
-    public void setFactoryFile(File factoryFile) {
-        this.factoryFile = factoryFile;
-    }
-
-    public String getFactoryFileName() {
-        return factoryFileName;
-    }
-
-    public void setFactoryFileName(String factoryFileName) {
-        this.factoryFileName = factoryFileName;
-    }
-
-    public String getIndent() {
-        return indent;
-    }
-
-    public void setIndent(String indent) {
-        this.indent = indent;
-    }
-}

http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MultiSourceGenerator.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MultiSourceGenerator.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MultiSourceGenerator.java
deleted file mode 100644
index 1a0bcd3..0000000
--- 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/MultiSourceGenerator.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.activemq.openwire.generator;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.FixCRLF;
-import org.codehaus.jam.JAnnotation;
-import org.codehaus.jam.JClass;
-import org.codehaus.jam.JProperty;
-import org.codehaus.jam.JamClassIterator;
-
-/**
- *
- */
-public abstract class MultiSourceGenerator extends OpenWireGenerator {
-
-    protected Set<String> manuallyMaintainedClasses = new HashSet<String>();
-    protected File destDir;
-    protected File destFile;
-
-    protected JClass jclass;
-    protected JClass superclass;
-    protected String simpleName;
-    protected String className;
-    protected String baseClass;
-    protected StringBuffer buffer;
-
-    protected String targetDir;
-
-    public MultiSourceGenerator() {
-        initialiseManuallyMaintainedClasses();
-    }
-
-    public Object run() {
-        if (destDir == null) {
-            throw new IllegalArgumentException("No destDir defined!");
-        }
-        System.out.println(getClass().getName() + " generating files in: " + 
destDir);
-        destDir.mkdirs();
-        buffer = new StringBuffer();
-
-        JamClassIterator iter = getClasses();
-        while (iter.hasNext()) {
-            try {
-                jclass = iter.nextClass();
-                if (isValidClass(jclass)) {
-                    processClass(jclass);
-                }
-            } catch (Exception e) {
-                System.err.println("Unable to process: " + jclass);
-                e.printStackTrace();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns all the valid properties available on the current class
-     */
-    public List<JProperty> getProperties() {
-        List<JProperty> answer = new ArrayList<JProperty>();
-        JProperty[] properties = jclass.getDeclaredProperties();
-        for (int i = 0; i < properties.length; i++) {
-            JProperty property = properties[i];
-            if (isValidProperty(property)) {
-                answer.add(property);
-            }
-        }
-        return answer;
-    }
-
-    protected boolean isValidClass(JClass jclass) {
-        JAnnotation annotation = jclass.getAnnotation("openwire:marshaller");
-        if (annotation == null) {
-            return false;
-        }
-
-        if (!includeInThisVersion(annotation)) {
-            return false;
-        }
-
-        return !manuallyMaintainedClasses.contains(jclass.getSimpleName());
-    }
-
-    protected void processClass(JClass jclass) {
-        simpleName = jclass.getSimpleName();
-        superclass = jclass.getSuperclass();
-
-        System.out.println(getClass().getName() + " processing class: " + 
simpleName);
-
-        className = getClassName(jclass);
-        destFile = new File(destDir, className + filePostFix);
-        baseClass = getBaseClassName(jclass);
-
-        PrintWriter out = null;
-        try {
-            out = new PrintWriter(new FileWriter(destFile));
-            generateFile(out);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (out != null) {
-                out.close();
-            }
-        }
-
-        // Use the FixCRLF Ant Task to make sure the file has consistent
-        // newlines so that SVN does not complain on checkin.
-        Project project = new Project();
-        project.init();
-        FixCRLF fixCRLF = new FixCRLF();
-        fixCRLF.setProject(project);
-        fixCRLF.setSrcdir(destFile.getParentFile());
-        fixCRLF.setIncludes(destFile.getName());
-        fixCRLF.execute();
-    }
-
-    protected abstract void generateFile(PrintWriter out) throws Exception;
-
-    protected String getBaseClassName(JClass jclass) {
-        String answer = "BaseDataStructure";
-        if (superclass != null) {
-            String name = superclass.getSimpleName();
-            if (name != null && !name.equals("Object")) {
-                answer = name;
-            }
-        }
-        return answer;
-    }
-
-    protected String getClassName(JClass jclass) {
-        return jclass.getSimpleName();
-    }
-
-    public boolean isAbstractClass() {
-        return jclass != null && jclass.isAbstract();
-    }
-
-    public String getAbstractClassText() {
-        return isAbstractClass() ? "abstract " : "";
-    }
-
-    public boolean isMarshallerAware() {
-        return isMarshallAware(jclass);
-    }
-
-    protected void initialiseManuallyMaintainedClasses() {
-        String[] names = {
-            "OpenWireDestination",
-            "OpenWireTempDestination",
-            "OpenWireQueue",
-            "OpenWireTopic",
-            "OpenWireTempQueue",
-            "OpenWireTempTopic",
-            "OpenWireMessage",
-            "OpenWireTextMessage",
-            "OpenWireMapMessage",
-            "OpenWireBytesMessage",
-            "OpenWireStreamMessage",
-            "OpenWireBlobMessage",
-            "OpenWireObjectMessage",
-            "BaseCommand",
-            "DataStructureSupport",
-            "WireFormatInfo"
-        };
-
-        for (int i = 0; i < names.length; i++) {
-            manuallyMaintainedClasses.add(names[i]);
-        }
-    }
-
-    public String getBaseClass() {
-        return baseClass;
-    }
-
-    public void setBaseClass(String baseClass) {
-        this.baseClass = baseClass;
-    }
-
-    public String getClassName() {
-        return className;
-    }
-
-    public void setClassName(String className) {
-        this.className = className;
-    }
-
-    public File getDestDir() {
-        return destDir;
-    }
-
-    public void setDestDir(File destDir) {
-        this.destDir = destDir;
-    }
-
-    public File getDestFile() {
-        return destFile;
-    }
-
-    public void setDestFile(File destFile) {
-        this.destFile = destFile;
-    }
-
-    public JClass getJclass() {
-        return jclass;
-    }
-
-    public void setJclass(JClass jclass) {
-        this.jclass = jclass;
-    }
-
-    public Set<String> getManuallyMaintainedClasses() {
-        return manuallyMaintainedClasses;
-    }
-
-    public void setManuallyMaintainedClasses(Set<String> 
manuallyMaintainedClasses) {
-        this.manuallyMaintainedClasses = manuallyMaintainedClasses;
-    }
-
-    public String getSimpleName() {
-        return simpleName;
-    }
-
-    public void setSimpleName(String simpleName) {
-        this.simpleName = simpleName;
-    }
-
-    public JClass getSuperclass() {
-        return superclass;
-    }
-
-    public void setSuperclass(JClass superclass) {
-        this.superclass = superclass;
-    }
-
-    public String getTargetDir() {
-        return targetDir;
-    }
-
-    public void setTargetDir(String sourceDir) {
-        this.targetDir = sourceDir;
-    }
-}

http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireGenerator.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireGenerator.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireGenerator.java
deleted file mode 100644
index dfd9a61..0000000
--- 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireGenerator.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.activemq.openwire.generator;
-
-import org.codehaus.jam.JAnnotation;
-import org.codehaus.jam.JAnnotationValue;
-import org.codehaus.jam.JClass;
-import org.codehaus.jam.JField;
-import org.codehaus.jam.JMethod;
-import org.codehaus.jam.JProperty;
-import org.codehaus.jam.JamClassIterator;
-import org.codehaus.jam.JamService;
-
-/**
- *
- */
-public abstract class OpenWireGenerator {
-
-    protected int openwireVersion;
-    protected String filePostFix = ".java";
-    protected JamService jam;
-
-    protected String commandsPackage = "org.apache.activemq.openwire.commands";
-    protected String codecPackageRoot = "org.apache.activemq.openwire.codec";
-
-    public boolean isValidProperty(JProperty it) {
-        JMethod getter = it.getGetter();
-        JMethod setter = it.getSetter();
-
-        if (getter == null || setter == null || getter.isStatic()) {
-            return false;
-        }
-
-        JAnnotation annotation = getter.getAnnotation("openwire:property");
-        if (annotation == null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    public boolean includeInThisVersion(JAnnotation annotation) {
-        JAnnotationValue value = annotation.getValue("version");
-        if (value != null && value.asInt() <= getOpenwireVersion()) {
-            return true;
-        }
-
-        return false;
-    }
-
-    public boolean isCachedProperty(JProperty it) {
-        JMethod getter = it.getGetter();
-        if (!isValidProperty(it)) {
-            return false;
-        }
-        JAnnotationValue value = 
getter.getAnnotation("openwire:property").getValue("cache");
-        return value != null && value.asBoolean();
-    }
-
-    public boolean isAbstract(JClass j) {
-        JField[] fields = j.getFields();
-        for (int i = 0; i < fields.length; i++) {
-            JField field = fields[i];
-            if (field.isStatic() && field.isPublic() && field.isFinal() && 
field.getSimpleName().equals("DATA_STRUCTURE_TYPE")) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public boolean isThrowable(JClass j) {
-        if (j.getQualifiedName().equals(Throwable.class.getName())) {
-            return true;
-        }
-        return j.getSuperclass() != null && isThrowable(j.getSuperclass());
-    }
-
-    public boolean isMarshallAware(JClass j) {
-        if (filePostFix.endsWith("java")) {
-            JClass[] interfaces = j.getInterfaces();
-            for (int i = 0; i < interfaces.length; i++) {
-                if 
(interfaces[i].getQualifiedName().equals("org.apache.activemq.command.MarshallAware"))
 {
-                    return true;
-                }
-            }
-            return false;
-        } else {
-            String simpleName = j.getSimpleName();
-            return simpleName.equals("ActiveMQMessage") || 
simpleName.equals("WireFormatInfo");
-        }
-    }
-
-    public JamService getJam() {
-        return jam;
-    }
-
-    public JamClassIterator getClasses() {
-        return getJam().getClasses();
-    }
-
-    public int getOpenwireVersion() {
-        return openwireVersion;
-    }
-
-    public void setOpenwireVersion(int openwireVersion) {
-        this.openwireVersion = openwireVersion;
-    }
-
-    public String getCommandsPackage() {
-        return commandsPackage;
-    }
-
-    public void setCommandsPackage(String commandsPacakge) {
-        this.commandsPackage = commandsPacakge;
-    }
-
-    public String getCodecPackageRoot() {
-        return codecPackageRoot;
-    }
-
-    public void setCodecPackageRoot(String codecPackageRoot) {
-        this.codecPackageRoot = codecPackageRoot;
-    }
-
-    public String getOpenWireOpCode(JClass element) {
-        if (element != null) {
-            JAnnotation annotation = 
element.getAnnotation("openwire:marshaller");
-            return stringValue(annotation, "code", "0");
-        }
-        return "0";
-    }
-
-    protected String stringValue(JAnnotation annotation, String name) {
-        return stringValue(annotation, name, null);
-    }
-
-    protected String stringValue(JAnnotation annotation, String name, String 
defaultValue) {
-        if (annotation != null) {
-            JAnnotationValue value = annotation.getValue(name);
-            if (value != null) {
-                return value.asString();
-            }
-        }
-        return defaultValue;
-    }
-
-    public void setJam(JamService jam) {
-        this.jam = jam;
-    }
-
-    public String decapitalize(String text) {
-        if (text == null) {
-            return null;
-        }
-        return text.substring(0, 1).toLowerCase() + text.substring(1);
-    }
-
-    public String capitalize(String text) {
-        if (text == null) {
-            return null;
-        }
-        return text.substring(0, 1).toUpperCase() + text.substring(1);
-    }
-}

http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWirePropertyDescriptor.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWirePropertyDescriptor.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWirePropertyDescriptor.java
new file mode 100644
index 0000000..24b6698
--- /dev/null
+++ 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWirePropertyDescriptor.java
@@ -0,0 +1,139 @@
+/*
+        if (getType().equals(boolean.class)) {
+            return "is" + capitalize(getPropertyName());
+        } else {
+            return "get" + capitalize(getPropertyName());
+        }
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.openwire.generator;
+
+import java.lang.reflect.Field;
+
+import org.apache.activemq.openwire.annotations.OpenWireProperty;
+
+/**
+ * Wraps a property of an OpenWire protocol type to provide support
+ * for generating code to handle that property.
+ */
+public class OpenWirePropertyDescriptor implements 
Comparable<OpenWirePropertyDescriptor> {
+
+    private final Class<?> openWireType;
+    private final Field openWireProperty;
+    private final OpenWireProperty propertyAnnotation;
+
+    private final String getterName;
+    private final String setterName;
+
+    public OpenWirePropertyDescriptor(Class<?> openWireType, Field 
openWireProperty) throws Exception {
+        this.openWireType = openWireType;
+        this.openWireProperty = openWireProperty;
+        this.propertyAnnotation = 
openWireProperty.getAnnotation(OpenWireProperty.class);
+
+        this.setterName = 
GeneratorUtils.findSetMethodForProperty(this.openWireType, this).getName();
+        this.getterName = 
GeneratorUtils.findGetMethodForProperty(this.openWireType, this).getName();
+    }
+
+    /**
+     * @return the declared name of this property.
+     */
+    public String getPropertyName() {
+        return openWireProperty.getName();
+    }
+
+    /**
+     * @return the first OpenWire version this property appeared in
+     */
+    public int getVersion() {
+        return propertyAnnotation.version();
+    }
+
+    /**
+     * @return the position in the marshaling process this type should occupy.
+     */
+    public int getMarshalingSequence() {
+        return propertyAnnotation.sequence();
+    }
+
+    /**
+     * @return the defined size attribute for this property.
+     */
+    public int getSize() {
+        return propertyAnnotation.size();
+    }
+
+    /**
+     * @return
+     */
+    public boolean isCached() {
+        return propertyAnnotation.cached();
+    }
+
+    /**
+     * @return true if the field is an array type.
+     */
+    public boolean isArray() {
+        return openWireProperty.getType().isArray();
+    }
+
+    /**
+     * @return true if this property is {@link Throwable} or a descendant of 
{@link Throwable}.
+     */
+    public boolean isThrowable() {
+        return isThrowable(getType());
+    }
+
+    /**
+     * @return the Class that represents this properties type.
+     */
+    public Class<?> getType() {
+        return openWireProperty.getType();
+    }
+
+    /**
+     * @return the name of this property
+     */
+    public String getTypeName() {
+        return openWireProperty.getType().getSimpleName();
+    }
+
+    /**
+     * @return the name of the set method in the OpenWireType that handles 
this property.
+     */
+    public String getSetterName() {
+        return setterName;
+    }
+
+    /**
+     * @return the name of the get method in the OpenWireType that handles 
this property.
+     */
+    public String getGetterName() {
+        return getterName;
+    }
+
+    private static boolean isThrowable(Class<?> type) {
+        if (type.getCanonicalName().equals(Throwable.class.getName())) {
+            return true;
+        }
+
+        return type.getSuperclass() != null && 
isThrowable(type.getSuperclass());
+    }
+
+    @Override
+    public int compareTo(OpenWirePropertyDescriptor other) {
+        return Integer.compare(getMarshalingSequence(), 
other.getMarshalingSequence());
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireTypeDescriptor.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireTypeDescriptor.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireTypeDescriptor.java
new file mode 100644
index 0000000..d0c1352
--- /dev/null
+++ 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/OpenWireTypeDescriptor.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.openwire.generator;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.activemq.openwire.annotations.OpenWireType;
+
+/**
+ * Wrapper used to describe all the elements of an OpenWire type.
+ */
+public class OpenWireTypeDescriptor {
+
+    private final Class<?> openWireType;
+    private final OpenWireType typeAnnotation;
+    private final List<OpenWirePropertyDescriptor> properties;
+
+    public OpenWireTypeDescriptor(Class<?> openWireType) throws Exception {
+        this.openWireType = openWireType;
+        this.typeAnnotation = openWireType.getAnnotation(OpenWireType.class);
+
+        List<OpenWirePropertyDescriptor> properties = new 
ArrayList<OpenWirePropertyDescriptor>();
+
+        Set<Field> fields = 
GeneratorUtils.finalOpenWireProperties(openWireType);
+        for (Field field : fields) {
+            // Only track fields from the given type and not its super types.
+            if (field.getDeclaringClass().equals(openWireType)) {
+                properties.add(new OpenWirePropertyDescriptor(openWireType, 
field));
+            }
+        }
+
+        // Ensure ordering my marshaler sequence.
+        Collections.sort(properties);
+
+        this.properties = Collections.unmodifiableList(properties);
+    }
+
+    /**
+     * @return the name of the OpenWire protocol type being wrapped.
+     */
+    public String getTypeName() {
+        return openWireType.getSimpleName();
+    }
+
+    /**
+     * @return the name of the package this type is contained in.
+     */
+    public String getPackageName() {
+        return openWireType.getPackage().getName();
+    }
+
+    /**
+     * @return the name of the super class of this object.
+     */
+    public String getSuperClass() {
+        Class<?> superClass = openWireType.getSuperclass();
+        if (superClass == null) {
+            superClass = Object.class;
+        }
+
+        return superClass.getSimpleName();
+    }
+
+    /**
+     * @return the first version this type was introduced in.
+     */
+    public int getVersion() {
+        return typeAnnotation.version();
+    }
+
+    /**
+     * @return true if the type requires awareness of the marshaling process.
+     */
+    public boolean isMarshalAware() {
+        return typeAnnotation.marshalAware();
+    }
+
+    /**
+     * @return the unique OpenWire type code of this instance.
+     */
+    public int getTypeCode() {
+        return typeAnnotation.typeCode();
+    }
+
+    /**
+     * @return true if the OpenWire type is an abstract base of other types.
+     */
+    public boolean isAbstract() {
+        return Modifier.isAbstract(openWireType.getModifiers());
+    }
+
+    /**
+     * @return true if this type has properties to marshal and unmarshal.
+     */
+    public boolean hasProperties() {
+        return !properties.isEmpty();
+    }
+
+    /**
+     * @return the properties of this described OpenWire type.
+     */
+    public List<OpenWirePropertyDescriptor> getProperties() {
+        return properties;
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestDataGenerator.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestDataGenerator.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestDataGenerator.java
deleted file mode 100644
index 6951a91..0000000
--- 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestDataGenerator.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.activemq.openwire.generator;
-
-/**
- * A simple helper class to help auto-generate test data when code generating 
test cases
- *
- *
- */
-public class TestDataGenerator {
-    private int stringCounter;
-
-    private boolean boolCounter;
-    private byte byteCounter;
-    private char charCounter = 'a';
-    private short shortCounter;
-    private int intCounter;
-    private long longCounter;
-
-    public String createByte() {
-        return "(byte) " + (++byteCounter);
-    }
-
-    public String createChar() {
-        return "'" + (charCounter++) + "'";
-    }
-
-    public String createShort() {
-        return "(short) " + (++shortCounter);
-    }
-
-    public int createInt() {
-        return ++intCounter;
-    }
-
-    public long createLong() {
-        return ++longCounter;
-    }
-
-    public String createString(String property) {
-        return property + ":" + (++stringCounter);
-    }
-
-    public boolean createBool() {
-        boolCounter = !boolCounter;
-        return boolCounter;
-    }
-
-    public String createByteArray(String property) {
-        return "\"" + createString(property) + "\".getBytes()";
-    }
-}

http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestsGenerator.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestsGenerator.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestsGenerator.java
deleted file mode 100644
index 5e7e6f9..0000000
--- 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/TestsGenerator.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.activemq.openwire.generator;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.util.List;
-
-import org.codehaus.jam.JAnnotation;
-import org.codehaus.jam.JClass;
-import org.codehaus.jam.JPackage;
-import org.codehaus.jam.JProperty;
-
-/**
- * Generates the test classes for the OpenWire marshalers.
- */
-public class TestsGenerator extends MultiSourceGenerator {
-
-    public TestsGenerator() {
-        this.targetDir = "src/test/java";
-    }
-
-    @Override
-    public Object run() {
-        if (destDir == null) {
-            destDir = new File(targetDir + "/io/openwire/codec/v" + 
getOpenwireVersion());
-        }
-        return super.run();
-    }
-
-    @Override
-    protected String getClassName(JClass jclass) {
-        if (isAbstract(jclass)) {
-            return super.getClassName(jclass) + "TestSupport";
-        } else {
-            return super.getClassName(jclass) + "Test";
-        }
-    }
-
-    @Override
-    protected String getBaseClassName(JClass jclass) {
-        String answer = "DataFileGeneratorTestSupport";
-        if (superclass != null) {
-            String name = superclass.getSimpleName();
-            if (name != null && !name.equals("JNDIBaseStorable") && 
!name.equals("DataStructureSupport") && !name.equals("Object")) {
-                answer = name + "Test";
-                if (isAbstract(getJclass().getSuperclass())) {
-                    answer += "Support";
-                }
-            }
-        }
-        return answer;
-    }
-
-    private void generateLicence(PrintWriter out) {
-        out.println("/**");
-        out.println(" *");
-        out.println(" * Licensed to the Apache Software Foundation (ASF) under 
one or more");
-        out.println(" * contributor license agreements.  See the NOTICE file 
distributed with");
-        out.println(" * this work for additional information regarding 
copyright ownership.");
-        out.println(" * The ASF licenses this file to You under the Apache 
License, Version 2.0");
-        out.println(" * (the \"License\"); you may not use this file except in 
compliance with");
-        out.println(" * the License.  You may obtain a copy of the License 
at");
-        out.println(" *");
-        out.println(" * http://www.apache.org/licenses/LICENSE-2.0";);
-        out.println(" *");
-        out.println(" * Unless required by applicable law or agreed to in 
writing, software");
-        out.println(" * distributed under the License is distributed on an 
\"AS IS\" BASIS,");
-        out.println(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.");
-        out.println(" * See the License for the specific language governing 
permissions and");
-        out.println(" * limitations under the License.");
-        out.println(" */");
-    }
-
-    @Override
-    protected void generateFile(PrintWriter out) {
-
-        generateLicence(out);
-
-        out.println("package " + getCodecPackageRoot() + ".v" + 
openwireVersion + ";");
-        out.println("");
-        out.println("import java.io.DataInputStream;");
-        out.println("import java.io.DataOutputStream;");
-        out.println("import java.io.IOException;");
-        out.println("");
-        out.println("import " + getCodecPackageRoot() + ".*;");
-        out.println("import " + getCommandsPackage() + ".*;");
-        out.println("");
-
-        for (JPackage pkg : getJclass().getImportedPackages()) {
-            for (JClass clazz : pkg.getClasses()) {
-                out.println("import " + clazz.getQualifiedName() + ";");
-            }
-        }
-
-        out.println("");
-        out.println("/**");
-        out.println(" * Test case for the OpenWire marshalling for " + 
jclass.getSimpleName() + "");
-        out.println(" *");
-        out.println(" * NOTE!: This file is auto generated - do not modify!");
-        out.println(" * ");
-        out.println(" */");
-        out.println("public " + getAbstractClassText() + "class " + className 
+ " extends " + baseClass + " {");
-        out.println("");
-        if (!isAbstractClass()) {
-            out.println("");
-            out.println("    public static " + jclass.getSimpleName() + "Test 
SINGLETON = new " + jclass.getSimpleName() + "Test();");
-            out.println("");
-            out.println("    public Object createObject() throws Exception {");
-            out.println("        " + jclass.getSimpleName() + " info = new " + 
jclass.getSimpleName() + "();");
-            out.println("        populateObject(info);");
-            out.println("        return info;");
-            out.println("    }");
-        }
-        out.println("");
-        out.println("    protected void populateObject(Object object) throws 
Exception {");
-        out.println("        super.populateObject(object);");
-        out.println("        " + getJclass().getSimpleName() + " info = (" + 
getJclass().getSimpleName() + ") object;");
-        out.println("");
-
-        TestDataGenerator generator = new TestDataGenerator();
-
-        List<JProperty> properties = getProperties();
-        for (JProperty property : properties) {
-            JAnnotation annotation = 
property.getAnnotation("openwire:property");
-            String size = stringValue(annotation, "size");
-            String testSize = stringValue(annotation, "testSize");
-            String type = property.getType().getSimpleName();
-            String propertyName = property.getSimpleName();
-            if ("-1".equals(testSize)) {
-                continue;
-            }
-
-            String setterName = property.getSetter().getSimpleName();
-
-            if (type.equals("boolean")) {
-                out.println("        info." + setterName + "(" + 
generator.createBool() + ");");
-            } else if (type.equals("byte")) {
-                out.println("        info." + setterName + "(" + 
generator.createByte() + ");");
-            } else if (type.equals("char")) {
-                out.println("        info." + setterName + "(" + 
generator.createChar() + ");");
-            } else if (type.equals("short")) {
-                out.println("        info." + setterName + "(" + 
generator.createShort() + ");");
-            } else if (type.equals("int")) {
-                out.println("        info." + setterName + "(" + 
generator.createInt() + ");");
-            } else if (type.equals("long")) {
-                out.println("        info." + setterName + "(" + 
generator.createLong() + ");");
-            } else if (type.equals("byte[]")) {
-                out.println("        info." + setterName + "(" + 
generator.createByteArray(propertyName) + ");");
-            } else if (type.equals("String")) {
-                out.println("        info." + setterName + "(\"" + 
generator.createString(propertyName) + "\");");
-            } else if (type.equals("ByteSequence")) {
-                out.println("        {");
-                out.println("            byte data[] = " + 
generator.createByteArray(propertyName) + ";");
-                out.println("            info." + setterName + "(new 
org.apache.activemq.util.ByteSequence(data,0,data.length));");
-                out.println("}");
-            } else if (type.equals("Throwable")) {
-                out.println("        info." + setterName + 
"(createThrowable(\"" + generator.createString(propertyName) + "\"));");
-            } else {
-                if (property.getType().isArrayType()) {
-                    String arrayType = 
property.getType().getArrayComponentType().getSimpleName();
-                    if (size == null) {
-                        size = "2";
-                    }
-                    if (arrayType == jclass.getSimpleName()) {
-                        size = "0";
-                    }
-                    out.println("        {");
-                    out.println("            " + arrayType + " value[] = new " 
+ arrayType + "[" + size + "];");
-                    out.println("            for( int i=0; i < " + size + "; 
i++ ) {");
-                    out.println("                value[i] = create" + 
arrayType + "(\"" + generator.createString(propertyName) + "\");");
-                    out.println("            }");
-                    out.println("            info." + setterName + "(value);");
-                    out.println("        }");
-                } else {
-                    out.println("        info." + setterName + "(create" + 
type + "(\"" + generator.createString(propertyName) + "\"));");
-                }
-            }
-        }
-
-        out.println("    }");
-        out.println("}");
-    }
-}

http://git-wip-us.apache.org/repos/asf/activemq-openwire/blob/0c90d2e3/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/builtin/UniversalMarshallerFactoryGenerator.java
----------------------------------------------------------------------
diff --git 
a/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/builtin/UniversalMarshallerFactoryGenerator.java
 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/builtin/UniversalMarshallerFactoryGenerator.java
new file mode 100644
index 0000000..591c9c3
--- /dev/null
+++ 
b/openwire-generator/src/main/java/org/apache/activemq/openwire/generator/builtin/UniversalMarshallerFactoryGenerator.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.openwire.generator.builtin;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.activemq.openwire.generator.AbstractGenerator;
+import org.apache.activemq.openwire.generator.GeneratorUtils;
+import org.apache.activemq.openwire.generator.OpenWireTypeDescriptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Generates a MarshallerFactory instance that can be used to create the
+ * codec configuration in the OpenWireFormat object.
+ */
+public class UniversalMarshallerFactoryGenerator extends AbstractGenerator {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(UniversalMarshallerFactoryGenerator.class);
+
+    private final String codecBase = "org.apache.activemq.openwire.codec";
+    private final String codecPackage = codecBase + ".universal";
+    private String factoryFileName = "MarshallerFactory";
+
+    @Override
+    public void run(List<OpenWireTypeDescriptor> typeDescriptors) throws 
Exception {
+        final File outputFolder = 
GeneratorUtils.createDestination(getBaseDir(), codecPackage);
+        LOG.info("Output location for generated marshaler factory is: {}", 
outputFolder.getAbsolutePath());
+
+        final File factoryFile = new File(outputFolder, getFactoryFileName() + 
".java");
+        LOG.debug("Generating marshaller Factory: {}", factoryFile);
+
+        try (PrintWriter out = new PrintWriter(new FileWriter(factoryFile));) {
+            writeApacheLicense(out);
+            writePreamble(out);
+            writeClassDefinition(out);
+            writeFactoryImplementation(out, typeDescriptors);
+            writeClassClosure(out);
+        } catch (final Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    //----- Factory creation methods 
-----------------------------------------//
+
+    private void writePreamble(PrintWriter out) {
+        out.println("package " + getCodecPackage() + ";");
+        out.println("");
+        out.println("import " + getCodecPackageBase() + 
".DataStreamMarshaller;");
+        out.println("import " + getCodecPackageBase() + ".OpenWireFormat;");
+        out.println("");
+    }
+
+    private void writeClassDefinition(PrintWriter out) {
+
+        out.println("/**");
+        out.println(" * Marshalling Factory for the Universal OpenWire Codec 
package.");
+        out.println(" *");
+        out.println(" * NOTE!: This file is auto generated - do not modify!");
+        out.println(" *");
+        out.println(" */");
+        out.println("public class " + getFactoryFileName() + "{");
+        out.println("");
+    }
+
+    private void writeFactoryImplementation(PrintWriter out, 
List<OpenWireTypeDescriptor> typeDescriptors) {
+
+        out.println("    /**");
+        out.println("     * Creates a Map of command type -> Marshallers");
+        out.println("     */");
+        out.println("    static final private DataStreamMarshaller 
marshaller[] = new DataStreamMarshaller[256];");
+        out.println("    static {");
+        out.println("");
+
+        List<OpenWireTypeDescriptor> sorted = new 
ArrayList<OpenWireTypeDescriptor>(typeDescriptors);
+        Collections.sort(sorted, new Comparator<OpenWireTypeDescriptor>() {
+            @Override
+            public int compare(OpenWireTypeDescriptor o1, 
OpenWireTypeDescriptor o2) {
+                return o1.getTypeName().compareTo(o2.getTypeName());
+            }
+        });
+
+        for (final OpenWireTypeDescriptor openWireType : sorted) {
+            if (!openWireType.isAbstract()) {
+                out.println("        add(new " + openWireType.getTypeName() + 
"Marshaller());");
+            }
+        }
+
+        out.println("    }");
+        out.println("");
+        out.println("    static private void add(DataStreamMarshaller dsm) {");
+        out.println("        marshaller[dsm.getDataStructureType()] = dsm;");
+        out.println("    }");
+        out.println("");
+        out.println("    static public DataStreamMarshaller[] 
createMarshallerMap(OpenWireFormat wireFormat) {");
+        out.println("        return marshaller;");
+        out.println("    }");
+    }
+
+    private void writeClassClosure(PrintWriter out) {
+        out.println("}");
+    }
+
+    //----- Public Property access methods 
-----------------------------------//
+
+    /**
+     * @return the base codec package name where the OpenWire marshalers 
support code lives.
+     */
+    public String getCodecPackageBase() {
+        return codecBase;
+    }
+
+    /**
+     * @return the package name where the OpenWire marshalers are written.
+     */
+    public String getCodecPackage() {
+        return codecPackage;
+    }
+
+    public String getFactoryFileName() {
+        return factoryFileName;
+    }
+
+    public void setFactoryFileName(String factoryFileName) {
+        this.factoryFileName = factoryFileName;
+    }
+}

Reply via email to