You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2007/11/24 22:14:23 UTC

svn commit: r597918 [4/12] - in /incubator/qpid/branches/M2.1: gentools/ gentools/lib/ gentools/src/org/apache/qpid/gentools/ java/ java/broker/src/main/java/org/apache/qpid/server/ java/broker/src/main/java/org/apache/qpid/server/handler/ java/broker/...

Modified: incubator/qpid/branches/M2.1/gentools/src/org/apache/qpid/gentools/CppGenerator.java
URL: http://svn.apache.org/viewvc/incubator/qpid/branches/M2.1/gentools/src/org/apache/qpid/gentools/CppGenerator.java?rev=597918&r1=597917&r2=597918&view=diff
==============================================================================
--- incubator/qpid/branches/M2.1/gentools/src/org/apache/qpid/gentools/CppGenerator.java (original)
+++ incubator/qpid/branches/M2.1/gentools/src/org/apache/qpid/gentools/CppGenerator.java Sat Nov 24 13:14:14 2007
@@ -21,37 +21,35 @@
 package org.apache.qpid.gentools;
 
 import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.TreeMap;
 
 public class CppGenerator extends Generator
 {
-	protected static final String versionNamespaceStartToken = "${version_namespace_start}";
-	protected static final String versionNamespaceEndToken = "${version_namespace_end}";
-	
-	// TODO: Move this to parent class
-	protected static final int FIELD_NAME = 0;
-	protected static final int FIELD_CODE_TYPE = 1;
-    
+    protected static final String versionNamespaceStartToken = "${version_namespace_start}";
+    protected static final String versionNamespaceEndToken = "${version_namespace_end}";
+
+    // TODO: Move this to parent class
+    protected static final int FIELD_NAME = 0;
+    protected static final int FIELD_CODE_TYPE = 1;
+
     /**
      * A complete list of C++ reserved words. The names of varous XML elements within the AMQP
      * specification file are used for C++ identifier names in the generated code. Each proposed
      * name is checked against this list and is modified (by adding an '_' to the end of the
      * name - see function parseForReservedWords()) if found to be present.
      */
-	protected static final String[] cppReservedWords = {"and", "and_eq", "asm", "auto", "bitand",
-		"bitor", "bool", "break", "case", "catch", "char", "class", "compl", "const", "const_cast",
-		"continue", "default", "delete", "do", "DomainInfo", "double", "dynamic_cast", "else",
-		"enum", "explicit", "extern", "false", "float", "for", "friend", "goto", "if", "inline",
-		"int", "long", "mutable", "namespace", "new", "not", "not_eq", "operator", "or", "or_eq",
-		"private", "protected", "public", "register", "reinterpret_cast", "return", "short",
-		"signed", "sizeof", "static", "static_cast", "struct", "switch", "template", "this",
-		"throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using",
-		"virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"};
-    
+    protected static final String[] cppReservedWords = {"and", "and_eq", "asm", "auto", "bitand",
+                                                        "bitor", "bool", "break", "case", "catch", "char", "class", "compl", "const", "const_cast",
+                                                        "continue", "default", "delete", "do", "DomainInfo", "double", "dynamic_cast", "else",
+                                                        "enum", "explicit", "extern", "false", "float", "for", "friend", "goto", "if", "inline",
+                                                        "int", "long", "mutable", "namespace", "new", "not", "not_eq", "operator", "or", "or_eq",
+                                                        "private", "protected", "public", "register", "reinterpret_cast", "return", "short",
+                                                        "signed", "sizeof", "static", "static_cast", "struct", "switch", "template", "this",
+                                                        "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using",
+                                                        "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq"};
+
     /**
      * Although not reserved words, the following list of variable names that may cause compile
      * problems within a C++ environment because they clash with common #includes. The names of
@@ -61,87 +59,89 @@
      * to be present. This list is best added to on an as-needed basis.
      */
     protected static final String[] cppCommonDefines = {"string"};
-    
+
     // TODO: Move this to the Generator superclass?
     protected boolean quietFlag; // Supress warning messages to the console
-	
-	private class DomainInfo	
-	{
-		public String type;
-		public String size;
-		public String encodeExpression;
-		public String decodeExpression;
-		public DomainInfo(String domain, String size, String encodeExpression,
-			String decodeExpression)
-		{
-			this.type = domain;
-			this.size = size;
-			this.encodeExpression = encodeExpression;
-			this.decodeExpression = decodeExpression;
-		}
-	}
-	
-	private static TreeMap<String, DomainInfo> typeMap = new TreeMap<String, DomainInfo>();
-	
-	public CppGenerator(AmqpVersionSet versionList)
-	{
-		super(versionList);
+
+    private class DomainInfo
+    {
+        public String type;
+        public String size;
+        public String encodeExpression;
+        public String decodeExpression;
+
+        public DomainInfo(String domain, String size, String encodeExpression,
+                          String decodeExpression)
+        {
+            this.type = domain;
+            this.size = size;
+            this.encodeExpression = encodeExpression;
+            this.decodeExpression = decodeExpression;
+        }
+    }
+
+    private static TreeMap<String, DomainInfo> typeMap = new TreeMap<String, DomainInfo>();
+
+    public CppGenerator()
+    {
+        super();
         quietFlag = true;
-		// Load C++ type and size maps.
-		// Adjust or add to these lists as new types are added/defined.
-		// The char '#' will be replaced by the field variable name (any type).
-		// The char '~' will be replaced by the compacted bit array size (type bit only).
-		typeMap.put("bit", new DomainInfo(
-				"bool",					// type
-				"~", 					// size
-		        "",						// encodeExpression
-    			""));					// decodeExpression
-		typeMap.put("content", new DomainInfo(
-				"Content",				// type
-				"#.size()", 			// size
-		        "buffer.putContent(#)",	// encodeExpression
-    			"buffer.getContent(#)")); // decodeExpression
-		typeMap.put("long", new DomainInfo(
-				"u_int32_t",			// type
-				"4", 					// size
-                "buffer.putLong(#)",	// encodeExpression
-				"# = buffer.getLong()"));	// decodeExpression
-		typeMap.put("longlong", new DomainInfo(
-				"u_int64_t",			// type
-				"8", 					// size
+        // Load C++ type and size maps.
+        // Adjust or add to these lists as new types are added/defined.
+        // The char '#' will be replaced by the field variable name (any type).
+        // The char '~' will be replaced by the compacted bit array size (type bit only).
+        typeMap.put("bit", new DomainInfo(
+                "bool",                    // type
+                "~",                     // size
+                "",                        // encodeExpression
+                ""));                    // decodeExpression
+        typeMap.put("content", new DomainInfo(
+                "Content",                // type
+                "#.size()",             // size
+                "buffer.putContent(#)",    // encodeExpression
+                "buffer.getContent(#)")); // decodeExpression
+        typeMap.put("long", new DomainInfo(
+                "u_int32_t",            // type
+                "4",                     // size
+                "buffer.putLong(#)",    // encodeExpression
+                "# = buffer.getLong()"));    // decodeExpression
+        typeMap.put("longlong", new DomainInfo(
+                "u_int64_t",            // type
+                "8",                     // size
                 "buffer.putLongLong(#)", // encodeExpression
-				"# = buffer.getLongLong()")); // decodeExpression
-		typeMap.put("longstr", new DomainInfo(
-				"string",				// type
-				"4 + #.length()", 		// size
+                "# = buffer.getLongLong()")); // decodeExpression
+        typeMap.put("longstr", new DomainInfo(
+                "string",                // type
+                "4 + #.length()",         // size
                 "buffer.putLongString(#)", // encodeExpression
-				"buffer.getLongString(#)")); // decodeExpression
-		typeMap.put("octet", new DomainInfo(
-				"u_int8_t",				// type
-				"1", 					// size
-                "buffer.putOctet(#)",	// encodeExpression
-				"# = buffer.getOctet()"));	// decodeExpression
-		typeMap.put("short", new DomainInfo(
-				"u_int16_t",			// type
-				"2",					// size
-                "buffer.putShort(#)",	// encodeExpression
-				"# = buffer.getShort()"));	// decodeExpression
-		typeMap.put("shortstr", new DomainInfo(
-				"string",				// type
-				"1 + #.length()",		// size
+                "buffer.getLongString(#)")); // decodeExpression
+        typeMap.put("octet", new DomainInfo(
+                "u_int8_t",                // type
+                "1",                     // size
+                "buffer.putOctet(#)",    // encodeExpression
+                "# = buffer.getOctet()"));    // decodeExpression
+        typeMap.put("short", new DomainInfo(
+                "u_int16_t",            // type
+                "2",                    // size
+                "buffer.putShort(#)",    // encodeExpression
+                "# = buffer.getShort()"));    // decodeExpression
+        typeMap.put("shortstr", new DomainInfo(
+                "string",                // type
+                "1 + #.length()",        // size
                 "buffer.putShortString(#)", // encodeExpression
-				"buffer.getShortString(#)")); // decodeExpression
-		typeMap.put("table", new DomainInfo(
-				"FieldTable",			// type
-				"#.size()", 			// size
+                "buffer.getShortString(#)")); // decodeExpression
+        typeMap.put("table", new DomainInfo(
+                "FieldTable",            // type
+                "#.size()",             // size
                 "buffer.putFieldTable(#)", // encodeExpression
-				"buffer.getFieldTable(#)")); // decodeExpression
-		typeMap.put("timestamp", new DomainInfo(
-				"u_int64_t",			// type
-				"8", 					// size
+                "buffer.getFieldTable(#)")); // decodeExpression
+        typeMap.put("timestamp", new DomainInfo(
+                "u_int64_t",            // type
+                "8",                     // size
                 "buffer.putLongLong(#)", // encodeExpression
-				"buffer.getLongLong(#)")); // decodeExpression
-	}
+                "buffer.getLongLong(#)")); // decodeExpression
+    }
+
 
     public boolean isQuietFlag()
     {
@@ -152,40 +152,33 @@
     {
         this.quietFlag = quietFlag;
     }
-	
-	// === Start of methods for Interface LanguageConverter ===
-	
-	public String prepareClassName(String className)
-	{
-		return camelCaseName(className, true);
-	}
-	
-	public String prepareMethodName(String methodName)
-	{
-		return camelCaseName(methodName, false);		
-	}
-	
-	public String prepareDomainName(String domainName)
-	{
-		return camelCaseName(domainName, false);		
-	}
-	
-	public String getDomainType(String domainName, AmqpVersion version)
-		throws AmqpTypeMappingException
-	{
-        if (version == null)
-            version = globalVersionSet.first();
-		return globalDomainMap.getDomainType(domainName, version);
-	}
-	
-	public String getGeneratedType(String domainName, AmqpVersion version)
-		throws AmqpTypeMappingException
-	{
-		String domainType = getDomainType(domainName, version);
-		if (domainType == null)
+
+    // === Start of methods for Interface LanguageConverter ===
+
+    public String prepareClassName(String className)
+    {
+        return camelCaseName(className, true);
+    }
+
+    public String prepareMethodName(String methodName)
+    {
+        return camelCaseName(methodName, false);
+    }
+
+    public String prepareDomainName(String domainName)
+    {
+        return camelCaseName(domainName, false);
+    }
+
+
+    public String getGeneratedType(String domainName, AmqpVersion version)
+            throws AmqpTypeMappingException
+    {
+        String domainType = getDomainType(domainName, version);
+        if (domainType == null)
         {
-			throw new AmqpTypeMappingException("Domain type \"" + domainName +
-				"\" not found in C++ typemap.");
+            throw new AmqpTypeMappingException("Domain type \"" + domainName +
+                                               "\" not found in C++ typemap.");
         }
         DomainInfo info = typeMap.get(domainType);
         if (info == null)
@@ -193,228 +186,255 @@
             throw new AmqpTypeMappingException("Unknown domain: \"" + domainType + "\"");
         }
         return info.type;
-	}
-	
-	// === Abstract methods from class Generator - C++-specific implementation ===
-	
-	@Override
-	protected String prepareFilename(String filenameTemplate, AmqpClass thisClass, AmqpMethod method,
-			AmqpField field)
-	{
-		StringBuffer sb = new StringBuffer(filenameTemplate);
-		if (thisClass != null)
-			replaceToken(sb, "${CLASS}", thisClass.name);
-		if (method != null)
-			replaceToken(sb, "${METHOD}", method.name);
-		if (field != null)
-			replaceToken(sb, "${FIELD}", field.name);
-		return sb.toString();
-	}
-	
-	@Override
-	protected void processTemplateA(String[] template)
-	    throws IOException, AmqpTemplateException, AmqpTypeMappingException,
-	    	IllegalAccessException, InvocationTargetException
-   	{
-		processTemplateD(template, null, null, null);
-  	}
-	
-	@Override
-	protected void processTemplateB(String[] template, AmqpClass thisClass)
-	    throws IOException, AmqpTemplateException, AmqpTypeMappingException,
-	    	IllegalAccessException, InvocationTargetException
-	{
-		processTemplateD(template, thisClass, null, null);
-	}
-	
-	@Override
-	protected void processTemplateC(String[] template, AmqpClass thisClass,
-		AmqpMethod method)
-	    throws IOException, AmqpTemplateException, AmqpTypeMappingException,
-	    	IllegalAccessException, InvocationTargetException
-	{
-		StringBuffer sb = new StringBuffer(template[templateStringIndex]);
-		String filename = prepareFilename(getTemplateFileName(sb), thisClass, method, null);
-		boolean templateProcessedFlag = false;
-		
-		// If method is not version consistent, create a namespace for each version
-		// i.e. copy the bit between the versionNamespaceStartToken and versionNamespaceEndToken
-		// once for each namespace.
-		if (method != null)
-		{
-			if (!method.isVersionConsistent(globalVersionSet))
-			{
-				int namespaceStartIndex = sb.indexOf(versionNamespaceStartToken);
-				int namespaceEndIndex = sb.indexOf(versionNamespaceEndToken) +
-					versionNamespaceEndToken.length();
-				if (namespaceStartIndex >= 0 && namespaceEndIndex >= 0 &&
-					namespaceStartIndex <= namespaceEndIndex)
-				{
-					String namespaceSpan = sb.substring(namespaceStartIndex, namespaceEndIndex) + cr;
-					sb.delete(namespaceStartIndex, namespaceEndIndex);
-					for (AmqpVersion v : method.versionSet)
-					{
-						StringBuffer nssb = new StringBuffer(namespaceSpan);
-						processTemplate(nssb, thisClass, method, null, template[templateFileNameIndex],	v);
-						sb.insert(namespaceStartIndex, nssb);						
-					}
+    }
+
+    // === Abstract methods from class Generator - C++-specific implementation ===
+
+    @Override
+    protected String prepareFilename(String filenameTemplate, AmqpClass thisClass, AmqpMethod method,
+                                     AmqpField field, AmqpVersion version)
+    {
+        StringBuffer sb = new StringBuffer(filenameTemplate);
+        if (thisClass != null)
+        {
+            replaceToken(sb, "${CLASS}", thisClass.getName());
+        }
+        if (method != null)
+        {
+            replaceToken(sb, "${METHOD}", method.getName());
+        }
+        if (field != null)
+        {
+            replaceToken(sb, "${FIELD}", field.getName());
+        }
+        return sb.toString();
+    }
+
+    @Override
+    protected void processModelTemplate(NamedTemplate template)
+    {
+        processTemplate(template, null, null, null, null);
+    }
+
+    @Override
+    protected void processClassTemplate(NamedTemplate template, AmqpClass thisClass)
+    {
+        processTemplate(template, thisClass, null, null, null);
+    }
+
+    @Override
+    protected void processMethodTemplate(NamedTemplate template, AmqpClass thisClass,
+                                         AmqpMethod method)
+    {
+        StringBuffer sb = new StringBuffer(template.getTemplate());
+        String filename = prepareFilename(getTemplateFileName(sb), thisClass, method, null, null);
+        boolean templateProcessedFlag = false;
+
+        // If method is not version consistent, create a namespace for each version
+        // i.e. copy the bit between the versionNamespaceStartToken and versionNamespaceEndToken
+        // once for each namespace.
+        if (method != null)
+        {
+            if (!method.isVersionConsistent(getVersionSet()))
+            {
+                int namespaceStartIndex = sb.indexOf(versionNamespaceStartToken);
+                int namespaceEndIndex = sb.indexOf(versionNamespaceEndToken) +
+                                        versionNamespaceEndToken.length();
+                if (namespaceStartIndex >= 0 && namespaceEndIndex >= 0 &&
+                    namespaceStartIndex <= namespaceEndIndex)
+                {
+                    String namespaceSpan = sb.substring(namespaceStartIndex, namespaceEndIndex) + CR;
+                    sb.delete(namespaceStartIndex, namespaceEndIndex);
+                    for (AmqpVersion v : method.getVersionSet())
+                    {
+                        StringBuffer nssb = new StringBuffer(namespaceSpan);
+                        processTemplate(nssb, thisClass, method, null, template.getName(), v);
+                        sb.insert(namespaceStartIndex, nssb);
+                    }
                     // Process all tokens *not* within the namespace span prior to inserting namespaces
-                    processTemplate(sb, thisClass, method, null, template[templateFileNameIndex], null);
-				}
-				templateProcessedFlag = true;
-			}
-		}
-		// Remove any remaining namespace tags
-		int nsTokenIndex = sb.indexOf(versionNamespaceStartToken);
-		while (nsTokenIndex > 0)
-		{
-			sb.delete(nsTokenIndex, nsTokenIndex + versionNamespaceStartToken.length());
-			nsTokenIndex = sb.indexOf(versionNamespaceStartToken);
-		}
-		nsTokenIndex = sb.indexOf(versionNamespaceEndToken);
-		while (nsTokenIndex > 0)
-		{
-			sb.delete(nsTokenIndex, nsTokenIndex + versionNamespaceEndToken.length());
-			nsTokenIndex = sb.indexOf(versionNamespaceEndToken);
-		}
-		
-		if (!templateProcessedFlag)
-		{
-			processTemplate(sb, thisClass, method, null, template[templateFileNameIndex], null);
-		}
-		writeTargetFile(sb, new File(genDir + Utils.fileSeparator + filename));
-		generatedFileCounter ++;
-	}
-	
-	@Override
-	protected void processTemplateD(String[] template, AmqpClass thisClass, AmqpMethod method,
-		AmqpField field)
-	    throws IOException, AmqpTemplateException, AmqpTypeMappingException, IllegalAccessException,
-	       	InvocationTargetException
-	{
-		StringBuffer sb = new StringBuffer(template[templateStringIndex]);
-		String filename = prepareFilename(getTemplateFileName(sb), thisClass, method, field);
-		processTemplate(sb, thisClass, method, field, template[templateFileNameIndex], null);		
-		writeTargetFile(sb, new File(genDir + Utils.fileSeparator + filename));
-		generatedFileCounter ++;
-	}
-	
-	protected void processTemplate(StringBuffer sb, AmqpClass thisClass, AmqpMethod method,
-		AmqpField field, String templateFileName, AmqpVersion version)
-		throws InvocationTargetException, IllegalAccessException, AmqpTypeMappingException
-	{
-		try { processAllLists(sb, thisClass, method, version); }
-		catch (AmqpTemplateException e)
-		{
-			System.out.println("ERROR: " + templateFileName + ": " + e.getMessage());
-		}
-		try { processAllTokens(sb, thisClass, method, field, version); }
-		catch (AmqpTemplateException e)
-		{
-			System.out.println("ERROR: " + templateFileName + ": " + e.getMessage());
-		}
-	}
-
-	@Override
-	protected String processToken(String token, AmqpClass thisClass, AmqpMethod method, AmqpField field,
-		AmqpVersion version)
-	    throws AmqpTemplateException, AmqpTypeMappingException
-	{
-		if (token.compareTo("${GENERATOR}") == 0)
-			return generatorInfo;
-		if (token.compareTo("${CLASS}") == 0 && thisClass != null)
-			return thisClass.name;
-		if (token.compareTo("${CLASS_ID_INIT}") == 0 && thisClass != null)
-		{
-			if (version == null)
-				return String.valueOf(thisClass.indexMap.firstKey());
-			return getIndex(thisClass.indexMap, version);
-		}
-		if (token.compareTo("${METHOD}") == 0 && method != null)
-			return method.name;
-		if (token.compareTo("${METHOD_ID_INIT}") == 0 && method != null)
-		{
-			if (version == null)
-				return String.valueOf(method.indexMap.firstKey());
-			return getIndex(method.indexMap, version);
-		}
-		if (token.compareTo("${FIELD}") == 0 && field != null)
-			return field.name;
-		if (token.compareTo(versionNamespaceStartToken) == 0 && version != null)
-			return "namespace " + version.namespace() + cr + "{";
-		if (token.compareTo(versionNamespaceEndToken) == 0 && version != null)
-			return "} // namespace " + version.namespace();
+                    processTemplate(sb, thisClass, method, null, template.getName(), null);
+                }
+                templateProcessedFlag = true;
+            }
+        }
+        // Remove any remaining namespace tags
+        int nsTokenIndex = sb.indexOf(versionNamespaceStartToken);
+        while (nsTokenIndex > 0)
+        {
+            sb.delete(nsTokenIndex, nsTokenIndex + versionNamespaceStartToken.length());
+            nsTokenIndex = sb.indexOf(versionNamespaceStartToken);
+        }
+        nsTokenIndex = sb.indexOf(versionNamespaceEndToken);
+        while (nsTokenIndex > 0)
+        {
+            sb.delete(nsTokenIndex, nsTokenIndex + versionNamespaceEndToken.length());
+            nsTokenIndex = sb.indexOf(versionNamespaceEndToken);
+        }
+
+        if (!templateProcessedFlag)
+        {
+            processTemplate(sb, thisClass, method, null, template.getName(), null);
+        }
+        writeTargetFile(sb, new File(getOutputDirectory() + Utils.FILE_SEPARATOR + filename));
+        generatedFileCounter++;
+    }
+
+    @Override
+    protected void processTemplate(NamedTemplate template, AmqpClass thisClass, AmqpMethod method,
+                                   AmqpField field, AmqpVersion version)
+    {
+        StringBuffer sb = new StringBuffer(template.getTemplate());
+        String filename = prepareFilename(getTemplateFileName(sb), thisClass, method, field, version);
+        processTemplate(sb, thisClass, method, field, template.getName(), null);
+        writeTargetFile(sb, new File(getOutputDirectory() + Utils.FILE_SEPARATOR + filename));
+        generatedFileCounter++;
+    }
+
+    protected void processTemplate(StringBuffer sb, AmqpClass thisClass, AmqpMethod method,
+                                   AmqpField field, String templateFileName, AmqpVersion version)
+    {
+        try
+        {
+            processAllLists(sb, thisClass, method, version);
+        }
+        catch (AmqpTemplateException e)
+        {
+            System.out.println("ERROR: " + templateFileName + ": " + e.getMessage());
+        }
+        try
+        {
+            processAllTokens(sb, thisClass, method, field, version);
+        }
+        catch (AmqpTemplateException e)
+        {
+            System.out.println("ERROR: " + templateFileName + ": " + e.getMessage());
+        }
+    }
+
+    @Override
+    protected String processToken(String token, AmqpClass thisClass, AmqpMethod method, AmqpField field,
+                                  AmqpVersion version)
+    {
+        if (token.compareTo("${GENERATOR}") == 0)
+        {
+            return GENERATOR_INFO;
+        }
+        if (token.compareTo("${CLASS}") == 0 && thisClass != null)
+        {
+            return thisClass.getName();
+        }
+        if (token.compareTo("${CLASS_ID_INIT}") == 0 && thisClass != null)
+        {
+            if (version == null)
+            {
+                return String.valueOf(thisClass.getIndexMap().firstKey());
+            }
+            return getIndex(thisClass.getIndexMap(), version);
+        }
+        if (token.compareTo("${METHOD}") == 0 && method != null)
+        {
+            return method.getName();
+        }
+        if (token.compareTo("${METHOD_ID_INIT}") == 0 && method != null)
+        {
+            if (version == null)
+            {
+                return String.valueOf(method.getIndexMap().firstKey());
+            }
+            return getIndex(method.getIndexMap(), version);
+        }
+        if (token.compareTo("${FIELD}") == 0 && field != null)
+        {
+            return field.getName();
+        }
+        if (token.compareTo(versionNamespaceStartToken) == 0 && version != null)
+        {
+            return "namespace " + version.namespace() + CR + "{";
+        }
+        if (token.compareTo(versionNamespaceEndToken) == 0 && version != null)
+        {
+            return "} // namespace " + version.namespace();
+        }
         if (token.compareTo("${mb_constructor_with_initializers}") == 0)
+        {
             return generateConstructor(thisClass, method, version, 4, 4);
+        }
         if (token.compareTo("${mb_server_operation_invoke}") == 0)
+        {
             return generateServerOperationsInvoke(thisClass, method, version, 4, 4);
+        }
         if (token.compareTo("${mb_buffer_param}") == 0)
-            return method.fieldMap.size() > 0 ? " buffer" : "";
+        {
+            return method.getFieldMap().size() > 0 ? " buffer" : "";
+        }
         if (token.compareTo("${hv_latest_major}") == 0)
-            return String.valueOf(globalVersionSet.last().getMajor());
+        {
+            return String.valueOf(getVersionSet().last().getMajor());
+        }
         if (token.compareTo("${hv_latest_minor}") == 0)
-            return String.valueOf(globalVersionSet.last().getMinor());
-            
-		throw new AmqpTemplateException("Template token " + token + " unknown.");	
-	}
-	
-	@Override
-	protected void processClassList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
-		AmqpModel model)
-        throws AmqpTemplateException, AmqpTypeMappingException
-	{
-		String codeSnippet;
-		int lend = sb.indexOf(cr, listMarkerStartIndex) + 1; // Include cr at end of line
-		String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
-		int tokxStart = tline.indexOf('$');
-		String token = tline.substring(tokxStart).trim();
-		sb.delete(listMarkerStartIndex, lend);
-		
-		// ClientOperations.h
-		if (token.compareTo("${coh_method_handler_get_method}") == 0)
-		{
-			codeSnippet = generateOpsMethodHandlerGetMethods(model, false, 4);
-		}
-		else if (token.compareTo("${coh_inner_class}") == 0)
-		{
-			codeSnippet = generateOpsInnerClasses(model, false, 4, 4);
-		}
-		
-		// ServerOperations.h
-		else if (token.compareTo("${soh_method_handler_get_method}") == 0)
-		{
-			codeSnippet = generateOpsMethodHandlerGetMethods(model, true, 4);
-		}
-		else if (token.compareTo("${soh_inner_class}") == 0)
-		{
-			codeSnippet = generateOpsInnerClasses(model, true, 4, 4);
-		}
-		
-		// ClientProxy.h/cpp
-		else if (token.compareTo("${cph_inner_class_instance}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassInstances(model, false, 4);
-		}
-		else if (token.compareTo("${cph_inner_class_get_method}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassGetMethodDecls(model, false, 4);
-		}
-		else if (token.compareTo("${cph_inner_class_defn}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassDefinitions(model, false, 4, 4);
-		}
-		else if (token.compareTo("${cpc_constructor_initializer}") == 0)
-		{
-			codeSnippet = generateProxyConstructorInitializers(model, false, 4);
-		}
-		else if (token.compareTo("${cpc_inner_class_get_method}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassGetMethodImpls(model, false, 0, 4);
-		}
-		else if (token.compareTo("${cpc_inner_class_impl}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassImpl(model, false, 0, 4);
-		}
+        {
+            return String.valueOf(getVersionSet().last().getMinor());
+        }
+
+        throw new AmqpTemplateException("Template token " + token + " unknown.");
+    }
+
+    @Override
+    protected void processClassList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
+                                    AmqpModel model, AmqpVersion version)
+    {
+        String codeSnippet;
+        int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
+        String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
+        int tokxStart = tline.indexOf('$');
+        String token = tline.substring(tokxStart).trim();
+        sb.delete(listMarkerStartIndex, lend);
+
+        // ClientOperations.h
+        if (token.compareTo("${coh_method_handler_get_method}") == 0)
+        {
+            codeSnippet = generateOpsMethodHandlerGetMethods(model, false, 4);
+        }
+        else if (token.compareTo("${coh_inner_class}") == 0)
+        {
+            codeSnippet = generateOpsInnerClasses(model, false, 4, 4);
+        }
+
+        // ServerOperations.h
+        else if (token.compareTo("${soh_method_handler_get_method}") == 0)
+        {
+            codeSnippet = generateOpsMethodHandlerGetMethods(model, true, 4);
+        }
+        else if (token.compareTo("${soh_inner_class}") == 0)
+        {
+            codeSnippet = generateOpsInnerClasses(model, true, 4, 4);
+        }
+
+        // ClientProxy.h/cpp
+        else if (token.compareTo("${cph_inner_class_instance}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassInstances(model, false, 4);
+        }
+        else if (token.compareTo("${cph_inner_class_get_method}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassGetMethodDecls(model, false, 4);
+        }
+        else if (token.compareTo("${cph_inner_class_defn}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassDefinitions(model, false, 4, 4);
+        }
+        else if (token.compareTo("${cpc_constructor_initializer}") == 0)
+        {
+            codeSnippet = generateProxyConstructorInitializers(model, false, 4);
+        }
+        else if (token.compareTo("${cpc_inner_class_get_method}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassGetMethodImpls(model, false, 0, 4);
+        }
+        else if (token.compareTo("${cpc_inner_class_impl}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassImpl(model, false, 0, 4);
+        }
         else if (token.compareTo("${cph_handler_pointer_defn}") == 0)
         {
             codeSnippet = generateHandlerPointerDefinitions(model, false, 4);
@@ -423,32 +443,32 @@
         {
             codeSnippet = generateHandlerPointerGetMethods(model, false, 4);
         }
-		
-		// SerrverProxy.h/cpp
-		else if (token.compareTo("${sph_inner_class_instance}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassInstances(model, true, 4);
-		}
-		else if (token.compareTo("${sph_inner_class_get_method}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassGetMethodDecls(model, true, 4);
-		}
-		else if (token.compareTo("${sph_inner_class_defn}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassDefinitions(model, true, 4, 4);
-		}
-		else if (token.compareTo("${spc_constructor_initializer}") == 0)
-		{
-			codeSnippet = generateProxyConstructorInitializers(model, true, 4);
-		}
-		else if (token.compareTo("${spc_inner_class_get_method}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassGetMethodImpls(model, true, 0, 4);
-		}
-		else if (token.compareTo("${spc_inner_class_impl}") == 0)
-		{
-			codeSnippet = generateProxyInnerClassImpl(model, true, 0, 4);
-		}
+
+        // SerrverProxy.h/cpp
+        else if (token.compareTo("${sph_inner_class_instance}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassInstances(model, true, 4);
+        }
+        else if (token.compareTo("${sph_inner_class_get_method}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassGetMethodDecls(model, true, 4);
+        }
+        else if (token.compareTo("${sph_inner_class_defn}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassDefinitions(model, true, 4, 4);
+        }
+        else if (token.compareTo("${spc_constructor_initializer}") == 0)
+        {
+            codeSnippet = generateProxyConstructorInitializers(model, true, 4);
+        }
+        else if (token.compareTo("${spc_inner_class_get_method}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassGetMethodImpls(model, true, 0, 4);
+        }
+        else if (token.compareTo("${spc_inner_class_impl}") == 0)
+        {
+            codeSnippet = generateProxyInnerClassImpl(model, true, 0, 4);
+        }
         else if (token.compareTo("${sph_handler_pointer_defn}") == 0)
         {
             codeSnippet = generateHandlerPointerDefinitions(model, true, 4);
@@ -457,7 +477,7 @@
         {
             codeSnippet = generateHandlerPointerGetMethods(model, true, 4);
         }
-		
+
         // amqp_methods.h/cpp
         else if (token.compareTo("${mh_method_body_class_indlude}") == 0)
         {
@@ -471,26 +491,25 @@
         {
             codeSnippet = generateMethodBodyMapEntry(model, 4);
         }
-        
-		else // Oops!
-		{
-			throw new AmqpTemplateException("Template token \"" + token + "\" unknown.");
-		}
-		sb.insert(listMarkerStartIndex, codeSnippet);
-	}
-	
-	@Override
-	protected void processMethodList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
-		AmqpClass thisClass)
-        throws AmqpTemplateException, AmqpTypeMappingException
-	{
+
+        else // Oops!
+        {
+            throw new AmqpTemplateException("Template token \"" + token + "\" unknown.");
+        }
+        sb.insert(listMarkerStartIndex, codeSnippet);
+    }
+
+    @Override
+    protected void processMethodList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
+                                     AmqpClass thisClass)
+    {
         String codeSnippet;
-        int lend = sb.indexOf(cr, listMarkerStartIndex) + 1; // Include cr at end of line
+        int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
         String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
         int tokxStart = tline.indexOf('$');
         String token = tline.substring(tokxStart).trim();
         sb.delete(listMarkerStartIndex, lend);
-        
+
         if (token.compareTo("${cpc_method_body_include}") == 0)
         {
             codeSnippet = generateMethodBodyIncludes(thisClass, 0);
@@ -503,71 +522,68 @@
         {
             codeSnippet = generateMethodBodyIncludes(thisClass, 0);
         }
-       
+
+        else // Oops!
+        {
+            throw new AmqpTemplateException("Template token " + token + " unknown.");
+        }
+        sb.insert(listMarkerStartIndex, codeSnippet);
+    }
+
+    @Override
+    protected void processFieldList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
+                                    AmqpFieldMap fieldMap, AmqpVersion version)
+    {
+        String codeSnippet;
+        int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
+        String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
+        int tokxStart = tline.indexOf('$');
+        String token = tline.substring(tokxStart).trim();
+        sb.delete(listMarkerStartIndex, lend);
+
+        if (token.compareTo("${mb_field_declaration}") == 0)
+        {
+            codeSnippet = generateFieldDeclarations(fieldMap, version, 4);
+        }
+        else if (token.compareTo("${mb_field_get_method}") == 0)
+        {
+            codeSnippet = generateFieldGetMethods(fieldMap, version, 4);
+        }
+        else if (token.compareTo("${mb_field_print}") == 0)
+        {
+            codeSnippet = generatePrintMethodContents(fieldMap, version, 8);
+        }
+        else if (token.compareTo("${mb_body_size}") == 0)
+        {
+            codeSnippet = generateBodySizeMethodContents(fieldMap, version, 8);
+        }
+        else if (token.compareTo("${mb_encode}") == 0)
+        {
+            codeSnippet = generateEncodeMethodContents(fieldMap, version, 8);
+        }
+        else if (token.compareTo("${mb_decode}") == 0)
+        {
+            codeSnippet = generateDecodeMethodContents(fieldMap, version, 8);
+        }
+
         else // Oops!
         {
             throw new AmqpTemplateException("Template token " + token + " unknown.");
         }
         sb.insert(listMarkerStartIndex, codeSnippet);
-	}
-	
-	@Override
-	protected void processFieldList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
-		AmqpFieldMap fieldMap, AmqpVersion version)
-        throws AmqpTypeMappingException, AmqpTemplateException, IllegalAccessException,
-    	InvocationTargetException
-	{
-		String codeSnippet;
-		int lend = sb.indexOf(cr, listMarkerStartIndex) + 1; // Include cr at end of line
-		String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
-		int tokxStart = tline.indexOf('$');
-		String token = tline.substring(tokxStart).trim();
-		sb.delete(listMarkerStartIndex, lend);
-		
-		if (token.compareTo("${mb_field_declaration}") == 0)
-		{
-			codeSnippet = generateFieldDeclarations(fieldMap, version, 4);
-		}
-		else if (token.compareTo("${mb_field_get_method}") == 0)
-		{
-			codeSnippet = generateFieldGetMethods(fieldMap, version, 4);
-		}
-		else if (token.compareTo("${mb_field_print}") == 0)
-		{
-			codeSnippet = generatePrintMethodContents(fieldMap, version, 8);
-		}
-		else if (token.compareTo("${mb_body_size}") == 0)
-		{
-			codeSnippet = generateBodySizeMethodContents(fieldMap, version, 8);
-		}
-		else if (token.compareTo("${mb_encode}") == 0)
-		{
-			codeSnippet = generateEncodeMethodContents(fieldMap, version, 8);
-		}
-		else if (token.compareTo("${mb_decode}") == 0)
-		{
-			codeSnippet = generateDecodeMethodContents(fieldMap, version, 8);
-		}
-		
-		else // Oops!
-		{
-			throw new AmqpTemplateException("Template token " + token + " unknown.");
-		}
-		sb.insert(listMarkerStartIndex, codeSnippet);
-	}
+    }
 
     @Override
     protected void processConstantList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
-        AmqpConstantSet constantSet)
-        throws AmqpTemplateException, AmqpTypeMappingException
+                                       AmqpConstantSet constantSet)
     {
         String codeSnippet;
-        int lend = sb.indexOf(cr, listMarkerStartIndex) + 1; // Include cr at end of line
+        int lend = sb.indexOf(CR, listMarkerStartIndex) + 1; // Include cr at end of line
         String tline = sb.substring(listMarkerEndIndex, lend); // Line excluding line marker, including cr
         int tokxStart = tline.indexOf('$');
         String token = tline.substring(tokxStart).trim();
         sb.delete(listMarkerStartIndex, lend);
-        
+
         if (token.compareTo("${ch_get_value_method}") == 0)
         {
             codeSnippet = generateConstantGetMethods(constantSet, 4, 4);
@@ -579,36 +595,35 @@
         }
         sb.insert(listMarkerStartIndex, codeSnippet);
     }
-		
-	// === Protected and private helper functions unique to C++ implementation ===
-    
+
+    // === Protected and private helper functions unique to C++ implementation ===
+
     // Methods for generation of code snippets for AMQP_Constants.h file
-    
+
     protected String generateConstantGetMethods(AmqpConstantSet constantSet,
-        int indentSize, int tabSize)
-        throws AmqpTypeMappingException
+                                                int indentSize, int tabSize)
     {
         String indent = Utils.createSpaces(indentSize);
         StringBuffer sb = new StringBuffer();
-        for (AmqpConstant thisConstant : constantSet)
+        for (AmqpConstant thisConstant : constantSet.getContstants())
         {
-            if (thisConstant.isVersionConsistent(globalVersionSet))
+            if (thisConstant.isVersionConsistent(getVersionSet()))
             {
                 // return a constant
                 String value = thisConstant.firstKey();
-                sb.append(indent + "static const char* " + thisConstant.name + "() { return \"" +
-                    thisConstant.firstKey() + "\"; }" + cr);
+                sb.append(indent + "static const char* " + thisConstant.getName() + "() { return \"" +
+                          thisConstant.firstKey() + "\"; }" + CR);
                 if (Utils.containsOnlyDigits(value))
                 {
-                    sb.append(indent + "static int " + thisConstant.name + "AsInt() { return " +
-                        thisConstant.firstKey() + "; }" + cr);
+                    sb.append(indent + "static int " + thisConstant.getName() + "AsInt() { return " +
+                              thisConstant.firstKey() + "; }" + CR);
                 }
                 if (Utils.containsOnlyDigitsAndDecimal(value))
                 {
-                    sb.append(indent + "static double " + thisConstant.name + "AsDouble() { return (double)" +
-                        thisConstant.firstKey() + "; }" + cr);
+                    sb.append(indent + "static double " + thisConstant.getName() + "AsDouble() { return (double)" +
+                              thisConstant.firstKey() + "; }" + CR);
                 }
-                sb.append(cr);
+                sb.append(CR);
             }
             else
             {
@@ -616,559 +631,595 @@
                 sb.append(generateVersionDependentGet(thisConstant, "const char*", "", "\"", "\"", indentSize, tabSize));
                 sb.append(generateVersionDependentGet(thisConstant, "int", "AsInt", "", "", indentSize, tabSize));
                 sb.append(generateVersionDependentGet(thisConstant, "double", "AsDouble", "(double)", "", indentSize, tabSize));
-                sb.append(cr);
+                sb.append(CR);
             }
-        }        
-        return sb.toString();       
+        }
+        return sb.toString();
     }
-    
+
     protected String generateVersionDependentGet(AmqpConstant constant, String methodReturnType,
-        String methodNameSuffix, String returnPrefix, String returnPostfix, int indentSize, int tabSize)
-        throws AmqpTypeMappingException
+                                                 String methodNameSuffix, String returnPrefix, String returnPostfix, int indentSize, int tabSize)
     {
         String indent = Utils.createSpaces(indentSize);
         String tab = Utils.createSpaces(tabSize);
         StringBuffer sb = new StringBuffer();
-        sb.append(indent + methodReturnType + " " + constant.name + methodNameSuffix +
-            "() const" + cr);
-        sb.append(indent + "{" + cr);
+        sb.append(indent + methodReturnType + " " + constant.getName() + methodNameSuffix +
+                  "() const" + CR);
+        sb.append(indent + "{" + CR);
         boolean first = true;
         for (String thisValue : constant.keySet())
         {
             AmqpVersionSet versionSet = constant.get(thisValue);
             sb.append(indent + tab + (first ? "" : "else ") + "if (" + generateVersionCheck(versionSet) +
-                ")" + cr);
-            sb.append(indent + tab + "{" + cr);
+                      ")" + CR);
+            sb.append(indent + tab + "{" + CR);
             if (methodReturnType.compareTo("int") == 0 && !Utils.containsOnlyDigits(thisValue))
             {
-                sb.append(generateConstantDeclarationException(constant.name, methodReturnType,
-                    indentSize + (2*tabSize), tabSize));
+                sb.append(generateConstantDeclarationException(constant.getName(), methodReturnType,
+                                                               indentSize + (2 * tabSize), tabSize));
             }
             else if (methodReturnType.compareTo("double") == 0 && !Utils.containsOnlyDigitsAndDecimal(thisValue))
             {
-                sb.append(generateConstantDeclarationException(constant.name, methodReturnType,
-                    indentSize + (2*tabSize), tabSize));                            
+                sb.append(generateConstantDeclarationException(constant.getName(), methodReturnType,
+                                                               indentSize + (2 * tabSize), tabSize));
             }
             else
             {
-                sb.append(indent + tab + tab + "return " + returnPrefix + thisValue + returnPostfix + ";" + cr);
+                sb.append(indent + tab + tab + "return " + returnPrefix + thisValue + returnPostfix + ";" + CR);
             }
-            sb.append(indent + tab + "}" + cr);
+            sb.append(indent + tab + "}" + CR);
             first = false;
         }
-        sb.append(indent + tab + "else" + cr);
-        sb.append(indent + tab + "{" + cr);
-        sb.append(indent + tab + tab + "std::stringstream ss;" + cr);
-        sb.append(indent + tab + tab + "ss << \"Constant \\\"" + constant.name +
-            "\\\" is undefined for AMQP version \" <<" + cr);
-        sb.append(indent + tab + tab + tab + "version.toString() << \".\";" + cr);
-        sb.append(indent + tab + tab + "throw ProtocolVersionException(ss.str());" + cr);
-        sb.append(indent + tab + "}" + cr);
-        sb.append(indent + "}" + cr); 
-        return sb.toString();       
+        sb.append(indent + tab + "else" + CR);
+        sb.append(indent + tab + "{" + CR);
+        sb.append(indent + tab + tab + "std::stringstream ss;" + CR);
+        sb.append(indent + tab + tab + "ss << \"Constant \\\"" + constant.getName() +
+                  "\\\" is undefined for AMQP version \" <<" + CR);
+        sb.append(indent + tab + tab + tab + "version.toString() << \".\";" + CR);
+        sb.append(indent + tab + tab + "throw ProtocolVersionException(ss.str());" + CR);
+        sb.append(indent + tab + "}" + CR);
+        sb.append(indent + "}" + CR);
+        return sb.toString();
     }
-        
+
     protected String generateConstantDeclarationException(String name, String methodReturnType,
-        int indentSize, int tabSize)
+                                                          int indentSize, int tabSize)
     {
         String indent = Utils.createSpaces(indentSize);
         String tab = Utils.createSpaces(tabSize);
         StringBuffer sb = new StringBuffer();
-        sb.append(indent + "std::stringstream ss;" + cr);
+        sb.append(indent + "std::stringstream ss;" + CR);
         sb.append(indent + "ss << \"Constant \\\"" + name + "\\\" cannot be converted to type " +
-            methodReturnType + " for AMQP version \" <<" + cr);        
-        sb.append(indent + tab + "version.toString() << \".\";" + cr);        
-        sb.append(indent + "throw ProtocolVersionException(ss.str());" + cr);        
-        return sb.toString();       
-    }
-	
-	// Methods used for generation of code snippets for Server/ClientOperations class generation
-	
-	protected String generateOpsMethodHandlerGetMethods(AmqpModel model, boolean serverFlag, int indentSize)
-	{
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer();
-		for (String thisClassName : model.classMap.keySet())
-		{
-			AmqpClass thisClass = model.classMap.get(thisClassName);
-			// Only generate for this class if there is at least one method of the
-			// required chassis (server/client flag).
-			boolean chassisFoundFlag = false;
-			for (String thisMethodName : thisClass.methodMap.keySet())
-			{
-				AmqpMethod method = thisClass.methodMap.get(thisMethodName);
-				boolean clientChassisFlag = method.clientMethodFlagMap.isSet();
-				boolean serverChassisFlag = method.serverMethodFlagMap.isSet();
-				if ((serverFlag && serverChassisFlag) || (!serverFlag && clientChassisFlag))
-					chassisFoundFlag = true;
-			}
-			if (chassisFoundFlag)
-			{
-				sb.append(indent + "virtual AMQP_" + (serverFlag ? "Server" : "Client") + "Operations::" +
-				    thisClass.name + "Handler* get" + thisClass.name + "Handler() = 0;" + cr);
-			}
-		}
-		return sb.toString();
-	}
-	
-	protected String generateOpsInnerClasses(AmqpModel model, boolean serverFlag, int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		
-		String proxyClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
-		String indent = Utils.createSpaces(indentSize);
-		String tab = Utils.createSpaces(tabSize);
-		StringBuffer sb = new StringBuffer();
-		boolean first = true;
-		for (String thisClassName : model.classMap.keySet())
-		{
-			AmqpClass thisClass = model.classMap.get(thisClassName);
-			String handlerClassName = thisClass.name + "Handler";
-			if (!first)
-				sb.append(cr);
-			sb.append(indent + "// ==================== class " + handlerClassName +
-				" ====================" + cr);
-			sb.append(indent + "class " + handlerClassName);
-			if (thisClass.versionSet.size() != globalVersionSet.size())
-				sb.append(" // AMQP Version(s) " + thisClass.versionSet + cr);
-			else
-				sb.append(cr);
-			sb.append(indent + "{" + cr);
-			sb.append(indent + "private:" + cr);
-			sb.append(indent + tab + proxyClassName+ "* parent;" + cr);
-            sb.append(cr);
-            sb.append(indent + tab + "// Constructors and destructors" + cr);
-            sb.append(cr);
-			sb.append(indent + "protected:" + cr);
-            sb.append(indent + tab + handlerClassName + "() {}" + cr);
-			sb.append(indent + "public:" + cr);
-			sb.append(indent + tab + handlerClassName +
-				"(" + proxyClassName + "* _parent) {parent = _parent;}" + cr);
-			sb.append(indent + tab + "virtual ~" + handlerClassName + "() {}" + cr);
-			sb.append(cr);
-			sb.append(indent + tab + "// Protocol methods" + cr);
-			sb.append(cr);
-			sb.append(generateInnerClassMethods(thisClass, serverFlag, true, indentSize + tabSize, tabSize));
-			sb.append(indent + "}; // class " + handlerClassName + cr);
-			first = false;
-		}
-		return sb.toString();		
-	}
-	
-	protected String generateInnerClassMethods(AmqpClass thisClass, boolean serverFlag,
-		boolean abstractMethodFlag, int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer();
-        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + (abstractMethodFlag ? "Operations" : "Proxy");
-		boolean first = true;
-		for (String thisMethodName : thisClass.methodMap.keySet())
-		{
-			AmqpMethod method = thisClass.methodMap.get(thisMethodName);
-			boolean clientChassisFlag = method.clientMethodFlagMap.isSet();
-			boolean serverChassisFlag = method.serverMethodFlagMap.isSet();
-			if ((serverFlag && serverChassisFlag) || (!serverFlag && clientChassisFlag))
-			{
-				String methodName = parseForReservedWords(method.name, outerClassName + "." + thisClass.name);				
-				AmqpOverloadedParameterMap overloadededParameterMap =
-					method.getOverloadedParameterLists(thisClass.versionSet, this);
-				for (AmqpOrdinalFieldMap thisFieldMap : overloadededParameterMap.keySet())
-				{
-					AmqpVersionSet versionSet = overloadededParameterMap.get(thisFieldMap);
-					if (!first)
-						sb.append(cr);
-					sb.append(indent + "virtual void " + methodName + "( u_int16_t channel");
-					sb.append(generateMethodParameterList(thisFieldMap, indentSize + (5*tabSize), true, true, true));
-					sb.append(" )");
-					if (abstractMethodFlag)
-						sb.append(" = 0");
-					sb.append(";");
-					if (versionSet.size() != globalVersionSet.size())
-						sb.append(" // AMQP Version(s) " + versionSet);
-					sb.append(cr);
-					first = false;
-				}
-			}
-		}
-		return sb.toString();		
-	}
-	
-	// Methods used for generation of code snippets for Server/ClientProxy class generation
+                  methodReturnType + " for AMQP version \" <<" + CR);
+        sb.append(indent + tab + "version.toString() << \".\";" + CR);
+        sb.append(indent + "throw ProtocolVersionException(ss.str());" + CR);
+        return sb.toString();
+    }
 
-    protected String generateHandlerPointerDefinitions(AmqpModel model, boolean serverFlag,
-        int indentSize)
+    // Methods used for generation of code snippets for Server/ClientOperations class generation
+
+    protected String generateOpsMethodHandlerGetMethods(AmqpModel model, boolean serverFlag, int indentSize)
     {
         String indent = Utils.createSpaces(indentSize);
         StringBuffer sb = new StringBuffer();
-        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations";
-        for (String thisClassName : model.classMap.keySet())
+        for (String thisClassName : model.getClassMap().keySet())
         {
-            AmqpClass thisClass = model.classMap.get(thisClassName);
-            sb.append(indent + outerClassName + "::" + thisClass.name + "Handler* " +
-                thisClass.name + "HandlerPtr;" + cr);
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            // Only generate for this class if there is at least one method of the
+            // required chassis (server/client flag).
+            boolean chassisFoundFlag = false;
+            for (String thisMethodName : thisClass.getMethodMap().keySet())
+            {
+                AmqpMethod method = thisClass.getMethodMap().get(thisMethodName);
+                boolean clientChassisFlag = method.getClientMethodFlagMap().isSet();
+                boolean serverChassisFlag = method.getServerMethodFlagMap().isSet();
+                if ((serverFlag && serverChassisFlag) || (!serverFlag && clientChassisFlag))
+                {
+                    chassisFoundFlag = true;
+                }
+            }
+            if (chassisFoundFlag)
+            {
+                sb.append(indent + "virtual AMQP_" + (serverFlag ? "Server" : "Client") + "Operations::" +
+                          thisClass.getName() + "Handler* get" + thisClass.getName() + "Handler() = 0;" + CR);
+            }
         }
         return sb.toString();
     }
-    
-    protected String generateHandlerPointerGetMethods(AmqpModel model, boolean serverFlag,
-        int indentSize)
+
+    protected String generateOpsInnerClasses(AmqpModel model, boolean serverFlag, int indentSize, int tabSize)
     {
+
+        String proxyClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
         String indent = Utils.createSpaces(indentSize);
+        String tab = Utils.createSpaces(tabSize);
         StringBuffer sb = new StringBuffer();
-        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations";
-        for (String thisClassName : model.classMap.keySet())
+        boolean first = true;
+        for (String thisClassName : model.getClassMap().keySet())
         {
-            AmqpClass thisClass = model.classMap.get(thisClassName);
-            sb.append(indent + "virtual inline " + outerClassName + "::" + thisClass.name + "Handler* get" +
-                thisClass.name + "Handler() { return &" + Utils.firstLower(thisClass.name) + ";}" + cr);
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            String handlerClassName = thisClass.getName() + "Handler";
+            if (!first)
+            {
+                sb.append(CR);
+            }
+            sb.append(indent + "// ==================== class " + handlerClassName +
+                      " ====================" + CR);
+            sb.append(indent + "class " + handlerClassName);
+            if (thisClass.getVersionSet().size() != getVersionSet().size())
+            {
+                sb.append(" // AMQP Version(s) " + thisClass.getVersionSet() + CR);
+            }
+            else
+            {
+                sb.append(CR);
+            }
+            sb.append(indent + "{" + CR);
+            sb.append(indent + "private:" + CR);
+            sb.append(indent + tab + proxyClassName + "* parent;" + CR);
+            sb.append(CR);
+            sb.append(indent + tab + "// Constructors and destructors" + CR);
+            sb.append(CR);
+            sb.append(indent + "protected:" + CR);
+            sb.append(indent + tab + handlerClassName + "() {}" + CR);
+            sb.append(indent + "public:" + CR);
+            sb.append(indent + tab + handlerClassName +
+                      "(" + proxyClassName + "* _parent) {parent = _parent;}" + CR);
+            sb.append(indent + tab + "virtual ~" + handlerClassName + "() {}" + CR);
+            sb.append(CR);
+            sb.append(indent + tab + "// Protocol methods" + CR);
+            sb.append(CR);
+            sb.append(generateInnerClassMethods(thisClass, serverFlag, true, indentSize + tabSize, tabSize));
+            sb.append(indent + "}; // class " + handlerClassName + CR);
+            first = false;
         }
         return sb.toString();
-   }
-    	
-	protected String generateProxyInnerClassInstances(AmqpModel model, boolean serverFlag,
-		int indentSize)
-	{
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer();
-        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
-        for (String thisClassName : model.classMap.keySet())
-		{
-			AmqpClass thisClass = model.classMap.get(thisClassName);
-			String instanceName = parseForReservedWords(Utils.firstLower(thisClass.name), outerClassName);
-			String className = parseForReservedWords(thisClass.name, null);
-			sb.append(indent + className + " " + instanceName + ";");
-			if (thisClass.versionSet.size() != globalVersionSet.size())
-				sb.append(" // AMQP Version(s) " + thisClass.versionSet + cr);
-			else
-				sb.append(cr);
-		}
-		return sb.toString();
-	}
-	
-	protected String generateProxyInnerClassGetMethodDecls(AmqpModel model, boolean serverFlag,
-		int indentSize)
-	{
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer();
-        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
-        for (String thisClassName : model.classMap.keySet())
-		{
-			AmqpClass thisClass = model.classMap.get(thisClassName);
-			String className = parseForReservedWords(thisClass.name, outerClassName);
-			sb.append(indent + className + "& get" + className + "();");
-			if (thisClass.versionSet.size() != globalVersionSet.size())
-				sb.append(" // AMQP Version(s) " + thisClass.versionSet + cr);
-			else
-				sb.append(cr);
-		}
-		return sb.toString();
-	}
-	
-	protected String generateProxyInnerClassDefinitions(AmqpModel model, boolean serverFlag,
-		int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		String proxyClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
-		String indent = Utils.createSpaces(indentSize);
-		String tab = Utils.createSpaces(tabSize);
-		StringBuffer sb = new StringBuffer();
-		boolean first = true;
-        for (String thisClassName : model.classMap.keySet())
-		{
-			AmqpClass thisClass = model.classMap.get(thisClassName);
-			String className = thisClass.name;
-			String superclassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations::" +
-				thisClass.name + "Handler";
-			if (!first)
-				sb.append(cr);
-			sb.append(indent + "// ==================== class " + className +
-				" ====================" + cr);
-			sb.append(indent + "class " + className + " : virtual public " + superclassName);
-			if (thisClass.versionSet.size() != globalVersionSet.size())
-				sb.append(" // AMQP Version(s) " + thisClass.versionSet + cr);
-			else
-				sb.append(cr);
-			sb.append(indent + "{" + cr);
-			sb.append(indent + "private:" + cr);
-            sb.append(indent + tab + "OutputHandler* out;" + cr);
-			sb.append(indent + tab + proxyClassName + "* parent;" + cr);
-			sb.append(cr);
-			sb.append(indent + "public:" + cr);
-			sb.append(indent + tab + "// Constructors and destructors" + cr);
-			sb.append(cr);
-			sb.append(indent + tab + className + "(OutputHandler* out, " + proxyClassName + "* _parent) : " + cr);
-			sb.append(indent + tab + tab + "out(out) {parent = _parent;}" + cr);
-			sb.append(indent + tab + "virtual ~" + className + "() {}" + cr);
-			sb.append(cr);
-			sb.append(indent + tab + "// Protocol methods" + cr);
-			sb.append(cr);
-			sb.append(generateInnerClassMethods(thisClass, serverFlag, false, indentSize + tabSize, tabSize));
-			sb.append(indent + "}; // class " + className + cr);
-			first = false;
-		}
-		return sb.toString();
-	}
-	
-	protected String generateProxyConstructorInitializers(AmqpModel model, boolean serverFlag,
-		int indentSize)
-	{
-        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
-        String superclassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations";
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer(indent + superclassName + "(major, minor)," + cr);
-		sb.append(indent + "version(major, minor)," + cr);
-        sb.append(indent + "out(out)");
-		Iterator<String> cItr = model.classMap.keySet().iterator();
-		while (cItr.hasNext())
-		{
-			AmqpClass thisClass = model.classMap.get(cItr.next());
-			String instanceName = parseForReservedWords(Utils.firstLower(thisClass.name), outerClassName);
-			sb.append("," + cr);
-			sb.append(indent + instanceName + "(out, this)");
-			if (!cItr.hasNext())
-				sb.append(cr);
-		}
-		return sb.toString();	
-	}
-	
-	protected String generateProxyInnerClassGetMethodImpls(AmqpModel model, boolean serverFlag,
-		int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		String indent = Utils.createSpaces(indentSize);
-		String tab = Utils.createSpaces(tabSize);
-		StringBuffer sb = new StringBuffer();
-		String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
-		Iterator<String> cItr = model.classMap.keySet().iterator();
-		while (cItr.hasNext())
-		{
-			AmqpClass thisClass = model.classMap.get(cItr.next());
-			String className = thisClass.name;
-			String instanceName = parseForReservedWords(Utils.firstLower(thisClass.name), outerClassName);
-			sb.append(indent + outerClassName + "::" + className + "& " +
-				outerClassName + "::get" + className + "()" + cr);
-			sb.append(indent + "{" + cr);
-			if (thisClass.versionSet.size() != globalVersionSet.size())
-			{
-				sb.append(indent + tab + "if (!" + generateVersionCheck(thisClass.versionSet) + ")" + cr);
-				sb.append(indent + tab + tab + "throw new ProtocolVersionException();" + cr);
-			}
-			sb.append(indent + tab + "return " + instanceName + ";" + cr);
-			sb.append(indent + "}" + cr);
-			if (cItr.hasNext())
-				sb.append(cr);
-		}
-		return sb.toString();
-	}
-	
-	protected String generateProxyInnerClassImpl(AmqpModel model, boolean serverFlag,
-		int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer();
-		boolean firstClassFlag = true;
-        for (String thisClassName : model.classMap.keySet())
-		{
-			AmqpClass thisClass = model.classMap.get(thisClassName);
-			String className = thisClass.name;
-			if (!firstClassFlag)
-				sb.append(cr);
-			sb.append(indent + "// ==================== class " + className +
-				" ====================" + cr);
-			sb.append(generateInnerClassMethodImpls(thisClass, serverFlag, indentSize, tabSize));
-			firstClassFlag = false;
-		}
-		return sb.toString();
-	}
-	
-	protected String generateInnerClassMethodImpls(AmqpClass thisClass, boolean serverFlag,
-		int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer();
-		String outerclassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
-		boolean first = true;
-		for (String thisMethodName : thisClass.methodMap.keySet())
-		{
-			AmqpMethod method = thisClass.methodMap.get(thisMethodName);
-			String methodBodyClassName = thisClass.name + Utils.firstUpper(method.name) + "Body";
-			boolean clientChassisFlag = method.clientMethodFlagMap.isSet();
-			boolean serverChassisFlag = method.serverMethodFlagMap.isSet();
-            boolean versionConsistentFlag = method.isVersionConsistent(globalVersionSet);
-			if ((serverFlag && serverChassisFlag) || (!serverFlag && clientChassisFlag))
-			{
-				String methodName = parseForReservedWords(method.name, outerclassName + "." + thisClass.name);
-				AmqpOverloadedParameterMap overloadededParameterMap =
-					method.getOverloadedParameterLists(thisClass.versionSet, this);
-				for (AmqpOrdinalFieldMap thisFieldMap : overloadededParameterMap.keySet())
-				{
-					AmqpVersionSet versionSet = overloadededParameterMap.get(thisFieldMap);
-					if (!first)
-						sb.append(cr);
-					sb.append(indent + "void " + outerclassName + "::" + thisClass.name + "::" +
-                        methodName + "( u_int16_t channel");
-					sb.append(generateMethodParameterList(thisFieldMap, indentSize + (5*tabSize), true, true, true));
-					sb.append(" )");
-					if (versionSet.size() != globalVersionSet.size())
-						sb.append(" // AMQP Version(s) " + versionSet);
-					sb.append(cr);
-					sb.append(indent + "{" + cr);
-					sb.append(generateMethodBodyCallContext(thisFieldMap, outerclassName, methodBodyClassName,
-                        versionConsistentFlag, versionSet, indentSize + tabSize, tabSize));
-					sb.append(indent + "}" + cr);
-					sb.append(cr);
-					first = false;
-				}
-			}
-		}
-		return sb.toString();		
-	}
-	
-	protected String generateMethodBodyCallContext(AmqpOrdinalFieldMap fieldMap, String outerclassName,
-		String methodBodyClassName, boolean versionConsistentFlag, AmqpVersionSet versionSet,
-        int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		String indent = Utils.createSpaces(indentSize);
-		String tab = Utils.createSpaces(tabSize);
-		StringBuffer sb = new StringBuffer();
-		if (versionConsistentFlag)
-		{
-			sb.append(generateMethodBodyCall(fieldMap, methodBodyClassName, null, indentSize, tabSize));
-		}
-		else
-		{
-			boolean firstOverloadedMethodFlag = true;
-			for (AmqpVersion thisVersion : versionSet)
-			{
-				sb.append(indent);
-				if (!firstOverloadedMethodFlag)
-					sb.append("else ");
-				sb.append("if (" + generateVersionCheck(thisVersion) + ")" + cr);
-				sb.append(indent + "{" + cr);
-				sb.append(generateMethodBodyCall(fieldMap, methodBodyClassName, thisVersion,
-					indentSize + tabSize, tabSize));
-				sb.append(indent + "}" + cr);
-				firstOverloadedMethodFlag = false;
-			}
-			sb.append(indent + "else" + cr);
-			sb.append(indent + "{" + cr);
-			sb.append(indent + tab + "std::stringstream ss;" + cr);
-			sb.append(indent + tab + "ss << \"Call to " + outerclassName + "::" + methodBodyClassName +
-				"(u_int16_t" + generateMethodParameterList(fieldMap, 0, true, true, false) + ")\"" + cr);
-			sb.append(indent + tab + tab + "<< \" is invalid for AMQP version \" << version.toString() << \".\";" + cr);
-			sb.append(indent + tab + "throw new ProtocolVersionException(ss.str());" + cr);
-			sb.append(indent + "}" + cr);
-		}
-		return sb.toString();		
-	}
-	
-	protected String generateMethodBodyCall(AmqpOrdinalFieldMap fieldMap, String methodBodyClassName,
-		AmqpVersion version, int indentSize, int tabSize)
-		throws AmqpTypeMappingException
-	{
-		String indent = Utils.createSpaces(indentSize);
-		String tab = Utils.createSpaces(tabSize);
-		String namespace = version != null ? version.namespace() + "::" : "";
-		StringBuffer sb = new StringBuffer(indent + "out->send( new AMQFrame(parent->getProtocolVersion(), channel," + cr);
-		sb.append(indent + tab + "new " + namespace + methodBodyClassName + "( parent->getProtocolVersion()");
-		sb.append(generateMethodParameterList(fieldMap, indentSize + (5*tabSize), true, false, true));
-		sb.append(" )));" + cr);	
-		return sb.toString();		
-	}
-    
-    protected String generateMethodBodyIncludes(AmqpClass thisClass, int indentSize)
+    }
+
+    protected String generateInnerClassMethods(AmqpClass thisClass, boolean serverFlag,
+                                               boolean abstractMethodFlag, int indentSize, int tabSize)
     {
+        String indent = Utils.createSpaces(indentSize);
         StringBuffer sb = new StringBuffer();
-        if (thisClass != null)
-        {
-            sb.append(generateClassMethodBodyInclude(thisClass, indentSize));
-        }
-        else
+        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + (abstractMethodFlag ? "Operations"
+                                                                                : "Proxy");
+        boolean first = true;
+        for (String thisMethodName : thisClass.getMethodMap().keySet())
         {
-        	for (String thisClassName : model.classMap.keySet())
+            AmqpMethod method = thisClass.getMethodMap().get(thisMethodName);
+            boolean clientChassisFlag = method.getClientMethodFlagMap().isSet();
+            boolean serverChassisFlag = method.getServerMethodFlagMap().isSet();
+            if ((serverFlag && serverChassisFlag) || (!serverFlag && clientChassisFlag))
             {
-                thisClass = model.classMap.get(thisClassName);
-                sb.append(generateClassMethodBodyInclude(thisClass, indentSize));
-           }
+                String methodName = parseForReservedWords(method.getName(), outerClassName + "." + thisClass.getName());
+                AmqpOverloadedParameterMap overloadededParameterMap =
+                        method.getOverloadedParameterLists(thisClass.getVersionSet(), this);
+                for (AmqpOrdinalFieldMap thisFieldMap : overloadededParameterMap.keySet())
+                {
+                    AmqpVersionSet versionSet = overloadededParameterMap.get(thisFieldMap);
+                    if (!first)
+                    {
+                        sb.append(CR);
+                    }
+                    sb.append(indent + "virtual void " + methodName + "( u_int16_t channel");
+                    sb.append(generateMethodParameterList(thisFieldMap, indentSize + (5 * tabSize), true, true, true));
+                    sb.append(" )");
+                    if (abstractMethodFlag)
+                    {
+                        sb.append(" = 0");
+                    }
+                    sb.append(";");
+                    if (versionSet.size() != getVersionSet().size())
+                    {
+                        sb.append(" // AMQP Version(s) " + versionSet);
+                    }
+                    sb.append(CR);
+                    first = false;
+                }
+            }
+        }
+        return sb.toString();
+    }
+
+    // Methods used for generation of code snippets for Server/ClientProxy class generation
+
+    protected String generateHandlerPointerDefinitions(AmqpModel model, boolean serverFlag,
+                                                       int indentSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        StringBuffer sb = new StringBuffer();
+        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations";
+        for (String thisClassName : model.getClassMap().keySet())
+        {
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            sb.append(indent + outerClassName + "::" + thisClass.getName() + "Handler* " +
+                      thisClass.getName() + "HandlerPtr;" + CR);
+        }
+        return sb.toString();
+    }
+
+    protected String generateHandlerPointerGetMethods(AmqpModel model, boolean serverFlag,
+                                                      int indentSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        StringBuffer sb = new StringBuffer();
+        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations";
+        for (String thisClassName : model.getClassMap().keySet())
+        {
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            sb.append(indent + "virtual inline " + outerClassName + "::" + thisClass.getName() + "Handler* get" +
+                      thisClass.getName() + "Handler() { return &" + Utils.firstLower(thisClass.getName()) + ";}" + CR);
+        }
+        return sb.toString();
+    }
+
+    protected String generateProxyInnerClassInstances(AmqpModel model, boolean serverFlag,
+                                                      int indentSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        StringBuffer sb = new StringBuffer();
+        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
+        for (String thisClassName : model.getClassMap().keySet())
+        {
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            String instanceName = parseForReservedWords(Utils.firstLower(thisClass.getName()), outerClassName);
+            String className = parseForReservedWords(thisClass.getName(), null);
+            sb.append(indent + className + " " + instanceName + ";");
+            if (thisClass.getVersionSet().size() != getVersionSet().size())
+            {
+                sb.append(" // AMQP Version(s) " + thisClass.getVersionSet() + CR);
+            }
+            else
+            {
+                sb.append(CR);
+            }
+        }
+        return sb.toString();
+    }
+
+    protected String generateProxyInnerClassGetMethodDecls(AmqpModel model, boolean serverFlag,
+                                                           int indentSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        StringBuffer sb = new StringBuffer();
+        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
+        for (String thisClassName : model.getClassMap().keySet())
+        {
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            String className = parseForReservedWords(thisClass.getName(), outerClassName);
+            sb.append(indent + className + "& get" + className + "();");
+            if (thisClass.getVersionSet().size() != getVersionSet().size())
+            {
+                sb.append(" // AMQP Version(s) " + thisClass.getVersionSet() + CR);
+            }
+            else
+            {
+                sb.append(CR);
+            }
+        }
+        return sb.toString();
+    }
+
+    protected String generateProxyInnerClassDefinitions(AmqpModel model, boolean serverFlag,
+                                                        int indentSize, int tabSize)
+    {
+        String proxyClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
+        String indent = Utils.createSpaces(indentSize);
+        String tab = Utils.createSpaces(tabSize);
+        StringBuffer sb = new StringBuffer();
+        boolean first = true;
+        for (String thisClassName : model.getClassMap().keySet())
+        {
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            String className = thisClass.getName();
+            String superclassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations::" +
+                                    thisClass.getName() + "Handler";
+            if (!first)
+            {
+                sb.append(CR);
+            }
+            sb.append(indent + "// ==================== class " + className +
+                      " ====================" + CR);
+            sb.append(indent + "class " + className + " : virtual public " + superclassName);
+            if (thisClass.getVersionSet().size() != getVersionSet().size())
+            {
+                sb.append(" // AMQP Version(s) " + thisClass.getVersionSet() + CR);
+            }
+            else
+            {
+                sb.append(CR);
+            }
+            sb.append(indent + "{" + CR);
+            sb.append(indent + "private:" + CR);
+            sb.append(indent + tab + "OutputHandler* out;" + CR);
+            sb.append(indent + tab + proxyClassName + "* parent;" + CR);
+            sb.append(CR);
+            sb.append(indent + "public:" + CR);
+            sb.append(indent + tab + "// Constructors and destructors" + CR);
+            sb.append(CR);
+            sb.append(indent + tab + className + "(OutputHandler* out, " + proxyClassName + "* _parent) : " + CR);
+            sb.append(indent + tab + tab + "out(out) {parent = _parent;}" + CR);
+            sb.append(indent + tab + "virtual ~" + className + "() {}" + CR);
+            sb.append(CR);
+            sb.append(indent + tab + "// Protocol methods" + CR);
+            sb.append(CR);
+            sb.append(generateInnerClassMethods(thisClass, serverFlag, false, indentSize + tabSize, tabSize));
+            sb.append(indent + "}; // class " + className + CR);
+            first = false;
+        }
+        return sb.toString();
+    }
+
+    protected String generateProxyConstructorInitializers(AmqpModel model, boolean serverFlag,
+                                                          int indentSize)
+    {
+        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
+        String superclassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations";
+        String indent = Utils.createSpaces(indentSize);
+        StringBuffer sb = new StringBuffer(indent + superclassName + "(major, minor)," + CR);
+        sb.append(indent + "version(major, minor)," + CR);
+        sb.append(indent + "out(out)");
+        Iterator<String> cItr = model.getClassMap().keySet().iterator();
+        while (cItr.hasNext())
+        {
+            AmqpClass thisClass = model.getClassMap().get(cItr.next());
+            String instanceName = parseForReservedWords(Utils.firstLower(thisClass.getName()), outerClassName);
+            sb.append("," + CR);
+            sb.append(indent + instanceName + "(out, this)");
+            if (!cItr.hasNext())
+            {
+                sb.append(CR);
+            }
+        }
+        return sb.toString();
+    }
+
+    protected String generateProxyInnerClassGetMethodImpls(AmqpModel model, boolean serverFlag,
+                                                           int indentSize, int tabSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        String tab = Utils.createSpaces(tabSize);
+        StringBuffer sb = new StringBuffer();
+        String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
+        Iterator<String> cItr = model.getClassMap().keySet().iterator();
+        while (cItr.hasNext())
+        {
+            AmqpClass thisClass = model.getClassMap().get(cItr.next());
+            String className = thisClass.getName();
+            String instanceName = parseForReservedWords(Utils.firstLower(thisClass.getName()), outerClassName);
+            sb.append(indent + outerClassName + "::" + className + "& " +
+                      outerClassName + "::get" + className + "()" + CR);
+            sb.append(indent + "{" + CR);
+            if (thisClass.getVersionSet().size() != getVersionSet().size())
+            {
+                sb.append(indent + tab + "if (!" + generateVersionCheck(thisClass.getVersionSet()) + ")" + CR);
+                sb.append(indent + tab + tab + "throw new ProtocolVersionException();" + CR);
+            }
+            sb.append(indent + tab + "return " + instanceName + ";" + CR);
+            sb.append(indent + "}" + CR);
+            if (cItr.hasNext())
+            {
+                sb.append(CR);
+            }
+        }
+        return sb.toString();
+    }
+
+    protected String generateProxyInnerClassImpl(AmqpModel model, boolean serverFlag,
+                                                 int indentSize, int tabSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        StringBuffer sb = new StringBuffer();
+        boolean firstClassFlag = true;
+        for (String thisClassName : model.getClassMap().keySet())
+        {
+            AmqpClass thisClass = model.getClassMap().get(thisClassName);
+            String className = thisClass.getName();
+            if (!firstClassFlag)
+            {
+                sb.append(CR);
+            }
+            sb.append(indent + "// ==================== class " + className +
+                      " ====================" + CR);
+            sb.append(generateInnerClassMethodImpls(thisClass, serverFlag, indentSize, tabSize));
+            firstClassFlag = false;
+        }
+        return sb.toString();
+    }
+
+    protected String generateInnerClassMethodImpls(AmqpClass thisClass, boolean serverFlag,
+                                                   int indentSize, int tabSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        StringBuffer sb = new StringBuffer();
+        String outerclassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
+        boolean first = true;
+        for (String thisMethodName : thisClass.getMethodMap().keySet())
+        {
+            AmqpMethod method = thisClass.getMethodMap().get(thisMethodName);
+            String methodBodyClassName = thisClass.getName() + Utils.firstUpper(method.getName()) + "Body";
+            boolean clientChassisFlag = method.getClientMethodFlagMap().isSet();
+            boolean serverChassisFlag = method.getServerMethodFlagMap().isSet();
+            boolean versionConsistentFlag = method.isVersionConsistent(getVersionSet());
+            if ((serverFlag && serverChassisFlag) || (!serverFlag && clientChassisFlag))
+            {
+                String methodName = parseForReservedWords(method.getName(), outerclassName + "." + thisClass.getName());
+                AmqpOverloadedParameterMap overloadededParameterMap =
+                        method.getOverloadedParameterLists(thisClass.getVersionSet(), this);
+                for (AmqpOrdinalFieldMap thisFieldMap : overloadededParameterMap.keySet())
+                {
+                    AmqpVersionSet versionSet = overloadededParameterMap.get(thisFieldMap);
+                    if (!first)
+                    {
+                        sb.append(CR);
+                    }
+                    sb.append(indent + "void " + outerclassName + "::" + thisClass.getName() + "::" +
+                              methodName + "( u_int16_t channel");
+                    sb.append(generateMethodParameterList(thisFieldMap, indentSize + (5 * tabSize), true, true, true));
+                    sb.append(" )");
+                    if (versionSet.size() != getVersionSet().size())
+                    {
+                        sb.append(" // AMQP Version(s) " + versionSet);
+                    }
+                    sb.append(CR);
+                    sb.append(indent + "{" + CR);
+                    sb.append(generateMethodBodyCallContext(thisFieldMap, outerclassName, methodBodyClassName,
+                                                            versionConsistentFlag, versionSet, indentSize + tabSize, tabSize));
+                    sb.append(indent + "}" + CR);
+                    sb.append(CR);
+                    first = false;
+                }
+            }
+        }
+        return sb.toString();
+    }
+
+    protected String generateMethodBodyCallContext(AmqpOrdinalFieldMap fieldMap, String outerclassName,
+                                                   String methodBodyClassName, boolean versionConsistentFlag, AmqpVersionSet versionSet,
+                                                   int indentSize, int tabSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        String tab = Utils.createSpaces(tabSize);
+        StringBuffer sb = new StringBuffer();
+        if (versionConsistentFlag)
+        {
+            sb.append(generateMethodBodyCall(fieldMap, methodBodyClassName, null, indentSize, tabSize));
+        }
+        else
+        {
+            boolean firstOverloadedMethodFlag = true;
+            for (AmqpVersion thisVersion : versionSet)
+            {
+                sb.append(indent);
+                if (!firstOverloadedMethodFlag)
+                {
+                    sb.append("else ");
+                }
+                sb.append("if (" + generateVersionCheck(thisVersion) + ")" + CR);
+                sb.append(indent + "{" + CR);
+                sb.append(generateMethodBodyCall(fieldMap, methodBodyClassName, thisVersion,
+                                                 indentSize + tabSize, tabSize));
+                sb.append(indent + "}" + CR);
+                firstOverloadedMethodFlag = false;
+            }
+            sb.append(indent + "else" + CR);
+            sb.append(indent + "{" + CR);
+            sb.append(indent + tab + "std::stringstream ss;" + CR);
+            sb.append(indent + tab + "ss << \"Call to " + outerclassName + "::" + methodBodyClassName +
+                      "(u_int16_t" + generateMethodParameterList(fieldMap, 0, true, true, false) + ")\"" + CR);
+            sb.append(indent + tab + tab + "<< \" is invalid for AMQP version \" << version.toString() << \".\";" + CR);
+            sb.append(indent + tab + "throw new ProtocolVersionException(ss.str());" + CR);
+            sb.append(indent + "}" + CR);
+        }
+        return sb.toString();
+    }
+
+    protected String generateMethodBodyCall(AmqpOrdinalFieldMap fieldMap, String methodBodyClassName,
+                                            AmqpVersion version, int indentSize, int tabSize)
+    {
+        String indent = Utils.createSpaces(indentSize);
+        String tab = Utils.createSpaces(tabSize);
+        String namespace = version != null ? version.namespace() + "::" : "";
+        StringBuffer sb = new StringBuffer(indent + "out->send( new AMQFrame(parent->getProtocolVersion(), channel," + CR);
+        sb.append(indent + tab + "new " + namespace + methodBodyClassName + "( parent->getProtocolVersion()");
+        sb.append(generateMethodParameterList(fieldMap, indentSize + (5 * tabSize), true, false, true));
+        sb.append(" )));" + CR);
+        return sb.toString();
+    }
+
+    protected String generateMethodBodyIncludes(AmqpClass thisClass, int indentSize)
+    {
+        StringBuffer sb = new StringBuffer();
+        if (thisClass != null)
+        {
+            sb.append(generateClassMethodBodyInclude(thisClass, indentSize));
+        }
+        else
+        {
+            for (String thisClassName : getModel().getClassMap().keySet())
+            {
+                thisClass = getModel().getClassMap().get(thisClassName);
+                sb.append(generateClassMethodBodyInclude(thisClass, indentSize));
+            }
         }
-        return sb.toString();       
+        return sb.toString();
     }
-    
+
     protected String generateClassMethodBodyInclude(AmqpClass thisClass, int indentSize)
     {
         StringBuffer sb = new StringBuffer();
         String indent = Utils.createSpaces(indentSize);
-        for (String thisMethodName : thisClass.methodMap.keySet())
+        for (String thisMethodName : thisClass.getMethodMap().keySet())
+        {
+            AmqpMethod method = thisClass.getMethodMap().get(thisMethodName);
+            sb.append(indent + "#include <" + thisClass.getName() +
+                      Utils.firstUpper(method.getName()) + "Body.h>" + CR);
+        }
+        return sb.toString();
+    }
+
+    // Methods used for generation of code snippets for MethodBody class generation
+
+    protected String getIndex(AmqpOrdinalVersionMap indexMap, AmqpVersion version)
+    {
+        for (Integer thisIndex : indexMap.keySet())
         {
-            AmqpMethod method = thisClass.methodMap.get(thisMethodName);
-            sb.append(indent + "#include <" + thisClass.name +
-                Utils.firstUpper(method.name) + "Body.h>" + cr);
-        }
-        return sb.toString();       
-    }
-    
-	// Methods used for generation of code snippets for MethodBody class generation
-
-	protected String getIndex(AmqpOrdinalVersionMap indexMap, AmqpVersion version)
-		throws AmqpTemplateException
-	{
-		for (Integer thisIndex : indexMap.keySet())
-		{
-			AmqpVersionSet versionSet = indexMap.get(thisIndex);
-			if (versionSet.contains(version))
-				return String.valueOf(thisIndex);			
-		}
-		throw new AmqpTemplateException("Unable to find index for version " + version); 
-	}
-	
-	protected String generateFieldDeclarations(AmqpFieldMap fieldMap, AmqpVersion version, int indentSize)
-		throws AmqpTypeMappingException
-	{
-		String indent = Utils.createSpaces(indentSize);
-		StringBuffer sb = new StringBuffer();
-        
+            AmqpVersionSet versionSet = indexMap.get(thisIndex);
+            if (versionSet.contains(version))
+            {

[... 947 lines stripped ...]