/* * 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.util.List; import javax.annotation.Generated; import javax.annotation.Resource; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import org.seasar.extension.jdbc.EntityMeta; import org.seasar.extension.jdbc.JdbcManager; import org.seasar.extension.jdbc.PropertyMeta; import org.seasar.extension.jdbc.gen.model.NamesModel; import org.seasar.extension.jdbc.gen.model.NamesModelFactory; import org.seasar.extension.jdbc.gen.model.ServiceModel; import org.seasar.extension.jdbc.gen.model.ServiceModelFactory; import org.seasar.extension.jdbc.operation.Operations; import org.seasar.framework.util.ClassUtil; /** * {@link ServiceModelFactory}の実装クラスです。 * * @author taedium */ public class ServiceModelFactoryImpl implements ServiceModelFactory { /** デフォルトの{@link JdbcManager}のコンポーネント名 */ protected static String DEFAULT_JDBC_MANAGER_NAME = "jdbcManager"; /** パッケージ名、デフォルトパッケージの場合は{@code null} */ protected String packageName; /** {@link JdbcManager}のコンポーネント名 */ protected String jdbcManagerName; /** サービスクラス名のサフィックス */ protected String serviceClassNameSuffix; /** 名前モデルのファクトリ */ protected NamesModelFactory namesModelFactory; /** 名前クラスを使用する場合{@code true} */ protected boolean useNamesClass; /** クラスモデルのサポート */ protected ClassModelSupport classModelSupport = new ClassModelSupport(); /** 生成モデルのサポート */ protected GeneratedModelSupport generatedModelSupport = new GeneratedModelSupport(); /** * インスタンスを構築します。 * * @param packageName * パッケージ名、デフォルトパッケージの場合は{@code null} * @param namesModelFactory * 名前モデルのファクトリ * @param serviceClassNameSuffix * サービスクラス名のサフィックス * @param useNamesClass * 名前クラスを使用する場合{@code true} * @param jdbcManagerName * {@link JdbcManager}のコンポーネント名 */ public ServiceModelFactoryImpl(String packageName, String serviceClassNameSuffix, NamesModelFactory namesModelFactory, boolean useNamesClass, String jdbcManagerName) { if (jdbcManagerName == null) { throw new NullPointerException("jdbcManagerName"); } if (serviceClassNameSuffix == null) { throw new NullPointerException("serviceClassNameSuffix"); } if (namesModelFactory == null) { throw new NullPointerException("namesModelFactory"); } this.packageName = packageName; this.serviceClassNameSuffix = serviceClassNameSuffix; this.namesModelFactory = namesModelFactory; this.useNamesClass = useNamesClass; this.jdbcManagerName = jdbcManagerName; } public ServiceModel getServiceModel(EntityMeta entityMeta) { ServiceModel serviceModel = new ServiceModel(); serviceModel.setPackageName(packageName); serviceModel.setShortClassName(entityMeta.getName() + serviceClassNameSuffix); serviceModel.setShortEntityClassName(entityMeta.getEntityClass() .getSimpleName()); serviceModel .setShortSuperclassName("Abstract" + serviceClassNameSuffix); serviceModel.setJdbcManagerName(jdbcManagerName); serviceModel.setJdbcManagerSetterNecessary(!DEFAULT_JDBC_MANAGER_NAME .equals(jdbcManagerName)); for (PropertyMeta idPropertyMeta : entityMeta.getIdPropertyMetaList()) { serviceModel.addIdPropertyMeta(idPropertyMeta); } if (entityMeta.hasVersionPropertyMeta()) { serviceModel.setVersionPropertyMeta(entityMeta .getVersionPropertyMeta()); } doNamesModel(serviceModel, entityMeta); doImportName(serviceModel, entityMeta); doGeneratedInfo(serviceModel, entityMeta); return serviceModel; } /** * 名前モデルを処理します。 * * @param serviceModel * サービスモデル * @param entityMeta * エンティティメタデータ */ protected void doNamesModel(ServiceModel serviceModel, EntityMeta entityMeta) { if (entityMeta.getIdPropertyMetaList().size() > 0 && useNamesClass) { NamesModel namesModel = namesModelFactory.getNamesModel(entityMeta); serviceModel.setNamesModel(namesModel); } } /** * インポート名を処理します。 * * @param serviceModel * サービスモデル * @param entityMeta * エンティティメタデータ */ protected void doImportName(ServiceModel serviceModel, EntityMeta entityMeta) { classModelSupport.addImportName(serviceModel, entityMeta .getEntityClass()); classModelSupport.addImportName(serviceModel, Generated.class); for (PropertyMeta propertyMeta : serviceModel.getIdPropertyMetaList()) { classModelSupport.addImportName(serviceModel, propertyMeta .getPropertyClass()); } PropertyMeta propertyMeta = serviceModel.getVersionPropertyMeta(); if (propertyMeta != null) { classModelSupport.addImportName(serviceModel, propertyMeta .getPropertyClass()); } NamesModel namesModel = serviceModel.getNamesModel(); if (namesModel != null) { String namesClassName = ClassUtil.concatName(namesModel .getPackageName(), namesModel.getShortClassName()); classModelSupport.addStaticImportName(serviceModel, namesClassName); classModelSupport.addStaticImportName(serviceModel, Operations.class); classModelSupport.addImportName(serviceModel, List.class); } if (serviceModel.isJdbcManagerSetterNecessary()) { classModelSupport.addImportName(serviceModel, Resource.class); classModelSupport.addImportName(serviceModel, TransactionAttribute.class); classModelSupport.addImportName(serviceModel, TransactionAttributeType.class); classModelSupport.addImportName(serviceModel, JdbcManager.class); } } /** * 生成情報を処理します。 * * @param serviceModel * サービスモデル * @param entityMeta * エンティティメタデータ */ protected void doGeneratedInfo(ServiceModel serviceModel, EntityMeta entityMeta) { generatedModelSupport.fillGeneratedInfo(this, serviceModel); } }