/*
* 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.io.Serializable;
import java.util.List;
import javax.annotation.Generated;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.Lob;
import javax.persistence.MappedSuperclass;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import javax.persistence.Version;
import org.seasar.extension.jdbc.gen.desc.AssociationDesc;
import org.seasar.extension.jdbc.gen.desc.AssociationType;
import org.seasar.extension.jdbc.gen.desc.AttributeDesc;
import org.seasar.extension.jdbc.gen.desc.CompositeUniqueConstraintDesc;
import org.seasar.extension.jdbc.gen.desc.EntityDesc;
import org.seasar.extension.jdbc.gen.model.AssociationModel;
import org.seasar.extension.jdbc.gen.model.AssociationModelFactory;
import org.seasar.extension.jdbc.gen.model.AttributeModel;
import org.seasar.extension.jdbc.gen.model.AttributeModelFactory;
import org.seasar.extension.jdbc.gen.model.CompositeUniqueConstraintModel;
import org.seasar.extension.jdbc.gen.model.CompositeUniqueConstraintModelFactory;
import org.seasar.extension.jdbc.gen.model.EntityModel;
import org.seasar.extension.jdbc.gen.model.EntityModelFactory;
import org.seasar.framework.beans.BeanDesc;
import org.seasar.framework.beans.factory.BeanDescFactory;
/**
* {@link EntityModelFactory}の実装クラスです。
*
* @author taedium
*/
public class EntityModelFactoryImpl implements EntityModelFactory {
/** パッケージ名、デフォルトパッケージの場合は{@code null} */
protected String packageName;
/** 属性モデルのファクトリ */
protected AttributeModelFactory attributeModelFactory;
/** 関連モデルのファクトリ */
protected AssociationModelFactory associationModelFactory;
/** 複合一意制約モデルのファクトリ */
protected CompositeUniqueConstraintModelFactory compositeUniqueConstraintModelFactory;
/** エンティティクラスでアクセサを使用する場合 {@code true} */
protected boolean useAccessor;
/** コメントを使用する場合{@code true} */
protected boolean useComment;
/** カタログ名を表示する場合{@code true} */
protected boolean showCatalogName;
/** スキーマ名を表示する場合{@code true} */
protected boolean showSchemaName;
/** テーブル名を表示する場合{@code true} */
protected boolean showTableName;
/** エンティティのスーパークラス、スーパークラスを持たない場合は{@code null} */
protected Class<?> superclass;
/**
* {@link #superclass}が{@link MappedSuperclass}である場合そのクラスのBean記述、そうでない場合
* {@code null}
*/
protected BeanDesc mappedSuperclassBeanDesc;
/** クラスモデルのサポート */
protected ClassModelSupport classModelSupport = new ClassModelSupport();
/** 生成モデルのサポート */
protected GeneratedModelSupport generatedModelSupport = new GeneratedModelSupport();
/**
* インスタンスを構築しますl
*
* @param packageName
* パッケージ名、デフォルトパッケージの場合は{@code null}
* @param superclass
* エンティティのスーパークラス、スーパークラスを持たない場合は{@code null}
* @param attributeModelFactory
* 属性モデルのファクトリ
* @param associationModelFactory
* 関連モデルのファクトリ
* @param compositeUniqueConstraintModelFactory
* 複合一意制約モデルのファクトリ
* @param useAccessor
* エンティティクラスでアクセサを使用する場合 {@code true}
* @param useComment
* コメントを使用する場合{@code true}
* @param showCatalogName
* カタログ名を表示する場合{@code true}
* @param showSchemaName
* スキーマ名を表示する場合{@code true}
* @param showTableName
* テーブル名を表示する場合{@code true}
*/
public EntityModelFactoryImpl(
String packageName,
Class<?> superclass,
AttributeModelFactory attributeModelFactory,
AssociationModelFactory associationModelFactory,
CompositeUniqueConstraintModelFactory compositeUniqueConstraintModelFactory,
boolean useAccessor, boolean useComment, boolean showCatalogName,
boolean showSchemaName, boolean showTableName) {
if (attributeModelFactory == null) {
throw new NullPointerException("attributeModelFactory");
}
if (associationModelFactory == null) {
throw new NullPointerException("associationModelFactory");
}
if (compositeUniqueConstraintModelFactory == null) {
throw new NullPointerException(
"compositeUniqueConstraintModelFactory");
}
this.packageName = packageName;
this.superclass = superclass;
this.attributeModelFactory = attributeModelFactory;
this.associationModelFactory = associationModelFactory;
this.compositeUniqueConstraintModelFactory = compositeUniqueConstraintModelFactory;
this.useAccessor = useAccessor;
this.useComment = useComment;
this.showCatalogName = showCatalogName;
this.showSchemaName = showSchemaName;
this.showTableName = showTableName;
if (superclass != null) {
if (superclass.isAnnotationPresent(MappedSuperclass.class)) {
mappedSuperclassBeanDesc = BeanDescFactory
.getBeanDesc(superclass);
}
}
}
public EntityModel getEntityModel(EntityDesc entityDesc) {
EntityModel entityModel = new EntityModel();
if (showCatalogName) {
entityModel.setCatalogName(entityDesc.getCatalogName());
}
if (showSchemaName) {
entityModel.setSchemaName(entityDesc.getSchemaName());
}
if (showTableName) {
entityModel.setTableName(entityDesc.getTableName());
}
entityModel.setPackageName(packageName);
entityModel.setShortClassName(entityDesc.getName());
if (superclass != null) {
entityModel.setShortSuperclassName(superclass.getSimpleName());
}
entityModel.setCompositeId(entityDesc.hasCompositeId());
entityModel.setUseAccessor(useAccessor);
entityModel.setComment(entityDesc.getComment());
entityModel.setUseComment(useComment);
doAttributeModel(entityModel, entityDesc);
doAssociationModel(entityModel, entityDesc);
doCompositeUniqueConstraintModel(entityModel, entityDesc);
doImportName(entityModel, entityDesc);
doGeneratedInfo(entityModel, entityDesc);
return entityModel;
}
/**
* 属性モデルを処理します。
*
* @param entityModel
* エンティティモデル
* @param entityDesc
* エンティティ記述
*/
protected void doAttributeModel(EntityModel entityModel,
EntityDesc entityDesc) {
for (AttributeDesc attributeDesc : entityDesc.getAttributeDescList()) {
if (mappedSuperclassBeanDesc != null
&& mappedSuperclassBeanDesc.hasField(attributeDesc
.getName())) {
continue;
}
AttributeModel attributeModel = attributeModelFactory
.getAttributeModel(attributeDesc);
entityModel.addAttributeModel(attributeModel);
}
}
/**
* 関連モデルを処理します。
*
* @param entityModel
* エンティティモデル
* @param entityDesc
* エンティティ記述
*/
protected void doAssociationModel(EntityModel entityModel,
EntityDesc entityDesc) {
for (AssociationDesc associationDesc : entityDesc
.getAssociationDescList()) {
if (mappedSuperclassBeanDesc != null
&& mappedSuperclassBeanDesc.hasField(associationDesc
.getName())) {
continue;
}
AssociationModel associationModel = associationModelFactory
.getAssociationModel(associationDesc);
entityModel.addAssociationModel(associationModel);
}
}
/**
* 複合一意制約モデルを処理します。
*
* @param entityModel
* エンティティモデル
* @param entityDesc
* エンティティ記述
*/
protected void doCompositeUniqueConstraintModel(EntityModel entityModel,
EntityDesc entityDesc) {
for (CompositeUniqueConstraintDesc compositeUniqueConstraintDesc : entityDesc
.getCompositeUniqueConstraintDescList()) {
CompositeUniqueConstraintModel compositeUniqueConstraintModel = compositeUniqueConstraintModelFactory
.getUniqueConstraintModel(compositeUniqueConstraintDesc);
entityModel
.addCompositeUniqueConstraintModel(compositeUniqueConstraintModel);
}
}
/**
* インポート名を処理します。
*
* @param model
* エンティティクラスのモデル
* @param entityDesc
* エンティティ記述
*/
protected void doImportName(EntityModel model, EntityDesc entityDesc) {
classModelSupport.addImportName(model, Entity.class);
classModelSupport.addImportName(model, Serializable.class);
classModelSupport.addImportName(model, Generated.class);
if (model.getCatalogName() != null || model.getSchemaName() != null
|| model.getTableName() != null) {
classModelSupport.addImportName(model, Table.class);
}
if (superclass != null) {
classModelSupport.addImportName(model, superclass);
}
for (AttributeModel attr : model.getAttributeModelList()) {
if (attr.isId()) {
classModelSupport.addImportName(model, Id.class);
if (attr.getGenerationType() != null) {
classModelSupport
.addImportName(model, GeneratedValue.class);
classModelSupport
.addImportName(model, GenerationType.class);
if (attr.getGenerationType() == GenerationType.SEQUENCE) {
classModelSupport.addImportName(model,
SequenceGenerator.class);
} else if (attr.getGenerationType() == GenerationType.TABLE) {
classModelSupport.addImportName(model,
TableGenerator.class);
}
}
}
if (attr.isLob()) {
classModelSupport.addImportName(model, Lob.class);
}
if (attr.getTemporalType() != null) {
classModelSupport.addImportName(model, Temporal.class);
classModelSupport.addImportName(model, TemporalType.class);
}
if (attr.isTransient()) {
classModelSupport.addImportName(model, Transient.class);
} else {
classModelSupport.addImportName(model, Column.class);
}
if (attr.isVersion()) {
classModelSupport.addImportName(model, Version.class);
}
classModelSupport.addImportName(model, attr.getAttributeClass());
}
for (AssociationModel asso : model.getAssociationModelList()) {
AssociationType associationType = asso.getAssociationType();
if (associationType == AssociationType.ONE_TO_MANY) {
classModelSupport.addImportName(model, List.class);
}
classModelSupport.addImportName(model, associationType
.getAnnotation());
if (asso.getJoinColumnModel() != null) {
classModelSupport.addImportName(model, JoinColumn.class);
}
if (asso.getJoinColumnsModel() != null) {
classModelSupport.addImportName(model, JoinColumn.class);
classModelSupport.addImportName(model, JoinColumns.class);
}
}
if (!model.getCompositeUniqueConstraintModelList().isEmpty()) {
classModelSupport.addImportName(model, Table.class);
classModelSupport.addImportName(model, UniqueConstraint.class);
}
}
/**
* 生成情報を処理します。
*
* @param entityModel
* エンティティモデル
* @param entityDesc
* エンティティ記述
*/
protected void doGeneratedInfo(EntityModel entityModel,
EntityDesc entityDesc) {
generatedModelSupport.fillGeneratedInfo(this, entityModel);
}
}