org.objectstyle.cayenne.dataview.DataTypeSpec.java Source code

Java tutorial

Introduction

Here is the source code for org.objectstyle.cayenne.dataview.DataTypeSpec.java

Source

/* ====================================================================
 *
 * The ObjectStyle Group Software License, version 1.1
 * ObjectStyle Group - http://objectstyle.org/
 * 
 * Copyright (c) 2002-2004, Andrei (Andrus) Adamchik and individual authors
 * of the software. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 
 * 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 end-user documentation included with the redistribution, if any,
 *    must include the following acknowlegement:
 *    "This product includes software developed by independent contributors
 *    and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 * 
 * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
 *    or promote products derived from this software without prior written
 *    permission. For written permission, email
 *    "andrus at objectstyle dot org".
 * 
 * 5. Products derived from this software may not be called "ObjectStyle"
 *    or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
 *    names without prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED ``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 THE OBJECTSTYLE GROUP 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.
 * ====================================================================
 * 
 * This software consists of voluntary contributions made by many
 * individuals and hosted on ObjectStyle Group web site.  For more
 * information on the ObjectStyle Group, please see
 * <http://objectstyle.org/>.
 */
package org.objectstyle.cayenne.dataview;

import java.util.*;
import java.lang.reflect.*;
import java.math.*;
import java.text.*;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang.*;
import org.apache.commons.lang.time.*;

public class DataTypeSpec {
    protected Map dataTypeClassMap = new HashMap();
    protected Format dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
    protected Format dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);

    public DataTypeSpec() {
        dataTypeClassMap.put(DataTypeEnum.BOOLEAN_TYPE, Boolean.class);
        dataTypeClassMap.put(DataTypeEnum.DATE_TYPE, Date.class);
        dataTypeClassMap.put(DataTypeEnum.DATETIME_TYPE, Date.class);
        dataTypeClassMap.put(DataTypeEnum.DOUBLE_TYPE, Double.class);
        dataTypeClassMap.put(DataTypeEnum.INTEGER_TYPE, Long.class);
        dataTypeClassMap.put(DataTypeEnum.MONEY_TYPE, Double.class);
        dataTypeClassMap.put(DataTypeEnum.PERCENT_TYPE, Double.class);
        dataTypeClassMap.put(DataTypeEnum.STRING_TYPE, String.class);
        dataTypeClassMap.put(DataTypeEnum.OBJECT_TYPE, Object.class);
        dataTypeClassMap.put(DataTypeEnum.UNKNOWN_TYPE, null);
    }

    public DataTypeEnum getDataType(String dataType) {
        return DataTypeEnum.getEnum(dataType);
    }

    public DataTypeEnum getDataType(int dataType) {
        return DataTypeEnum.getEnum(dataType);
    }

    public Class getJavaClass(DataTypeEnum dataType) {
        return (Class) dataTypeClassMap.get(dataType);
    }

    public Object create(DataTypeEnum dataType) {
        Class clazz = getJavaClass(dataType);
        if (clazz != null) {
            try {
                Object value = clazz.newInstance();
                if (DataTypeEnum.DATE_TYPE.equals(dataType))
                    value = DateUtils.truncate(value, Calendar.DATE);
                return value;
            } catch (InstantiationException ex) {
                return null;
            } catch (IllegalAccessException ex) {
                return null;
            }
        }
        return null;
    }

    public Object create(DataTypeEnum dataType, String argument) {
        Class clazz = getJavaClass(dataType);
        if (clazz != null) {
            try {
                if (DataTypeEnum.DATE_TYPE.equals(dataType)) {
                    return dateFormat.parseObject(argument);
                } else if (DataTypeEnum.DATETIME_TYPE.equals(dataType)) {
                    return dateTimeFormat.parseObject(argument);
                }
                Constructor strConstructor = clazz.getConstructor(new Class[] { String.class });
                return strConstructor.newInstance(new Object[] { argument });
            } catch (ParseException ex) {
                return null;
            } catch (NoSuchMethodException ex) {
                return null;
            } catch (InvocationTargetException ex) {
                return null;
            } catch (InstantiationException ex) {
                return null;
            } catch (IllegalAccessException ex) {
                return null;
            }
        }
        return null;
    }

    public Object create(DataTypeEnum dataType, Object[] arguments) {
        if (arguments == null || arguments.length == 0)
            return create(dataType);

        Class clazz = getJavaClass(dataType);
        if (clazz != null) {
            try {
                Class[] argTypes = new Class[arguments.length];
                for (int i = 0; i < arguments.length; i++) {
                    argTypes[i] = arguments[i].getClass();
                }

                Constructor strConstructor = clazz.getConstructor(new Class[] { String.class });
                return strConstructor.newInstance(arguments);
            } catch (NoSuchMethodException ex) {
                return null;
            } catch (InvocationTargetException ex) {
                return null;
            } catch (InstantiationException ex) {
                return null;
            } catch (IllegalAccessException ex) {
                return null;
            }
        }
        return null;
    }

    public Object toDataType(DataTypeEnum dataType, Object untypedValue) {
        Class dataTypeClass = getJavaClass(dataType);
        if (dataTypeClass == null || untypedValue == null
                || ClassUtils.isAssignable(untypedValue.getClass(), dataTypeClass)) {
            if (DataTypeEnum.DATE_TYPE.equals(dataType) && Date.class.equals(dataTypeClass)) {
                return DateUtils.truncate(untypedValue, Calendar.DATE);
            }
            return untypedValue;
        }

        Object v = null;
        String strUntypedValue = null;
        boolean isStringUntypedValue;
        Number numUntypedValue = null;
        boolean isNumberUntypedValue;
        if (isStringUntypedValue = untypedValue instanceof String)
            strUntypedValue = (String) untypedValue;
        if (isNumberUntypedValue = untypedValue instanceof Number)
            numUntypedValue = (Number) untypedValue;

        switch (dataType.getValue()) {
        case DataTypeEnum.BOOLEAN_TYPE_VALUE:
            if (isNumberUntypedValue)
                v = BooleanUtils.toBooleanObject(numUntypedValue.intValue());
            else if (isStringUntypedValue)
                v = BooleanUtils.toBooleanObject(strUntypedValue);
            break;
        case DataTypeEnum.INTEGER_TYPE_VALUE:
            if (isNumberUntypedValue)
                v = new Integer(numUntypedValue.intValue());
            else if (isStringUntypedValue)
                v = NumberUtils.createInteger(strUntypedValue);
            break;
        case DataTypeEnum.DOUBLE_TYPE_VALUE:
            if (isNumberUntypedValue)
                v = new Double(numUntypedValue.doubleValue());
            else if (isStringUntypedValue)
                v = NumberUtils.createDouble(strUntypedValue);
            break;
        case DataTypeEnum.STRING_TYPE_VALUE:
            v = ObjectUtils.toString(untypedValue);
            break;
        case DataTypeEnum.DATE_TYPE_VALUE:
            if (isNumberUntypedValue)
                v = DateUtils.truncate(new Date(numUntypedValue.longValue()), Calendar.DATE);
            break;
        case DataTypeEnum.DATETIME_TYPE_VALUE:
            if (isNumberUntypedValue)
                v = new Date(numUntypedValue.longValue());
            break;
        case DataTypeEnum.MONEY_TYPE_VALUE:
            if (isNumberUntypedValue)
                v = new Double(numUntypedValue.doubleValue());
            else if (isStringUntypedValue)
                v = NumberUtils.createDouble(strUntypedValue);
            break;
        case DataTypeEnum.PERCENT_TYPE_VALUE:
            if (isNumberUntypedValue)
                v = new Double(numUntypedValue.doubleValue());
            else if (isStringUntypedValue)
                v = NumberUtils.createDouble(strUntypedValue);
            break;
        }
        return v;
    }

    public Object fromDataType(Class untypedValueClass, DataTypeEnum dataType, Object typedValue) {
        if (typedValue == null)
            return null;
        Class dataTypeClass = getJavaClass(dataType);
        //    Validate.isTrue(typedValue.getClass().equals(dataTypeClass));

        if (untypedValueClass == null)
            return typedValue;

        if (ClassUtils.isAssignable(dataTypeClass, untypedValueClass))
            return typedValue;

        String strTypedValue = null;
        boolean isStringTypedValue;
        Number numTypedValue = null;
        boolean isNumberTypedValue;
        Boolean boolTypedValue = null;
        boolean isBooleanTypedValue;
        Date dateTypedValue = null;
        boolean isDateTypedValue;

        if (isStringTypedValue = typedValue instanceof String)
            strTypedValue = (String) typedValue;
        if (isNumberTypedValue = typedValue instanceof Number)
            numTypedValue = (Number) typedValue;
        if (isBooleanTypedValue = typedValue instanceof Boolean)
            boolTypedValue = (Boolean) typedValue;
        if (isDateTypedValue = typedValue instanceof Date)
            dateTypedValue = (Date) typedValue;

        Object v = null;
        if (String.class.equals(untypedValueClass)) {
            v = ObjectUtils.toString(typedValue);
        } else if (BigDecimal.class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = NumberUtils.createBigDecimal(strTypedValue);
            else if (isNumberTypedValue)
                v = new BigDecimal(numTypedValue.doubleValue());
            else if (isBooleanTypedValue)
                v = new BigDecimal(BooleanUtils.toInteger(boolTypedValue.booleanValue()));
            else if (isDateTypedValue)
                v = new BigDecimal(dateTypedValue.getTime());
        } else if (Boolean.class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = BooleanUtils.toBooleanObject(strTypedValue);
            else if (isNumberTypedValue)
                v = BooleanUtils.toBooleanObject(numTypedValue.intValue());
            else if (isDateTypedValue)
                v = BooleanUtils.toBooleanObject((int) dateTypedValue.getTime());
        } else if (Byte.class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = Byte.valueOf(strTypedValue);
            else if (isNumberTypedValue)
                v = new Byte(numTypedValue.byteValue());
            else if (isBooleanTypedValue)
                v = new Byte((byte) BooleanUtils.toInteger(boolTypedValue.booleanValue()));
            else if (isDateTypedValue)
                v = new Byte((byte) dateTypedValue.getTime());
        } else if (byte[].class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = strTypedValue.getBytes();
        } else if (Double.class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = NumberUtils.createDouble(strTypedValue);
            else if (isNumberTypedValue)
                v = new Double(numTypedValue.doubleValue());
            else if (isBooleanTypedValue)
                v = new Double(BooleanUtils.toInteger(boolTypedValue.booleanValue()));
            else if (isDateTypedValue)
                v = new Double(dateTypedValue.getTime());
        } else if (Float.class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = NumberUtils.createFloat(strTypedValue);
            else if (isNumberTypedValue)
                v = new Float(numTypedValue.floatValue());
            else if (isBooleanTypedValue)
                v = new Float(BooleanUtils.toInteger(boolTypedValue.booleanValue()));
            else if (isDateTypedValue)
                v = new Float(dateTypedValue.getTime());
        } else if (Integer.class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = NumberUtils.createInteger(strTypedValue);
            else if (isNumberTypedValue)
                v = new Integer(numTypedValue.intValue());
            else if (isBooleanTypedValue)
                v = BooleanUtils.toIntegerObject(boolTypedValue.booleanValue());
            else if (isDateTypedValue)
                v = new Integer((int) dateTypedValue.getTime());
        } else if (Long.class.equals(untypedValueClass)) {
            if (isStringTypedValue)
                v = NumberUtils.createLong(strTypedValue);
            else if (isNumberTypedValue)
                v = new Long(numTypedValue.longValue());
            else if (isBooleanTypedValue)
                v = new Long(BooleanUtils.toInteger(boolTypedValue.booleanValue()));
            else if (isDateTypedValue)
                v = new Long(dateTypedValue.getTime());
        } else if (java.sql.Date.class.equals(untypedValueClass)) {
            if (isNumberTypedValue)
                v = new java.sql.Date(numTypedValue.longValue());
            else if (isDateTypedValue)
                v = new java.sql.Date(dateTypedValue.getTime());
        } else if (java.sql.Time.class.equals(untypedValueClass)) {
            if (isNumberTypedValue)
                v = new java.sql.Time(numTypedValue.longValue());
            else if (isDateTypedValue)
                v = new java.sql.Time(dateTypedValue.getTime());
        } else if (java.sql.Timestamp.class.equals(untypedValueClass)) {
            if (isNumberTypedValue)
                v = new java.sql.Timestamp(numTypedValue.longValue());
            else if (isDateTypedValue)
                v = new java.sql.Timestamp(dateTypedValue.getTime());
        } else if (Date.class.equals(untypedValueClass)) {
            if (isNumberTypedValue)
                v = new Date(numTypedValue.longValue());
        }
        return v;
    }
}