Class LazyDynaBean
- All Implemented Interfaces:
DynaBean
- Direct Known Subclasses:
LazyDynaMap
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()</code> and <code>set()
methods for
each of these types:
- Simple property methods -
get(name)
andset(name, value)
- Indexed property methods -
get(name, index)
andset(name, index, value)
- Mapped property methods -
get(name, key)
andset(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</code> will automatically add a property to the <code>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</code> type to the <code>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 accommodate 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</code> in the <code>LazyDynaBean
, then it will instantiate a
new List</code> or <code>Array
as specified by the property's type
in the DynaClass</code> and automatically <em>grow</em> the <code>List
or Array
so that it is big enough to accommodate the index being set.
DynaBean myBean = new LazyDynaBean();
MutableDynaClass myClass = (MutableDynaClass)myBean.getDynaClass();
myClass.add("myIndexedProperty", int[].class);
myBean.set("myIndexedProperty", 0, Integer.valueOf(10));
myBean.set("myIndexedProperty", 1, Integer.valueOf(20));
Setting Mapped Properties
If the property doesn't exist, the LazyDynaBean
will automatically add
a property with a HashMap</code> type to the <code>DynaClass
and
instantiate a new HashMap
in the DynaBean when the
set(name, key, value)</code> method is called. <code>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</code> in the <code>LazyDynaBean
, then it will instantiate a
new Map</code> as specified by the property's type in the <code>DynaClass
.
DynaBean myBean = new LazyDynaBean();
MutableDynaClass myClass = (MutableDynaClass)myBean.getDynaClass();
myClass.add("myMappedProperty", TreeMap.class);
myBean.set("myMappedProperty", "myKey", "myValue");
Restricted DynaClass
MutableDynaClass</code> have a facility to <em>restrict</em> the <code>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.
- See Also:
-
Field Summary
Modifier and TypeFieldDescriptionprotected static final BigDecimal
BigDecimal Zeroprotected static final BigInteger
BigInteger Zeroprotected static final Byte
Byte Zeroprotected static final Character
Character Spaceprotected static final Double
Double Zeroprotected MutableDynaClass
TheMutableDynaClass
"base class" that this DynaBean is associated with.protected static final Float
Float Zeroprotected static final Integer
Integer Zeroprotected static final Long
Long Zeroprotected static final Short
Short ZeroTheMutableDynaClass
"base class" that this DynaBean is associated with. -
Constructor Summary
ConstructorDescriptionConstructs a newLazyDynaBean</code> with a <code>LazyDynaClass
instance.LazyDynaBean
(String name) Constructs a newLazyDynaBean</code> with a <code>LazyDynaClass
instance.LazyDynaBean
(DynaClass dynaClass) Constructs a newDynaBean
associated with the specifiedDynaClass</code> instance - if its not a <code>MutableDynaClass
then a newLazyDynaClass
is created and the properties copied. -
Method Summary
Modifier and TypeMethodDescriptionboolean
Does the specified mapped property contain a value for the specified key value?protected Object
createDynaBeanProperty
(String name, Class<?> type) Create a new Instance of a 'DynaBean' Property.protected Object
createIndexedProperty
(String name, Class<?> type) Create a new Instance of an 'Indexed' Propertyprotected Object
createMappedProperty
(String name, Class<?> type) Create a new Instance of a 'Mapped' Propertyprotected Object
createNumberProperty
(String name, Class<?> type) Create a new Instance of aNumber
Property.protected Object
createOtherProperty
(String name, Class<?> type) Create a new Instance of other Property typesprotected Object
createPrimitiveProperty
(String name, Class<?> type) Create a new Instance of a 'Primitive' Property.protected Object
createProperty
(String name, Class<?> type) Create a new Instance of a Propertyprotected Object
defaultIndexedProperty
(String name) Creates a newArrayList
for an 'indexed' property which doesn't exist.defaultMappedProperty
(String name) Creates a newHashMap
for a 'mapped' property which doesn't exist.Return the value of a simple property with the specified name.Return the value of an indexed property with the specified name.Return the value of a mapped property with the specified name.Gets theDynaClass
instance that describes the set of properties available for this DynaBean.getMap()
Gets a Map representation of this DynaBean.protected Object
growIndexedProperty
(String name, Object indexedProperty, int index) Grow the size of an indexed propertyprotected boolean
isAssignable
(Class<?> dest, Class<?> source) Is an object of the source class assignable to the destination class?protected boolean
isDynaProperty
(String name) Indicates if there is a property with the specified name.newMap()
Creates a new instance of theMap
.void
Remove any existing value for the specified key on the specified mapped property.void
Sets the value of an indexed property with the specified name.void
Sets the value of a simple property with the specified name.void
Sets the value of a mapped property with the specified name.int
Return the size of an indexed or mapped property.
-
Field Details
-
BigInteger_ZERO
BigInteger Zero -
BigDecimal_ZERO
BigDecimal Zero -
Character_SPACE
Character Space -
Byte_ZERO
Byte Zero -
Short_ZERO
Short Zero -
Integer_ZERO
Integer Zero -
Long_ZERO
Long Zero -
Float_ZERO
Float Zero -
Double_ZERO
Double Zero -
values
TheMutableDynaClass
"base class" that this DynaBean is associated with. -
dynaClass
TheMutableDynaClass
"base class" that this DynaBean is associated with.
-
-
Constructor Details
-
LazyDynaBean
public LazyDynaBean()Constructs a newLazyDynaBean</code> with a <code>LazyDynaClass
instance. -
LazyDynaBean
Constructs a newDynaBean
associated with the specifiedDynaClass</code> instance - if its not a <code>MutableDynaClass
then a newLazyDynaClass
is created and the properties copied.- Parameters:
dynaClass
- The DynaClass we are associated with
-
LazyDynaBean
Constructs a newLazyDynaBean</code> with a <code>LazyDynaClass
instance.- Parameters:
name
- Name of this DynaBean class
-
-
Method Details
-
contains
Does the specified mapped property contain a value for the specified key value?- Specified by:
contains
in interfaceDynaBean
- Parameters:
name
- Name of the property to checkkey
- Name of the key to check- Returns:
true
if the mapped property contains a value for the specified key, otherwisefalse
- Throws:
IllegalArgumentException
- if no property name is specified
-
createDynaBeanProperty
Create a new Instance of a 'DynaBean' Property.- Parameters:
name
- The name of the propertytype
- The class of the property- Returns:
- The new value
-
createIndexedProperty
Create a new Instance of an 'Indexed' Property- Parameters:
name
- The name of the propertytype
- The class of the property- Returns:
- The new value
-
createMappedProperty
Create a new Instance of a 'Mapped' Property- Parameters:
name
- The name of the propertytype
- The class of the property- Returns:
- The new value
-
createNumberProperty
Create a new Instance of aNumber
Property.- Parameters:
name
- The name of the propertytype
- The class of the property- Returns:
- The new value
-
createOtherProperty
Create a new Instance of other Property types- Parameters:
name
- The name of the propertytype
- The class of the property- Returns:
- The new value
-
createPrimitiveProperty
Create a new Instance of a 'Primitive' Property.- Parameters:
name
- The name of the propertytype
- The class of the property- Returns:
- The new value
-
createProperty
Create a new Instance of a Property- Parameters:
name
- The name of the propertytype
- The class of the property- Returns:
- The new value
-
defaultIndexedProperty
Creates a new
ArrayList
for an 'indexed' property which doesn't exist.This method should be overridden if an alternative
List
orArray
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
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)
-
get
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 interfaceDynaBean
- Parameters:
name
- Name of the property whose value is to be retrieved.- Returns:
- The property's value
- Throws:
IllegalArgumentException
- if no property name is specified
-
get
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 interfaceDynaBean
- Parameters:
name
- Name of the property whose value is to be retrievedindex
- Index of the value to be retrieved- Returns:
- The indexed property's value
- Throws:
IllegalArgumentException
- if the specified property exists, but is not indexedIndexOutOfBoundsException
- if the specified index is outside the range of the underlying property
-
get
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 interfaceDynaBean
- Parameters:
name
- Name of the property whose value is to be retrievedkey
- Key of the value to be retrieved- Returns:
- The mapped property's value
- Throws:
IllegalArgumentException
- if the specified property exists, but is not mapped
-
getDynaClass
Gets theDynaClass
instance that describes the set of properties available for this DynaBean.- Specified by:
getDynaClass
in interfaceDynaBean
- Returns:
- The associated DynaClass
-
getMap
Gets a Map representation of this DynaBean.
This, for example, could be used in JSTL in the following way to access a DynaBean'sfooProperty
:${myDynaBean.<strong>map</strong>.fooProperty}
- Returns:
- a Map representation of this DynaBean
-
growIndexedProperty
Grow the size of an indexed property- Parameters:
name
- The name of the propertyindexedProperty
- The current property valueindex
- 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)
-
isAssignable
Is an object of the source class assignable to the destination class?- Parameters:
dest
- Destination classsource
- Source class- Returns:
true
if the source class is assignable to the destination class, otherwisefalse
-
isDynaProperty
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, otherwisefalse
-
newMap
Creates a new instance of the
Map
.- Returns:
- a new Map instance
-
remove
Remove any existing value for the specified key on the specified mapped property.- Specified by:
remove
in interfaceDynaBean
- Parameters:
name
- Name of the property for which a value is to be removedkey
- Key of the value to be removed- Throws:
IllegalArgumentException
- if there is no property of the specified name
-
set
Sets the value of an indexed property with the specified name.- Specified by:
set
in interfaceDynaBean
- Parameters:
name
- Name of the property whose value is to be setindex
- Index of the property to be setvalue
- Value to which this property is to be set- Throws:
ConversionException
- if the specified value cannot be converted to the type required for this propertyIllegalArgumentException
- if there is no property of the specified nameIllegalArgumentException
- if the specified property exists, but is not indexedIndexOutOfBoundsException
- if the specified index is outside the range of the underlying property
-
set
Sets the value of a simple property with the specified name.- Specified by:
set
in interfaceDynaBean
- Parameters:
name
- Name of the property whose value is to be setvalue
- Value to which this property is to be set- Throws:
IllegalArgumentException
- if this is not an existing property name for our DynaClass and the MutableDynaClass is restrictedConversionException
- if the specified value cannot be converted to the type required for this propertyNullPointerException
- if an attempt is made to set a primitive property to null
-
set
Sets the value of a mapped property with the specified name.- Specified by:
set
in interfaceDynaBean
- Parameters:
name
- Name of the property whose value is to be setkey
- Key of the property to be setvalue
- Value to which this property is to be set- Throws:
ConversionException
- if the specified value cannot be converted to the type required for this propertyIllegalArgumentException
- if there is no property of the specified nameIllegalArgumentException
- if the specified property exists, but is not mapped
-
size
Return the size of an indexed or mapped property.
- Parameters:
name
- Name of the property- Returns:
- The indexed or mapped property size
- Throws:
IllegalArgumentException
- if no property name is specified
-