package org.agnitas.emm.extension.impl; import javax.sql.DataSource; import org.agnitas.emm.extension.PluginInstaller; import org.agnitas.emm.extension.dao.PluginDao; import org.agnitas.emm.extension.sqlparser.validator.DatabaseScriptValidator; import org.agnitas.emm.extension.sqlparser.validator.impl.SimpleDatabaseScriptValidator; import org.apache.log4j.Logger; public class ExtensionSystemBuilder { private static final transient Logger logger = Logger.getLogger( ExtensionSystemBuilder.class); private String systemPluginBaseDirectory; private String pluginBaseDirectory; private String jspBaseDirectory; private String databaseName; private PluginDao pluginDao; private DataSource dataSource; public ExtensionSystemImpl createExtensionSystem() { if( logger.isInfoEnabled()) { logger.info( "Creating new extension system"); } checkConfiguration(); DatabaseScriptValidator scriptValidator = new SimpleDatabaseScriptValidator(); ExtensionSystemConfiguration configuration = createExtensionSystemConfiguration(); JspRestoreUtil jspRestoreUtil = new JspRestoreUtil( configuration); DatabaseScriptExecutor scriptExecutor = new DatabaseScriptExecutor( dataSource, scriptValidator); PluginInstaller pluginInstaller = createPluginInstaller( configuration, jspRestoreUtil, scriptExecutor); return createInstance( configuration, jspRestoreUtil, pluginInstaller, pluginDao); } public String getSystemPluginBaseDirectory() { return this.systemPluginBaseDirectory; } public String getPluginBaseDirectory() { return this.pluginBaseDirectory; } public String getJspBaseDirectory() { return this.jspBaseDirectory; } public String getDatabaseName() { return this.databaseName; } protected ExtensionSystemConfiguration createExtensionSystemConfiguration() { return new ExtensionSystemConfiguration( systemPluginBaseDirectory, pluginBaseDirectory, jspBaseDirectory, databaseName); } protected PluginInstaller createPluginInstaller( ExtensionSystemConfiguration configuration, JspRestoreUtil jspRestoreUtil, DatabaseScriptExecutor scriptExecutor) { return new PluginInstallerImpl( configuration, jspRestoreUtil, scriptExecutor); } protected ExtensionSystemImpl createInstance( ExtensionSystemConfiguration configuration, JspRestoreUtil jspRestoreUtil, PluginInstaller pluginInstaller, PluginDao pluginDao) { return new ExtensionSystemImpl( configuration, jspRestoreUtil, pluginInstaller, pluginDao); } public ExtensionSystemBuilder setSystemPluginBaseDirectory( String systemPluginBaseDirectory) { this.systemPluginBaseDirectory = systemPluginBaseDirectory; return this; } public ExtensionSystemBuilder setPluginBaseDirectory( String pluginBaseDirectory) { this.pluginBaseDirectory = pluginBaseDirectory; return this; } public ExtensionSystemBuilder setJspBaseDirectory( String jspBaseDirectory) { this.jspBaseDirectory = jspBaseDirectory; return this; } public ExtensionSystemBuilder setPluginDao( PluginDao pluginDao) { this.pluginDao = pluginDao; return this; } public ExtensionSystemBuilder setDataSource( DataSource dataSource) { this.dataSource = dataSource; return this; } public ExtensionSystemBuilder setDatabaseName( String databaseName) { this.databaseName = databaseName; return this; } protected void checkConfiguration() { if( logger.isInfoEnabled()) { logger.info( "Checking configuration for extension system"); } if( systemPluginBaseDirectory == null) { logger.error( "Directory for system-plugins not set"); throw new IllegalStateException( "system-plugin directory not set"); } if( pluginBaseDirectory == null) { logger.error( "Directory for additional plugins not set"); throw new IllegalStateException( "plugin directory not set"); } if( jspBaseDirectory == null) { logger.error( "Working directory for JSPs not set"); throw new IllegalStateException( "JSP base directory for plugins not set"); } if( pluginDao == null) { logger.error( "Plugin DAO not set"); throw new IllegalStateException( "Plugin DAO not set"); } if( dataSource == null) { logger.error( "Data source not set"); throw new IllegalStateException( "Data source not set"); } if( databaseName == null) { logger.error( "Database name is not set"); throw new IllegalStateException( "Database name not set"); } if( logger.isInfoEnabled()) { logger.info( "Configuration is good"); } } }