Only make primary key protobuf fields required

The primary key is extremely hard to change, so make it required
as the fields must all be not null and populated in order to have
a valid entity.

Other fields may have been added after instances of the entity were
already created. Permit those to be optional, so existing data does
not have to be modified before being used with the new definition.

Change-Id: I1865dffda7a5a4004fd77aa0a37aa1e3ae20976f
diff --git a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
index 82d804a..e0e47e4 100644
--- a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
+++ b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
@@ -77,6 +77,9 @@
 
     seen.clear();
     for (RelationModel r : rels) {
+      generateMessage(r.getPrimaryKey().getField(), out, true);
+    }
+    for (RelationModel r : rels) {
       generateMessage(r, out);
     }
 
@@ -94,20 +97,24 @@
   private void generateMessage(RelationModel rel, PrintWriter out) {
     List<ColumnModel> cols = sortColumns(rel.getFields());
     for (ColumnModel c : cols) {
-      generateMessage(c, out);
+      generateMessage(c, out, false);
     }
 
+    ColumnModel pk = rel.getPrimaryKey().getField();
     out.print("message " + getMessageName(rel) + " {\n");
     for (ColumnModel c : cols) {
       out.append("\t");
-      out.append(c.isNotNull() ? "required" : "optional");
-      out.append(" " + getType(c) + " " + getName(c) + " = "
-          + c.getColumnID() + ";\n");
+      out.append(pk.equals(c) ? "required" : "optional");
+      out.append(" ").append(getType(c)).append(" ");
+      out.append(getName(c));
+      out.append(" = ").append(Integer.toString(c.getColumnID()));
+      out.append(";\n");
     }
     out.print("}\n\n");
   }
 
-  private void generateMessage(ColumnModel parent, PrintWriter out) {
+  private void generateMessage(ColumnModel parent, PrintWriter out,
+      boolean required) {
     // Handle base cases
     if (!parent.isNested()) {
       return;
@@ -117,16 +124,17 @@
 
     List<ColumnModel> children = sortColumns(parent.getNestedColumns());
     for (ColumnModel child : children) {
-      generateMessage(child, out);
+      generateMessage(child, out, required);
     }
 
     out.print("message " + getType(parent) + " {\n");
     for (ColumnModel child : children) {
       out.append("\t");
-      out.append(child.isNotNull() ? "required" : "optional");
-      out.append(" " + getType(child) + " "
-          + Util.makeSqlFriendly(child.getFieldName()) + " = "
-          + child.getColumnID() + ";\n");
+      out.append(required ? "required" : "optional");
+      out.append(" ").append(getType(child)).append(" ");
+      out.append(Util.makeSqlFriendly(child.getFieldName()));
+      out.append(" = ").append(Integer.toString(child.getColumnID()));
+      out.append(";\n");
     }
     out.print("}\n\n");