Author: chatellier Date: 2011-01-12 15:54:25 +0000 (Wed, 12 Jan 2011) New Revision: 504 Log: T?\195?\169l?\195?\169chargement des donn?\195?\169es sources. Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.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 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-12 15:11:27 UTC (rev 503) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2011-01-12 15:54:25 UTC (rev 504) @@ -39,6 +39,7 @@ import org.apache.commons.collections.map.MultiKeyMap; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -50,6 +51,7 @@ import fr.ifremer.coser.CoserBusinessConfig; import fr.ifremer.coser.CoserBusinessException; import fr.ifremer.coser.CoserConstants; +import fr.ifremer.coser.CoserConstants.Category; import fr.ifremer.coser.bean.Project; import fr.ifremer.coser.bean.RSufiResult; import fr.ifremer.coser.storage.DataStorage; @@ -790,4 +792,114 @@ return result; } + + /** + * Genere un fichier zip des sources d'un projet. + * + * Contient: + * <ul> + * <li>les 4 fichiers apres sélection + * <li> + * <li> + * </ul> + * + * @param zone zone (zoneid-surveyname) + * @param locale locale (fr/en) + * @return map file + * @throws CoserBusinessException + */ + public File getSourceZip(String zone, String locale) throws CoserBusinessException { + + File result = null; + + // parcours des resultats disponibles + File projectsDirectory = config.getWebProjectsDirectory(); + File[] projectFiles = projectsDirectory.listFiles(); + if (projectFiles != null) { + for (File projectFile : projectFiles) { + if (projectFile.isDirectory()) { + File selectionsDirectory = new File(projectFile, CoserConstants.STORAGE_SELECTION_DIRECTORY); + File[] selectionFiles = selectionsDirectory.listFiles(); + + // selection iteration + if (selectionFiles != null) { + for (File selectionFile : selectionFiles) { + if (selectionFile.isDirectory()) { + File resultsDirectory = new File(selectionFile, CoserConstants.STORAGE_RESULTS_DIRECTORY); + File[] resultFiles = resultsDirectory.listFiles(); + + // result iteration + if (resultFiles != null) { + for (File resultFile : resultFiles) { + if (resultFile.isDirectory()) { + RSufiResult rsufiResult = projectService.getRSufiResult(resultFile); + + // extraction des especes pour le résultat demandé + if (rsufiResult.getZone() != null && rsufiResult.getZone().equals(zone)) { + + // load project (without data to get original file names) + Project project = projectService.openProject(projectFile.getName(), projectsDirectory); + + result = generateSourceZip(project, selectionFile); + } + } + } + } + } + } + } + } + } + } + + return result; + } + + /** + * Generate zip for selection. + * + * @param project project + * @param selectionDirectory selection directory + * @return generated zip file + * @throws CoserBusinessException + */ + protected File generateSourceZip(Project project, File selectionDirectory) throws CoserBusinessException { + + File resultZip = null; + + try { + File tempDir = FileUtil.createTempDirectory("coser-", ".tmp"); + + // pour que l'archive contiennent ce dossier + File archiveDir = new File(tempDir, "coser-sources"); + + // recupere les noms originaux des fichiers + // de selection et de nom de fichier dans le zip + String catchSeFileName = projectService.getDataStorageFileName(project, Category.CATCH, CoserConstants.STORAGE_SELECTION_SUFFIX); + String haulSeFileName = projectService.getDataStorageFileName(project, Category.HAUL, CoserConstants.STORAGE_SELECTION_SUFFIX); + String lengthSeFileName = projectService.getDataStorageFileName(project, Category.LENGTH, CoserConstants.STORAGE_SELECTION_SUFFIX); + String strataSeFileName = projectService.getDataStorageFileName(project, Category.STRATA, CoserConstants.STORAGE_SELECTION_SUFFIX); + String catchFileName = projectService.getDataStorageFileName(project, Category.CATCH, null); + String haulFileName = projectService.getDataStorageFileName(project, Category.HAUL, null); + String lengthFileName = projectService.getDataStorageFileName(project, Category.LENGTH, null); + String strataFileName = projectService.getDataStorageFileName(project, Category.STRATA, null); + + // copy to temp directory + FileUtils.copyFile(new File(selectionDirectory, catchSeFileName), new File(archiveDir, catchFileName)); + FileUtils.copyFile(new File(selectionDirectory, haulSeFileName), new File(archiveDir, haulFileName)); + FileUtils.copyFile(new File(selectionDirectory, lengthSeFileName), new File(archiveDir, lengthFileName)); + FileUtils.copyFile(new File(selectionDirectory, strataSeFileName), new File(archiveDir, strataFileName)); + + // make zip + resultZip = File.createTempFile("coser-result", ".zip"); + ZipUtil.compress(resultZip, archiveDir); + + // clean directory + FileUtils.deleteDirectory(tempDir); + } catch (IOException ex) { + throw new CoserBusinessException("Can't create zip file", ex); + } + + return resultZip; + } } 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-12 15:11:27 UTC (rev 503) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2011-01-12 15:54:25 UTC (rev 504) @@ -26,14 +26,19 @@ package fr.ifremer.coser.services; import java.io.File; +import java.io.IOException; import java.net.URL; import org.apache.commons.collections.map.MultiKeyMap; +import org.apache.commons.io.FileUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.nuiton.util.FileUtil; +import org.nuiton.util.ZipUtil; import fr.ifremer.coser.CoserBusinessException; +import fr.ifremer.coser.bean.Project; import fr.ifremer.coser.storage.DataStorage; /** @@ -113,4 +118,23 @@ assertFileExists(config.getWebProjectsDirectory() + "/projet1/selections/selection11/results/result114"); assertFileExists(config.getWebProjectsDirectory() + "/projet3/selections/selection31/results/result311"); } + + /** + * Test du contenu du zip de téléchargement des sources. + * + * @throws CoserBusinessException + * @throws IOException + */ + @Test + public void testSourceZip() throws CoserBusinessException, IOException { + URL firstUpload = WebServiceTest.class.getResource("/web/upload1.zip"); + File firstUploadFile = new File(firstUpload.getFile()); + webService.registerNewUploadedResults(firstUploadFile); + + File zip = webService.getSourceZip("testzone1", "en"); + File tempDir = FileUtil.createTempDirectory("coser", ".tmp"); + ZipUtil.uncompress(zip, tempDir); + Assert.assertTrue(new File(tempDir, "coser-sources" + File.separator + "testcatch.csv").isFile()); + FileUtils.deleteDirectory(tempDir); + } } 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)