From e560f8e0fa01c69ab4bbceb7cbe696c8dddcdb5c Mon Sep 17 00:00:00 2001 From: fullwall Date: Sun, 14 Jul 2013 00:32:38 +0800 Subject: [PATCH] PersistenceLoader now works with enums in the generic types of fields, fix NPE in ScriptCompiler --- .../api/command/CommandManager.java | 6 +-- .../api/persistence/PersistenceLoader.java | 39 ++++++++++++------- .../api/scripting/ScriptCompiler.java | 2 +- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/citizensnpcs/api/command/CommandManager.java b/src/main/java/net/citizensnpcs/api/command/CommandManager.java index e0baddfe..3dd9b4a1 100644 --- a/src/main/java/net/citizensnpcs/api/command/CommandManager.java +++ b/src/main/java/net/citizensnpcs/api/command/CommandManager.java @@ -423,9 +423,6 @@ public int hashCode() { } } - // Logger for general errors. - private static final Logger logger = Logger.getLogger(CommandManager.class.getCanonicalName()); - private static int getLevenshteinDistance(String s, String t) { if (s == null || t == null) throw new IllegalArgumentException("Strings must not be null"); @@ -474,4 +471,7 @@ else if (m == 0) // actually has the most recent cost counts return p[n]; } + + // Logger for general errors. + private static final Logger logger = Logger.getLogger(CommandManager.class.getCanonicalName()); } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/api/persistence/PersistenceLoader.java b/src/main/java/net/citizensnpcs/api/persistence/PersistenceLoader.java index dc54cff8..ca5353a0 100644 --- a/src/main/java/net/citizensnpcs/api/persistence/PersistenceLoader.java +++ b/src/main/java/net/citizensnpcs/api/persistence/PersistenceLoader.java @@ -2,6 +2,7 @@ import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.Collection; import java.util.EnumSet; import java.util.Iterator; @@ -77,18 +78,6 @@ public void set(Object value) { private static final Object NULL = new Object(); } - private static final Map, Field[]> fieldCache = new WeakHashMap, Field[]>(); - private static final Map>, Persister> loadedDelegates = new WeakHashMap>, Persister>(); - private static final Exception loadException = new Exception() { - @SuppressWarnings("unused") - public void fillInStackTrace(StackTraceElement[] elements) { - } - - private static final long serialVersionUID = -4245839150826112365L; - }; - - private static final Map, Class>> persistRedirects = new WeakHashMap, Class>>(); - private static String createRelativeKey(String key, int ext) { return createRelativeKey(key, Integer.toString(ext)); } @@ -181,8 +170,9 @@ private static void deserialiseMap(Map map, DataKey root, Persis @SuppressWarnings({ "unchecked", "rawtypes" }) private static Object deserialiseValue(PersistField field, DataKey root) { - if (field.delegate == null && field.field.getType().isEnum()) { - Class clazz = (Class) field.getType(); + Class type = field.field.getType().isEnum() ? field.field.getType() : getGenericType(field.field); + if (field.delegate == null && type.isEnum()) { + Class clazz = (Class) type; Object obj = root.getRaw(""); if (obj instanceof String) { try { @@ -193,6 +183,7 @@ private static Object deserialiseValue(PersistField field, DataKey root) { } } return field.delegate == null ? root.getRaw("") : field.delegate.create(root); + } private static void ensureDelegateLoaded(Class> delegateClass) { @@ -253,6 +244,13 @@ private static Field[] getFieldsFromClass(Class clazz) { return toFilter.toArray(new Field[toFilter.size()]); } + private static Class getGenericType(Field field) { + if (field.getGenericType() == null || !(field.getGenericType() instanceof ParameterizedType)) + return field.getType(); + Type[] args = ((ParameterizedType) field.getGenericType()).getActualTypeArguments(); + return args.length > 0 && args[0] instanceof Class ? (Class) args[0] : field.getType(); + } + /** * Creates an instance of the given class using the default constructor and * loads it using {@link #load(Object, DataKey)}. Will return null if an @@ -369,12 +367,23 @@ private static void serialise(PersistField field, DataKey root) { private static void serialiseValue(PersistField field, DataKey root, Object value) { if (field.delegate != null) { ((Persister) field.delegate).save(value, root); - } else if (field.getType().isEnum()) { + } else if (value instanceof Enum) { root.setRaw("", ((Enum) value).name()); } else root.setRaw("", value); } + private static final Map, Field[]> fieldCache = new WeakHashMap, Field[]>(); + private static final Map>, Persister> loadedDelegates = new WeakHashMap>, Persister>(); + private static final Exception loadException = new Exception() { + @SuppressWarnings("unused") + public void fillInStackTrace(StackTraceElement[] elements) { + } + + private static final long serialVersionUID = -4245839150826112365L; + }; + private static final Map, Class>> persistRedirects = new WeakHashMap, Class>>(); + static { registerPersistDelegate(Location.class, LocationPersister.class); } diff --git a/src/main/java/net/citizensnpcs/api/scripting/ScriptCompiler.java b/src/main/java/net/citizensnpcs/api/scripting/ScriptCompiler.java index 4908e616..33e53de7 100644 --- a/src/main/java/net/citizensnpcs/api/scripting/ScriptCompiler.java +++ b/src/main/java/net/citizensnpcs/api/scripting/ScriptCompiler.java @@ -204,7 +204,7 @@ public ScriptFactory call() { public class CompileTaskBuilder { private boolean cache; - private List callbacks; + private final List callbacks = Lists.newArrayList(); private final List contextProviders = Lists.newArrayList(); private final SimpleScriptSource engine;