On Wed, 9 Jul 2003, Michael Heuer wrote:

> On Wed, 9 Jul 2003, Craig R. McClanahan wrote:
>
> > On Wed, 9 Jul 2003, Arun Thomas wrote:
> >
> > > Date: Wed, 9 Jul 2003 16:28:07 -0700
> > > From: Arun Thomas <[EMAIL PROTECTED]>
> > > Reply-To: Jakarta Commons Developers List <[EMAIL PROTECTED]>
> > > To: Jakarta Commons Developers List <[EMAIL PROTECTED]>
> > > Subject: RE: cvs commit:
> > >     jakarta-commons/beanutils/src/test/org/apache/commons/beanutils
> > >     PropertyUtilsTestCase.java TestBean.java
> > >
> > > I'm confused as to what part of Section 8.3.1 of the Java Beans spec
> > > defines this behaviour.  I'm looking at version 1.01 - is there a newer
> > > revision?
> > >
> >
> > No ... that's the most current.
> >
> > > <quote>
> > > By default, we use design patterns to locate properties by looking for methods 
> > > of the form:
> > >   public < PropertyType> get< PropertyName>();
> > >   public void set< PropertyName>(< PropertyType> a);
> > > If we discover a matching pair of "get<PropertyName>" and "set<PropertyName>" 
> > > methods
> > > that take and return the same type, then we regard these methods as defining a 
> > > read-write property whose name will be "<propertyName>". We will use the 
> > > "get<PropertyName>" method to get the property value and the "set<PropertyName>" 
> > > method to set the property value. The pair of methods may be located either in 
> > > the same class or one may be in a base class and the other may be in a derived 
> > > class.
> > >
> > > If we find only one of these methods, then we regard it as defining
> > > either a read-only or a writeonly property called "<propertyName>"
> > >
> >
> > This is the key sentence.  The introspection code will find getFoo() and
> > isFoo() that return boolean and pick isFoo(), but they won't find
> > setFoo(boolean).  Therefore, the JDK thinks that there is a read-only
> > boolean property named foo.
>
> I believe that you wanted to say `they won't find setFoo(String)`, because
> the introspection code should find setFoo(boolean) and see foo as a
> read-write property.

Sorry, I've confused things further.

The bean contains

boolean isFoo();
boolean getFoo();
void setFoo(String);

and introspection sees foo as a read-only boolean property.

You said it correctly.

>
> > It would have made more sense to me for introspection to decide that there
> > was no property at all because of the type mismatch on the setter, but
> > alas that is not the way it actually works, so it's nothing BeanUtils can
> > really do anything about anyway (i.e. I will veto any suggestion that
> > BeanUtils define properties in any way different than what the standard
> > JDK introspection does).
> >
> > > By default we assume that properties are neither bound nor constrained (see 
> > > Section 7).
> > > So a simple read-write property "foo" might be represented by a pair of methods:
> > >   public Wombat getFoo();
> > >   public void setFoo(Wombat w);
> > > </quote>
> > >
> > > Section 8.3.2 goes on to note that is<propertyName>, if present, will be
> > > used preferentially for boolean properties.
> > >
> > > However, at least this text does not specify what happens if the
> > > setMethod takes a different type than the get method returns.  There is
> > > nothing that suggests the get/is method has precedence over the set
> > > method.
> > >
> > > Am I missing something (either here, or in the spec)?
> > >
> >
> > I don't see anything explicit in the spec either ... all I see is what
> > JDKs actually do.
> >
> > > -AMT
> >
> > Craig
> >
> > >
> > > -----Original Message-----
> > > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> > > Sent: Thursday, July 03, 2003 12:10 PM
> > > To: [EMAIL PROTECTED]
> > > Subject: cvs commit: 
> > > jakarta-commons/beanutils/src/test/org/apache/commons/beanutils 
> > > PropertyUtilsTestCase.java TestBean.java
> > >
> > >
> > > craigmcc    2003/07/03 12:10:27
> > >
> > >   Modified:    beanutils/src/test/org/apache/commons/beanutils
> > >                         PropertyUtilsTestCase.java TestBean.java
> > >   Log:
> > >   Add a unit test to verify the current JDK introspection of a bean with
> > >   the following method signatures:
> > >
> > >     public boolean isFoo();
> > >     public boolean getFoo();
> > >     public void setFoo(String foo);
> > >
> > >   According to Section 8.3.1 of the JavaBeans Specification, this
> > >   will get recognized as a read-only boolean property using "isFoo"
> > >   as the getter method.  Therefore, all of the code in commons-beanutils
> > >   should make this same assumption as well.
> > >
> > >   One could argue that it would make more sense to not recognize "foo"
> > >   as a property at all, since the types on the getter and setter methods
> > >   are different.  However, that's not the way the JavaBeans spec is worded,
> > >   and not the way that the JDK's introspection logic works either.
> > >
> > >   Revision  Changes    Path
> > >   1.31      +31 -4     
> > > 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.30
> > >   retrieving revision 1.31
> > >   diff -u -r1.30 -r1.31
> > >   --- PropertyUtilsTestCase.java  12 May 2003 21:42:56 -0000      1.30
> > >   +++ PropertyUtilsTestCase.java  3 Jul 2003 19:10:27 -0000       1.31
> > >   @@ -452,6 +452,33 @@
> > >
> > >
> > >        /**
> > >   +     * <p>Negative tests on an invalid property with two different boolean
> > >   +     * getters (which is fine, according to the JavaBeans spec) but a
> > >   +     * String setter instead of a boolean setter.</p>
> > >   +     *
> > >   +     * <p>Although one could logically argue that this combination of method
> > >   +     * signatures should not identify a property at all, there is a sentence
> > >   +     * in Section 8.3.1 making it clear that the behavior tested for here
> > >   +     * is correct:  "If we find only one of these methods, then we regard
> > >   +     * it as defining either a read-only or write-only property called
> > >   +     * <em>&lt;property-name&gt;</em>.</p>
> > >   +     */
> > >   +    public void testGetDescriptorInvalidBoolean() throws Exception {
> > >   +
> > >   +       PropertyDescriptor pd =
> > >   +           PropertyUtils.getPropertyDescriptor(bean, "invalidBoolean");
> > >   +       assertNotNull("invalidBoolean is a property", pd);
> > >   +       assertNotNull("invalidBoolean has a getter method",
> > >   +                     pd.getReadMethod());
> > >   +       assertNull("invalidBoolean has no write method",
> > >   +                  pd.getWriteMethod());
> > >   +       assertTrue("invalidBoolean getter method is isInvalidBoolean",
> > >   +                  "isInvalidBoolean".equals(pd.getReadMethod().getName()));
> > >   +
> > >   +    }
> > >   +
> > >   +
> > >   +    /**
> > >         * Positive getPropertyDescriptor on property <code>longProperty</code>.
> > >         */
> > >        public void testGetDescriptorLong() {
> > >
> > >
> > >
> > >   1.16      +35 -4     
> > > jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/TestBean.java
> > >
> > >   Index: TestBean.java
> > >   ===================================================================
> > >   RCS file: 
> > > /home/cvs/jakarta-commons/beanutils/src/test/org/apache/commons/beanutils/TestBean.java,v
> > >   retrieving revision 1.15
> > >   retrieving revision 1.16
> > >   diff -u -r1.15 -r1.16
> > >   --- TestBean.java       1 Feb 2003 07:45:29 -0000       1.15
> > >   +++ TestBean.java       3 Jul 2003 19:10:27 -0000       1.16
> > >   @@ -525,6 +525,37 @@
> > >        }
> > >
> > >
> > >   +    // ------------------------------------------------------ Invalid 
> > > Properties
> > >   +
> > >   +
> > >   +    /**
> > >   +     * <p>An invalid property that has two boolean getters (getInvalidBoolean
> > >   +     * and isInvalidBoolean) plus a String setter (setInvalidBoolean).  By the
> > >   +     * rules described in the JavaBeans Specification, this will be considered
> > >   +     * a read-only boolean property, using isInvalidBoolean() as the 
> > > getter.</p>
> > >   +     */
> > >   +    private boolean invalidBoolean = false;
> > >   +
> > >   +    public boolean getInvalidBoolean() {
> > >   +       return (this.invalidBoolean);
> > >   +    }
> > >   +
> > >   +    public boolean isInvalidBoolean() {
> > >   +       return (this.invalidBoolean);
> > >   +    }
> > >   +
> > >   +    public void setInvalidBoolean(String invalidBoolean) {
> > >   +       if ("true".equalsIgnoreCase(invalidBoolean) ||
> > >   +           "yes".equalsIgnoreCase(invalidBoolean) ||
> > >   +           "1".equalsIgnoreCase(invalidBoolean)) {
> > >   +           this.invalidBoolean = true;
> > >   +       } else {
> > >   +           this.invalidBoolean = false;
> > >   +       }
> > >   +    }
> > >   +
> > >   +
> > >   +
> > >        // ------------------------------------------------------- Static 
> > > Variables
> > >
> > >
> > >
> > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to