From 50522d6a8cb325c7441db50d925beccc7bd4a2f5 Mon Sep 17 00:00:00 2001 From: "moandji.ezana" Date: Thu, 2 Jul 2015 08:22:31 +0200 Subject: [PATCH] Include final fields but ignore constants --- README.md | 2 +- .../moandjiezana/toml/ObjectValueWriter.java | 37 +++++++++---------- .../com/moandjiezana/toml/TomlWriterTest.java | 17 +++------ 3 files changed, 24 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 127a9da..994283f 100644 --- a/README.md +++ b/README.md @@ -235,7 +235,7 @@ toml.containsTableArray("a"); // false ### Converting Objects To TOML -You can write any arbitrary object to a TOML `String`, `File`, `Writer`, or `OutputStream` with a `TomlWriter`. Each TomlWriter instance is customisable, immutable and threadsafe, so it can be reused and passed around. +You can write any arbitrary object to a TOML `String`, `File`, `Writer`, or `OutputStream` with a `TomlWriter`. Each TomlWriter instance is customisable, immutable and threadsafe, so it can be reused and passed around. Constants are ignored. ```java class AClass { diff --git a/src/main/java/com/moandjiezana/toml/ObjectValueWriter.java b/src/main/java/com/moandjiezana/toml/ObjectValueWriter.java index 68dbf6b..9bd08c3 100644 --- a/src/main/java/com/moandjiezana/toml/ObjectValueWriter.java +++ b/src/main/java/com/moandjiezana/toml/ObjectValueWriter.java @@ -5,6 +5,7 @@ import static com.moandjiezana.toml.MapValueWriter.MAP_VALUE_WRITER; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Arrays; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; @@ -21,7 +22,7 @@ class ObjectValueWriter implements ValueWriter { @Override public void write(Object value, WriterContext context) { Map to = new LinkedHashMap(); - Set fields = getFieldsForClass(value.getClass()); + Set fields = getFields(value.getClass()); for (Field field : fields) { to.put(field.getName(), getFieldValue(field, value)); } @@ -34,32 +35,28 @@ class ObjectValueWriter implements ValueWriter { return false; } - static private Set getFieldsForClass(Class cls) { + private static Set getFields(Class cls) { Set fields = new LinkedHashSet(Arrays.asList(cls.getDeclaredFields())); + while (cls != Object.class) { + fields.addAll(Arrays.asList(cls.getDeclaredFields())); + cls = cls.getSuperclass(); + } + removeConstantsAndSyntheticFields(fields); - getSuperClassFields(cls.getSuperclass(), fields); + return fields; + } - // Skip final fields - Set prunedFields = new LinkedHashSet(); - for (Field field : fields) { - if (!Modifier.isFinal(field.getModifiers())) { - prunedFields.add(field); + private static void removeConstantsAndSyntheticFields(Set fields) { + Iterator iterator = fields.iterator(); + while (iterator.hasNext()) { + Field field = iterator.next(); + if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic()) { + iterator.remove(); } } - - return prunedFields; } - static private void getSuperClassFields(Class cls, Set fields) { - if (cls == Object.class) { - return; - } - - fields.addAll(Arrays.asList(cls.getDeclaredFields())); - getSuperClassFields(cls.getSuperclass(), fields); - } - - static private Object getFieldValue(Field field, Object o) { + private static Object getFieldValue(Field field, Object o) { boolean isAccessible = field.isAccessible(); field.setAccessible(true); Object value = null; diff --git a/src/test/java/com/moandjiezana/toml/TomlWriterTest.java b/src/test/java/com/moandjiezana/toml/TomlWriterTest.java index 17ee96c..cbca1f8 100644 --- a/src/test/java/com/moandjiezana/toml/TomlWriterTest.java +++ b/src/test/java/com/moandjiezana/toml/TomlWriterTest.java @@ -41,21 +41,16 @@ public class TomlWriterTest { @Test public void should_write_primitive_types() { class TestClass { - public String aString; - int anInt; - protected float aFloat; - private double aDouble; - boolean aBoolean; - final int aFinalInt = 1; // Should be skipped + public String aString = "hello"; + int anInt = 4; + protected float aFloat = 1.23f; + private double aDouble = -5.43; + final boolean aBoolean = false; + static final int aFinalInt = 1; // Should be skipped Date aDate; } TestClass o = new TestClass(); - o.aString = "hello"; - o.anInt = 4; - o.aFloat = 1.23f; - o.aDouble = -5.43; - o.aBoolean = false; Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Africa/Johannesburg")); calendar.set(2015, Calendar.JULY, 1, 11, 5, 30);