summaryrefslogtreecommitdiff
path: root/gentools/templ.java
diff options
context:
space:
mode:
Diffstat (limited to 'gentools/templ.java')
-rw-r--r--gentools/templ.java/MethodBodyClass.tmpl2
-rw-r--r--gentools/templ.java/MethodRegistryClass.tmpl45
-rw-r--r--gentools/templ.java/PropertyContentHeaderClass.tmpl4
3 files changed, 47 insertions, 4 deletions
diff --git a/gentools/templ.java/MethodBodyClass.tmpl b/gentools/templ.java/MethodBodyClass.tmpl
index 8ac6c4e00a..ad1ce36006 100644
--- a/gentools/templ.java/MethodBodyClass.tmpl
+++ b/gentools/templ.java/MethodBodyClass.tmpl
@@ -54,6 +54,8 @@ ${METHOD_ID_INIT}
public int getClazz() { return classIdMap.get(major + "-" + minor); }
public int getMethod() { return methodIdMap.get(major + "-" + minor); }
+ public static int getClazz(byte major, byte minor) { return classIdMap.get(major + "-" + minor); }
+ public static int getMethod(byte major, byte minor) { return methodIdMap.get(major + "-" + minor); }
// Field methods
%{FLIST} ${mb_field_get_method}
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);
+ }
}
diff --git a/gentools/templ.java/PropertyContentHeaderClass.tmpl b/gentools/templ.java/PropertyContentHeaderClass.tmpl
index 6cc2e55a33..3c147cf6b6 100644
--- a/gentools/templ.java/PropertyContentHeaderClass.tmpl
+++ b/gentools/templ.java/PropertyContentHeaderClass.tmpl
@@ -1,4 +1,4 @@
-&{${CLASS}PropertyContentHeader.java}
+&{${CLASS}ContentHeaderProperties.java}
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -31,7 +31,7 @@ package org.apache.qpid.framing;
import org.apache.log4j.Logger;
import org.apache.mina.common.ByteBuffer;
-class ${CLASS}ContentHeaderProperties implements ContentHeaderProperties
+public class ${CLASS}ContentHeaderProperties implements ContentHeaderProperties
{
private static final Logger logger = Logger.getLogger(BasicContentHeaderProperties.class);