/* * 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.EntityMeta; import org.seasar.extension.jdbc.EntityMetaFactory; import org.seasar.extension.jdbc.ValueType; import org.seasar.extension.jdbc.gen.desc.ColumnDescFactory; import org.seasar.extension.jdbc.gen.desc.DatabaseDesc; import org.seasar.extension.jdbc.gen.desc.DatabaseDescFactory; import org.seasar.extension.jdbc.gen.desc.ForeignKeyDescFactory; import org.seasar.extension.jdbc.gen.desc.IdTableDescFactory; import org.seasar.extension.jdbc.gen.desc.PrimaryKeyDescFactory; import org.seasar.extension.jdbc.gen.desc.SequenceDescFactory; import org.seasar.extension.jdbc.gen.desc.TableDesc; import org.seasar.extension.jdbc.gen.desc.TableDescFactory; import org.seasar.extension.jdbc.gen.desc.UniqueKeyDescFactory; import org.seasar.extension.jdbc.gen.dialect.GenDialect; import org.seasar.extension.jdbc.gen.meta.EntityMetaReader; import org.seasar.extension.jdbc.gen.provider.ValueTypeProvider; /** * {@link DatabaseDescFactory}の実装です。 * * @author taedium */ public class DatabaseDescFactoryImpl implements DatabaseDescFactory { /** エンティティメタデータのファクトリ */ protected EntityMetaFactory entityMetaFactory; /** エンティティメタデータのリーダ */ protected EntityMetaReader entityMetaReader; /** 方言 */ protected GenDialect dialect; /** {@link ValueType}の提供者 */ protected ValueTypeProvider valueTypeProvider; /** 関連を外部キーとみなす場合{@code true}、みなさない場合{@code false} */ protected boolean regardRelationshipAsFk; /** テーブル記述のファクトリ */ protected TableDescFactory tableDescFactory; /** * インスタンスを構築します。 * * @param entityMetaFactory * エンティティメタデータのファクトリ * @param entityMetaReader * エンティティメタデータのリーダ * @param dialect * 方言 * @param valueTypeProvider * {@link ValueType}の提供者 * @param regardRelationshipAsFk * 関連を外部キーとみなす場合{@code true}、みなさない場合{@code false} */ public DatabaseDescFactoryImpl(EntityMetaFactory entityMetaFactory, EntityMetaReader entityMetaReader, GenDialect dialect, ValueTypeProvider valueTypeProvider, boolean regardRelationshipAsFk) { if (entityMetaFactory == null) { throw new NullPointerException("entityMetaFactory"); } if (entityMetaReader == null) { throw new NullPointerException("entityMetaReader"); } if (dialect == null) { throw new NullPointerException("dialect"); } if (valueTypeProvider == null) { throw new NullPointerException("valueTypeResolver"); } this.entityMetaFactory = entityMetaFactory; this.entityMetaReader = entityMetaReader; this.dialect = dialect; this.valueTypeProvider = valueTypeProvider; this.regardRelationshipAsFk = regardRelationshipAsFk; this.tableDescFactory = createTableDescFactory(); } public DatabaseDesc getDatabaseDesc() { DatabaseDesc databaseDesc = new DatabaseDesc(); databaseDesc.setFiltered(entityMetaReader.isFiltered()); for (EntityMeta entityMeta : entityMetaReader.read()) { TableDesc tableDesc = tableDescFactory.getTableDesc(entityMeta); databaseDesc.addTableDesc(tableDesc); for (TableDesc idTableDesc : tableDesc.getIdTableDescList()) { databaseDesc.addTableDesc(idTableDesc); } } return databaseDesc; } /** * テーブル記述のファクトリを作成します。 * * @return テーブル記述のファクトリ */ protected TableDescFactory createTableDescFactory() { ColumnDescFactory colFactory = createColumnDescFactory(); PrimaryKeyDescFactory pkFactory = createPrimaryKeyDescFactory(); UniqueKeyDescFactory ukFactory = createUniqueKeyDescFactory(); ForeignKeyDescFactory fkFactory = createForeignKeyDescFactory(); SequenceDescFactory seqFactory = createSequenceDescFactory(); IdTableDescFactory idTabFactory = createIdTableDescFactory(ukFactory); return new TableDescFactoryImpl(dialect, colFactory, pkFactory, ukFactory, fkFactory, seqFactory, idTabFactory); } /** * {@link ColumnDescFactory}の実装を返します。 * * @return {@link ColumnDescFactory}の実装 */ protected ColumnDescFactory createColumnDescFactory() { return new ColumnDescFactoryImpl(dialect, valueTypeProvider); } /** * {@link PrimaryKeyDescFactory}の実装を返します。 * * @return {@link PrimaryKeyDescFactory}の実装 */ protected PrimaryKeyDescFactory createPrimaryKeyDescFactory() { return new PrimaryKeyDescFactoryImpl(dialect); } /** * {@link UniqueKeyDescFactory}の実装を返します。 * * @return {@link UniqueKeyDescFactory}の実装 */ protected UniqueKeyDescFactory createUniqueKeyDescFactory() { return new UniqueKeyDescFactoryImpl(dialect); } /** * {@link ForeignKeyDescFactoryImpl}の実装を返します。 * * @return {@link ForeignKeyDescFactoryImpl}の実装 */ protected ForeignKeyDescFactory createForeignKeyDescFactory() { return new ForeignKeyDescFactoryImpl(dialect, entityMetaFactory, regardRelationshipAsFk); } /** * {@link SequenceDescFactory}の実装を返します。 * * @return {@link SequenceDescFactory}の実装 */ protected SequenceDescFactory createSequenceDescFactory() { return new SequenceDescFactoryImpl(dialect, valueTypeProvider); } /** * {@link IdTableDescFactory}の実装を返します。 * * @param ukFactory * 一意キー記述のファクトリ * @return {@link IdTableDescFactory}の実装 */ protected IdTableDescFactory createIdTableDescFactory( UniqueKeyDescFactory ukFactory) { return new IdTableDescFactoryImpl(dialect, ukFactory); } }