r467 - in trunk/coser-business/src: main/java/fr/ifremer/coser main/java/fr/ifremer/coser/services test/java/fr/ifremer/coser/services test/resources test/resources/web
Author: chatellier Date: 2011-01-05 17:20:52 +0000 (Wed, 05 Jan 2011) New Revision: 467 Log: Ajout du merge des resulats lors de l'upload (suivante l'id zone/sous zone) Added: trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java trunk/coser-business/src/test/resources/web/ 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/CoserBusinessConfig.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java 2011-01-05 15:05:00 UTC (rev 466) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java 2011-01-05 17:20:52 UTC (rev 467) @@ -122,13 +122,23 @@ return result; } - public String getWebUploadPassword() { - String result = getOption(CoserBusinessOption.WEB_UPLOAD_PASSWORD.key); + public File getWebServerDirectory() { + File result = getOptionAsFile(CoserBusinessOption.WEB_SERVER_DIRECTORY.key); return result; } + + public File getWebProjectsDirectory() { + File result = getOptionAsFile(CoserBusinessOption.WEB_PROJECTS_DIRECTORY.key); + return result; + } + + public File getMatchIndicatorsFile() { + File result = getOptionAsFile(CoserBusinessOption.WEB_MATCH_INDICATORS.key); + return result; + } - public File getWebServerDirectory() { - File result = getOptionAsFile(CoserBusinessOption.WEB_SERVER_DIRECTORY.key); + public File getMatchZonesFile() { + File result = getOptionAsFile(CoserBusinessOption.WEB_MATCH_ZONES.key); return result; } @@ -152,10 +162,12 @@ /** Client side. */ WEB_FRONT_END("coser.web.frontend", _("coser.config.web.frontend.description"), "http://www.ifremer.fr/coser", String.class, false, false), WEB_UPLOAD_URL("coser.web.uploadurl", _("coser.config.web.uploadurl.description"), "${" + WEB_FRONT_END.key + "}/upload-result.action", String.class, false, false), - WEB_UPLOAD_PASSWORD("coser.web.uploadpassword", _("coser.config.web.uploadpassword.description"), "", String.class, false, false), /** Server side. */ - WEB_SERVER_DIRECTORY("coser.web.server.directory", _("coser.config.web.server.directory.description"), "${" + DATABASE_DIRECTORY.key + "}" + File.separator + "web", String.class, false, false); + WEB_SERVER_DIRECTORY("coser.web.server.directory", _("coser.config.web.server.directory.description"), "${" + DATABASE_DIRECTORY.key + "}" + File.separator + "web", String.class, false, false), + WEB_PROJECTS_DIRECTORY("coser.web.projects.directory", _("coser.config.web.projects.directory.description"), "${" + WEB_SERVER_DIRECTORY.key + "}" + File.separator + "projects", String.class, false, false), + WEB_MATCH_INDICATORS("coser.web.matchindicators.file", _("coser.config.web.matchindicators.file.description"), "${" + WEB_SERVER_DIRECTORY.key + "}" + File.separator + "correspondanceindicateurs.txt", String.class, false, false), + WEB_MATCH_ZONES("coser.web.matchzones.file", _("coser.config.web.matchzones.file.description"), "${" + WEB_SERVER_DIRECTORY.key + "}" + File.separator + "correspondancezones.txt", String.class, false, false); protected String key; protected String description; 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-05 15:05:00 UTC (rev 466) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2011-01-05 17:20:52 UTC (rev 467) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Codelutin, Chatellier Eric + * Copyright (C) 2010 - 2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -550,28 +550,9 @@ if (resultsDirectories != null) { for (File resultDirectory : resultsDirectories) { if (resultDirectory.isDirectory()) { - RSufiResult rsufiResult = new RSufiResult(); + RSufiResult rsufiResult = getRSufiResult(resultDirectory); rsufiResult.setName(resultDirectory.getName()); results.add(rsufiResult); - - // relecture des informations du resultat (properties) - File resultPropertiesFile = new File(resultDirectory, "result.properties"); - InputStream inputStream = null; - try { - Properties props = new Properties(); - inputStream = new FileInputStream(resultPropertiesFile); - props.load(inputStream); - rsufiResult.fromProperties(props); - - if (log.isDebugEnabled()) { - log.debug("Read result properties file : " + resultPropertiesFile); - } - } catch (IOException ex) { - throw new CoserBusinessException("Can't read result properties file", ex); - } - finally { - IOUtils.closeQuietly(inputStream); - } } } } @@ -580,6 +561,39 @@ } /** + * Retourne un object {@code RSufiResult} initialise avec les données + * du resultat du répertoire demandé. + * + * @param resultDirectory result directory (base) + * @return initialized RSufiResult + * @throws CoserBusinessException + */ + public RSufiResult getRSufiResult(File resultDirectory) throws CoserBusinessException { + RSufiResult rsufiResult = new RSufiResult(); + rsufiResult.setName(resultDirectory.getName()); + + // relecture des informations du resultat (properties) + File resultPropertiesFile = new File(resultDirectory, "result.properties"); + InputStream inputStream = null; + try { + Properties props = new Properties(); + inputStream = new FileInputStream(resultPropertiesFile); + props.load(inputStream); + rsufiResult.fromProperties(props); + + if (log.isDebugEnabled()) { + log.debug("Read result properties file : " + resultPropertiesFile); + } + } catch (IOException ex) { + throw new CoserBusinessException("Can't read result properties file", ex); + } + finally { + IOUtils.closeQuietly(inputStream); + } + return rsufiResult; + } + + /** * Load control data in an initialized project. * * @param project project @@ -2933,8 +2947,8 @@ MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); // password param - StringBody passwordBody = new StringBody(config.getWebUploadPassword(), Charset.forName("UTF-8")); - reqEntity.addPart("password", passwordBody); + //StringBody passwordBody = new StringBody(config.getWebUploadPassword(), Charset.forName("UTF-8")); + //reqEntity.addPart("password", passwordBody); // file param ProgressStream stream = new ProgressStream(new FileInputStream(prepareZip), progress); 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-05 15:05:00 UTC (rev 466) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebService.java 2011-01-05 17:20:52 UTC (rev 467) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Codelutin, Chatellier Eric + * Copyright (C) 2010 - 2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -27,8 +27,10 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -36,6 +38,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.FileUtil; import org.nuiton.util.ZipUtil; import fr.ifremer.coser.CoserBusinessConfig; @@ -44,11 +47,10 @@ import fr.ifremer.coser.bean.Project; import fr.ifremer.coser.bean.RSufiResult; import fr.ifremer.coser.bean.Selection; -import fr.ifremer.coser.data.Catch; import fr.ifremer.coser.storage.DataStorage; /** - * Service for web server. + * Service specifique à l'interface web de visualisation. * * @author chatellier * @version $Revision$ @@ -77,27 +79,164 @@ * Traite le fichier uploade par l'application client et l'enregistre * dans le stockage coté web. * + * Le nouveau fichier uploadé est mergé avec l'ancien, c'est à dire: + * <ul> + * <li>dezipage dans un fichier temporaire + * <li>recuperation des noms zone/souszone-campagne des nouveau fichiers + * <li>suppression dans l'ancien répertoire des resultat deja present dans le nouveau (pour les conlfits) + * <li>suppression des selections vide + * <li>suppression des projets vide + * <li>copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire + * </ul> + * * @param archiveFile uploaded file * @throws CoserBusinessException */ public void registerNewUploadedResults(File archiveFile) throws CoserBusinessException { - - File webDirectory = config.getWebServerDirectory(); - File newDirectory = new File(webDirectory, "tutu"); + try { - FileUtils.deleteDirectory(newDirectory); - newDirectory.mkdirs(); + File projectsDirectory = config.getWebProjectsDirectory(); + // dezipage dans un fichier temporaire + File tempDirectory = FileUtil.createTempDirectory("coser", ".tmp"); + ZipUtil.uncompress(archiveFile, tempDirectory); + + // recuperation des noms zone/souszone-campagne des nouveau fichiers + List<String> newResultIds = getResultIds(tempDirectory); + + // suppression dans l'ancien répertoire des resultat deja present + // dans le nouveau (pour les conflits) + cleanCurrentProjectDirectory(projectsDirectory, newResultIds); + + // copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire + FileUtils.copyDirectory(tempDirectory, projectsDirectory); + FileUtils.deleteDirectory(tempDirectory); + if (log.isInfoEnabled()) { - log.info("Unzipping file " + archiveFile + " to " + newDirectory); + log.info("Unzipping file " + archiveFile + " to " + projectsDirectory); } - ZipUtil.uncompress(archiveFile, newDirectory); + } catch (IOException ex) { throw new CoserBusinessException("Can't uncompress file", ex); } } /** + * Recupere dans un repertoire donné, les resultid des resultat (zone / + * sous-zone-campagne) + * + * @param scanDirectory le repertoire a scanner + * @return la liste des resultid + * @throws CoserBusinessException + */ + protected List<String> getResultIds(File scanDirectory) throws CoserBusinessException { + + List<String> resultIds = new ArrayList<String>(); + 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); + String resultResultId = rsufiResult.getZone(); + if (StringUtils.isNotBlank(resultResultId)) { + resultIds.add(resultResultId); + } + } + } + } + } + } + } + } + } + } + + return resultIds; + } + + /** + * 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}. + * + * Supprime egalement les selections qui n'ont plus de résultats et + * les projets qui n'ont plus de selection. + * + * @param projectsDirectory projectsDirectory + * @param newResultIds new ids + * @throws CoserBusinessException + */ + protected void cleanCurrentProjectDirectory(File projectsDirectory, List<String> newResultIds) throws CoserBusinessException { + + try { + File[] projectFiles = projectsDirectory.listFiles(); + if (projectFiles != null) { + for (File projectFile : projectFiles) { + if (projectFile.isDirectory()) { + int projectSelectionCount = 0; + + File selectionsDirectory = new File(projectFile, CoserConstants.STORAGE_SELECTION_DIRECTORY); + File[] selectionFiles = selectionsDirectory.listFiles(); + if (selectionFiles != null) { + for (File selectionFile : selectionFiles) { + if (selectionFile.isDirectory()) { + int selectionResultCount = 0; + + 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); + String resultResultId = rsufiResult.getZone(); + if (newResultIds.contains(resultResultId)) { + // un nouveau resulat utilsera ce resultid + FileUtils.deleteDirectory(resultFile); + } + else { + // un resultat valid trouvé, selection non a supprimer + selectionResultCount++; + } + } + } + } + + // si aucun resultat valide, suppression de la seletion + if (selectionResultCount == 0) { + FileUtils.deleteDirectory(selectionFile); + } + else { + projectSelectionCount++; + } + } + } + } + + // si aucune selection avec resultat, suppression du projet + if (projectSelectionCount == 0) { + FileUtils.deleteDirectory(projectFile); + } + } + } + } + } catch (IOException ex) { + throw new CoserBusinessException("Can't delete directory", ex); + } + } + + /** * Recuperer la liste des populations pour une zone données. * * @param zone zone @@ -109,13 +248,12 @@ Map<String, String> result = new TreeMap<String, String>(); // parcours des resultats disponibles - File webDirectory = config.getWebServerDirectory(); - File newDirectory = new File(webDirectory, "tutu"); - File[] projectFiles = newDirectory.listFiles(); + File projectsDirectory = config.getWebProjectsDirectory(); + File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { if (projectFile.isDirectory()) { - Project project = projectService.openProject(projectFile.getName(), newDirectory); + Project project = projectService.openProject(projectFile.getName(), projectsDirectory); for (Selection selection : project.getSelections().values()) { boolean resultFound = false; @@ -174,9 +312,8 @@ // get this selection data // un peu lourd mais reconstruit le path jusqu'au fichier estcomind - File webDirectory = config.getWebServerDirectory(); - File newDirectory = new File(webDirectory, "tutu"); - File projectDirectory = new File(newDirectory, project.getName()); + File projectsDirectory = config.getWebProjectsDirectory(); + 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); @@ -214,13 +351,12 @@ Map<String, String> indicators = new TreeMap<String, String>(); // parcours des resultats disponibles - File webDirectory = config.getWebServerDirectory(); - File newDirectory = new File(webDirectory, "tutu"); - File[] projectFiles = newDirectory.listFiles(); + File projectsDirectory = config.getWebProjectsDirectory(); + File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { if (projectFile.isDirectory()) { - Project project = projectService.openProject(projectFile.getName(), newDirectory); + Project project = projectService.openProject(projectFile.getName(), projectsDirectory); for (Selection selection : project.getSelections().values()) { boolean resultFound = false; @@ -264,9 +400,8 @@ Map<String, String> result = new HashMap<String, String>(); // on peu lours mais reconstruit le path jusqu'au fichier estcomind - File webDirectory = config.getWebServerDirectory(); - File newDirectory = new File(webDirectory, "tutu"); - File projectDirectory = new File(newDirectory, project.getName()); + File projectsDirectory = config.getWebProjectsDirectory(); + 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); @@ -309,13 +444,12 @@ // charge du fichier EstComInd_survey.txt ou EstPopInd_survey.txt // suivant le type de resultat demandé (communauté/population) - File webDirectory = config.getWebServerDirectory(); - File newDirectory = new File(webDirectory, "tutu"); - File[] projectFiles = newDirectory.listFiles(); + File projectsDirectory = config.getWebProjectsDirectory(); + File[] projectFiles = projectsDirectory.listFiles(); if (projectFiles != null) { for (File projectFile : projectFiles) { if (projectFile.isDirectory()) { - Project project = projectService.openProject(projectFile.getName(), newDirectory); + Project project = projectService.openProject(projectFile.getName(), projectsDirectory); for (Selection selection : project.getSelections().values()) { boolean resultFound = false; Added: trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java =================================================================== --- trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java (rev 0) +++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java 2011-01-05 17:20:52 UTC (rev 467) @@ -0,0 +1,88 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 Codelutin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +package fr.ifremer.coser.services; + +import java.io.File; +import java.net.URL; + +import org.junit.Assert; +import org.junit.Test; + +import fr.ifremer.coser.CoserBusinessException; + +/** + * Test du service de l'interface web. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class WebServiceTest extends CoserTestAbstract { + + protected void assertFileExists(String filepath) { + File file = new File(filepath.replace('/', File.separatorChar)); + System.out.println("testing file " + file); + Assert.assertTrue(file.exists()); + } + + protected void assertFileNotExists(String filepath) { + File file = new File(filepath.replace('/', File.separatorChar)); + System.out.println("testing file " + file); + Assert.assertFalse(file.exists()); + } + + /** + * Test que les upload successible merge bien les resultats en fonction + * des idenfiants des zones auquels ils sont affectés et que les resulats + * en conflit sont bien supprimé (avec si besoins leurs selections et projets). + * @throws CoserBusinessException + */ + @Test + public void testUploadDirectoyMerge() throws CoserBusinessException { + WebService webService = new WebService(config); + + URL firstUpload = WebServiceTest.class.getResource("/web/upload1.zip"); + File firstUploadFile = new File(firstUpload.getFile()); + webService.registerNewUploadedResults(firstUploadFile); + + // second upload with merge + URL secondUpload = WebServiceTest.class.getResource("/web/upload2.zip"); + File secondUploadFile = new File(secondUpload.getFile()); + webService.registerNewUploadedResults(secondUploadFile); + + // some tests (from first) + assertFileNotExists(config.getWebProjectsDirectory() + "/projet1/selections/selection11/results/result111"); + assertFileExists(config.getWebProjectsDirectory() + "/projet1/selections/selection11/results/result112"); + assertFileNotExists(config.getWebProjectsDirectory() + "/projet1/selections/selection12"); + assertFileNotExists(config.getWebProjectsDirectory() + "/projet2"); + // some tests (from second) + assertFileExists(config.getWebProjectsDirectory() + "/projet1/selections/selection11/results/result113"); + assertFileExists(config.getWebProjectsDirectory() + "/projet1/selections/selection11/results/result114"); + assertFileExists(config.getWebProjectsDirectory() + "/projet3/selections/selection31/results/result311"); + } +} Property changes on: trunk/coser-business/src/test/java/fr/ifremer/coser/services/WebServiceTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: trunk/coser-business/src/test/resources/web/upload1.zip =================================================================== (Binary files differ) Property changes on: trunk/coser-business/src/test/resources/web/upload1.zip ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/coser-business/src/test/resources/web/upload2.zip =================================================================== (Binary files differ) Property changes on: trunk/coser-business/src/test/resources/web/upload2.zip ___________________________________________________________________ Added: svn:mime-type + application/octet-stream
participants (1)
-
chatellier@users.labs.libre-entreprise.org