You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by cr...@apache.org on 2001/12/28 04:59:41 UTC

cvs commit: jakarta-commons/beanutils/src/java/org/apache/commons/beanutils BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java DynaClass.java

craigmcc    01/12/27 19:59:41

  Modified:    beanutils/src/java/org/apache/commons/beanutils
                        DynaBean.java DynaClass.java
  Added:       beanutils/src/java/org/apache/commons/beanutils
                        BasicDynaBean.java BasicDynaClass.java
                        DynaProperty.java
  Log:
  Here's bare-bones implementations of the DynaBean and DynaClass interfaces
  for us to start chewing over -- BasicDynaBean only implements simple
  properties at the moment (not indexed or mapped).
  
  I also removed (from DynaBean) the support for "modified" and "readOnly"
  properties of the DynaBean instance itself.  In keeping with the minimalist
  design that Paulo is nudging me towards :-), these are now value-added
  features of a particular implementation.
  
  Revision  Changes    Path
  1.4       +5 -52     jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaBean.java
  
  Index: DynaBean.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaBean.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DynaBean.java	2001/12/28 00:33:56	1.3
  +++ DynaBean.java	2001/12/28 03:59:41	1.4
  @@ -1,13 +1,13 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaBean.java,v 1.3 2001/12/28 00:33:56 craigmcc Exp $
  - * $Revision: 1.3 $
  - * $Date: 2001/12/28 00:33:56 $
  + * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaBean.java,v 1.4 2001/12/28 03:59:41 craigmcc Exp $
  + * $Revision: 1.4 $
  + * $Date: 2001/12/28 03:59:41 $
    *
    * ====================================================================
    *
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -72,7 +72,7 @@
    *
    * @author Craig McClanahan
    * @author Paulo Gaspar
  - * @version $Revision: 1.3 $ $Date: 2001/12/28 00:33:56 $
  + * @version $Revision: 1.4 $ $Date: 2001/12/28 03:59:41 $
    */
   
   public interface DynaBean {
  @@ -85,9 +85,6 @@
        * <code>contains()</code> method to distinguish these cases.
        *
        * @param name Name of the property whose value is to be retrieved
  -     *
  -     * @exception IllegalStateException if the specified property
  -     *  exists, but has been defined as write-only
        */
       public Object get(String name);
   
  @@ -103,8 +100,6 @@
        *
        * @exception IllegalArgumentException if the specified property
        *  exists, but is not indexed
  -     * @exception IllegalStateException if the specified property
  -     *  exists, but has been defined as write-only 
        */
       public Object get(String name, int index);
   
  @@ -120,8 +115,6 @@
        *
        * @exception IllegalArgumentException if the specified property
        *  exists, but is not mapped
  -     * @exception IllegalStateException if the specified property
  -     *  exists, but has been defined as write-only
        */
       public Object get(String name, String key);
   
  @@ -134,24 +127,6 @@
   
   
       /**
  -     * Return the value of the "dynamic modified" property, which will be
  -     * <code>true</code> if any dynamic property has been the subject of a
  -     * <code>set()</code> method call (even if the actual value did not
  -     * change) since the last time that <code>setDynaModified(false)</code>
  -     * was called for this instance.
  -     */
  -    public boolean isDynaModified();
  -
  -
  -    /**
  -     * Return the value of the "dynamic read only" property, which will be
  -     * <code>true</code> if <code>set()</code> method calls against this
  -     * property will fail because this bean has been marked read-only.
  -     */
  -    public boolean isDynaReadOnly();
  -
  -
  -    /**
        * Set the value of a simple property with the specified name.  A null
        * value is allowed unless the underlying property type is a primitive.
        * If there is a Converter specified for our associated DynaClass, and
  @@ -164,12 +139,6 @@
        *
        * @exception ConversionException if the specified value cannot be
        *  converted to the type required for this property
  -     * @exception IllegalArgumentException if the specified value cannot
  -     *  be converted to the required property type
  -     * @exception IllegalStateException if the specified property exists,
  -     *  but has been defined as read-only
  -     * @exception IllegalStateException if the specified property exists
  -     *  and is writeable, but this bean instance has been marked read only
        */
       public void set(String name, Object value);
   
  @@ -224,22 +193,6 @@
        *  and is writeable, but this bean instance has been marked read only
        */
       public void set(String name, String key, Object value);
  -
  -
  -    /**
  -     * Set the value of the "dynamic modified" property.
  -     *
  -     * @param dynaModified The new dynamic modified property setting
  -     */
  -    public void setDynaModified(boolean dynaModified);
  -
  -
  -    /**
  -     * Set the value of the "dynamic read only" property.
  -     *
  -     * @param dynaReadOnly The new dynamic read only property setting
  -     */
  -    public void setDynaReadOnly(boolean dynaReadOnly);
   
   
   }
  
  
  
  1.4       +15 -8     jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaClass.java
  
  Index: DynaClass.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaClass.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DynaClass.java	2001/12/28 00:33:56	1.3
  +++ DynaClass.java	2001/12/28 03:59:41	1.4
  @@ -1,13 +1,13 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaClass.java,v 1.3 2001/12/28 00:33:56 craigmcc Exp $
  - * $Revision: 1.3 $
  - * $Date: 2001/12/28 00:33:56 $
  + * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaClass.java,v 1.4 2001/12/28 03:59:41 craigmcc Exp $
  + * $Revision: 1.4 $
  + * $Date: 2001/12/28 03:59:41 $
    *
    * ====================================================================
    *
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -76,7 +76,7 @@
    * @author Craig McClanahan
    * @author Michael Smith
    * @author Paulo Gaspar
  - * @version $Revision: 1.3 $ $Date: 2001/12/28 00:33:56 $
  + * @version $Revision: 1.4 $ $Date: 2001/12/28 03:59:41 $
    */
   
   public interface DynaClass {
  @@ -98,7 +98,7 @@
        * @param name Name of the dynamic property for which a descriptor
        *  is requested
        */
  -    public PropertyDescriptor getPropertyDescriptor(String name);
  +    public DynaProperty getPropertyDescriptor(String name);
   
   
       /**
  @@ -110,14 +110,21 @@
        * <code>getBeanInfo()</code> instead, which returns property descriptors
        * and a bunch of other stuff?</p>
        */
  -    public PropertyDescriptor[] getPropertyDescriptors();
  +    public DynaProperty[] getPropertyDescriptors();
   
   
       /**
        * Instantiate and return a new DynaBean instance, using the implementation
        * class specified by the <code>dynaBeanClass</code> property.
  +     *
  +     * @exception IllegalAccessException if the Class or the appropriate
  +     *  constructor is not accessible
  +     * @exception InstantiationException if this Class represents an abstract
  +     *  class, an array class, a primitive type, or void; or if instantiation
  +     *  fails for some other reason
        */
  -    public DynaBean newInstance();
  +    public DynaBean newInstance()
  +        throws IllegalAccessException, InstantiationException;
   
   
   }
  
  
  
  1.1                  jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaBean.java
  
  Index: BasicDynaBean.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaBean.java,v 1.1 2001/12/28 03:59:41 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2001/12/28 03:59:41 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 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 apache@apache.org.
   *
   * 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;
  
  
  import java.util.HashMap;
  
  
  /**
   * <p>Minimal implementation of the <code>DynaBean</code> interface.  Can be
   * used as a convenience base class for more sophisticated implementations.</p>
   *
   * <p><strong>IMPLEMENTATION NOTE</strong> - Instances of this class that are
   * accessed from multiple threads simultaneously need to be synchronized.</p>
   *
   * @author Craig McClanahan
   * @version $Revision: 1.1 $ $Date: 2001/12/28 03:59:41 $
   */
  
  public class BasicDynaBean implements DynaBean {
  
  
       // ---------------------------------------------------------- Constructors
  
  
      /**
       * Construct a new <code>DynaBean</code> associated with the specified
       * <code>DynaClass</code> instance.
       *
       * @param dynaClass The DynaClass we are associated with
       */
      public BasicDynaBean(DynaClass dynaClass) {
  
          super();
          this.dynaClass = dynaClass;
  
      }
  
  
       // ---------------------------------------------------- Instance Variables
  
  
      /**
       * The <code>DynaClass</code> "base class" that this DynaBean
       * is associated with.
       */
      protected DynaClass dynaClass = null;
  
  
      /**
       * Have any properties of this instance been modified since the last time
       * that <code>setDynaModified(false)</code> was called?
       */
      protected boolean modified = false;
  
  
      /**
       * Has this DynaBean instance been declared read only?
       */
      protected boolean readOnly = false;
  
  
      /**
       * The set of property values for this DynaBean, keyed by property name.
       */
      protected HashMap values = new HashMap();
  
  
       // ------------------------------------------------------ DynaBean Methods
  
  
      /**
       * Return the value of a simple property with the specified name.  A
       * <code>null</code> return value means that either the property does
       * not exist, or that the property exists with a null value.  Use the
       * <code>contains()</code> method to distinguish these cases.
       *
       * @param name Name of the property whose value is to be retrieved
       *
       * @exception IllegalArgumentException if there is no property
       *  of the specified name
       */
      public Object get(String name) {
  
          if (!values.containsKey(name))
              throw new IllegalArgumentException
                  ("No property " + name + " exists");
  
          return (values.get(name));
  
      }
  
  
      /**
       * Return the value of an indexed property with the specified name.  A
       * <code>null</code> return value means that either the property does
       * not exist, or that the property exists with a null value.  Use the
       * <code>contains()</code> method to distinguish these cases.
       *
       * @param name Name of the property whose value is to be retrieved
       * @param index Index of the value to be retrieved
       *
       * @exception IllegalArgumentException if there is no property
       *  of the specified name
       * @exception IllegalArgumentException if the specified property
       *  exists, but is not indexed
       */
      public Object get(String name, int index) {
  
          if (!values.containsKey(name))
              throw new IllegalArgumentException
                  ("No property " + name + " exists");
  
          return (null); // FIXME - get(String,int)
  
      }
  
  
      /**
       * Return the value of a mapped property with the specified name.  A
       * <code>null</code> return value means that either the property does
       * not exist, or that the property exists with a null value.  Use the
       * <code>contains()</code> method to distinguish these cases.
       *
       * @param name Name of the property whose value is to be retrieved
       * @param key Key of the value to be retrieved
       *
       * @exception IllegalArgumentException if there is no property
       *  of the specified name
       * @exception IllegalArgumentException if the specified property
       *  exists, but is not mapped
       */
      public Object get(String name, String key) {
  
          if (!values.containsKey(name))
              throw new IllegalArgumentException
                  ("No property " + name + " exists");
  
          return (null); // FIXME - get(String, String)
  
      }
  
  
      /**
       * Return the <code>DynaClass</code> instance that describes the set of
       * properties available for this DynaBean.
       */
      public DynaClass getDynaClass() {
  
          return (this.dynaClass);
  
      }
  
  
      /**
       * Set the value of a simple property with the specified name.  A null
       * value is allowed unless the underlying property type is a primitive.
       * If there is a Converter specified for our associated DynaClass, and
       * if the specified property is restricted to a particular data type,
       * the Converter will be used as necessary to convert the input value to
       * an object of the specified type.
       *
       * @param name Name of the property whose value is to be set
       * @param value Value to which this property is to be set
       *
       * @exception ConversionException if the specified value cannot be
       *  converted to the type required for this property
       * @exception IllegalArgumentException if there is no property
       *  of the specified name
       * @exception IllegalStateException if the specified property exists
       *  and is writeable, but this bean instance has been marked read only
       */
      public void set(String name, Object value) {
  
          DynaProperty descriptor = dynaClass.getPropertyDescriptor(name);
          if (descriptor == null)
              throw new IllegalArgumentException
                  ("No property " + name + " exists");
          if (value != null)
              if (!descriptor.getType().isAssignableFrom(value.getClass()))
                  throw new IllegalArgumentException
                      ("Cannot assign value of type " +
                       value.getClass().getName() +
                       " to property " + name);
          if (readOnly)
              throw new IllegalStateException
                  ("This instance is read-only");
  
          this.modified = true;
          values.put(name, value);
  
      }
  
  
      /**
       * Set the value of an indexed property with the specified name.  A null
       * value is allowed unless the underlying property type is a primitive.
       * If there is a Converter specified for our associated DynaClass, and
       * if the specified property is restricted to a particular data type,
       * the Converter will be used as necessary to convert the input value to
       * an object of the specified type.
       *
       * @param name Name of the property whose value is to be set
       * @param index Index of the property to be set
       * @param value Value to which this property is to be set
       *
       * @exception ConversionException if the specified value cannot be
       *  converted to the type required for this property
       * @exception IllegalArgumentException if the specified value cannot
       *  be converted to the required property type
       * @exception IllegalArgumentException if the specified property
       *  exists, but is not indexed
       * @exception IllegalStateException if the specified property exists,
       *  but has been defined as read-only
       * @exception IllegalStateException if the specified property exists
       *  and is writeable, but this bean instance has been marked read only
       */
      public void set(String name, int index, Object value) {
  
          ; // FIXME - set(String, int, Object)
  
      }
  
  
      /**
       * Set the value of a mapped property with the specified name.  A null
       * value is allowed unless the underlying property type is a primitive.
       * If there is a Converter specified for our associated DynaClass, and
       * if the specified property is restricted to a particular data type,
       * the Converter will be used as necessary to convert the input value to
       * an object of the specified type.
       *
       * @param name Name of the property whose value is to be set
       * @param key Key of the property to be set
       * @param value Value to which this property is to be set
       *
       * @exception ConversionException if the specified value cannot be
       *  converted to the type required for this property
       * @exception IllegalArgumentException if the specified value cannot
       *  be converted to the required property type
       * @exception IllegalArgumentException if the specified property
       *  exists, but is not mapped
       * @exception IllegalStateException if the specified property exists,
       *  but has been defined as read-only
       * @exception IllegalStateException if the specified property exists
       *  and is writeable, but this bean instance has been marked read only
       */
      public void set(String name, String key, Object value) {
  
          ; // FIXME - set(String, String, Object)
  
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Return the value of the "dynamic modified" property, which will be
       * <code>true</code> if any dynamic property has been the subject of a
       * <code>set()</code> method call (even if the actual value did not
       * change) since the last time that <code>setDynaModified(false)</code>
       * was called for this instance.
       */
      public boolean isModified() {
  
          return (this.modified);
  
      }
  
  
      /**
       * Return the value of the "dynamic read only" property, which will be
       * <code>true</code> if <code>set()</code> method calls against this
       * property will fail because this bean has been marked read-only.
       */
      public boolean isReadOnly() {
  
          return (this.readOnly);
  
      }
  
  
      /**
       * Set the value of the "dynamic modified" property.
       *
       * @param modified The new dynamic modified property setting
       */
      public void setModified(boolean modified) {
  
          this.modified = modified;
  
      }
  
  
      /**
       * Set the value of the "dynamic read only" property.
       *
       * @param readOnly The new dynamic read only property setting
       */
      public void setReadOnly(boolean readOnly) {
  
          this.readOnly = readOnly;
  
      }
  
  
  }
  
  
  
  1.1                  jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaClass.java
  
  Index: BasicDynaClass.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/BasicDynaClass.java,v 1.1 2001/12/28 03:59:41 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2001/12/28 03:59:41 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 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 apache@apache.org.
   *
   * 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;
  
  
  import java.beans.PropertyDescriptor;
  import java.lang.reflect.Constructor;
  import java.lang.reflect.InvocationTargetException;
  
  
  /**
   * <p>Minimal implementation of the <code>DynaClass</code> interface.  Can be
   * used as a convenience base class for more sophisticated implementations.</p> *
   * <p><strong>IMPLEMENTATION NOTE</strong> - The <code>DynaBean</code>
   * implementation class supplied to our constructor MUST have a one-argument
   * constructor of its own that accepts a <code>DynaClass</code>.  This is
   * used to associate the DynaBean instance with this DynaClass.</p>
   *
   * @author Craig McClanahan
   * @version $Revision: 1.1 $ $Date: 2001/12/28 03:59:41 $
   */
  
  public class BasicDynaClass implements DynaClass {
  
  
      // ----------------------------------------------------------- Constructors
  
  
      /**
       * Construct a new BasicDynaClass with default parameters.
       */
      public BasicDynaClass() {
  
          this(null, null, null);
  
      }
  
  
      /**
       * Construct a new BasicDynaClass with the specified parameters.
       *
       * @param name Name of this DynaBean class
       * @param dynaBeanClass The implementation class for new instances
       */
      public BasicDynaClass(String name, Class dynaBeanClass) {
  
          this(name, dynaBeanClass, null);
  
      }
  
  
      /**
       * Construct a new BasicDynaClass with the specified parameters.
       *
       * @param name Name of this DynaBean class
       * @param dynaBeanClass The implementation class for new intances
       * @param properties Property descriptors for the supported properties
       */
      public BasicDynaClass(String name, Class dynaBeanClass,
                            DynaProperty properties[]) {
  
          super();
          if (name != null)
              this.name = name;
          if (dynaBeanClass != null)
              setDynaBeanClass(dynaBeanClass);
          if (properties != null)
              this.properties = properties;
  
      }
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The constructor of the <code>dynaBeanClass</code> that we will use
       * for creating new instances.
       */
      protected Constructor constructor = null;
  
  
      /**
       * The method signature of the constructor we will use to create
       * new DynaBean instances.
       */
      protected static Class constructorTypes[] = { DynaClass.class };
  
  
      /**
       * The argument values to be passed to the constructore we will use
       * to create new DynaBean instances.
       */
      protected Object constructorValues[] = { this };
  
  
      /**
       * The <code>DynaBean</code> implementation class we will use for
       * creating new instances.
       */
      protected Class dynaBeanClass = null;  // BasicDynaBean.class
  
  
      /**
       * The "name" of this DynaBean class.
       */
      protected String name = this.getClass().getName();
  
  
      /**
       * The set of dynamic properties that are part of this DynaClass.
       */
      protected DynaProperty properties[] = new DynaProperty[0];
  
  
      // ------------------------------------------------------ DynaClass Methods
  
  
      /**
       * Return the Class object we will use to create new instances in the
       * <code>newInstance()</code> method.  This Class <strong>MUST</strong>
       * implement the <code>DynaBean</code> interface.
       */
      public Class getDynaBeanClass() {
  
          return (this.dynaBeanClass);
  
      }
  
  
      /**
       * Return the name of this DynaClass (analogous to the
       * <code>getName()</code> method of <code>java.lang.Class</code), which
       * allows the same <code>DynaClass</code> implementation class to support
       * different dynamic classes, with different sets of properties.
       */
      public String getName() {
  
          return (this.name);
  
      }
  
  
      /**
       * Return a property descriptor for the specified property, if it exists;
       * otherwise, return <code>null</code>.
       *
       * @param name Name of the dynamic property for which a descriptor
       *  is requested
       */
      public DynaProperty getPropertyDescriptor(String name) {
  
          // FIXME - HashMap for better performance?
          for (int i = 0; i < properties.length; i++) {
              if (name.equals(properties[i].getName()))
                  return (properties[i]);
          }
          return (null);
  
      }
  
  
      /**
       * <p>Return an array of <code>ProperyDescriptors</code> for the properties
       * currently defined in this DynaClass.  If no properties are defined, a
       * zero-length array will be returned.</p>
       *
       * <p><strong>FIXME</strong> - Should we really be implementing
       * <code>getBeanInfo()</code> instead, which returns property descriptors
       * and a bunch of other stuff?</p>
       */
      public DynaProperty[] getPropertyDescriptors() {
  
          return (properties);
  
      }
  
  
      /**
       * Instantiate and return a new DynaBean instance, using the implementation
       * class specified by the <code>dynaBeanClass</code> property.
       *
       * @exception IllegalAccessException if the Class or the appropriate
       *  constructor is not accessible
       * @exception InstantiationException if this Class represents an abstract
       *  class, an array class, a primitive type, or void; or if instantiation
       *  fails for some other reason
       */
      public DynaBean newInstance()
          throws IllegalAccessException, InstantiationException {
  
          try {
              return ((DynaBean) constructor.newInstance(constructorValues));
          } catch (InvocationTargetException e) {
              throw new InstantiationException
                  (e.getTargetException().getMessage());
          }
  
      }
  
  
      // ------------------------------------------------------ Protected Methods
  
  
      /**
       * Set the Class object we will use to create new instances in the
       * <code>newInstance()</code> method.  This Class <strong>MUST</strong>
       * implement the <code>DynaBean</code> interface.
       *
       * @param dynaBeanClass The new Class object
       *
       * @exception IllegalArgumentException if the specified Class does not
       *  implement the <code>DynaBean</code> interface
       */
      protected void setDynaBeanClass(Class dynaBeanClass) {
  
          // Validate the argument type specified
          if (dynaBeanClass.isInterface())
              throw new IllegalArgumentException
                  ("Class " + dynaBeanClass.getName() +
                   " is an interface, not a class");
          if (DynaBean.class.isAssignableFrom(dynaBeanClass))
              throw new IllegalArgumentException
                  ("Class " + dynaBeanClass.getName() +
                   " does not implement DynaBean");
  
          // Identify the Constructor we will use in newInstance()
          try {
              this.constructor = dynaBeanClass.getConstructor(constructorTypes);
          } catch (NoSuchMethodException e) {
              throw new IllegalArgumentException
                  ("Class " + dynaBeanClass.getName() +
                   " does not have an appropriate constructor");
          }
          this.dynaBeanClass = dynaBeanClass;
  
      }
  
  
  }
  
  
  
  1.1                  jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaProperty.java
  
  Index: DynaProperty.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/beanutils/src/java/org/apache/commons/beanutils/DynaProperty.java,v 1.1 2001/12/28 03:59:41 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2001/12/28 03:59:41 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 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 apache@apache.org.
   *
   * 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;
  
  
  /**
   * <p>The metadata describing an individual property of a DynaBean.</p>
   *
   * @author Craig R. McClanahan
   * @version $Revision: 1.1 $ $Date: 2001/12/28 03:59:41 $
   */
  
  public class DynaProperty {
  
  
      // ----------------------------------------------------------- Constructors
  
  
      /**
       * Construct a property that accepts any data type.
       *
       * @param name Name of the property being described
       */
      public DynaProperty(String name) {
  
          this(name, Object.class);
  
      }
  
  
      /**
       * Construct a property of the specified data type.
       *
       * @param name Name of the property being described
       * @param type Java class representing the property data type
       */
      public DynaProperty(String name, Class type) {
  
          super();
          this.name = name;
          this.type = type;
  
      }
  
  
      // ------------------------------------------------------------- Properties
  
  
      /**
       * The name of this property.
       */
      protected String name = null;
  
      public String getName() {
          return (this.name);
      }
  
  
      /**
       * The Java class representing the data type of the underlying property
       * values.
       */
      protected Class type = null;
  
      public Class getType() {
          return (this.type);
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Return a String representation of this Object.
       */
      public String toString() {
  
          StringBuffer sb = new StringBuffer("DynaProperty[name=");
          sb.append(this.name);
          sb.append(",type=");
          sb.append(this.type);
          sb.append("]");
          return (sb.toString());
  
      }
  
  
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


RE: cvs commit: jakarta-commons/beanutils/src/java/org/apache/commons/beanutils BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java DynaClass.java

Posted by Nicholas Lesiecki <ni...@eblox.com>.
Yep. It's in the sun coding standards. Brackets for everything. even one
liners.

Cheers,

Nick

-----Original Message-----
From: Erik Hatcher [mailto:jakarta-commons@ehatchersolutions.com]
Sent: Friday, December 28, 2001 7:06 AM
To: Jakarta Commons Developers List
Subject: Re: cvs commit:
jakarta-commons/beanutils/src/java/org/apache/commons/beanutils
BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java
DynaClass.java


A question about coding standards...

----- Original Message -----
From: <cr...@apache.org>

>           if (!values.containsKey(name))
>               throw new IllegalArgumentException
>                   ("No property " + name + " exists");

I'm in the camp that believes curly brackets should surround even single
statement code blocks.  Is this mentioned in the Sun coding standards?

Granted, Struts works very well, but ActionServlet drives me crazy to read
through!  :)  (no offense, Craig)

But more importantly, why the inconsistency?

>           try {
>               return ((DynaBean)
constructor.newInstance(constructorValues));
>           } catch (InvocationTargetException e) {
>               throw new InstantiationException
>                   (e.getTargetException().getMessage());
>           }

Curly brackets are used for try/catch, but not for if.

I'd like to push for always using curly brackets, but those might be
fighting words for some.... so ignore little ol' me if its a big deal as I
don't want to get a long thread started about such things, I just wanted to
bring it up and see if this particular issue is specified in the Jakarta
(aka Sun) coding standards.  I'm a follower (as best I humanly can) of the
guidelines in the book The Elements of Java Style.

    Erik



--
To unsubscribe, e-mail:
<ma...@jakarta.apache.org>
For additional commands, e-mail:
<ma...@jakarta.apache.org>


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-commons/beanutils/src/java/org/apache/commons/beanutils BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java DynaClass.java

Posted by Erik Hatcher <ja...@ehatchersolutions.com>.
----- Original Message ----- 
From: "Craig R. McClanahan" <cr...@apache.org>
> Sounds fine to me ... let's just not fight about whether the left brace
> goes on the end of the "if" or not ...

Don't worry about that.... I was definitely NOT going to go there....  :)


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-commons/beanutils/src/java/org/apache/commons/beanutils BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java DynaClass.java

Posted by "Craig R. McClanahan" <cr...@apache.org>.

On Fri, 28 Dec 2001, Erik Hatcher wrote:

> Date: Fri, 28 Dec 2001 09:05:32 -0500
> From: Erik Hatcher <ja...@ehatchersolutions.com>
> Reply-To: Jakarta Commons Developers List <co...@jakarta.apache.org>
> To: Jakarta Commons Developers List <co...@jakarta.apache.org>
> Subject: Re: cvs commit:
>     jakarta-commons/beanutils/src/java/org/apache/commons/beanutils
>     BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java
>     DynaClass.java
>
> A question about coding standards...
>
> ----- Original Message -----
> From: <cr...@apache.org>
>
> >           if (!values.containsKey(name))
> >               throw new IllegalArgumentException
> >                   ("No property " + name + " exists");
>
> I'm in the camp that believes curly brackets should surround even single
> statement code blocks.  Is this mentioned in the Sun coding standards?
>

They do ... Section 7.4.

> Granted, Struts works very well, but ActionServlet drives me crazy to read
> through!  :)  (no offense, Craig)
>

:-)

> But more importantly, why the inconsistency?
>

Laziness and sloth ... because my fingers have been typing if statements
like this for a loooong time.  :-)

I have no problems with switching to { } around all if blocks.

> >           try {
> >               return ((DynaBean)
> constructor.newInstance(constructorValues));
> >           } catch (InvocationTargetException e) {
> >               throw new InstantiationException
> >                   (e.getTargetException().getMessage());
> >           }
>
> Curly brackets are used for try/catch, but not for if.
>

Java code won't compile without these braces ... it will without braces on
the if statements.

> I'd like to push for always using curly brackets, but those might be
> fighting words for some.... so ignore little ol' me if its a big deal as I
> don't want to get a long thread started about such things, I just wanted to
> bring it up and see if this particular issue is specified in the Jakarta
> (aka Sun) coding standards.  I'm a follower (as best I humanly can) of the
> guidelines in the book The Elements of Java Style.
>

Sounds fine to me ... let's just not fight about whether the left brace
goes on the end of the "if" or not ...

>     Erik
>

Craig


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-commons/beanutils/src/java/org/apache/commons/beanutils BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java DynaClass.java

Posted by "Geir Magnusson Jr." <ge...@optonline.net>.
On 12/28/01 9:05 AM, "Erik Hatcher" <ja...@ehatchersolutions.com>
wrote:

> A question about coding standards...
> 
> ----- Original Message -----
> From: <cr...@apache.org>
> 
>>           if (!values.containsKey(name))
>>               throw new IllegalArgumentException
>>                   ("No property " + name + " exists");
> 
> I'm in the camp that believes curly brackets should surround even single
> statement code blocks.  Is this mentioned in the Sun coding standards?
> 
> Granted, Struts works very well, but ActionServlet drives me crazy to read
> through!  :)  (no offense, Craig)
> 
> But more importantly, why the inconsistency?
> 
>>           try {
>>               return ((DynaBean)
> constructor.newInstance(constructorValues));
>>           } catch (InvocationTargetException e) {
>>               throw new InstantiationException
>>                   (e.getTargetException().getMessage());
>>           }
> 
> Curly brackets are used for try/catch, but not for if.
> 
> I'd like to push for always using curly brackets, but those might be
> fighting words for some.... so ignore little ol' me if its a big deal as I
> don't want to get a long thread started about such things, I just wanted to
> bring it up and see if this particular issue is specified in the Jakarta
> (aka Sun) coding standards.  I'm a follower (as best I humanly can) of the
> guidelines in the book The Elements of Java Style.
> 
>   Erik
> 

I know this will turn into a firefight, so I will toss my grenade and run,
but I agree with you - brackets for single statements in an if() block make
things so much easier to read, and help prevent unintentional bugs when
someone adds another statement and forgets to add the braces...


-- 
Geir Magnusson Jr.                                     geirm@optonline.net
System and Software Consulting
"He who throws mud only loses ground." - Fat Albert


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-commons/beanutils/src/java/org/apache/commons/beanutils BasicDynaBean.java BasicDynaClass.java DynaProperty.java DynaBean.java DynaClass.java

Posted by Erik Hatcher <ja...@ehatchersolutions.com>.
A question about coding standards...

----- Original Message -----
From: <cr...@apache.org>

>           if (!values.containsKey(name))
>               throw new IllegalArgumentException
>                   ("No property " + name + " exists");

I'm in the camp that believes curly brackets should surround even single
statement code blocks.  Is this mentioned in the Sun coding standards?

Granted, Struts works very well, but ActionServlet drives me crazy to read
through!  :)  (no offense, Craig)

But more importantly, why the inconsistency?

>           try {
>               return ((DynaBean)
constructor.newInstance(constructorValues));
>           } catch (InvocationTargetException e) {
>               throw new InstantiationException
>                   (e.getTargetException().getMessage());
>           }

Curly brackets are used for try/catch, but not for if.

I'd like to push for always using curly brackets, but those might be
fighting words for some.... so ignore little ol' me if its a big deal as I
don't want to get a long thread started about such things, I just wanted to
bring it up and see if this particular issue is specified in the Jakarta
(aka Sun) coding standards.  I'm a follower (as best I humanly can) of the
guidelines in the book The Elements of Java Style.

    Erik



--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>