Repository: wicket Updated Branches: refs/heads/WICKET-6318-configurable-property-expression-resolver [created] 3a6db1bf7
http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/MethodGetAndSet.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/MethodGetAndSet.java b/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/MethodGetAndSet.java new file mode 100644 index 0000000..6765dbf --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/MethodGetAndSet.java @@ -0,0 +1,243 @@ +package org.apache.wicket.core.util.reflection; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.wicket.WicketRuntimeException; +import org.apache.wicket.core.util.lang.PropertyResolverConverter; +import org.apache.wicket.util.convert.ConversionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class MethodGetAndSet extends AbstractGetAndSet +{ + private static final Logger log = LoggerFactory.getLogger(MethodGetAndSet.class); + public static final String GET = "get"; + public static final String IS = "is"; + public static final String SET = "set"; + + private final Method getMethod; + private final Method setMethod; + private final Field field; + + public MethodGetAndSet(Method getMethod, Method setMethod, Field field) + { + this.getMethod = getMethod; + this.getMethod.setAccessible(true); + this.field = field; + this.setMethod = setMethod; + } + + /** + * {@inheritDoc} + */ + @Override + public final Object getValue(final Object object) + { + Object ret; + try + { + ret = getMethod.invoke(object, (Object[])null); + } + catch (InvocationTargetException ex) + { + throw new WicketRuntimeException( + "Error calling method: " + getMethod + " on object: " + object, ex.getCause()); + } + catch (Exception ex) + { + throw new WicketRuntimeException( + "Error calling method: " + getMethod + " on object: " + object, ex); + } + return ret; + } + + /** + * @param object + * @param value + * @param converter + */ + @Override + public final void setValue(final Object object, final Object value, + PropertyResolverConverter converter) + { + Class<?> type = null; + if (setMethod != null) + { + // getMethod is always there and if the value will be set through a setMethod then + // the getMethod return type will be its type. Else we have to look at the + // parameters if the setter but getting the return type is quicker + type = getMethod.getReturnType(); + } + else if (field != null) + { + type = field.getType(); + } + + Object converted = null; + if (type != null) + { + converted = converter.convert(value, type); + if (converted == null) + { + if (value != null) + { + throw new ConversionException( + "Method [" + getMethod + "]. Can't convert value: " + value + " to class: " + + getMethod.getReturnType() + " for setting it on " + object); + } + else if (getMethod.getReturnType().isPrimitive()) + { + throw new ConversionException("Method [" + getMethod + + "]. Can't convert null value to a primitive class: " + + getMethod.getReturnType() + " for setting it on " + object); + } + } + } + + if (setMethod != null) + { + try + { + setMethod.invoke(object, converted); + } + catch (InvocationTargetException ex) + { + throw new WicketRuntimeException( + "Error calling method: " + setMethod + " on object: " + object, ex.getCause()); + } + catch (Exception ex) + { + throw new WicketRuntimeException( + "Error calling method: " + setMethod + " on object: " + object, ex); + } + } + else if (field != null) + { + try + { + field.set(object, converted); + } + catch (Exception ex) + { + throw new WicketRuntimeException( + "Error setting field: " + field + " on object: " + object, ex); + } + } + else + { + throw new WicketRuntimeException( + "no set method defined for value: " + value + " on object: " + object + + " while respective getMethod being " + getMethod.getName()); + } + } + + public static Method findSetter(Method getMethod, Class<?> clz) + { + String name = getMethod.getName(); + if (name.startsWith(GET)) + { + name = SET + name.substring(3); + } + else + { + name = SET + name.substring(2); + } + try + { + Method method = clz.getMethod(name, new Class[] { getMethod.getReturnType() }); + if (method != null) + { + method.setAccessible(true); + } + return method; + } + catch (NoSuchMethodException e) + { + Method[] methods = clz.getMethods(); + for (Method method : methods) + { + if (method.getName().equals(name)) + { + Class<?>[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length == 1) + { + if (parameterTypes[0].isAssignableFrom(getMethod.getReturnType())) + { + return method; + } + } + } + } + log.debug("Cannot find setter corresponding to " + getMethod); + } + catch (Exception e) + { + log.debug("Cannot find setter corresponding to " + getMethod); + } + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public Object newValue(Object object) + { + if (setMethod == null) + { + log.warn("Null setMethod"); + return null; + } + + Class<?> clz = getMethod.getReturnType(); + Object value = null; + try + { + value = clz.newInstance(); + setMethod.invoke(object, value); + } + catch (Exception e) + { + log.warn("Cannot set new value " + value, e); + } + return value; + } + + /** + * {@inheritDoc} + */ + @Override + public Class<?> getTargetClass() + { + return getMethod.getReturnType(); + } + + /** + * {@inheritDoc} + */ + @Override + public Method getGetter() + { + return getMethod; + } + + /** + * {@inheritDoc} + */ + @Override + public Method getSetter() + { + return setMethod; + } + + /** + * {@inheritDoc} + */ + @Override + public Field getField() + { + return field; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ObjectWithGetAndSet.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ObjectWithGetAndSet.java b/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ObjectWithGetAndSet.java new file mode 100644 index 0000000..4dec997 --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ObjectWithGetAndSet.java @@ -0,0 +1,75 @@ +package org.apache.wicket.core.util.reflection; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.wicket.core.util.lang.PropertyResolverConverter; + +/** + * @author jcompagner + * + */ +public class ObjectWithGetAndSet +{ + private final IGetAndSet getAndSet; + private final Object value; + + /** + * @param getAndSet + * @param value + */ + public ObjectWithGetAndSet(IGetAndSet getAndSet, Object value) + { + this.getAndSet = getAndSet; + this.value = value; + } + + /** + * @param value + * @param converter + */ + public void setValue(Object value, PropertyResolverConverter converter) + { + getAndSet.setValue(this.value, value, converter); + } + + /** + * @return The value + */ + public Object getValue() + { + return getAndSet.getValue(value); + } + + /** + * @return class of property value + */ + public Class<?> getTargetClass() + { + return getAndSet.getTargetClass(); + } + + /** + * @return Field or null if no field exists for expression + */ + public Field getField() + { + return getAndSet.getField(); + } + + /** + * @return Getter method or null if no getter exists for expression + */ + public Method getGetter() + { + return getAndSet.getGetter(); + } + + /** + * @return Setter method or null if no setter exists for expression + */ + public Method getSetter() + { + return getAndSet.getSetter(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ReflectionUtility.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ReflectionUtility.java b/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ReflectionUtility.java new file mode 100644 index 0000000..caa0fed --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/reflection/ReflectionUtility.java @@ -0,0 +1,92 @@ +package org.apache.wicket.core.util.reflection; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.wicket.core.util.lang.DefaultPropertyLocator; + +public class ReflectionUtility +{ + + /** + * @param clz + * @param expression + * @return introspected field + */ + public static Field findField(final Class<?> clz, final String expression) + { + Field field = null; + try + { + field = clz.getField(expression); + } + catch (Exception e) + { + Class<?> tmp = clz; + while (tmp != null && tmp != Object.class) + { + Field[] fields = tmp.getDeclaredFields(); + for (Field aField : fields) + { + if (aField.getName().equals(expression)) + { + aField.setAccessible(true); + return aField; + } + } + tmp = tmp.getSuperclass(); + } + DefaultPropertyLocator.log.debug("Cannot find field " + clz + "." + expression); + } + return field; + } + + /** + * @param clz + * @param expression + * @return The method for the expression null if not found + */ + public static Method findGetter(final Class<?> clz, final String expression) + { + String name = Character.toUpperCase(expression.charAt(0)) + expression.substring(1); + Method method = null; + try + { + method = clz.getMethod(MethodGetAndSet.GET + name, (Class[])null); + } + catch (Exception ignored) + { + } + if (method == null) + { + try + { + method = clz.getMethod(MethodGetAndSet.IS + name, (Class[])null); + } + catch (Exception e) + { + DefaultPropertyLocator.log.debug("Cannot find getter " + clz + "." + expression); + } + } + return method; + } + + public static Method findMethod(final Class<?> clz, String expression) + { + if (expression.endsWith("()")) + { + expression = expression.substring(0, expression.length() - 2); + } + Method method = null; + try + { + method = clz.getMethod(expression, (Class[])null); + } + catch (Exception e) + { + DefaultPropertyLocator.log.debug("Cannot find method " + clz + "." + expression); + } + return method; + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java index b3d9277..6f9d0b9 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java @@ -42,7 +42,6 @@ import org.apache.wicket.core.util.lang.WicketObjects; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.form.AutoLabelResolver.AutoLabelMarker; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.IPropertyReflectionAwareModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.convert.IConverter; http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java b/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java index 88ee038..4c48366 100644 --- a/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java +++ b/wicket-core/src/main/java/org/apache/wicket/model/AbstractPropertyModel.java @@ -16,9 +16,6 @@ */ package org.apache.wicket.model; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - import org.apache.wicket.Application; import org.apache.wicket.Session; import org.apache.wicket.WicketRuntimeException; @@ -45,8 +42,7 @@ import org.apache.wicket.util.string.Strings; */ public abstract class AbstractPropertyModel<T> extends ChainingModel<T> implements - IObjectClassAwareModel<T>, - IPropertyReflectionAwareModel<T> + IObjectClassAwareModel<T> { private static final long serialVersionUID = 1L; @@ -149,7 +145,7 @@ public abstract class AbstractPropertyModel<T> extends ChainingModel<T> { try { - return (Class<T>)PropertyResolver.getPropertyClass(expression, target); + return (Class<T>)PropertyResolver.getPropertyClass(expression, target, target.getClass()); } catch (Exception e) { @@ -163,7 +159,7 @@ public abstract class AbstractPropertyModel<T> extends ChainingModel<T> Class<?> targetClass = ((IObjectClassAwareModel<?>) getTarget()).getObjectClass(); if (targetClass != null) { - return PropertyResolver.getPropertyClass(expression, targetClass); + return PropertyResolver.getPropertyClass(expression, null, targetClass); } } catch (WicketRuntimeException e) @@ -175,70 +171,6 @@ public abstract class AbstractPropertyModel<T> extends ChainingModel<T> return null; } - @Override - public Field getPropertyField() - { - String expression = propertyExpression(); - if (Strings.isEmpty(expression) == false) - { - Object target = getInnermostModelOrObject(); - if (target != null) - { - try - { - return PropertyResolver.getPropertyField(expression, target); - } - catch (Exception ignore) - { - // ignore. - } - } - } - return null; - } - - @Override - public Method getPropertyGetter() - { - String expression = propertyExpression(); - if (Strings.isEmpty(expression) == false) - { - Object target = getInnermostModelOrObject(); - if (target != null) - { - try - { - return PropertyResolver.getPropertyGetter(expression, target); - } - catch (Exception ignore) - { - } - } - } - return null; - } - - @Override - public Method getPropertySetter() - { - String expression = propertyExpression(); - if (Strings.isEmpty(expression) == false) - { - Object target = getInnermostModelOrObject(); - if (target != null) - { - try - { - return PropertyResolver.getPropertySetter(expression, target); - } - catch (Exception ignore) - { - } - } - } - return null; - } - /** * @return The property expression for the component */ http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/main/java/org/apache/wicket/model/IPropertyReflectionAwareModel.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/model/IPropertyReflectionAwareModel.java b/wicket-core/src/main/java/org/apache/wicket/model/IPropertyReflectionAwareModel.java deleted file mode 100644 index 23258bb..0000000 --- a/wicket-core/src/main/java/org/apache/wicket/model/IPropertyReflectionAwareModel.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.wicket.model; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -/** - * Optional interface implemented by models that are able to provide reflection information about - * object property they interact with. - * - * The model doesn't have to support all property information in this interface. It is valid to - * return null for any method. - * - * @author Matej Knopp - * @param <T> - */ -public interface IPropertyReflectionAwareModel<T> extends IModel<T> -{ - /** - * Returns the field of model property or null if the field doesn't exist. - * - * @return Field or null - */ - Field getPropertyField(); - - /** - * Returns the getter method of model property or null if the method doesn't exist. - * - * @return Method or null - */ - Method getPropertyGetter(); - - /** - * Returns the setter method of model property or null if the method doesn't exist. - * - * @return Method or null - */ - Method getPropertySetter(); -} http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/main/java/org/apache/wicket/settings/ApplicationSettings.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/ApplicationSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/ApplicationSettings.java index 3dc699d..a86e4ff 100644 --- a/wicket-core/src/main/java/org/apache/wicket/settings/ApplicationSettings.java +++ b/wicket-core/src/main/java/org/apache/wicket/settings/ApplicationSettings.java @@ -21,6 +21,8 @@ import java.lang.ref.WeakReference; import org.apache.wicket.Page; import org.apache.wicket.application.DefaultClassResolver; import org.apache.wicket.application.IClassResolver; +import org.apache.wicket.core.util.lang.IPropertyExpressionResolver; +import org.apache.wicket.core.util.lang.OGNLPropertyExpressionResolver; import org.apache.wicket.feedback.DefaultCleanupFeedbackMessageFilter; import org.apache.wicket.feedback.IFeedbackMessageFilter; import org.apache.wicket.request.cycle.RequestCycle; @@ -55,6 +57,8 @@ public class ApplicationSettings private IClassResolver classResolver = new DefaultClassResolver(); + private IPropertyExpressionResolver propertyExpressionResolver = new OGNLPropertyExpressionResolver(); + private WeakReference<Class<? extends Page>> internalErrorPage; private WeakReference<Class<? extends Page>> pageExpiredErrorPage; @@ -85,6 +89,11 @@ public class ApplicationSettings return classResolver; } + public IPropertyExpressionResolver getPropertyExpressionResolver() + { + return propertyExpressionResolver; + } + /** * Gets the default maximum size for uploads. This is used by {@link org.apache.wicket.markup.html.form.Form#getMaxSize()} if no * value is explicitly set through {@link org.apache.wicket.markup.html.form.Form#setMaxSize(Bytes)}. @@ -158,6 +167,12 @@ public class ApplicationSettings return this; } + public void setPropertyExpressionResolver( + IPropertyExpressionResolver propertyExpressionResolver) + { + this.propertyExpressionResolver = propertyExpressionResolver; + } + /** * Sets the default maximum size for uploads. This is used by {@link org.apache.wicket.markup.html.form.Form#getMaxSize()} if no * value is explicitly set through {@link org.apache.wicket.markup.html.form.Form#setMaxSize(Bytes)}. http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java b/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java index 1d141fc..1d613e1 100644 --- a/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/model/AbstractPropertyModelObjectClassTest.java @@ -18,8 +18,7 @@ package org.apache.wicket.model; import java.io.Serializable; -import junit.framework.TestCase; -import org.junit.Assert; +import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Test; /** @@ -31,7 +30,7 @@ import org.junit.Test; * @see <a href="https://issues.apache.org/jira/browse/WICKET-2937">WICKET-2937</a> * @author Pedro Santos */ -public class AbstractPropertyModelObjectClassTest extends Assert +public class AbstractPropertyModelObjectClassTest extends WicketTestCase { /** http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java b/wicket-core/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java index c0ee2da..ea2343f 100644 --- a/wicket-core/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java @@ -19,7 +19,7 @@ package org.apache.wicket.model; import java.util.ArrayList; import java.util.List; -import org.junit.Assert; +import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Test; /** @@ -27,7 +27,7 @@ import org.junit.Test; * * @author Carl-Eric Menzel */ -public class PropertyModelWithListTest extends Assert +public class PropertyModelWithListTest extends WicketTestCase { /** */ public static class BeansContainer http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/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 new file mode 100644 index 0000000..f371496 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/util/lang/OGNLPropertyExpressionResolverTest.java @@ -0,0 +1,842 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.util.lang; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Vector; + +import org.apache.wicket.ConverterLocator; +import org.apache.wicket.IConverterLocator; +import org.apache.wicket.WicketRuntimeException; +import org.apache.wicket.core.util.lang.OGNLPropertyExpressionResolver; +import org.apache.wicket.core.util.lang.PropertyResolverConverter; +import org.apache.wicket.util.convert.ConversionException; +import org.apache.wicket.util.convert.IConverter; +import org.apache.wicket.util.convert.converter.AbstractConverter; +import org.apache.wicket.util.tester.WicketTestCase; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author jcompagner + * + */ +public class OGNLPropertyExpressionResolverTest extends WicketTestCase +{ + + private static final PropertyResolverConverter CONVERTER = new PropertyResolverConverter( + new ConverterLocator(), Locale.US); + OGNLPropertyExpressionResolver ognlResolver = new OGNLPropertyExpressionResolver(); + private Person person; + + /** + * @throws Exception + */ + @Before + public void before() + { + person = new Person(); + } + + /** + * @throws Exception + */ + @After + public void after() + { +// ognlResolver.destroy(tester.getApplication()); + } + + /** + * @throws Exception + */ + @Test + public void simpleExpression() throws Exception + { + String name = (String)ognlResolver.getValue("name", person); + assertNull(name); + + ognlResolver.setValue("name", person, "wicket", CONVERTER); + name = (String)ognlResolver.getValue("name", person); + assertEquals(name, "wicket"); + } + + /** + * @throws Exception + */ + @Test(expected = ConversionException.class) + public void primitiveValue() throws Exception + { + Integer integer = (Integer)ognlResolver.getValue("age", person); + assertTrue(integer == 0); + + ognlResolver.setValue("age", person, 10, CONVERTER); + integer = (Integer)ognlResolver.getValue("age", person); + assertTrue(integer == 10); + + ognlResolver.setValue("age", person, null, CONVERTER); + fail("primitive type can't be set to null"); + + } + + /** + * @throws Exception + */ + @Test + public void pathExpression() throws Exception + { + person.setAddress(new Address()); + ognlResolver.setValue("address.street", person, "wicket-street", + CONVERTER); + String street = (String)ognlResolver.getValue("address.street", person); + assertEquals(street, "wicket-street"); + + } + + /** + * @throws Exception + */ + @Test + public void testNull() throws Exception + { + String street = (String)ognlResolver.getValue("address.street", person); + assertNull(street); + } + + /** + * @throws Exception + */ + @Test + public void nullCreation() throws Exception + { + ognlResolver.setValue("address.street", person, "wicket-street", + CONVERTER); + String street = (String)ognlResolver.getValue("address.street", person); + assertEquals(street, "wicket-street"); + + try + { + ognlResolver.setValue("country.name", person, "US", CONVERTER); + fail("name can't be set on a country that doesn't have default constructor"); + } + catch (WicketRuntimeException ex) + { + } + } + + /** + * @throws Exception + */ + @Test + public void getterOnly() throws Exception + { + ognlResolver.setValue("country", person, new Country("US"), CONVERTER); + ognlResolver.getValue("country.name", person); + + try + { + ognlResolver.setValue("country.name", person, "NL", CONVERTER); + } + catch (WicketRuntimeException ex) + { + } + } + + /** + * @throws Exception + */ + @Test + public void pathExpressionWithConversion() throws Exception + { + person.setAddress(new Address()); + ognlResolver.setValue("address.number", person, "10", CONVERTER); + Integer number = (Integer)ognlResolver.getValue("address.number", person); + assertEquals(number, new Integer(10)); + + try + { + ognlResolver.setValue("address.number", person, "10a", CONVERTER); + throw new Exception("Conversion error should be thrown"); + } + catch (ConversionException ex) + { + } + + } + + /** + * @throws Exception + */ + @Test + public void mapLookup() throws Exception + { + Address address = new Address(); + ognlResolver.setValue("addressMap", person, + new HashMap<String, Address>(), CONVERTER); + ognlResolver.setValue("addressMap.address", person, address, CONVERTER); + ognlResolver.setValue("addressMap.address.street", person, + "wicket-street", CONVERTER); + String street = (String)ognlResolver.getValue("addressMap.address.street", + person); + assertEquals(street, "wicket-street"); + } + + /** + * @throws Exception + */ + @Test + public void mapWithDotLookup() throws Exception + { + Address address = new Address(); + HashMap<String, Address> hm = new HashMap<String, Address>(); + ognlResolver.setValue("addressMap", person, hm, CONVERTER); + ognlResolver.setValue("addressMap[address.test]", person, address, + CONVERTER); + assertNotNull(hm.get("address.test")); + ognlResolver.setValue("addressMap[address.test].street", person, + "wicket-street", CONVERTER); + String street = (String)ognlResolver + .getValue("addressMap[address.test].street", person); + assertEquals(street, "wicket-street"); + } + + /** + * @throws Exception + */ + @Test + public void listLookup() throws Exception + { + ognlResolver.setValue("addressList", person, new ArrayList<Address>(), + CONVERTER); + ognlResolver.setValue("addressList.0", person, new Address(), CONVERTER); + ognlResolver.setValue("addressList.10", person, new Address(), CONVERTER); + ognlResolver.setValue("addressList.1", person, new Address(), CONVERTER); + ognlResolver.setValue("addressList.1.street", person, "wicket-street", + CONVERTER); + + String street = (String)ognlResolver.getValue("addressList.0.street", + person); + assertNull(street); + street = (String)ognlResolver.getValue("addressList.1.street", person); + assertEquals(street, "wicket-street"); + } + + /** + * @throws Exception + */ + @Test + public void arrayLookup() throws Exception + { + ognlResolver.setValue("addressArray", person, + new Address[] { new Address(), null }, CONVERTER); + ognlResolver.setValue("addressArray.0.street", person, "wicket-street", + CONVERTER); + String street = (String)ognlResolver.getValue("addressArray.0.street", + person); + assertEquals(street, "wicket-street"); + + ognlResolver.setValue("addressArray.1.street", person, "wicket-street", + CONVERTER); + street = (String)ognlResolver.getValue("addressArray.1.street", person); + assertEquals(street, "wicket-street"); + } + + /** + * @throws Exception + */ + @Test + public void arrayLookupByBrackets() throws Exception + { + ognlResolver.setValue("addressArray", person, + new Address[] { new Address(), null }, CONVERTER); + ognlResolver.setValue("addressArray[0].street", person, "wicket-street", + CONVERTER); + String street = (String)ognlResolver.getValue("addressArray[0].street", + person); + assertEquals(street, "wicket-street"); + + ognlResolver.setValue("addressArray[1].street", person, "wicket-street", + CONVERTER); + street = (String)ognlResolver.getValue("addressArray[1].street", person); + assertEquals(street, "wicket-street"); + } + + /** + * @throws Exception + */ + @Test + public void propertyByIndexLookup() throws Exception + { + ognlResolver.setValue("addressAt.0", person, new Address(), CONVERTER); + ognlResolver.setValue("addressAt.0.street", person, "wicket-street", + CONVERTER); + String street = (String)ognlResolver.getValue("addressAt.0.street", + person); + assertEquals(street, "wicket-street"); + } + + /** + * @throws Exception + */ + @Test + public void getPropertyByNotExistingIndexArrayLookup() throws Exception + { + ognlResolver.setValue("addressArray", person, new Address[] { }, + CONVERTER); + String street = (String)ognlResolver.getValue("addressArray.0.street", + person); + assertNull(street); + street = (String)ognlResolver.getValue("addressArray[0].street", person); + assertNull(street); + } + + /** + * @throws Exception + */ + @Test + public void getPropertyByNotExistingIndexListLookup() throws Exception + { + ognlResolver.setValue("addressList", person, new ArrayList<Address>(), + CONVERTER); + String street = (String)ognlResolver.getValue("addressList.0.street", + person); + assertNull(street); + street = (String)ognlResolver.getValue("addressList[0].street", person); + assertNull(street); + } + + /** + * @throws Exception + */ + @Test + public void getIndexPropertyDirectly() throws Exception + { + Address address = new Address(); + Address[] addresses = new Address[] { address }; + + Address address2 = (Address)ognlResolver.getValue("[0]", addresses); + assertSame(address, address2); + } + + /** + * @throws Exception + */ + @Test + public void listSizeLookup() throws Exception + { + List<Address> addresses = new ArrayList<Address>(); + addresses.add(new Address()); + addresses.add(new Address()); + person.setAddressList(addresses); + Object size = ognlResolver.getValue("addressList.size", person); + assertEquals(size, 2); + size = ognlResolver.getValue("addressList.size()", person); + assertEquals(size, 2); + } + + + /** + * @throws Exception + */ + @Test + public void mapSizeLookup() throws Exception + { + Map<String, Address> addresses = new HashMap<String, Address>(); + Address address = new Address(); + addresses.put("size", address); + addresses.put("test", new Address()); + person.setAddressMap(addresses); + Object addressFromMap = ognlResolver.getValue("addressMap.size", person); + assertEquals(addressFromMap, address); + Object size = ognlResolver.getValue("addressMap.size()", person); + assertEquals(size, 2); + } + + /** + * @throws Exception + */ + @Test + public void arraySizeLookup() throws Exception + { + person.setAddressArray(new Address[] { new Address(), new Address() }); + Object size = ognlResolver.getValue("addressArray.length", person); + assertEquals(size, 2); + size = ognlResolver.getValue("addressArray.size", person); + assertEquals(size, 2); + } + + /** + * @throws Exception + */ + @Test + public void methodLookup() throws Exception + { + Address[] addresses = new Address[] { new Address(), new Address() }; + person.setAddressArray(addresses); + Object value = ognlResolver.getValue("getAddressArray()", person); + assertEquals(value, addresses); + } + + /** + * @throws Exception + */ + @Test + public void field() throws Exception + { + Address address = new Address(); + ognlResolver.setValue("address2", person, address, CONVERTER); + Address address2 = (Address)ognlResolver.getValue("address2", person); + assertEquals(address, address2); + + try + { + ognlResolver.setValue("address3", person, address, CONVERTER); + fail("Shoudln't come here"); + } + catch (RuntimeException ex) + { + + } + } + + /** + * @throws Exception + */ + @Test + public void testPrivateField() throws Exception + { + Address address = new Address(); + ognlResolver.setValue("privateAddress", person, address, CONVERTER); + Address address2 = (Address)ognlResolver.getValue("privateAddress", + person); + assertEquals(address, address2); + } + + /** + * @throws Exception + */ + @Test + public void privateFieldOfSuperClass() throws Exception + { + Person2 person2 = new Person2(); + Address address = new Address(); + ognlResolver.setValue("privateAddress", person2, address, CONVERTER); + Address address2 = (Address)ognlResolver.getValue("privateAddress", + person2); + assertEquals(address, address2); + } + + /** + * + */ + @Test + public void getTargetClass() + { + Address address = new Address(); + + Class<?> clazz = ognlResolver.getPropertyClass("number", address, address.getClass()); + assertEquals(int.class, clazz); + + Person person = new Person(); + person.setAddress(new Address()); + + clazz = ognlResolver.getPropertyClass("address.number", person, person.getClass()); + assertEquals(int.class, clazz); + + person.setAddressArray(new Address[] { new Address(), new Address() }); + clazz = ognlResolver.getPropertyClass("addressArray[0]", person, person.getClass()); + assertEquals(Address.class, clazz); + + clazz = ognlResolver.getPropertyClass("addressArray[0].number", person, person.getClass()); + assertEquals(int.class, clazz); + } + + /** + * + */ + @Test + public void getTargetField() + { + Address address = new Address(); + + Field field = ognlResolver.getPropertyField("number", address); + assertEquals(field.getName(), "number"); + assertEquals(field.getType(), int.class); + + Person person = new Person(); + person.setAddress(new Address()); + + field = ognlResolver.getPropertyField("address.number", person); + assertEquals(field.getName(), "number"); + assertEquals(field.getType(), int.class); + + person.setAddressArray(new Address[] { new Address(), new Address() }); + field = ognlResolver.getPropertyField("addressArray[0].number", person); + assertEquals(field.getName(), "number"); + assertEquals(field.getType(), int.class); + } + + /** + * + */ + @Test + public void getTargetGetter() + { + Address address = new Address(); + + Method method = ognlResolver.getPropertyGetter("number", address); + assertEquals(method.getName(), "getNumber"); + assertEquals(method.getReturnType(), int.class); + + Person person = new Person(); + person.setAddress(new Address()); + + method = ognlResolver.getPropertyGetter("address.number", person); + assertEquals(method.getName(), "getNumber"); + assertEquals(method.getReturnType(), int.class); + + person.setAddressArray(new Address[] { new Address(), new Address() }); + method = ognlResolver.getPropertyGetter("addressArray[0].number", person); + assertEquals(method.getName(), "getNumber"); + assertEquals(method.getReturnType(), int.class); + } + + /** + * @throws Exception + */ + @Test + public void onlyPrimitiveGetter() throws Exception + { + Person person = new Person(); + + ognlResolver.setValue("onlyGetterPrimitive", person, 1, CONVERTER); + + assertEquals(person.getOnlyGetterPrimitive(), 1); + assertEquals(ognlResolver.getValue("onlyGetterPrimitive", person), 1); + + } + + /** + * @throws Exception + */ + @Test + public void onlyStringGetter() throws Exception + { + Person person = new Person(); + + ognlResolver.setValue("onlyGetterString", person, "onlygetter", + CONVERTER); + + assertEquals(person.getOnlyGetterString(), "onlygetter"); + assertEquals(ognlResolver.getValue("onlyGetterString", person), + "onlygetter"); + + } + + /** + * + */ + @Test + public void getTargetSetter() + { + Address address = new Address(); + + Method method = ognlResolver.getPropertySetter("number", address); + assertEquals(method.getName(), "setNumber"); + + Person person = new Person(); + person.setAddress(new Address()); + + method = ognlResolver.getPropertySetter("address.number", person); + assertEquals(method.getName(), "setNumber"); + + person.setAddressArray(new Address[] { new Address(), new Address() }); + method = ognlResolver.getPropertySetter("addressArray[0].number", person); + assertEquals(method.getName(), "setNumber"); + } + + /** + * @throws Exception + */ + @Test + public void overriddenGetter() throws Exception + { + Person2 person = new Person2(); + person.setName("foo"); + + String name = (String)ognlResolver.getValue("name", person); + assertEquals("foo", name); + + ognlResolver.setValue("name", person, "bar", CONVERTER); + + name = (String)ognlResolver.getValue("name", person); + assertEquals("bar", name); + + } + + /** + * @throws Exception + */ + @Test + public void propertyClassWithSubType() throws Exception + { + Person person = new Person(); + assertEquals(String.class, + ognlResolver.getPropertyClass("country.name", person, person.getClass())); + try + { + ognlResolver.getPropertyClass("country.subCountry.name", person, person.getClass()); + fail("country.subCountry shouldnt be found"); + } + catch (Exception e) + { + + } + person.setCountry(new Country2("test", new Country("test"))); + ognlResolver.getPropertyClass("country.subCountry.name", person, person.getClass()); + } + + /** + * Used for models in testing. + */ + private static class InnerVectorPOJO extends Vector<Void> + { + private static final long serialVersionUID = 1L; + + /** + */ + @SuppressWarnings("unused") + public String testValue = "vector"; + } + + /** + * Tests the PropertyModel with vector. + */ + @Test + public void propertyModel() + { + String value = (String)ognlResolver.getValue("testValue", + new InnerVectorPOJO()); + assertEquals("vector", value); + } + + /** + * + */ + @Test + public void directFieldSetWithDifferentTypeThanGetter() + { + final DirectFieldSetWithDifferentTypeThanGetter obj = new DirectFieldSetWithDifferentTypeThanGetter(); + ognlResolver.setValue("value", obj, 1, null); + assertEquals(1, obj.value); + } + + private static class DirectFieldSetWithDifferentTypeThanGetter + { + private int value; + + @SuppressWarnings("unused") + public String getValue() + { + return String.valueOf(value); + } + } + + /** + * @see <a href="https://issues.apache.org/jira/browse/WICKET-1802">WICKET-1802</a> + */ + @Test + public void conversionExceptionMessageContainsTheObjectPropertyBeingSet() + { + try + { + PropertyResolverConverter convertToNull = new PropertyResolverConverter(null, null) + { + private static final long serialVersionUID = 1L; + + @Override + public <T> T convert(Object object, java.lang.Class<T> clz) + { + return null; + } + }; + ognlResolver.setValue("name", person, "", convertToNull); + fail("Should have thrown an ConversionException"); + } + catch (ConversionException e) + { + assertTrue(e.getMessage().toLowerCase().contains("name")); + } + } + + /** + * WICKET-3441 + */ + @Test + public void dateToStringConverting() + { + IConverterLocator converterLocator = new ConverterLocator(); + Locale locale = Locale.GERMAN; + PropertyResolverConverter converter = new PropertyResolverConverter(converterLocator, + locale); + + Calendar calDate = Calendar.getInstance(); + calDate.clear(); + calDate.set(2011, Calendar.APRIL, 17); + Date date = calDate.getTime(); + + Object actual = converter.convert(date, String.class); + String expected = converterLocator.getConverter(Date.class).convertToString(date, locale); + assertEquals(expected, actual); + } + + /** + * WICKET-3441 + */ + @Test + public void dateToLongConverting() + { + ConverterLocator converterLocator = new ConverterLocator(); + final IConverter<Date> dateConverter = converterLocator.get(Date.class); + IConverter<Long> customLongConverter = new AbstractConverter<Long>() + { + private static final long serialVersionUID = 1L; + + @Override + public Long convertToObject(String value, Locale locale) + { + Date date = dateConverter.convertToObject(value, locale); + return date != null ? date.getTime() : null; + } + + @Override + public String convertToString(Long value, Locale locale) + { + Date date; + if (value != null) + { + date = new Date(); + date.setTime(value); + } + else + { + date = null; + } + + return dateConverter.convertToString(date, locale); + } + + @Override + protected Class<Long> getTargetType() + { + return Long.class; + } + }; + converterLocator.set(Long.class, customLongConverter); + converterLocator.set(Long.TYPE, customLongConverter); + + PropertyResolverConverter converter = new PropertyResolverConverter(converterLocator, + Locale.ENGLISH); + + Calendar calDate = Calendar.getInstance(); + calDate.clear(); + calDate.set(2011, Calendar.APRIL, 17); + Date date = calDate.getTime(); + + Object actual = converter.convert(date, Long.class); + assertEquals(date.getTime(), actual); + } + +// /** +// * WICKET-5623 custom properties +// */ +// @Test +// public void custom() +// { +// Document document = new Document(); +// document.setType("type"); +// document.setProperty("string", "string"); +// +// Document nestedCustom = new Document(); +// nestedCustom.setProperty("string", "string2"); +// document.setProperty("nested", nestedCustom); +// +// ognlResolver.setLocator(tester.getApplication(), +// new CachingPropertyLocator(new CustomGetAndSetLocator())); +// +// assertEquals("type", ognlResolver.getValue("type", document)); +// assertEquals("string", ognlResolver.getValue("string", document)); +// assertEquals("string2", ognlResolver.getValue("nested.string", document)); +// } + +// class CustomGetAndSetLocator implements IPropertyLocator +// { +// +// private IPropertyLocator locator = new DefaultPropertyLocator(); +// +// @Override +// public IGetAndSet get(Class<?> clz, String exp) +// { +// // first try default properties +// IGetAndSet getAndSet = locator.get(clz, exp); +// if (getAndSet == null && Document.class.isAssignableFrom(clz)) +// { +// // fall back to document properties +// getAndSet = new DocumentPropertyGetAndSet(exp); +// } +// return getAndSet; +// } +// +// public class DocumentPropertyGetAndSet extends AbstractGetAndSet +// { +// +// private String name; +// +// public DocumentPropertyGetAndSet(String name) +// { +// this.name = name; +// } +// +// @Override +// public Object getValue(Object object) +// { +// return ((Document)object).getProperty(name); +// } +// +// @Override +// public Object newValue(Object object) +// { +// return new Document(); +// } +// +// @Override +// public void setValue(Object object, Object value, PropertyResolverConverter converter) +// { +// ((Document)object).setProperty(name, value); +// } +// } +// } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java b/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java deleted file mode 100644 index 1a3278d..0000000 --- a/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java +++ /dev/null @@ -1,809 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.wicket.util.lang; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Vector; - -import org.apache.wicket.ConverterLocator; -import org.apache.wicket.IConverterLocator; -import org.apache.wicket.WicketRuntimeException; -import org.apache.wicket.core.util.lang.PropertyResolver; -import org.apache.wicket.core.util.lang.PropertyResolver.AbstractGetAndSet; -import org.apache.wicket.core.util.lang.PropertyResolver.CachingPropertyLocator; -import org.apache.wicket.core.util.lang.PropertyResolver.DefaultPropertyLocator; -import org.apache.wicket.core.util.lang.PropertyResolver.IGetAndSet; -import org.apache.wicket.core.util.lang.PropertyResolver.IPropertyLocator; -import org.apache.wicket.core.util.lang.PropertyResolverConverter; -import org.apache.wicket.util.convert.ConversionException; -import org.apache.wicket.util.convert.IConverter; -import org.apache.wicket.util.convert.converter.AbstractConverter; -import org.apache.wicket.util.tester.WicketTestCase; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * @author jcompagner - * - */ -public class PropertyResolverTest extends WicketTestCase -{ - - private static final PropertyResolverConverter CONVERTER = new PropertyResolverConverter( - new ConverterLocator(), Locale.US); - - private Person person; - - /** - * @throws Exception - */ - @Before - public void before() - { - person = new Person(); - } - - /** - * @throws Exception - */ - @After - public void after() - { - PropertyResolver.destroy(tester.getApplication()); - } - - /** - * @throws Exception - */ - @Test - public void simpleExpression() throws Exception - { - String name = (String) PropertyResolver.getValue("name", person); - assertNull(name); - - PropertyResolver.setValue("name", person, "wicket", CONVERTER); - name = (String)PropertyResolver.getValue("name", person); - assertEquals(name, "wicket"); - } - - /** - * @throws Exception - */ - @Test(expected = ConversionException.class) - public void primitiveValue() throws Exception - { - Integer integer = (Integer)PropertyResolver.getValue("age", person); - assertTrue(integer == 0); - - PropertyResolver.setValue("age", person, 10, CONVERTER); - integer = (Integer)PropertyResolver.getValue("age", person); - assertTrue(integer == 10); - - PropertyResolver.setValue("age", person, null, CONVERTER); - fail("primitive type can't be set to null"); - - } - - /** - * @throws Exception - */ - @Test - public void pathExpression() throws Exception - { - person.setAddress(new Address()); - PropertyResolver.setValue("address.street", person, "wicket-street", CONVERTER); - String street = (String)PropertyResolver.getValue("address.street", person); - assertEquals(street, "wicket-street"); - - } - - /** - * @throws Exception - */ - @Test - public void testNull() throws Exception - { - String street = (String)PropertyResolver.getValue("address.street", person); - assertNull(street); - } - - /** - * @throws Exception - */ - @Test - public void nullCreation() throws Exception - { - PropertyResolver.setValue("address.street", person, "wicket-street", CONVERTER); - String street = (String)PropertyResolver.getValue("address.street", person); - assertEquals(street, "wicket-street"); - - try - { - PropertyResolver.setValue("country.name", person, "US", CONVERTER); - fail("name can't be set on a country that doesn't have default constructor"); - } - catch (WicketRuntimeException ex) - { - } - } - - /** - * @throws Exception - */ - @Test - public void getterOnly() throws Exception - { - PropertyResolver.setValue("country", person, new Country("US"), CONVERTER); - PropertyResolver.getValue("country.name", person); - - try - { - PropertyResolver.setValue("country.name", person, "NL", CONVERTER); - } - catch (WicketRuntimeException ex) - { - } - } - - /** - * @throws Exception - */ - @Test - public void pathExpressionWithConversion() throws Exception - { - person.setAddress(new Address()); - PropertyResolver.setValue("address.number", person, "10", CONVERTER); - Integer number = (Integer)PropertyResolver.getValue("address.number", person); - assertEquals(number, new Integer(10)); - - try - { - PropertyResolver.setValue("address.number", person, "10a", CONVERTER); - throw new Exception("Conversion error should be thrown"); - } - catch (ConversionException ex) - { - } - - } - - /** - * @throws Exception - */ - @Test - public void mapLookup() throws Exception - { - Address address = new Address(); - PropertyResolver.setValue("addressMap", person, new HashMap<String, Address>(), CONVERTER); - PropertyResolver.setValue("addressMap.address", person, address, CONVERTER); - PropertyResolver.setValue("addressMap.address.street", person, "wicket-street", CONVERTER); - String street = (String)PropertyResolver.getValue("addressMap.address.street", person); - assertEquals(street, "wicket-street"); - } - - /** - * @throws Exception - */ - @Test - public void mapWithDotLookup() throws Exception - { - Address address = new Address(); - HashMap<String, Address> hm = new HashMap<String, Address>(); - PropertyResolver.setValue("addressMap", person, hm, CONVERTER); - PropertyResolver.setValue("addressMap[address.test]", person, address, CONVERTER); - assertNotNull(hm.get("address.test")); - PropertyResolver.setValue("addressMap[address.test].street", person, "wicket-street", - CONVERTER); - String street = (String)PropertyResolver.getValue("addressMap[address.test].street", person); - assertEquals(street, "wicket-street"); - } - - /** - * @throws Exception - */ - @Test - public void listLookup() throws Exception - { - PropertyResolver.setValue("addressList", person, new ArrayList<Address>(), CONVERTER); - PropertyResolver.setValue("addressList.0", person, new Address(), CONVERTER); - PropertyResolver.setValue("addressList.10", person, new Address(), CONVERTER); - PropertyResolver.setValue("addressList.1", person, new Address(), CONVERTER); - PropertyResolver.setValue("addressList.1.street", person, "wicket-street", CONVERTER); - - String street = (String)PropertyResolver.getValue("addressList.0.street", person); - assertNull(street); - street = (String)PropertyResolver.getValue("addressList.1.street", person); - assertEquals(street, "wicket-street"); - } - - /** - * @throws Exception - */ - @Test - public void arrayLookup() throws Exception - { - PropertyResolver.setValue("addressArray", person, new Address[] { new Address(), null }, - CONVERTER); - PropertyResolver.setValue("addressArray.0.street", person, "wicket-street", CONVERTER); - String street = (String)PropertyResolver.getValue("addressArray.0.street", person); - assertEquals(street, "wicket-street"); - - PropertyResolver.setValue("addressArray.1.street", person, "wicket-street", CONVERTER); - street = (String)PropertyResolver.getValue("addressArray.1.street", person); - assertEquals(street, "wicket-street"); - } - - /** - * @throws Exception - */ - @Test - public void arrayLookupByBrackets() throws Exception - { - PropertyResolver.setValue("addressArray", person, new Address[] { new Address(), null }, - CONVERTER); - PropertyResolver.setValue("addressArray[0].street", person, "wicket-street", CONVERTER); - String street = (String)PropertyResolver.getValue("addressArray[0].street", person); - assertEquals(street, "wicket-street"); - - PropertyResolver.setValue("addressArray[1].street", person, "wicket-street", CONVERTER); - street = (String)PropertyResolver.getValue("addressArray[1].street", person); - assertEquals(street, "wicket-street"); - } - - /** - * @throws Exception - */ - @Test - public void propertyByIndexLookup() throws Exception - { - PropertyResolver.setValue("addressAt.0", person, new Address(), CONVERTER); - PropertyResolver.setValue("addressAt.0.street", person, "wicket-street", CONVERTER); - String street = (String)PropertyResolver.getValue("addressAt.0.street", person); - assertEquals(street, "wicket-street"); - } - - /** - * @throws Exception - */ - @Test - public void getPropertyByNotExistingIndexArrayLookup() throws Exception - { - PropertyResolver.setValue("addressArray", person, new Address[] { }, CONVERTER); - String street = (String)PropertyResolver.getValue("addressArray.0.street", person); - assertNull(street); - street = (String)PropertyResolver.getValue("addressArray[0].street", person); - assertNull(street); - } - - /** - * @throws Exception - */ - @Test - public void getPropertyByNotExistingIndexListLookup() throws Exception - { - PropertyResolver.setValue("addressList", person, new ArrayList<Address>(), CONVERTER); - String street = (String)PropertyResolver.getValue("addressList.0.street", person); - assertNull(street); - street = (String)PropertyResolver.getValue("addressList[0].street", person); - assertNull(street); - } - - /** - * @throws Exception - */ - @Test - public void getIndexPropertyDirectly() throws Exception - { - Address address = new Address(); - Address[] addresses = new Address[] { address }; - - Address address2 = (Address)PropertyResolver.getValue("[0]", addresses); - assertSame(address, address2); - } - - /** - * @throws Exception - */ - @Test - public void listSizeLookup() throws Exception - { - List<Address> addresses = new ArrayList<Address>(); - addresses.add(new Address()); - addresses.add(new Address()); - person.setAddressList(addresses); - Object size = PropertyResolver.getValue("addressList.size", person); - assertEquals(size, 2); - size = PropertyResolver.getValue("addressList.size()", person); - assertEquals(size, 2); - } - - - /** - * @throws Exception - */ - @Test - public void mapSizeLookup() throws Exception - { - Map<String, Address> addresses = new HashMap<String, Address>(); - Address address = new Address(); - addresses.put("size", address); - addresses.put("test", new Address()); - person.setAddressMap(addresses); - Object addressFromMap = PropertyResolver.getValue("addressMap.size", person); - assertEquals(addressFromMap, address); - Object size = PropertyResolver.getValue("addressMap.size()", person); - assertEquals(size, 2); - } - - /** - * @throws Exception - */ - @Test - public void arraySizeLookup() throws Exception - { - person.setAddressArray(new Address[] { new Address(), new Address() }); - Object size = PropertyResolver.getValue("addressArray.length", person); - assertEquals(size, 2); - size = PropertyResolver.getValue("addressArray.size", person); - assertEquals(size, 2); - } - - /** - * @throws Exception - */ - @Test - public void methodLookup() throws Exception - { - Address[] addresses = new Address[] { new Address(), new Address() }; - person.setAddressArray(addresses); - Object value = PropertyResolver.getValue("getAddressArray()", person); - assertEquals(value, addresses); - } - - /** - * @throws Exception - */ - @Test - public void field() throws Exception - { - Address address = new Address(); - PropertyResolver.setValue("address2", person, address, CONVERTER); - Address address2 = (Address)PropertyResolver.getValue("address2", person); - assertEquals(address, address2); - - try - { - PropertyResolver.setValue("address3", person, address, CONVERTER); - fail("Shoudln't come here"); - } - catch (RuntimeException ex) - { - - } - } - - /** - * @throws Exception - */ - @Test - public void testPrivateField() throws Exception - { - Address address = new Address(); - PropertyResolver.setValue("privateAddress", person, address, CONVERTER); - Address address2 = (Address)PropertyResolver.getValue("privateAddress", person); - assertEquals(address, address2); - } - - /** - * @throws Exception - */ - @Test - public void privateFieldOfSuperClass() throws Exception - { - Person2 person2 = new Person2(); - Address address = new Address(); - PropertyResolver.setValue("privateAddress", person2, address, CONVERTER); - Address address2 = (Address)PropertyResolver.getValue("privateAddress", person2); - assertEquals(address, address2); - } - - /** - * - */ - @Test - public void getTargetClass() - { - Address address = new Address(); - - Class<?> clazz = PropertyResolver.getPropertyClass("number", address); - assertEquals(int.class, clazz); - - Person person = new Person(); - person.setAddress(new Address()); - - clazz = PropertyResolver.getPropertyClass("address.number", person); - assertEquals(int.class, clazz); - - person.setAddressArray(new Address[] { new Address(), new Address() }); - clazz = PropertyResolver.getPropertyClass("addressArray[0]", person); - assertEquals(Address.class, clazz); - - clazz = PropertyResolver.getPropertyClass("addressArray[0].number", person); - assertEquals(int.class, clazz); - } - - /** - * - */ - @Test - public void getTargetField() - { - Address address = new Address(); - - Field field = PropertyResolver.getPropertyField("number", address); - assertEquals(field.getName(), "number"); - assertEquals(field.getType(), int.class); - - Person person = new Person(); - person.setAddress(new Address()); - - field = PropertyResolver.getPropertyField("address.number", person); - assertEquals(field.getName(), "number"); - assertEquals(field.getType(), int.class); - - person.setAddressArray(new Address[] { new Address(), new Address() }); - field = PropertyResolver.getPropertyField("addressArray[0].number", person); - assertEquals(field.getName(), "number"); - assertEquals(field.getType(), int.class); - } - - /** - * - */ - @Test - public void getTargetGetter() - { - Address address = new Address(); - - Method method = PropertyResolver.getPropertyGetter("number", address); - assertEquals(method.getName(), "getNumber"); - assertEquals(method.getReturnType(), int.class); - - Person person = new Person(); - person.setAddress(new Address()); - - method = PropertyResolver.getPropertyGetter("address.number", person); - assertEquals(method.getName(), "getNumber"); - assertEquals(method.getReturnType(), int.class); - - person.setAddressArray(new Address[] { new Address(), new Address() }); - method = PropertyResolver.getPropertyGetter("addressArray[0].number", person); - assertEquals(method.getName(), "getNumber"); - assertEquals(method.getReturnType(), int.class); - } - - /** - * @throws Exception - */ - @Test - public void onlyPrimitiveGetter() throws Exception - { - Person person = new Person(); - - PropertyResolver.setValue("onlyGetterPrimitive", person, 1, CONVERTER); - - assertEquals(person.getOnlyGetterPrimitive(), 1); - assertEquals(PropertyResolver.getValue("onlyGetterPrimitive", person), 1); - - } - - /** - * @throws Exception - */ - @Test - public void onlyStringGetter() throws Exception - { - Person person = new Person(); - - PropertyResolver.setValue("onlyGetterString", person, "onlygetter", CONVERTER); - - assertEquals(person.getOnlyGetterString(), "onlygetter"); - assertEquals(PropertyResolver.getValue("onlyGetterString", person), "onlygetter"); - - } - - /** - * - */ - @Test - public void getTargetSetter() - { - Address address = new Address(); - - Method method = PropertyResolver.getPropertySetter("number", address); - assertEquals(method.getName(), "setNumber"); - - Person person = new Person(); - person.setAddress(new Address()); - - method = PropertyResolver.getPropertySetter("address.number", person); - assertEquals(method.getName(), "setNumber"); - - person.setAddressArray(new Address[] { new Address(), new Address() }); - method = PropertyResolver.getPropertySetter("addressArray[0].number", person); - assertEquals(method.getName(), "setNumber"); - } - - /** - * @throws Exception - */ - @Test - public void overriddenGetter() throws Exception - { - Person2 person = new Person2(); - person.setName("foo"); - - String name = (String)PropertyResolver.getValue("name", person); - assertEquals("foo", name); - - PropertyResolver.setValue("name", person, "bar", CONVERTER); - - name = (String)PropertyResolver.getValue("name", person); - assertEquals("bar", name); - - } - - /** - * @throws Exception - */ - @Test - public void propertyClassWithSubType() throws Exception - { - Person person = new Person(); - assertEquals(String.class, PropertyResolver.getPropertyClass("country.name", person)); - try - { - PropertyResolver.getPropertyClass("country.subCountry.name", person); - fail("country.subCountry shouldnt be found"); - } - catch (Exception e) - { - - } - person.setCountry(new Country2("test", new Country("test"))); - PropertyResolver.getPropertyClass("country.subCountry.name", person); - } - - /** - * Used for models in testing. - */ - private static class InnerVectorPOJO extends Vector<Void> - { - private static final long serialVersionUID = 1L; - - /** - */ - @SuppressWarnings("unused") - public String testValue = "vector"; - } - - /** - * Tests the PropertyModel with vector. - */ - @Test - public void propertyModel() - { - String value = (String)PropertyResolver.getValue("testValue", new InnerVectorPOJO()); - assertEquals("vector", value); - } - - /** - * - */ - @Test - public void directFieldSetWithDifferentTypeThanGetter() - { - final DirectFieldSetWithDifferentTypeThanGetter obj = new DirectFieldSetWithDifferentTypeThanGetter(); - PropertyResolver.setValue("value", obj, 1, null); - assertEquals(1, obj.value); - } - - private static class DirectFieldSetWithDifferentTypeThanGetter - { - private int value; - - @SuppressWarnings("unused") - public String getValue() - { - return String.valueOf(value); - } - } - - /** - * @see <a href="https://issues.apache.org/jira/browse/WICKET-1802">WICKET-1802</a> - */ - @Test - public void conversionExceptionMessageContainsTheObjectPropertyBeingSet() - { - try - { - PropertyResolverConverter convertToNull = new PropertyResolverConverter(null, null) - { - private static final long serialVersionUID = 1L; - - @Override - public <T> T convert(Object object, java.lang.Class<T> clz) - { - return null; - } - }; - PropertyResolver.setValue("name", person, "", convertToNull); - fail("Should have thrown an ConversionException"); - } - catch (ConversionException e) - { - assertTrue(e.getMessage().toLowerCase().contains("name")); - } - } - - /** - * WICKET-3441 - */ - @Test - public void dateToStringConverting() - { - IConverterLocator converterLocator = new ConverterLocator(); - Locale locale = Locale.GERMAN; - PropertyResolverConverter converter = new PropertyResolverConverter(converterLocator, - locale); - - Calendar calDate = Calendar.getInstance(); - calDate.clear(); - calDate.set(2011, Calendar.APRIL, 17); - Date date = calDate.getTime(); - - Object actual = converter.convert(date, String.class); - String expected = converterLocator.getConverter(Date.class).convertToString(date, locale); - assertEquals(expected, actual); - } - - /** - * WICKET-3441 - */ - @Test - public void dateToLongConverting() - { - ConverterLocator converterLocator = new ConverterLocator(); - final IConverter<Date> dateConverter = converterLocator.get(Date.class); - IConverter<Long> customLongConverter = new AbstractConverter<Long>() - { - private static final long serialVersionUID = 1L; - - @Override - public Long convertToObject(String value, Locale locale) - { - Date date = dateConverter.convertToObject(value, locale); - return date != null ? date.getTime() : null; - } - - @Override - public String convertToString(Long value, Locale locale) - { - Date date; - if (value != null) - { - date = new Date(); - date.setTime(value); - } - else - { - date = null; - } - - return dateConverter.convertToString(date, locale); - } - - @Override - protected Class<Long> getTargetType() - { - return Long.class; - } - }; - converterLocator.set(Long.class, customLongConverter); - converterLocator.set(Long.TYPE, customLongConverter); - - PropertyResolverConverter converter = new PropertyResolverConverter(converterLocator, - Locale.ENGLISH); - - Calendar calDate = Calendar.getInstance(); - calDate.clear(); - calDate.set(2011, Calendar.APRIL, 17); - Date date = calDate.getTime(); - - Object actual = converter.convert(date, Long.class); - assertEquals(date.getTime(), actual); - } - - /** - * WICKET-5623 custom properties - */ - @Test - public void custom() { - Document document = new Document(); - document.setType("type"); - document.setProperty("string", "string"); - - Document nestedCustom = new Document(); - nestedCustom.setProperty("string", "string2"); - document.setProperty("nested", nestedCustom); - - PropertyResolver.setLocator(tester.getApplication(), new CachingPropertyLocator(new CustomGetAndSetLocator())); - - assertEquals("type", PropertyResolver.getValue("type", document)); - assertEquals("string", PropertyResolver.getValue("string", document)); - assertEquals("string2", PropertyResolver.getValue("nested.string", document)); - } - - class CustomGetAndSetLocator implements IPropertyLocator { - - private IPropertyLocator locator = new DefaultPropertyLocator(); - - @Override - public IGetAndSet get(Class<?> clz, String exp) { - // first try default properties - IGetAndSet getAndSet = locator.get(clz, exp); - if (getAndSet == null && Document.class.isAssignableFrom(clz)) { - // fall back to document properties - getAndSet = new DocumentPropertyGetAndSet(exp); - } - return getAndSet; - } - - public class DocumentPropertyGetAndSet extends AbstractGetAndSet { - - private String name; - - public DocumentPropertyGetAndSet(String name) { - this.name = name; - } - - @Override - public Object getValue(Object object) { - return ((Document) object).getProperty(name); - } - - @Override - public Object newValue(Object object) { - return new Document(); - } - - @Override - public void setValue(Object object, Object value, PropertyResolverConverter converter) { - ((Document) object).setProperty(name, value); - } - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/3a6db1bf/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java b/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java index 8438f81..eed1c6e 100644 --- a/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java @@ -17,7 +17,7 @@ package org.apache.wicket.util.string.interpolator; import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator; -import org.junit.Assert; +import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Test; /** @@ -25,7 +25,7 @@ import org.junit.Test; * * @author Gerolf Seitz */ -public class PropertyVariableInterpolatorTest extends Assert +public class PropertyVariableInterpolatorTest extends WicketTestCase { /** *
