org.apache.torque.templates.transformer.om.OMColumnTransformer.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.torque.templates.transformer.om.OMColumnTransformer.java

Source

package org.apache.torque.templates.transformer.om;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.TimeZone;

import org.apache.commons.lang.StringUtils;
import org.apache.torque.generator.control.ControllerState;
import org.apache.torque.generator.processor.string.Camelbacker;
import org.apache.torque.generator.processor.string.WrapReservedJavaWords;
import org.apache.torque.generator.source.SourceElement;
import org.apache.torque.generator.source.transform.SourceTransformerException;
import org.apache.torque.templates.TemplateOptionName;
import org.apache.torque.templates.TorqueSchemaAttributeName;
import org.apache.torque.templates.TorqueSchemaElementName;
import org.apache.torque.templates.TorqueSchemaInheritance;
import org.apache.torque.templates.TorqueSchemaJavaType;
import org.apache.torque.templates.transformer.SchemaTypeHelper;
import org.apache.torque.templates.typemapping.JavaType;
import org.apache.torque.templates.typemapping.ResultSetGetter;
import org.apache.torque.templates.typemapping.SchemaType;
import org.apache.torque.templates.typemapping.SqlType;
import org.apache.torque.templates.typemapping.TypeMap;

/**
 * Sets the class names and packages for the OM model.
 * The id method attribute must already be set on the parent table element
 * when this transformer is called.
 */
public class OMColumnTransformer {
    /** The camelbacker to create the java name from the column name. */
    private static Camelbacker javaNameCamelbacker = new Camelbacker();

    /** The transformer for inheritance elements. */
    private static OMInheritanceTransformer inheritanceTransformer = new OMInheritanceTransformer();

    /** Names which cannot be used as constants for column names. */
    private static final Set<String> RESERVED_CONSTANT_NAMES;

    /** The Date format for Dates in Default values. */
    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.S";

    /** Constant for the CURRENT_DATE default value for Dates. */
    static final String CURRENT_DATE = "CURRENT_DATE";

    /** Constant for the CURRENT_TIME default value for Dates. */
    static final String CURRENT_TIME = "CURRENT_TIME";

    /** Constant for the CURRENT_TIMESTAMP default value for Dates. */
    static final String CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";

    /** Constant for the getDefaultDate method name. */
    static final String GET_DEFAULT_DATE_METHOD_NAME = "getCurrentDate";

    /** Constant for the getDefaultTime method name. */
    static final String GET_DEFAULT_TIME_METHOD_NAME = "getCurrentTime";

    /** Constant for the getDefaultTimestamp method name. */
    static final String GET_DEFAULT_TIMESTAMP_METHOD_NAME = "getCurrentTimestamp";

    /** Prevents reserved java words. */
    private static WrapReservedJavaWords reservedJavaWordsWrapper = new WrapReservedJavaWords();

    static {
        Set<String> reservedConstantNames = new HashSet<String>();
        reservedConstantNames.add("DATABASE");
        reservedConstantNames.add("TABLE_NAME");
        reservedConstantNames.add("TABLE");
        RESERVED_CONSTANT_NAMES = Collections.unmodifiableSet(reservedConstantNames);
    }

    public void transform(SourceElement columnElement, ControllerState controllerState, int columnPosition)
            throws SourceTransformerException {
        checkElementName(columnElement);
        checkColumnNameExists(columnElement);
        setJavaTypeAttribute(columnElement);

        columnElement.setAttribute(ColumnAttributeName.POSITION, columnPosition);
        setAttributeDefaultValues(columnElement);

        SchemaType schemaType = SchemaTypeHelper.getSchemaType(columnElement, controllerState);
        columnElement.setAttribute("schemaType", schemaType);
        setDomainAttributes(columnElement, controllerState);

        JavaType fieldJavaType = getFieldJavaType(columnElement, schemaType);
        columnElement.setAttribute(JavaFieldAttributeName.FIELD_TYPE, fieldJavaType.getFullClassName());
        JavaType fieldJavaObjectType = TypeMap.getJavaObjectType(schemaType);
        columnElement.setAttribute(ColumnAttributeName.FIELD_OBJECT_TYPE, fieldJavaObjectType.getFullClassName());

        setPrimitiveTypeAttribute(columnElement, fieldJavaType);
        setNumberTypeAttribute(columnElement, fieldJavaType);
        setJavaNameAttribute(columnElement);
        setFieldNameAttribute(columnElement);
        setPeerColumnNameAttribute(columnElement);
        setQualifiedColumnNameAttribute(columnElement);
        setGetterNameAttribute(columnElement, fieldJavaType, controllerState);
        setSetterNameAttribute(columnElement);
        setAccessModifierAttributes(columnElement);
        setDefaultValueAttribute(columnElement, fieldJavaType, controllerState);
        setUseDatabaseDefaultValueAttribute(columnElement);
        setResultSetGetterAttribute(columnElement, schemaType);
        setSampleObjectAttribute(columnElement, schemaType);

        for (SourceElement inheritanceElement : columnElement
                .getChildren(TorqueSchemaElementName.INHERITANCE.getName())) {
            inheritanceTransformer.transform(inheritanceElement, controllerState);
        }
    }

    /**
     * Sets the javaType attribute of the column element
     * if it is not already set and a default value is set.
     *
     * @param columnElement the column element, not null.
     */
    protected void setJavaTypeAttribute(SourceElement columnElement) {
        if (columnElement.getAttribute(TorqueSchemaAttributeName.JAVA_TYPE) != null) {
            return;
        }
        SourceElement databaseElement = columnElement.getParent().getParent();
        String defaultJavaType = (String) databaseElement.getAttribute(TorqueSchemaAttributeName.DEFAULT_JAVA_TYPE);
        if (defaultJavaType != null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.JAVA_TYPE, defaultJavaType);
        }
    }

    /**
     * Sets default values for attributes of the column element
     * if the attribute is not set.
     * The following attributes are checked:
     * autoIncrement, protected, inheritance, required, primaryKey
     *
     * @param columnElement the column element, not null.
     */
    protected void setAttributeDefaultValues(SourceElement columnElement) {
        // set autoincrement attribute
        if (columnElement.getAttribute(TorqueSchemaAttributeName.AUTO_INCREMENT) == null) {
            String idMethod = (String) columnElement.getParent().getAttribute(TorqueSchemaAttributeName.ID_METHOD);
            // idMethod can not be null because it is already set by the
            // table transformer
            if (!"none".equals(idMethod)) {
                columnElement.setAttribute(TorqueSchemaAttributeName.AUTO_INCREMENT, Boolean.TRUE.toString());
            } else {
                columnElement.setAttribute(TorqueSchemaAttributeName.AUTO_INCREMENT, Boolean.FALSE.toString());
            }
        }

        // set protected attribute
        if (columnElement.getAttribute(TorqueSchemaAttributeName.PROTECTED) == null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.PROTECTED, Boolean.FALSE.toString());
        }

        // set inheritance attribute
        if (columnElement.getAttribute(TorqueSchemaAttributeName.INHERITANCE) == null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.INHERITANCE, Boolean.FALSE.toString());
        }

        // set required attribute
        Object required = columnElement.getAttribute(TorqueSchemaAttributeName.REQUIRED);
        if (required == null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.REQUIRED, Boolean.FALSE.toString());
        }

        // set primaryKey attribute
        Object primaryKey = columnElement.getAttribute(TorqueSchemaAttributeName.PRIMARY_KEY);
        if (primaryKey == null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.PRIMARY_KEY, Boolean.FALSE.toString());
        }
    }

    protected void setDomainAttributes(SourceElement columnElement, ControllerState controllerState)
            throws SourceTransformerException {
        SqlType domain = SchemaTypeHelper.getDomain(columnElement, controllerState);
        if (domain == null) {
            return;
        }
        if (columnElement.getAttribute(TorqueSchemaAttributeName.TYPE) == null && domain.getSqlTypeName() != null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.TYPE, domain.getSqlTypeName());
        }
        if (columnElement.getAttribute(TorqueSchemaAttributeName.DEFAULT) == null
                && domain.getDefaultValue() != null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.DEFAULT, domain.getDefaultValue());
        }
        if (columnElement.getAttribute(TorqueSchemaAttributeName.SIZE) == null && domain.getSize() != null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.SIZE, domain.getSize());
        }
        if (columnElement.getAttribute(TorqueSchemaAttributeName.SCALE) == null && domain.getScale() != null) {
            columnElement.setAttribute(TorqueSchemaAttributeName.SCALE, domain.getScale());
        }
    }

    /**
     * Sets the attributes getterAccessModifer and setterAccessModifer
     * on the column element.
     *
     * @param columnElement the column element, not null.
     */
    protected void setAccessModifierAttributes(SourceElement columnElement) {
        boolean isProtected = "true".equals(columnElement.getAttribute(TorqueSchemaAttributeName.PROTECTED));

        String accessModifier;
        if (isProtected) {
            accessModifier = "protected";
        } else {
            accessModifier = "public";
        }
        columnElement.setAttribute(JavaFieldAttributeName.GETTER_ACCESS_MODIFIER, accessModifier);
        columnElement.setAttribute(JavaFieldAttributeName.SETTER_ACCESS_MODIFIER, accessModifier);
    }

    /**
     * Returns the java type of the field representing a database column.
     *
     * @param columnElement the column element, not null.
     * @param schemaType the schema type, not null.
     *
     * @return the java type of the column
     */
    protected JavaType getFieldJavaType(SourceElement columnElement, SchemaType schemaType)
            throws SourceTransformerException {
        JavaType result;
        String javaType = (String) columnElement.getAttribute(TorqueSchemaAttributeName.JAVA_TYPE);
        if (TorqueSchemaJavaType.OBJECT.getValue().equals(javaType)) {
            result = TypeMap.getJavaObjectType(schemaType);
        } else if (TorqueSchemaJavaType.PRIMITIVE.getValue().equals(javaType) || javaType == null) {
            result = TypeMap.getJavaPrimitiveType(schemaType);
        } else {
            String columnName = (String) columnElement.getAttribute(TorqueSchemaAttributeName.NAME);
            throw new SourceTransformerException("Unknown javaType " + javaType + " in column " + columnName);
        }
        return result;
    }

    /**
     * Checks that the name of the column element is correct.
     *
     * @param columnElement the column element, not null.
     *
     * @throws IllegalArgumentException if the element name is wrong.
     */
    protected void checkElementName(SourceElement columnElement) {
        if (!TorqueSchemaElementName.COLUMN.getName().equals(columnElement.getName())) {
            throw new IllegalArgumentException("Illegal element Name " + columnElement.getName());
        }
    }

    /**
     * Checks that the name attribute exists on the column element.
     *
     * @param columnElement the column element, not null.
     *
     * @throws SourceTransformerException if the name attribute does not exist.
     */
    protected void checkColumnNameExists(SourceElement columnElement) throws SourceTransformerException {
        String columnName = (String) columnElement.getAttribute(TorqueSchemaAttributeName.NAME);
        if (columnName == null) {
            throw new SourceTransformerException("The attribute " + TorqueSchemaAttributeName.NAME.getName()
                    + " on element " + columnElement.getName() + " is null");
        }
    }

    /**
     * Sets the javaName attribute of the column element if it is not
     * already set.
     *
     * @param columnElement the column element, not null.
     */
    protected void setJavaNameAttribute(SourceElement columnElement) {
        if (columnElement.getAttribute(TorqueSchemaAttributeName.JAVA_NAME) != null) {
            return;
        }
        String columnName = (String) columnElement.getAttribute(TorqueSchemaAttributeName.NAME);
        String javaName = javaNameCamelbacker.process(columnName);
        columnElement.setAttribute(TorqueSchemaAttributeName.JAVA_NAME, javaName);
    }

    /**
     * Sets the fieldName attribute of the column element if it is not
     * already set.
     * The javaName attribute of the column must be set.
     *
     * @param columnElement the column element, not null.
     */
    protected void setFieldNameAttribute(SourceElement columnElement) {
        if (columnElement.getAttribute(JavaFieldAttributeName.FIELD_NAME) != null) {
            return;
        }
        String javaName = (String) columnElement.getAttribute(TorqueSchemaAttributeName.JAVA_NAME);
        String fieldName = StringUtils.uncapitalize(javaName);
        fieldName = reservedJavaWordsWrapper.process(fieldName);
        columnElement.setAttribute(JavaFieldAttributeName.FIELD_NAME, fieldName);
    }

    /**
     * Sets the peerColumnName attribute of the column element if it is not
     * already set.
     *
     * @param columnElement the column element, not null.
     */
    protected void setPeerColumnNameAttribute(SourceElement columnElement) {
        if (columnElement.getAttribute(ColumnAttributeName.PEER_COLUMN_NAME) != null) {
            return;
        }
        String columnName = (String) columnElement.getAttribute(TorqueSchemaAttributeName.NAME);
        String peerColumnName = columnName.toUpperCase();
        if (RESERVED_CONSTANT_NAMES.contains(peerColumnName)) {
            peerColumnName = "_" + peerColumnName;
        }
        columnElement.setAttribute(ColumnAttributeName.PEER_COLUMN_NAME, peerColumnName);
    }

    /**
     * Sets the qualifiedColumnName attribute of the column element
     * if it is not already set.
     *
     * @param columnElement the column element, not null.
     */
    protected void setQualifiedColumnNameAttribute(SourceElement columnElement) {
        if (columnElement.getAttribute(ColumnAttributeName.QUALIFIED_COLUMN_NAME) != null) {
            return;
        }
        String tableName = (String) columnElement.getParent().getAttribute(TorqueSchemaAttributeName.NAME);
        String columnName = (String) columnElement.getAttribute(TorqueSchemaAttributeName.NAME);
        String qualifiedColumnName = tableName + "." + columnName;
        columnElement.setAttribute(ColumnAttributeName.QUALIFIED_COLUMN_NAME, qualifiedColumnName);
    }

    /**
     * Sets the getterName attribute of the column element
     * if it is not already set.
     * The fieldName attribute of the column element must already be set.
     *
     * @param columnElement the column element, not null.
     * @param javaType the java type of the column, not null.
     * @param controllerState the controller state, not null.
     */
    protected void setGetterNameAttribute(SourceElement columnElement, JavaType javaType,
            ControllerState controllerState) {
        if (columnElement.getAttribute(JavaFieldAttributeName.GETTER_NAME) != null) {
            return;
        }
        String fieldName = (String) columnElement.getAttribute(JavaFieldAttributeName.FIELD_NAME);
        String getterName = FieldHelper.getGetterName(fieldName, javaType.getFullClassName(), controllerState);
        columnElement.setAttribute(JavaFieldAttributeName.GETTER_NAME, getterName);
    }

    /**
     * Sets the setterName attribute of the column element
     * if it is not already set.
     * The fieldName attribute of the column element must already be set.
     *
     * @param columnElement the column element, not null.
     */
    protected void setSetterNameAttribute(SourceElement columnElement) {
        if (columnElement.getAttribute(JavaFieldAttributeName.SETTER_NAME) != null) {
            return;
        }
        String fieldName = (String) columnElement.getAttribute(JavaFieldAttributeName.FIELD_NAME);
        String setterName = FieldHelper.getSetterName(fieldName);
        columnElement.setAttribute(JavaFieldAttributeName.SETTER_NAME, setterName);
    }

    /**
     * Sets the primitiveType attribute of the column element
     * if it is not already set.
     *
     * @param columnElement the column element, not null.
     * @param javaType the type of the java field corresponding to the
     *        column, not null.
     */
    protected void setPrimitiveTypeAttribute(SourceElement columnElement, JavaType javaType) {
        if (columnElement.getAttribute(ColumnAttributeName.PRIMITIVE_TYPE) != null) {
            return;
        }
        boolean primitiveFieldType = javaType.isPrimitive();
        columnElement.setAttribute(ColumnAttributeName.PRIMITIVE_TYPE, Boolean.toString(primitiveFieldType));
    }

    /**
     * Sets the numberType attribute of the column element
     * if it is not already set.
     *
     * @param columnElement the column element, not null.
     * @param javaType the type of the java field corresponding to the
     *        column, not null.
     */
    protected void setNumberTypeAttribute(SourceElement columnElement, JavaType javaType) {
        if (columnElement.getAttribute(ColumnAttributeName.NUMBER_TYPE) != null) {
            return;
        }
        boolean numberFieldType = javaType.isNumber();
        columnElement.setAttribute(ColumnAttributeName.NUMBER_TYPE, Boolean.toString(numberFieldType));
    }

    /**
     * Sets the defaultValue attribute of the column element
     * if it is not already set.
     *
     * @param columnElement the column element, not null.
     * @param javaType the type of the java field corresponding to the
     *        column, not null.
     * @param controllerState the ControllerState, not null.
     *
     * @throws SourceTransformerException if an unknown primitive type
     *         is encountered
     */
    protected void setDefaultValueAttribute(SourceElement columnElement, JavaType javaType,
            ControllerState controllerState) throws SourceTransformerException {
        // special case inheritance by class name
        // In this case, the class name of the object must be written into the
        // column as default, overriding any SQL default values.
        if (TorqueSchemaInheritance.SINGLE.getValue()
                .equals(columnElement.getAttribute(TorqueSchemaAttributeName.INHERITANCE))
                && columnElement.getChildren(TorqueSchemaElementName.INHERITANCE).isEmpty()) {
            columnElement.setAttribute(JavaFieldAttributeName.DEFAULT_VALUE, "getClass().getName()");
            return;
        }

        if (columnElement.getAttribute(JavaFieldAttributeName.DEFAULT_VALUE) != null) {
            return;
        }
        String defaultAttributeValue = (String) columnElement.getAttribute(TorqueSchemaAttributeName.DEFAULT);

        String fieldDefaultValue;
        if (defaultAttributeValue != null) {
            boolean useDatabaseDefaultValue = "true"
                    .equals(columnElement.getAttribute(TorqueSchemaAttributeName.USE_DATABASE_DEFAULT_VALUE));
            fieldDefaultValue = getDefaultValueWithDefaultSet(javaType, defaultAttributeValue,
                    useDatabaseDefaultValue, columnElement);
        } else if ("true".equals(columnElement.getAttribute(TorqueSchemaAttributeName.VERSION))) {
            fieldDefaultValue = controllerState
                    .getStringOption(TemplateOptionName.OM_OPTIMISTIC_LOCKING_DEFAULT_VALUE);
        } else {
            fieldDefaultValue = getDefaultValueWithoutDefaultSet(javaType);
        }
        columnElement.setAttribute(JavaFieldAttributeName.DEFAULT_VALUE, fieldDefaultValue);
    }

    /**
     * Calculates the java default value of a column in case a default value
     * is set.
     *
     * @param javaType The java type of the column.
     * @param defaultValue The default value from the schema.
     * @param useDatabaseDefaultValue whether the database default value should
     *        be used.
     * @param columnElement the current column element for which
     *        the default value should be calculated.
     *
     * @return The java default value.
     *
     * @throws SourceTransformerException if an illegal default value is used.
     */
    protected String getDefaultValueWithDefaultSet(JavaType javaType, String defaultValue,
            boolean useDatabaseDefaultValue, SourceElement columnElement) throws SourceTransformerException {
        boolean primitiveFieldType = javaType.isPrimitive();
        String fieldDefaultValue;
        if (JavaType.BOOLEAN_PRIMITIVE == javaType) {
            if ("Y".equals(defaultValue) || "1".equals(defaultValue) || "true".equalsIgnoreCase(defaultValue)) {
                fieldDefaultValue = "true";
            } else {
                fieldDefaultValue = "false";
            }
        } else if (JavaType.BOOLEAN_OBJECT == javaType) {
            if ("Y".equals(defaultValue) || "1".equals(defaultValue) || "true".equalsIgnoreCase(defaultValue)) {
                fieldDefaultValue = "Boolean.TRUE";
            } else {
                fieldDefaultValue = "Boolean.FALSE";
            }
        } else if (JavaType.STRING == javaType) {
            fieldDefaultValue = "\"" + defaultValue + "\"";
        } else if (JavaType.SHORT_OBJECT == javaType) {
            // The following is better than casting with (short)
            // because a range check is performed,
            fieldDefaultValue = "Short.valueOf(\"" + defaultValue + "\")";
        } else if (JavaType.BYTE_OBJECT == javaType) {
            // The following is better than casting with (byte)
            // because a range check is performed,
            fieldDefaultValue = "Byte.valueOf(\"" + defaultValue + "\")";
        } else if (JavaType.INTEGER_OBJECT == javaType) {
            fieldDefaultValue = "Integer.valueOf(" + defaultValue + ")";
        } else if (JavaType.LONG_OBJECT == javaType) {
            fieldDefaultValue = "Long.valueOf(" + defaultValue + "L)";
        } else if (JavaType.DATE == javaType) {
            if (CURRENT_DATE.equalsIgnoreCase(defaultValue) || CURRENT_TIME.equalsIgnoreCase(defaultValue)
                    || CURRENT_TIMESTAMP.equalsIgnoreCase(defaultValue)) {
                if (useDatabaseDefaultValue) {
                    // if the database default value is used do not use
                    // current time in java as it might be different
                    fieldDefaultValue = "null";
                } else {
                    // the database does not provide a default so use
                    // java current time.
                    if (CURRENT_DATE.equalsIgnoreCase(defaultValue)) {
                        String methodName;
                        if (columnElement.getParent()
                                .getAttribute(TableAttributeName.GET_CURRENT_DATE_METHOD_NAME) != null) {
                            methodName = columnElement.getParent()
                                    .getAttribute(TableAttributeName.GET_CURRENT_DATE_METHOD_NAME).toString();
                        } else {
                            methodName = GET_DEFAULT_DATE_METHOD_NAME;
                        }
                        fieldDefaultValue = methodName + "()";
                    } else if (CURRENT_TIME.equalsIgnoreCase(defaultValue)) {
                        String methodName;
                        if (columnElement.getParent()
                                .getAttribute(TableAttributeName.GET_CURRENT_TIME_METHOD_NAME) != null) {
                            methodName = columnElement.getParent()
                                    .getAttribute(TableAttributeName.GET_CURRENT_TIME_METHOD_NAME).toString();
                        } else {
                            methodName = GET_DEFAULT_TIME_METHOD_NAME;
                        }
                        fieldDefaultValue = methodName + "()";
                    } else {
                        String methodName;
                        if (columnElement.getParent()
                                .getAttribute(TableAttributeName.GET_CURRENT_TIMESTAMP_METHOD_NAME) != null) {
                            methodName = columnElement.getParent()
                                    .getAttribute(TableAttributeName.GET_CURRENT_TIMESTAMP_METHOD_NAME).toString();
                        } else {
                            methodName = GET_DEFAULT_TIMESTAMP_METHOD_NAME;
                        }
                        fieldDefaultValue = methodName + "()";
                    }
                }
            } else {
                if (useDatabaseDefaultValue) {
                    // if the database default value is used, do not use
                    // current time in java as it might be different
                    // and have a custom format.
                    fieldDefaultValue = "null";
                } else {
                    fieldDefaultValue = "new Date(" + getDefaultValueAsDate(defaultValue).getTime() + "L)";
                }
            }
        } else if (primitiveFieldType) {
            fieldDefaultValue = defaultValue;
        } else {
            fieldDefaultValue = "new " + javaType.getFullClassName() + "(" + defaultValue + ")";
        }
        return fieldDefaultValue;
    }

    /**
     * Parses the default value String as Date.
     *
     * @param defaultValue the String to parse.
     * @return the parsed date.
     *
     * @throws SourceTransformerException if the date cannot be parsed.
     */
    public static Date getDefaultValueAsDate(String defaultValue) throws SourceTransformerException {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
            dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
            return dateFormat.parse(defaultValue);
        } catch (ParseException e) {
            throw new SourceTransformerException("The default value " + defaultValue
                    + " does not match the format String " + DEFAULT_DATE_FORMAT + " for date values");
        }
    }

    /**
     * Calculates the java default value of a column in case a default value
     * is not set.
     *
     * @param javaType The java type of the column.
     *
     * @return The java default value.
     */
    protected String getDefaultValueWithoutDefaultSet(JavaType javaType) throws SourceTransformerException {
        String fieldDefaultValue;
        boolean primitiveFieldType = javaType.isPrimitive();
        if (primitiveFieldType) {
            if (JavaType.BOOLEAN_PRIMITIVE == javaType) {
                fieldDefaultValue = "false";
            } else if (JavaType.BYTE_PRIMITIVE == javaType) {
                fieldDefaultValue = "(byte) 0";
            } else if (JavaType.SHORT_PRIMITIVE == javaType) {
                fieldDefaultValue = "(short) 0";
            } else if (JavaType.INTEGER_PRIMITIVE == javaType) {
                fieldDefaultValue = "0";
            } else if (JavaType.LONG_PRIMITIVE == javaType) {
                fieldDefaultValue = "0L";
            } else if (JavaType.FLOAT_PRIMITIVE == javaType) {
                fieldDefaultValue = "0";
            } else if (JavaType.DOUBLE_PRIMITIVE == javaType) {
                fieldDefaultValue = "0";
            } else if (JavaType.CHAR_PRIMITIVE == javaType) {
                fieldDefaultValue = "'\0'";
            } else {
                throw new SourceTransformerException("unknown primitive type" + javaType);
            }
        } else {
            fieldDefaultValue = "null";
        }
        return fieldDefaultValue;
    }

    /**
     * Sets the useDatabaseDefaultValue attribute of the column element to its
     * default "false" if it is not already set.
     *
     * @param columnElement the column element, not null.
     */
    protected void setUseDatabaseDefaultValueAttribute(SourceElement columnElement) {
        if (columnElement.getAttribute(TorqueSchemaAttributeName.USE_DATABASE_DEFAULT_VALUE) != null) {
            return;
        }
        columnElement.setAttribute(TorqueSchemaAttributeName.USE_DATABASE_DEFAULT_VALUE, Boolean.toString(false));
    }

    /**
     * Sets the resultSetGetter attribute of the column element
     * if it is not already set.
     * If the resultSetGetter is a string value, it is converted to
     * a ResultSetGetter value.
     *
     * @param columnElement the column element, not null.
     * @param schemaType the schema type of the column, not null.
     */
    protected void setResultSetGetterAttribute(SourceElement columnElement, SchemaType schemaType) {
        ResultSetGetter resultSetGetter = null;
        Object originalValue = columnElement.getAttribute(ColumnAttributeName.RESULT_SET_GETTER);

        if (originalValue != null) {
            if (originalValue instanceof String) {
                resultSetGetter = ResultSetGetter.getByMethodName((String) originalValue);
            }
        } else {
            resultSetGetter = TypeMap.getResultSetGetter(schemaType);
        }

        if (resultSetGetter != null) {
            columnElement.setAttribute(ColumnAttributeName.RESULT_SET_GETTER, resultSetGetter);
        }
    }

    /**
     * Sets the sampleObject attribute of the column element
     * if it is not already set.
     *
     * @param columnElement the column element, not null.
     * @param schemaType the schema type of the column, not null.
     */
    protected void setSampleObjectAttribute(SourceElement columnElement, SchemaType schemaType) {
        if (columnElement.getAttribute(ColumnAttributeName.SAMPLE_OBJECT) != null) {
            return;
        }

        String sampleObject = TypeMap.getJavaObject(schemaType);
        columnElement.setAttribute(ColumnAttributeName.SAMPLE_OBJECT, sampleObject);
    }

}