2015-06-01 04:08:42 +00:00
|
|
|
package com.moandjiezana.toml;
|
|
|
|
|
2015-06-29 07:57:05 +00:00
|
|
|
import static com.moandjiezana.toml.MapValueWriter.MAP_VALUE_WRITER;
|
|
|
|
|
2015-06-01 04:08:42 +00:00
|
|
|
import java.lang.reflect.Field;
|
|
|
|
import java.lang.reflect.Modifier;
|
2015-06-29 07:57:05 +00:00
|
|
|
import java.util.Arrays;
|
2015-07-02 06:22:31 +00:00
|
|
|
import java.util.Iterator;
|
2015-06-29 07:57:05 +00:00
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
import java.util.LinkedHashSet;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
2015-06-01 04:08:42 +00:00
|
|
|
|
2015-06-27 19:50:15 +00:00
|
|
|
class ObjectValueWriter implements ValueWriter {
|
|
|
|
static final ValueWriter OBJECT_VALUE_WRITER = new ObjectValueWriter();
|
2015-06-25 15:01:34 +00:00
|
|
|
|
|
|
|
@Override
|
2015-06-27 19:50:15 +00:00
|
|
|
public boolean canWrite(Object value) {
|
2015-06-25 15:01:34 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2015-06-27 19:50:15 +00:00
|
|
|
public void write(Object value, WriterContext context) {
|
2015-06-25 15:01:34 +00:00
|
|
|
Map<String, Object> to = new LinkedHashMap<String, Object>();
|
2015-07-02 06:22:31 +00:00
|
|
|
Set<Field> fields = getFields(value.getClass());
|
2015-06-25 15:01:34 +00:00
|
|
|
for (Field field : fields) {
|
|
|
|
to.put(field.getName(), getFieldValue(field, value));
|
2015-06-01 04:08:42 +00:00
|
|
|
}
|
|
|
|
|
2015-06-27 19:50:15 +00:00
|
|
|
MAP_VALUE_WRITER.write(to, context);
|
2015-06-25 15:01:34 +00:00
|
|
|
}
|
2015-06-01 04:08:42 +00:00
|
|
|
|
2015-06-25 15:01:34 +00:00
|
|
|
@Override
|
|
|
|
public boolean isPrimitiveType() {
|
|
|
|
return false;
|
|
|
|
}
|
2015-06-01 04:08:42 +00:00
|
|
|
|
2015-07-02 06:22:31 +00:00
|
|
|
private static Set<Field> getFields(Class<?> cls) {
|
2015-06-25 15:01:34 +00:00
|
|
|
Set<Field> fields = new LinkedHashSet<Field>(Arrays.asList(cls.getDeclaredFields()));
|
2015-07-02 06:22:31 +00:00
|
|
|
while (cls != Object.class) {
|
|
|
|
fields.addAll(Arrays.asList(cls.getDeclaredFields()));
|
|
|
|
cls = cls.getSuperclass();
|
2015-06-01 04:08:42 +00:00
|
|
|
}
|
2015-07-02 06:22:31 +00:00
|
|
|
removeConstantsAndSyntheticFields(fields);
|
2015-06-01 04:08:42 +00:00
|
|
|
|
2015-07-02 06:22:31 +00:00
|
|
|
return fields;
|
2015-06-25 15:01:34 +00:00
|
|
|
}
|
2015-06-01 04:08:42 +00:00
|
|
|
|
2015-07-02 06:22:31 +00:00
|
|
|
private static void removeConstantsAndSyntheticFields(Set<Field> fields) {
|
|
|
|
Iterator<Field> iterator = fields.iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
Field field = iterator.next();
|
2016-06-14 23:51:22 +00:00
|
|
|
if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic() || Modifier.isTransient(field.getModifiers())) {
|
2015-07-02 06:22:31 +00:00
|
|
|
iterator.remove();
|
|
|
|
}
|
2015-06-01 04:08:42 +00:00
|
|
|
}
|
2015-06-25 15:01:34 +00:00
|
|
|
}
|
|
|
|
|
2015-07-02 06:22:31 +00:00
|
|
|
private static Object getFieldValue(Field field, Object o) {
|
2015-06-25 15:01:34 +00:00
|
|
|
boolean isAccessible = field.isAccessible();
|
|
|
|
field.setAccessible(true);
|
|
|
|
Object value = null;
|
|
|
|
try {
|
|
|
|
value = field.get(o);
|
|
|
|
} catch (IllegalAccessException ignored) {
|
2015-06-01 04:08:42 +00:00
|
|
|
}
|
2015-06-25 15:01:34 +00:00
|
|
|
field.setAccessible(isAccessible);
|
|
|
|
|
|
|
|
return value;
|
|
|
|
}
|
2015-06-27 21:35:26 +00:00
|
|
|
|
|
|
|
private ObjectValueWriter() {}
|
2015-06-01 04:08:42 +00:00
|
|
|
}
|