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));
}