org.kuali.rice.krad.util
Class ObjectUtils

java.lang.Object
  extended by org.kuali.rice.krad.util.ObjectUtils

public final class ObjectUtils
extends Object

This class contains various Object, Proxy, and serialization utilities.


Method Summary
static String clean(String string)
          Removes all query characters from a string.
static boolean collectionContainsObjectWithIdentitcalKey(Collection<? extends PersistableBusinessObject> controlList, PersistableBusinessObject bo)
          Compares a business object with a List of PersistableBusinessObjects to determine if an object with the same key as the BO exists in the list.
static int countObjectsWithIdentitcalKey(Collection<? extends PersistableBusinessObject> collection, PersistableBusinessObject bo)
          Compares a business object with a Collection of PersistableBusinessObjects to count how many have the same key as the BO.
static void createHybridBusinessObject(BusinessObject businessObject, BusinessObject source, Map<String,String> template)
           
static BusinessObject createHybridBusinessObject(Class businessObjectClass, BusinessObject source, Map<String,String> template)
          Creates a new instance of a given BusinessObject, copying fields specified in template from the given source BO.
static Object createNewObjectFromClass(Class clazz)
          This method safely creates a object from a class Convenience method to create new object and throw a runtime exception if it cannot If the class is an ExternalizableBusinessObject, this method will determine the interface for the EBO and query the appropriate module service to create a new instance.
static Serializable deepCopy(Serializable src)
          Uses Serialization mechanism to create a deep copy of the given Object.
static CopiedObject deepCopyForCaching(Serializable src)
          Uses Serialization mechanism to create a deep copy of the given Object, and returns a CacheableObject instance containing the deepCopy and its size in bytes.
static Class easyGetPropertyType(Object object, String propertyName)
          This method simply uses PojoPropertyUtilsBean logic to get the Class of a Class property.
static boolean equalByKeys(PersistableBusinessObject bo1, PersistableBusinessObject bo2)
          Compares two PersistableBusinessObject instances for equality of type and key values.
static String formatPropertyValue(Object propertyValue)
          Based on the value type selects a formatter and returns the formatted value as a string
static Object fromByteArray(byte[] bytes)
          reconsitiutes the object that was converted into a byte array by toByteArray
static List<Field> getAllFields(List<Field> fields, Class<?> type, Class<?> stopAt)
          Retrieves all fields including the inherited fields for a given class.
static String getFormattedPropertyValue(BusinessObject businessObject, String propertyName, Formatter formatter)
          Gets the property value from the business object, then based on the value type select a formatter and format the value
static String getFormattedPropertyValueUsingDataDictionary(BusinessObject businessObject, String propertyName)
          References the data dictionary to find any registered formatter class then if not found checks for associated formatter for the property type.
static Formatter getFormatterWithDataDictionary(Object bo, String propertyName)
          Returns a Formatter instance for the given property name in the given given business object.
static String getMD5Hash(Object object)
          use MD5 to create a one way hash of an object
static String getNestedAttributePrefix(String attributeName)
          Returns the prefix of a nested attribute name, or the empty string if the attribute name is not nested.
static String getNestedAttributePrimitive(String attributeName)
          Returns the primitive part of an attribute name string.
static Object getNestedValue(Object bo, String fieldName)
          This method safely extracts either simple values OR nested values.
static Class getPropertyType(Object object, String propertyName, PersistenceStructureService persistenceStructureService)
          Returns the type of the property in the object.
static Object getPropertyValue(Object businessObject, String propertyName)
          Returns the value of the property in the object.
static boolean isNestedAttribute(String attributeName)
          Determines if a given string could represent a nested attribute of an object.
static boolean isNotNull(Object object)
          This method is a OJB Proxy-safe way to test for notNull on a proxied object that may or may not be materialized yet.
static boolean isNull(Object object)
          This method is a OJB Proxy-safe way to test for null on a proxied object that may or may not be materialized yet.
static boolean isWriteable(Object object, String property, PersistenceStructureService persistenceStructureService)
          Return whether or not an attribute is writeable.
static void materializeAllSubObjects(PersistableBusinessObject bo)
          This method attempts to materialize all of the proxied reference objects (ie, sub-objects) hanging off the passed-in BO object.
static Class materializeClassForProxiedObject(Object object)
          Attempts to find the Class for the given potentially proxied object
static void materializeObjects(Collection possiblyProxiedObjects)
          This method runs the ObjectUtils.isNotNull() method for each item in a list of BOs.
static void materializeSubObjectsToDepth(PersistableBusinessObject bo, int depth)
          This method attempts to materialize all of the proxied reference objects (ie, sub-objects) hanging off the passed-in BO object.
static void materializeUpdateableCollections(Object bo)
          This method checks for updateable collections on the business object provided and materializes the corresponding collection proxies
static
<T> T
newInstance(Class<T> clazz)
          Helper method for creating a new instance of the given class
static void removeObjectWithIdentitcalKey(Collection<? extends PersistableBusinessObject> controlList, PersistableBusinessObject bo)
          Compares a business object with a List of PersistableBusinessObjects to determine if an object with the same key as the BO exists in the list.
static BusinessObject retrieveObjectWithIdentitcalKey(Collection<? extends PersistableBusinessObject> controlList, PersistableBusinessObject bo)
          Compares a business object with a List of BOs to determine if an object with the same key as the BO exists in the list.
static void setObjectProperty(Formatter formatter, Object bo, String propertyName, Class type, Object propertyValue)
          Sets the property of an object with the given value.
static void setObjectProperty(Object bo, String propertyName, Class propertyType, Object propertyValue)
          Sets the property of an object with the given value.
static void setObjectProperty(Object bo, String propertyName, Object propertyValue)
          Sets the property of an object with the given value.
static void setObjectPropertyDeep(Object bo, String propertyName, Class type, Object propertyValue)
          Recursive; sets all occurences of the property in the object, its nested objects and its object lists with the given value.
static void setObjectPropertyDeep(Object bo, String propertyName, Class type, Object propertyValue, int depth)
           
static byte[] toByteArray(Object object)
          Converts the object to a byte array using the output stream.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

deepCopy

public static Serializable deepCopy(Serializable src)
Uses Serialization mechanism to create a deep copy of the given Object. As a special case, deepCopy of null returns null, just to make using this method simpler. For a detailed discussion see: http://www.javaworld.com/javaworld/javatips/jw-javatip76.html

Parameters:
src -
Returns:
deep copy of the given Serializable

deepCopyForCaching

public static CopiedObject deepCopyForCaching(Serializable src)
Uses Serialization mechanism to create a deep copy of the given Object, and returns a CacheableObject instance containing the deepCopy and its size in bytes. As a special case, deepCopy of null returns a cacheableObject containing null and a size of 0, to make using this method simpler. For a detailed discussion see: http://www.javaworld.com/javaworld/javatips/jw-javatip76.html

Parameters:
src -
Returns:
CopiedObject containing a deep copy of the given Serializable and its size in bytes

toByteArray

public static byte[] toByteArray(Object object)
                          throws Exception
Converts the object to a byte array using the output stream.

Parameters:
object -
Returns:
byte array of the object
Throws:
Exception

fromByteArray

public static Object fromByteArray(byte[] bytes)
                            throws Exception
reconsitiutes the object that was converted into a byte array by toByteArray

Parameters:
bytes -
Returns:
Throws:
Exception

getMD5Hash

public static String getMD5Hash(Object object)
                         throws Exception
use MD5 to create a one way hash of an object

Parameters:
object -
Returns:
Throws:
Exception

createHybridBusinessObject

public static BusinessObject createHybridBusinessObject(Class businessObjectClass,
                                                        BusinessObject source,
                                                        Map<String,String> template)
                                                 throws FormatException,
                                                        IllegalAccessException,
                                                        InvocationTargetException,
                                                        NoSuchMethodException
Creates a new instance of a given BusinessObject, copying fields specified in template from the given source BO. For example, this can be used to create an AccountChangeDetail based on a particular Account.

Parameters:
template - a map defining the relationships between the fields of the newly created BO, and the source BO. For each K (key), V (value) entry, the value of property V on the source BO will be assigned to the K property of the newly created BO
Throws:
NoSuchMethodException
InvocationTargetException
IllegalAccessException
FormatException
See Also:
MaintenanceUtils

createHybridBusinessObject

public static void createHybridBusinessObject(BusinessObject businessObject,
                                              BusinessObject source,
                                              Map<String,String> template)
                                       throws FormatException,
                                              IllegalAccessException,
                                              InvocationTargetException,
                                              NoSuchMethodException
Throws:
FormatException
IllegalAccessException
InvocationTargetException
NoSuchMethodException

easyGetPropertyType

public static Class easyGetPropertyType(Object object,
                                        String propertyName)
                                 throws IllegalAccessException,
                                        NoSuchMethodException,
                                        InvocationTargetException
This method simply uses PojoPropertyUtilsBean logic to get the Class of a Class property. This method does not have any of the logic needed to obtain the Class of an element of a Collection specified in the DataDictionary.

Parameters:
object - An instance of the Class of which we're trying to get the property Class.
propertyName - The name of the property.
Returns:
Throws:
IllegalAccessException
NoSuchMethodException
InvocationTargetException

getPropertyType

public static Class getPropertyType(Object object,
                                    String propertyName,
                                    PersistenceStructureService persistenceStructureService)
Returns the type of the property in the object. This implementation is not smart enough to look through a Collection to get the property type of an attribute of an element in the collection.

NOTE: A patch file attached to https://test.kuali.org/jira/browse/KULRNE-4435 contains a modified version of this method which IS smart enough to look through Collections. This patch is currently under review.

Parameters:
object - An instance of the Class for which we're trying to get the property type.
propertyName - The name of the property of the Class the Class of which we're trying to get. Dot notation is used to separate properties. TODO: The rules about this dot notation needs to be explained in Confluence using examples.
persistenceStructureService - Needed to get the type of elements in a Collection from OJB.
Returns:
Object will be null if any parent property for the given property is null.

getPropertyValue

public static Object getPropertyValue(Object businessObject,
                                      String propertyName)
Returns the value of the property in the object.

Parameters:
businessObject -
propertyName -
Returns:
Object will be null if any parent property for the given property is null.

getFormattedPropertyValue

public static String getFormattedPropertyValue(BusinessObject businessObject,
                                               String propertyName,
                                               Formatter formatter)
Gets the property value from the business object, then based on the value type select a formatter and format the value

Parameters:
businessObject - BusinessObject instance that contains the property
propertyName - Name of property in BusinessObject to get value for
formatter - Default formatter to use (or null)
Returns:
Formatted property value as String, or empty string if value is null

getFormattedPropertyValueUsingDataDictionary

public static String getFormattedPropertyValueUsingDataDictionary(BusinessObject businessObject,
                                                                  String propertyName)
References the data dictionary to find any registered formatter class then if not found checks for associated formatter for the property type. Value is then formatted using the found Formatter

Parameters:
businessObject - BusinessObject instance that contains the property
propertyName - Name of property in BusinessObject to get value for
Returns:
Formatted property value as String, or empty string if value is null

formatPropertyValue

public static String formatPropertyValue(Object propertyValue)
Based on the value type selects a formatter and returns the formatted value as a string

Parameters:
propertyValue - Object value to be formatted
Returns:
formatted value as a String

setObjectProperty

public static void setObjectProperty(Object bo,
                                     String propertyName,
                                     Object propertyValue)
                              throws FormatException,
                                     IllegalAccessException,
                                     InvocationTargetException,
                                     NoSuchMethodException
Sets the property of an object with the given value. Converts using the formatter of the type for the property. Note: propertyType does not need passed, is found by util method.

Throws:
FormatException
IllegalAccessException
InvocationTargetException
NoSuchMethodException

setObjectProperty

public static void setObjectProperty(Object bo,
                                     String propertyName,
                                     Class propertyType,
                                     Object propertyValue)
                              throws FormatException,
                                     IllegalAccessException,
                                     InvocationTargetException,
                                     NoSuchMethodException
Sets the property of an object with the given value. Converts using the formatter of the given type if one is found.

Parameters:
bo -
propertyName -
propertyType -
propertyValue -
Throws:
NoSuchMethodException
InvocationTargetException
IllegalAccessException
FormatException

setObjectProperty

public static void setObjectProperty(Formatter formatter,
                                     Object bo,
                                     String propertyName,
                                     Class type,
                                     Object propertyValue)
                              throws FormatException,
                                     IllegalAccessException,
                                     InvocationTargetException,
                                     NoSuchMethodException
Sets the property of an object with the given value. Converts using the given formatter, if it isn't null.

Parameters:
formatter -
bo -
propertyName -
type -
propertyValue -
Throws:
NoSuchMethodException
InvocationTargetException
IllegalAccessException
FormatException

getFormatterWithDataDictionary

public static Formatter getFormatterWithDataDictionary(Object bo,
                                                       String propertyName)
Returns a Formatter instance for the given property name in the given given business object. First checks if a formatter is defined for the attribute in the data dictionary, is not found then returns the registered formatter for the property type in Formatter

Parameters:
bo - - business object instance with property to get formatter for
propertyName - - name of property to get formatter for
Returns:
Formatter instance

setObjectPropertyDeep

public static void setObjectPropertyDeep(Object bo,
                                         String propertyName,
                                         Class type,
                                         Object propertyValue)
                                  throws FormatException,
                                         IllegalAccessException,
                                         InvocationTargetException,
                                         NoSuchMethodException
Recursive; sets all occurences of the property in the object, its nested objects and its object lists with the given value.

Parameters:
bo -
propertyName -
type -
propertyValue -
Throws:
NoSuchMethodException
InvocationTargetException
IllegalAccessException
FormatException

setObjectPropertyDeep

public static void setObjectPropertyDeep(Object bo,
                                         String propertyName,
                                         Class type,
                                         Object propertyValue,
                                         int depth)
                                  throws FormatException,
                                         IllegalAccessException,
                                         InvocationTargetException,
                                         NoSuchMethodException
Throws:
FormatException
IllegalAccessException
InvocationTargetException
NoSuchMethodException

materializeUpdateableCollections

public static void materializeUpdateableCollections(Object bo)
                                             throws FormatException,
                                                    IllegalAccessException,
                                                    InvocationTargetException,
                                                    NoSuchMethodException
This method checks for updateable collections on the business object provided and materializes the corresponding collection proxies

Parameters:
bo - The business object for which you want unpdateable, proxied collections materialized
Throws:
FormatException
IllegalAccessException
InvocationTargetException
NoSuchMethodException

clean

public static String clean(String string)
Removes all query characters from a string.

Parameters:
string -
Returns:
Cleaned string

equalByKeys

public static boolean equalByKeys(PersistableBusinessObject bo1,
                                  PersistableBusinessObject bo2)
Compares two PersistableBusinessObject instances for equality of type and key values.

Parameters:
bo1 -
bo2 -
Returns:
boolean indicating whether the two objects are equal.

collectionContainsObjectWithIdentitcalKey

public static boolean collectionContainsObjectWithIdentitcalKey(Collection<? extends PersistableBusinessObject> controlList,
                                                                PersistableBusinessObject bo)
Compares a business object with a List of PersistableBusinessObjects to determine if an object with the same key as the BO exists in the list.

Parameters:
controlList - - The list of items to check
bo - - The BO whose keys we are looking for in the controlList
Returns:
boolean

countObjectsWithIdentitcalKey

public static int countObjectsWithIdentitcalKey(Collection<? extends PersistableBusinessObject> collection,
                                                PersistableBusinessObject bo)
Compares a business object with a Collection of PersistableBusinessObjects to count how many have the same key as the BO.

Parameters:
collection - - The collection of items to check
bo - - The BO whose keys we are looking for in the collection
Returns:
how many have the same keys

removeObjectWithIdentitcalKey

public static void removeObjectWithIdentitcalKey(Collection<? extends PersistableBusinessObject> controlList,
                                                 PersistableBusinessObject bo)
Compares a business object with a List of PersistableBusinessObjects to determine if an object with the same key as the BO exists in the list. If it does, the item is removed from the List. This is functionally similar to List.remove() that operates only on Key values.

Parameters:
controlList - - The list of items to check
bo - - The BO whose keys we are looking for in the controlList

retrieveObjectWithIdentitcalKey

public static BusinessObject retrieveObjectWithIdentitcalKey(Collection<? extends PersistableBusinessObject> controlList,
                                                             PersistableBusinessObject bo)
Compares a business object with a List of BOs to determine if an object with the same key as the BO exists in the list. If it does, the item is returned.

Parameters:
controlList - - The list of items to check
bo - - The BO whose keys we are looking for in the controlList

isNestedAttribute

public static boolean isNestedAttribute(String attributeName)
Determines if a given string could represent a nested attribute of an object.

Parameters:
attributeName -
Returns:
true if the attribute is nested

getNestedAttributePrefix

public static String getNestedAttributePrefix(String attributeName)
Returns the prefix of a nested attribute name, or the empty string if the attribute name is not nested.

Parameters:
attributeName -
Returns:
everything BEFORE the last "." character in attributeName

getNestedAttributePrimitive

public static String getNestedAttributePrimitive(String attributeName)
Returns the primitive part of an attribute name string.

Parameters:
attributeName -
Returns:
everything AFTER the last "." character in attributeName

isNull

public static boolean isNull(Object object)
This method is a OJB Proxy-safe way to test for null on a proxied object that may or may not be materialized yet. It is safe to use on a proxy (materialized or non-materialized) or on a non-proxy (ie, regular object). Note that this will force a materialization of the proxy if the object is a proxy and unmaterialized.

Parameters:
object - - any object, proxied or not, materialized or not
Returns:
true if the object (or underlying materialized object) is null, false otherwise

isNotNull

public static boolean isNotNull(Object object)
This method is a OJB Proxy-safe way to test for notNull on a proxied object that may or may not be materialized yet. It is safe to use on a proxy (materialized or non-materialized) or on a non-proxy (ie, regular object). Note that this will force a materialization of the proxy if the object is a proxy and unmaterialized.

Parameters:
object - - any object, proxied or not, materialized or not
Returns:
true if the object (or underlying materialized object) is not null, true if its null

materializeClassForProxiedObject

public static Class materializeClassForProxiedObject(Object object)
Attempts to find the Class for the given potentially proxied object

Parameters:
object - the potentially proxied object to find the Class of
Returns:
the best Class which could be found for the given object

materializeObjects

public static void materializeObjects(Collection possiblyProxiedObjects)
This method runs the ObjectUtils.isNotNull() method for each item in a list of BOs. ObjectUtils.isNotNull() will materialize the objects if they are currently OJB proxies.

Parameters:
possiblyProxiedObjects - - a Collection of objects that may be proxies

materializeSubObjectsToDepth

public static void materializeSubObjectsToDepth(PersistableBusinessObject bo,
                                                int depth)
This method attempts to materialize all of the proxied reference objects (ie, sub-objects) hanging off the passed-in BO object. It will do it down to the specified depth. An IllegalArgumentException will be thrown if the bo object passed in is itself a non-materialized proxy object. If the bo passed in has no proxied sub-objects, then the object will not be modified, and no errors will be thrown. WARNING: Be careful using depth any greater than 2. The number of DB hits, time, and memory consumed grows exponentially with each additional increment to depth. Make sure you really need that depth before doing so.

Parameters:
bo - A valid, populated BusinessObject containing (possibly) proxied sub-objects. This object will be modified in place.
depth - int Value 0-5 indicating how deep to recurse the materialization. If a zero (0) is passed in, then no work will be done.

materializeAllSubObjects

public static void materializeAllSubObjects(PersistableBusinessObject bo)
This method attempts to materialize all of the proxied reference objects (ie, sub-objects) hanging off the passed-in BO object. It will do it just three levels down. In other words, it will only materialize the objects that are direct members of the bo, objects that are direct members of those bos, that one more time, and no further down. An IllegalArgumentException will be thrown if the bo object passed in is itself a non-materialized proxy object. If the bo passed in has no proxied sub-objects, then the object will not be modified, and no errors will be thrown.

Parameters:
bo - A valid, populated BusinessObject containing (possibly) proxied sub-objects. This object will be modified in place.

getNestedValue

public static Object getNestedValue(Object bo,
                                    String fieldName)
This method safely extracts either simple values OR nested values. For example, if the bo is SubAccount, and the fieldName is a21SubAccount.subAccountTypeCode, this thing makes sure it gets the value off the very end attribute, no matter how deeply nested it is. The code would be slightly simpler if this was done recursively, but this is safer, and consumes a constant amount of memory, no matter how deeply nested it goes.

Parameters:
bo -
fieldName -
Returns:
The field value if it exists. If it doesnt, and the name is invalid, and

createNewObjectFromClass

public static Object createNewObjectFromClass(Class clazz)
This method safely creates a object from a class Convenience method to create new object and throw a runtime exception if it cannot If the class is an ExternalizableBusinessObject, this method will determine the interface for the EBO and query the appropriate module service to create a new instance.

Parameters:
clazz -
Returns:
a newInstance() of clazz

isWriteable

public static boolean isWriteable(Object object,
                                  String property,
                                  PersistenceStructureService persistenceStructureService)
                           throws IllegalArgumentException
Return whether or not an attribute is writeable. This method is aware that that Collections may be involved and handles them consistently with the way in which OJB handles specifying the attributes of elements of a Collection.

Parameters:
object -
property -
Returns:
Throws:
IllegalArgumentException

newInstance

public static <T> T newInstance(Class<T> clazz)
Helper method for creating a new instance of the given class

Parameters:
clazz - - class of object to create
Returns:
T object of type given by the clazz parameter

getAllFields

public static List<Field> getAllFields(List<Field> fields,
                                       Class<?> type,
                                       Class<?> stopAt)
Retrieves all fields including the inherited fields for a given class. The recursion stops if either Object class is reached or if stopAt is reached first.

Parameters:
fields - List of fields (public, private and protected)
type - Class from which fields retrieval has to start
stopAt - Parent class where the recursion should stop
Returns:


Copyright © 2005-2013 The Kuali Foundation. All Rights Reserved.