Author: chatellier Date: 2011-01-25 11:56:30 +0000 (Tue, 25 Jan 2011) New Revision: 570 Log: Fix result upload merge with separated indicators and maps results. Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java trunk/coser-business/src/test/resources/web/upload1.zip trunk/coser-business/src/test/resources/web/upload2.zip trunk/coser-business/src/test/resources/webindicators.csv Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2011-01-25 11:54:59 UTC (rev 569) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2011-01-25 11:56:30 UTC (rev 570) @@ -414,8 +414,7 @@ if (!projectDirectory.isDirectory()) { throw new CoserBusinessException(_("Project %s doesn't exists !", projectName)); } - Project project = new Project(); - project.setName(projectName); + Project project = new Project(projectName); for (Category category : Category.values()) { // load only additional files Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2011-01-25 11:54:59 UTC (rev 569) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2011-01-25 11:56:30 UTC (rev 570) @@ -254,8 +254,7 @@ for (File existingProject : projects) { if (existingProject.isDirectory()) { String projectName = existingProject.getName(); - Project p = new Project(); - p.setName(projectName); + Project p = new Project(projectName); // loop on selections File selectionsDirectory = new File(existingProject, CoserConstants.STORAGE_SELECTION_DIRECTORY); @@ -264,8 +263,7 @@ for (File existingSelection : selections) { if (existingSelection.isDirectory()) { String selectionName = existingSelection.getName(); - Selection s = new Selection(); - s.setName(selectionName); + Selection s = new Selection(selectionName); // loop on result File rsufisDirectory = new File(existingSelection, CoserConstants.STORAGE_RESULTS_DIRECTORY); @@ -343,7 +341,7 @@ Project project = path.getProject(); project = projectService.openProject(project.getName()); - OneResultFileFilter oneRFF = new OneResultFileFilter(config, + OneResultFileFilter oneRFF = new OneResultFileFilter(config.getProjectsDirectory(), project, path.getSelection(), path.getRsufiResult(), publishDataResults.contains(path)); mFileFilters.add(oneRFF); } @@ -566,14 +564,16 @@ * les fils (et il faut qu'il les demande) */ protected class OneResultFileFilter implements FileFilter { - protected CoserBusinessConfig config; + protected File projectsDirectory; + + /** Doit etre un project chargé avec nom de fichier originaux. */ protected Project project; protected Selection selection; protected RSufiResult rsufi; protected boolean exportWithData; - public OneResultFileFilter(CoserBusinessConfig config, Project project, Selection selection, RSufiResult rsufi, boolean exportWithData) { - this.config = config; + public OneResultFileFilter(File projectsDirectory, Project project, Selection selection, RSufiResult rsufi, boolean exportWithData) { + this.projectsDirectory = projectsDirectory; this.project = project; this.selection = selection; this.rsufi = rsufi; @@ -591,7 +591,7 @@ try { String currentPathName = pathname.getCanonicalPath() + File.separator; - File projectDirectory = new File(config.getProjectsDirectory(), project.getName()); + File projectDirectory = new File(projectsDirectory, project.getName()); File selectionsDirectory = new File(projectDirectory, CoserConstants.STORAGE_SELECTION_DIRECTORY); File selectionDirectory = new File(selectionsDirectory, selection.getName()); File resultsDirectory = new File(selectionDirectory, CoserConstants.STORAGE_RESULTS_DIRECTORY); @@ -655,8 +655,12 @@ * <li>suppression des selections vides * <li>suppression des projets vides * <li>copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire + * mais seulement pour ceux des zones concernés (partie difficile) * </ul> * + * TODO chatellier 20110125 l'algorithme n'est pour l'instant pas performant + * et contient pas mal de code dupliqué, mais pour la v1.0 ca ira. + * * @param archiveFile uploaded file * @throws CoserBusinessException */ @@ -674,20 +678,24 @@ // suppression dans l'ancien répertoire des resultat deja present // dans le nouveau (pour les conflits) cleanCurrentProjectDirectory(projectsDirectory, indicatorsResultZoneIds); + // creation du filter qui copiera juste ce qu'il faut + FileFilter indicatorsFileFilter = getCopyFileFilter(tempDirectory, false); // copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire - FileUtils.copyDirectory(tempDirectory, projectsDirectory); + //FileUtils.copyDirectory(tempDirectory, projectsDirectory, indicatorsFileFilter); + customCopyDirectory(tempDirectory, projectsDirectory, indicatorsFileFilter); - File mapsDirectory = config.getWebMapsProjectsDirectory(); // recuperation des noms zone des nouveau fichiers List<String> mapsResultZoneIds = getZonesIds(tempDirectory, true); // suppression dans l'ancien répertoire des resultat deja present // dans le nouveau (pour les conflits) cleanCurrentProjectDirectory(mapsDirectory, mapsResultZoneIds); + // creation du filter qui copiera juste ce qu'il faut + FileFilter mapsFileFilter = getCopyFileFilter(tempDirectory, true); // copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire - FileUtils.copyDirectory(tempDirectory, mapsDirectory); + //FileUtils.copyDirectory(tempDirectory, mapsDirectory, mapsFileFilter); + customCopyDirectory(tempDirectory, mapsDirectory, mapsFileFilter); - FileUtils.deleteDirectory(tempDirectory); if (log.isInfoEnabled()) { @@ -705,7 +713,36 @@ } /** + * N'utilise pas la methode de commons-fileutils, car lorsqu'un répertoire + * est refusé, il ne descend pas dans les sous répertoire alors que dans + * notre cas il le faut. + * + * @param directory directory + * @param projectsDirectory + * @param indicatorsFileFilter + * @throws IOException + */ + protected void customCopyDirectory(File srcDir, + File destDir, FileFilter indicatorsFileFilter) throws IOException { + List<File> files = FileUtil.getFilteredElements(srcDir, null, true); + for (File file : files) { + if (indicatorsFileFilter.accept(file)) { + String path = file.getPath().substring(srcDir.getPath().length()); + + File destFile = new File(destDir, path); + if (file.isDirectory()) { + destFile.mkdirs(); + } + else { + FileUtils.copyFile(file, destFile); + } + } + } + } + + /** * Met à jour certaines proprietes apres la mise à jour des données. + * * @throws CoserBusinessException */ protected void updateDataProperties() throws CoserBusinessException { @@ -824,6 +861,61 @@ } /** + * Retourne un file filter qui ne copiera que les dossiers resultat + * correspondant au type demandé. Pour un resultat, le filtre devra + * egalement copier les dossiers projet et selection correspondants. + * + * @param scanDirectory directory containing result to copy + * @param mapResults result type to get + * @return aggragated file filter + * @throws CoserBusinessException + */ + protected FileFilter getCopyFileFilter(File scanDirectory, boolean mapResults) throws CoserBusinessException { + + MultipleFileFilter aggregateFileFilter = new MultipleFileFilter(); + + File[] projectFiles = scanDirectory.listFiles(); + if (projectFiles != null) { + for (File projectFile : projectFiles) { + if (projectFile.isDirectory()) { + + File selectionsDirectory = new File(projectFile, CoserConstants.STORAGE_SELECTION_DIRECTORY); + File[] selectionFiles = selectionsDirectory.listFiles(); + if (selectionFiles != null) { + for (File selectionFile : selectionFiles) { + if (selectionFile.isDirectory()) { + + File resultsDirectory = new File(selectionFile, CoserConstants.STORAGE_RESULTS_DIRECTORY); + File[] resultFiles = resultsDirectory.listFiles(); + if (resultFiles != null) { + for (File resultFile : resultFiles) { + if (resultFile.isDirectory()) { + RSufiResult rsufiResult = projectService.getRSufiResult(resultFile); + + // return result depending on result type + if ( (mapResults && rsufiResult.isMapsResult()) || + (!mapResults && rsufiResult.isIndicatorsResult())) { + + Project p = new Project(projectFile.getName()); + Selection s = new Selection(selectionFile.getName()); + + OneResultFileFilter resultFileFilter = new OneResultFileFilter(scanDirectory, p, s, rsufiResult, true); + aggregateFileFilter.add(resultFileFilter); + } + } + } + } + } + } + } + } + } + } + + return aggregateFileFilter; + } + + /** * Fait le menage dans le dossier courant des projets en supprimant * tout les resulat qui ont un result id non present dans la liste * {@code newResultIds}. Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2011-01-25 11:54:59 UTC (rev 569) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2011-01-25 11:56:30 UTC (rev 570) @@ -104,7 +104,7 @@ @AfterClass public static void cleanDirectory() throws IOException { - FileUtils.deleteDirectory(testDirectory); + //FileUtils.deleteDirectory(testDirectory); } /** Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2011-01-25 11:54:59 UTC (rev 569) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2011-01-25 11:56:30 UTC (rev 570) @@ -88,7 +88,7 @@ @Test public void testGetIndicators() throws CoserBusinessException { MultiKeyMap indicators = webService.getIndicatorsMap(); - Assert.assertEquals(62, indicators.size()); + Assert.assertEquals(93, indicators.size()); } /** @@ -119,11 +119,10 @@ assertFileNotExists(config.getWebIndicatorsProjectsDirectory() + "/projet1/selections/selection11/results/result111"); assertFileExists(config.getWebIndicatorsProjectsDirectory() + "/projet1/selections/selection11/results/result112"); assertFileNotExists(config.getWebIndicatorsProjectsDirectory() + "/projet1/selections/selection12"); - assertFileNotExists(config.getWebIndicatorsProjectsDirectory() + "/projet2"); // some tests (from second) assertFileExists(config.getWebIndicatorsProjectsDirectory() + "/projet1/selections/selection11/results/result113"); assertFileExists(config.getWebIndicatorsProjectsDirectory() + "/projet1/selections/selection11/results/result114"); - assertFileExists(config.getWebIndicatorsProjectsDirectory() + "/projet3/selections/selection31/results/result311"); + assertFileExists(config.getWebMapsProjectsDirectory() + "/projet3/selections/selection31/results/result311"); } /** Modified: trunk/coser-business/src/test/resources/web/upload1.zip =================================================================== (Binary files differ) Modified: trunk/coser-business/src/test/resources/web/upload2.zip =================================================================== (Binary files differ) Modified: trunk/coser-business/src/test/resources/webindicators.csv =================================================================== --- trunk/coser-business/src/test/resources/webindicators.csv 2011-01-25 11:54:59 UTC (rev 569) +++ trunk/coser-business/src/test/resources/webindicators.csv 2011-01-25 11:56:30 UTC (rev 570) @@ -1,33 +1,33 @@ -"id";"label_fr";"label_en" -"Abundance";"Abondance totale dans la zone (valeur relative)";"Total abundance in the area (relative value)" -"Biomass";"Biomasse totale dans la zone (valeur relative)";"Total biomass in the area (relative value)" -"Dbar";"Densité relative dans la zone";"Relative density in the area" -"l0.05";"Longueur au 5ème percentile de la distribution de longueur";"Length at the fifth percentile of the length distribution" -"l0.25";"Longueur au 25ème percentile de la distribution de longueur";"Length at the twenty-fifth percentile of the length distribution" -"l0.75";"Longueur au 75ème percentile de la distribution de longueur";"Length at the seventy-fifth percentile of the length distribution" -"l0.95";"Longueur au 95ème percentile de la distribution de longueur";"Length at the ninety- fifth percentile of the length distribution" -"L50";"Taille à 50 % de maturité";"Size at 50 % maturity" -"Lbar";"Longueur moyenne dans la population";"Mean length in the population" -"lnN";"Logarithme naturel de l'abondance";"Natural Logarithm of abundance" -"lvar";"Variance de la longueur dans l'échantillon";"Sample variance of length measurements" -"PropMat";"Proportion de matures";"Proportion of mature individuals" -"sexRatio";"Sexe ratio (males/femelles)";"Sex ratio (males/females)" -"Wbar";"Poids individuel moyen dans la population";"Average individual weight in the population" -"biomBig";"Biomasse des grandes espèces (valeur relative)";"Biomass of the large species (relative value)" -"biomSmall";"Biomasse des petites espèces (valeur relative)";"Biomass of the small species (relative value)" -"Btot";"Biomasse totale dans la zone (valeur relative)";"Total biomass in the area (relative value)" -"Delta";"Indice de diversité \u0394";"Diversity index \u0394" -"Gtot";"Moyenne géométrique du nombre par espèce";"Geometric mean of species abundances" -"Lbcomm";"Taille moyenne dans communauté";"Average length in community" -"meanQuant0.95";"Moyenne des l0;95 des espèces";"Average across species of l0;95" -"meanWbar";"Moyenne des Wbar par espèce";"Average of species Wbar " -"Ntot";"Abondance totale dans la zone (valeur relative)";"Total abundance in the area (relative value)" -"propL15";"Proportion des grands individus en nombre (taille seuil 15 cm)";"Proportion of large individuals in numbers (threshold size 15 cm)" -"propL20";"Proportion des grands individus en nombre (taille seuil 20 cm)";"Proportion of large individuals in numbers (threshold size 20 cm)" -"propL25";"Proportion des grands individus en nombre (taille seuil 25 cm)";"Proportion of large individuals in numbers (threshold size 25 cm)" -"propL30";"Proportion des grands individus en nombre (taille seuil 30 cm)";"Proportion of large individuals in numbers (threshold size 30 cm)" -"propLW";"Proportion des grands individus en poids (/ taille seuil spécifique à la zone)";"Proportion of large individuals in weight (/ threshold length area specific)" -"Shannonmod";"Indice de Shannon normalisé / première année";"Shannon index normalized wrt the first year" -"Wbcomm";"Poids moyen d'un individu";"Average weight of an individual" -"Wtot";"Biomasse totale dans la zone (valeur relative)";"Total biomass in the area (relative value)" +"id";"label_fr";"label_en";"unit" +"Abundance";"Abondance totale dans la zone (valeur relative)";"Total abundance in the area (relative value)";"" +"Biomass";"Biomasse totale dans la zone (valeur relative)";"Total biomass in the area (relative value)";"" +"Dbar";"Densité relative dans la zone";"Relative density in the area";"" +"l0.05";"Longueur au 5ème percentile de la distribution de longueur";"Length at the fifth percentile of the length distribution";"cm" +"l0.25";"Longueur au 25ème percentile de la distribution de longueur";"Length at the twenty-fifth percentile of the length distribution";"cm" +"l0.75";"Longueur au 75ème percentile de la distribution de longueur";"Length at the seventy-fifth percentile of the length distribution";"cm" +"l0.95";"Longueur au 95ème percentile de la distribution de longueur";"Length at the ninety- fifth percentile of the length distribution";"cm" +"L50";"Taille à 50 % de maturité";"Size at 50 % maturity";"cm" +"Lbar";"Longueur moyenne dans la population";"Mean length in the population";"cm" +"lnN";"Logarithme naturel de l'abondance";"Natural Logarithm of abundance";"" +"lvar";"Variance de la longueur dans l'échantillon";"Sample variance of length measurements";"" +"PropMat";"Proportion de matures";"Proportion of mature individuals";"" +"sexRatio";"Sexe ratio (males/femelles)";"Sex ratio (males/females)";"" +"Wbar";"Poids individuel moyen dans la population";"Average individual weight in the population";"kg" +"biomBig";"Biomasse des grandes espèces (valeur relative)";"Biomass of the large species (relative value)";"" +"biomSmall";"Biomasse des petites espèces (valeur relative)";"Biomass of the small species (relative value)";"" +"Btot";"Biomasse totale dans la zone (valeur relative)";"Total biomass in the area (relative value)";"" +"Delta";"Indice de diversité \u0394";"Diversity index \u0394";"" +"Gtot";"Moyenne géométrique du nombre par espèce";"Geometric mean of species abundances";"" +"Lbcomm";"Taille moyenne dans communauté";"Average length in community";"cm" +"meanQuant0.95";"Moyenne des l0;95 des espèces";"Average across species of l0;95";"cm" +"meanWbar";"Moyenne des Wbar par espèce";"Average of species Wbar";"kg" +"Ntot";"Abondance totale dans la zone (valeur relative)";"Total abundance in the area (relative value)";"" +"propL15";"Proportion des grands individus en nombre (taille seuil 15 cm)";"Proportion of large individuals in numbers (threshold size 15 cm)";"" +"propL20";"Proportion des grands individus en nombre (taille seuil 20 cm)";"Proportion of large individuals in numbers (threshold size 20 cm)";"" +"propL25";"Proportion des grands individus en nombre (taille seuil 25 cm)";"Proportion of large individuals in numbers (threshold size 25 cm)";"" +"propL30";"Proportion des grands individus en nombre (taille seuil 30 cm)";"Proportion of large individuals in numbers (threshold size 30 cm)";"" +"propLW";"Proportion des grands individus en poids (/ taille seuil spécifique à la zone)";"Proportion of large individuals in weight (/ threshold length area specific)";"" +"Shannonmod";"Indice de Shannon normalisé / première année";"Shannon index normalized wrt the first year";"" +"Wbcomm";"Poids moyen d'un individu)";"Average weight of an individual";"kg" +"Wtot";"Biomasse totale dans la zone (valeur relative)";"Total biomass in the area (relative value)";""
participants (1)
-
chatellier@users.labs.libre-entreprise.org