Author: tchemit Date: 2013-10-30 15:47:32 +0100 (Wed, 30 Oct 2013) New Revision: 1322 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1322 Log: fixes #3623: [TECH] Import de base : Structure autoris?\195?\169e pour le zip contenant la base ?\195?\160 importer Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiIOUtil.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiIOUtil.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiIOUtil.java 2013-10-30 10:49:27 UTC (rev 1321) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiIOUtil.java 2013-10-30 14:47:32 UTC (rev 1322) @@ -31,6 +31,7 @@ import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSelector; import org.apache.commons.vfs2.FileSystemManager; +import org.apache.commons.vfs2.FileType; import org.apache.commons.vfs2.VFS; import org.nuiton.util.ZipUtil; @@ -109,6 +110,15 @@ } } + + public static FileType getType(FileObject objectFile, String errorMessage) { + try { + return objectFile.getType(); + } catch (IOException e) { + throw new TuttiTechnicalException(errorMessage, e); + } + } + public static void explode(FileObject archiveFile, File target, FileSelector fileSelector, String errorMessage) { Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-10-30 10:49:27 UTC (rev 1321) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-10-30 14:47:32 UTC (rev 1322) @@ -72,7 +72,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.vfs2.AllFileSelector; +import org.apache.commons.vfs2.FileName; import org.apache.commons.vfs2.FileObject; +import org.apache.commons.vfs2.FileType; import org.nuiton.util.TimeLog; import org.nuiton.util.Version; @@ -269,8 +271,12 @@ } } + public static enum ImportStructureType { + NORMAL, // normal structure with a db directory + optional meas_file directory + INLINE + } - public void checkImportStructure(File file) { + public ImportStructureType checkImportStructure(File file) { if (!file.exists()) { throw new TuttiBusinessException(_("tutti.service.persistence.checkImportstructure.fileNotExist", file)); @@ -286,9 +292,48 @@ if (children.length != 1) { throw new TuttiBusinessException(_("tutti.service.persistence.checkImportstructure.tooManyChildren", file)); } + + ImportStructureType result; + fileObject = children[0]; - checkArchiveDb(file, fileObject, "db", true); - checkArchiveDb(file, fileObject, "meas_files", false); + children = TuttiIOUtil.getChildren(fileObject, _("tutti.service.persistence.openArchive.error", file)); + + // try to detect a db directory + boolean dbDirectoyDetected = false; + for (FileObject child : children) { + FileName name = child.getName(); + if (name.getBaseName().equals("db")) { + dbDirectoyDetected = true; + break; + } + } + + if (dbDirectoyDetected) { + + // NORMAL type (two directories) + result = ImportStructureType.NORMAL; + + checkArchiveDb(file, fileObject, "db", true); + checkArchiveDb(file, fileObject, "meas_files", false); + } else { + + // INLINE type + result = ImportStructureType.INLINE; + + // should have no directory + for (FileObject child : children) { + FileType type = TuttiIOUtil.getType(child, "Could not get type of " + child); + if (FileType.FOLDER.equals(type)) { + throw new TuttiBusinessException(_("tutti.service.persistence.checkImportstructure.inlineForbidDirectory")); + } + } + } + + if (log.isInfoEnabled()) { + log.info("Database import type: " + result); + } + + return result; } protected void checkArchiveDb(File file, @@ -312,10 +357,11 @@ /** * Import a db from a zip archive (including the attachments and protocols). * - * @param file archive file where to store + * @param importStructureType type of structure of import + * @param file archive file where to store * @since 1.0.2 */ - public void importDb(File file) { + public void importDb(ImportStructureType importStructureType, File file) { // can not do this operation on a opened db Preconditions.checkState(!isDbLoaded()); @@ -330,13 +376,32 @@ if (log.isInfoEnabled()) { log.info("Import db to " + target); } - FileObject fileObject = TuttiIOUtil.resolveFile("zip:" + file.getAbsolutePath(), - _("tutti.service.persistence.getArchive.error", file)); + FileObject fileObject = TuttiIOUtil.resolveFile( + "zip:" + file.getAbsolutePath(), + _("tutti.service.persistence.getArchive.error", file)); - FileObject[] children = TuttiIOUtil.getChildren(fileObject, _("tutti.service.persistence.openArchive.error", file)); + FileObject[] children = TuttiIOUtil.getChildren( + fileObject, + _("tutti.service.persistence.openArchive.error", file)); fileObject = children[0]; + switch (importStructureType) { + + case NORMAL: + // nothing special to do + break; + + case INLINE: + target = new File(target, "db"); + TuttiIOUtil.forceMkdir( + target, + _("tutti.service.persistence.createDbDirectory.error", file)); + + + break; + } + TuttiIOUtil.explode(fileObject, target, new AllFileSelector(), @@ -572,8 +637,8 @@ // driver.getImplementationName() + "* opened."); // } - TIME_LOG.log(t0,"Persistence driver *" + - driver.getImplementationName() + "* opened."); + TIME_LOG.log(t0, "Persistence driver *" + + driver.getImplementationName() + "* opened."); } @Override @@ -592,8 +657,8 @@ // driver.getImplementationName() + "* closed."); // } - TIME_LOG.log(t0,"Persistence driver *" + - driver.getImplementationName() + "* closed."); + TIME_LOG.log(t0, "Persistence driver *" + + driver.getImplementationName() + "* closed."); } //------------------------------------------------------------------------// Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-10-30 10:49:27 UTC (rev 1321) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-10-30 14:47:32 UTC (rev 1322) @@ -140,9 +140,11 @@ tutti.service.operations.exportCatchesReport.specialRows.inertAndLivinngNotItemized.name= tutti.service.persistence.checkArchiveDb.error= tutti.service.persistence.checkImportstructure.fileNotExist= +tutti.service.persistence.checkImportstructure.inlineForbidDirectory= tutti.service.persistence.checkImportstructure.tooManyChildren= tutti.service.persistence.copyDirectory.attachment.error= tutti.service.persistence.copyDirectory.db.error= +tutti.service.persistence.createDbDirectory.error= tutti.service.persistence.exportDb.deleteTempDir.error= tutti.service.persistence.exportDb.zip.error= tutti.service.persistence.extractArchive.error= Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-10-30 10:49:27 UTC (rev 1321) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-10-30 14:47:32 UTC (rev 1322) @@ -140,9 +140,11 @@ tutti.service.operations.exportCatchesReport.specialRows.inertAndLivinngNotItemized.name=Inerte et végétal tutti.service.persistence.checkArchiveDb.error=L'archive de base de données %1s ne contient pas le dossier %2s tutti.service.persistence.checkImportstructure.fileNotExist=L'archive de base de données %s n'existe pas +tutti.service.persistence.checkImportstructure.inlineForbidDirectory=La structure d'un import simplifié interdit deux niveaux de répertoire tutti.service.persistence.checkImportstructure.tooManyChildren=L'archive de base de données %s ne doit avoir qu'un sous-dossier tutti.service.persistence.copyDirectory.attachment.error=Erreur lors de la copie du dossier des pièces jointes tutti.service.persistence.copyDirectory.db.error=Erreur lors de la copie du dossier de base de données +tutti.service.persistence.createDbDirectory.error=Impossible de créer le répertoire de base %s tutti.service.persistence.exportDb.deleteTempDir.error=Erreur lors de la suppression du dossier temporaire tutti.service.persistence.exportDb.zip.error=Erreur lors de la création de l'archive %s tutti.service.persistence.extractArchive.error=Erreur lors de l'extraction de l'archive %s Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java 2013-10-30 10:49:27 UTC (rev 1321) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/db/ImportDbAction.java 2013-10-30 14:47:32 UTC (rev 1322) @@ -29,6 +29,7 @@ import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.TuttiPersistence; import fr.ifremer.tutti.persistence.config.TuttiPersistenceConfig; +import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.content.AbstractMainUITuttiAction; import fr.ifremer.tutti.ui.swing.content.MainUIHandler; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; @@ -65,6 +66,8 @@ protected Version applicationVersion; + protected PersistenceService.ImportStructureType importStructureType; + public ImportDbAction(MainUIHandler handler) { super(handler, true); setActionDescription(_("tutti.dbManager.action.importDb.tip")); @@ -77,6 +80,7 @@ @Override public boolean prepareAction() throws Exception { + importStructureType = null; jdbcUrl = null; dbVersion = applicationVersion = null; closeDb = updateSchema = false; @@ -113,7 +117,8 @@ progressionModel.setTotal(3); setProgressionModel(progressionModel); - getContext().getPersistenceService().checkImportStructure(importFile); + importStructureType = + getContext().getPersistenceService().checkImportStructure(importFile); } } return doAction; @@ -141,7 +146,7 @@ progressionModel.increments(_("tutti.importDb.step.unzipArchive")); - getContext().getPersistenceService().importDb(importFile); + getContext().getPersistenceService().importDb(importStructureType, importFile); // ------------------------------------------------------------------ // // --- open db //