craigmcc 01/05/06 19:09:03 Modified: beanutils/src/java/org/apache/commons/beanutils PropertyUtils.java beanutils/src/test/org/apache/commons/beanutils PropertyUtilsTestCase.java Added: beanutils/src/test/org/apache/commons/beanutils/priv PrivateBean.java PrivateBeanFactory.java PrivateDirect.java PrivateIndirect.java Log: Make PropertyUtils.getReadMethod() and PropertyUtils.getWriteMethod() smart enough to locate accessible methods in a non-public class that are declared in a public interface implemented (either directly or indirectly) by that class. Added unit tests to validate the behavior. An example comes from the Crimson parser that is part of JAXP/1.1: // NOTE: CommentNode is *not* public class org.apache.crimson.tree.CommentNode extends org.apache.crimson.tree.DataNode implements org.w3c.dom.Comment; public interface org.w3c.dom.Comment extends org.w3c.dom.CharacterData; public interface org.w3c.dom.CharacterData extends org.w3c.dom.Node; public interface org.w3c.dom.Node; The getNodeName() method is defined in the Node interface, but was not accessible without this patch, because previously PropertyUtils only checked for accessible methods in directly implemented interfaces. Now, it follows the interface hierarchy and correctly discovers the callable getNodeName() method of the CommentNode class. This bug was reported against the Struts version of PropertyUtils, along with a patch to implement the nesting. PR: Bugzilla #1200 Submitted by: [EMAIL PROTECTED] Revision Changes Path 1.5 +62 -5 jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/PropertyUtils.java Index: PropertyUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/PropertyUtils.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- PropertyUtils.java 2001/05/07 00:32:32 1.4 +++ PropertyUtils.java 2001/05/07 02:09:01 1.5 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/PropertyUtils.java,v 1.4 2001/05/07 00:32:32 craigmcc Exp $ - * $Revision: 1.4 $ - * $Date: 2001/05/07 00:32:32 $ + * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/PropertyUtils.java,v 1.5 2001/05/07 02:09:01 craigmcc Exp $ + * $Revision: 1.5 $ + * $Date: 2001/05/07 02:09:01 $ * * ==================================================================== * @@ -121,7 +121,7 @@ * @author Craig R. McClanahan * @author Ralph Schaer * @author Chris Audley - * @version $Revision: 1.4 $ $Date: 2001/05/07 00:32:32 $ + * @version $Revision: 1.5 $ $Date: 2001/05/07 02:09:01 $ */ public class PropertyUtils { @@ -940,9 +940,16 @@ return (method); } - // Check the implemented interfaces + // Check the implemented interfaces and subinterfaces String methodName = method.getName(); Class[] parameterTypes = method.getParameterTypes(); + method = + getAccessibleMethodFromInterfaceNest(clazz, + method.getName(), + method.getParameterTypes()); + return (method); + + /* Class[] interfaces = clazz.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { // Is this interface public? @@ -962,6 +969,56 @@ // We are out of luck return (null); + */ + + } + + + /** + * Return an accessible method (that is, one that can be invoked via + * reflection) that implements the specified method, by scanning through + * all implemented interfaces and subinterfaces. If no such Method + * can be found, return <code>null</code>. + * + * @param clazz Parent class for the interfaces to be checked + * @param methodName Method name of the method we wish to call + * @param parameterTypes The parameter type signatures + */ + private static Method getAccessibleMethodFromInterfaceNest + (Class clazz, String methodName, Class parameterTypes[]) { + + Method method = null; + + // Check the implemented interfaces of the parent class + Class interfaces[] = clazz.getInterfaces(); + for (int i = 0; i < interfaces.length; i++) { + + // Is this interface public? + if (!Modifier.isPublic(interfaces[i].getModifiers())) + continue; + + // Does the method exist on this interface? + try { + method = interfaces[i].getDeclaredMethod(methodName, + parameterTypes); + } catch (NoSuchMethodException e) { + ; + } + if (method != null) + break; + + // Recursively check our parent interfaces + method = + getAccessibleMethodFromInterfaceNest(interfaces[i], + methodName, + parameterTypes); + if (method != null) + break; + + } + + // Return whatever we have found + return (method); } 1.5 +110 -14 jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/PropertyUtilsTestCase.java Index: PropertyUtilsTestCase.java =================================================================== RCS file: /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/PropertyUtilsTestCase.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- PropertyUtilsTestCase.java 2001/05/07 00:32:32 1.4 +++ PropertyUtilsTestCase.java 2001/05/07 02:09:02 1.5 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/PropertyUtilsTestCase.java,v 1.4 2001/05/07 00:32:32 craigmcc Exp $ - * $Revision: 1.4 $ - * $Date: 2001/05/07 00:32:32 $ + * $Header: /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/PropertyUtilsTestCase.java,v 1.5 2001/05/07 02:09:02 craigmcc Exp $ + * $Revision: 1.5 $ + * $Date: 2001/05/07 02:09:02 $ * * ==================================================================== * @@ -69,6 +69,9 @@ import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; +import org.apache.commons.beanutils.priv.PrivateBeanFactory; +import org.apache.commons.beanutils.priv.PrivateDirect; +import org.apache.commons.beanutils.priv.PrivateIndirect; /** @@ -88,7 +91,7 @@ * </ul> * * @author Craig R. McClanahan - * @version $Revision: 1.4 $ $Date: 2001/05/07 00:32:32 $ + * @version $Revision: 1.5 $ $Date: 2001/05/07 02:09:02 $ */ public class PropertyUtilsTestCase extends TestCase { @@ -98,6 +101,36 @@ /** + * The fully qualified class name of our private bean class. + */ + private static final String PRIVATE_BEAN_CLASS = + "org.apache.commons.beanutils.priv.PrivateBean"; + + + /** + * The fully qualified class name of our private directly + * implemented interface. + */ + private static final String PRIVATE_DIRECT_CLASS = + "org.apache.commons.beanutils.priv.PrivateDirect"; + + + /** + * The fully qualified class name of our private indirectly + * implemented interface. + */ + private static final String PRIVATE_INDIRECT_CLASS = + "org.apache.commons.beanutils.priv.PrivateIndirect"; + + + /** + * The fully qualified class name of our test bean class. + */ + private static final String TEST_BEAN_CLASS = + "org.apache.commons.beanutils.TestBean"; + + + /** * The basic test bean for each test. */ protected TestBean bean = null; @@ -110,6 +143,12 @@ /** + * The test bean for private access tests. + */ + protected PrivateDirect beanPrivate = null; + + + /** * The "public subclass" test bean for each test. */ protected TestBeanPublicSubclass beanPublicSubclass = null; @@ -165,6 +204,7 @@ bean = new TestBean(); beanPackageSubclass = new TestBeanPackageSubclass(); + beanPrivate = PrivateBeanFactory.create(); beanPublicSubclass = new TestBeanPublicSubclass(); } @@ -187,6 +227,7 @@ bean = null; beanPackageSubclass = null; + beanPrivate = null; beanPublicSubclass = null; } @@ -616,7 +657,7 @@ */ public void testGetReadMethodBasic() { - testGetReadMethod(bean, properties); + testGetReadMethod(bean, properties, TEST_BEAN_CLASS); } @@ -628,18 +669,61 @@ */ public void testGetReadMethodPackageSubclass() { - testGetReadMethod(beanPackageSubclass, properties); + testGetReadMethod(beanPackageSubclass, properties, TEST_BEAN_CLASS); } /** * Test getting accessible property reader methods for a specified + * list of properties that are declared either directly or via + * implemented interfaces. + */ + public void testGetReadMethodPublicInterface() { + + // Properties "bar" and "baz" are visible via implemented interfaces + // (one direct and one indirect) + testGetReadMethod(beanPrivate, + new String[] { "bar" }, + PRIVATE_DIRECT_CLASS); + testGetReadMethod(beanPrivate, + new String[] { "baz" }, + PRIVATE_INDIRECT_CLASS); + + // Property "foo" is not accessible because the underlying + // class has package scope + PropertyDescriptor pd[] = + PropertyUtils.getPropertyDescriptors(beanPrivate); + int n = -1; + for (int i = 0; i < pd.length; i++) { + if ("foo".equals(pd[i].getName())) { + n = i; + break; + } + } + assert("Found foo descriptor", n >= 0); + Method reader = pd[n].getReadMethod(); + assertNotNull("Found foo read method", reader); + Object value = null; + try { + value = reader.invoke(beanPrivate, new Class[0]); + fail("Foo reader did throw IllegalAccessException"); + } catch (IllegalAccessException e) { + ; // Expected result for this test + } catch (Throwable t) { + fail("Invoke foo reader: " + t); + } + + } + + + /** + * Test getting accessible property reader methods for a specified * list of properties of a public subclass of our standard test bean. */ public void testGetReadMethodPublicSubclass() { - testGetReadMethod(beanPublicSubclass, properties); + testGetReadMethod(beanPublicSubclass, properties, TEST_BEAN_CLASS); } @@ -960,7 +1044,7 @@ */ public void testGetWriteMethodBasic() { - testGetWriteMethod(bean, properties); + testGetWriteMethod(bean, properties, TEST_BEAN_CLASS); } @@ -972,7 +1056,7 @@ */ public void testGetWriteMethodPackageSubclass() { - testGetWriteMethod(beanPackageSubclass, properties); + testGetWriteMethod(beanPackageSubclass, properties, TEST_BEAN_CLASS); } @@ -983,7 +1067,7 @@ */ public void testGetWriteMethodPublicSubclass() { - testGetWriteMethod(beanPublicSubclass, properties); + testGetWriteMethod(beanPublicSubclass, properties, TEST_BEAN_CLASS); } @@ -1622,8 +1706,10 @@ * * @param bean Bean for which to retrieve read methods. * @param properties Property names to search for + * @param className Class name where this method should be defined */ - protected void testGetReadMethod(Object bean, String properties[]) { + protected void testGetReadMethod(Object bean, String properties[], + String className) { PropertyDescriptor pd[] = PropertyUtils.getPropertyDescriptors(bean); @@ -1655,7 +1741,15 @@ clazz); assertEquals("Correct declaring class for " + properties[i], clazz.getName(), - "org.apache.commons.beanutils.TestBean"); + className); + + // Actually call the reader method we received + try { + Object value = + reader.invoke(bean, new Class[0]); + } catch (Throwable t) { + fail("Call for " + properties[i] + ": " + t); + } } @@ -1667,8 +1761,10 @@ * * @param bean Bean for which to retrieve write methods. * @param properties Property names to search for + * @param className Class name where this method should be defined */ - protected void testGetWriteMethod(Object bean, String properties[]) { + protected void testGetWriteMethod(Object bean, String properties[], + String className) { PropertyDescriptor pd[] = @@ -1703,7 +1799,7 @@ clazz); assertEquals("Correct declaring class for " + properties[i], clazz.getName(), - "org.apache.commons.beanutils.TestBean"); + className); } 1.1 jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateBean.java Index: PrivateBean.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateBean.java,v 1.1 2001/05/07 02:09:02 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/05/07 02:09:02 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.beanutils.priv; /** * Bean that has a private constructor that exposes properties via * various mechanisms (based on property name): * <ul> * <li><strong>foo</strong> - Via direct public method * <li><strong>bar</strong> - Via directly implemented interface * <li><strong>baz</strong> - Via indirectly implemented interface * </ul> * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/05/07 02:09:02 $ */ class PrivateBean implements PrivateDirect { // ----------------------------------------------------------- Constructors /** * Package private constructor - can only use factory method to create * beans. */ PrivateBean() { super(); } // ------------------------------------------------------------- Properties /** * A directly implemented property. */ private String foo = "This is foo"; public String getFoo() { return (this.foo); } /** * A property accessible via a directly implemented interface. */ private String bar = "This is bar"; public String getBar() { return (this.bar); } /** * A property accessible via an indirectly implemented interface. */ private String baz = "This is baz"; public String getBaz() { return (this.baz); } } 1.1 jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateBeanFactory.java Index: PrivateBeanFactory.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateBeanFactory.java,v 1.1 2001/05/07 02:09:02 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/05/07 02:09:02 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.beanutils.priv; /** * Factory class for PrivateBean instances. * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/05/07 02:09:02 $ */ public class PrivateBeanFactory { /** * Factory method to create new beans. */ public static PrivateDirect create() { return (new PrivateBean()); } } 1.1 jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateDirect.java Index: PrivateDirect.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateDirect.java,v 1.1 2001/05/07 02:09:02 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/05/07 02:09:02 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.beanutils.priv; /** * Interface that is directly implemented by PrivateBean. * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/05/07 02:09:02 $ */ public interface PrivateDirect extends PrivateIndirect { // ------------------------------------------------------------- Properties /** * A property accessible via a directly implemented interface. */ String getBar(); } 1.1 jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateIndirect.java Index: PrivateIndirect.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/priv/PrivateIndirect.java,v 1.1 2001/05/07 02:09:02 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2001/05/07 02:09:02 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.beanutils.priv; /** * Interface that is indirectly implemented by PrivateBean. * * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2001/05/07 02:09:02 $ */ public interface PrivateIndirect { // ------------------------------------------------------------- Properties /** * A property accessible via an indirectly implemented interface. */ public String getBaz(); }