summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gentools/src/org/apache/qpid/gentools/AmqpFlagMap.java16
-rw-r--r--gentools/src/org/apache/qpid/gentools/AmqpMethod.java48
-rw-r--r--gentools/src/org/apache/qpid/gentools/CppGenerator.java10
3 files changed, 45 insertions, 29 deletions
diff --git a/gentools/src/org/apache/qpid/gentools/AmqpFlagMap.java b/gentools/src/org/apache/qpid/gentools/AmqpFlagMap.java
index 048221bda8..9d3aa02cf2 100644
--- a/gentools/src/org/apache/qpid/gentools/AmqpFlagMap.java
+++ b/gentools/src/org/apache/qpid/gentools/AmqpFlagMap.java
@@ -30,7 +30,21 @@ public class AmqpFlagMap extends TreeMap<Boolean, AmqpVersionSet> implements Ver
{
return containsKey(true);
}
-
+
+ public boolean isSet(AmqpVersion version)
+ {
+ System.out.println("VERSION="+version);
+ return containsKey(true) && get(true).contains(version);
+ }
+
+ public void setFlagForVersion(boolean flag, AmqpVersion version) {
+ if (get(flag) == null) {
+ put(flag, new AmqpVersionSet(version));
+ } else {
+ get(flag).add(version);
+ }
+ }
+
public String toString()
{
AmqpVersionSet versionSet = get(true);
diff --git a/gentools/src/org/apache/qpid/gentools/AmqpMethod.java b/gentools/src/org/apache/qpid/gentools/AmqpMethod.java
index 00d6a9c044..0efa9ae260 100644
--- a/gentools/src/org/apache/qpid/gentools/AmqpMethod.java
+++ b/gentools/src/org/apache/qpid/gentools/AmqpMethod.java
@@ -24,6 +24,7 @@ import java.io.PrintStream;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.w3c.dom.Element;
public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck
{
@@ -31,10 +32,10 @@ public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck
public AmqpVersionSet versionSet;
public AmqpFieldMap fieldMap;
public String name;
- public boolean isRequest;
public AmqpOrdinalVersionMap indexMap;
public AmqpFlagMap clientMethodFlagMap; // Method called on client (<chassis name="server"> in XML)
public AmqpFlagMap serverMethodFlagMap; // Method called on server (<chassis name="client"> in XML)
+ public AmqpFlagMap isResponseFlagMap;
public AmqpMethod(String name, LanguageConverter converter)
{
@@ -45,8 +46,26 @@ public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck
indexMap = new AmqpOrdinalVersionMap();
clientMethodFlagMap = new AmqpFlagMap();
serverMethodFlagMap = new AmqpFlagMap();
+ isResponseFlagMap = new AmqpFlagMap();
}
+ /** Check if this method is named as a response by any other method in the class. */
+ public void checkForResponse(Element methodElement, AmqpVersion version) {
+ Element clazz = (Element)methodElement.getParentNode();
+ String methodName = methodElement.getAttribute("name");
+ NodeList methods = clazz.getElementsByTagName("method");
+ for (int i=0; i<methods.getLength(); ++i) {
+ Element method = (Element)methods.item(i);
+ NodeList responses = method.getElementsByTagName("response");
+ for (int j =0; j<responses.getLength(); ++j) {
+ Element response = (Element)responses.item(j);
+ if (methodName.equals(response.getAttribute("name"))) {
+ isResponseFlagMap.setFlagForVersion(true, version);
+ }
+ }
+ }
+ }
+
public boolean addFromNode(Node methodNode, int ordinal, AmqpVersion version)
throws AmqpParseException, AmqpTypeMappingException
{
@@ -65,7 +84,6 @@ public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck
}
NodeList nList = methodNode.getChildNodes();
int fieldCntr = fieldMap.size();
- isRequest = false; // Assume not a request unless we find a response node.
for (int i=0; i<nList.getLength(); i++)
{
Node child = nList.item(i);
@@ -105,10 +123,8 @@ public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck
if (value.compareTo("no-gen") == 0)
return false;
}
- else if (child.getNodeName().equals("response")) {
- isRequest = true;
- }
}
+ checkForResponse((Element)methodNode, version);
processChassisFlags(serverChassisFlag, clientChassisFlag, version);
return true;
}
@@ -117,6 +133,7 @@ public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck
{
clientMethodFlagMap.removeVersion(version);
serverMethodFlagMap.removeVersion(version);
+ isResponseFlagMap.removeVersion(version);
indexMap.removeVersion(version);
fieldMap.removeVersion(version);
versionSet.remove(version);
@@ -146,25 +163,8 @@ public class AmqpMethod implements Printable, NodeAware, VersionConsistencyCheck
protected void processChassisFlags(boolean serverFlag, boolean clientFlag, AmqpVersion version)
{
- AmqpVersionSet versionSet = serverMethodFlagMap.get(serverFlag);
- if (versionSet != null)
- versionSet.add(version);
- else
- {
- versionSet = new AmqpVersionSet();
- versionSet.add(version);
- serverMethodFlagMap.put(serverFlag, versionSet);
- }
-
- versionSet = clientMethodFlagMap.get(clientFlag);
- if (versionSet != null)
- versionSet.add(version);
- else
- {
- versionSet = new AmqpVersionSet();
- versionSet.add(version);
- clientMethodFlagMap.put(clientFlag, versionSet);
- }
+ serverMethodFlagMap.setFlagForVersion(serverFlag, version);
+ clientMethodFlagMap.setFlagForVersion(clientFlag, version);
}
public AmqpOverloadedParameterMap getOverloadedParameterLists(AmqpVersionSet globalVersionSet,
diff --git a/gentools/src/org/apache/qpid/gentools/CppGenerator.java b/gentools/src/org/apache/qpid/gentools/CppGenerator.java
index a77fbe88f0..122a5b0820 100644
--- a/gentools/src/org/apache/qpid/gentools/CppGenerator.java
+++ b/gentools/src/org/apache/qpid/gentools/CppGenerator.java
@@ -355,13 +355,15 @@ public class CppGenerator extends Generator
if (token.equals("${hv_latest_minor}"))
return String.valueOf(globalVersionSet.last().getMinor());
if (token.equals("${mb_base_class}"))
- return baseClass(method);
+ return baseClass(method, version);
throw new AmqpTemplateException("Template token " + token + " unknown.");
}
- private String baseClass(AmqpMethod method) {
- return method.isRequest ? "AMQRequestBody" : "AMQResponseBody";
+ private String baseClass(AmqpMethod method, AmqpVersion version) {
+ boolean isResponse = (version == null) ? method.isResponseFlagMap.isSet() : method.isResponseFlagMap.isSet(version);
+ String base = isResponse ? "AMQResponseBody":"AMQRequestBody";
+ return base;
}
@Override
@@ -1428,7 +1430,7 @@ public class CppGenerator extends Generator
sb.append(indent + thisClass.name + Utils.firstUpper(method.name) + "Body(const ProtocolVersion& version," + cr);
sb.append(generateFieldList(method.fieldMap, version, true, false, 8));
sb.append(indent + tab + ") :" + cr);
- sb.append(indent + tab + baseClass(method) + "(version)," + cr);
+ sb.append(indent + tab + baseClass(method, version) + "(version)," + cr);
sb.append(generateFieldList(method.fieldMap, version, false, true, 8));
sb.append(indent + "{ }" + cr);
}