Author: tchemit Date: 2012-03-19 17:46:45 +0100 (Mon, 19 Mar 2012) New Revision: 376 Url: http://forge.codelutin.com/repositories/revision/echobase/376 Log: improve code for embedded create application + improve logs of impot db Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/EmbeddedApplicationService.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ImportDbService.java trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/EmbeddedApplicationService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/EmbeddedApplicationService.java 2012-03-19 16:42:51 UTC (rev 375) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/EmbeddedApplicationService.java 2012-03-19 16:46:45 UTC (rev 376) @@ -29,6 +29,7 @@ import fr.ifremer.echobase.EchoBaseTechnicalException; import fr.ifremer.echobase.EchoBaseTopiaRootContextFactory; import fr.ifremer.echobase.entities.EchoBaseUser; +import fr.ifremer.echobase.entities.EntitiesUtil; import fr.ifremer.echobase.entities.ExportQuery; import fr.ifremer.echobase.services.configurations.EmbeddedApplicationConfiguration; import fr.ifremer.echobase.services.configurations.ExportDbConfiguration; @@ -90,67 +91,130 @@ public File createEmbeddedApplication(EmbeddedApplicationConfiguration model) { - File warLocation = model.getWarLocation(); + int nbSteps = computeNbSteps(model); + model.setNbSteps(nbSteps); String fileName = model.getFileName(); - model.setNbSteps(5); - File tempDirectory = model.getWorkingDirectory(); + tempDirectory.deleteOnExit(); File zipFile = new File(tempDirectory, fileName + ".zip"); + model.setEmbeddedApplicationFile(zipFile); - tempDirectory.deleteOnExit(); - File dir = new File(tempDirectory, fileName); - model.setEmbeddedApplicationFile(zipFile); - if (log.isInfoEnabled()) { log.info("Creates embedded application to file [" + zipFile + "]"); } + + // export db to csv + File exportZipFile = exportDb(model, tempDirectory); + + // create static archive structure + createStaticArchiveStructure(model, dir); + + model.incrementsProgression(); + + // create h2 db in /db + TopiaContext rootContext = + new EchoBaseTopiaRootContextFactory().newEmbeddedDatabase(dir); + try { + + TopiaContext topiaContext = rootContext.beginTransaction(); + + model.incrementsProgression(); + + // create new service context (with new transaction) + EchoBaseServiceContext newServiceContext = + DefaultEchoBaseServiceContext.newContext(serviceContext, + topiaContext); + + EchoBaseUser admin = createUsers(newServiceContext); + + model.incrementsProgression(); + + copyExportQueries(newServiceContext, admin); + + model.incrementsProgression(); + + importDb(model, newServiceContext, exportZipFile, admin); + + } catch (Exception eee) { + throw new EchoBaseTechnicalException("Could not create h2 embedded database at "+dir,eee); + } finally { + try { + rootContext.closeContext(); + } catch (TopiaException eee) { + throw new EchoBaseTechnicalException("Could not close h2 embedded database at "+dir,eee); + } + } + + EchoBaseIOUtil.compressZipFile(zipFile, dir); + return zipFile; + } + + protected int computeNbSteps(EmbeddedApplicationConfiguration model) { + int nbSteps = 4; + + // export db steps + + nbSteps += EntitiesUtil.getReferenceEntries(getDbMeta()).length; + if (model.getVoyageIds() != null) { + nbSteps += model.getVoyageIds().length; + } + + // import db stesp + nbSteps += EntitiesUtil.getEntries(getDbMeta()).length; + return nbSteps; + } + + protected void createStaticArchiveStructure(EmbeddedApplicationConfiguration model, File dir) { + + + try { + File warLocation = model.getWarLocation(); + // create / FileUtil.createDirectoryIfNecessary(dir); // copy embedded files to / copyEmbeddedFiles(model, dir); - model.incrementsProgression(); - // copy war to / FileUtil.copy(warLocation, new File(dir, warLocation.getName())); + } catch (Exception eee) { + throw new EchoBaseTechnicalException("Could not create embedded zip structure at " + dir, eee); + } + } + protected File exportDb(EmbeddedApplicationConfiguration model, + File tempDirectory) { + + try { // create export zip file - File exportZipFile = exportDb(model, tempDirectory); + ExportDbConfiguration exportconfiguration = + new ExportDbConfiguration(model); + exportconfiguration.setFileName("echobase-export"); + File exportTempDir = new File(tempDirectory, "exportDb"); + exportconfiguration.setWorkingDirectory(exportTempDir); + exportconfiguration.setVoyageIds(model.getVoyageIds()); + ExportDbService exportDbService = + serviceContext.newService(ExportDbService.class); + exportDbService.exportPartialDb(exportconfiguration, false); + File exportZipFile = exportconfiguration.getExportFile(); if (log.isInfoEnabled()) { log.info("Export zip file = " + exportZipFile); } - - // create h2 db in /db - createH2Batabase(model, dir, true, exportZipFile); - - } catch (Exception eee) { + return exportZipFile; + } catch (IOException eee) { throw new EchoBaseTechnicalException( - "Could not create zip structure at location " + - dir, eee); + "Could not export db to zip", eee); } - EchoBaseIOUtil.compressZipFile(zipFile, dir); - return zipFile; - } - protected File exportDb(EmbeddedApplicationConfiguration model, - File tempDirectory) throws IOException { - ExportDbConfiguration exportconfiguration = new ExportDbConfiguration(model); - exportconfiguration.setFileName("echobase-export"); - exportconfiguration.setWorkingDirectory(new File(tempDirectory, "exportDb")); - exportconfiguration.setVoyageIds(model.getVoyageIds()); - - ExportDbService exportDbService = serviceContext.newService(ExportDbService.class); - exportDbService.exportPartialDb(exportconfiguration, false); - return exportconfiguration.getExportFile(); } protected void copyEmbeddedFiles(EmbeddedApplicationConfiguration model, @@ -161,8 +225,6 @@ String in = startFile.getInputFileName(); String out = startFile.getOutputFileName(); - model.incrementsProgression(); - InputStream inputStream = getClass().getResourceAsStream(EMBEDDED_PATH + in); try { @@ -171,7 +233,8 @@ if (log.isInfoEnabled()) { log.info("Copy configuration to " + in + " to " + outputFile); } - OutputStreamWriter outputStream = new OutputStreamWriter(new FileOutputStream(outputFile), Charsets.UTF_8); + OutputStreamWriter outputStream = new OutputStreamWriter( + new FileOutputStream(outputFile), Charsets.UTF_8); try { IOUtils.copy(inputStream, outputStream); } finally { @@ -183,91 +246,56 @@ } } - protected TopiaContext createH2Batabase(EmbeddedApplicationConfiguration model, - File zipDirectory, - boolean closeRootContext, - File exportZipFile - ) throws IOException, TopiaException, ExportQueryNameAlreadyExistException { + protected EchoBaseUser createUsers(EchoBaseServiceContext newServiceContext) { - model.incrementsProgression(); + // get user service from h2 db + UserService userService = + newServiceContext.newService(UserService.class); - // create new h2 db - TopiaContext rootContext = - new EchoBaseTopiaRootContextFactory().newEmbeddedDatabase(zipDirectory); + // create admin user + userService.createDefaultUsers(); - TopiaContext topiaContext = rootContext.beginTransaction(); - try { + // get admin from h2 db + EchoBaseUser admin = userService.getUserByEmail( + UserService.DEFAULT_ADMIN_EMAIL); + return admin; + } - model.incrementsProgression(); + protected void copyExportQueries(EchoBaseServiceContext newServiceContext, + EchoBaseUser admin) throws TopiaException, ExportQueryNameAlreadyExistException { - // create new service context (with new transaction) - EchoBaseServiceContext newServiceContext = - DefaultEchoBaseServiceContext.newContext(serviceContext, - topiaContext); + // get all export queries from application + List<ExportQuery> queries = getEntities(ExportQuery.class); - // get user service from h2 db - UserService userService = - newServiceContext.newService(UserService.class); + // replicate queries + getTransaction().replicateEntities( + newServiceContext.getTransaction(), queries); - // create admin user - userService.createDefaultUsers(); + // create export sql service from h2 db + ExportQueryService exportQueryService = + newServiceContext.newService(ExportQueryService.class); - // get admin from h2 db - EchoBaseUser admin = userService.getUserByEmail( - UserService.DEFAULT_ADMIN_EMAIL); + // get all queries from h2 db + queries = exportQueryService.getEntities(ExportQuery.class); - model.incrementsProgression(); - - // get export query service - ExportQueryService exportQueryService = - getService(ExportQueryService.class); - - // get all export queries from application - List<ExportQuery> queries = - exportQueryService.getEntities(ExportQuery.class); - - // remove link to application user - for (ExportQuery query : queries) { - query.setLastModifiedUser(null); - } - - // replicate queries - getTransaction().replicateEntities(topiaContext, queries); - - // create export sql service from h2 db - exportQueryService = - newServiceContext.newService(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(); - - importDb(model, newServiceContext, exportZipFile, admin); - - } finally { - if (closeRootContext) { - rootContext.closeContext(); - } + // attach them to default created admin user in the db + for (ExportQuery query : queries) { + exportQueryService.createOrUpdate(query, admin); } - return rootContext; } protected void importDb(EmbeddedApplicationConfiguration model, EchoBaseServiceContext newServiceContext, File exportZipFile, EchoBaseUser admin) throws IOException, TopiaException { - ImportDbConfiguration importConfiguration = new ImportDbConfiguration(model, getLocale()); + ImportDbConfiguration importConfiguration = + new ImportDbConfiguration(model, getLocale()); importConfiguration.getInput().setFile(exportZipFile); - importConfiguration.setWorkingDirectory(new File(model.getWorkingDirectory(), "importDb")); + File importTempDir = new File(model.getWorkingDirectory(), "importDb"); + importConfiguration.setWorkingDirectory(importTempDir); - ImportDbService importDbService = newServiceContext.newService(ImportDbService.class); - + ImportDbService importDbService = + newServiceContext.newService(ImportDbService.class); importDbService.importDb(importConfiguration, admin, false); } Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ImportDbService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ImportDbService.java 2012-03-19 16:42:51 UTC (rev 375) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ImportDbService.java 2012-03-19 16:46:45 UTC (rev 376) @@ -39,7 +39,6 @@ import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.util.StringUtil; import org.nuiton.util.TimeLog; import org.nuiton.util.csv.Import; import org.nuiton.util.csv.ImportModel; @@ -86,14 +85,26 @@ ZipFile zipFile = new ZipFile(file); try { + List<String> missingEntries = Lists.newArrayList(); + Map<MetaFilenameAware, ZipEntry> entriestoConsume = discoverEntries( - file, zipFile); + file, zipFile, missingEntries); if (computeSteps) { int size = entriestoConsume.size(); - model.setNbSteps(size + 1); + model.setNbSteps(size + missingEntries.size() + 1); } + for (String missingEntry : missingEntries) { + + // skip thoses not found entries + model.incrementsProgression(); + + if (log.isInfoEnabled()) { + log.info("Skip not found entry " + missingEntry); + } + } + // consume all found entries for (Map.Entry<MetaFilenameAware, ZipEntry> entry : entriestoConsume.entrySet()) { @@ -137,10 +148,9 @@ } protected Map<MetaFilenameAware, ZipEntry> discoverEntries(File file, - ZipFile zipFile) { + ZipFile zipFile, + List<String> missingEntries) { - List<String> missingEntries = Lists.newArrayList(); - Map<MetaFilenameAware, ZipEntry> result = Maps.newLinkedHashMap(); @@ -157,10 +167,10 @@ result.put(entry, zipEntry); } } - if (!missingEntries.isEmpty() && log.isWarnEnabled()) { - log.warn("There is " + missingEntries.size() + " missing files " + - " in import " + file + "\n" + StringUtil.join(missingEntries, "\n", false)); - } +// if (!missingEntries.isEmpty() && log.isWarnEnabled()) { +// log.warn("There is " + missingEntries.size() + " missing files " + +// " in import " + file + "\n" + StringUtil.join(missingEntries, "\n", false)); +// } return result; } Modified: trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java =================================================================== --- trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java 2012-03-19 16:42:51 UTC (rev 375) +++ trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java 2012-03-19 16:46:45 UTC (rev 376) @@ -62,5 +62,8 @@ File zipFile = service.createEmbeddedApplication(conf); Assert.assertTrue(zipFile.exists()); + Assert.assertEquals(100f, conf.getProgression(), 1); + + // TODO Test that embedded db has exactly same number of data than in incoming db } }