/**
* Redistribution and use of this software and associated documentation
* ("Software"), with or without modification, are permitted provided
* that the following conditions are met:
*
* 1. Redistributions of source code must retain copyright
* statements and notices. Redistributions must also contain a
* copy of this document.
*
* 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 name "Exolab" must not be used to endorse or promote
* products derived from this Software without prior written
* permission of Intalio, Inc. For written permission,
* please contact info@exolab.org.
*
* 4. Products derived from this Software may not be called "Exolab"
* nor may "Exolab" appear in their names without prior written
* permission of Intalio, Inc. Exolab is a registered
* trademark of Intalio, Inc.
*
* 5. Due credit should be given to the Exolab Project
* (http://www.exolab.org/).
*
* THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
* ``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
* INTALIO, INC. 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.
*
* Copyright 1999-2003 (C) Intalio, Inc. All Rights Reserved.
*
* $Id$
*/
package org.exolab.castor.mapping.loader;
import org.exolab.castor.mapping.TypeConvertor;
import org.exolab.castor.mapping.CollectionHandler;
/**
* Type information passed on creation of a {@link FieldHandlerImpl}.
*
*
* @author <a href="arkin@intalio.com">Assaf Arkin</a>
* @version $Revision$ $Date: 2005-03-05 06:42:06 -0700 (Sat, 05 Mar 2005) $
*/
public class TypeInfo
{
/**
* The field type.
*/
private Class _fieldType;
/**
* Convertor to the field type from external type.
*/
private TypeConvertor _convertorTo;
/**
* Convertor from the field type to external type.
*/
private TypeConvertor _convertorFrom;
/**
* True if the field type is immutable.
*/
private boolean _immutable = false;
/**
* True if the field is required.
*/
private boolean _required = false;
/**
* The default value of the field.
*/
private Object _default;
/**
* The collection handler of the field.
*/
private CollectionHandler _colHandler;
/**
* Construct new type information for a field. This field
* requires no type conversion, and has no default value.
*
* @param fieldType The field type
**/
public TypeInfo(Class<?> fieldType) {
this(fieldType, null, null, false, null, null, true );
} //-- TypeInfo
/**
* Construct new type information for the field.
*
* @param fieldType The field type
* @param convertorTo Convertor to the field type from external
* type, or null if no conversion is required
* @param convertorFrom Convertor from the field type to external
* type, or null if no conversion is required
* @param required True if the field is required
* @param defaultValue The default value of the field, null to
* use the known Java defaults
* @param colHandler The collection handler for this field, or null if
* field is singular
*/
public TypeInfo(Class<?> fieldType, TypeConvertor convertorTo, TypeConvertor convertorFrom,
boolean required, Object defaultValue, CollectionHandler colHandler) {
this(fieldType, convertorTo, convertorFrom, required, defaultValue, colHandler, true );
}
/**
* Construct new type information for the field.
*
* @param fieldType The field type
* @param convertorTo Convertor to the field type from external
* type, or null if no conversion is required
* @param convertorFrom Convertor from the field type to external
* type, or null if no conversion is required
* @param required True if the field is required
* @param defaultValue The default value of the field, null to
* use the known Java defaults
* @param colHandler The collection handler for this field, or null if
* field is singular
*/
public TypeInfo(Class fieldType, TypeConvertor convertorTo, TypeConvertor convertorFrom,
boolean required, Object defaultValue,
CollectionHandler colHandler, boolean checkForCollection) {
if ((colHandler == null) && checkForCollection) {
if (fieldType.isArray()) {
//-- byte[] should not use a CollectionHandler since it
//-- needs to be base64 encoded/decoded.
if (fieldType.getComponentType() != Byte.TYPE) {
try {
colHandler = CollectionHandlers.getHandler(Object[].class);
}
catch (Exception e) {
//-- If we make it here, there was probably something wrong
//-- with loading the J1CollectionHandlers class...
throw new NullPointerException("Impossible to locate CollectionHandler for array.");
}
}
}
else {
try {
colHandler = CollectionHandlers.getHandler(fieldType);
}
catch (Exception e) {
// NOOP : It just mean that there is not handler for the collection
// and that this fieldType is not a collection
}
}
}
_fieldType = fieldType;
_convertorTo = convertorTo;
_convertorFrom = convertorFrom;
_immutable = Types.isImmutable( fieldType );
_required = required;
// Note: must be called with fieldType (might be primitive) and not
// _fieldType (never primitive) to get the proper default value
_default = ( defaultValue == null ? Types.getDefault( fieldType ) : defaultValue );
_colHandler = colHandler;
}
/**
* Returns the field type.
*
* @return The field type
*/
public Class getFieldType()
{
return _fieldType;
}
/**
* Returns the convertor to the field type from an external type.
*
* @return Convertor to field type
*/
public TypeConvertor getConvertorTo()
{
return _convertorTo;
}
/**
* Returns the convertor from the field type to an external type.
*
* @return Convertor from field type
*/
public TypeConvertor getConvertorFrom()
{
return _convertorFrom;
}
/**
* Returns true if field type is immutable.
*
* @return True if type is immutable
*/
public boolean isImmutable()
{
return _immutable;
}
/**
* Returns true if field type is required.
*
* @return True if field is required
*/
public boolean isRequired()
{
return _required;
}
/**
* Returns the default value for the field.
*
* @return The default value
*/
public Object getDefaultValue()
{
return _default;
}
/**
* Return the collection handler of this field.
*
* @return The collection handler of this field
*/
public CollectionHandler getCollectionHandler()
{
return _colHandler;
}
/**
* Sets a flag indictating if the field is required.
*
* @param required the value of the flag. Should be true if the
* field is required, false otherwise.
*/
public void setRequired(boolean required) {
this._required = required;
} //-- setRequired
/**
* Sets the CollectionHandler to use for the field
* described by this TypeInfo.
*
* @param handler the CollectionHandler, or null if no
* CollectionHandler should be used.
*/
public void setCollectionHandler(CollectionHandler handler) {
_colHandler = handler;
} //-- setCollectionHandler
/**
* Sets whether or not the type is immutable
*
* @param immutable a boolean that when true indicates the type
* is immutable
*/
void setImmutable(boolean immutable) {
_immutable = immutable;
}
}