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/01/14 07:59:34 UTC

svn commit: r899082 - in /activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src: main/java/org/apache/activemq/amqp/generator/ main/resources/ main/resources/org/ main/resources/org/apache/ main/resources/org/apache/activemq/ main/resource...

Author: cmacnaug
Date: Thu Jan 14 06:59:34 2010
New Revision: 899082

URL: http://svn.apache.org/viewvc?rev=899082&view=rev
Log:
Updating generator with hardcoded encodings, and BIO serialization logic

Added:
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpMarshallerGen.java
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpMarshaller.jtemp
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpType.jtemp
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/types/
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/types/AmqpAny.jtemp
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/test/java/org/apache/activemq/amqp/generator/handcoded/
Removed:
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Marshalable.java
Modified:
    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/AmqpDescriptor.java
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpEncoding.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
    activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Utils.java

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=899082&r1=899081&r2=899082&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 Jan 14 06:59:34 2010
@@ -1,20 +1,27 @@
 package org.apache.activemq.amqp.generator;
 
-import java.io.BufferedOutputStream;
+import static org.apache.activemq.amqp.generator.Utils.capFirst;
+import static org.apache.activemq.amqp.generator.Utils.padHex;
+import static org.apache.activemq.amqp.generator.Utils.tab;
+import static org.apache.activemq.amqp.generator.Utils.toJavaConstant;
+import static org.apache.activemq.amqp.generator.Utils.toJavaName;
+import static org.apache.activemq.amqp.generator.Utils.writeJavaCopyWrite;
+
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.TreeMap;
-import static org.apache.activemq.amqp.generator.Utils.*;
-import org.apache.activemq.amqp.generator.jaxb.schema.*;
+
+import org.apache.activemq.amqp.generator.jaxb.schema.Choice;
+import org.apache.activemq.amqp.generator.jaxb.schema.Descriptor;
+import org.apache.activemq.amqp.generator.jaxb.schema.Doc;
+import org.apache.activemq.amqp.generator.jaxb.schema.Encoding;
+import org.apache.activemq.amqp.generator.jaxb.schema.Field;
+import org.apache.activemq.amqp.generator.jaxb.schema.Type;
 
 public class AmqpClass {
 
@@ -23,7 +30,7 @@
     protected AmqpChoice choice;
     protected AmqpException exception;
     protected AmqpDescriptor descriptor;
-    protected AmqpEncoding encoding;
+    protected LinkedList<AmqpEncoding> encodings;
     protected String restrictedType;
 
     protected boolean restricted;
@@ -32,6 +39,7 @@
     LinkedHashMap<String, AmqpField> fields = new LinkedHashMap<String, AmqpField>();
     protected String javaPackage = "";
     protected String javaType = "";
+    public boolean handcoded;
 
     public void parseFromType(Generator generator, String source, Type type) {
         this.name = type.getName();
@@ -60,8 +68,12 @@
                 doc = new AmqpDoc();
                 doc.parseFromDoc((Doc) typeAttribute);
             } else if (typeAttribute instanceof Encoding) {
-                encoding = new AmqpEncoding();
+                if (encodings == null) {
+                    encodings = new LinkedList<AmqpEncoding>();
+                }
+                AmqpEncoding encoding = new AmqpEncoding();
                 encoding.parseFromEncoding((Encoding) typeAttribute);
+                encodings.add(encoding);
             } else if (typeAttribute instanceof org.apache.activemq.amqp.generator.jaxb.schema.Exception) {
                 exception = new AmqpException();
                 exception.parseFromException((org.apache.activemq.amqp.generator.jaxb.schema.Exception) typeAttribute);
@@ -78,6 +90,9 @@
     }
 
     public void generate(Generator generator) throws IOException, UnknownTypeException {
+        if (handcoded) {
+            return;
+        }
         String className = getJavaType();
 
         File file = new File(generator.getOutputDirectory() + File.separator + new String(javaPackage + "." + className).replace(".", File.separator) + ".java");
@@ -87,72 +102,35 @@
         }
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
 
-        writeCopyWrite(writer);
+        writeJavaCopyWrite(writer);
         writer.write("package " + javaPackage + ";\n");
         writer.newLine();
-        if (writeImports(writer)) {
-            writer.newLine();
-        }
-
-        writer.write("public class " + className + " {");
-        writer.newLine();
-        writer.newLine();
-
-        if (writeConstants(writer)) {
-            writer.newLine();
+        if (writeImports(writer, generator)) {
             writer.newLine();
         }
 
-        if (writeFields(writer)) {
-            writer.newLine();
+        writer.write("public class " + className);
+        if (isPrimitive() || descriptor != null) {
+            writer.write(" implements AmqpType");
         }
+        writer.write(" {");
+        writer.newLine();
 
-        if (writeFieldAccesors(writer)) {
-            writer.newLine();
-        }
+        writeConstants(writer);
+        
+        writeFields(writer);
+        
+        writeFieldAccesors(writer);
+        
+        writeSerializers(writer); 
+        
         writer.write("}");
         writer.flush();
         writer.close();
 
     }
 
-    private static void writeCopyWrite(BufferedWriter writer) throws IOException {
-        writer.write("/**");
-        writer.newLine();
-        writer.write(" * Licensed to the Apache Software Foundation (ASF) under one or more");
-        writer.newLine();
-        writer.write(" * contributor license agreements.  See the NOTICE file distributed with");
-        writer.newLine();
-        writer.write(" * this work for additional information regarding copyright ownership.");
-        writer.newLine();
-        writer.write(" * The ASF licenses this file to You under the Apache License, Version 2.0");
-        writer.newLine();
-        writer.write(" * (the \"License\"); you may not use this file except in compliance with");
-        writer.newLine();
-        writer.write(" * the License.  You may obtain a copy of the License at");
-        writer.newLine();
-        writer.write(" *");
-        writer.newLine();
-        writer.write(" *      http://www.apache.org/licenses/LICENSE-2.0");
-        writer.newLine();
-        writer.write(" *");
-        writer.newLine();
-        writer.write(" * Unless required by applicable law or agreed to in writing, software");
-        writer.newLine();
-        writer.write(" * distributed under the License is distributed on an \"AS IS\" BASIS,");
-        writer.newLine();
-        writer.write(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
-        writer.newLine();
-        writer.write(" * See the License for the specific language governing permissions and");
-        writer.newLine();
-        writer.write(" * limitations under the License.");
-        writer.newLine();
-        writer.write(" */");
-        writer.newLine();
-        writer.newLine();
-    }
-
-    private boolean writeImports(BufferedWriter writer) throws IOException, UnknownTypeException {
+    private boolean writeImports(BufferedWriter writer, Generator generator) throws IOException, UnknownTypeException {
 
         HashSet<String> imports = new HashSet<String>();
 
@@ -160,6 +138,18 @@
             imports.add(field.getJavaPackage());
         }
 
+        if (isPrimitive()) {
+            imports.add(TypeRegistry.getJavaPackage(name));
+            imports.add("java.io");
+            imports.add(generator.getPackagePrefix());
+        }
+
+        if (descriptor != null) {
+            imports.add(generator.getPackagePrefix());
+            imports.add(generator.getPackagePrefix() + ".types" );
+            imports.add("java.io");
+        }
+
         imports.remove(getJavaPackage());
         imports.remove("java.lang");
 
@@ -175,18 +165,172 @@
 
     private boolean writeConstants(BufferedWriter writer) throws IOException, UnknownTypeException {
         boolean ret = false;
+
+        // Write out the descriptor (for compound types):
+        if (descriptor != null) {
+            ret = true;
+            writer.newLine();
+            writer.write(tab(1) + "public static final String SYMBOLIC_NAME = \"" + descriptor.getSymbolicName() + "\";");
+            writer.newLine();
+            writer.write(tab(1) + "//Format code: " + descriptor.getFormatCode() + ":");
+            writer.newLine();
+            writer.write(tab(1) + "public static final long CATEGORY = " + descriptor.getCategory() + ";");
+            writer.newLine();
+            writer.write(tab(1) + "public static final long DESCRIPTOR_ID = " + descriptor.getDescriptorId() + ";");
+            writer.newLine();
+            writer.write(tab(1) + "public static final long FORMAT_CODE = CATEGORY << 32 | DESCRIPTOR_ID; //(" + (descriptor.getCategory() << 32 | descriptor.getDescriptorId()) + "L)");
+            writer.newLine();
+            writer.write(tab(1) + "//Hard coded constructor (minus the trailing primitive format code whose encoding may vary):");
+            writer.newLine();
+            writer.write(tab(1) + "public static final byte [] CONSTRUCTOR = new byte [] {");
+            writer.newLine();
+            writer.write(tab(2) + "(byte) 0x00,                                         // COMPOUND_TYPE);");
+            writer.newLine();
+            // TODO retrieve ulong encoding from the ulong itself:
+            writer.write(tab(2) + "(byte) 0x80,                                         // ulong descriptor encoding)");
+            writer.newLine();
+            // Add the category code:
+            writer.write(tab(2));
+            String categoryHex = padHex(descriptor.getFormatCode().substring(2, descriptor.getFormatCode().indexOf(":")), 8);
+            for (int i = 0; i < 8; i += 2) {
+                writer.write("(byte) 0x" + categoryHex.substring(i, i + 2) + ", ");
+            }
+            writer.write(" // CATEGORY CODE");
+            writer.newLine();
+            writer.write(tab(2));
+            // Add the descriptor id code:
+            String descriptorIdHex = padHex(descriptor.getFormatCode().substring(descriptor.getFormatCode().indexOf(":") + 3), 8);
+
+            for (int i = 0; i < 8; i += 2) {
+                writer.write("(byte) 0x" + descriptorIdHex.substring(i, i + 2));
+                if (i < 6) {
+                    writer.write(", ");
+                }
+            }
+            writer.write("   // DESCRIPTOR ID CODE");
+            writer.newLine();
+            writer.write(tab(1) + "};");
+            writer.newLine();
+        }
+
+        // Write out encodings:
+        if (encodings != null) {
+            writeEncodings(writer);
+        }
+
         if (choice != null) {
             ret = true;
+            writer.newLine();
+            writer.write(tab(1) + "//Constants:");
+            writer.newLine();
             for (Map.Entry<String, String> constant : choice.choices.entrySet()) {
-                writer.write(tab(1) + "public static final " + TypeRegistry.getJavaType(restrictedType) + " " + Utils.toJavaConstant(constant.getKey() + " = " + constant.getValue() + ";"));
+                writer.write(tab(1) + "public static final " + TypeRegistry.getJavaType(restrictedType) + " " + Utils.toJavaConstant(constant.getKey()) + " = " + constant.getValue() + ";");
                 writer.newLine();
             }
         }
         return ret;
     }
 
+    private void writeEncodings(BufferedWriter writer) throws IOException, UnknownTypeException {
+        if (encodings != null && encodings.size() == 1 && "fixed".equals(encodings.getFirst().getCategory())) {
+            writer.newLine();
+            writer.write(tab(1) + "public static final byte FORMAT_CODE = (byte) " + encodings.getFirst().getCode() + ";");
+            writer.newLine();
+        } else {
+            writer.newLine();
+            writer.write(tab(1) + "public static enum " + toJavaConstant(name) + "_ENCODING {");
+            writer.newLine();
+
+            int i = 0;
+            for (AmqpEncoding encoding : encodings) {
+                i++;
+                String eName = encoding.getName();
+                if (eName == null) {
+                    eName = name;
+                }
+                eName = toJavaConstant(eName);
+
+                writer.write(tab(2) + eName + " ((byte) " + encoding.getCode() + ", " + encoding.getWidth() + ")");
+                if (i < encodings.size()) {
+                    writer.write(",");
+                } else {
+                    writer.write(";");
+                }
+
+                if (encoding.getLabel() != null) {
+                    writer.write(" // " + encoding.getLabel());
+                }
+
+                writer.newLine();
+            }
+
+            writer.newLine();
+            writer.write(tab(2) + "private final byte formatCode;");
+            writer.newLine();
+            writer.write(tab(2) + "private final int width;");
+            writer.newLine();
+
+            // Write constructor:
+            writer.newLine();
+            writer.write(tab(2) + toJavaConstant(name) + "_ENCODING(byte formatCode, int width) {");
+            writer.newLine();
+            writer.write(tab(3) + "this.formatCode = formatCode;");
+            writer.newLine();
+            writer.write(tab(3) + "this.width = width;");
+            writer.newLine();
+            writer.write(tab(2) + "}");
+            writer.newLine();
+
+            // Write Accessors:
+            writer.newLine();
+            writer.write(tab(2) + "public final byte getFormatCode() {");
+            writer.newLine();
+            writer.write(tab(3) + "return formatCode;");
+            writer.newLine();
+            writer.write(tab(2) + "}");
+            writer.newLine();
+
+            writer.newLine();
+            writer.write(tab(2) + "public final int getWidth() {");
+            writer.newLine();
+            writer.write(tab(3) + "return width;");
+            writer.newLine();
+            writer.write(tab(2) + "}");
+            writer.newLine();
+
+            writer.newLine();
+            writer.write(tab(2) + "public final int getEncodedSize(" + TypeRegistry.getJavaType(name) + " val) throws IOException{");
+            writer.newLine();
+            writer.write(tab(3) + "if(width > 0) {");
+            writer.newLine();
+            writer.write(tab(4) + "return 1 + width + AmqpMarshaller.getEncodedSizeOf" + capFirst(toJavaName(name)) + "(val, this);");
+            writer.newLine();
+            writer.write(tab(3) + "}");
+            writer.newLine();
+            writer.write(tab(3) + "return 1;");
+            writer.newLine();
+            writer.write(tab(2) + "}");
+            writer.newLine();
+            writer.write(tab(1) + "}");
+            writer.newLine();
+        }
+    }
+
     private boolean writeFields(BufferedWriter writer) throws IOException, UnknownTypeException {
         boolean ret = false;
+        
+        if (descriptor != null)
+        {
+            ret = true;
+            String encodingType = descriptor.getSymbolicName();
+            encodingType = encodingType.substring(encodingType.lastIndexOf(":") + 1);
+            encodingType = "Amqp" + capFirst(toJavaName(encodingType));
+            
+            writer.newLine();
+            writer.write(tab(1) + "private " + encodingType + " value;");
+            writer.newLine();
+        }
+        
         for (AmqpField field : fields.values()) {
             ret = true;
             if (field.getDoc() != null) {
@@ -203,11 +347,26 @@
             writer.write(";");
             writer.newLine();
         }
+
+        if (isPrimitive()) {
+            writer.newLine();
+            writer.write(tab(1) + "private " + TypeRegistry.getJavaType(name) + " value;");
+            writer.newLine();
+
+            // If there are multiple possible encodings store the current
+            // encoding:
+            if (encodings != null && encodings.size() > 1) {
+                writer.newLine();
+                writer.write(tab(1) + "private " + getEncodingName(true) + " encoding;");
+                writer.newLine();
+            }
+        }
         return ret;
     }
 
     private boolean writeFieldAccesors(BufferedWriter writer) throws IOException, UnknownTypeException {
         boolean ret = false;
+        
         for (AmqpField field : fields.values()) {
             ret = true;
             if (field.getDoc() != null) {
@@ -217,6 +376,7 @@
             String array = field.isMultiple() ? " []" : "";
 
             // Setter:
+            writer.newLine();
             writer.write(tab(1) + "public final void set" + capFirst(field.getJavaName()) + "(" + field.getJavaType() + array + " " + toJavaName(field.getName()) + ") {");
             writer.newLine();
             writer.write(tab(2) + "this." + field.getJavaName() + " = " + field.getJavaName() + ";");
@@ -225,16 +385,142 @@
             writer.newLine();
             writer.newLine();
             // Getter:
-
-            // Setter:
             writer.write(tab(1) + "public final " + field.getJavaType() + array + " get" + capFirst(field.getJavaName()) + "() {");
             writer.newLine();
             writer.write(tab(2) + "return " + field.getJavaName() + ";");
             writer.newLine();
             writer.write(tab(1) + "}");
             writer.newLine();
+        }
+
+        if (isPrimitive()) {
+            String valueType = TypeRegistry.getJavaType(name);
+
+            writer.newLine();
+            writer.write(tab(1) + "public final void setValue(" + valueType + " value) {");
+            writer.newLine();
+            writer.write(tab(2) + "this.value = value;");
+            if (hasMultipleEncodings()) {
+                writer.newLine();
+                writer.write(tab(2) + "this.encoding = null;");
+            }
+            writer.newLine();
+            writer.write(tab(1) + "}");
+            writer.newLine();
+            writer.newLine();
+            // Getter:
+            writer.write(tab(1) + "public final " + valueType + " getValue() {");
+            writer.newLine();
+            writer.write(tab(2) + "return value;");
+            writer.newLine();
+            writer.write(tab(1) + "}");
+            writer.newLine();
+        }
+        return ret;
+    }
+
+    private boolean writeSerializers(BufferedWriter writer) throws IOException, UnknownTypeException {
+        boolean ret = false;
+
+        // Add accessors for primitive encoded sizes:
+        if (isPrimitive()) {
+            ret = true;
+            writer.newLine();
+            writer.write(tab(1) + "public final int getEncodedSize() throws IOException{");
+            writer.newLine();
+            // Handle fixed width encodings:
+            if (encodings != null && encodings.size() == 1 && "fixed".equals(encodings.getFirst().getCategory())) {
+                AmqpEncoding encoding = encodings.getFirst();
+
+                writer.write(tab(2) + "return " + (1 + new Integer(encoding.getWidth())) + ";");
+                writer.newLine();
+                writer.write(tab(1) + "}");
+                writer.newLine();
+
+                writer.newLine();
+                writer.write(tab(1) + "public final void marshal(DataOutputStream dos) throws IOException {");
+                writer.newLine();
+                writer.write(tab(2) + "dos.writeByte(FORMAT_CODE);");
+                writer.newLine();
+                if (Integer.parseInt(encoding.getWidth()) > 0) {
+                    writer.write(tab(2) + "AmqpMarshaller.write" + capFirst(toJavaName(name)) + "(value, dos);");
+                    writer.newLine();
+                }
+                writer.write(tab(1) + "}");
+                writer.newLine();
+            } else {
+                writer.newLine();
+                writer.write(tab(2) + "chooseEncoding();");
+                writer.newLine();
+                writer.write(tab(2) + "return encoding.getEncodedSize(value);");
+                writer.newLine();
+                writer.write(tab(1) + "}");
+                writer.newLine();
+
+                writer.newLine();
+                writer.write(tab(1) + "public final void marshal(DataOutputStream dos) throws IOException {");
+                writer.newLine();
+                writer.write(tab(2) + "chooseEncoding();");
+                writer.newLine();
+                writer.write(tab(2) + "dos.writeByte(encoding.getFormatCode());");
+                if (hasNonZeroEncoding()) {
+                    writer.newLine();
+                    writer.write(tab(2) + "int size = encoding.getEncodedSize(value);");
+                    writer.newLine();
+                    writer.write(tab(2) + "if(encoding.getWidth() == 1) {");
+                    writer.newLine();
+                    writer.write(tab(3) + "dos.writeByte(size);");
+                    writer.newLine();
+                    writer.write(tab(2) + "}");
+                    writer.newLine();
+                    writer.write(tab(2) + "else if(encoding.getWidth() == 4) {");
+                    writer.newLine();
+                    writer.write(tab(3) + "dos.writeInt(size);");
+                    writer.newLine();
+                    writer.write(tab(2) + "}");
+                    writer.newLine();
+                    writer.write(tab(2) + "AmqpMarshaller.write" + capFirst(toJavaName(name)) + "(value, encoding, dos);");
+                    writer.newLine();
+                }
+
+                writer.write(tab(1) + "}");
+                writer.newLine();
+
+                writer.newLine();
+                writer.write(tab(1) + "public final void chooseEncoding() throws IOException {");
+                writer.newLine();
+                writer.write(tab(2) + "if(encoding == null) {");
+                writer.newLine();
+                writer.write(tab(3) + "encoding = AmqpMarshaller.choose" + capFirst(name) + "Encoding(value);");
+                writer.newLine();
+                writer.write(tab(2) + "}");
+                writer.newLine();
+                writer.write(tab(1) + "}");
+                writer.newLine();
+
+            }
+        }
+
+        if (descriptor != null) {
+
+            writer.newLine();
+            writer.write(tab(1) + "public final int getEncodedSize() throws IOException {");
+            writer.newLine();
+            writer.write(tab(2) + "return CONSTRUCTOR.length + value.getEncodedSize();");
+            writer.newLine();
+            writer.write(tab(1) + "}");
+            writer.newLine();
+            writer.newLine();
+            writer.write(tab(1) + "public final void marshal(DataOutputStream dos) throws IOException {");
+            writer.newLine();
+            writer.write(tab(2) + "dos.write(CONSTRUCTOR);");
+            writer.newLine();
+            writer.write(tab(2) + "value.marshal(dos);");
+            writer.newLine();
+            writer.write(tab(1) + "}");
             writer.newLine();
         }
+
         return ret;
     }
 
@@ -270,8 +556,48 @@
         this.primitive = primitive;
     }
 
+    public boolean hasMultipleEncodings() {
+        return encodings != null && encodings.size() > 1;
+    }
+
+    public boolean hasNonFixedEncoding() {
+        if (encodings == null) {
+            return false;
+        }
+
+        for (AmqpEncoding encoding : encodings) {
+            if (!encoding.isFixed()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public boolean hasNonZeroEncoding() {
+        if (encodings == null) {
+            return false;
+        }
+
+        for (AmqpEncoding encoding : encodings) {
+            if (Integer.parseInt(encoding.getWidth()) > 0) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public String getEncodingName(boolean full) {
+        if (full) {
+            return getJavaType() + "." + getEncodingName(false);
+        } else {
+            return toJavaConstant(name) + "_ENCODING";
+        }
+    }
+
     public String toString() {
-        String ret = "Class: " + name + " [Encoding=" + encoding + ", Descriptor=" + descriptor + "]\n";
+        String ret = "Class: " + name + " [Encoding=" + encodings + ", Descriptor=" + descriptor + "]\n";
         ret += " Fields:\n";
         for (AmqpField f : fields.values()) {
             ret += " " + f.toString();

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpDescriptor.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpDescriptor.java?rev=899082&r1=899081&r2=899082&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpDescriptor.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpDescriptor.java Thu Jan 14 06:59:34 2010
@@ -1,21 +1,60 @@
 package org.apache.activemq.amqp.generator;
 
+import java.util.StringTokenizer;
+
 import org.apache.activemq.amqp.generator.jaxb.schema.Descriptor;
 
 public class AmqpDescriptor {
 
-    String code;
-    String name;
+    String formatCode;
+    String symbolicName;
+    long category;
+    long descriptorId;
 
     public void parseFromDescriptor(Descriptor descriptor) {
 
-        code = descriptor.getCode();
-        name = descriptor.getName();
+        formatCode = descriptor.getCode();
+        symbolicName = descriptor.getName();
+        StringTokenizer tok = new StringTokenizer(formatCode, ":");
+        category = Long.parseLong(tok.nextToken().substring(2), 16);
+        descriptorId = Long.parseLong(tok.nextToken().substring(2), 16);
         // TODO descriptor.getDoc();
     }
 
+    public String getFormatCode() {
+        return formatCode;
+    }
+
+    public void setFormatCode(String formatCode) {
+        this.formatCode = formatCode;
+    }
+
+    public String getSymbolicName() {
+        return symbolicName;
+    }
+
+    public void setSymbolicName(String symbolicName) {
+        this.symbolicName = symbolicName;
+    }
+
+    public long getCategory() {
+        return category;
+    }
+
+    public void setCategory(long category) {
+        this.category = category;
+    }
+
+    public long getDescriptorId() {
+        return descriptorId;
+    }
+
+    public void setDescriptorId(long descriptorId) {
+        this.descriptorId = descriptorId;
+    }
+
     public String toString() {
-        return "{" + name + ", code=" + code + "}";
+        return "{" + symbolicName + ", code=" + formatCode + "}";
     }
 
 }

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpEncoding.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpEncoding.java?rev=899082&r1=899081&r2=899082&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpEncoding.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpEncoding.java Thu Jan 14 06:59:34 2010
@@ -8,15 +8,72 @@
     private String category;
     private String code;
     private String width;
-
+    private String label;
+    
     public void parseFromEncoding(Encoding encoding) {
         name = encoding.getName();
         category = encoding.getCategory();
         code = encoding.getCode();
         width = encoding.getWidth();
+        label = encoding.getLabel();
         //TODO: encoding.getDoc();
     }
+    
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
 
+    public String getWidth() {
+        return width;
+    }
+
+    public void setWidth(String width) {
+        this.width = width;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+    
+    public boolean isFixed()
+    {
+        return "fixed".equals(getCategory());
+    }
+
+    public boolean isVariable()
+    {
+        return "variable".equals(getCategory());
+    }
+    
+    public boolean isCompound()
+    {
+        return "compound".equals(getCategory());
+    }
+    
     public String toString() {
         return "{" + name + ", cat=" + category + ", code=" + code + ", width=" + width +"}";
     }

Added: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpMarshallerGen.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpMarshallerGen.java?rev=899082&view=auto
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpMarshallerGen.java (added)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/AmqpMarshallerGen.java Thu Jan 14 06:59:34 2010
@@ -0,0 +1,154 @@
+package org.apache.activemq.amqp.generator;
+
+import static org.apache.activemq.amqp.generator.Utils.*;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashSet;
+
+/**
+ * Generates the AMQP marshaller
+ * 
+ * @author cmacnaug
+ */
+public class AmqpMarshallerGen {
+
+    public static final String MARSHALLER_CLASS_NAME = "AbstractAmqpMarshaller";
+
+    public static void genererate(Generator generator) throws IOException, UnknownTypeException {
+        File file = new File(generator.getOutputDirectory() + File.separator + new String(generator.getPackagePrefix() + "." + MARSHALLER_CLASS_NAME).replace(".", File.separator) + ".java");
+        file.getParentFile().mkdirs();
+        if (file.exists()) {
+            file.delete();
+        }
+        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+
+        writeJavaCopyWrite(writer);
+
+        writer.write("package " + generator.getPackagePrefix() + ";\n");
+        writer.newLine();
+
+        writeImports(writer, generator);
+
+        writer.newLine();
+        writer.write("public abstract class " + MARSHALLER_CLASS_NAME + " {");
+        writer.newLine();
+
+        // Write out encoding enums:
+        writer.newLine();
+        writer.write(tab(1) + "///////////////////////////////////////////////////////////////");
+        writer.write(tab(1) + "//Encodings:                                                 //");
+        writer.write(tab(1) + "///////////////////////////////////////////////////////////////");
+        for (AmqpClass c : TypeRegistry.getGeneratedTypes()) {
+            if (!c.isPrimitive()) {
+                continue;
+            }
+        }
+
+        writer.newLine();
+        writer.write(tab(1) + "///////////////////////////////////////////////////////////////");
+        writer.write(tab(1) + "//Marshallers:                                               //");
+        writer.write(tab(1) + "///////////////////////////////////////////////////////////////");
+
+        // Write out encoding serializers:
+        for (AmqpClass c : TypeRegistry.getGeneratedTypes()) {
+            if (!c.isPrimitive()) {
+                continue;
+            }
+            if (c.encodings != null) {
+                writeEncodingSerializers(c, writer);
+            }
+        }
+
+        writer.newLine();
+        writer.write("}");
+        writer.flush();
+        writer.close();
+    }
+
+    private static boolean writeImports(BufferedWriter writer, Generator generator) throws IOException, UnknownTypeException {
+
+        HashSet<String> imports = new HashSet<String>();
+
+        for (AmqpClass c : TypeRegistry.getGeneratedTypes()) {
+            if (!c.isPrimitive()) {
+                continue;
+            }
+            for (AmqpField field : c.fields.values()) {
+                imports.add(field.getJavaPackage());
+            }
+            imports.add(TypeRegistry.getJavaPackage(c.name));
+        }
+        imports.add("java.io");
+        imports.add(generator.getPackagePrefix() + ".types");
+        imports.remove("java.lang");
+
+        boolean ret = false;
+
+        for (String toImport : imports) {
+            ret = true;
+            writer.write("import " + toImport + ".*;");
+            writer.newLine();
+        }
+        return ret;
+    }
+
+    private static void writeEncodingSerializers(AmqpClass amqpClass, BufferedWriter writer) throws IOException, UnknownTypeException {
+
+        String javaType = TypeRegistry.getJavaType(amqpClass.name);
+        String javaTypeName = javaType;
+
+        if (javaType.endsWith(" []")) {
+            javaTypeName = javaType.substring(0, javaType.indexOf(" []")) + " Array";
+        }
+        if (amqpClass.encodings.size() > 1) {
+            writer.newLine();
+            writeJavaComment(writer, 1, "Chooses a " + amqpClass.getEncodingName(true) + " for the given " + javaType);
+            writer.write(tab(1) + "public abstract " + amqpClass.getEncodingName(true) + " choose" + capFirst(amqpClass.name) + "Encoding(" + javaType + " val) throws IOException;");
+            writer.newLine();
+
+            writer.newLine();
+            writeJavaComment(writer, 1, "Gets the encoded size of " + javaType + " with the given encoding");
+            writer.write(tab(1) + "public abstract int getEncodedSizeOf" + capFirst(toJavaName(amqpClass.name)) + "(" + javaType + " value, " + amqpClass.getEncodingName(true) + " encoding) throws IOException;");
+            writer.newLine();
+
+            boolean hasNonZeroWidthEncoding = false;
+            for (AmqpEncoding encoding : amqpClass.encodings) {
+                if (Integer.parseInt(encoding.getWidth()) > 0) {
+                    hasNonZeroWidthEncoding = true;
+                }
+            }
+            if (hasNonZeroWidthEncoding) {
+                writer.newLine();
+                writeJavaComment(writer, 1, "Writes a " + javaType + " with the given encoding");
+                writer.write(tab(1) + "public abstract void write" + capFirst(toJavaName(amqpClass.name)) + "(" + javaType + " val, " + amqpClass.getEncodingName(true)
+                        + " encoding, DataOutputStream dos) throws IOException;");
+                writer.newLine();
+
+                writer.newLine();
+                writeJavaComment(writer, 1, "Reads a " + javaType + " with the given encoding");
+                writer.write(tab(1) + "public abstract " + javaType + " read" + capFirst(toJavaName(amqpClass.name)) + "(" + amqpClass.getEncodingName(true)
+                        + " encoding, DataInputStream dis) throws IOException;");
+                writer.newLine();
+            }
+        } else {
+            AmqpEncoding encoding = amqpClass.encodings.getFirst();
+            // Don't need a serializer if the width is 0:
+            if (new Integer(encoding.getWidth()) > 0) {
+
+                writer.newLine();
+                writeJavaComment(writer, 1, "Writes a " + javaType + " encoded as " + encoding.getLabel());
+                writer.write(tab(1) + "public abstract void write" + capFirst(toJavaName(amqpClass.name)) + "(" + javaType + " val, DataOutputStream dos) throws IOException;");
+                writer.newLine();
+
+                writer.newLine();
+                writeJavaComment(writer, 1, "Reads a " + javaType + " encoded as " + encoding.getLabel());
+                writer.write(tab(1) + "public abstract " + javaType + " read" + capFirst(toJavaName(amqpClass.name)) + "(DataInputStream dis) throws IOException;");
+                writer.newLine();
+            }
+        }
+
+    }
+}

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Generator.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Generator.java?rev=899082&r1=899081&r2=899082&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Generator.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Generator.java Thu Jan 14 06:59:34 2010
@@ -1,5 +1,13 @@
 package org.apache.activemq.amqp.generator;
 
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.HashMap;
 import java.util.List;
 import javax.xml.bind.JAXBContext;
@@ -20,17 +28,17 @@
 
     private Log LOG = LogFactory.getLog(Generator.class);
 
-    private String [] inputFiles;
+    private String[] inputFiles;
     private String outputDirectory;
     private String packagePrefix;
 
     private TypeRegistry typeRegistry = new TypeRegistry();
 
-    public String [] getInputFile() {
+    public String[] getInputFile() {
         return inputFiles;
     }
 
-    public void setInputFiles(String ... inputFiles) {
+    public void setInputFiles(String... inputFiles) {
         this.inputFiles = inputFiles;
     }
 
@@ -54,8 +62,7 @@
         TypeRegistry.init(this);
         JAXBContext jc = JAXBContext.newInstance(Amqp.class.getPackage().getName());
 
-        for(String inputFile : inputFiles)
-        {
+        for (String inputFile : inputFiles) {
             // JAXB has some namespace handling problems:
             Unmarshaller unmarshaller = jc.createUnmarshaller();
             SAXParserFactory parserFactory;
@@ -67,7 +74,7 @@
             // File(inputFile)), Amqp.class).getValue();
             Amqp amqp = (Amqp) unmarshaller.unmarshal(er);
             List<Object> list = amqp.getDocOrSection();
-    
+
             // Scan document:
             for (Object docOrSection : amqp.getDocOrSection()) {
                 if (docOrSection instanceof Section) {
@@ -82,6 +89,26 @@
             }
         }
 
+        // Copy handcoded:
+        String[] handcoded = new String[] { "AmqpMarshaller", "AmqpType"};
+        for (String javaFile : handcoded) {
+            BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("org/apache/activemq/amqp/generator/handcoded/" + javaFile + ".jtemp")));
+            String line = reader.readLine();
+            line = line.replace("org.apache.activemq.amqp.generator.handcoded", packagePrefix);
+
+            File out = new File(this.outputDirectory + File.separator + packagePrefix.replace(".", File.separator) + File.separator + javaFile + ".java");
+            out.getParentFile().mkdirs();
+            BufferedWriter writer = new BufferedWriter(new FileWriter(out));
+
+            while (line != null) {
+                writer.write(line);
+                writer.newLine();
+                line = reader.readLine();
+            }
+            writer.flush();
+            writer.close();
+        }
+
         // Generate Types:
         for (AmqpClass amqpClass : TypeRegistry.getGeneratedTypes()) {
             amqpClass.generate(this);

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/TypeRegistry.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/TypeRegistry.java?rev=899082&r1=899081&r2=899082&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/TypeRegistry.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/TypeRegistry.java Thu Jan 14 06:59:34 2010
@@ -27,8 +27,9 @@
         JAVA_TYPE_MAP.put("binary", new JavaTypeMapping("binary", "byte []", "java.lang"));
         JAVA_TYPE_MAP.put("string", new JavaTypeMapping("string", "String", "java.lang"));
         JAVA_TYPE_MAP.put("symbol", new JavaTypeMapping("symbol", "String", "java.lang"));
-        JAVA_TYPE_MAP.put("list", new JavaTypeMapping("list", "List", "java.util"));
-        JAVA_TYPE_MAP.put("map", new JavaTypeMapping("map", "HashMap", "java.util"));
+        JAVA_TYPE_MAP.put("list", new JavaTypeMapping("list", "List <AmqpType>", "java.util"));
+        JAVA_TYPE_MAP.put("map", new JavaTypeMapping("map", "HashMap <AmqpType, AmqpType>", "java.util"));
+        JAVA_TYPE_MAP.put("null", new JavaTypeMapping("null", "Object", "java.lang"));
 
     }
 
@@ -36,6 +37,8 @@
         // Add in the wildcard type:
         GENERATED_TYPE_MAP.put("*", new AnyClass("*", "AmqpAny", generator.getPackagePrefix() + ".types"));
         JAVA_TYPE_MAP.put("*", new JavaTypeMapping("*", "byte []", "java.lang"));
+        
+        // Add in the compound type:
     }
 
     public static String getJavaType(AmqpField field) throws UnknownTypeException {
@@ -117,6 +120,19 @@
             super.javaType = javaType;
             super.setPrimitive(true);
             super.javaPackage = javaPackage;
+            super.handcoded = true;
         }
     }
+    
+    public static class CompoundType extends AmqpClass {
+
+        CompoundType(String name, String javaType, String javaPackage) {
+            super.name = name;
+            super.javaType = javaType;
+            super.setPrimitive(true);
+            super.javaPackage = javaPackage;
+        }
+    }
+    
+    
 }

Modified: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Utils.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Utils.java?rev=899082&r1=899081&r2=899082&view=diff
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Utils.java (original)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/java/org/apache/activemq/amqp/generator/Utils.java Thu Jan 14 06:59:34 2010
@@ -1,5 +1,7 @@
 package org.apache.activemq.amqp.generator;
 
+import java.io.BufferedWriter;
+import java.io.IOException;
 import java.util.StringTokenizer;
 
 public class Utils {
@@ -8,7 +10,7 @@
     public static final String NL = "\n";
 
     public static final String toJavaName(String name) {
-        StringTokenizer tok = new StringTokenizer(name, "-");
+        StringTokenizer tok = new StringTokenizer(name.trim(), "- ");
         String javaName = "";
         int i = 0;
         while (tok.hasMoreElements()) {
@@ -23,9 +25,9 @@
         }
         return javaName;
     }
-    
+
     public static final String toJavaConstant(String name) {
-        StringTokenizer tok = new StringTokenizer(name, "-");
+        StringTokenizer tok = new StringTokenizer(name.trim(), "- ");
         String javaName = "";
         int i = 0;
         while (tok.hasMoreElements()) {
@@ -54,4 +56,48 @@
         return ret;
     }
 
+    public static final String padHex(String hex, int count) {
+        while (hex.length() < count) {
+            hex = "0" + hex;
+        }
+        return hex;
+    }
+    
+    public static void writeJavaCopyWrite(BufferedWriter writer) throws IOException {
+        
+        writeJavaComment(writer, 0, 
+                "Licensed to the Apache Software Foundation (ASF) under one or more",
+                "contributor license agreements.  See the NOTICE file distributed with",
+                "his 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.");
+    }
+    
+    public static void writeJavaComment(BufferedWriter writer, int indent, String ... commentLines) throws IOException
+    {
+        if(commentLines == null)
+        {
+            return;
+        }
+        
+        writer.write(tab(indent) + "/**");
+        writer.newLine();
+        for(String s : commentLines)
+        {
+            writer.write(tab(indent) + " * " + s);
+            writer.newLine();
+        }
+        writer.write(tab(indent) + " */");
+        writer.newLine();
+    }
+
 }

Added: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpMarshaller.jtemp
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpMarshaller.jtemp?rev=899082&view=auto
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpMarshaller.jtemp (added)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpMarshaller.jtemp Thu Jan 14 06:59:34 2010
@@ -0,0 +1,324 @@
+package org.apache.activemq.amqp.generator.handcoded;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.activemq.amqp.v1pr2.types.AmqpBinary;
+import org.apache.activemq.amqp.v1pr2.types.AmqpBoolean;
+import org.apache.activemq.amqp.v1pr2.types.AmqpList;
+import org.apache.activemq.amqp.v1pr2.types.AmqpMap;
+import org.apache.activemq.amqp.v1pr2.types.AmqpString;
+import org.apache.activemq.amqp.v1pr2.types.AmqpSymbol;
+import org.apache.activemq.amqp.v1pr2.types.AmqpBinary.BINARY_ENCODING;
+import org.apache.activemq.amqp.v1pr2.types.AmqpBoolean.BOOLEAN_ENCODING;
+import org.apache.activemq.amqp.v1pr2.types.AmqpList.LIST_ENCODING;
+import org.apache.activemq.amqp.v1pr2.types.AmqpMap.MAP_ENCODING;
+import org.apache.activemq.amqp.v1pr2.types.AmqpString.STRING_ENCODING;
+import org.apache.activemq.amqp.v1pr2.types.AmqpSymbol.SYMBOL_ENCODING;
+
+public class AmqpMarshaller {
+
+    public static final AmqpBinary.BINARY_ENCODING chooseBinaryEncoding(byte[] val) throws IOException {
+        if (val.length > 255) {
+            return AmqpBinary.BINARY_ENCODING.VBIN32;
+        }
+        return AmqpBinary.BINARY_ENCODING.VBIN8;
+    }
+
+    public static final AmqpBoolean.BOOLEAN_ENCODING chooseBooleanEncoding(boolean val) throws IOException {
+        if (val) {
+            return AmqpBoolean.BOOLEAN_ENCODING.TRUE;
+        }
+        return AmqpBoolean.BOOLEAN_ENCODING.FALSE;
+    }
+
+    public static final AmqpList.LIST_ENCODING chooseListEncoding(List val) throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static final AmqpMap.MAP_ENCODING chooseMapEncoding(HashMap val) throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static final AmqpString.STRING_ENCODING chooseStringEncoding(String val) throws IOException {
+        if (val.length() > 255 || val.getBytes("utf-16").length > 255) {
+            return AmqpString.STRING_ENCODING.STR32_UTF16;
+        }
+
+        return AmqpString.STRING_ENCODING.STR32_UTF16;
+    }
+
+    public static final AmqpSymbol.SYMBOL_ENCODING chooseSymbolEncoding(String val) throws IOException {
+        if (val.length() > 255 || val.getBytes("ascii").length > 255) {
+            return AmqpSymbol.SYMBOL_ENCODING.SYM32;
+        }
+        return AmqpSymbol.SYMBOL_ENCODING.SYM8;
+    }
+
+    public static final byte readByte(DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public static final byte[] readBinary(AmqpBinary.BINARY_ENCODING encoding, DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static final char readChar(DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public static final double readDouble(DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public static final float readFloat(DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public static final HashMap readMap(AmqpMap.MAP_ENCODING encoding, DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static final int readInt(DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return dis.readInt();
+    }
+
+    public static final List readList(AmqpList.LIST_ENCODING encoding, DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static final long readLong(DataInputStream dis) throws IOException {
+        return dis.readLong();
+    }
+
+    public static final short readShort(DataInputStream dis) throws IOException {
+        return dis.readShort();
+    }
+
+    public static final String readString(AmqpString.STRING_ENCODING encoding, DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static final String readSymbol(AmqpSymbol.SYMBOL_ENCODING encoding, DataInputStream dis) throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static final Date readTimestamp(DataInputStream dis) throws IOException {
+        return new Date(dis.readInt());
+    }
+
+    public static final short readUbyte(DataInputStream dis) throws IOException {
+        return (short) (0xFF & (short) dis.readByte());
+    }
+
+    public static final long readUint(DataInputStream dis) throws IOException {
+        long rc = 0;
+        rc = rc | (0xFFFFFFFFL & (((long) dis.readByte()) << 24));
+        rc = rc | (0xFFFFFFFFL & (((long) dis.readByte()) << 16));
+        rc = rc | (0xFFFFFFFFL & (((long) dis.readByte()) << 8));
+        rc = rc | (0xFFFFFFFFL & (long) dis.readByte());
+
+        return rc;
+    }
+
+    public static final BigInteger readUlong(DataInputStream dis) throws IOException {
+        byte[] rc = new byte[9];
+        rc[0] = 0;
+        dis.readFully(rc, 1, 8);
+        return new BigInteger(rc);
+    }
+
+    public static final int readUshort(DataInputStream dis) throws IOException {
+        int rc = 0;
+        rc = rc | ((int) 0xFFFF & (((int) dis.readByte()) << 8));
+        rc = rc | ((int) 0xFFFF & (int) dis.readByte());
+
+        return rc;
+    }
+
+    public static final UUID readUuid(DataInputStream dis) throws IOException {
+        return new UUID(dis.readLong(), dis.readLong());
+    }
+
+    public static final void writeByte(byte val, DataOutputStream dos) throws IOException {
+        dos.writeByte(val);
+    }
+
+    public static final void writeBinary(byte[] val, AmqpBinary.BINARY_ENCODING encoding, DataOutputStream dos) throws IOException {
+        dos.write(val);
+    }
+
+    public static final void writeChar(char val, DataOutputStream dos) throws IOException {
+        // TODO Auto-generated method stub
+
+    }
+
+    public static final void writeDouble(double val, DataOutputStream dos) throws IOException {
+        dos.writeLong(Double.doubleToLongBits(val));
+        // dos.writeDouble(val);
+    }
+
+    public static final void writeFloat(float val, DataOutputStream dos) throws IOException {
+        dos.writeInt(Float.floatToIntBits(val));
+        // dos.writeFloat(val);
+    }
+
+    public static final void writeMap(HashMap val, AmqpMap.MAP_ENCODING encoding, DataOutputStream dos) throws IOException {
+        // TODO Auto-generated method stub
+    }
+
+    public static final void writeInt(int val, DataOutputStream dos) throws IOException {
+        // TODO Auto-generated method stub
+
+    }
+
+    public static final void writeList(List val, AmqpList.LIST_ENCODING encoding, DataOutputStream dos) throws IOException {
+        // TODO Auto-generated method stub
+
+    }
+
+    public static final void writeLong(long val, DataOutputStream dos) throws IOException {
+        dos.writeLong(val);
+    }
+
+    public static final void writeShort(short val, DataOutputStream dos) throws IOException {
+        dos.writeShort(val);
+    }
+
+    public static final void writeString(String val, AmqpString.STRING_ENCODING encoding, DataOutputStream dos) throws IOException {
+        switch (encoding) {
+        case STR32_UTF16:
+        case STR8_UTF16: {
+            dos.write(val.getBytes("utf-16"));
+        }
+        case STR32_UTF8:
+        case STR8_UTF8: {
+            dos.write(val.getBytes("utf-8"));
+        }
+        default:
+            throw new UnsupportedEncodingException(encoding.name());
+        }
+
+    }
+
+    public static final void writeTimestamp(Date val, DataOutputStream dos) throws IOException {
+        dos.writeInt((int) val.getTime());
+
+    }
+
+    public static final void writeUbyte(short val, DataOutputStream dos) throws IOException {
+        dos.write(val);
+
+    }
+
+    public static final void writeUint(long val, DataOutputStream dos) throws IOException {
+        dos.writeInt((int) val);
+
+    }
+
+    public static final void writeUlong(BigInteger val, DataOutputStream dos) throws IOException {
+        byte[] b = val.toByteArray();
+        if (b.length > 8) {
+            for (int i = 0; i < b.length - 8; i++) {
+                if (b[i] > 0) {
+                    throw new UnsupportedEncodingException("Unsigned long too large");
+                }
+            }
+        }
+        dos.write(b, b.length - 8, 8);
+    }
+
+    public static final void writeUshort(int val, DataOutputStream dos) throws IOException {
+        dos.writeShort((short) val);
+    }
+
+    public static final void writeUuid(UUID val, DataOutputStream dos) throws IOException {
+        dos.writeLong(val.getMostSignificantBits());
+        dos.writeLong(val.getLeastSignificantBits());
+    }
+
+    public static final int getEncodedSizeOfBinary(byte[] val, BINARY_ENCODING encoding) throws IOException {
+        return val.length;
+    }
+
+    public static final int getEncodedSizeOfBoolean(boolean val, BOOLEAN_ENCODING encoding) throws IOException {
+        return 0;
+    }
+
+    public static final int getEncodedSizeOfList(List val, LIST_ENCODING encoding) throws IOException {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public static final int getEncodedSizeOfMap(HashMap val, MAP_ENCODING encoding) throws IOException {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public static final int getEncodedSizeOfString(String val, STRING_ENCODING encoding) throws IOException {
+        switch (encoding) {
+        case STR32_UTF16:
+        case STR8_UTF16: {
+            return val.getBytes("utf-16").length;
+        }
+        case STR32_UTF8:
+        case STR8_UTF8: {
+            return val.getBytes("utf-8").length;
+        }
+        default:
+            throw new UnsupportedEncodingException(encoding.name());
+        }
+    }
+
+    public static final int getEncodedSizeOfSymbol(String val, SYMBOL_ENCODING encoding) throws IOException {
+        return val.length();
+    }
+
+    public static final void writeSymbol(String val, SYMBOL_ENCODING encoding, DataOutputStream dos) throws IOException {
+        dos.write(val.getBytes("ascii"));
+    }
+
+    public static final void main(String[] arg) {
+        AmqpMarshaller marshaller = new AmqpMarshaller();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(30);
+        DataOutputStream dos = new DataOutputStream(baos);
+
+        try {
+            BigInteger unsigned = new BigInteger("" + Long.MAX_VALUE).multiply(new BigInteger("2"));
+            marshaller.writeUlong(unsigned, dos);
+            dos.flush();
+
+            byte[] b = baos.toByteArray();
+            ByteArrayInputStream bais = new ByteArrayInputStream(b);
+            DataInputStream dis = new DataInputStream(bais);
+            BigInteger read = marshaller.readUlong(dis);
+            if (read != unsigned) {
+                throw new Exception();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

Added: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpType.jtemp
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpType.jtemp?rev=899082&view=auto
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpType.jtemp (added)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/AmqpType.jtemp Thu Jan 14 06:59:34 2010
@@ -0,0 +1,28 @@
+package org.apache.activemq.amqp.generator.handcoded;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with his 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.
+ */
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public interface AmqpType {
+
+    public void marshal(DataOutputStream dos) throws IOException;
+    
+    public int getEncodedSize() throws IOException;
+}

Added: activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/types/AmqpAny.jtemp
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/types/AmqpAny.jtemp?rev=899082&view=auto
==============================================================================
--- activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/types/AmqpAny.jtemp (added)
+++ activemq/sandbox/activemq-apollo-actor/activemq-amqp-generator/src/main/resources/org/apache/activemq/amqp/generator/handcoded/types/AmqpAny.jtemp Thu Jan 14 06:59:34 2010
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * his 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.amqp.generator.handcoded.types;
+
+import java.io.*;
+import org.apache.activemq.amqp.v1pr2.*;
+
+public class AmqpAny {
+
+    private byte [] value;
+
+    public final void setValue(byte [] value) {
+        this.value = value;
+    }
+
+    public final byte [] getValue() {
+        return value;
+    }
+
+    public final long getEncodedSize() throws IOException{
+
+        chooseEncoding();
+        return encoding.getEncodedSize(value);
+    }
+
+    public final void marshal(DataOutputStream dos, byte [] val) throws IOException {
+        chooseEncoding();
+        dos.writeByte(encoding.getFormatCode());    }
+
+    public final void chooseEncoding() throws IOException {
+        if(encoding == null) {
+            encoding = AmqpMarshaller.choose*Encoding(value);
+        }
+    }
+
+}
\ No newline at end of file