summaryrefslogtreecommitdiff
path: root/gentools/templ.java/MethodRegistryClass.tmpl
diff options
context:
space:
mode:
authorKim van der Riet <kpvdr@apache.org>2006-12-22 17:43:09 +0000
committerKim van der Riet <kpvdr@apache.org>2006-12-22 17:43:09 +0000
commit2b22dcd63c9b0a3d914fff21abd78985059b326d (patch)
tree6eabbcbb40c47b5620a1a3ac8b1485193647223b /gentools/templ.java/MethodRegistryClass.tmpl
parent5129ac060aed57d8e31a62c3cd64ff0ad8995949 (diff)
downloadqpid-python-2b22dcd63c9b0a3d914fff21abd78985059b326d.tar.gz
Additional changes to support new Java AMQP version code, some C++ tidy-up as well.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@489704 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'gentools/templ.java/MethodRegistryClass.tmpl')
-rw-r--r--gentools/templ.java/MethodRegistryClass.tmpl45
1 files changed, 43 insertions, 2 deletions
diff --git a/gentools/templ.java/MethodRegistryClass.tmpl b/gentools/templ.java/MethodRegistryClass.tmpl
index 4fb40055a5..0f15918f90 100644
--- a/gentools/templ.java/MethodRegistryClass.tmpl
+++ b/gentools/templ.java/MethodRegistryClass.tmpl
@@ -28,12 +28,53 @@
package org.apache.qpid.framing;
-import java.util.Map;
+import java.util.HashMap;
+import java.lang.reflect.Constructor;
+import org.apache.log4j.Logger;
class MainRegistry
{
- static void register(Map map, byte major, byte minor)
+ private static final Logger _log = Logger.getLogger(MainRegistry.class);
+ private static HashMap<Long, Class> classIDMethodIDVersionBodyMap = new HashMap<Long, Class>();
+
+ static
{
%{CLIST} ${reg_map_put_method}
}
+
+ public static AMQMethodBody get(short classID, short methodID, byte major, byte minor)
+ throws AMQFrameDecodingException
+ {
+ Class bodyClass = classIDMethodIDVersionBodyMap.get(
+ createMapKey(classID, methodID, major, minor));
+ if (bodyClass == null)
+ {
+ throw new AMQFrameDecodingException(_log,
+ "Unable to find a suitable decoder for class " + classID + " and method " +
+ methodID + " in AMQP version " + major + "-" + minor + ".");
+ }
+ try
+ {
+ Constructor initFn = bodyClass.getConstructor(byte.class, byte.class);
+ return (AMQMethodBody) initFn.newInstance(major, minor);
+ }
+ catch (Exception e)
+ {
+ throw new AMQFrameDecodingException(_log,
+ "Unable to instantiate body class for class " + classID + " and method " +
+ methodID + " in AMQP version " + major + "-" + minor + " : " + e, e);
+ }
+ }
+
+ private static Long createMapKey(short classID, short methodID, byte major, byte minor)
+ {
+ /**
+ * Mapping of 4 components into a guaranteed unique key:
+ * MSB LSB
+ * +----+----+----+----+----+----+-----+-----+
+ * | 0 | classID |methodID |major|minor|
+ * +----+----+----+----+----+----+-----+-----+
+ */
+ return new Long(((long)classID << 32) + ((long)methodID << 16) + ((long)major << 8) + minor);
+ }
}