/*
* 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.desc;
import org.seasar.extension.jdbc.gen.desc.AttributeDesc;
import org.seasar.extension.jdbc.gen.desc.AttributeDescFactory;
import org.seasar.extension.jdbc.gen.desc.CompositeUniqueConstraintDesc;
import org.seasar.extension.jdbc.gen.desc.CompositeUniqueConstraintDescFactory;
import org.seasar.extension.jdbc.gen.desc.EntityDesc;
import org.seasar.extension.jdbc.gen.desc.EntityDescFactory;
import org.seasar.extension.jdbc.gen.meta.DbColumnMeta;
import org.seasar.extension.jdbc.gen.meta.DbTableMeta;
import org.seasar.extension.jdbc.gen.meta.DbUniqueKeyMeta;
import org.seasar.framework.convention.PersistenceConvention;
/**
* {@link EntityDescFactory}の実装クラスです。
*
* @author taedium
*/
public class EntityDescFactoryImpl implements EntityDescFactory {
/** 永続化層の命名規約 */
protected PersistenceConvention persistenceConvention;
/** 属性記述のファクトリ */
protected AttributeDescFactory attributeDescFactory;
/** 複合一意制約記述のファクトリ */
protected CompositeUniqueConstraintDescFactory compositeUniqueConstraintDescFactory;
/** スキーマが指定されている場合{@code true} */
protected boolean schemaSpecified;
/**
* インスタンスを生成します。
*
* @param persistenceConvention
* 永続化層の命名規約
* @param compositeUniqueConstraintDescFactory
* 複合一意制約記述のファクトリ
* @param attributeDescFactory
* 属性記述のファクトリ
*/
public EntityDescFactoryImpl(
PersistenceConvention persistenceConvention,
AttributeDescFactory attributeDescFactory,
CompositeUniqueConstraintDescFactory compositeUniqueConstraintDescFactory) {
if (persistenceConvention == null) {
throw new NullPointerException("persistenceConvention");
}
if (attributeDescFactory == null) {
throw new NullPointerException("attributeDescFactory");
}
if (compositeUniqueConstraintDescFactory == null) {
throw new NullPointerException("uniqueConstraintDescFactory");
}
this.persistenceConvention = persistenceConvention;
this.attributeDescFactory = attributeDescFactory;
this.compositeUniqueConstraintDescFactory = compositeUniqueConstraintDescFactory;
}
public EntityDesc getEntityDesc(DbTableMeta tableMeta) {
EntityDesc entityDesc = new EntityDesc();
doName(tableMeta, entityDesc);
doTable(tableMeta, entityDesc);
doAttributeDesc(tableMeta, entityDesc);
doCompositeUniqueConstraintDesc(tableMeta, entityDesc);
return entityDesc;
}
/**
* 名前を処理します。
*
* @param tableMeta
* テーブルメタ情報
* @param entityDesc
* エンティティ記述
*/
protected void doName(DbTableMeta tableMeta, EntityDesc entityDesc) {
entityDesc.setName(persistenceConvention
.fromTableNameToEntityName(tableMeta.getName()));
}
/**
* テーブルを処理します。
*
* @param tableMeta
* テーブルメタ情報
* @param entityDesc
* エンティティ記述
*/
protected void doTable(DbTableMeta tableMeta, EntityDesc entityDesc) {
entityDesc.setCatalogName(tableMeta.getCatalogName());
entityDesc.setSchemaName(tableMeta.getSchemaName());
entityDesc.setTableName(tableMeta.getName());
entityDesc.setComment(tableMeta.getComment());
}
/**
* 属性記述を処理します。
*
* @param tableMeta
* テーブルメタデータ
* @param entityDesc
* エンティティ記述
*/
protected void doAttributeDesc(DbTableMeta tableMeta, EntityDesc entityDesc) {
for (DbColumnMeta columnMeta : tableMeta.getColumnMetaList()) {
AttributeDesc attributeDesc = attributeDescFactory
.getAttributeDesc(tableMeta, columnMeta);
entityDesc.addAttributeDesc(attributeDesc);
}
}
/**
* 複合一意制約記述を処理します。
*
* @param tableMeta
* テーブルメタデータ
* @param entityDesc
* エンティティ記述
*/
protected void doCompositeUniqueConstraintDesc(DbTableMeta tableMeta,
EntityDesc entityDesc) {
for (DbUniqueKeyMeta uniqueKeyMeta : tableMeta.getUniqueKeyMetaList()) {
CompositeUniqueConstraintDesc compositeUniqueConstraintDesc = compositeUniqueConstraintDescFactory
.getCompositeUniqueConstraintDesc(uniqueKeyMeta);
if (compositeUniqueConstraintDesc != null) {
entityDesc
.addCompositeUniqueConstraintDesc(compositeUniqueConstraintDesc);
}
}
}
}