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)";""