Skip to content

Commit

Permalink
PersistenceLoader now works with enums in the generic types of fields…
Browse files Browse the repository at this point in the history
…, fix NPE in ScriptCompiler
  • Loading branch information
fullwall committed Jul 13, 2013
1 parent 90b4f1e commit e560f8e
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 19 deletions.
Expand Up @@ -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");
Expand Down Expand Up @@ -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());
}
Expand Up @@ -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;
Expand Down Expand Up @@ -77,18 +78,6 @@ public void set(Object value) {
private static final Object NULL = new Object();
}

private static final Map<Class<?>, Field[]> fieldCache = new WeakHashMap<Class<?>, Field[]>();
private static final Map<Class<? extends Persister<?>>, Persister<?>> loadedDelegates = new WeakHashMap<Class<? extends Persister<?>>, 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<?>, Class<? extends Persister<?>>> persistRedirects = new WeakHashMap<Class<?>, Class<? extends Persister<?>>>();

private static String createRelativeKey(String key, int ext) {
return createRelativeKey(key, Integer.toString(ext));
}
Expand Down Expand Up @@ -181,8 +170,9 @@ private static void deserialiseMap(Map<String, Object> map, DataKey root, Persis

@SuppressWarnings({ "unchecked", "rawtypes" })
private static Object deserialiseValue(PersistField field, DataKey root) {
if (field.delegate == null && field.field.getType().isEnum()) {
Class<? extends Enum> clazz = (Class<? extends Enum>) field.getType();
Class<?> type = field.field.getType().isEnum() ? field.field.getType() : getGenericType(field.field);
if (field.delegate == null && type.isEnum()) {
Class<? extends Enum> clazz = (Class<? extends Enum>) type;
Object obj = root.getRaw("");
if (obj instanceof String) {
try {
Expand All @@ -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<? extends Persister<?>> delegateClass) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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<Object>) 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<Class<?>, Field[]> fieldCache = new WeakHashMap<Class<?>, Field[]>();
private static final Map<Class<? extends Persister<?>>, Persister<?>> loadedDelegates = new WeakHashMap<Class<? extends Persister<?>>, 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<?>, Class<? extends Persister<?>>> persistRedirects = new WeakHashMap<Class<?>, Class<? extends Persister<?>>>();

static {
registerPersistDelegate(Location.class, LocationPersister.class);
}
Expand Down
Expand Up @@ -204,7 +204,7 @@ public ScriptFactory call() {

public class CompileTaskBuilder {
private boolean cache;
private List<CompileCallback> callbacks;
private final List<CompileCallback> callbacks = Lists.newArrayList();
private final List<ContextProvider> contextProviders = Lists.newArrayList();
private final SimpleScriptSource engine;

Expand Down

0 comments on commit e560f8e

Please sign in to comment.