Sort field names whenever using Class.getDeclaredFields()

This preserves ordering of fields coming out of the proto generator
without doing a global ordering, which doesn't play well with columns
belonging to nested fields in SQL.

Change-Id: I4dc9822ff7552450e8e13bd6abd9719dbf7de1a9
diff --git a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
index bce9e53..d019c97 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
@@ -114,7 +114,7 @@
   private static JavaColumnModel[] scanFields(Class<?> in) throws OrmException {
     final Collection<JavaColumnModel> col = new ArrayList<JavaColumnModel>();
     while (in != null) {
-      for (final Field f : in.getDeclaredFields()) {
+      for (final Field f : JavaColumnModel.getDeclaredFields(in)) {
         if (f.getAnnotation(Column.class) != null) {
           col.add(new JavaColumnModel(f));
         }
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
index 2c5c0cc..6b7680b 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
@@ -14,6 +14,8 @@
 
 package com.google.gwtorm.schema.java;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Ordering;
 import com.google.gwtorm.client.Column;
 import com.google.gwtorm.client.RowVersion;
 import com.google.gwtorm.schema.ColumnModel;
@@ -25,10 +27,20 @@
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 
 public class JavaColumnModel extends ColumnModel {
+  public static List<Field> getDeclaredFields(Class<?> in) {
+    return Ordering.natural().onResultOf(new Function<Field, String>() {
+      @Override
+      public String apply(Field f) {
+        return f.getName();
+      }
+    }).sortedCopy(Arrays.asList(in.getDeclaredFields()));
+  }
+
   private final Field field;
   private final String fieldName;
   private final Class<?> primitiveType;
@@ -76,7 +88,7 @@
       final List<JavaColumnModel> col = new ArrayList<JavaColumnModel>();
       Class<?> in = primitiveType;
       while (in != null) {
-        for (final Field f : in.getDeclaredFields()) {
+        for (final Field f : getDeclaredFields(in)) {
           if (f.getAnnotation(Column.class) != null) {
             col.add(new JavaColumnModel(f));
           }
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
index 81cbd2c..8f2020e 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
@@ -65,7 +65,7 @@
     final List<JavaColumnModel> col = new ArrayList<JavaColumnModel>();
     Class<?> in = entityType;
     while (in != null) {
-      for (final Field f : in.getDeclaredFields()) {
+      for (final Field f : JavaColumnModel.getDeclaredFields(in)) {
         if (f.getAnnotation(Column.class) != null) {
           col.add(new JavaColumnModel(f));
         }