/* * 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.NamesAssociationModel; import org.seasar.extension.jdbc.gen.model.NamesAttributeModel; import org.seasar.extension.jdbc.gen.model.NamesModel; import org.seasar.extension.jdbc.gen.model.NamesModelFactory; import org.seasar.extension.jdbc.name.PropertyName; import org.seasar.framework.util.ClassUtil; /** * {@link NamesModelFactory}の実装クラスです。 * * @author taedium */ public class NamesModelFactoryImpl implements NamesModelFactory { /** 内部クラスのプレフィックス */ protected static String INNER_CLASS_NAME_PREFIX = "_"; /** パッケージ名、デフォルトパッケージの場合は{@code null} */ protected String packageName; /** 名前クラス名のサフィックス */ protected String namesClassNameSuffix; /** クラスモデルのサポート */ protected ClassModelSupport classModelSupport = new ClassModelSupport(); /** 生成モデルのサポート */ protected GeneratedModelSupport generatedModelSupport = new GeneratedModelSupport(); /** * インスタンスを構築します。 * * @param namesClassNameSuffix * 名前クラス名のサフィックス * @param packageName * パッケージ名、デフォルトパッケージの場合は{@code null} */ public NamesModelFactoryImpl(String packageName, String namesClassNameSuffix) { if (namesClassNameSuffix == null) { throw new NullPointerException("namesClassNameSuffix"); } this.packageName = packageName; this.namesClassNameSuffix = namesClassNameSuffix; } public NamesModel getNamesModel(EntityMeta entityMeta) { NamesModel namesModel = new NamesModel(); namesModel.setPackageName(packageName); String shortClassName = entityMeta.getName() + namesClassNameSuffix; namesModel.setShortClassName(shortClassName); namesModel.setShortInnerClassName(INNER_CLASS_NAME_PREFIX + shortClassName); namesModel.setEntityClassName(entityMeta.getEntityClass().getName()); namesModel.setShortEntityClassName(entityMeta.getEntityClass() .getSimpleName()); for (PropertyMeta propertyMeta : entityMeta.getAllPropertyMeta()) { if (propertyMeta.isTransient()) { continue; } if (propertyMeta.isRelationship()) { doNamesAssociationModel(namesModel, propertyMeta); } else { doNamesAttributeModel(namesModel, propertyMeta); } } doImportName(namesModel, entityMeta); doGeneratedInfo(namesModel, entityMeta); return namesModel; } /** * 名前の属性モデルを処理します。 * * @param namesModel * 名前モデル * @param propertyMeta * プロパティメタデータ */ protected void doNamesAttributeModel(NamesModel namesModel, PropertyMeta propertyMeta) { NamesAttributeModel namesAttributeModel = new NamesAttributeModel(); namesAttributeModel.setName(propertyMeta.getName()); Class<?> clazz = ClassUtil.getWrapperClassIfPrimitive(propertyMeta .getPropertyClass()); namesAttributeModel.setAttributeClass(clazz); namesModel.addNamesAttributeModel(namesAttributeModel); } /** * 名前の関連モデルを処理します。 * * @param namesModel * 名前モデル * @param propertyMeta * プロパティメタデータ */ protected void doNamesAssociationModel(NamesModel namesModel, PropertyMeta propertyMeta) { NamesAssociationModel namesAssociationModel = new NamesAssociationModel(); namesAssociationModel.setName(propertyMeta.getName()); String shortClassName = INNER_CLASS_NAME_PREFIX + propertyMeta.getRelationshipClass().getSimpleName() + namesClassNameSuffix; namesAssociationModel.setShortClassName(shortClassName); StringBuilder buf = new StringBuilder(); buf.append(packageName); buf.append("."); buf.append(propertyMeta.getRelationshipClass().getSimpleName()); buf.append(namesClassNameSuffix); buf.append("."); buf.append(shortClassName); namesAssociationModel.setClassName(buf.toString()); namesModel.adddNamesAssociationModel(namesAssociationModel); } /** * インポート名を処理します。 * * @param namesModel * 名前モデル * @param entityMeta * エンティティメターデータ */ protected void doImportName(NamesModel namesModel, EntityMeta entityMeta) { classModelSupport .addImportName(namesModel, entityMeta.getEntityClass()); classModelSupport.addImportName(namesModel, PropertyName.class); classModelSupport.addImportName(namesModel, Generated.class); for (NamesAttributeModel attributeModel : namesModel .getNamesAttributeModelList()) { classModelSupport.addImportName(namesModel, attributeModel .getAttributeClass()); } for (NamesAssociationModel associationModel : namesModel .getNamesAssociationModelList()) { classModelSupport.addImportName(namesModel, associationModel .getClassName()); } } /** * 生成情報を処理します。 * * @param namesModel * 名前モデル * @param entityMeta * エンティティメターデータ */ protected void doGeneratedInfo(NamesModel namesModel, EntityMeta entityMeta) { generatedModelSupport.fillGeneratedInfo(this, namesModel); } }