java_gen: make OFFactory be a XidGenerator
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
     }