Author: tchemit Date: 2012-09-03 01:42:15 +0200 (Mon, 03 Sep 2012) New Revision: 592 Url: http://forge.codelutin.com/repositories/revision/echobase/592 Log: improve jdbc drivers accessibility (was not possible before only for embedded applications) finish embedded application creation with new internal db (need some tests) Added: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseApplicationConfigProvider.java Removed: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchobaseApplicationConfigProvider.java Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java trunk/echobase-domain/src/main/java/fr/ifremer/echobase/entities/DriverType.java trunk/echobase-domain/src/main/java/fr/ifremer/echobase/persistence/EchobaseTopiaContexts.java trunk/echobase-domain/src/main/resources/META-INF/services/org.nuiton.util.ApplicationConfigProvider trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/embeddedapplication/EmbeddedApplicationService.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/workingDb/WorkingDbConfigurationService.java trunk/echobase-services/src/main/resources/embedded/echobase.properties trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/EchoBaseApplicationListener.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/Information.java trunk/echobase-ui/src/main/resources/echobase.properties trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/information.jsp Copied: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseApplicationConfigProvider.java (from rev 591, trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchobaseApplicationConfigProvider.java) =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseApplicationConfigProvider.java (rev 0) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseApplicationConfigProvider.java 2012-09-02 23:42:15 UTC (rev 592) @@ -0,0 +1,60 @@ +package fr.ifremer.echobase; + +/* + * #%L + * EchoBase :: Domain + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import org.nuiton.util.ApplicationConfig; +import org.nuiton.util.ApplicationConfigProvider; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l_; + +/** + * To generate configuration report. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.1 + */ +public class EchoBaseApplicationConfigProvider implements ApplicationConfigProvider { + + @Override + public String getName() { + return "echobase"; + } + + @Override + public String getDescription(Locale locale) { + return l_(locale, "echobase.configuration.description"); + } + + @Override + public ApplicationConfig.OptionDef[] getOptions() { + return EchoBaseConfigurationOption.values(); + } + + @Override + public ApplicationConfig.ActionDef[] getActions() { + return new ApplicationConfig.ActionDef[0]; + } +} Property changes on: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseApplicationConfigProvider.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java 2012-09-02 23:42:15 UTC (rev 592) @@ -23,6 +23,7 @@ package fr.ifremer.echobase; import com.google.common.base.Preconditions; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,7 +35,6 @@ import java.io.File; import java.io.IOException; -import java.net.URL; import java.util.Map; import java.util.Properties; @@ -110,6 +110,12 @@ } createDirectory(EchoBaseConfigurationOption.DATA_DIRECTORY); + try { + FileUtils.forceMkdir(getWarDirectory()); + FileUtils.forceMkdir(getLibDirectory()); + } catch (IOException e) { + throw new EchoBaseTechnicalException(e); + } if (log.isDebugEnabled()) { log.debug("parsed options in config file" + @@ -135,11 +141,18 @@ } public File getInternalDbDirectory() { - File file = applicationConfig.getOptionAsFile(EchoBaseConfigurationOption.INTERNAL_DB_DIRECTORY.key); + File file = applicationConfig.getOptionAsFile( + EchoBaseConfigurationOption.INTERNAL_DB_DIRECTORY.key); Preconditions.checkNotNull(file); return file; } + public File getLibDirectory() { + File file = new File(getDataDirectory(), "lib"); + Preconditions.checkNotNull(file); + return file; + } + public File getWarDirectory() { File file = applicationConfig.getOptionAsFile( EchoBaseConfigurationOption.WAR_DIRECTORY.key); @@ -168,6 +181,20 @@ return v; } + public String getH2Version() { + String v = applicationConfig.getOption( + EchoBaseConfigurationOption.H2_VERSION.key); + Preconditions.checkNotNull(v); + return v; + } + + public String getPostgresqlVersion() { + String v = applicationConfig.getOption( + EchoBaseConfigurationOption.POSTGRESQL_VERSION.key); + Preconditions.checkNotNull(v); + return v; + } + public Class<?> getDriverClass() { Class<?> klass = applicationConfig.getOptionAsClass( TopiaContextFactory.CONFIG_DRIVER); Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java 2012-09-02 23:42:15 UTC (rev 592) @@ -26,7 +26,6 @@ import org.nuiton.util.Version; import java.io.File; -import java.net.URL; import static org.nuiton.i18n.I18n.n_; @@ -53,6 +52,12 @@ VERSION("echobase.version", n_("echobase.config.version.description"), "", Version.class), + H2_VERSION("echobase.h2Version", + n_("echobase.config.h2Version.description"), + "", String.class), + POSTGRESQL_VERSION("echobase.postgresqlVersion", + n_("echobase.config.postgresqlVersion.description"), + "", String.class), CSV_SEPARATOR("echobase.csv.separator", n_("echobase.config.csv.separator.description"), ";", char.class), Deleted: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchobaseApplicationConfigProvider.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchobaseApplicationConfigProvider.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/EchobaseApplicationConfigProvider.java 2012-09-02 23:42:15 UTC (rev 592) @@ -1,60 +0,0 @@ -package fr.ifremer.echobase; - -/* - * #%L - * EchoBase :: Domain - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2011 - 2012 Ifremer, Codelutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import org.nuiton.util.ApplicationConfig; -import org.nuiton.util.ApplicationConfigProvider; - -import java.util.Locale; - -import static org.nuiton.i18n.I18n.l_; - -/** - * To generate configuration report. - * - * @author tchemit <chemit@codelutin.com> - * @since 1.1 - */ -public class EchobaseApplicationConfigProvider implements ApplicationConfigProvider { - - @Override - public String getName() { - return "echobase"; - } - - @Override - public String getDescription(Locale locale) { - return l_(locale, "echobase.configuration.description"); - } - - @Override - public ApplicationConfig.OptionDef[] getOptions() { - return EchoBaseConfigurationOption.values(); - } - - @Override - public ApplicationConfig.ActionDef[] getActions() { - return new ApplicationConfig.ActionDef[0]; - } -} Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/entities/DriverType.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/entities/DriverType.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/entities/DriverType.java 2012-09-02 23:42:15 UTC (rev 592) @@ -23,12 +23,11 @@ * #L% */ +import fr.ifremer.echobase.EchoBaseConfiguration; import fr.ifremer.echobase.I18nAble; import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.PostgreSQLDialect; -import java.util.Properties; - import static org.nuiton.i18n.I18n.n_; /** @@ -43,17 +42,17 @@ H2Dialect.class, n_("echobase.common.driverType.h2")) { @Override - public String getPilotFileName(Properties config) { - String h2Version = config.getProperty("h2Version"); - return h2Version == null ? null : "h2-" + h2Version + ".jar"; + public String getPilotFileName(EchoBaseConfiguration config) { + String version = config.getH2Version(); + return version == null ? null : "h2-" + version + ".jar"; } }, POSTGRESQL(org.postgresql.Driver.class, PostgreSQLDialect.class, n_("echobase.common.driverType.postgres")) { @Override - public String getPilotFileName(Properties config) { - String pgVersion = config.getProperty("postgresqlVersion"); + public String getPilotFileName(EchoBaseConfiguration config) { + String pgVersion = config.getPostgresqlVersion(); return pgVersion == null ? null : "postgresql-" + pgVersion + ".jar"; } }; @@ -80,7 +79,7 @@ return dialectClass; } - public abstract String getPilotFileName(Properties config); + public abstract String getPilotFileName(EchoBaseConfiguration config); @Override public String getI18nKey() { Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/persistence/EchobaseTopiaContexts.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/persistence/EchobaseTopiaContexts.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/persistence/EchobaseTopiaContexts.java 2012-09-02 23:42:15 UTC (rev 592) @@ -24,7 +24,6 @@ */ import com.google.common.base.Charsets; -import fr.ifremer.echobase.EchoBaseConfiguration; import fr.ifremer.echobase.EchoBaseConfigurationOption; import fr.ifremer.echobase.entities.DriverType; import fr.ifremer.echobase.entities.EchoBaseDAOHelper; @@ -66,16 +65,14 @@ // should not be instanciated } - public static Properties loadWorkingDbConfiguration(JdbcConfiguration jdbcConfiguration) { + public static Properties loadWorkingDbConfiguration(JdbcConfiguration conf) { Properties result = new RecursiveProperties(); - DriverType driverType = - jdbcConfiguration.getDriverType(); + DriverType driverType = conf.getDriverType(); - result.setProperty("configuration.url", jdbcConfiguration.getUrl()); - result.setProperty("configuration.login", jdbcConfiguration.getLogin()); - result.setProperty("configuration.password", - jdbcConfiguration.getPassword()); + result.setProperty("configuration.url", conf.getUrl()); + result.setProperty("configuration.login", conf.getLogin()); + result.setProperty("configuration.password", conf.getPassword()); result.setProperty("configuration.driver", driverType.getDriverClass().getName()); result.setProperty("configuration.dialect", @@ -93,12 +90,10 @@ return result; } - public static Properties loadInternalDbconfiguration(EchoBaseConfiguration configuration) { - File internalDbDirectory = configuration.getInternalDbDirectory(); + public static Properties loadInternalDbconfiguration(File internalDbDirectory) { Properties result = new RecursiveProperties(); - String key = - EchoBaseConfigurationOption.INTERNAL_DB_DIRECTORY.getKey(); + String key = EchoBaseConfigurationOption.INTERNAL_DB_DIRECTORY.getKey(); result.setProperty(key, internalDbDirectory.getAbsolutePath()); @@ -117,7 +112,6 @@ public static TopiaContext newWorkingDb(JdbcConfiguration jdbcConfiguration) { Properties result = loadWorkingDbConfiguration(jdbcConfiguration); - return newDb(result); } @@ -125,16 +119,18 @@ * Open a new topia root context for the internal db of t3 (this should be * a h2 db used only for security). * - * @param configuration application configuration where to find db directory + * @param internalDbDirectory directory of the internal db * @return the new fresh root context of the internal db */ - public static TopiaContext newInternalDb(EchoBaseConfiguration configuration) { + public static TopiaContext newInternalDb(File internalDbDirectory) { - Properties result = loadInternalDbconfiguration(configuration); + Properties result = loadInternalDbconfiguration(internalDbDirectory); return newDb(result); } - protected static void loadProperties(Properties result, String path, String entities) { + protected static void loadProperties(Properties result, + String path, + String entities) { URL dbConfigFile = EchobaseTopiaContexts.class.getResource(path); Modified: trunk/echobase-domain/src/main/resources/META-INF/services/org.nuiton.util.ApplicationConfigProvider =================================================================== --- trunk/echobase-domain/src/main/resources/META-INF/services/org.nuiton.util.ApplicationConfigProvider 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/resources/META-INF/services/org.nuiton.util.ApplicationConfigProvider 2012-09-02 23:42:15 UTC (rev 592) @@ -1 +1 @@ -fr.ifremer.echobase.EchobaseApplicationConfigProvider \ No newline at end of file +fr.ifremer.echobase.EchoBaseApplicationConfigProvider \ No newline at end of file Modified: trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties =================================================================== --- trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties 2012-09-02 23:42:15 UTC (rev 592) @@ -53,7 +53,9 @@ echobase.config.csv.separator.description= echobase.config.data.directory.description= echobase.config.embedded.description= +echobase.config.h2Version.description= echobase.config.internal.db.directory.description= +echobase.config.postgresqlVersion.description= echobase.config.version.description= echobase.config.war.directory.description= echobase.config.war.location.description= Modified: trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties =================================================================== --- trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties 2012-09-02 23:42:15 UTC (rev 592) @@ -53,7 +53,9 @@ echobase.config.csv.separator.description= echobase.config.data.directory.description=Répertoire des données de l'application echobase.config.embedded.description= -echobase.config.internal.db.directory.description=Répertoire de la base interna +echobase.config.h2Version.description=Version du pilote jdbc H2 +echobase.config.internal.db.directory.description=Répertoire de la base interne +echobase.config.postgresqlVersion.description=Version du pilote jdbc Postgresql echobase.config.version.description=Version de l'application echobase.config.war.directory.description=Répertoire où sont accessibles les wars echobase.config.war.location.description=chemin d'accèss au war embarqué à utiliser pour créer des applications embarquées Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/embeddedapplication/EmbeddedApplicationService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/embeddedapplication/EmbeddedApplicationService.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/embeddedapplication/EmbeddedApplicationService.java 2012-09-02 23:42:15 UTC (rev 592) @@ -26,10 +26,12 @@ import com.google.common.base.Charsets; import com.google.common.base.Preconditions; import fr.ifremer.echobase.EchoBaseTechnicalException; +import fr.ifremer.echobase.entities.DriverType; import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.entities.ExportQuery; +import fr.ifremer.echobase.entities.WorkingDbConfiguration; import fr.ifremer.echobase.io.EchoBaseIOUtil; -import fr.ifremer.echobase.entities.DriverType; +import fr.ifremer.echobase.persistence.EchoBaseEntityHelper; import fr.ifremer.echobase.persistence.EchobaseTopiaContexts; import fr.ifremer.echobase.persistence.JdbcConfiguration; import fr.ifremer.echobase.services.DefaultEchoBaseServiceContext; @@ -42,6 +44,8 @@ import fr.ifremer.echobase.services.exportquery.ExportQueryService; import fr.ifremer.echobase.services.importdb.ImportDbConfiguration; import fr.ifremer.echobase.services.importdb.ImportDbService; +import fr.ifremer.echobase.services.workingDb.WorkingDbConfigurationAlreadyExistException; +import fr.ifremer.echobase.services.workingDb.WorkingDbConfigurationService; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -101,44 +105,38 @@ model.incrementsProgression(); - //FIXME Review this to works with internal and working db... - // create h2 db in /db - JdbcConfiguration dbConf = JdbcConfiguration.newEmbeddedConfig(dir); - TopiaContext rootContext = - EchobaseTopiaContexts.newWorkingDb(dbConf); + // create new service context + EchoBaseServiceContext newServiceContext = + DefaultEchoBaseServiceContext.newContext(serviceContext, + null, + null); - TopiaContext topiaContext = null; + EchoBaseUser admin; try { + admin = importInternalDb(model, dir, newServiceContext); + } catch (Exception e) { + throw new EchoBaseTechnicalException( + "Could not create internal db", e); + } - topiaContext = rootContext.beginTransaction(); + // create working db in /db + JdbcConfiguration dbConf = JdbcConfiguration.newEmbeddedConfig(dir); + TopiaContext rootContext = EchobaseTopiaContexts.newWorkingDb(dbConf); + try { + newServiceContext.setTransaction(rootContext.beginTransaction()); model.incrementsProgression(); - // create new service context (with new transaction) - EchoBaseServiceContext newServiceContext = - DefaultEchoBaseServiceContext.newContext(serviceContext, - null, - topiaContext); - - EchoBaseUser admin = createUsers(newServiceContext); - - model.incrementsProgression(); - - copyExportQueries(newServiceContext, admin); - - model.incrementsProgression(); - importDb(model, newServiceContext, exportZipFile, admin); } catch (Exception eee) { rollbackTransaction( - topiaContext, + newServiceContext.getTransaction(), "Could not rollback h2 embedded database at " + dir); throw new EchoBaseTechnicalException( "Could not create h2 embedded database at " + dir, eee); } finally { - closeContext(rootContext, - "Could not close h2 embedded database at " + dir); + EchoBaseEntityHelper.releaseRootContext(rootContext); } try { @@ -151,6 +149,86 @@ return zipFile; } + protected EchoBaseUser importInternalDb(EmbeddedApplicationConfiguration model, + File dir, + EchoBaseServiceContext newServiceContext) throws TopiaException, ExportQueryNameAlreadyExistException, WorkingDbConfigurationAlreadyExistException { + + File internalDir = new File(dir, "internaldb"); + + TopiaContext internalRootContext = + EchobaseTopiaContexts.newInternalDb(internalDir); + + newServiceContext.setInternalTransaction( + internalRootContext.beginTransaction()); + + + try { + // get user service from h2 db + UserService userService = newServiceContext.getService(UserService.class); + + // create admin user + userService.createDefaultUsers(); + + // get admin from h2 db + EchoBaseUser admin = userService.getUserByEmail( + UserService.DEFAULT_ADMIN_EMAIL); + + model.incrementsProgression(); + + // get all export queries from application + List<ExportQuery> queries = getEntities(ExportQuery.class); + + // replicate queries + getInternalTransaction().replicateEntities( + newServiceContext.getInternalTransaction(), queries); + + // create export sql service from h2 db + ExportQueryService exportQueryService = + newServiceContext.getService(ExportQueryService.class); + + // get all queries from h2 db + queries = exportQueryService.getEntities(ExportQuery.class); + + // attach them to default created admin user in the db + for (ExportQuery query : queries) { + exportQueryService.createOrUpdate(query, admin); + } + + model.incrementsProgression(); + + // get all working db configuration from application + WorkingDbConfigurationService workingDbConfigurationService = + newServiceContext.getService(WorkingDbConfigurationService.class); + + List<WorkingDbConfiguration> confs = + getEntities(WorkingDbConfiguration.class); + + // replicate configs + getInternalTransaction().replicateEntities( + newServiceContext.getInternalTransaction(), confs); + + // add a new configuration to the embedded working db + WorkingDbConfiguration conf = + workingDbConfigurationService.newConfiguration(); + conf.setDriverType(DriverType.H2); + conf.setLogin("sa"); + conf.setDescription("Embedded working db"); + conf.setUrl("jdbc:h2:file:${echobase.data.directory}/db/echobase;CACHE_SIZE=65536;AUTO_SERVER=TRUE"); + + workingDbConfigurationService.create(conf); + + model.incrementsProgression(); + + return admin; + + } finally { + newServiceContext.setInternalTransaction(null); + EchoBaseEntityHelper.releaseRootContext(internalRootContext); + } + + + } + protected void closeContext(TopiaContext tx, String message) { try { tx.closeContext(); @@ -180,7 +258,7 @@ } protected int computeNbSteps(EmbeddedApplicationConfiguration model) { - int nbSteps = 4; + int nbSteps = 5; // export db steps @@ -206,21 +284,22 @@ copyEmbeddedFiles(dir); // copy war to / - FileUtils.copyFile(warLocation, new File(dir, warLocation.getName())); + FileUtils.copyFile(warLocation, + new File(dir, warLocation.getName())); } catch (Exception eee) { - throw new EchoBaseTechnicalException("Could not create embedded zip structure at " + dir, eee); + throw new EchoBaseTechnicalException( + "Could not create embedded zip structure at " + dir, eee); } } - protected File exportDb(EmbeddedApplicationConfiguration model, - File tempDirectory) { + protected File exportDb(EmbeddedApplicationConfiguration model, File dir) { try { // create export zip file ExportDbConfiguration exportconfiguration = new ExportDbConfiguration(model); exportconfiguration.setFileName("echobase-export"); - File exportTempDir = new File(tempDirectory, "exportDb"); + File exportTempDir = new File(dir, "exportDb"); exportconfiguration.setWorkingDirectory(exportTempDir); exportconfiguration.setVoyageIds(model.getVoyageIds()); TopiaContext transaction = serviceContext.getTransaction(); @@ -257,21 +336,11 @@ } } - public File getPilotsDirectory(File dataDirectory) { - File driverDir = new File(dataDirectory, "drivers"); - return driverDir; - } - -// public String getH2PilotFilename(Properties config) { -// String h2Version = config.getProperty("h2Version"); -// return h2Version == null ? null : "h2-" + h2Version + ".jar"; +// public File getPilotsDirectory(File dataDirectory) { +// File driverDir = new File(dataDirectory, "drivers"); +// return driverDir; // } -// public String getPostgresqlPilotFilename(Properties config) { -// String pgVersion = config.getProperty("postgresqlVersion"); -// return pgVersion == null ? null : "postgresql-" + pgVersion + ".jar"; -// } - protected void copyEmbeddedFiles(File zipDirectory) throws IOException, URISyntaxException { // config to keep the echobase-embedded values (contains h2 and pg versions) @@ -282,15 +351,15 @@ copyEmbeddedFiles("startEchobase.sh", zipDirectory, null); copyEmbeddedFiles("README.txt", zipDirectory, null); - File driverDir = getPilotsDirectory(zipDirectory); - FileUtil.createDirectoryIfNecessary(driverDir); - copyEmbeddedFiles(DriverType.H2.getPilotFileName(config), driverDir, null); - copyEmbeddedFiles(DriverType.POSTGRESQL.getPilotFileName(config), driverDir, null); +// File driverDir = getPilotsDirectory(zipDirectory); +// FileUtil.createDirectoryIfNecessary(driverDir); +// copyEmbeddedFiles(DriverType.H2.getPilotFileName(getConfiguration()), driverDir, null); +// copyEmbeddedFiles(DriverType.POSTGRESQL.getPilotFileName(getConfiguration()), driverDir, null); } - protected void copyEmbeddedFiles(String resourceName, - File zipDirectory, - Properties config) throws IOException { + public void copyEmbeddedFiles(String resourceName, + File targetDirectory, + Properties config) throws IOException { String resourcePath = EMBEDDED_PATH + resourceName; InputStream inputStream = getClass().getResourceAsStream(resourcePath); Preconditions.checkNotNull(inputStream, @@ -299,7 +368,7 @@ if (config != null) { config.load(inputStream); } - File outputFile = new File(zipDirectory, resourceName); + File outputFile = new File(targetDirectory, resourceName); if (log.isInfoEnabled()) { log.info("Copy configuration to " + resourceName + " to " + outputFile); } @@ -319,44 +388,6 @@ } } - protected EchoBaseUser createUsers(EchoBaseServiceContext newServiceContext) { - - // get user service from h2 db - UserService userService = - newServiceContext.getService(UserService.class); - - // create admin user - userService.createDefaultUsers(); - - // get admin from h2 db - EchoBaseUser admin = userService.getUserByEmail( - UserService.DEFAULT_ADMIN_EMAIL); - return admin; - } - - protected void copyExportQueries(EchoBaseServiceContext newServiceContext, - EchoBaseUser admin) throws TopiaException, ExportQueryNameAlreadyExistException { - - // get all export queries from application - List<ExportQuery> queries = getEntities(ExportQuery.class); - - // replicate queries - getTransaction().replicateEntities( - newServiceContext.getTransaction(), queries); - - // create export sql service from h2 db - ExportQueryService exportQueryService = - newServiceContext.getService(ExportQueryService.class); - - // get all queries from h2 db - queries = exportQueryService.getEntities(ExportQuery.class); - - // attach them to default created admin user in the db - for (ExportQuery query : queries) { - exportQueryService.createOrUpdate(query, admin); - } - } - protected void importDb(EmbeddedApplicationConfiguration model, EchoBaseServiceContext newServiceContext, File exportZipFile, Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/workingDb/WorkingDbConfigurationService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/workingDb/WorkingDbConfigurationService.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/workingDb/WorkingDbConfigurationService.java 2012-09-02 23:42:15 UTC (rev 592) @@ -23,13 +23,13 @@ * #L% */ -import com.google.common.base.Preconditions; import fr.ifremer.echobase.EchoBaseTechnicalException; import fr.ifremer.echobase.entities.WorkingDbConfiguration; import fr.ifremer.echobase.entities.WorkingDbConfigurationDAO; import fr.ifremer.echobase.services.EchoBaseServiceSupport; import org.nuiton.topia.TopiaException; +import java.io.File; import java.util.List; /** @@ -49,16 +49,6 @@ } } - public WorkingDbConfiguration getConfigurationByUrl(String url) { - Preconditions.checkNotNull(url); - try { - WorkingDbConfiguration result = getDAO().findByUrl(url); - return result; - } catch (TopiaException eee) { - throw new EchoBaseTechnicalException(eee); - } - } - public WorkingDbConfiguration getEditableConf(String id) throws WorkingDbConfigurationNotFoundException { WorkingDbConfiguration entity = getExistingConf(id); WorkingDbConfiguration result = newConfiguration(); @@ -66,7 +56,14 @@ result.setDescription(entity.getDescription()); result.setDriverType(entity.getDriverType()); result.setLogin(entity.getLogin()); - result.setUrl(entity.getUrl()); + String url = entity.getUrl(); + + if (url.contains("${echobase.data.directory}")) { + File dataDirectory = getConfiguration().getDataDirectory(); + url = url.replace("${echobase.data.directory}", + dataDirectory.getAbsolutePath()); + } + result.setUrl(url); return result; } @@ -98,7 +95,6 @@ } } - public WorkingDbConfiguration newConfiguration() { try { return getDAO().newInstance(); Modified: trunk/echobase-services/src/main/resources/embedded/echobase.properties =================================================================== --- trunk/echobase-services/src/main/resources/embedded/echobase.properties 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-services/src/main/resources/embedded/echobase.properties 2012-09-02 23:42:15 UTC (rev 592) @@ -22,22 +22,8 @@ # #L% ### -# Postgresql pilot version -postgresqlVersion=${postgresqlVersion} - -# H2 pilot version -h2Version=${h2Version} - # Where to find data -data.directory=. +echobase.data.directory=. # where to find war -war.directory=${echobase.data.directory} - -#FIXME use instead an working db configuration -# Database configuration -#hibernate.dialect=org.hibernate.dialect.H2Dialect -#hibernate.connection.driver_class=org.h2.Driver -#hibernate.connection.username=sa -#hibernate.connection.password=sa -#hibernate.connection.url=jdbc:h2:file:${data.directory}/db/echobase;CACHE_SIZE=65536;AUTO_SERVER=TRUE +echobase.war.directory=${echobase.data.directory} Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/EchoBaseApplicationListener.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/EchoBaseApplicationListener.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/EchoBaseApplicationListener.java 2012-09-02 23:42:15 UTC (rev 592) @@ -25,6 +25,7 @@ import com.google.common.base.Preconditions; import fr.ifremer.echobase.EchoBaseConfiguration; +import fr.ifremer.echobase.entities.DriverType; import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.persistence.EchoBaseDbMeta; import fr.ifremer.echobase.persistence.EchoBaseEntityHelper; @@ -32,6 +33,7 @@ import fr.ifremer.echobase.services.DefaultEchoBaseServiceContext; import fr.ifremer.echobase.services.EchoBaseServiceContext; import fr.ifremer.echobase.services.UserService; +import fr.ifremer.echobase.services.embeddedapplication.EmbeddedApplicationService; import fr.ird.converter.FloatConverter; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; @@ -48,6 +50,8 @@ import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import java.io.File; +import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Locale; @@ -95,7 +99,8 @@ // initialize internal root context TopiaContext internalRootContext = - EchobaseTopiaContexts.newInternalDb(configuration); + EchobaseTopiaContexts.newInternalDb( + configuration.getInternalDbDirectory()); // initialize application context EchoBaseApplicationContext applicationContext = @@ -107,12 +112,28 @@ applicationContext.setDbMeta(EchoBaseDbMeta.newDbMeta()); applicationContext.setInternalRootContext(internalRootContext); + EchoBaseServiceContext serviceContext = + DefaultEchoBaseServiceContext.newContext( + Locale.getDefault(), + null, + null, + configuration, + applicationContext.getDbMeta() + ); + // init database (and create minimal admin user if required) try { - initInternalDatabase(applicationContext); + initInternalDatabase(applicationContext, serviceContext); } catch (TopiaException e) { throw new TopiaRuntimeException("Could not init internal db", e); } + + // copy drivers if required + try { + copyDriverFiles(serviceContext); + } catch (IOException e) { + throw new TopiaRuntimeException("Could not install drivers", e); + } } @Override @@ -158,7 +179,8 @@ * * @param context application context where to store global internal db root context */ - protected void initInternalDatabase(EchoBaseApplicationContext context) throws TopiaException { + protected void initInternalDatabase(EchoBaseApplicationContext context, + EchoBaseServiceContext serviceContext) throws TopiaException { Preconditions.checkNotNull(context); @@ -190,14 +212,8 @@ TopiaContext tx = rootContext.beginTransaction(); try { - EchoBaseServiceContext serviceContext = - DefaultEchoBaseServiceContext.newContext( - Locale.getDefault(), - tx, - null, - configuration, - dbMeta - ); + serviceContext.setInternalTransaction(tx); + UserService service = serviceContext.getService(UserService.class); List<EchoBaseUser> users = service.getUsers(); @@ -213,7 +229,29 @@ service.createDefaultUsers(); } } finally { + serviceContext.setInternalTransaction(null); EchoBaseEntityHelper.closeConnection(tx); } } + + protected void copyDriverFiles(EchoBaseServiceContext serviceContext) throws IOException { + EmbeddedApplicationService service = + serviceContext.getService(EmbeddedApplicationService.class); + EchoBaseConfiguration configuration = serviceContext.getConfiguration(); + File libDirectory = configuration.getLibDirectory(); + for (DriverType driverType : DriverType.values()) { + String pilotFileName = driverType.getPilotFileName(configuration); + File pilotFile = new File(libDirectory, pilotFileName); + if (!pilotFile.exists()) { + + // copy it from class-path + if (log.isInfoEnabled()) { + log.info("Copy driver " + pilotFileName + + " to directory " + libDirectory); + } + service.copyEmbeddedFiles( + pilotFileName, libDirectory, null); + } + } + } } Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/Information.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/Information.java 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/Information.java 2012-09-02 23:42:15 UTC (rev 592) @@ -25,12 +25,9 @@ import fr.ifremer.echobase.EchoBaseConfiguration; import fr.ifremer.echobase.persistence.JdbcConfiguration; -import fr.ifremer.echobase.services.embeddedapplication.EmbeddedApplicationService; import fr.ifremer.echobase.ui.actions.EchoBaseActionSupport; -import org.apache.commons.lang3.StringUtils; import java.io.File; -import java.util.Properties; /** * Display a page to show connection details. @@ -62,18 +59,11 @@ dbConfiguration = getEchoBaseSession().getWorkingDbConfiguration(); - Properties properties = configuration.getProperties(); - String pilotName = - dbConfiguration.getDriverType().getPilotFileName(properties); + dbConfiguration.getDriverType().getPilotFileName(configuration); - if (StringUtils.isNotEmpty(pilotName)) { - EmbeddedApplicationService service = - getService(EmbeddedApplicationService.class); - File driverDirectory = service.getPilotsDirectory( - configuration.getDataDirectory()); - jdbcPilot = new File(driverDirectory, pilotName); - } + jdbcPilot = new File(configuration.getLibDirectory(), pilotName); + return SUCCESS; } } Modified: trunk/echobase-ui/src/main/resources/echobase.properties =================================================================== --- trunk/echobase-ui/src/main/resources/echobase.properties 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-ui/src/main/resources/echobase.properties 2012-09-02 23:42:15 UTC (rev 592) @@ -22,5 +22,11 @@ # #L% ### +#Project version echobase.version=${project.version} -echobase.site.url=${project.url} + +# Postgresql pilot version +echobase.postgresqlVersion=${postgresqlVersion} + +# H2 pilot version +echobase.h2Version=${h2Version} Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/information.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/information.jsp 2012-09-02 16:38:43 UTC (rev 591) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/information.jsp 2012-09-02 23:42:15 UTC (rev 592) @@ -36,12 +36,10 @@ label='%{getText("echobase.common.jdbcLogin")}'/> <s:label key="dbConfiguration.password" label='%{getText("echobase.common.jdbcPassword")}'/> - <s:label key="dbConfiguration.driver.name" + <s:label key="dbConfiguration.driverType.driverClass.name" label='%{getText("echobase.common.jdbcDriver")}'/> - <s:if test="jdbcPilot != null"> - <s:label key="jdbcPilot" - label='%{getText("echobase.common.jdbcPilotPath")}'/> - </s:if> + <s:label key="jdbcPilot" + label='%{getText("echobase.common.jdbcPilotPath")}'/> </fieldset>