java_gen: make OFFactory be a XidGenerator
diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index 033ff20..410a1dd 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -378,14 +378,15 @@
annotated_base_class = base_class + "<?>" if base_class == "OFOxm" else base_class
factories[base_class] = OFFactory(package="%s.%s" % (prefix, package),
- name=base_class + "s", members=[], remove_prefix=remove_prefix, base_class=annotated_base_class, sub_factories={})
+ name=base_class + "s", members=[], remove_prefix=remove_prefix, base_class=annotated_base_class, sub_factories={}, xid_generator=False)
factories[""] = OFFactory(
package=prefix,
name="OFFactory",
remove_prefix="",
members=[], base_class="OFMessage", sub_factories=OrderedDict(
- ("{}{}s".format(n[2].lower(), n[3:]), "{}s".format(n)) for n in sub_factory_classes ))
+ ("{}{}s".format(n[2].lower(), n[3:]), "{}s".format(n)) for n in sub_factory_classes ),
+ xid_generator=True)
for i in self.interfaces:
for n, factory in factories.items():
@@ -421,7 +422,7 @@
return True
-class OFFactory(namedtuple("OFFactory", ("package", "name", "members", "remove_prefix", "base_class", "sub_factories"))):
+class OFFactory(namedtuple("OFFactory", ("package", "name", "members", "remove_prefix", "base_class", "sub_factories", "xid_generator"))):
@property
def factory_classes(self):
return [ OFFactoryClass(
@@ -624,6 +625,10 @@
def writeable_members(self):
return [ m for m in self.members if m.is_writeable ]
+ @memoize
+ def member_by_name(self, name):
+ return find(lambda m: m.name == name, self.members)
+
@property
@memoize
def members(self):
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/XidGenerator.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/XidGenerator.java
index 65976dc..2ee2764 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/XidGenerator.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/XidGenerator.java
@@ -1,5 +1,5 @@
package org.projectfloodlight.openflow.protocol;
public interface XidGenerator {
- int nextXid();
+ long nextXid();
}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/XidGenerators.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/XidGenerators.java
new file mode 100644
index 0000000..4609afa
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/XidGenerators.java
@@ -0,0 +1,38 @@
+package org.projectfloodlight.openflow.protocol;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class XidGenerators {
+ private static final XidGenerator GLOBAL_XID_GENERATOR = new StandardXidGenerator();
+
+ public static XidGenerator create() {
+ return new StandardXidGenerator();
+ }
+
+ public static XidGenerator global() {
+ return GLOBAL_XID_GENERATOR;
+ }
+}
+
+class StandardXidGenerator implements XidGenerator {
+
+ private final AtomicLong xidGen = new AtomicLong();
+ long MAX_XID = 0xFFffFFffL;
+
+ @Override
+ public long nextXid() {
+ long xid;
+ do {
+ xid = xidGen.incrementAndGet();
+ if(xid > MAX_XID) {
+ synchronized(this) {
+ if(xidGen.get() > MAX_XID) {
+ xidGen.set(0);
+ }
+ }
+ }
+ } while(xid > MAX_XID);
+ return xid;
+ }
+
+}
\ No newline at end of file
diff --git a/java_gen/templates/of_factory_class.java b/java_gen/templates/of_factory_class.java
index 86b092a..5263226 100644
--- a/java_gen/templates/of_factory_class.java
+++ b/java_gen/templates/of_factory_class.java
@@ -40,7 +40,10 @@
public class ${factory.name} implements ${factory.interface.name} {
public final static ${factory.name} INSTANCE = new ${factory.name}();
- private ${factory.name}() {}
+
+ //:: if factory.interface.xid_generator:
+ private final XidGenerator xidGenerator = XidGenerators.global();
+ //:: #endif
//:: for name, clazz in factory.interface.sub_factories.items():
public ${clazz} ${name}() {
@@ -59,7 +62,7 @@
//:: if len(i.writeable_members) > 0:
public ${i.name}.Builder ${factory.interface.method_name(i, builder=True)}() {
//:: if i.has_version(factory.version) and model.generate_class(i.versioned_class(factory.version)):
- return new ${i.versioned_class(factory.version).name}.Builder();
+ return new ${i.versioned_class(factory.version).name}.Builder()${".setXid(nextXid())" if i.member_by_name("xid") else ""};
//:: else:
throw new UnsupportedOperationException("${i.name} not supported in version ${factory.version}");
//:: #endif
@@ -72,12 +75,12 @@
//:: general_get_match_func_written = True
//:: #endif
//:: if len(i.writeable_members) <= 2:
- public ${i.name} ${factory.interface.method_name(i, builder=False)}(${", ".join("%s %s" % (p.java_type.public_type, p.name) for p in i.writeable_members)}) {
+ public ${i.name} ${factory.interface.method_name(i, builder=False)}(${", ".join("%s %s" % (p.java_type.public_type, p.name) for p in i.writeable_members if p.name != "xid" )}) {
//:: if i.has_version(factory.version) and model.generate_class(i.versioned_class(factory.version)):
//:: if len(i.writeable_members) > 0:
return new ${i.versioned_class(factory.version).name}(
${",\n ".join(
- [ prop.name for prop in i.versioned_class(factory.version).data_members])}
+ [ prop.name if prop.name != "xid" else "nextXid()" for prop in i.versioned_class(factory.version).data_members])}
);
//:: else:
return ${i.versioned_class(factory.version).name}.INSTANCE;
@@ -155,5 +158,10 @@
}
}
//:: #endif
+//:: if factory.interface.xid_generator:
+ public long nextXid() {
+ return xidGenerator.nextXid();
+ }
+//:: #endif
}
diff --git a/java_gen/templates/of_factory_interface.java b/java_gen/templates/of_factory_interface.java
index 634362d..48ea34a 100644
--- a/java_gen/templates/of_factory_interface.java
+++ b/java_gen/templates/of_factory_interface.java
@@ -36,7 +36,7 @@
//:: include("_imports.java")
-public interface ${factory.name} {
+public interface ${factory.name}${" extends XidGenerator" if factory.xid_generator else ""} {
// Subfactories
//:: for name, clazz in factory.sub_factories.items():
${clazz} ${name}();
@@ -50,7 +50,7 @@
${i.name}.Builder ${factory.method_name(i, builder=True)}()${ "" if i.is_universal else " throws UnsupportedOperationException"};
//:: #endif
//:: if len(i.writeable_members) <= 2:
- ${i.name} ${factory.method_name(i, builder=False )}(${", ".join("%s %s" % (p.java_type.public_type, p.name) for p in i.writeable_members)});
+ ${i.name} ${factory.method_name(i, builder=False )}(${", ".join("%s %s" % (p.java_type.public_type, p.name) for p in i.writeable_members if p.name != "xid" )});
//:: #endif
//:: #endfor
//:: if factory.name == 'OFFactory':
diff --git a/java_gen/templates/of_interface.java b/java_gen/templates/of_interface.java
index 8c9bf25..98d7b9e 100644
--- a/java_gen/templates/of_interface.java
+++ b/java_gen/templates/of_interface.java
@@ -50,7 +50,7 @@
//:: for prop in msg.members:
${prop.java_type.public_type} ${prop.getter_name}()${ "" if prop.is_universal else " throws UnsupportedOperationException"};
//:: if prop.is_writeable:
- Builder ${prop.setter_name}(${prop.java_type.public_type} ${prop.name})${ "" if prop.is_universal else " throws UnsupportedOperationException"};
+ Builder${msg.type_variable} ${prop.setter_name}(${prop.java_type.public_type} ${prop.name})${ "" if prop.is_universal else " throws UnsupportedOperationException"};
//:: #endif
//:: #endfor
}