java_gen: correctly handle of_action 64-bit alignment

of_action is different from oxm in that it is 64 bit aligned,
but the alignment is contained in the length field.

Added optional parameter "length_includes_align" to the input files
to handle this situation.
diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index f2191c0..9f2bdc9 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -773,6 +773,10 @@
         return int(self.ir_class.params['align']) if 'align' in self.ir_class.params else 0
 
     @property
+    def length_includes_align(self):
+        return self.ir_class.params['length_includes_align'] == "True" if 'length_includes_align' in self.ir_class.params else False
+
+    @property
     @memoize
     def superclass(self):
         return find(lambda c: c.version == self.version and c.c_name == self.ir_class.superclass, model.all_classes)
diff --git a/java_gen/templates/of_class.java b/java_gen/templates/of_class.java
index ef927fd..46dc1ea 100644
--- a/java_gen/templates/of_class.java
+++ b/java_gen/templates/of_class.java
@@ -327,10 +327,13 @@
 //:: if not msg.is_fixed_length:
             // update length field
             int length = bb.writerIndex() - startIndex;
-            bb.setShort(lengthIndex, length);
+            //:: if msg.align:
+            int alignedLength = ((length + ${msg.align-1})/${msg.align} * ${msg.align});
+            //:: #endif
+            bb.setShort(lengthIndex, ${"alignedLength" if msg.length_includes_align else "length"});
             //:: if msg.align:
             // align message to ${msg.align} bytes
-            bb.writeZero( ((length + ${msg.align-1})/${msg.align} * ${msg.align}) - length);
+            bb.writeZero(alignedLength - length);
             //:: #endif
 //:: #end