Package org.apache.commons.beanutils

## Class LazyDynaBean

- java.lang.Object
- - org.apache.commons.beanutils.LazyDynaBean

All Implemented Interfaces:
  `java.io.Serializable`, `DynaBean`

Direct Known Subclasses:
  `LazyDynaMap`

    public class LazyDynaBean
    extends java.lang.Object
    implements DynaBean, java.io.Serializable

DynaBean which automatically adds properties to the `DynaClass` and provides Lazy List and Lazy Map features.

DynaBeans deal with three types of properties - simple, indexed and mapped and have the following `get()` and `set()` methods for each of these types:

- Simple property methods - `get(name)` and `set(name, value)`
- Indexed property methods - `get(name, index)` and `set(name, index, value)`
- Mapped property methods - `get(name, key)` and `set(name, key, value)`

Getting Property Values

Calling any of the `get()` methods, for a property which doesn't exist, returns `null` in this implementation.

Setting Simple Properties

The `LazyDynaBean` will automatically add a property to the `DynaClass` if it doesn't exist when the `set(name, value)` method is called.

`DynaBean myBean = new LazyDynaBean();` `myBean.set("myProperty", "myValue");`

Setting Indexed Properties

If the property doesn't exist, the `LazyDynaBean` will automatically add a property with an `ArrayList` type to the `DynaClass` when the `set(name, index, value)` method is called. It will also instantiate a new `ArrayList` and automatically grow the `List` so that it is big enough to accomodate the index being set. `ArrayList` is the default indexed property that LazyDynaBean uses but this can be easily changed by overriding the `defaultIndexedProperty(name)` method.

`DynaBean myBean = new LazyDynaBean();` `myBean.set("myIndexedProperty", 0, "myValue1");` `myBean.set("myIndexedProperty", 1, "myValue2");`

If the indexed property does exist in the `DynaClass` but is set to `null` in the `LazyDynaBean`, then it will instantiate a new `List` or `Array` as specified by the property's type in the `DynaClass` and automatically grow the `List` or `Array` so that it is big enough to accomodate the index being set.

`DynaBean myBean = new LazyDynaBean();` `MutableDynaClass myClass = (MutableDynaClass)myBean.getDynaClass();` `myClass.add("myIndexedProperty", int[].class);` `myBean.set("myIndexedProperty", 0, new Integer(10));` `myBean.set("myIndexedProperty", 1, new Integer(20));`

Setting Mapped Properties

If the property doesn't exist, the `LazyDynaBean` will automatically add a property with a `HashMap` type to the `DynaClass` and instantiate a new `HashMap` in the DynaBean when the `set(name, key, value)` method is called. `HashMap` is the default mapped property that LazyDynaBean uses but this can be easily changed by overriding the `defaultMappedProperty(name)` method.

`DynaBean myBean = new LazyDynaBean();` `myBean.set("myMappedProperty", "myKey", "myValue");`

If the mapped property does exist in the `DynaClass` but is set to `null` in the `LazyDynaBean`, then it will instantiate a new `Map` as specified by the property's type in the `DynaClass`.

`DynaBean myBean = new LazyDynaBean();` `MutableDynaClass myClass = (MutableDynaClass)myBean.getDynaClass();` `myClass.add("myMappedProperty", TreeMap.class);` `myBean.set("myMappedProperty", "myKey", "myValue");`

Restricted DynaClass

`MutableDynaClass` have a facility to restrict the `DynaClass` so that its properties cannot be modified. If the `MutableDynaClass` is restricted then calling any of the `set()` methods for a property which doesn't exist will result in a `IllegalArgumentException` being thrown.

Version:
  $Id$
See Also:
  `LazyDynaClass`, Serialized Form

### Field Summary

Fields
`protected static java.math.BigDecimal` `BigDecimal_ZERO` BigDecimal Zero
`protected static java.math.BigInteger` `BigInteger_ZERO` BigInteger Zero
`protected static java.lang.Byte` `Byte_ZERO` Byte Zero
`protected static java.lang.Character` `Character_SPACE` Character Space
`protected static java.lang.Double` `Double_ZERO` Double Zero
`protected MutableDynaClass` `dynaClass` The `MutableDynaClass` "base class" that this DynaBean is associated with.
`protected static java.lang.Float` `Float_ZERO` Float Zero
`protected static java.lang.Integer` `Integer_ZERO` Integer Zero
`protected static java.lang.Long` `Long_ZERO` Long Zero
`protected static java.lang.Short` `Short_ZERO` Short Zero
`protected java.util.Map<java.lang.String,​java.lang.Object>` `values` The `MutableDynaClass` "base class" that this DynaBean is associated with.

### Constructor Summary

Constructors
`LazyDynaBean()` Construct a new `LazyDynaBean` with a `LazyDynaClass` instance.
`LazyDynaBean​(java.lang.String name)` Construct a new `LazyDynaBean` with a `LazyDynaClass` instance.
`LazyDynaBean​(DynaClass dynaClass)` Construct a new `DynaBean` associated with the specified `DynaClass` instance - if its not a `MutableDynaClass` then a new `LazyDynaClass` is created and the properties copied.

### Method Summary

All Methods Instance Methods Concrete Methods
`boolean` `contains​(java.lang.String name, java.lang.String key)` Does the specified mapped property contain a value for the specified key value?
`protected java.lang.Object` `createDynaBeanProperty​(java.lang.String name, java.lang.Class<?> type)` Create a new Instance of a 'DynaBean' Property.
`protected java.lang.Object` `createIndexedProperty​(java.lang.String name, java.lang.Class<?> type)` Create a new Instance of an 'Indexed' Property
`protected java.lang.Object` `createMappedProperty​(java.lang.String name, java.lang.Class<?> type)` Create a new Instance of a 'Mapped' Property
`protected java.lang.Object` `createNumberProperty​(java.lang.String name, java.lang.Class<?> type)` Create a new Instance of a `java.lang.Number` Property.
`protected java.lang.Object` `createOtherProperty​(java.lang.String name, java.lang.Class<?> type)` Create a new Instance of other Property types
`protected java.lang.Object` `createPrimitiveProperty​(java.lang.String name, java.lang.Class<?> type)` Create a new Instance of a 'Primitive' Property.
`protected java.lang.Object` `createProperty​(java.lang.String name, java.lang.Class<?> type)` Create a new Instance of a Property
`protected java.lang.Object` `defaultIndexedProperty​(java.lang.String name)` Creates a new `ArrayList` for an 'indexed' property which doesn't exist.
`protected java.util.Map<java.lang.String,​java.lang.Object>` `defaultMappedProperty​(java.lang.String name)` Creates a new `HashMap` for a 'mapped' property which doesn't exist.
`java.lang.Object` `get​(java.lang.String name)` Return the value of a simple property with the specified name.
`java.lang.Object` `get​(java.lang.String name, int index)` Return the value of an indexed property with the specified name.
`java.lang.Object` `get​(java.lang.String name, java.lang.String key)` Return the value of a mapped property with the specified name.
`DynaClass` `getDynaClass()` Return the `DynaClass` instance that describes the set of properties available for this DynaBean.
`java.util.Map<java.lang.String,​java.lang.Object>` `getMap()` Return a Map representation of this DynaBean.
`protected java.lang.Object` `growIndexedProperty​(java.lang.String name, java.lang.Object indexedProperty, int index)` Grow the size of an indexed property
`protected boolean` `isAssignable​(java.lang.Class<?> dest, java.lang.Class<?> source)` Is an object of the source class assignable to the destination class?
`protected boolean` `isDynaProperty​(java.lang.String name)` Indicates if there is a property with the specified name.
`protected java.util.Map<java.lang.String,​java.lang.Object>` `newMap()` Creates a new instance of the `Map`.
`void` `remove​(java.lang.String name, java.lang.String key)` Remove any existing value for the specified key on the specified mapped property.
`void` `set​(java.lang.String name, int index, java.lang.Object value)` Set the value of an indexed property with the specified name.
`void` `set​(java.lang.String name, java.lang.Object value)` Set the value of a simple property with the specified name.
`void` `set​(java.lang.String name, java.lang.String key, java.lang.Object value)` Set the value of a mapped property with the specified name.
`int` `size​(java.lang.String name)` Return the size of an indexed or mapped property.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Field Detail

#### BigInteger_ZERO

    protected static final java.math.BigInteger BigInteger_ZERO

BigInteger Zero

#### BigDecimal_ZERO

    protected static final java.math.BigDecimal BigDecimal_ZERO

BigDecimal Zero

#### Character_SPACE

    protected static final java.lang.Character Character_SPACE

Character Space

#### Byte_ZERO

    protected static final java.lang.Byte Byte_ZERO

Byte Zero

#### Short_ZERO

    protected static final java.lang.Short Short_ZERO

Short Zero

#### Integer_ZERO

    protected static final java.lang.Integer Integer_ZERO

Integer Zero

#### Long_ZERO

    protected static final java.lang.Long Long_ZERO

Long Zero

#### Float_ZERO

    protected static final java.lang.Float Float_ZERO

Float Zero

#### Double_ZERO

    protected static final java.lang.Double Double_ZERO

Double Zero

#### values

    protected java.util.Map<java.lang.String,​java.lang.Object> values

The `MutableDynaClass` "base class" that this DynaBean is associated with.

#### dynaClass

    protected MutableDynaClass dynaClass

The `MutableDynaClass` "base class" that this DynaBean is associated with.

### Constructor Detail

#### LazyDynaBean

    public LazyDynaBean()

Construct a new `LazyDynaBean` with a `LazyDynaClass` instance.

#### LazyDynaBean

    public LazyDynaBean​(java.lang.String name)

Construct a new `LazyDynaBean` with a `LazyDynaClass` instance.

Parameters:
  `name` - Name of this DynaBean class

#### LazyDynaBean

    public LazyDynaBean​(DynaClass dynaClass)

Construct a new `DynaBean` associated with the specified `DynaClass` instance - if its not a `MutableDynaClass` then a new `LazyDynaClass` is created and the properties copied.

Parameters:
  `dynaClass` - The DynaClass we are associated with

### Method Detail

#### getMap

    public java.util.Map<java.lang.String,​java.lang.Object> getMap()

Return a Map representation of this DynaBean. This, for example, could be used in JSTL in the following way to access a DynaBean's `fooProperty`:

- `${myDynaBean.map.fooProperty}`

Returns:
  a Map representation of this DynaBean

#### size

    public int size​(java.lang.String name)

Return the size of an indexed or mapped property.

Parameters:
  `name` - Name of the property
Returns:
  The indexed or mapped property size
Throws:
  `java.lang.IllegalArgumentException` - if no property name is specified

#### contains

    public boolean contains​(java.lang.String name,
                            java.lang.String key)

Does the specified mapped property contain a value for the specified key value?

Specified by:
  `contains` in interface `DynaBean`
Parameters:
  `name` - Name of the property to check
  `key` - Name of the key to check
Returns:
  `true` if the mapped property contains a value for the specified key, otherwise `false`
Throws:
  `java.lang.IllegalArgumentException` - if no property name is specified

#### get

    public java.lang.Object get​(java.lang.String name)

Return the value of a simple property with the specified name.

N.B. Returns `null` if there is no property of the specified name.

Specified by:
  `get` in interface `DynaBean`
Parameters:
  `name` - Name of the property whose value is to be retrieved.
Returns:
  The property's value
Throws:
  `java.lang.IllegalArgumentException` - if no property name is specified

#### get

    public java.lang.Object get​(java.lang.String name,
                                int index)

Return the value of an indexed property with the specified name.

N.B. Returns `null` if there is no 'indexed' property of the specified name.

Specified by:
  `get` in interface `DynaBean`
Parameters:
  `name` - Name of the property whose value is to be retrieved
  `index` - Index of the value to be retrieved
Returns:
  The indexed property's value
Throws:
  `java.lang.IllegalArgumentException` - if the specified property exists, but is not indexed
  `java.lang.IndexOutOfBoundsException` - if the specified index is outside the range of the underlying property

#### get

    public java.lang.Object get​(java.lang.String name,
                                java.lang.String key)

Return the value of a mapped property with the specified name.

N.B. Returns `null` if there is no 'mapped' property of the specified name.

Specified by:
  `get` in interface `DynaBean`
Parameters:
  `name` - Name of the property whose value is to be retrieved
  `key` - Key of the value to be retrieved
Returns:
  The mapped property's value
Throws:
  `java.lang.IllegalArgumentException` - if the specified property exists, but is not mapped

#### getDynaClass

    public DynaClass getDynaClass()

Return the `DynaClass` instance that describes the set of properties available for this DynaBean.

Specified by:
  `getDynaClass` in interface `DynaBean`
Returns:
  The associated DynaClass

#### remove

    public void remove​(java.lang.String name,
                       java.lang.String key)

Remove any existing value for the specified key on the specified mapped property.

Specified by:
  `remove` in interface `DynaBean`
Parameters:
  `name` - Name of the property for which a value is to be removed
  `key` - Key of the value to be removed
Throws:
  `java.lang.IllegalArgumentException` - if there is no property of the specified name

#### set

    public void set​(java.lang.String name,
                    java.lang.Object value)

Set the value of a simple property with the specified name.

Specified by:
  `set` in interface `DynaBean`
Parameters:
  `name` - Name of the property whose value is to be set
  `value` - Value to which this property is to be set
Throws:
  `java.lang.IllegalArgumentException` - if this is not an existing property name for our DynaClass and the MutableDynaClass is restricted
  `ConversionException` - if the specified value cannot be converted to the type required for this property
  `java.lang.NullPointerException` - if an attempt is made to set a primitive property to null

#### set

    public void set​(java.lang.String name,
                    int index,
                    java.lang.Object value)

Set the value of an indexed property with the specified name.

Specified by:
  `set` in interface `DynaBean`
Parameters:
  `name` - Name of the property whose value is to be set
  `index` - Index of the property to be set
  `value` - Value to which this property is to be set
Throws:
  `ConversionException` - if the specified value cannot be converted to the type required for this property
  `java.lang.IllegalArgumentException` - if there is no property of the specified name
  `java.lang.IllegalArgumentException` - if the specified property exists, but is not indexed
  `java.lang.IndexOutOfBoundsException` - if the specified index is outside the range of the underlying property

#### set

    public void set​(java.lang.String name,
                    java.lang.String key,
                    java.lang.Object value)

Set the value of a mapped property with the specified name.

Specified by:
  `set` in interface `DynaBean`
Parameters:
  `name` - Name of the property whose value is to be set
  `key` - Key of the property to be set
  `value` - Value to which this property is to be set
Throws:
  `ConversionException` - if the specified value cannot be converted to the type required for this property
  `java.lang.IllegalArgumentException` - if there is no property of the specified name
  `java.lang.IllegalArgumentException` - if the specified property exists, but is not mapped

#### growIndexedProperty

    protected java.lang.Object growIndexedProperty​(java.lang.String name,
                                                   java.lang.Object indexedProperty,
                                                   int index)

Grow the size of an indexed property

Parameters:
  `name` - The name of the property
  `indexedProperty` - The current property value
  `index` - The indexed value to grow the property to (i.e. one less than the required size)
Returns:
  The new property value (grown to the appropriate size)

#### createProperty

    protected java.lang.Object createProperty​(java.lang.String name,
                                              java.lang.Class<?> type)

Create a new Instance of a Property

Parameters:
  `name` - The name of the property
  `type` - The class of the property
Returns:
  The new value

#### createIndexedProperty

    protected java.lang.Object createIndexedProperty​(java.lang.String name,
                                                     java.lang.Class<?> type)

Create a new Instance of an 'Indexed' Property

Parameters:
  `name` - The name of the property
  `type` - The class of the property
Returns:
  The new value

#### createMappedProperty

    protected java.lang.Object createMappedProperty​(java.lang.String name,
                                                    java.lang.Class<?> type)

Create a new Instance of a 'Mapped' Property

Parameters:
  `name` - The name of the property
  `type` - The class of the property
Returns:
  The new value

#### createDynaBeanProperty

    protected java.lang.Object createDynaBeanProperty​(java.lang.String name,
                                                      java.lang.Class<?> type)

Create a new Instance of a 'DynaBean' Property.

Parameters:
  `name` - The name of the property
  `type` - The class of the property
Returns:
  The new value

#### createPrimitiveProperty

    protected java.lang.Object createPrimitiveProperty​(java.lang.String name,
                                                       java.lang.Class<?> type)

Create a new Instance of a 'Primitive' Property.

Parameters:
  `name` - The name of the property
  `type` - The class of the property
Returns:
  The new value

#### createNumberProperty

    protected java.lang.Object createNumberProperty​(java.lang.String name,
                                                    java.lang.Class<?> type)

Create a new Instance of a `java.lang.Number` Property.

Parameters:
  `name` - The name of the property
  `type` - The class of the property
Returns:
  The new value

#### createOtherProperty

    protected java.lang.Object createOtherProperty​(java.lang.String name,
                                                   java.lang.Class<?> type)

Create a new Instance of other Property types

Parameters:
  `name` - The name of the property
  `type` - The class of the property
Returns:
  The new value

#### defaultIndexedProperty

    protected java.lang.Object defaultIndexedProperty​(java.lang.String name)

Creates a new `ArrayList` for an 'indexed' property which doesn't exist.

This method should be overridden if an alternative `List` or `Array` implementation is required for 'indexed' properties.

Parameters:
  `name` - Name of the 'indexed property.
Returns:
  The default value for an indexed property (java.util.ArrayList)

#### defaultMappedProperty

    protected java.util.Map<java.lang.String,​java.lang.Object> defaultMappedProperty​(java.lang.String name)

Creates a new `HashMap` for a 'mapped' property which doesn't exist.

This method can be overridden if an alternative `Map` implementation is required for 'mapped' properties.

Parameters:
  `name` - Name of the 'mapped property.
Returns:
  The default value for a mapped property (java.util.HashMap)

#### isDynaProperty

    protected boolean isDynaProperty​(java.lang.String name)

Indicates if there is a property with the specified name.

Parameters:
  `name` - The name of the property to check
Returns:
  `true` if there is a property of the specified name, otherwise `false`

#### isAssignable

    protected boolean isAssignable​(java.lang.Class<?> dest,
                                   java.lang.Class<?> source)

Is an object of the source class assignable to the destination class?

Parameters:
  `dest` - Destination class
  `source` - Source class
Returns:
  `true` if the source class is assignable to the destination class, otherwise `false`

#### newMap

    protected java.util.Map<java.lang.String,​java.lang.Object> newMap()

Creates a new instance of the `Map`.

Returns:
  a new Map instance