Author: niallp
Date: Sat Jul 14 00:27:18 2007
New Revision: 556237
URL: http://svn.apache.org/viewvc?view=rev&rev=556237
Log:
BEANUTILS-18 PropertyUtils.isReadable() and PropertyUtils.getProperty() not
consistent - thanks to Maarten Coene
Added:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/Jira18TestCase.java
(with props)
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java
(with props)
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/PropertyUtilsBean.java
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestBean.java
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/PropertyUtilsBean.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/PropertyUtilsBean.java?view=diff&rev=556237&r1=556236&r2=556237
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/PropertyUtilsBean.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/PropertyUtilsBean.java
Sat Jul 14 00:27:18 2007
@@ -462,6 +462,7 @@
if (descriptor instanceof IndexedPropertyDescriptor) {
Method readMethod = ((IndexedPropertyDescriptor) descriptor).
getIndexedReadMethod();
+ readMethod = MethodUtils.getAccessibleMethod(readMethod);
if (readMethod != null) {
Object[] subscript = new Object[1];
subscript[0] = new Integer(index);
@@ -615,6 +616,7 @@
// Call the keyed getter method if there is one
Method readMethod = ((MappedPropertyDescriptor) descriptor).
getMappedReadMethod();
+ readMethod = MethodUtils.getAccessibleMethod(readMethod);
if (readMethod != null) {
Object[] keyArray = new Object[1];
keyArray[0] = key;
@@ -626,7 +628,7 @@
}
} else {
/* means that the result has to be retrieved from a map */
- Method readMethod = descriptor.getReadMethod();
+ Method readMethod = getReadMethod(descriptor);
if (readMethod != null) {
Object invokeResult = invokeMethod(readMethod, bean, new
Object[0]);
/* test and fetch from the map */
@@ -1346,13 +1348,14 @@
PropertyDescriptor desc =
getPropertyDescriptor(bean, name);
if (desc != null) {
- Method readMethod = desc.getReadMethod();
+ Method readMethod = getReadMethod(desc);
if (readMethod == null) {
if (desc instanceof IndexedPropertyDescriptor) {
readMethod = ((IndexedPropertyDescriptor)
desc).getIndexedReadMethod();
} else if (desc instanceof MappedPropertyDescriptor) {
readMethod = ((MappedPropertyDescriptor)
desc).getMappedReadMethod();
}
+ readMethod =
MethodUtils.getAccessibleMethod(readMethod);
}
return (readMethod != null);
} else {
@@ -1411,13 +1414,14 @@
PropertyDescriptor desc =
getPropertyDescriptor(bean, name);
if (desc != null) {
- Method writeMethod = desc.getWriteMethod();
+ Method writeMethod = getWriteMethod(desc);
if (writeMethod == null) {
if (desc instanceof IndexedPropertyDescriptor) {
writeMethod = ((IndexedPropertyDescriptor)
desc).getIndexedWriteMethod();
} else if (desc instanceof MappedPropertyDescriptor) {
writeMethod = ((MappedPropertyDescriptor)
desc).getMappedWriteMethod();
}
+ writeMethod =
MethodUtils.getAccessibleMethod(writeMethod);
}
return (writeMethod != null);
} else {
@@ -1563,6 +1567,7 @@
if (descriptor instanceof IndexedPropertyDescriptor) {
Method writeMethod = ((IndexedPropertyDescriptor) descriptor).
getIndexedWriteMethod();
+ writeMethod = MethodUtils.getAccessibleMethod(writeMethod);
if (writeMethod != null) {
Object[] subscript = new Object[2];
subscript[0] = new Integer(index);
@@ -1592,7 +1597,7 @@
}
// Otherwise, the underlying property must be an array or a list
- Method readMethod = descriptor.getReadMethod();
+ Method readMethod = getReadMethod(descriptor);
if (readMethod == null) {
throw new NoSuchMethodException("Property '" + name +
"' has no getter method on bean class '" + bean.getClass()
+ "'");
@@ -1730,6 +1735,7 @@
Method mappedWriteMethod =
((MappedPropertyDescriptor) descriptor).
getMappedWriteMethod();
+ mappedWriteMethod =
MethodUtils.getAccessibleMethod(mappedWriteMethod);
if (mappedWriteMethod != null) {
Object[] params = new Object[2];
params[0] = key;
@@ -1750,7 +1756,7 @@
}
} else {
/* means that the result has to be retrieved from a map */
- Method readMethod = descriptor.getReadMethod();
+ Method readMethod = getReadMethod(descriptor);
if (readMethod != null) {
Object invokeResult = invokeMethod(readMethod, bean, new
Object[0]);
/* test and fetch from the map */
Modified:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestBean.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestBean.java?view=diff&rev=556237&r1=556236&r2=556237
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestBean.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestBean.java
Sat Jul 14 00:27:18 2007
@@ -418,7 +418,7 @@
/*
* Another nested reference to a bean containing mapp properties
*/
- class MappedTestBean {
+ public class MappedTestBean {
public void setValue(String key,String val) { }
public String getValue(String key) { return "Mapped Value"; }
}
Added:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/Jira18TestCase.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/Jira18TestCase.java?view=auto&rev=556237
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/Jira18TestCase.java
(added)
+++
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/Jira18TestCase.java
Sat Jul 14 00:27:18 2007
@@ -0,0 +1,285 @@
+/*
+ * 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.commons.beanutils.bugs;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.beanutils.bugs.other.Jira18BeanFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Test case for Jira issue# BEANUTILS-18.
+ * <p />
+ * See https://issues.apache.org/jira/browse/BEANUTILS-18
+ * <p />
+ *
+ *
+ * <p />
+ * This test case demonstrates the issue.
+ *
+ * @version $Revision$ $Date$
+ */
+public class Jira18TestCase extends TestCase {
+
+ private Log log = LogFactory.getLog(Jira18TestCase.class);
+ private Object bean;
+
+ /**
+ * Create a test case with the specified name.
+ *
+ * @param name The name of the test
+ */
+ public Jira18TestCase(String name) {
+ super(name);
+ }
+
+ /**
+ * Run the Test.
+ *
+ * @param args Arguments
+ */
+ public static void main(String[] args) {
+ junit.textui.TestRunner.run(suite());
+ }
+
+ /**
+ * Create a test suite for this test.
+ *
+ * @return a test suite
+ */
+ public static Test suite() {
+ return (new TestSuite(Jira18TestCase.class));
+ }
+
+ /**
+ * Set up.
+ *
+ * @throws java.lang.Exception
+ */
+ protected void setUp() throws Exception {
+ super.setUp();
+ bean = Jira18BeanFactory.createBean();
+ }
+
+ /**
+ * Tear Down.
+ *
+ * @throws java.lang.Exception
+ */
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#isReadable(Object, String)}
+ * for simple properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_isReadable() {
+ boolean result = false;
+ try {
+ result = PropertyUtils.isReadable(bean, "simple");
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertFalse("PropertyUtils.isReadable(bean, \"simple\") returned
true", result);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#isWriteable(Object, String)}
+ * for simple properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_isWriteable() {
+ boolean result = false;
+ try {
+ result = PropertyUtils.isWriteable(bean, "simple");
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertFalse("PropertyUtils.isWriteable(bean, \"simple\") returned
true", result);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#isReadable(Object, String)}
+ * for indexed properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_isReadable_Indexed() {
+ boolean result = false;
+ try {
+ result = PropertyUtils.isReadable(bean, "indexed");
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertFalse("PropertyUtils.isReadable(bean, \"indexed\") returned
true", result);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#isWriteable(Object, String)}
+ * for indexed properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_isWriteable_Indexed() {
+ boolean result = false;
+ try {
+ result = PropertyUtils.isWriteable(bean, "indexed");
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertFalse("PropertyUtils.isWriteable(bean, \"indexed\") returned
true", result);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#isReadable(Object, String)}
+ * for Mapped properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_isReadable_Mapped() {
+ boolean result = false;
+ try {
+ result = PropertyUtils.isReadable(bean, "mapped");
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertFalse("PropertyUtils.isReadable(bean, \"mapped\") returned
true", result);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#isWriteable(Object, String)}
+ * for Mapped properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_isWriteable_Mapped() {
+ boolean result = false;
+ try {
+ result = PropertyUtils.isWriteable(bean, "mapped");
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertFalse("PropertyUtils.isWriteable(bean, \"mapped\") returned
true", result);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#getProperty(Object, String)}
+ * for simple properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_getProperty() {
+ boolean threwNoSuchMethodException = false;
+ Object result = null;
+ try {
+ result = PropertyUtils.getProperty(bean, "simple");
+ } catch (NoSuchMethodException ex) {
+ threwNoSuchMethodException = true; // expected result
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertTrue("Expected NoSuchMethodException but returned '" + result +
"'", threwNoSuchMethodException);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#setProperty(Object, String,
Object)}
+ * for simple properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_setProperty() {
+ boolean threwNoSuchMethodException = false;
+ try {
+ PropertyUtils.setProperty(bean, "simple", "BAR");
+ } catch (NoSuchMethodException ex) {
+ threwNoSuchMethodException = true; // expected result
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertTrue("Expected NoSuchMethodException",
threwNoSuchMethodException);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#getProperty(Object, String)}
+ * for indexed properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_getProperty_Indexed() {
+ boolean threwNoSuchMethodException = false;
+ Object result = null;
+ try {
+ result = PropertyUtils.getProperty(bean, "indexed[0]");
+ } catch (NoSuchMethodException ex) {
+ threwNoSuchMethodException = true; // expected result
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertTrue("Expected NoSuchMethodException but returned '" + result +
"'", threwNoSuchMethodException);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#setProperty(Object, String,
Object)}
+ * for indexed properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_setProperty_Indexed() {
+ boolean threwNoSuchMethodException = false;
+ try {
+ PropertyUtils.setProperty(bean, "indexed[0]", "BAR");
+ } catch (NoSuchMethodException ex) {
+ threwNoSuchMethodException = true; // expected result
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertTrue("Expected NoSuchMethodException",
threwNoSuchMethodException);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#getProperty(Object, String)}
+ * for mapped properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_getProperty_Mapped() {
+ boolean threwNoSuchMethodException = false;
+ Object result = null;
+ try {
+ result = PropertyUtils.getProperty(bean, "mapped(foo-key)");
+ } catch (NoSuchMethodException ex) {
+ threwNoSuchMethodException = true; // expected result
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertTrue("Expected NoSuchMethodException but returned '" + result +
"'", threwNoSuchMethodException);
+ }
+
+ /**
+ * Test [EMAIL PROTECTED] PropertyUtils#setProperty(Object, String,
Object)}
+ * for mapped properties.
+ */
+ public void testIssue_BEANUTILS_18_PropertyUtils_setProperty_Mapped() {
+ boolean threwNoSuchMethodException = false;
+ try {
+ PropertyUtils.setProperty(bean, "mapped(foo-key)", "BAR");
+ } catch (NoSuchMethodException ex) {
+ threwNoSuchMethodException = true; // expected result
+ } catch (Throwable t) {
+ log.error("ERROR " + t, t);
+ fail("Threw exception: " + t);
+ }
+ assertTrue("Expected NoSuchMethodException",
threwNoSuchMethodException);
+ }
+}
Propchange:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/Jira18TestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/Jira18TestCase.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Added:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java?view=auto&rev=556237
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java
(added)
+++
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java
Sat Jul 14 00:27:18 2007
@@ -0,0 +1,113 @@
+/*
+ * 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.commons.beanutils.bugs.other;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.beanutils.bugs.Jira18TestCase;
+
+/**
+ * Factory whcih creates <i>package</i> scope beans with
+ * public methods for [EMAIL PROTECTED] Jira18TestCase}.
+ *
+ * @version $Revision$ $Date$
+ */
+public class Jira18BeanFactory {
+
+ /**
+ * Factory method which creates package friendly beans.
+ *
+ * @return The a package friendly bean with public methods
+ */
+ public static Object createBean() {
+ return new PackageFriendlyBean();
+ }
+
+ /* =============== Package Friendly Bean =============== */
+ static class PackageFriendlyBean {
+
+ private String[] indexed = new String[] {"one", "two", "three"};
+ private String simple = "FOO";
+ private Map mapped = new HashMap();
+
+ /** Default Constructor */
+ public PackageFriendlyBean() {
+ mapped.put("foo-key", "foo-value");
+ mapped.put("bar-key", "bar-value");
+ }
+ /**
+ * Return simple property.
+ *
+ * @return The simple value
+ */
+ public String getSimple() {
+ return simple;
+ }
+
+ /**
+ * Set simple property.
+ *
+ * @param simple The simple value
+ */
+ public void setSimple(String simple) {
+ this.simple = simple;
+ }
+
+ /**
+ * Return indexed property.
+ *
+ * @param index The index
+ * @return The indexed value
+ */
+ public String getIndexed(int index) {
+ return indexed[index];
+ }
+
+ /**
+ * Set indexed property.
+ *
+ * @param index The index
+ * @param value The indexed value
+ */
+ public void setIndexed(int index, String value) {
+ this.indexed[index] = value;
+ }
+
+ /**
+ * Return mapped property.
+ *
+ * @param key The mapped key
+ * @return The mapped value
+ */
+ public String getMapped(String key) {
+ return (String)mapped.get(key);
+ }
+
+ /**
+ * Set mapped property.
+ *
+ * @param key The mapped key
+ * @param value The mapped value
+ */
+ public void setMapped(String key, String value) {
+ mapped.put(key, value);
+ }
+
+ }
+
+}
Propchange:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/bugs/other/Jira18BeanFactory.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]