Repository: wicket Updated Branches: refs/heads/WICKET-6318-configurable-property-expression-resolver 3a6db1bf7 -> fa0f12624
WICKET-6313 simplified IPropertyExpressionResolver, keeping one CachingPropertyLocator per OGNLPropertyExpressionResolver instance, javadoc Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ede069b9 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ede069b9 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ede069b9 Branch: refs/heads/WICKET-6318-configurable-property-expression-resolver Commit: ede069b9b9617eb96b1705ab3515cc5ebe530279 Parents: 3a6db1b Author: Pedro Henrique Oliveira dos Santos <[email protected]> Authored: Mon Feb 13 03:13:53 2017 -0200 Committer: Pedro Henrique Oliveira dos Santos <[email protected]> Committed: Mon Feb 13 03:13:53 2017 -0200 ---------------------------------------------------------------------- .../util/lang/IPropertyExpressionResolver.java | 31 +++++++++- .../core/util/lang/IPropertyResolver.java | 8 +++ .../lang/OGNLPropertyExpressionResolver.java | 63 +++++++------------- .../wicket/core/util/lang/PropertyResolver.java | 12 ++-- .../util/parser/PropertyExpressionResolver.java | 13 +--- .../OGNLPropertyExpressionResolverTest.java | 14 ++--- 6 files changed, 76 insertions(+), 65 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java index 18c8141..4574be2 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyExpressionResolver.java @@ -1,12 +1,37 @@ package org.apache.wicket.core.util.lang; +import org.apache.wicket.core.util.reflection.ObjectWithGetAndSet; + +/** + * Resolves property expression to workable {@link ObjectWithGetAndSet} + * + * @author pedro + */ public interface IPropertyExpressionResolver { - <T> T getValue(String expression, T object); - - <T> Class<T> getPropertyClass(String expression, Object object, Class<?> targetClass); + /** + * @param expression + * @param object + * Optional, but will enable the resolver to find subclasses in polymorphic types + * @param clz + * @return {@link ObjectWithGetAndSet} + */ + ObjectWithGetAndSet resolve(String expression, Object object, Class<? extends Object> clz); + /** + * Creates a new value to each null property in the way to the expressed property. So the + * property expression: "attr1.attr2.attr3" would have "attr1" and "attr2" tested for null, in + * which case they would get new constructed values to guarantee a place to set the new value at + * "attr3" + * + * @param expression + * @param object + * @param value + * @param prc + */ + // TODO find a better name, multiple values are being setting here + // TODO if possible, to move to PropertyExpression void setValue(String expression, Object object, Object value, PropertyResolverConverter prc); } http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java index e72a29e..65b7cdb 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/IPropertyResolver.java @@ -2,6 +2,14 @@ package org.apache.wicket.core.util.lang; import org.apache.wicket.core.util.reflection.IGetAndSet; +/** + * Resolves a property string to an {@link IGetAndSet}. + * + * @see {@link IPropertyExpressionResolver} Property expression are resolved by + * {@link IPropertyExpressionResolver} implementations instead + * + * @author pedro + */ public interface IPropertyResolver { http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java index 76f5814..085adb3 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/OGNLPropertyExpressionResolver.java @@ -26,8 +26,6 @@ import org.apache.wicket.core.util.reflection.CachingPropertyLocator; import org.apache.wicket.core.util.reflection.IGetAndSet; import org.apache.wicket.core.util.reflection.ObjectWithGetAndSet; import org.apache.wicket.util.string.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class parses expressions to lookup or set a value on the object that is given. <br/> @@ -65,15 +63,11 @@ import org.slf4j.LoggerFactory; public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolver { - - /** Log. */ - private static final Logger log = LoggerFactory.getLogger(PropertyResolver.class); - private final static int RETURN_NULL = 0; private final static int CREATE_NEW_VALUE = 1; private final static int RESOLVE_CLASS = 2; - private static IPropertyResolver locator = new CachingPropertyLocator( new DefaultPropertyLocator()); + private IPropertyResolver locator = new CachingPropertyLocator( new DefaultPropertyLocator()); /** @@ -86,14 +80,9 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv * The object which is evaluated. * @return The value that is evaluated. Null something in the expression evaluated to null. */ - @Override - public Object getValue(final String expression, final Object object) + //TODO remove, only being used in tests + public Object getValue(final String expression, final Object object) { - if (expression == null || expression.equals("") || object == null) - { - return object; - } - ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object, RETURN_NULL); if (objectWithGetAndSet == null) @@ -152,27 +141,6 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv } /** - * @param <T> - * @param expression - * @param clz - * @return class of the target Class property expression - * @throws WicketRuntimeException - * if class cannot be resolved - */ - @Override - @SuppressWarnings("unchecked") - public <T> Class<T> getPropertyClass(final String expression, Object object, final Class<?> clz) - { - ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object, - RESOLVE_CLASS, clz); - if (objectWithGetAndSet == null) - { - throw new WicketRuntimeException("No Class returned for expression: " + expression - + " for getting the target class of: " + clz); - } - return (Class<T>)objectWithGetAndSet.getTargetClass(); - } - /** * @param expression * @param object @@ -180,7 +148,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv * @throws WicketRuntimeException * if there is no such field */ - public static Field getPropertyField(final String expression, final Object object) + public Field getPropertyField(final String expression, final Object object) { ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object, RESOLVE_CLASS); @@ -199,7 +167,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv * @throws WicketRuntimeException * if there is no getter method */ - public static Method getPropertyGetter(final String expression, final Object object) + public Method getPropertyGetter(final String expression, final Object object) { ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object, RESOLVE_CLASS); @@ -218,7 +186,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv * @throws WicketRuntimeException * if there is no setter method */ - public static Method getPropertySetter(final String expression, final Object object) + public Method getPropertySetter(final String expression, final Object object) { ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object, RESOLVE_CLASS); @@ -230,6 +198,19 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv return objectWithGetAndSet.getSetter(); } + @Override + public ObjectWithGetAndSet resolve(String expression, Object object, Class<? extends Object> clz) + { + ObjectWithGetAndSet objectWithGetAndSet = getObjectWithGetAndSet(expression, object, + RESOLVE_CLASS, clz); + if (objectWithGetAndSet == null) + { + throw new WicketRuntimeException("Null object returned for expression: " + expression + + " for getting the target class of: " + clz); + } + return objectWithGetAndSet; + } + /** * Just delegating the call to the original getObjectAndGetSetter passing the object type as * parameter. @@ -239,7 +220,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv * @param tryToCreateNull * @return {@link ObjectWithGetAndSet} */ - private static ObjectWithGetAndSet getObjectWithGetAndSet(final String expression, + private ObjectWithGetAndSet getObjectWithGetAndSet(final String expression, final Object object, int tryToCreateNull) { return getObjectWithGetAndSet(expression, object, tryToCreateNull, object.getClass()); @@ -260,7 +241,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv * @return final getAndSet and the target to apply it on, or {@code null} if expression results * in an intermediate null */ - private static ObjectWithGetAndSet getObjectWithGetAndSet(final String expression, + private ObjectWithGetAndSet getObjectWithGetAndSet(final String expression, final Object object, final int tryToCreateNull, Class<?> clz) { String expressionBracketsSeperated = Strings.replaceAll(expression, "[", ".[").toString(); @@ -376,7 +357,7 @@ public class OGNLPropertyExpressionResolver implements IPropertyExpressionResolv return -1; } - private static IGetAndSet getGetAndSet(String exp, final Class<?> clz) + private IGetAndSet getGetAndSet(String exp, final Class<?> clz) { IGetAndSet getAndSet = locator.get(clz, exp); http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java index ad4063f..b7f87dc 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/lang/PropertyResolver.java @@ -27,15 +27,19 @@ public final class PropertyResolver public static <T> T getValue(String expression, T object) { - return Application.get().getApplicationSettings().getPropertyExpressionResolver() - .getValue(expression, object); + if (expression == null || expression.equals("") || object == null) + { + return object; + } + IPropertyExpressionResolver propertyExpressionResolver = Application.get().getApplicationSettings().getPropertyExpressionResolver(); + return (T)propertyExpressionResolver.resolve(expression, object, object.getClass()).getValue(); } public static <T> Class<T> getPropertyClass(String expression, Object object, Class<?> targetClass) { - return Application.get().getApplicationSettings().getPropertyExpressionResolver() - .getPropertyClass(expression, object, targetClass); + IPropertyExpressionResolver propertyExpressionResolver = Application.get().getApplicationSettings().getPropertyExpressionResolver(); + return (Class<T>)propertyExpressionResolver.resolve(expression, object, targetClass).getTargetClass(); } public static void setValue(String expression, Object object, Object value, http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java b/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java index 22049d2..fd976aa 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/parser/PropertyExpressionResolver.java @@ -2,27 +2,20 @@ package org.apache.wicket.core.util.parser; import org.apache.wicket.core.util.lang.IPropertyExpressionResolver; import org.apache.wicket.core.util.lang.PropertyResolverConverter; +import org.apache.wicket.core.util.reflection.ObjectWithGetAndSet; public class PropertyExpressionResolver implements IPropertyExpressionResolver { - @Override - public <T> T getValue(String expression, T object) + public ObjectWithGetAndSet resolve(String expression, Object object, Class<? extends Object> clz) { return null; } @Override - public <T> Class<T> getPropertyClass(String expression, Object object, Class<?> targetClass) + public void setValue(String expression, Object object, Object value, PropertyResolverConverter prc) { - return null; - } - @Override - public void setValue(String expression, Object object, Object value, - PropertyResolverConverter prc) - { - } } http://git-wip-us.apache.org/repos/asf/wicket/blob/ede069b9/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java b/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java index f371496..6168142 100644 --- a/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java @@ -457,20 +457,20 @@ public class OGNLPropertyExpressionResolverTest extends WicketTestCase { Address address = new Address(); - Class<?> clazz = ognlResolver.getPropertyClass("number", address, address.getClass()); + Class<?> clazz = ognlResolver.resolve("number", address, address.getClass()).getTargetClass(); assertEquals(int.class, clazz); Person person = new Person(); person.setAddress(new Address()); - clazz = ognlResolver.getPropertyClass("address.number", person, person.getClass()); + clazz = ognlResolver.resolve("address.number", person, person.getClass()).getTargetClass(); assertEquals(int.class, clazz); person.setAddressArray(new Address[] { new Address(), new Address() }); - clazz = ognlResolver.getPropertyClass("addressArray[0]", person, person.getClass()); + clazz = ognlResolver.resolve("addressArray[0]", person, person.getClass()).getTargetClass(); assertEquals(Address.class, clazz); - clazz = ognlResolver.getPropertyClass("addressArray[0].number", person, person.getClass()); + clazz = ognlResolver.resolve("addressArray[0].number", person, person.getClass()).getTargetClass(); assertEquals(int.class, clazz); } @@ -605,10 +605,10 @@ public class OGNLPropertyExpressionResolverTest extends WicketTestCase { Person person = new Person(); assertEquals(String.class, - ognlResolver.getPropertyClass("country.name", person, person.getClass())); + ognlResolver.resolve("country.name", person, person.getClass()).getTargetClass()); try { - ognlResolver.getPropertyClass("country.subCountry.name", person, person.getClass()); + ognlResolver.resolve("country.subCountry.name", person, person.getClass()).getTargetClass(); fail("country.subCountry shouldnt be found"); } catch (Exception e) @@ -616,7 +616,7 @@ public class OGNLPropertyExpressionResolverTest extends WicketTestCase } person.setCountry(new Country2("test", new Country("test"))); - ognlResolver.getPropertyClass("country.subCountry.name", person, person.getClass()); + ognlResolver.resolve("country.subCountry.name", person, person.getClass()).getTargetClass(); } /**
