/* * 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 javax.annotation.Generated; import org.seasar.extension.jdbc.EntityMeta; import org.seasar.extension.jdbc.PropertyMeta; import org.seasar.extension.jdbc.gen.model.ConditionAssociationModel; import org.seasar.extension.jdbc.gen.model.ConditionAssociationModelFactory; import org.seasar.extension.jdbc.gen.model.ConditionAttributeModel; import org.seasar.extension.jdbc.gen.model.ConditionAttributeModelFactory; import org.seasar.extension.jdbc.gen.model.ConditionModel; import org.seasar.extension.jdbc.gen.model.ConditionModelFactory; import org.seasar.extension.jdbc.where.ComplexWhere; import org.seasar.extension.jdbc.where.condition.AbstractEntityCondition; /** * {@link ConditionModelFactory}の実装クラスです。 * * @author taedium */ public class ConditionModelFactoryImpl implements ConditionModelFactory { /** 条件クラスの属性モデルのファクトリ */ protected ConditionAttributeModelFactory conditionAttributeModelFactory; /** 条件クラスのメソッドモデルのファクトリ */ protected ConditionAssociationModelFactory conditionAssociationModelFactory; /** パッケージ名、デフォルトパッケージの場合は{@code null} */ protected String packageName; /** 条件クラス名のサフィックス */ protected String conditionClassNameSuffix; /** クラスモデルのサポート */ protected ClassModelSupport classModelSupport = new ClassModelSupport(); /** 生成モデルのサポート */ protected GeneratedModelSupport generatedModelSupport = new GeneratedModelSupport(); /** * インスタンスを構築します。 * * @param conditionAttributeModelFactory * 条件クラスの属性モデルのファクトリ * @param conditionAssociationModelFactory * 条件クラスのメソッドモデルのファクトリ * @param packageName * パッケージ名、デフォルトパッケージの場合は{@code null} * @param conditionClassNameSuffix * 条件クラス名のサフィックス */ public ConditionModelFactoryImpl( ConditionAttributeModelFactory conditionAttributeModelFactory, ConditionAssociationModelFactory conditionAssociationModelFactory, String packageName, String conditionClassNameSuffix) { if (conditionAttributeModelFactory == null) { throw new NullPointerException("conditionAttributeModelFactory"); } if (conditionAssociationModelFactory == null) { throw new NullPointerException("conditionAssociationModelFactory"); } if (conditionClassNameSuffix == null) { throw new NullPointerException("conditionClassNameSuffix"); } this.conditionAttributeModelFactory = conditionAttributeModelFactory; this.conditionAssociationModelFactory = conditionAssociationModelFactory; this.packageName = packageName; this.conditionClassNameSuffix = conditionClassNameSuffix; } public ConditionModel getConditionModel(EntityMeta entityMeta) { ConditionModel conditionModel = new ConditionModel(); conditionModel.setPackageName(packageName); conditionModel.setShortClassName(entityMeta.getName() + conditionClassNameSuffix); conditionModel.setShortEntityClassName(entityMeta.getEntityClass() .getSimpleName()); for (int i = 0; i < entityMeta.getPropertyMetaSize(); i++) { PropertyMeta propertyMeta = entityMeta.getPropertyMeta(i); if (propertyMeta.isTransient()) { continue; } if (propertyMeta.isRelationship()) { doConditionMethodModel(conditionModel, propertyMeta); } else { doConditionAttributeModel(conditionModel, propertyMeta); } } doImportName(conditionModel, entityMeta); doGeneratedInfo(conditionModel, entityMeta); return conditionModel; } /** * 条件クラスの属性モデルを処理します。 * * @param conditionModel * 条件クラスのモデル * @param propertyMeta * プロパティメタデータ */ protected void doConditionAttributeModel(ConditionModel conditionModel, PropertyMeta propertyMeta) { ConditionAttributeModel attributeModel = conditionAttributeModelFactory .getConditionAttributeModel(propertyMeta); conditionModel.addConditionAttributeModel(attributeModel); } /** * 条件クラスのメソッドモデルを処理します。 * * @param conditionModel * 条件クラスのモデル * @param propertyMeta * プロパティメタデータ */ protected void doConditionMethodModel(ConditionModel conditionModel, PropertyMeta propertyMeta) { ConditionAssociationModel methodModel = conditionAssociationModelFactory .getConditionAssociationModel(propertyMeta); conditionModel.addConditionAssociationModel(methodModel); } /** * インポート名を処理します。 * * @param conditionModel * 条件クラスのモデル * @param entityMeta * エンティティメタデータ */ protected void doImportName(ConditionModel conditionModel, EntityMeta entityMeta) { classModelSupport.addImportName(conditionModel, Generated.class); classModelSupport.addImportName(conditionModel, ComplexWhere.class); classModelSupport.addImportName(conditionModel, AbstractEntityCondition.class); for (ConditionAttributeModel attributeModel : conditionModel .getConditionAttributeModelList()) { classModelSupport.addImportName(conditionModel, attributeModel .getAttributeClass()); classModelSupport.addImportName(conditionModel, attributeModel .getConditionClass()); } } /** * 生成情報を処理します。 * * @param conditionModel * 条件クラスのモデル * @param entityMeta * エンティティメタデータ */ protected void doGeneratedInfo(ConditionModel conditionModel, EntityMeta entityMeta) { generatedModelSupport.fillGeneratedInfo(this, conditionModel); } }