This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository coser. See http://git.codelutin.com/coser.git commit 2ae16c679c8df98e608cf8dc375ca9348091b27e Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Dec 22 13:54:44 2014 +0100 fixes #5185: Revoir la fonctionnalité d'extraction des données pour les données pelagiques fixes #5692: Can't download source for result --- .../ifremer/coser/result/CoserRequestExecutor.java | 46 ++++++++++++++++++- .../echobase/command/AbstractEchoBaseCommand.java | 26 ++++++++++- .../command/ExtractRawDataAndResultsCommand.java | 23 +--------- .../echobase/command/ExtractRawDataCommand.java | 52 +++++++++++++++++++++- .../ifremer/coser/services/WebResultService.java | 25 +++++++++++ .../java/fr/ifremer/coser/web/ServiceHelper.java | 8 +++- .../coser/web/actions/source/SourceDataAction.java | 31 +------------ 7 files changed, 153 insertions(+), 58 deletions(-) diff --git a/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java b/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java index 903671d..e914ca7 100644 --- a/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java +++ b/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java @@ -143,9 +143,51 @@ public class CoserRequestExecutor { repositories.toArray(new ResultRepository[repositories.size()])); } + // Keep matching repository matchingRepositories = ImmutableList.copyOf(repositories); - ResultRepository repository = repositories.get(0); + // Get first matching repository + ResultRepository repository = getFirstMatchingRepository(); + + // execute + CoserResult result = execute(context, repository, request); + + // register result + if (result instanceof FileResult) { + this.fileResult = (FileResult) result; + } else if (result instanceof MapResult) { + this.mapResult = (MapResult) result; + } else if (result instanceof VoidResult) { + this.voidResult = (VoidResult) result; + } + return this; + } + + /** + * Execute the given {@code request} on the first matching result repository. + * <p/> + * If no result repository matches the request a {@link NoResultRepositoryFoundException} will be thrown. + * + * @param context request context + * @param request request to execute + * @return the result of the first matching repository. + * @since 1.5 + */ + public CoserRequestExecutor executeFirst(CoserRequestContext context, CoserRequest request) { + + Preconditions.checkNotNull(request); + Preconditions.checkArgument(request.isFilled(), "Request " + request + " is not filled."); + + List<ResultRepository> repositories = getMatchingRepositories(context, request); + if (CollectionUtils.isEmpty(repositories)) { + throw new NoResultRepositoryFoundException("No result repository matching request", request); + } + + // Keep matching repositories + matchingRepositories = ImmutableList.copyOf(repositories); + + // Get first matching repository + ResultRepository repository = getFirstMatchingRepository(); // execute CoserResult result = execute(context, repository, request); @@ -246,7 +288,7 @@ public class CoserRequestExecutor { return matchingRepositories; } - public ResultRepository getUniqueMatchingRepository() { + public ResultRepository getFirstMatchingRepository() { return matchingRepositories.get(0); } diff --git a/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java b/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java index 2bde01c..69e621f 100644 --- a/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java +++ b/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java @@ -26,6 +26,8 @@ import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Sets; +import fr.ifremer.coser.CoserBusinessConfig; +import fr.ifremer.coser.CoserTechnicalException; import fr.ifremer.coser.bean.IndicatorMap; import fr.ifremer.coser.bean.ZoneMap; import fr.ifremer.coser.result.CoserCommand; @@ -43,10 +45,12 @@ import fr.ifremer.coser.storage.DataStorage; import fr.ifremer.coser.storage.DataStorageWalker; import fr.ifremer.coser.storage.DataStorages; import org.apache.commons.collections4.map.MultiKeyMap; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.tuple.Pair; import org.jfree.chart.JFreeChart; import java.io.File; +import java.io.IOException; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -99,6 +103,26 @@ public abstract class AbstractEchoBaseCommand<R extends CoserRequest> implements return context.getLocale(); } + public CoserBusinessConfig getConfig() { + return context.getConfig(); + } + + public void extractRawData(File targetDirectory) { + + try { + FileUtils.forceMkdir(targetDirectory); + } catch (IOException e) { + throw new CoserTechnicalException("Could not create directory: " + targetDirectory, e); + } + try { + File sourceDirectory = repository.getProject().getRawDataDirectory(); + FileUtils.copyDirectory(sourceDirectory, targetDirectory); + } catch (IOException e) { + throw new CoserTechnicalException("Could not extract raw data", e); + } + + } + // --------------------------------------------------------------------- // // --- To create results ----------------------------------------------- // // --------------------------------------------------------------------- // @@ -183,7 +207,7 @@ public abstract class AbstractEchoBaseCommand<R extends CoserRequest> implements speciesList.add(speciesCode); } }; - walkOnCommunity(EchoBasePredicates.communityIndicatorPredicate(indicator),walker); + walkOnCommunity(EchoBasePredicates.communityIndicatorPredicate(indicator), walker); Map<String, String> result = repository.getSpeciesMap().getSpeciesSubMap(speciesList); return result; } diff --git a/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java b/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java index 587812f..d032d18 100644 --- a/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java +++ b/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java @@ -25,7 +25,6 @@ package fr.ifremer.coser.result.repository.echobase.command; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; -import fr.ifremer.coser.CoserTechnicalException; import fr.ifremer.coser.bean.SpeciesMap; import fr.ifremer.coser.result.repository.echobase.EchoBasePredicates; import fr.ifremer.coser.result.repository.legacy.LegacyPredicates; @@ -37,7 +36,6 @@ import fr.ifremer.coser.storage.DataStorages; import fr.ifremer.coser.util.DataType; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.map.MultiKeyMap; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; @@ -45,7 +43,6 @@ import org.apache.commons.logging.LogFactory; import org.jfree.chart.JFreeChart; import java.io.File; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -109,7 +106,7 @@ public class ExtractRawDataAndResultsCommand extends AbstractEchoBaseCommand<Ext log.debug("Extracting sources"); } File srcDir = new File(extractDirectory, "sources"); - extractSource(srcDir); + extractRawData(srcDir); } // les cartes doivent se retrouver dans le pdf @@ -151,24 +148,6 @@ public class ExtractRawDataAndResultsCommand extends AbstractEchoBaseCommand<Ext } /** - * Generate raw data after selection in a sub directory (named of the zone) of the given directory. - * - * @param directory where to generate file - */ - protected void extractSource(File directory) { - - File zoneDirectory = new File(directory, repository.getZone()); - - try { - FileUtils.forceMkdir(zoneDirectory); - } catch (IOException e) { - throw new CoserTechnicalException("Could not create directory: " + zoneDirectory, e); - } - - //TODO - } - - /** * Extract all maps for matchings species. * * @param speciesList list of species to extract diff --git a/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataCommand.java b/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataCommand.java index 455b163..c4c5623 100644 --- a/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataCommand.java +++ b/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataCommand.java @@ -22,8 +22,18 @@ package fr.ifremer.coser.result.repository.echobase.command; * #L% */ +import fr.ifremer.coser.CoserTechnicalException; import fr.ifremer.coser.result.request.ExtractRawDataRequest; import fr.ifremer.coser.result.result.FileResult; +import fr.ifremer.coser.result.util.Reports; +import org.apache.commons.io.FileUtils; +import org.nuiton.util.FileUtil; +import org.nuiton.util.ZipUtil; + +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.Locale; /** * Created on 3/11/14. @@ -42,8 +52,46 @@ public class ExtractRawDataCommand extends AbstractEchoBaseCommand<ExtractRawDat @Override public FileResult execute(ExtractRawDataRequest r) { - //TODO - throw new IllegalStateException("TODO!"); + Locale locale = getLocale(); + + File resultZip; + + try { + File tempDir = FileUtil.createTempDirectory("coser-source-", "-tmp"); + + File archiveDir = new File(tempDir, "ECHOBASE_" + repository.getProject().getName()); + + // add raw data + extractRawData(archiveDir); + + // add decharge file + String filename = Reports.getDechargeFilename(locale); + File dechargePDF = new File(archiveDir, filename); + + Date lastDataUpdateDate = getConfig().getLastDataUpdateDate(); + + getReports().generateDechargePDF(dechargePDF, + locale, + lastDataUpdateDate, + repository.getSurveyName()); + + // ajout du reftax dans le zip + File reftaxFile = repository.getProject().getSpeciesDefinitionFile(); + FileUtils.copyFileToDirectory(reftaxFile, archiveDir); + + // make zip + resultZip = File.createTempFile("coser-source-", ".zip"); + resultZip.deleteOnExit(); + ZipUtil.compress(resultZip, archiveDir); + + // clean directory + FileUtils.deleteDirectory(tempDir); + } catch (IOException e) { + throw new CoserTechnicalException("Can't create zip file", e); + } + + FileResult result = newFileResult(resultZip); + return result; } } diff --git a/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java b/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java index b845ea4..79bd33b 100644 --- a/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java +++ b/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java @@ -41,6 +41,7 @@ import fr.ifremer.coser.result.CoserRequestBuilder; import fr.ifremer.coser.result.CoserRequestContext; import fr.ifremer.coser.result.CoserRequestExecutor; import fr.ifremer.coser.result.DefaultCoserRequestContext; +import fr.ifremer.coser.result.repository.ResultRepository; import fr.ifremer.coser.result.repository.ResultRepositoryProvider; import fr.ifremer.coser.result.repository.ResultRepositoryType; import fr.ifremer.coser.result.repository.echobase.EchoBaseResultRepositoryProvider; @@ -111,6 +112,11 @@ public class WebResultService { return executor; } + public CoserRequestExecutor executeFirst(CoserRequestContext context, CoserRequest request) { + CoserRequestExecutor executor = executeFirst(getInternalRepositoryProvider(), context, request); + return executor; + } + public CoserRequestExecutor executeAll(CoserRequestContext context, CoserRequest request) { CoserRequestExecutor executor = executeAll(getInternalRepositoryProvider(), context, request); return executor; @@ -470,6 +476,25 @@ public class WebResultService { return executor; } + protected CoserRequestExecutor executeFirst(CoserMainRepositoryProvider repositoryProvider, + CoserRequestContext context, + CoserRequest request) { + CoserRequestExecutor executor = new CoserRequestExecutor(applicationContext, repositoryProvider); + executor.executeFirst(context, request); + List<ResultRepository> matchingRepositories = executor.getMatchingRepositories(); + if (matchingRepositories.size() > 1) { + String message = "Found more than one matching repository: "; + for (ResultRepository matchingRepository : matchingRepositories) { + message += "\n\t" + matchingRepository.getProjectName(); + } + if (log.isWarnEnabled()) { + log.warn(message); + } + } + return executor; + } + + protected CoserRequestExecutor executeAll(CoserMainRepositoryProvider repositoryProvider, CoserRequestContext context, CoserRequest request) { diff --git a/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java b/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java index cccb1fc..7fdf352 100644 --- a/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java +++ b/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java @@ -167,6 +167,12 @@ public class ServiceHelper { return result; } + public FileResult toFirstFileResult(CoserRequest request) { + CoserRequestContext context = newRequestContext(); + FileResult result = webResultService.executeFirst(context, request).toFileResult(); + return result; + } + public MapResult toMapResult(CoserRequest request) { CoserRequestContext context = newRequestContext(); MapResult result = webResultService.executeUnique(context, request).toMapResult(); @@ -200,7 +206,7 @@ public class ServiceHelper { CoserRequestContext context = newRequestContext(); CoserRequestExecutor coserRequestExecutor = webResultService.executeAll(context, request); //FIXME We tak the first repository... - ResultRepository matchingRepository = coserRequestExecutor.getUniqueMatchingRepository(); + ResultRepository matchingRepository = coserRequestExecutor.getFirstMatchingRepository(); return matchingRepository.getResultRepositoryType(); } diff --git a/coser-web/src/main/java/fr/ifremer/coser/web/actions/source/SourceDataAction.java b/coser-web/src/main/java/fr/ifremer/coser/web/actions/source/SourceDataAction.java index cd38537..ef34f07 100644 --- a/coser-web/src/main/java/fr/ifremer/coser/web/actions/source/SourceDataAction.java +++ b/coser-web/src/main/java/fr/ifremer/coser/web/actions/source/SourceDataAction.java @@ -55,7 +55,6 @@ public class SourceDataAction extends SourceAction { return accepted; } - // @Action(results = {@Result(type = "stream", params = {"contentType", "application/zip", "inputName", "inputStream", "contentDisposition", "attachment; filename=\"${filename}\""})}) @Action(results = {@Result(type = "stream", params = {"contentType", "application/zip", "contentDisposition", "attachment; filename=\"${filename}\""})}) public String execute() { @@ -63,7 +62,7 @@ public class SourceDataAction extends SourceAction { addFacade(facade). addZone(zone). toRequest(); - result = getService().toFileResult(request); + result = getService().toFirstFileResult(request); return SUCCESS; } @@ -75,32 +74,4 @@ public class SourceDataAction extends SourceAction { return result.getInputStream(); } -// @Override -// public void validate() { -// -// if (!accepted) { -// addFieldError("accepted", getText("message.quality.notaccepted")); -// } -// -// } -// -// public InputStream getInputStream() { -// WebService webService = ServiceFactory.getWebService(); -// -// Locale locale = getLocale(); -// -// InputStream input = null; -// try { -// -// File sourceZip = webService.getSourceZip(zone, locale); -// input = new FileInputStream(sourceZip); -// } catch (Exception ex) { -// if (log.isErrorEnabled()) { -// log.error("Can't get file data", ex); -// } -// throw new CoserWebException("Can't get source zip file", ex); -// } -// -// return input; -// } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.