com.opensymphony.xwork2.util
Class DefaultObjectTypeDeterminer

java.lang.Object
  extended by com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer
All Implemented Interfaces:
ObjectTypeDeterminer
Direct Known Subclasses:
GenericsObjectTypeDeterminer

public class DefaultObjectTypeDeterminer
extends Object
implements ObjectTypeDeterminer

This ObjectTypeDeterminer looks at the Class-conversion.properties for entries that indicated what objects are contained within Maps and Collections. For Collections, such as Lists, the element is specified using the pattern Element_xxx, where xxx is the field name of the collection property in your action or object. For Maps, both the key and the value may be specified by using the pattern Key_xxx and Element_xxx, respectively.

From WebWork 2.1.x, the Collection_xxx format is still supported and honored, although it is deprecated and will be removed eventually.

Author:
Gabriel Zimmerman
See Also:
XWorkListPropertyAccessor, XWorkCollectionPropertyAccessor, XWorkMapPropertyAccessor

Field Summary
static String CREATE_IF_NULL_PREFIX
           
static String DEPRECATED_ELEMENT_PREFIX
           
static String ELEMENT_PREFIX
           
static String KEY_PREFIX
           
static String KEY_PROPERTY_PREFIX
           
protected static Log LOG
           
 
Constructor Summary
DefaultObjectTypeDeterminer()
           
 
Method Summary
protected
<T extends Annotation>
T
getAnnotation(Class parentClass, String property, Class<T> annotationClass)
          Retrieves an annotation for the specified property of field, setter or getter.
private
<T extends Annotation>
T
getAnnotationFromGetter(Class parentClass, String property, Class<T> annotationClass)
          Retrieves an annotation for the specified field of getter.
private
<T extends Annotation>
T
getAnnotationFromSetter(Class parentClass, String property, Class<T> annotationClass)
          Retrieves an annotation for the specified field of setter.
private  Class getClass(Class parentClass, String property, boolean element)
          Returns the class for the given field via generic type check.
 Class getElementClass(Class parentClass, String property, Object key)
          Determines the element class by looking for the value of @Element annotation for the given class.
 Class getKeyClass(Class parentClass, String property)
          Determines the key class by looking for the value of @Key annotation for the given class.
 String getKeyProperty(Class parentClass, String property)
          Determines the key property for a Collection by getting it from the @KeyProperty annotation.
 boolean shouldCreateIfNew(Class parentClass, String property, Object target, String keyProperty, boolean isIndexAccessed)
          Determines the createIfNull property for a Collection or Map by getting it from the @CreateIfNull annotation.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

LOG

protected static final Log LOG

KEY_PREFIX

public static final String KEY_PREFIX
See Also:
Constant Field Values

ELEMENT_PREFIX

public static final String ELEMENT_PREFIX
See Also:
Constant Field Values

KEY_PROPERTY_PREFIX

public static final String KEY_PROPERTY_PREFIX
See Also:
Constant Field Values

CREATE_IF_NULL_PREFIX

public static final String CREATE_IF_NULL_PREFIX
See Also:
Constant Field Values

DEPRECATED_ELEMENT_PREFIX

public static final String DEPRECATED_ELEMENT_PREFIX
See Also:
Constant Field Values
Constructor Detail

DefaultObjectTypeDeterminer

public DefaultObjectTypeDeterminer()
Method Detail

getKeyClass

public Class getKeyClass(Class parentClass,
                         String property)
Determines the key class by looking for the value of @Key annotation for the given class. If no annotation is found, the key class is determined by using the generic parametrics. As fallback, it determines the key class by looking for the value of Key_${property} in the properties file for the given class.

Specified by:
getKeyClass in interface ObjectTypeDeterminer
Parameters:
parentClass - the Class which contains as a property the Map or Collection we are finding the key for.
property - the property of the Map or Collection for the given parent class
See Also:
ObjectTypeDeterminer.getKeyClass(Class, String)

getElementClass

public Class getElementClass(Class parentClass,
                             String property,
                             Object key)
Determines the element class by looking for the value of @Element annotation for the given class. If no annotation is found, the element class is determined by using the generic parametrics. As fallback, it determines the key class by looking for the value of Element_${property} in the properties file for the given class. Also looks for the deprecated Collection_${property}

Specified by:
getElementClass in interface ObjectTypeDeterminer
Parameters:
parentClass - the Class which contains as a property the Map or Collection we are finding the key for.
property - the property of the Map or Collection for the given parent class
See Also:
ObjectTypeDeterminer.getElementClass(Class, String, Object)

getKeyProperty

public String getKeyProperty(Class parentClass,
                             String property)
Determines the key property for a Collection by getting it from the @KeyProperty annotation. As fallback, it determines the String key property for a Collection by getting it from the conversion properties file using the KeyProperty_ prefix. KeyProperty_${property}=somePropertyOfBeansInTheSet

Specified by:
getKeyProperty in interface ObjectTypeDeterminer
Parameters:
parentClass - the Class which contains as a property the Map or Collection we are finding the key for.
property - the property of the Map or Collection for the given parent class
See Also:
ObjectTypeDeterminer.getKeyProperty(Class, String)

shouldCreateIfNew

public boolean shouldCreateIfNew(Class parentClass,
                                 String property,
                                 Object target,
                                 String keyProperty,
                                 boolean isIndexAccessed)
Determines the createIfNull property for a Collection or Map by getting it from the @CreateIfNull annotation. As fallback, it determines the boolean CreateIfNull property for a Collection or Map by getting it from the conversion properties file using the CreateIfNull_ prefix. CreateIfNull_${property}=true|false

Specified by:
shouldCreateIfNew in interface ObjectTypeDeterminer
Parameters:
parentClass - the Class which contains as a property the Map or Collection we are finding the key for.
property - the property of the Map or Collection for the given parent class
target -
keyProperty -
isIndexAccessed - true, if the collection or map is accessed via index, false otherwise.
Returns:
true, if the Collection or Map should be created, false otherwise.
See Also:
ObjectTypeDeterminer.getKeyProperty(Class, String)

getAnnotation

protected <T extends Annotation> T getAnnotation(Class parentClass,
                                                 String property,
                                                 Class<T> annotationClass)
Retrieves an annotation for the specified property of field, setter or getter.

Type Parameters:
T - the annotation type to be retrieved
Parameters:
parentClass - the class
property - the property
annotationClass - the annotation
Returns:
the field or setter/getter annotation or null if not found

getAnnotationFromGetter

private <T extends Annotation> T getAnnotationFromGetter(Class parentClass,
                                                         String property,
                                                         Class<T> annotationClass)
Retrieves an annotation for the specified field of getter.

Parameters:
parentClass - the Class which contains as a property the Map or Collection we are finding the key for.
property - the property of the Map or Collection for the given parent class
annotationClass - The annotation
Returns:
concrete Annotation instance or null if none could be retrieved.

getAnnotationFromSetter

private <T extends Annotation> T getAnnotationFromSetter(Class parentClass,
                                                         String property,
                                                         Class<T> annotationClass)
Retrieves an annotation for the specified field of setter.

Parameters:
parentClass - the Class which contains as a property the Map or Collection we are finding the key for.
property - the property of the Map or Collection for the given parent class
annotationClass - The annotation
Returns:
concrete Annotation instance or null if none could be retrieved.

getClass

private Class getClass(Class parentClass,
                       String property,
                       boolean element)
Returns the class for the given field via generic type check.

Parameters:
parentClass - the Class which contains as a property the Map or Collection we are finding the key for.
property - the property of the Map or Collection for the given parent class
element - true for indexed types and Maps.
Returns:
Class of the specified field.


Copyright © 2000-2008 Apache Software Foundation. All Rights Reserved.