${database.allClassCopyright}package ${glPackageBaseCommon}; import javax.sql.DataSource; import org.seasar.dbflute.DBDef; import org.seasar.dbflute.bhv.core.BehaviorCommandInvoker; import org.seasar.dbflute.bhv.core.InvokerAssistant; import org.seasar.dbflute.bhv.core.supplement.SequenceCacheHandler; import org.seasar.dbflute.bhv.core.supplement.SequenceCacheKeyGenerator; import org.seasar.dbflute.bhv.outsidesql.factory.DefaultOutsideSqlExecutorFactory; import org.seasar.dbflute.bhv.outsidesql.factory.OutsideSqlExecutorFactory; import org.seasar.dbflute.cbean.sqlclause.SqlClauseCreator; import org.seasar.dbflute.dbmeta.DBMetaProvider; import org.seasar.dbflute.exception.factory.SQLExceptionHandlerFactory; import org.seasar.dbflute.exception.factory.DefaultSQLExceptionHandlerFactory; import org.seasar.dbflute.exception.thrower.BehaviorExceptionThrower; import org.seasar.dbflute.jdbc.DataSourceHandler; import org.seasar.dbflute.jdbc.HandlingDataSourceWrapper; import org.seasar.dbflute.jdbc.StatementConfig; import org.seasar.dbflute.jdbc.StatementFactory; import org.seasar.dbflute.resource.ResourceParameter; #if ($database.isTargetContainerSeasar()) import org.seasar.extension.jdbc.types.ValueTypes; import org.seasar.dbflute.helper.beans.factory.DfBeanDescFactory; #end import org.seasar.dbflute.s2dao.extension.TnBeanMetaDataFactoryExtension; import org.seasar.dbflute.s2dao.jdbc.TnStatementFactoryImpl; import org.seasar.dbflute.s2dao.metadata.TnBeanMetaDataFactory; import org.seasar.dbflute.twowaysql.factory.DefaultSqlAnalyzerFactory; import org.seasar.dbflute.twowaysql.factory.SqlAnalyzerFactory; #if ($database.isTargetContainerSeasar()) import org.seasar.framework.util.Disposable; import org.seasar.framework.util.DisposableUtil; #end /** * @author ${database.classAuthor} */ public class ${glImplementedInvokerAssistant} implements InvokerAssistant { // =================================================================================== // Attribute // ========= // ----------------------------------------------------- // DI Component // ------------ protected BehaviorCommandInvoker _behaviorCommandInvoker; protected DataSource _dataSource; // ----------------------------------------------------- // Lazy Component // -------------- protected volatile DBMetaProvider _dbmetaProvider; protected volatile SqlClauseCreator _sqlClauseCreator; protected volatile StatementFactory _statementFactory; protected volatile TnBeanMetaDataFactory _beanMetaDataFactory; protected volatile SqlAnalyzerFactory _sqlAnalyzerFactory; protected volatile OutsideSqlExecutorFactory _outsideSqlExecutorFactory; protected volatile SQLExceptionHandlerFactory _sqlExceptionHandlerFactory; protected volatile SequenceCacheHandler _sequenceCacheHandler; // ----------------------------------------------------- // Disposable Flag // --------------- protected volatile boolean _disposable; // =================================================================================== // Assistant Main Work // =================== // ----------------------------------------------------- // Current DBDef // ------------- public DBDef assistCurrentDBDef() { return ${glDBCurrent}.getInstance().currentDBDef(); } // ----------------------------------------------------- // Data Source // ----------- public DataSource assistDataSource() { // DI component DataSourceHandler dataSourceHandler = ${glDBFluteConfig}.getInstance().getDataSourceHandler(); if (dataSourceHandler != null) { return new HandlingDataSourceWrapper(_dataSource, dataSourceHandler); } return _dataSource; } // ----------------------------------------------------- // DBMeta Provider // --------------- public DBMetaProvider assistDBMetaProvider() { // lazy component if (_dbmetaProvider != null) { return _dbmetaProvider; } synchronized (this) { if (_dbmetaProvider != null) { return _dbmetaProvider; } _dbmetaProvider = createDBMetaProvider(); } return _dbmetaProvider; } protected DBMetaProvider createDBMetaProvider() { return ${glDBMetaInstanceHandler}.getProvider(); } // ----------------------------------------------------- // SQL Clause Creator // ------------------ public SqlClauseCreator assistSqlClauseCreator() { // lazy component if (_sqlClauseCreator != null) { return _sqlClauseCreator; } synchronized (this) { if (_sqlClauseCreator != null) { return _sqlClauseCreator; } _sqlClauseCreator = createSqlClauseCreator(); } return _sqlClauseCreator; } protected SqlClauseCreator createSqlClauseCreator() { SqlClauseCreator creator = ${glDBFluteConfig}.getInstance().getSqlClauseCreator(); if (creator != null) { return creator; } return new ${glImplementedSqlClauseCreator}(); // as default } // ----------------------------------------------------- // Statement Factory // ----------------- public StatementFactory assistStatementFactory() { // lazy component if (_statementFactory != null) { return _statementFactory; } synchronized (this) { if (_statementFactory != null) { return _statementFactory; } _statementFactory = createStatementFactory(); } return _statementFactory; } protected StatementFactory createStatementFactory() { final TnStatementFactoryImpl factory = new TnStatementFactoryImpl(); factory.setDefaultStatementConfig(assistDefaultStatementConfig()); factory.setInternalDebug(${glDBFluteConfig}.getInstance().isInternalDebug()); return factory; } // ----------------------------------------------------- // Bean Meta Data Factory // ---------------------- public TnBeanMetaDataFactory assistBeanMetaDataFactory() { // lazy component if (_beanMetaDataFactory != null) { return _beanMetaDataFactory; } synchronized (this) { if (_beanMetaDataFactory != null) { return _beanMetaDataFactory; } _beanMetaDataFactory = createBeanMetaDataFactory(); } return _beanMetaDataFactory; } protected TnBeanMetaDataFactory createBeanMetaDataFactory() { final TnBeanMetaDataFactoryExtension factory = new TnBeanMetaDataFactoryExtension(); factory.setDataSource(_dataSource); factory.setInternalDebug(${glDBFluteConfig}.getInstance().isInternalDebug()); return factory; } // ----------------------------------------------------- // SQL Analyzer Factory // -------------------- /** * {@inheritDoc} */ public SqlAnalyzerFactory assistSqlAnalyzerFactory() { // lazy component if (_sqlAnalyzerFactory != null) { return _sqlAnalyzerFactory; } synchronized (this) { if (_sqlAnalyzerFactory != null) { return _sqlAnalyzerFactory; } _sqlAnalyzerFactory = createSqlAnalyzerFactory(); } return _sqlAnalyzerFactory; } protected SqlAnalyzerFactory createSqlAnalyzerFactory() { return new DefaultSqlAnalyzerFactory(); } // ----------------------------------------------------- // OutsideSql Executor Factory // --------------------------- /** * {@inheritDoc} */ public OutsideSqlExecutorFactory assistOutsideSqlExecutorFactory() { if (_outsideSqlExecutorFactory != null) { return _outsideSqlExecutorFactory; } synchronized (this) { if (_outsideSqlExecutorFactory != null) { return _outsideSqlExecutorFactory; } _outsideSqlExecutorFactory = createOutsideSqlExecutorFactory(); } return _outsideSqlExecutorFactory; } protected OutsideSqlExecutorFactory createOutsideSqlExecutorFactory() { OutsideSqlExecutorFactory factory = ${glDBFluteConfig}.getInstance().getOutsideSqlExecutorFactory(); if (factory != null) { return factory; } return new DefaultOutsideSqlExecutorFactory(); } // ----------------------------------------------------- // SQLException Handler Factory // ---------------------------- /** * {@inheritDoc} */ public SQLExceptionHandlerFactory assistSQLExceptionHandlerFactory() { // lazy component if (_sqlExceptionHandlerFactory != null) { return _sqlExceptionHandlerFactory; } synchronized (this) { if (_sqlExceptionHandlerFactory != null) { return _sqlExceptionHandlerFactory; } _sqlExceptionHandlerFactory = createSQLExceptionHandlerFactory(); } return _sqlExceptionHandlerFactory; } protected SQLExceptionHandlerFactory createSQLExceptionHandlerFactory() { return new DefaultSQLExceptionHandlerFactory(); } // ----------------------------------------------------- // Sequence Cache Handler // ---------------------- /** * {@inheritDoc} */ public SequenceCacheHandler assistSequenceCacheHandler() { // lazy component if (_sequenceCacheHandler != null) { return _sequenceCacheHandler; } synchronized (this) { if (_sequenceCacheHandler != null) { return _sequenceCacheHandler; } _sequenceCacheHandler = createSequenceCacheHandler(); } return _sequenceCacheHandler; } protected SequenceCacheHandler createSequenceCacheHandler() { SequenceCacheHandler handler = new SequenceCacheHandler(); SequenceCacheKeyGenerator generator = ${glDBFluteConfig}.getInstance().getSequenceCacheKeyGenerator(); if (generator != null) { handler.setSequenceCacheKeyGenerator(generator); } handler.setInternalDebug(${glDBFluteConfig}.getInstance().isInternalDebug()); return handler; } // ----------------------------------------------------- // SQL File Encoding // ----------------- public String assistSqlFileEncoding() { return "${database.sqlFileEncoding}"; } // ----------------------------------------------------- // Statement Configuration // ----------------------- public StatementConfig assistDefaultStatementConfig() { return ${glDBFluteConfig}.getInstance().getDefaultStatementConfig(); } // ----------------------------------------------------- // Behavior Exception Thrower // -------------------------- public BehaviorExceptionThrower assistBehaviorExceptionThrower() { return new BehaviorExceptionThrower(); } // ----------------------------------------------------- // Resource Parameter // ------------------ public ResourceParameter assistResourceParameter() { ResourceParameter resourceParameter = new ResourceParameter(); resourceParameter.setOutsideSqlPackage(${glDBFluteConfig}.getInstance().getOutsideSqlPackage()); resourceParameter.setLogDateFormat(${glDBFluteConfig}.getInstance().getLogDateFormat()); resourceParameter.setLogTimestampFormat(${glDBFluteConfig}.getInstance().getLogTimestampFormat()); resourceParameter.setInternalDebug(${glDBFluteConfig}.getInstance().isInternalDebug()); return resourceParameter; } // =================================================================================== // Dispose // ======= public void toBeDisposable() { // for HotDeploy #if ($database.isTargetContainerSeasar()) if (_disposable) { return; } synchronized (this) { if (_disposable) { return; } // Register for BehaviorCommandInvoker DisposableUtil.add(new Disposable() { public void dispose() { if (_behaviorCommandInvoker != null) { _behaviorCommandInvoker.clearExecutionCache(); } _disposable = false; } }); // Register for BeanDescFactory DisposableUtil.add(new Disposable() { public void dispose() { DfBeanDescFactory.clear(); } }); // Register for ValueTypes DisposableUtil.add(new Disposable() { public void dispose() { ValueTypes.clear(); } }); _disposable = true; } #end } public boolean isDisposable() { return _disposable; } // =================================================================================== // Assert Helper // ============= protected void assertBehaviorCommandInvoker() { if (_behaviorCommandInvoker == null) { String msg = "The attribute 'behaviorCommandInvoker' should not be null!"; throw new IllegalStateException(msg); } } // =================================================================================== // Accessor // ======== public void setBehaviorCommandInvoker(BehaviorCommandInvoker behaviorCommandInvoker) { _behaviorCommandInvoker = behaviorCommandInvoker; } public void setDataSource(DataSource dataSource) { _dataSource = dataSource; } }