mirror of
https://github.com/plexusorg/Plex.git
synced 2025-07-13 08:28:35 +00:00
add gson serializedname support for toml
This commit is contained in:
@ -1,67 +1,88 @@
|
||||
package dev.plex.toml;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.*;
|
||||
|
||||
class ObjectValueWriter implements ValueWriter
|
||||
{
|
||||
static final ValueWriter OBJECT_VALUE_WRITER = new ObjectValueWriter();
|
||||
static final ValueWriter OBJECT_VALUE_WRITER = new ObjectValueWriter();
|
||||
|
||||
@Override
|
||||
public boolean canWrite(Object value) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Object value, WriterContext context) {
|
||||
Map<String, Object> to = new LinkedHashMap<String, Object>();
|
||||
Set<Field> fields = getFields(value.getClass());
|
||||
for (Field field : fields) {
|
||||
to.put(field.getName(), getFieldValue(field, value));
|
||||
@Override
|
||||
public boolean canWrite(Object value)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
MapValueWriter.MAP_VALUE_WRITER.write(to, context);
|
||||
}
|
||||
@Override
|
||||
public void write(Object value, WriterContext context)
|
||||
{
|
||||
Map<String, Object> to = new LinkedHashMap<String, Object>();
|
||||
Set<Field> fields = getFields(value.getClass());
|
||||
for (Field field : fields)
|
||||
{
|
||||
if (field.isAnnotationPresent(SerializedName.class))
|
||||
{
|
||||
to.put(field.getDeclaredAnnotation(SerializedName.class).value(), getFieldValue(field, value));
|
||||
} else {
|
||||
to.put(field.getName(), getFieldValue(field, value));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPrimitiveType() {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static Set<Field> getFields(Class<?> cls) {
|
||||
Set<Field> fields = new LinkedHashSet<Field>(Arrays.asList(cls.getDeclaredFields()));
|
||||
while (cls != Object.class) {
|
||||
fields.addAll(Arrays.asList(cls.getDeclaredFields()));
|
||||
cls = cls.getSuperclass();
|
||||
MapValueWriter.MAP_VALUE_WRITER.write(to, context);
|
||||
}
|
||||
removeConstantsAndSyntheticFields(fields);
|
||||
|
||||
return fields;
|
||||
}
|
||||
|
||||
private static void removeConstantsAndSyntheticFields(Set<Field> fields) {
|
||||
Iterator<Field> iterator = fields.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
Field field = iterator.next();
|
||||
if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic() || Modifier.isTransient(field.getModifiers())) {
|
||||
iterator.remove();
|
||||
}
|
||||
@Override
|
||||
public boolean isPrimitiveType()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static Object getFieldValue(Field field, Object o) {
|
||||
boolean isAccessible = field.isAccessible();
|
||||
field.setAccessible(true);
|
||||
Object value = null;
|
||||
try {
|
||||
value = field.get(o);
|
||||
} catch (IllegalAccessException ignored) {
|
||||
private static Set<Field> getFields(Class<?> cls)
|
||||
{
|
||||
Set<Field> fields = new LinkedHashSet<Field>(Arrays.asList(cls.getDeclaredFields()));
|
||||
while (cls != Object.class)
|
||||
{
|
||||
fields.addAll(Arrays.asList(cls.getDeclaredFields()));
|
||||
cls = cls.getSuperclass();
|
||||
}
|
||||
removeConstantsAndSyntheticFields(fields);
|
||||
|
||||
return fields;
|
||||
}
|
||||
field.setAccessible(isAccessible);
|
||||
|
||||
return value;
|
||||
}
|
||||
private static void removeConstantsAndSyntheticFields(Set<Field> fields)
|
||||
{
|
||||
Iterator<Field> iterator = fields.iterator();
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
Field field = iterator.next();
|
||||
if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic() || Modifier.isTransient(field.getModifiers()))
|
||||
{
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ObjectValueWriter() {}
|
||||
private static Object getFieldValue(Field field, Object o)
|
||||
{
|
||||
boolean isAccessible = field.isAccessible();
|
||||
field.setAccessible(true);
|
||||
Object value = null;
|
||||
try
|
||||
{
|
||||
value = field.get(o);
|
||||
} catch (IllegalAccessException ignored)
|
||||
{
|
||||
}
|
||||
field.setAccessible(isAccessible);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
private ObjectValueWriter()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -3,9 +3,12 @@ package dev.plex.toml;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import lombok.Getter;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
/**
|
||||
* <p>Provides access to the keys and tables in a TOML data source.</p>
|
||||
|
Reference in New Issue
Block a user