From 4316301c513265e73ad49b72208f8c206bcef466 Mon Sep 17 00:00:00 2001 From: Abhinav Sarkar Date: Tue, 28 Jun 2011 16:53:31 +0530 Subject: [PATCH] Fixed the issue with cached evaluation context. Other minor fixes --- .../spelhelper/ExtensionFunctions.java | 2 +- .../ReadOnlyGenericPropertyAccessor.java | 2 +- .../abhinavsarkar/spelhelper/SpelHelper.java | 43 ++++++------------- .../abhinavsarkar/spelhelper/Functions.java | 15 ++++--- 4 files changed, 23 insertions(+), 39 deletions(-) diff --git a/src/main/java/net/abhinavsarkar/spelhelper/ExtensionFunctions.java b/src/main/java/net/abhinavsarkar/spelhelper/ExtensionFunctions.java index 6672e7c..c54e42e 100644 --- a/src/main/java/net/abhinavsarkar/spelhelper/ExtensionFunctions.java +++ b/src/main/java/net/abhinavsarkar/spelhelper/ExtensionFunctions.java @@ -85,7 +85,7 @@ public final class ExtensionFunctions { public static Map map(final List keys, final List values) { Assert.isTrue(keys.size() == values.size(), - "There should equal number of keys and values"); + "There should be equal number of keys and values"); Map map = new HashMap(); int length = keys.size(); for (int i = 0; i < length; i++) { diff --git a/src/main/java/net/abhinavsarkar/spelhelper/ReadOnlyGenericPropertyAccessor.java b/src/main/java/net/abhinavsarkar/spelhelper/ReadOnlyGenericPropertyAccessor.java index e109ead..6afee93 100644 --- a/src/main/java/net/abhinavsarkar/spelhelper/ReadOnlyGenericPropertyAccessor.java +++ b/src/main/java/net/abhinavsarkar/spelhelper/ReadOnlyGenericPropertyAccessor.java @@ -31,7 +31,7 @@ abstract class ReadOnlyGenericPropertyAccessor implements return false; } - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") public final Class[] getSpecificTargetClasses() { return null; } diff --git a/src/main/java/net/abhinavsarkar/spelhelper/SpelHelper.java b/src/main/java/net/abhinavsarkar/spelhelper/SpelHelper.java index 644e4b3..8b02365 100644 --- a/src/main/java/net/abhinavsarkar/spelhelper/SpelHelper.java +++ b/src/main/java/net/abhinavsarkar/spelhelper/SpelHelper.java @@ -125,11 +125,10 @@ public final class SpelHelper { static final String CONTEXT_LOOKUP_KEY = SpelHelper.class.getName(); - private static final ExpressionParser PARSER = new SpelExpressionParser(); + private final ExpressionParser PARSER = new SpelExpressionParser(); private static final ThreadLocal CURRENT_CONTEXT = new ThreadLocal(); - private EvaluationContext context; private final Set registeredFunctions = new HashSet(); private final Map registeredMethods = new ConcurrentHashMap(); @@ -177,9 +176,6 @@ public final class SpelHelper { */ public SpelHelper registerFunctionsFromClass(final Class clazz) { registeredFunctions.addAll(filterFunctions(clazz)); - synchronized (PARSER) { - context = null; - } return this; } @@ -194,7 +190,7 @@ public final class SpelHelper { for (Constructor constructor : asList(clazz.getConstructors())) { registeredConstructors.put( constructor.getDeclaringClass().getSimpleName() - + Arrays.toString(constructor.getParameterTypes()), + + Arrays.toString(constructor.getParameterTypes()), constructor); } return this; @@ -254,14 +250,8 @@ public final class SpelHelper { */ public T evalExpressions(final String[] expressionStrings, final Object rootElement, final Class desiredType) { - int length = expressionStrings.length; - Assert.isTrue(length > 0, - "expressionStrings should have length more than 0"); - for (int i = 0; i < length - 1; i++) { - evalExpression(expressionStrings[i], rootElement, Object.class); - } - return evalExpression(expressionStrings[length - 1], - rootElement, desiredType); + return evalExpressions( + expressionStrings, getEvaluationContext(rootElement), desiredType); } /** @@ -288,23 +278,16 @@ public final class SpelHelper { } private EvaluationContext getEvaluationContext(final Object rootObject) { - if (context == null) { - synchronized (PARSER) { - if (context == null) { - StandardEvaluationContext newContext = new StandardEvaluationContext(rootObject); - newContext.getMethodResolvers().add(new ImplicitMethodResolver()); - newContext.getPropertyAccessors().add(new ImplicitPropertyAccessor()); - newContext.setConstructorResolvers( - asList((ConstructorResolver) new ImplicitConstructorResolver())); - for (Method method : registeredFunctions) { - newContext.setVariable(method.getName(), method); - } - newContext.setVariable(CONTEXT_LOOKUP_KEY, this); - context = newContext; - } - } + StandardEvaluationContext newContext = new StandardEvaluationContext(rootObject); + newContext.getMethodResolvers().add(new ImplicitMethodResolver()); + newContext.getPropertyAccessors().add(new ImplicitPropertyAccessor()); + newContext.setConstructorResolvers( + asList((ConstructorResolver) new ImplicitConstructorResolver())); + for (Method method : registeredFunctions) { + newContext.setVariable(method.getName(), method); } - return context; + newContext.setVariable(CONTEXT_LOOKUP_KEY, this); + return newContext; } /** diff --git a/src/test/java/net/abhinavsarkar/spelhelper/Functions.java b/src/test/java/net/abhinavsarkar/spelhelper/Functions.java index 96a2d44..76e3efc 100644 --- a/src/test/java/net/abhinavsarkar/spelhelper/Functions.java +++ b/src/test/java/net/abhinavsarkar/spelhelper/Functions.java @@ -2,19 +2,19 @@ package net.abhinavsarkar.spelhelper; public final class Functions { - public static String test(String str) { + public static String test(final String str) { return str; } - static String testNonPublic(String str) { + static String testNonPublic(final String str) { return str; } - public String testNonStatic(String str) { + public String testNonStatic(final String str) { return str; } - public static void testVoid(String str) { + public static void testVoid(final String str) { return; } @@ -22,14 +22,15 @@ public final class Functions { return "a"; } - public static String testContext(String str) { - if (SpelHelper.getCurrentContext() == null) + public static String testContext(final String str) { + if (SpelHelper.getCurrentContext() == null) { throw new AssertionError(); + } return str; } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { return o instanceof Functions; } }