summaryrefslogtreecommitdiff
path: root/gentools/org
diff options
context:
space:
mode:
authorKim van der Riet <kpvdr@apache.org>2006-11-21 19:44:40 +0000
committerKim van der Riet <kpvdr@apache.org>2006-11-21 19:44:40 +0000
commit03b8de17239609c9de5e18e0d59eccdd004067eb (patch)
tree4ac6b915f0983e76deda9691f7b0ac90f8b4fded /gentools/org
parent4ac1fb1bc85fbad989deca30410d18eefb727837 (diff)
downloadqpid-python-03b8de17239609c9de5e18e0d59eccdd004067eb.tar.gz
Updates and bugfixes
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@477844 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'gentools/org')
-rw-r--r--gentools/org/apache/qpid/gentools/AmqpOrdinalVersionMap.java15
-rw-r--r--gentools/org/apache/qpid/gentools/AmqpVersionSet.java2
-rw-r--r--gentools/org/apache/qpid/gentools/CppGenerator.java472
-rw-r--r--gentools/org/apache/qpid/gentools/Generator.java20
-rw-r--r--gentools/org/apache/qpid/gentools/JavaGenerator.java16
-rw-r--r--gentools/org/apache/qpid/gentools/Main.java14
6 files changed, 442 insertions, 97 deletions
diff --git a/gentools/org/apache/qpid/gentools/AmqpOrdinalVersionMap.java b/gentools/org/apache/qpid/gentools/AmqpOrdinalVersionMap.java
index 5e0a0dbf81..234e3452a2 100644
--- a/gentools/org/apache/qpid/gentools/AmqpOrdinalVersionMap.java
+++ b/gentools/org/apache/qpid/gentools/AmqpOrdinalVersionMap.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.gentools;
+import java.util.Iterator;
import java.util.TreeMap;
@SuppressWarnings("serial")
@@ -31,4 +32,18 @@ public class AmqpOrdinalVersionMap extends TreeMap<Integer, AmqpVersionSet> impl
return false;
return get(firstKey()).equals(globalVersionSet);
}
+
+ public int getOrdinal(AmqpVersion version)
+ throws AmqpTypeMappingException
+ {
+ Iterator<Integer> itr = keySet().iterator();
+ while (itr.hasNext())
+ {
+ int ordinal = itr.next();
+ AmqpVersionSet versionSet = get(ordinal);
+ if (versionSet.contains(version))
+ return ordinal;
+ }
+ throw new AmqpTypeMappingException("Unable to locate version " + version + " in ordianl version map.");
+ }
}
diff --git a/gentools/org/apache/qpid/gentools/AmqpVersionSet.java b/gentools/org/apache/qpid/gentools/AmqpVersionSet.java
index fe15a59f4a..06b10cfda6 100644
--- a/gentools/org/apache/qpid/gentools/AmqpVersionSet.java
+++ b/gentools/org/apache/qpid/gentools/AmqpVersionSet.java
@@ -39,7 +39,7 @@ public class AmqpVersionSet extends TreeSet<AmqpVersion> implements Printable, C
public void print(PrintStream out, int marginSize, int tabSize)
{
- out.print(Utils.createSpaces(marginSize) + "Version Set: " + toString());
+ out.print(Utils.createSpaces(marginSize) + "Version Set: " + toString() + Utils.lineSeparator);
}
public int compareTo(AmqpVersionSet other)
diff --git a/gentools/org/apache/qpid/gentools/CppGenerator.java b/gentools/org/apache/qpid/gentools/CppGenerator.java
index 27db34418e..f6dea0f669 100644
--- a/gentools/org/apache/qpid/gentools/CppGenerator.java
+++ b/gentools/org/apache/qpid/gentools/CppGenerator.java
@@ -33,15 +33,35 @@ public class CppGenerator extends Generator
protected static final String versionNamespaceEndToken = "${version_namespace_end}";
protected static final int FIELD_NAME = 0;
protected static final int FIELD_DOMAIN = 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", "string", "struct", "switch", "template", "this",
+ "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
+ * 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. 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
{
@@ -64,6 +84,7 @@ public class CppGenerator extends Generator
public CppGenerator(AmqpVersionSet versionList)
{
super(versionList);
+ 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).
@@ -114,6 +135,16 @@ public class CppGenerator extends Generator
"buffer.putLongLong(#)", // encodeExpression
"buffer.getLongLong(#)")); // decodeExpression
}
+
+ public boolean isQuietFlag()
+ {
+ return quietFlag;
+ }
+
+ public void setQuietFlag(boolean quietFlag)
+ {
+ this.quietFlag = quietFlag;
+ }
// === Start of methods for Interface LanguageConverter ===
@@ -135,15 +166,15 @@ public class CppGenerator extends Generator
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
{
- if (version == null)
- version = globalVersionSet.first();
- String domainType = globalDomainMap.getDomainType(domainName, version);
+ String domainType = getDomainType(domainName, version);
if (domainType == null)
throw new AmqpTypeMappingException("Domain type \"" + domainName +
"\" not found in C++ typemap.");
@@ -167,23 +198,23 @@ public class CppGenerator extends Generator
}
@Override
- protected void processTemplate(String[] template)
+ protected void processTemplateA(String[] template)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException
{
- processTemplate(template, null, null, null);
+ processTemplateD(template, null, null, null);
}
@Override
- protected void processTemplate(String[] template, AmqpClass thisClass)
+ protected void processTemplateB(String[] template, AmqpClass thisClass)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException
{
- processTemplate(template, thisClass, null, null);
+ processTemplateD(template, thisClass, null, null);
}
@Override
- protected void processTemplate(String[] template, AmqpClass thisClass,
+ protected void processTemplateC(String[] template, AmqpClass thisClass,
AmqpMethod method)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException
@@ -216,6 +247,8 @@ public class CppGenerator extends Generator
version);
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;
}
@@ -243,7 +276,7 @@ public class CppGenerator extends Generator
}
@Override
- protected void processTemplate(String[] template, AmqpClass thisClass, AmqpMethod method,
+ protected void processTemplateD(String[] template, AmqpClass thisClass, AmqpMethod method,
AmqpField field)
throws IOException, AmqpTemplateException, AmqpTypeMappingException, IllegalAccessException,
InvocationTargetException
@@ -262,19 +295,19 @@ public class CppGenerator extends Generator
try { processAllLists(sb, thisClass, method, version); }
catch (AmqpTemplateException e)
{
- System.out.println("WARNING: " + templateFileName + ": " + e.getMessage());
+ System.out.println("ERROR: " + templateFileName + ": " + e.getMessage());
}
try { processAllTokens(sb, thisClass, method, field, version); }
catch (AmqpTemplateException e)
{
- System.out.println("WARNING: " + templateFileName + ": " + e.getMessage());
+ System.out.println("ERROR: " + templateFileName + ": " + e.getMessage());
}
}
@Override
protected String processToken(String token, AmqpClass thisClass, AmqpMethod method, AmqpField field,
AmqpVersion version)
- throws AmqpTemplateException
+ throws AmqpTemplateException, AmqpTypeMappingException
{
if (token.compareTo("${GENERATOR}") == 0)
return generatorInfo;
@@ -300,7 +333,13 @@ public class CppGenerator extends Generator
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" : "";
+
throw new AmqpTemplateException("Template token " + token + " unknown.");
}
@@ -361,6 +400,14 @@ public class CppGenerator extends Generator
{
codeSnippet = generateProxyInnerClassImpl(model, false, 0, 4);
}
+ else if (token.compareTo("${cph_handler_pointer_defn}") == 0)
+ {
+ codeSnippet = generateHandlerPointerDefinitions(model, false, 4);
+ }
+ else if (token.compareTo("${cph_handler_pointer_get_method}") == 0)
+ {
+ codeSnippet = generateHandlerPointerGetMethods(model, false, 4);
+ }
// SerrverProxy.h/cpp
else if (token.compareTo("${sph_inner_class_instance}") == 0)
@@ -387,7 +434,29 @@ public class CppGenerator extends Generator
{
codeSnippet = generateProxyInnerClassImpl(model, true, 0, 4);
}
+ else if (token.compareTo("${sph_handler_pointer_defn}") == 0)
+ {
+ codeSnippet = generateHandlerPointerDefinitions(model, true, 4);
+ }
+ else if (token.compareTo("${sph_handler_pointer_get_method}") == 0)
+ {
+ codeSnippet = generateHandlerPointerGetMethods(model, true, 4);
+ }
+ // amqp_methods.h/cpp
+ else if (token.compareTo("${mh_method_body_class_indlude}") == 0)
+ {
+ codeSnippet = generateMethodBodyIncludeList(model, 0);
+ }
+ else if (token.compareTo("${mh_method_body_class_instance}") == 0)
+ {
+ codeSnippet = generateMethodBodyInstances(model, 0);
+ }
+ else if (token.compareTo("${mc_create_method_body_map_entry}") == 0)
+ {
+ codeSnippet = generateMethodBodyMapEntry(model, 4);
+ }
+
else // Oops!
{
throw new AmqpTemplateException("Template token \"" + token + "\" unknown.");
@@ -400,7 +469,31 @@ public class CppGenerator extends Generator
AmqpClass thisClass)
throws AmqpTemplateException, AmqpTypeMappingException
{
-// TODO
+ 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("${cpc_method_body_include}") == 0)
+ {
+ codeSnippet = generateMethodBodyIncludes(thisClass, 0);
+ }
+ else if (token.compareTo("${spc_method_body_include}") == 0)
+ {
+ codeSnippet = generateMethodBodyIncludes(thisClass, 0);
+ }
+ else if (token.compareTo("${mc_method_body_include}") == 0)
+ {
+ codeSnippet = generateMethodBodyIncludes(thisClass, 0);
+ }
+
+ else // Oops!
+ {
+ throw new AmqpTemplateException("Template token " + token + " unknown.");
+ }
+ sb.insert(listMarkerStartIndex, codeSnippet);
}
@Override
@@ -440,18 +533,14 @@ public class CppGenerator extends Generator
{
codeSnippet = generateDecodeMethodContents(fieldMap, version, 8);
}
- else if (token.compareTo("${mb_field_list}") == 0)
- {
- codeSnippet = generateFieldList(fieldMap, version, false, false, 8);
- }
- else if (token.compareTo("${mb_field_list_initializer}") == 0)
- {
- codeSnippet = generateFieldList(fieldMap, version, false, true, 8);
- }
- else if (token.compareTo("${mb_field_list_declare}") == 0)
- {
- codeSnippet = generateFieldList(fieldMap, version, true, false, 8);
- }
+// else if (token.compareTo("${mb_field_list_initializer}") == 0)
+// {
+// codeSnippet = generateFieldList(fieldMap, version, false, true, 8);
+// }
+// else if (token.compareTo("${mb_field_list_declare}") == 0)
+// {
+// codeSnippet = generateFieldList(fieldMap, version, true, false, 8);
+// }
else // Oops!
{
@@ -618,7 +707,7 @@ public class CppGenerator extends Generator
chassisFoundFlag = true;
}
if (chassisFoundFlag)
- sb.append(indent + "virtual AMQP_ServerOperations::" +
+ sb.append(indent + "virtual AMQP_" + (serverFlag ? "Server" : "Client") + "Operations::" +
thisClass.name + "Handler* get" + thisClass.name + "Handler() = 0;" + cr);
}
return sb.toString();
@@ -648,10 +737,12 @@ public class CppGenerator extends Generator
sb.append(indent + "{" + cr);
sb.append(indent + "private:" + cr);
sb.append(indent + tab + "ProtocolVersion version;" + cr);
- sb.append(cr);
+ sb.append(cr);
+ sb.append(indent + tab + "// Constructors and destructors" + cr);
+ sb.append(cr);
+ sb.append(indent + "protected:" + cr);
+ sb.append(indent + tab + className + "() {}" + cr);
sb.append(indent + "public:" + cr);
- sb.append(indent + tab + "// Constructors and destructors" + cr);
- sb.append(cr);
sb.append(indent + tab + className +
"(u_int8_t major, u_int8_t minor) : version(major, minor) {}" + cr);
sb.append(indent + tab + className +
@@ -694,7 +785,7 @@ public class CppGenerator extends Generator
if (!first)
sb.append(cr);
sb.append(indent + "virtual void " + methodName + "( u_int16_t channel");
- sb.append(generateMethodParameterList(fieldMap, indentSize + (5*tabSize), true, true));
+ sb.append(generateMethodParameterList(fieldMap, indentSize + (5*tabSize), true, true, true));
sb.append(" )");
if (abstractMethodFlag)
sb.append(" = 0");
@@ -710,7 +801,39 @@ public class CppGenerator extends Generator
}
// 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";
+ Iterator<String> cItr = model.classMap.keySet().iterator();
+ while (cItr.hasNext())
+ {
+ AmqpClass thisClass = model.classMap.get(cItr.next());
+ sb.append(indent + outerClassName + "::" + thisClass.name + "Handler* " +
+ thisClass.name + "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";
+ Iterator<String> cItr = model.classMap.keySet().iterator();
+ while (cItr.hasNext())
+ {
+ AmqpClass thisClass = model.classMap.get(cItr.next());
+ sb.append(indent + "virtual inline " + outerClassName + "::" + thisClass.name + "Handler* get" +
+ thisClass.name + "Handler() { return &" + Utils.firstLower(thisClass.name) + ";}" + cr);
+ }
+ return sb.toString();
+ }
+
protected String generateProxyInnerClassInstances(AmqpModel model, boolean serverFlag,
int indentSize)
{
@@ -723,7 +846,7 @@ public class CppGenerator extends Generator
AmqpClass thisClass = model.classMap.get(cItr.next());
String instanceName = parseForReservedWords(Utils.firstLower(thisClass.name), outerClassName);
String className = parseForReservedWords(thisClass.name, null);
- sb.append(indent + instanceName + " " + className + ";");
+ sb.append(indent + className + " " + instanceName + ";");
if (thisClass.versionSet.size() != globalVersionSet.size())
sb.append(" // AMQP Version(s) " + thisClass.versionSet + cr);
else
@@ -778,8 +901,8 @@ public class CppGenerator extends Generator
sb.append(cr);
sb.append(indent + "{" + cr);
sb.append(indent + "private:" + cr);
+ sb.append(indent + tab + "OutputHandler* out;" + cr);
sb.append(indent + tab + "ProtocolVersion version;" + cr);
- sb.append(indent + tab + "OutputHandler* out;" + cr);
sb.append(cr);
sb.append(indent + "public:" + cr);
sb.append(indent + tab + "// Constructors and destructors" + cr);
@@ -802,18 +925,18 @@ public class CppGenerator extends Generator
protected String generateProxyConstructorInitializers(AmqpModel model, boolean serverFlag,
int indentSize)
{
- String indent = Utils.createSpaces(indentSize);
- StringBuffer sb = new StringBuffer(indent + "out(out)," + cr);
String outerClassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Proxy";
- sb.append(indent + "major(major)," + cr);
- sb.append(indent + "minor(minor)");
+ String superclassName = "AMQP_" + (serverFlag ? "Server" : "Client") + "Operations";
+ String indent = Utils.createSpaces(indentSize);
+ StringBuffer sb = new StringBuffer(indent + superclassName + "(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)");
+ sb.append(indent + instanceName + "(out, major, minor)");
if (!cItr.hasNext())
sb.append(cr);
}
@@ -887,6 +1010,7 @@ public class CppGenerator extends Generator
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);
@@ -897,18 +1021,19 @@ public class CppGenerator extends Generator
{
AmqpOrdinalFieldMap fieldMap = ofmItr.next();
AmqpVersionSet versionSet = overloadededParameterMap.get(fieldMap);
- boolean versionConsistentFlag = versionSet.size() == globalVersionSet.size();
+// boolean versionConsistentFlag = versionSet.size() == globalVersionSet.size();
if (!first)
sb.append(cr);
- sb.append(indent + "void " + outerclassName + "::" + methodName + "( u_int16_t channel");
- sb.append(generateMethodParameterList(fieldMap, indentSize + (5*tabSize), true, true));
+ sb.append(indent + "void " + outerclassName + "::" + thisClass.name + "::" +
+ methodName + "( u_int16_t channel");
+ sb.append(generateMethodParameterList(fieldMap, indentSize + (5*tabSize), true, true, true));
sb.append(" )");
- if (!versionConsistentFlag)
+ if (versionSet.size() != globalVersionSet.size())
sb.append(" // AMQP Version(s) " + versionSet);
sb.append(cr);
sb.append(indent + "{" + cr);
sb.append(generateMethodBodyCallContext(fieldMap, outerclassName, methodBodyClassName,
- versionSet, indentSize + tabSize, tabSize));
+ versionConsistentFlag, versionSet, indentSize + tabSize, tabSize));
sb.append(indent + "}" + cr);
sb.append(cr);
first = false;
@@ -919,13 +1044,14 @@ public class CppGenerator extends Generator
}
protected String generateMethodBodyCallContext(AmqpOrdinalFieldMap fieldMap, String outerclassName,
- String methodBodyClassName, AmqpVersionSet versionSet, int indentSize, int tabSize)
+ 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 (versionSet.size() == globalVersionSet.size())
+ if (versionConsistentFlag)
{
sb.append(generateMethodBodyCall(fieldMap, methodBodyClassName, null, indentSize, tabSize));
}
@@ -948,9 +1074,9 @@ public class CppGenerator extends Generator
}
sb.append(indent + "else" + cr);
sb.append(indent + "{" + cr);
- sb.append(indent + tab + "stringstream ss;" + 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, false) + ")\"" + cr);
+ "(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);
@@ -965,13 +1091,46 @@ public class CppGenerator extends Generator
String indent = Utils.createSpaces(indentSize);
String tab = Utils.createSpaces(tabSize);
String namespace = version != null ? version.namespace() + "::" : "";
- StringBuffer sb = new StringBuffer(indent + "out->send( new AMQP_Frame( channel," + cr);
- sb.append(indent + tab + "new " + namespace + methodBodyClassName + "(");
- sb.append(generateMethodParameterList(fieldMap, indentSize + (5*tabSize), false, true));
+ StringBuffer sb = new StringBuffer(indent + "out->send( new AMQFrame( channel," + cr);
+ sb.append(indent + tab + "new " + namespace + methodBodyClassName + "( version");
+ 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
+ {
+ Iterator<String> cItr = model.classMap.keySet().iterator();
+ while (cItr.hasNext())
+ {
+ thisClass = model.classMap.get(cItr.next());
+ sb.append(generateClassMethodBodyInclude(thisClass, indentSize));
+ }
+ }
+ return sb.toString();
+ }
+
+ protected String generateClassMethodBodyInclude(AmqpClass thisClass, int indentSize)
+ {
+ StringBuffer sb = new StringBuffer();
+ String indent = Utils.createSpaces(indentSize);
+ Iterator<String> mItr = thisClass.methodMap.keySet().iterator();
+ while (mItr.hasNext())
+ {
+ AmqpMethod method = thisClass.methodMap.get(mItr.next());
+ sb.append(indent + "#include <qpid/framing/" + 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)
@@ -1003,7 +1162,7 @@ public class CppGenerator extends Generator
String[] fieldDomainPair = ordinalFieldMap.get(oItr.next());
sb.append(indent + fieldDomainPair[FIELD_DOMAIN] + " " + fieldDomainPair[FIELD_NAME] + ";" + cr);
}
-
+ // TODO: Replace the pattern below with that above in the JavaGenerator and elsewhere here.
// Iterator<String> fItr = fieldMap.keySet().iterator();
// while(fItr.hasNext())
// {
@@ -1070,6 +1229,7 @@ public class CppGenerator extends Generator
}
protected String generatePrintMethodContents(AmqpFieldMap fieldMap, AmqpVersion version, int indentSize)
+ throws AmqpTypeMappingException
{
String indent = Utils.createSpaces(indentSize);
StringBuffer sb = new StringBuffer();
@@ -1077,16 +1237,37 @@ public class CppGenerator extends Generator
boolean firstFlag = true;
while(fItr.hasNext())
{
- String fieldName = fItr.next();
- AmqpField fieldDetails = fieldMap.get(fieldName);
- if (version == null || fieldDetails.versionSet.contains(version))
- {
- sb.append(indent + "out << \"");
- if (!firstFlag)
- sb.append("; ");
- sb.append(fieldName + "=\" << " + fieldName + ";" + cr);
- firstFlag = false;
- }
+ AmqpField fieldDetails = fieldMap.get(fItr.next());
+ if (version == null) // Version consistent - there *should* be only one domain
+ {
+ String domainName = fieldDetails.domainMap.firstKey();
+ String codeType = getGeneratedType(domainName, globalVersionSet.first());
+ String cast = codeType.compareTo("u_int8_t") == 0 ? "(int)" : "";
+ sb.append(indent + "out << \"");
+ if (!firstFlag)
+ sb.append("; ");
+ sb.append(fieldDetails.name + "=\" << " + cast + fieldDetails.name + ";" + cr);
+ firstFlag = false;
+ }
+ else
+ {
+ Iterator<String> dItr = fieldDetails.domainMap.keySet().iterator();
+ while (dItr.hasNext())
+ {
+ String domainName = dItr.next();
+ AmqpVersionSet versionSet = fieldDetails.domainMap.get(domainName);
+ if (versionSet.contains(version))
+ {
+ String codeType = getGeneratedType(domainName, version);
+ String cast = codeType.compareTo("u_int8_t") == 0 ? "(int)" : "";
+ sb.append(indent + "out << \"");
+ if (!firstFlag)
+ sb.append("; ");
+ sb.append(fieldDetails.name + "=\" << " + cast + fieldDetails.name + ";" + cr);
+ firstFlag = false;
+ }
+ }
+ }
}
return sb.toString();
}
@@ -1305,7 +1486,7 @@ public class CppGenerator extends Generator
}
protected String generateMethodParameterList(AmqpOrdinalFieldMap fieldMap, int indentSize,
- boolean leadingCommaFlag, boolean fieldNameFlag)
+ boolean leadingCommaFlag, boolean fieldTypeFlag, boolean fieldNameFlag)
throws AmqpTypeMappingException
{
String indent = Utils.createSpaces(indentSize);
@@ -1323,13 +1504,150 @@ public class CppGenerator extends Generator
{
sb.append(indent);
}
- sb.append(setRef(field[FIELD_DOMAIN]) +
+ sb.append(
+ (fieldTypeFlag ? setRef(field[FIELD_DOMAIN]) : "") +
(fieldNameFlag ? " " + field[FIELD_NAME] : "") +
(pItr.hasNext() ? "," + (fieldNameFlag ? cr : " ") : ""));
first = false;
}
return sb.toString();
}
+
+ protected String generateConstructor(AmqpClass thisClass, AmqpMethod method,
+ AmqpVersion version, int indentSize, int tabSize)
+ throws AmqpTypeMappingException
+ {
+ String indent = Utils.createSpaces(indentSize);
+ String tab = Utils.createSpaces(tabSize);
+ StringBuffer sb = new StringBuffer();
+ if (method.fieldMap.size() > 0)
+ {
+ sb.append(indent + thisClass.name + Utils.firstUpper(method.name) + "Body(ProtocolVersion version," + cr);
+ sb.append(generateFieldList(method.fieldMap, version, true, false, 8));
+ sb.append(indent + tab + ") :" + cr);
+ sb.append(indent + tab + "AMQMethodBody(version)," + cr);
+ sb.append(generateFieldList(method.fieldMap, version, false, true, 8));
+ sb.append(indent + "{ }" + cr);
+ }
+ return sb.toString();
+ }
+
+ protected String generateServerOperationsInvoke(AmqpClass thisClass, AmqpMethod method,
+ AmqpVersion version, int indentSize, int tabSize)
+ throws AmqpTypeMappingException
+ {
+ String indent = Utils.createSpaces(indentSize);
+ String tab = Utils.createSpaces(tabSize);
+ StringBuffer sb = new StringBuffer();
+
+ if (method.serverMethodFlagMap.size() > 0) // At least one AMQP version defines this method as a server method
+ {
+ Iterator<Boolean> bItr = method.serverMethodFlagMap.keySet().iterator();
+ while (bItr.hasNext())
+ {
+ if (bItr.next()) // This is a server operation
+ {
+ boolean fieldMapNotEmptyFlag = method.fieldMap.size() > 0;
+ sb.append(indent + "inline void invoke(AMQP_ServerOperations& target, u_int16_t channel)" + cr);
+ sb.append(indent + "{" + cr);
+ sb.append(indent + tab + "target.get" + thisClass.name + "Handler()->" +
+ parseForReservedWords(Utils.firstLower(method.name),
+ thisClass.name + Utils.firstUpper(method.name) + "Body.invoke()") + "(channel");
+ if (fieldMapNotEmptyFlag)
+ {
+ sb.append("," + cr);
+ sb.append(generateFieldList(method.fieldMap, version, false, false, indentSize + 4*tabSize));
+ sb.append(indent + tab + tab + tab + tab);
+ }
+ sb.append(");" + cr);
+ sb.append(indent + "}" + cr);
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ // Methods for generation of code snippets for amqp_methods.h/cpp files
+
+ protected String generateMethodBodyIncludeList(AmqpModel model, int indentSize)
+ {
+ String indent = Utils.createSpaces(indentSize);
+ StringBuffer sb = new StringBuffer();
+
+ Iterator<String> cItr = model.classMap.keySet().iterator();
+ while (cItr.hasNext())
+ {
+ AmqpClass thisClass = model.classMap.get(cItr.next());
+ Iterator<String> mItr = thisClass.methodMap.keySet().iterator();
+ while (mItr.hasNext())
+ {
+ AmqpMethod method = thisClass.methodMap.get(mItr.next());
+ sb.append(indent + "#include \"" + thisClass.name + Utils.firstUpper(method.name) + "Body.h\"" + cr);
+ }
+ }
+
+ return sb.toString();
+ }
+
+ protected String generateMethodBodyInstances(AmqpModel model, int indentSize)
+ {
+ String indent = Utils.createSpaces(indentSize);
+ StringBuffer sb = new StringBuffer();
+
+ Iterator<String> cItr = model.classMap.keySet().iterator();
+ while (cItr.hasNext())
+ {
+ AmqpClass thisClass = model.classMap.get(cItr.next());
+ Iterator<String> mItr = thisClass.methodMap.keySet().iterator();
+ while (mItr.hasNext())
+ {
+ AmqpMethod method = thisClass.methodMap.get(mItr.next());
+ sb.append(indent + "const " + thisClass.name + Utils.firstUpper(method.name) + "Body " +
+ Utils.firstLower(thisClass.name) + "_" + method.name + ";" + cr);
+ }
+ }
+
+ return sb.toString();
+ }
+
+ protected String generateMethodBodyMapEntry(AmqpModel model, int indentSize)
+ throws AmqpTypeMappingException
+ {
+ String indent = Utils.createSpaces(indentSize);
+ StringBuffer sb = new StringBuffer();
+
+ Iterator<AmqpVersion> vItr = globalVersionSet.iterator();
+ while (vItr.hasNext())
+ {
+ AmqpVersion version = vItr.next();
+ Iterator<String> cItr = model.classMap.keySet().iterator();
+ while (cItr.hasNext())
+ {
+ AmqpClass thisClass = model.classMap.get(cItr.next());
+ Iterator<String> mItr = thisClass.methodMap.keySet().iterator();
+ while (mItr.hasNext())
+ {
+ AmqpMethod method = thisClass.methodMap.get(mItr.next());
+ String namespace = method.isVersionConsistent(globalVersionSet) ? "" : version.namespace() + "::";
+ try
+ {
+ int classOrdinal = thisClass.indexMap.getOrdinal(version);
+ int methodOrdinal = method.indexMap.getOrdinal(version);
+ String methodModyClassName = namespace + thisClass.name + Utils.firstUpper(method.name) + "Body";
+ sb.append(indent + "insert(std::make_pair(createMapKey(" + classOrdinal + ", " +
+ methodOrdinal + ", " + version.getMajor() + ", " + version.getMinor() +
+ "), &createMethodBodyFn<" + methodModyClassName + ">));" + cr);
+ }
+ catch (AmqpTypeMappingException e) {} // ignore
+ }
+ }
+ }
+
+ return sb.toString();
+ }
+
+
+ // Helper functions
private String generateVersionCheck(AmqpVersion version)
{
@@ -1360,11 +1678,27 @@ public class CppGenerator extends Generator
for (int i=0; i<cppReservedWords.length; i++)
if (name.compareTo(cppReservedWords[i]) == 0)
{
- System.out.println("WARNING: " + (context == null ? "" : context + ": ") +
- "Found XML method \"" + name + "\", which is a C++ reserved word. " +
- "Changing generated name to \"" + name + "_\".");
+ if (!quietFlag)
+ {
+ System.out.println("WARNING: " + (context == null ? "" : context + ": ") +
+ "Found XML method \"" + name + "\", which is a C++ reserved word. " +
+ "Changing generated name to \"" + name + "_\".");
+ }
return name + "_";
}
+
+ for (int i=0; i<cppCommonDefines.length; i++)
+ if (name.compareTo(cppCommonDefines[i]) == 0)
+ {
+ if (!quietFlag)
+ {
+ System.out.println("WARNING: " + (context == null ? "" : context + ": ") +
+ "Found XML method \"" + name + "\", which may clash with commonly used defines within C++. " +
+ "Changing generated name to \"" + name + "_\".");
+ }
+ return name + "_";
+ }
+
return name;
}
diff --git a/gentools/org/apache/qpid/gentools/Generator.java b/gentools/org/apache/qpid/gentools/Generator.java
index 75b980cc7b..8ed54a2387 100644
--- a/gentools/org/apache/qpid/gentools/Generator.java
+++ b/gentools/org/apache/qpid/gentools/Generator.java
@@ -150,7 +150,7 @@ public abstract class Generator implements LanguageConverter
abstract protected String processToken(String token, AmqpClass thisClass, AmqpMethod method,
AmqpField field, AmqpVersion version)
- throws AmqpTemplateException;
+ throws AmqpTemplateException, AmqpTypeMappingException;
abstract protected void processClassList(StringBuffer sb, int listMarkerStartIndex, int listMarkerEndIndex,
AmqpModel model)
@@ -180,7 +180,7 @@ public abstract class Generator implements LanguageConverter
// Use all model-level templates
for (int t = 0; t < modelTemplateList.size(); t++)
{
- processTemplate(modelTemplateList.get(t));
+ processTemplateA(modelTemplateList.get(t));
}
// Cycle through classes
@@ -193,7 +193,7 @@ public abstract class Generator implements LanguageConverter
// Use all class-level templates
for (int c = 0; c < classTemplateList.size(); c++)
{
- processTemplate(classTemplateList.get(c), thisClass);
+ processTemplateB(classTemplateList.get(c), thisClass);
}
// Cycle through all methods
@@ -206,7 +206,7 @@ public abstract class Generator implements LanguageConverter
// Use all method-level templates
for (int m = 0; m < methodTemplateList.size(); m++)
{
- processTemplate(methodTemplateList.get(m), thisClass, method);
+ processTemplateC(methodTemplateList.get(m), thisClass, method);
}
// Cycle through all fields
@@ -219,7 +219,7 @@ public abstract class Generator implements LanguageConverter
// Use all field-level templates
for (int f = 0; f < fieldTemplateList.size(); f++)
{
- processTemplate(fieldTemplateList.get(f), thisClass, method, field);
+ processTemplateD(fieldTemplateList.get(f), thisClass, method, field);
}
}
}
@@ -246,23 +246,23 @@ public abstract class Generator implements LanguageConverter
}
// Model-level template processing
- abstract protected void processTemplate(String[] template)
+ abstract protected void processTemplateA(String[] template)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException;
// Class-level template processing
- abstract protected void processTemplate(String[] template, AmqpClass thisClass)
+ abstract protected void processTemplateB(String[] template, AmqpClass thisClass)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException;
// Method-level template processing
- abstract protected void processTemplate(String[] template, AmqpClass thisClass,
+ abstract protected void processTemplateC(String[] template, AmqpClass thisClass,
AmqpMethod method)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException;
// Field-level template processing
- abstract protected void processTemplate(String[] template, AmqpClass thisClass,
+ abstract protected void processTemplateD(String[] template, AmqpClass thisClass,
AmqpMethod method, AmqpField field)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException;
@@ -338,7 +338,7 @@ public abstract class Generator implements LanguageConverter
protected void processAllTokens(StringBuffer sb, AmqpClass thisClass, AmqpMethod method, AmqpField field,
AmqpVersion version)
- throws AmqpTemplateException
+ throws AmqpTemplateException, AmqpTypeMappingException
{
int lstart = sb.indexOf("${");
while (lstart != -1)
diff --git a/gentools/org/apache/qpid/gentools/JavaGenerator.java b/gentools/org/apache/qpid/gentools/JavaGenerator.java
index 177c6f6546..4c168cd036 100644
--- a/gentools/org/apache/qpid/gentools/JavaGenerator.java
+++ b/gentools/org/apache/qpid/gentools/JavaGenerator.java
@@ -377,32 +377,32 @@ public class JavaGenerator extends Generator
}
@Override
- protected void processTemplate(String[] template)
+ protected void processTemplateA(String[] template)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException
{
- processTemplate(template, null, null, null);
+ processTemplateD(template, null, null, null);
}
@Override
- protected void processTemplate(String[] template, AmqpClass thisClass)
+ protected void processTemplateB(String[] template, AmqpClass thisClass)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException
{
- processTemplate(template, thisClass, null, null);
+ processTemplateD(template, thisClass, null, null);
}
@Override
- protected void processTemplate(String[] template, AmqpClass thisClass,
+ protected void processTemplateC(String[] template, AmqpClass thisClass,
AmqpMethod method)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException
{
- processTemplate(template, thisClass, method, null);
+ processTemplateD(template, thisClass, method, null);
}
@Override
- protected void processTemplate(String[] template, AmqpClass thisClass,
+ protected void processTemplateD(String[] template, AmqpClass thisClass,
AmqpMethod method, AmqpField field)
throws IOException, AmqpTemplateException, AmqpTypeMappingException,
IllegalAccessException, InvocationTargetException
@@ -433,7 +433,7 @@ public class JavaGenerator extends Generator
@Override
protected String processToken(String token, AmqpClass thisClass, AmqpMethod method, AmqpField field,
AmqpVersion version)
- throws AmqpTemplateException
+ throws AmqpTemplateException, AmqpTypeMappingException
{
if (token.compareTo("${GENERATOR}") == 0)
return generatorInfo;
diff --git a/gentools/org/apache/qpid/gentools/Main.java b/gentools/org/apache/qpid/gentools/Main.java
index 7c170f8337..5993a556f8 100644
--- a/gentools/org/apache/qpid/gentools/Main.java
+++ b/gentools/org/apache/qpid/gentools/Main.java
@@ -79,13 +79,9 @@ public class Main
new File("templ.cpp/AMQP_ClientProxy.h.tmpl"),
new File("templ.cpp/AMQP_ServerProxy.cpp.tmpl"),
new File("templ.cpp/AMQP_ClientProxy.cpp.tmpl"),
- new File("templ.cpp/AMQP_Constants.h.tmpl")
-// new File("templ.cpp/AMQP_ServerHandlerImpl.h.tmpl"),
-// new File("templ.cpp/AMQP_ClientHandlerImpl.h.tmpl"),
-// new File("templ.cpp/AMQP_ServerHandlerImpl.cpp.tmpl"),
-// new File("templ.cpp/AMQP_ClientHandlerImpl.cpp.tmpl"),
-// new File("templ.cpp/amqp_methods.h.tmpl"),
-// new File("templ.cpp/amqp_methods.cpp.tmpl")
+ new File("templ.cpp/AMQP_Constants.h.tmpl"),
+ new File("templ.cpp/AMQP_MethodVersionMap.h.tmpl"),
+ new File("templ.cpp/AMQP_MethodVersionMap.cpp.tmpl")
};
methodTemplateFiles = new File[]
{
@@ -162,9 +158,9 @@ public class Main
// System.out.println();
// System.out.println("*** Debug output ***");
// System.out.println();
+// versionSet.print(System.out, 0, 2);
+// System.out.println();
// constants.print(System.out, 0, 2);
-// System.out.println();
-// versionSet.print(System.out, 0, 2);
// System.out.println();
// domainMap.print(System.out, 0, 2);
// System.out.println();