Author: tchemit Date: 2012-09-03 16:54:12 +0200 (Mon, 03 Sep 2012) New Revision: 602 Url: http://forge.codelutin.com/repositories/revision/echobase/602 Log: fixes #1453: Jdbc drivers in embedded applications are corrupted refs #1438: Choix d'une base de travail (creation application embarquee) Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/services/DefaultEchoBaseServiceContext.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/embeddedapplication/EmbeddedApplicationService.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/EchoBaseApplicationListener.java Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/services/DefaultEchoBaseServiceContext.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/services/DefaultEchoBaseServiceContext.java 2012-09-03 14:46:19 UTC (rev 601) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/services/DefaultEchoBaseServiceContext.java 2012-09-03 14:54:12 UTC (rev 602) @@ -56,18 +56,6 @@ protected EchoBaseDbMeta dbMeta; public static EchoBaseServiceContext newContext( - EchoBaseServiceContext serviceContext, - TopiaContext internalTransaction, - TopiaContext transaction) { - return newContext(serviceContext.getLocale(), - internalTransaction, - transaction, - serviceContext.getConfiguration(), - serviceContext.getDbMeta() - ); - } - - public static EchoBaseServiceContext newContext( Locale locale, TopiaContext internalTransaction, TopiaContext transaction, 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-03 14:46:19 UTC (rev 601) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/embeddedapplication/EmbeddedApplicationService.java 2012-09-03 14:54:12 UTC (rev 602) @@ -58,6 +58,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URISyntaxException; import java.util.List; @@ -107,9 +108,12 @@ // create new service context EchoBaseServiceContext newServiceContext = - DefaultEchoBaseServiceContext.newContext(serviceContext, - null, - null); + DefaultEchoBaseServiceContext.newContext( + getLocale(), + null, + null, + getConfiguration(), + getDbMeta()); EchoBaseUser admin; try { @@ -120,23 +124,13 @@ } // create working db in /db - JdbcConfiguration dbConf = JdbcConfiguration.newEmbeddedConfig(dir); - TopiaContext rootContext = EchobaseTopiaContexts.newWorkingDb(dbConf); try { + importWorkingDb(model, dir, exportZipFile, newServiceContext, admin); - newServiceContext.setTransaction(rootContext.beginTransaction()); - model.incrementsProgression(); + } catch (Exception eee) { - importDb(model, newServiceContext, exportZipFile, admin); - - } catch (Exception eee) { - rollbackTransaction( - newServiceContext.getTransaction(), - "Could not rollback h2 embedded database at " + dir); throw new EchoBaseTechnicalException( - "Could not create h2 embedded database at " + dir, eee); - } finally { - EchoBaseEntityHelper.releaseRootContext(rootContext); + "Could not create h2 working database at " + dir, eee); } try { @@ -225,8 +219,43 @@ newServiceContext.setInternalTransaction(null); EchoBaseEntityHelper.releaseRootContext(internalRootContext); } + } + protected void importWorkingDb(EmbeddedApplicationConfiguration model, + File dir, + File exportZipFile, + EchoBaseServiceContext newServiceContext, + EchoBaseUser admin) throws IOException, TopiaException { + JdbcConfiguration dbConf = JdbcConfiguration.newEmbeddedConfig(dir); + TopiaContext rootContext = EchobaseTopiaContexts.newWorkingDb(dbConf); + try { + // create db schema + rootContext.createSchema(); + + // inject a new transaction in service context + newServiceContext.setTransaction(rootContext.beginTransaction()); + + model.incrementsProgression(); + + // prepare import configuration + ImportDbConfiguration importConfiguration = + new ImportDbConfiguration(model, getLocale()); + importConfiguration.getInput().setFile(exportZipFile); + File importTempDir = new File(model.getWorkingDirectory(), "importDb"); + importConfiguration.setWorkingDirectory(importTempDir); + + // do import to embedded working db + newServiceContext.getService(ImportDbService.class).importDb( + importConfiguration, admin, false, true); + + } finally { + // remove current transaction + newServiceContext.setTransaction(null); + + // release any connexion to the working db + EchoBaseEntityHelper.releaseRootContext(rootContext); + } } protected void closeContext(TopiaContext tx, String message) { @@ -388,19 +417,44 @@ } } - protected void importDb(EmbeddedApplicationConfiguration model, - EchoBaseServiceContext newServiceContext, - File exportZipFile, - EchoBaseUser admin) throws IOException, TopiaException { - ImportDbConfiguration importConfiguration = - new ImportDbConfiguration(model, getLocale()); - importConfiguration.getInput().setFile(exportZipFile); - File importTempDir = new File(model.getWorkingDirectory(), "importDb"); - importConfiguration.setWorkingDirectory(importTempDir); - - ImportDbService importDbService = - newServiceContext.getService(ImportDbService.class); - importDbService.importDb(importConfiguration, admin, false, true); + public void copyEmbeddedBinaryFile(String resourceName, + File targetDirectory) throws IOException { + String resourcePath = EMBEDDED_PATH + resourceName; + InputStream inputStream = getClass().getResourceAsStream(resourcePath); + Preconditions.checkNotNull(inputStream, + "could not find resource " + resourcePath); + try { + File outputFile = new File(targetDirectory, resourceName); + if (log.isInfoEnabled()) { + log.info("Copy binary file from " + resourceName + " to " + + outputFile); + } + OutputStream outputStream = new FileOutputStream(outputFile); + try { + IOUtils.copy(inputStream, outputStream); + outputStream.close(); + } finally { + IOUtils.closeQuietly(outputStream); + } + inputStream.close(); + } finally { + IOUtils.closeQuietly(inputStream); + } } +// protected void importDb(EmbeddedApplicationConfiguration model, +// EchoBaseServiceContext newServiceContext, +// File exportZipFile, +// EchoBaseUser admin) throws IOException, TopiaException { +// ImportDbConfiguration importConfiguration = +// new ImportDbConfiguration(model, getLocale()); +// importConfiguration.getInput().setFile(exportZipFile); +// File importTempDir = new File(model.getWorkingDirectory(), "importDb"); +// importConfiguration.setWorkingDirectory(importTempDir); +// +// ImportDbService importDbService = +// newServiceContext.getService(ImportDbService.class); +// importDbService.importDb(importConfiguration, admin, false, true); +// } + } 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-03 14:46:19 UTC (rev 601) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/EchoBaseApplicationListener.java 2012-09-03 14:54:12 UTC (rev 602) @@ -249,8 +249,7 @@ log.info("Copy driver " + pilotFileName + " to directory " + libDirectory); } - service.copyEmbeddedFiles( - pilotFileName, libDirectory, null); + service.copyEmbeddedBinaryFile(pilotFileName, libDirectory); } } }