diff options
author | Alan Conway <aconway@apache.org> | 2007-01-31 16:40:14 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2007-01-31 16:40:14 +0000 |
commit | 470369c0b8e2dd1b4c60bcc9907c99d8cbad866e (patch) | |
tree | 7844e5b63cc40e741d37a8f97ca0a262c0b27bd7 | |
parent | 871bec96980eb7bef4cba46a7c1dc95cdd8303f1 (diff) | |
download | qpid-python-470369c0b8e2dd1b4c60bcc9907c99d8cbad866e.tar.gz |
* gentools/AmqpFlagMa.javap: Refactor repetative set/get code into FlagMap.
* gentools/AmqpMethod.java: Fixed algorithm for deducing whether a method
is a request or a response. Version-aware isResponseFlagMap.
* gentools/CppGenerator.java: Use new response flag.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/branches/qpid.0-9@501890 13f79535-47bb-0310-9956-ffa450edef68
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); } |