/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed 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. */ package org.seasar.extension.jdbc.gen.internal.model; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import javax.persistence.TemporalType; import org.seasar.extension.jdbc.gen.desc.AttributeDesc; import org.seasar.extension.jdbc.gen.model.AttributeModel; import org.seasar.extension.jdbc.gen.model.AttributeModelFactory; import org.seasar.framework.convention.PersistenceConvention; import org.seasar.framework.util.ClassUtil; /** * {@link AttributeModelFactory}の実装クラスです。 * * @author taedium */ public class AttributeModelFactoryImpl implements AttributeModelFactory { /** カラム名を表示する場合{@code true} */ protected boolean showColumnName; /** カラム定義を表示する場合{@code true} */ protected boolean showColumnDefinition; /** 永続化層の命名規約 */ protected PersistenceConvention persistenceConvention; /** {@link TemporalType}を使用する場合{@code true} */ protected boolean useTemporalType; /** * インスタンスを構築します。 * * @param showColumnName * カラム名を表示する場合{@code true} * @param showColumnDefinition * カラム定義を表示する場合{@code true} * @param useTemporalType * {@link TemporalType}を使用する場合{@code true} * @param persistenceConvention * 永続化層の命名規約 */ public AttributeModelFactoryImpl(boolean showColumnName, boolean showColumnDefinition, boolean useTemporalType, PersistenceConvention persistenceConvention) { if (persistenceConvention == null) { throw new NullPointerException("persistenceConvention"); } this.showColumnName = showColumnName; this.showColumnDefinition = showColumnDefinition; this.useTemporalType = useTemporalType; this.persistenceConvention = persistenceConvention; } public AttributeModel getAttributeModel(AttributeDesc attributeDesc) { AttributeModel attributeModel = new AttributeModel(); attributeModel.setName(attributeDesc.getName()); attributeModel.setId(attributeDesc.isId()); attributeModel.setGenerationType(attributeDesc.getGenerationType()); attributeModel.setInitialValue(attributeDesc.getInitialValue()); attributeModel.setAllocationSize(attributeDesc.getAllocationSize()); attributeModel.setLob(attributeDesc.isLob()); attributeModel.setTransient(attributeDesc.isTransient()); attributeModel.setVersion(attributeDesc.isVersion()); attributeModel.setNullable(attributeDesc.isNullable()); attributeModel.setUnique(attributeDesc.isUnique()); attributeModel.setColumnTypeName(attributeDesc.getColumnTypeName()); attributeModel.setComment(attributeDesc.getComment()); doAttributeClass(attributeModel, attributeDesc); doColumnName(attributeModel, attributeDesc); if (showColumnDefinition) { doColumnDefinition(attributeModel, attributeDesc); } else { doLength(attributeModel, attributeDesc); doPrecision(attributeModel, attributeDesc); doScale(attributeModel, attributeDesc); } return attributeModel; } /** * 属性のクラスを処理します。 * * @param attributeModel * 属性モデル * @param attributeDesc * 属性記述 */ protected void doAttributeClass(AttributeModel attributeModel, AttributeDesc attributeDesc) { TemporalType primaryTemporalType = attributeDesc .getPrimaryTemporalType(); if (primaryTemporalType != null) { attributeModel.setTemporalType(primaryTemporalType); attributeModel.setAttributeClass(Date.class); } else if (useTemporalType && attributeDesc.isTemporal()) { attributeModel.setTemporalType(attributeDesc.getTemporalType()); attributeModel.setAttributeClass(Date.class); } else { attributeModel.setAttributeClass(attributeDesc.getAttributeClass()); } } /** * カラム名を処理します。 * * @param attributeModel * 属性モデル * @param attributeDesc * 属性記述 */ protected void doColumnName(AttributeModel attributeModel, AttributeDesc attributeDesc) { String realColumnName = attributeDesc.getColumnName(); String convertedColumnName = persistenceConvention .fromPropertyNameToColumnName(attributeModel.getName()); if (showColumnName || !realColumnName.equalsIgnoreCase(convertedColumnName)) { attributeModel.setColumnName(realColumnName); } } /** * カラム定義を処理します。 * * @param attributeModel * 属性モデル * @param attributeDesc * 属性記述 */ protected void doColumnDefinition(AttributeModel attributeModel, AttributeDesc attributeDesc) { attributeModel.setColumnDefinition(attributeDesc.getColumnDefinition()); attributeModel.setUnsupportedColumnType(attributeDesc .isUnsupportedColumnType()); } /** * 長さを処理します。 * * @param attributeModel * 属性モデル * @param attributeDesc * 属性記述 */ protected void doLength(AttributeModel attributeModel, AttributeDesc attributeDesc) { if (attributeDesc.getLength() < 1) { return; } Class<?> clazz = ClassUtil.getWrapperClassIfPrimitive(attributeDesc .getAttributeClass()); if (!Number.class.isAssignableFrom(clazz) && !Date.class.isAssignableFrom(clazz) && !Calendar.class.isAssignableFrom(clazz)) { attributeModel.setLength(attributeDesc.getLength()); } } /** * 精度を処理します。 * * @param attributeModel * 属性モデル * @param attributeDesc * 属性記述 */ protected void doPrecision(AttributeModel attributeModel, AttributeDesc attributeDesc) { if (attributeDesc.getPrecision() < 1) { return; } Class<?> clazz = ClassUtil.getWrapperClassIfPrimitive(attributeDesc .getAttributeClass()); if (Number.class.isAssignableFrom(clazz)) { attributeModel.setPrecision(attributeDesc.getPrecision()); } } /** * スケールを処理します。 * * @param attributeModel * 属性モデル * @param attributeDesc * 属性記述 */ protected void doScale(AttributeModel attributeModel, AttributeDesc attributeDesc) { if (attributeDesc.getScale() < 1) { return; } Class<?> clazz = ClassUtil.getWrapperClassIfPrimitive(attributeDesc .getAttributeClass()); if (clazz == BigDecimal.class || clazz == Float.class || clazz == Double.class) { attributeModel.setScale(attributeDesc.getScale()); } } }