Author: tchemit Date: 2014-03-16 20:00:12 +0100 (Sun, 16 Mar 2014) New Revision: 1148 Url: http://forge.codelutin.com/projects/coser/repository/revisions/1148 Log: refs #4664 extract is working for legacy results Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/DefaultCoserRequestContext.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBasePredicates.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyPredicates.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/AbstractLegacyCommand.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/ExtractRawDataAndResultsCommand.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/DeleteResultsRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/ExtractRawDataAndResultsRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForExtractRawDataAndResultsRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForPopulationIndicatorResultRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForExtractRawDataAndResultsRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForPopulationIndicatorResultRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesListForCommunityIndicatorResultRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetZonesForExtractRawDataAndResultsRequest.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/result/ExtractRawDataAndResultsResult.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Extracts.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Reports.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/search/ExtractAction.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -27,6 +27,7 @@ import fr.ifremer.coser.CoserApplicationContext; import fr.ifremer.coser.CoserTechnicalException; import fr.ifremer.coser.result.repository.ResultRepository; +import fr.ifremer.coser.result.request.DeleteResultsRequest; import fr.ifremer.coser.result.request.ExtractRawDataAndResultsRequest; import fr.ifremer.coser.result.result.FileResult; import org.apache.commons.collections4.CollectionUtils; @@ -108,7 +109,7 @@ public CoserResult executeUnique(CoserRequestContext context, CoserRequest request) { Preconditions.checkNotNull(request); - Preconditions.checkArgument(request.isFilled()); + Preconditions.checkArgument(request.isFilled(), "Request " + request + " is not filled."); List<ResultRepository> repositories = getMatchingRepositories(context, request); if (CollectionUtils.isEmpty(repositories)) { @@ -126,6 +127,16 @@ return result; } + public void deleteResults(CoserRequestContext context, + DeleteResultsRequest request) { + + // do delete results (don't care about result) + executeAll(context, request); + + // reload projects + repositoryProvider.resetRepositories(); + } + /** * Execute the given {@code request} on any matching result repository. * <p/> @@ -138,14 +149,11 @@ public List<CoserResult> executeAll(CoserRequestContext context, CoserRequest request) { Preconditions.checkNotNull(request); - Preconditions.checkArgument(request.isFilled()); + Preconditions.checkArgument(request.isFilled(), "Request " + request + " is not filled."); List<CoserResult> result = Lists.newArrayList(); List<ResultRepository> repositories = getMatchingRepositories(context, request); - if (CollectionUtils.isEmpty(repositories)) { - throw new NoResultRepositoryFoundException("No result repository matching request", request); - } for (ResultRepository repository : repositories) { Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/DefaultCoserRequestContext.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/DefaultCoserRequestContext.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/DefaultCoserRequestContext.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -30,6 +30,7 @@ import fr.ifremer.coser.result.util.Charts; import fr.ifremer.coser.result.util.Extracts; import fr.ifremer.coser.result.util.Reports; +import org.nuiton.util.FileUtil; import java.io.File; import java.io.IOException; @@ -93,7 +94,7 @@ public File getTemporaryDirectory() { if (temporaryDirectory == null) { try { - temporaryDirectory = File.createTempFile("coser-", ""); + temporaryDirectory = FileUtil.createTempDirectory("coser-", ""); } catch (IOException e) { throw new CoserTechnicalException("Could not create temporary directory.", e); } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBasePredicates.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBasePredicates.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBasePredicates.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -22,6 +22,7 @@ * #L% */ +import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Lists; @@ -76,6 +77,7 @@ private final List<String> species; CommunitySpeciesPredicate(List<String> species) { + Preconditions.checkNotNull(species, "Species can not be null"); this.species = species; } @@ -92,6 +94,7 @@ private final List<String> indicator; CommunityIndicatorPredicate(List<String> indicator) { + Preconditions.checkNotNull(indicator, "Indicators can not be null"); this.indicator = indicator; } @@ -108,6 +111,7 @@ private final List<String> species; PopulationSpeciesPredicate(List<String> species) { + Preconditions.checkNotNull(species, "Species can not be null"); this.species = species; } @@ -124,6 +128,7 @@ private final List<String> indicator; PopulationIndicatorPredicate(List<String> indicator) { + Preconditions.checkNotNull(indicator, "Indicators can not be null"); this.indicator = indicator; } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/AbstractEchoBaseCommand.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -118,7 +118,7 @@ return result; } - protected ExtractRawDataAndResultsResult newExtractRawDataAndResultsResult(MultiKeyMap<String, File> pdfMaps, Map<String, Pair<File, String>> pdfCharts) { + protected ExtractRawDataAndResultsResult newExtractRawDataAndResultsResult(MultiKeyMap<String, File> pdfMaps, MultiKeyMap<String, Pair<File, String>> pdfCharts) { ExtractRawDataAndResultsResult result = new ExtractRawDataAndResultsResult( repository.getId(), pdfMaps, pdfCharts); return result; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/command/ExtractRawDataAndResultsCommand.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -25,7 +25,6 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import fr.ifremer.coser.CoserTechnicalException; import fr.ifremer.coser.bean.SpeciesMap; import fr.ifremer.coser.result.repository.echobase.EchoBasePredicates; @@ -67,9 +66,10 @@ //TODO Remove false when will be ok... boolean result = false && repository.matchExtractTypeList(request) && repository.matchZone(request); - if (result) { + if (result && repository.isIndicatorsResult()) { - if (request.getExtractTypeList().contains(DataType.POPULATION)) { + if (request.getExtractTypeList().contains(DataType.POPULATION) && + CollectionUtils.isNotEmpty(request.getPopulationIndicatorList())) { // match population indicator? Predicate<String[]> predicate = Predicates.and( @@ -80,7 +80,8 @@ if (!result) { - if (request.getExtractTypeList().contains(DataType.COMMUNITY)) { + if (request.getExtractTypeList().contains(DataType.COMMUNITY) && + CollectionUtils.isNotEmpty(request.getCommunityIndicatorList())) { // match community indicator? Predicate<String[]> predicate = Predicates.and( @@ -104,7 +105,7 @@ File extractDirectory = request.getExtractDirectory(); // les sources se retrouve dans le zip a cote du pdf - if (extractTypeList.contains(DataType.SOURCE)) { + if (extractTypeList.contains(DataType.SOURCE) && repository.isDataResult()) { if (log.isDebugEnabled()) { log.debug("Extracting sources"); } @@ -114,31 +115,38 @@ // les cartes doivent se retrouver dans le pdf MultiKeyMap<String, File> pdfMaps = null; - if (extractTypeList.contains(DataType.MAP)) { + if (extractTypeList.contains(DataType.MAP) && repository.isMapsResult()) { if (log.isDebugEnabled()) { log.debug("Extracting maps"); } - pdfMaps = new MultiKeyMap<String, File>(); - SpeciesMap speciesMap = repository.getSpeciesMap(); - String zone = repository.getZone(); - for (String species : speciesList) { - File mapFile = repository.getMapSpeciesFile(species); - String speciesName = speciesMap.getSpeciesName(species); - pdfMaps.put(zone, speciesName, mapFile); - } + pdfMaps = extractMaps(speciesList); } // les graphiques sont également dans le pdf - Map<String, Pair<File, String>> pdfCharts = null; - if (CollectionUtils.isNotEmpty(communityIndicatorList) || - CollectionUtils.isNotEmpty(populationIndicatorList)) { + MultiKeyMap<String, Pair<File, String>> pdfCharts = new MultiKeyMap<String, Pair<File, String>>(); + + if (CollectionUtils.isNotEmpty(communityIndicatorList) && repository.isIndicatorsResult()) { if (log.isDebugEnabled()) { - log.debug("Extracting charts"); + log.debug("Extracting community charts"); } - pdfCharts = extractCharts(speciesList, - communityIndicatorList, - populationIndicatorList); + + MultiKeyMap<String, Pair<File, String>> map = extractCommunityResults(communityIndicatorList, + repository.getZone(), + 650, + 430); + pdfCharts.putAll(map); } + if (CollectionUtils.isNotEmpty(populationIndicatorList) && repository.isIndicatorsResult()) { + if (log.isDebugEnabled()) { + log.debug("Extracting population charts"); + } + MultiKeyMap<String, Pair<File, String>> map = extractPopulationResults(speciesList, + populationIndicatorList, + repository.getZone(), + 650, + 430); + pdfCharts.putAll(map); + } ExtractRawDataAndResultsResult result = newExtractRawDataAndResultsResult(pdfMaps, pdfCharts); return result; } @@ -162,36 +170,22 @@ } /** - * @param species species to extract in population indicators - * @param communityIndicators community indicators to extract - * @param populationIndicators population indicators to extract - * @return charts files and their data with key: zone , indicator [- speciesName for population]) - * and value: (graphFile, graphData) + * Extract all maps for matchings species. + * + * @param speciesList list of species to extract + * @return map of map files indexed by zone - speciesName */ - protected Map<String, Pair<File, String>> extractCharts(List<String> species, - List<String> communityIndicators, - List<String> populationIndicators) { - + protected MultiKeyMap<String, File> extractMaps(List<String> speciesList) { + MultiKeyMap<String, File> pdfMaps; + pdfMaps = new MultiKeyMap<String, File>(); + SpeciesMap speciesMap = repository.getSpeciesMap(); String zone = repository.getZone(); - - Map<String, Pair<File, String>> result = Maps.newLinkedHashMap(); - - if (CollectionUtils.isNotEmpty(communityIndicators)) { - result.putAll(extractCommunityResults(communityIndicators, - zone, - 650, - 430)); + for (String species : speciesList) { + File mapFile = repository.getMapSpeciesFile(species); + String speciesName = speciesMap.getSpeciesName(species); + pdfMaps.put(zone, speciesName, mapFile); } - - if (CollectionUtils.isNotEmpty(populationIndicators)) { - result.putAll(extractPopulationResults(species, - populationIndicators, - zone, - 650, - 430)); - } - - return result; + return pdfMaps; } /** @@ -203,10 +197,10 @@ * @param height graph height * @return maps of generated graph image (temp file) and data indexed by natural key (indicator - species) */ - public Map<String, Pair<File, String>> extractCommunityResults(List<String> selectedIndicators, - String zone, - int width, - int height) { + public MultiKeyMap<String, Pair<File, String>> extractCommunityResults(List<String> selectedIndicators, + String zone, + int width, + int height) { // Get exact list of indicators usable for this result List<String> indicators = Lists.newArrayList(getCommunityIndicators()); @@ -228,7 +222,7 @@ } }); - Map<String, Pair<File, String>> result = Maps.newHashMap(); + MultiKeyMap<String, Pair<File, String>> result = new MultiKeyMap<String, Pair<File, String>>(); for (String indicator : indicators) { @@ -254,7 +248,7 @@ width, height); - result.put(indicator, Pair.of(chartFile, rawDataText)); + result.put(zone, indicator, Pair.of(chartFile, rawDataText)); } return result; } @@ -269,17 +263,17 @@ * @param height graph height * @return maps of generated graph image (temp file) and data indexed by natural key (indicator - species) */ - public Map<String, Pair<File, String>> extractPopulationResults(List<String> selectedSpecies, - List<String> selectedIndicators, - String zone, - int width, - int height) { + public MultiKeyMap<String, Pair<File, String>> extractPopulationResults(List<String> selectedSpecies, + List<String> selectedIndicators, + String zone, + int width, + int height) { // Get exact list of species to use List<String> speciesList = Lists.newArrayList(getPopulationSpecies()); speciesList.retainAll(selectedSpecies); - Map<String, Pair<File, String>> result = Maps.newHashMap(); + MultiKeyMap<String, Pair<File, String>> result = new MultiKeyMap<String, Pair<File, String>>(); for (String species : speciesList) { @@ -309,7 +303,7 @@ width, height); - result.put(indicator + "-" + species, Pair.of(chartFile, rawDataText)); + result.put(zone, indicator + "-" + species, Pair.of(chartFile, rawDataText)); } } return result; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyPredicates.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyPredicates.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyPredicates.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -22,6 +22,7 @@ * #L% */ +import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Lists; @@ -80,6 +81,7 @@ protected final String speciesListLetter; SpeciesListPredicate(String speciesList) { + Preconditions.checkNotNull(speciesList, "SpeciesList can not be null"); this.speciesListLetter = String.valueOf(speciesList.charAt(0)); } @@ -96,6 +98,7 @@ private final List<String> speciesList; CommunitySpeciesListPredicate(List<String> speciesList) { + Preconditions.checkNotNull(speciesList, "SpeciesList can not be null"); this.speciesList = speciesList; } @@ -113,6 +116,7 @@ private final List<String> species; CommunitySpeciesPredicate(List<String> species) { + Preconditions.checkNotNull(species, "Species can not be null"); this.species = species; } @@ -130,6 +134,7 @@ private final List<String> indicator; CommunityIndicatorPredicate(List<String> indicator) { + Preconditions.checkNotNull(indicator, "Indicators can not be null"); this.indicator = indicator; } @@ -146,6 +151,7 @@ private final List<String> species; PopulationSpeciesPredicate(List<String> species) { + Preconditions.checkNotNull(species, "Species can not be null"); this.species = species; } @@ -162,6 +168,7 @@ private final List<String> indicator; PopulationIndicatorPredicate(List<String> indicator) { + Preconditions.checkNotNull(indicator, "Indicators can not be null"); this.indicator = indicator; } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/AbstractLegacyCommand.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/AbstractLegacyCommand.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/AbstractLegacyCommand.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -159,7 +159,7 @@ return result; } - protected ExtractRawDataAndResultsResult newExtractRawDataAndResultsResult(MultiKeyMap<String, File> pdfMaps, Map<String, Pair<File, String>> pdfCharts) { + protected ExtractRawDataAndResultsResult newExtractRawDataAndResultsResult(MultiKeyMap<String, File> pdfMaps, MultiKeyMap<String, Pair<File, String>> pdfCharts) { ExtractRawDataAndResultsResult result = new ExtractRawDataAndResultsResult( repository.getId(), pdfMaps, pdfCharts); return result; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/ExtractRawDataAndResultsCommand.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/ExtractRawDataAndResultsCommand.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/command/ExtractRawDataAndResultsCommand.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -25,7 +25,6 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import fr.ifremer.coser.bean.SpeciesMap; import fr.ifremer.coser.result.repository.legacy.LegacyPredicates; import fr.ifremer.coser.result.request.ExtractRawDataAndResultsRequest; @@ -62,9 +61,13 @@ public boolean accept(ExtractRawDataAndResultsRequest request) { boolean result = repository.matchExtractTypeList(request) && repository.matchZone(request); - if (result) { + if (result && repository.isMapsResult()) { + //FIXME Should we do something here? check species list... + } + if (result && repository.isIndicatorsResult()) { - if (request.getExtractTypeList().contains(DataType.POPULATION)) { + if (request.getExtractTypeList().contains(DataType.POPULATION) && + CollectionUtils.isNotEmpty(request.getPopulationIndicatorList())) { // match population indicator? Predicate<String[]> predicate = Predicates.and( @@ -75,7 +78,8 @@ if (!result) { - if (request.getExtractTypeList().contains(DataType.COMMUNITY)) { + if (request.getExtractTypeList().contains(DataType.COMMUNITY) && + CollectionUtils.isNotEmpty(request.getCommunityIndicatorList())) { // match community indicator? Predicate<String[]> predicate = Predicates.and( @@ -99,7 +103,7 @@ File extractDirectory = request.getExtractDirectory(); // les sources se retrouve dans le zip a cote du pdf - if (extractTypeList.contains(DataType.SOURCE)) { + if (extractTypeList.contains(DataType.SOURCE) && repository.isDataResult()) { if (log.isDebugEnabled()) { log.debug("Extracting sources"); } @@ -109,31 +113,38 @@ // les cartes doivent se retrouver dans le pdf MultiKeyMap<String, File> pdfMaps = null; - if (extractTypeList.contains(DataType.MAP)) { + if (extractTypeList.contains(DataType.MAP) && repository.isMapsResult()) { if (log.isDebugEnabled()) { log.debug("Extracting maps"); } - pdfMaps = new MultiKeyMap<String, File>(); - SpeciesMap speciesMap = repository.getSpeciesMap(); - String zone = repository.getZone(); - for (String species : speciesList) { - File mapFile = repository.getMapSpeciesFile(species); - String speciesName = speciesMap.getSpeciesName(species); - pdfMaps.put(zone, speciesName, mapFile); - } + pdfMaps = extractMaps(speciesList); } // les graphiques sont également dans le pdf - Map<String, Pair<File, String>> pdfCharts = null; - if (CollectionUtils.isNotEmpty(communityIndicatorList) || - CollectionUtils.isNotEmpty(populationIndicatorList)) { + MultiKeyMap<String, Pair<File, String>> pdfCharts = new MultiKeyMap<String, Pair<File, String>>(); + + if (CollectionUtils.isNotEmpty(communityIndicatorList) && repository.isIndicatorsResult()) { if (log.isDebugEnabled()) { - log.debug("Extracting charts"); + log.debug("Extracting community charts"); } - pdfCharts = extractCharts(speciesList, - communityIndicatorList, - populationIndicatorList); + + MultiKeyMap<String, Pair<File, String>> map = extractCommunityResults(communityIndicatorList, + repository.getZone(), + 650, + 430); + pdfCharts.putAll(map); } + if (CollectionUtils.isNotEmpty(populationIndicatorList) && repository.isIndicatorsResult()) { + if (log.isDebugEnabled()) { + log.debug("Extracting population charts"); + } + MultiKeyMap<String, Pair<File, String>> map = extractPopulationResults(speciesList, + populationIndicatorList, + repository.getZone(), + 650, + 430); + pdfCharts.putAll(map); + } ExtractRawDataAndResultsResult result = newExtractRawDataAndResultsResult(pdfMaps, pdfCharts); return result; } @@ -155,36 +166,22 @@ } /** - * @param species species to extract in population indicators - * @param communityIndicators community indicators to extract - * @param populationIndicators population indicators to extract - * @return charts files and their data with key: zone , indicator [- speciesName for population]) - * and value: (graphFile, graphData) + * Extract all maps for matchings species. + * + * @param speciesList list of species to extract + * @return map of map files indexed by zone - speciesName */ - protected Map<String, Pair<File, String>> extractCharts(List<String> species, - List<String> communityIndicators, - List<String> populationIndicators) { - + protected MultiKeyMap<String, File> extractMaps(List<String> speciesList) { + MultiKeyMap<String, File> pdfMaps; + pdfMaps = new MultiKeyMap<String, File>(); + SpeciesMap speciesMap = repository.getSpeciesMap(); String zone = repository.getZone(); - - Map<String, Pair<File, String>> result = Maps.newLinkedHashMap(); - - if (CollectionUtils.isNotEmpty(communityIndicators)) { - result.putAll(extractCommunityResults(communityIndicators, - zone, - 650, - 430)); + for (String species : speciesList) { + File mapFile = repository.getMapSpeciesFile(species); + String speciesName = speciesMap.getSpeciesName(species); + pdfMaps.put(zone, speciesName, mapFile); } - - if (CollectionUtils.isNotEmpty(populationIndicators)) { - result.putAll(extractPopulationResults(species, - populationIndicators, - zone, - 650, - 430)); - } - - return result; + return pdfMaps; } /** @@ -196,10 +193,10 @@ * @param height graph height * @return maps of generated graph image (temp file) and data indexed by natural key (indicator - species) */ - public Map<String, Pair<File, String>> extractCommunityResults(List<String> selectedIndicators, - String zone, - int width, - int height) { + public MultiKeyMap<String, Pair<File, String>> extractCommunityResults(List<String> selectedIndicators, + String zone, + int width, + int height) { // Get exact list of indicators usable for this result List<String> indicators = Lists.newArrayList(getCommunityIndicators()); @@ -221,7 +218,7 @@ } }); - Map<String, Pair<File, String>> result = Maps.newHashMap(); + MultiKeyMap<String, Pair<File, String>> result = new MultiKeyMap<String, Pair<File, String>>(); for (String indicator : indicators) { @@ -247,7 +244,7 @@ width, height); - result.put(indicator, Pair.of(chartFile, rawDataText)); + result.put(zone, indicator, Pair.of(chartFile, rawDataText)); } return result; } @@ -262,17 +259,17 @@ * @param height graph height * @return maps of generated graph image (temp file) and data indexed by natural key (indicator - species) */ - public Map<String, Pair<File, String>> extractPopulationResults(List<String> selectedSpecies, - List<String> selectedIndicators, - String zone, - int width, - int height) { + public MultiKeyMap<String, Pair<File, String>> extractPopulationResults(List<String> selectedSpecies, + List<String> selectedIndicators, + String zone, + int width, + int height) { // Get exact list of species to use List<String> speciesList = Lists.newArrayList(getPopulationSpecies()); speciesList.retainAll(selectedSpecies); - Map<String, Pair<File, String>> result = Maps.newHashMap(); + MultiKeyMap<String, Pair<File, String>> result = new MultiKeyMap<String, Pair<File, String>>(); for (String species : speciesList) { @@ -302,7 +299,7 @@ width, height); - result.put(indicator + "-" + species, Pair.of(chartFile, rawDataText)); + result.put(zone, indicator + "-" + species, Pair.of(chartFile, rawDataText)); } } return result; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/DeleteResultsRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/DeleteResultsRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/DeleteResultsRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -62,8 +62,8 @@ @Override public boolean isFilled() { return !(resultRepositoryType == null || - resultType == null || - CollectionUtils.isEmpty(zoneList)); + resultType == null || + CollectionUtils.isEmpty(zoneList)); } @Override Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/ExtractRawDataAndResultsRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/ExtractRawDataAndResultsRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/ExtractRawDataAndResultsRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -59,12 +59,12 @@ @Override public boolean isFilled() { - return !( - CollectionUtils.isEmpty(extractTypeList) || - CollectionUtils.isEmpty(zoneList) || - CollectionUtils.isEmpty(populationIndicatorList) || - CollectionUtils.isEmpty(communityIndicatorList) || - CollectionUtils.isEmpty(speciesList)); + return !(CollectionUtils.isEmpty(extractTypeList) || + CollectionUtils.isEmpty(zoneList) || + CollectionUtils.isEmpty(speciesList) || + (CollectionUtils.isEmpty(populationIndicatorList) && + CollectionUtils.isEmpty(communityIndicatorList)) + ); } @Override Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForExtractRawDataAndResultsRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForExtractRawDataAndResultsRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForExtractRawDataAndResultsRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -43,19 +43,12 @@ protected List<String> zoneList; - protected List<String> populationIndicatorList; - - protected List<String> communityIndicatorList; - protected List<DataType> extractTypeList; @Override public boolean isFilled() { - return !( - CollectionUtils.isEmpty(extractTypeList) || - CollectionUtils.isEmpty(zoneList) || - CollectionUtils.isEmpty(populationIndicatorList) || - CollectionUtils.isEmpty(communityIndicatorList)); + return !(CollectionUtils.isEmpty(extractTypeList) || + CollectionUtils.isEmpty(zoneList)); } @Override @@ -79,22 +72,4 @@ Preconditions.checkArgument(CollectionUtils.isNotEmpty(zoneList)); this.zoneList = zoneList; } - - public List<String> getPopulationIndicatorList() { - return populationIndicatorList; - } - - public void setPopulationIndicatorList(List<String> populationIndicatorList) { - Preconditions.checkArgument(CollectionUtils.isNotEmpty(populationIndicatorList)); - this.populationIndicatorList = populationIndicatorList; - } - - public List<String> getCommunityIndicatorList() { - return communityIndicatorList; - } - - public void setCommunityIndicatorList(List<String> communityIndicatorList) { - Preconditions.checkArgument(CollectionUtils.isNotEmpty(communityIndicatorList)); - this.communityIndicatorList = communityIndicatorList; - } } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForPopulationIndicatorResultRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForPopulationIndicatorResultRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetIndicatorsForPopulationIndicatorResultRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -45,9 +45,7 @@ @Override public boolean isFilled() { - return !(facade == null || - zone == null || - species == null); + return !(facade == null || zone == null || species == null); } @Override Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForExtractRawDataAndResultsRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForExtractRawDataAndResultsRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForExtractRawDataAndResultsRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -47,9 +47,8 @@ @Override public boolean isFilled() { - return !( - CollectionUtils.isEmpty(extractTypeList) || - CollectionUtils.isEmpty(zoneList)); + return !(CollectionUtils.isEmpty(extractTypeList) || + CollectionUtils.isEmpty(zoneList)); } @Override Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForPopulationIndicatorResultRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForPopulationIndicatorResultRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesForPopulationIndicatorResultRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -43,9 +43,7 @@ @Override public boolean isFilled() { - return !( - facade == null || - zone == null); + return !(facade == null || zone == null); } @Override Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesListForCommunityIndicatorResultRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesListForCommunityIndicatorResultRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetSpeciesListForCommunityIndicatorResultRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -45,10 +45,7 @@ @Override public boolean isFilled() { - return !( - facade == null || - zone == null || - indicator == null); + return !(facade == null || zone == null || indicator == null); } @Override Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetZonesForExtractRawDataAndResultsRequest.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetZonesForExtractRawDataAndResultsRequest.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/request/GetZonesForExtractRawDataAndResultsRequest.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -22,12 +22,8 @@ * #L% */ -import com.google.common.base.Preconditions; import fr.ifremer.coser.result.CoserRequest; -import org.apache.commons.collections4.CollectionUtils; -import java.util.List; - /** * Request to extract data. * <p/> @@ -36,26 +32,12 @@ * @author Tony Chemit <chemit@codelutin.com> * @since 1.5 */ -public class GetZonesForExtractRawDataAndResultsRequest implements CoserRequest, CoserRequestZoneListAware { +public class GetZonesForExtractRawDataAndResultsRequest implements CoserRequest { private static final long serialVersionUID = 1L; - protected List<String> zoneList; - @Override public boolean isFilled() { - return !(CollectionUtils.isEmpty(zoneList)); + return true; } - - @Override - public List<String> getZoneList() { - return zoneList; - } - - @Override - public void setZoneList(List<String> zoneList) { - Preconditions.checkArgument(CollectionUtils.isNotEmpty(zoneList)); - this.zoneList = zoneList; - } - } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/result/ExtractRawDataAndResultsResult.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/result/ExtractRawDataAndResultsResult.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/result/ExtractRawDataAndResultsResult.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -27,7 +27,6 @@ import org.apache.commons.lang3.tuple.Pair; import java.io.File; -import java.util.Map; /** * Created on 3/15/14. @@ -43,11 +42,11 @@ protected final MultiKeyMap<String, File> pdfMaps; - protected final Map<String, Pair<File, String>> pdfCharts; + protected final MultiKeyMap<String, Pair<File, String>> pdfCharts; public ExtractRawDataAndResultsResult(String source, MultiKeyMap<String, File> pdfMaps, - Map<String, Pair<File, String>> pdfCharts) { + MultiKeyMap<String, Pair<File, String>> pdfCharts) { this.source = source; this.pdfMaps = pdfMaps; this.pdfCharts = pdfCharts; @@ -59,7 +58,7 @@ } @Override - public Pair<MultiKeyMap<String, File>, Map<String, Pair<File, String>>> getResult() { + public Pair<MultiKeyMap<String, File>, MultiKeyMap<String, Pair<File, String>>> getResult() { return Pair.of(pdfMaps, pdfCharts); } } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Extracts.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Extracts.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Extracts.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -36,6 +36,7 @@ import java.io.File; import java.io.IOException; +import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Map; @@ -61,12 +62,12 @@ // merge all results MultiKeyMap<String, File> pdfMaps = new MultiKeyMap<String, File>(); - Map<String, Pair<File, String>> pdfCharts = Maps.newHashMap(); + MultiKeyMap<String, Pair<File, String>> pdfCharts = new MultiKeyMap<String, Pair<File, String>>(); for (ExtractRawDataAndResultsResult result : results) { - Pair<MultiKeyMap<String, File>, Map<String, Pair<File, String>>> repositoryResult = result.getResult(); + Pair<MultiKeyMap<String, File>, MultiKeyMap<String, Pair<File, String>>> repositoryResult = result.getResult(); MultiKeyMap<String, File> pdfMap = repositoryResult.getLeft(); - Map<String, Pair<File, String>> pdfChart = repositoryResult.getRight(); + MultiKeyMap<String, Pair<File, String>> pdfChart = repositoryResult.getRight(); if (MapUtils.isNotEmpty(pdfMap)) { pdfMaps.putAll(pdfMap); } @@ -97,7 +98,8 @@ } String filename = Reports.getDechargeFilename(locale); File dechargePDF = new File(extractDirectory, filename); - reports.generateDechargePDF(dechargePDF, locale, null, null); + Date lastDataUpdateDate = context.getConfig().getLastDataUpdateDate(); + reports.generateDechargePDF(dechargePDF, locale, lastDataUpdateDate, null); // make zip if (log.isDebugEnabled()) { Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Reports.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Reports.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/util/Reports.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -23,6 +23,9 @@ */ import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import com.itextpdf.text.DocumentException; import fr.ifremer.coser.CoserConstants; import fr.ifremer.coser.CoserTechnicalException; @@ -40,6 +43,7 @@ import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.keyvalue.MultiKey; import org.apache.commons.collections4.map.MultiKeyMap; import org.apache.commons.io.FileUtils; @@ -59,16 +63,13 @@ import java.io.OutputStream; import java.io.StringWriter; import java.io.Writer; -import java.util.ArrayList; import java.util.Collection; import java.util.Date; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.SortedSet; -import java.util.TreeSet; import static org.nuiton.i18n.I18n.l; @@ -141,8 +142,8 @@ // chargement du reftax et des code types especes pour connaitre // le type des especes de poissons // parcourt du fichier des types de données - Map<String, Integer> refTaxSpeciesNumSys = new HashMap<String, Integer>(); - Map<String, String> refTaxSpeciesName = new HashMap<String, String>(); + Map<String, Integer> refTaxSpeciesNumSys = Maps.newHashMap(); + Map<String, String> refTaxSpeciesName = Maps.newHashMap(); Iterator<String[]> itReftax = project.getRefTaxSpecies().iterator(true); while (itReftax.hasNext()) { String[] tuple = itReftax.next(); @@ -160,7 +161,7 @@ } // code type / especes - Map<String, Integer[]> specyTypes = new HashMap<String, Integer[]>(); + Map<String, Integer[]> specyTypes = Maps.newHashMap(); Iterator<String[]> itTypeSpecies = project.getTypeEspeces().iterator(true); while (itTypeSpecies.hasNext()) { // "Types";"Commentaire";"NumSys min";"NumSys max","Code" @@ -176,11 +177,11 @@ File estComIndFile = new File(resultDirectory, rsufiResult.getEstComIndName()); // donnees intermediare (map liste id > liste des indicateurs) - Map<String, SortedSet<String>> indicatorMap = new HashMap<String, SortedSet<String>>(); + Map<String, SortedSet<String>> indicatorMap = Maps.newHashMap(); // le resutat sera une map complexe // map liste id > liste des especes (nom complet) - Map<String, SortedSet<String>> speciesMap = new HashMap<String, SortedSet<String>>(); + Map<String, SortedSet<String>> speciesMap = Maps.newHashMap(); // Campagne Indicateur Liste Strate Annee Estimation EcartType CV DataStorage dataStorage = DataStorages.load(estComIndFile, CoserConstants.CSV_RESULT_SEPARATOR_CHAR); @@ -196,7 +197,7 @@ // get indicator list SortedSet<String> indicatorList = indicatorMap.get(listNumber); if (indicatorList == null) { - indicatorList = new TreeSet<String>(); + indicatorList = Sets.newTreeSet(); indicatorMap.put(listNumber, indicatorList); } @@ -223,7 +224,7 @@ } if (selectionSpeciesList != null) { - SortedSet<String> speciesList = new TreeSet<String>(); + SortedSet<String> speciesList = Sets.newTreeSet(); for (String speciesCode : selectionSpeciesList) { // get species full name @@ -257,7 +258,7 @@ // render freemarker template Template mapTemplate = freemarkerConfiguration.getTemplate("metainfo.ftl", locale); - Map<String, Object> root = new HashMap<String, Object>(); + Map<String, Object> root = Maps.newHashMap(); root.put("indicatorsMap", indicatorMap); root.put("speciesMap", speciesMap); @@ -297,9 +298,17 @@ * * @param disclamerPdf pdf file to generate * @param locale generated pdf locale + * @param updateDate last update date of results + * @param surveyName optional survey name */ - public void generateDechargePDF(File disclamerPdf, Locale locale, Date updateDate, String surveyName) { + public void generateDechargePDF(File disclamerPdf, + Locale locale, + Date updateDate, + String surveyName) { + Preconditions.checkNotNull(disclamerPdf); + Preconditions.checkNotNull(locale); + Preconditions.checkNotNull(updateDate); OutputStream os = null; try { @@ -317,9 +326,12 @@ // render freemarker template Template mapTemplate = freemarkerConfiguration.getTemplate("decharge.ftl", locale); - Map<String, Object> root = new HashMap<String, Object>(); + Map<String, Object> root = Maps.newHashMap(); root.put("updateDate", updateDate); - root.put("surveyName", surveyName); + // il se peut que pour l'extraction un fichier de décharge ne soit + // pas généré pour une campagne en particulier + // on passe un nom vide a freemarker + root.put("surveyName", surveyName == null ? "" : surveyName); Writer out = new StringWriter(); mapTemplate.process(root, out); @@ -361,12 +373,12 @@ public void generateExtractPDF(File directory, List<String> zones, MultiKeyMap<String, File> pdfMaps, - Map<String, Pair<File, String>> pdfCharts, + MultiKeyMap<String, Pair<File, String>> pdfCharts, ZoneMap zoneMap, Locale locale) { for (String zone : zones) { - Collection<File> toDelete = new ArrayList<File>(); + Collection<File> toDelete = Lists.newArrayList(); OutputStream os = null; try { @@ -376,7 +388,7 @@ htmlContent.append("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"); htmlContent.append("</head><body>"); - if (pdfMaps != null) { + if (MapUtils.isNotEmpty(pdfMaps)) { for (Map.Entry<MultiKey<? extends String>, File> mapEntry : pdfMaps.entrySet()) { String zoneId = mapEntry.getKey().getKey(0); if (zoneId.equals(zone)) { @@ -392,9 +404,9 @@ } } - if (pdfCharts != null) { - for (Map.Entry<String, Pair<File, String>> chartFileAndData : pdfCharts.entrySet()) { - String zoneId = chartFileAndData.getKey(); + if (MapUtils.isNotEmpty(pdfCharts)) { + for (MultiKeyMap.Entry<MultiKey<? extends String>, Pair<File, String>> chartFileAndData : pdfCharts.entrySet()) { + String zoneId = chartFileAndData.getKey().getKey(0); if (zoneId.equals(zone)) { File chartFile = chartFileAndData.getValue().getLeft(); String content = chartFileAndData.getValue().getRight(); Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -132,6 +132,16 @@ // --- Result methods -------------------------------------------------- // // --------------------------------------------------------------------- // + public FileResult extractRawDataAndResults(Locale locale, + ExtractRawDataAndResultsRequest request) { + + CoserRequestContext context = newRequestContext(locale); + + FileResult result = getRequestExecutor().executeUnique(context, request); + + return result; + } + public FileResult getFileResult(CoserRequest request) { CoserRequestContext context = newRequestContext(); @@ -178,29 +188,12 @@ return resultAsMap; } - /** - * Extract raw data and results. - * - * @param request extract request - */ - public FileResult extractResults(ExtractRawDataAndResultsRequest request) { - - CoserRequestContext context = newRequestContext(); - - // Get all extracted data - FileResult result = getRequestExecutor().executeUnique(context, request); - return result; - } - public void deleteResults(DeleteResultsRequest request) { CoserRequestContext context = newRequestContext(); // do delete results (don't care about result) - getRequestExecutor().executeAll(context, request); - - // reload projects - applicationContext.getRepositoryProvider().resetRepositories(); + getRequestExecutor().deleteResults(context, request); } public void registerNewUploadedResults(String login, File resultFile) { @@ -249,7 +242,10 @@ } protected CoserRequestContext newRequestContext() { - return new DefaultCoserRequestContext(applicationContext, - action.getLocale()); + return newRequestContext(action.getLocale()); } + + protected CoserRequestContext newRequestContext(Locale locale) { + return new DefaultCoserRequestContext(applicationContext, locale); + } } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/search/ExtractAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/search/ExtractAction.java 2014-03-16 18:59:34 UTC (rev 1147) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/search/ExtractAction.java 2014-03-16 19:00:12 UTC (rev 1148) @@ -199,6 +199,7 @@ GetSpeciesForExtractRawDataAndResultsRequest speciesRequest = requestBuilder(GetSpeciesForExtractRawDataAndResultsRequest.class). addZoneList(selectZones). + addExtractTypeList(selectTypes). toRequest(); species = getService().getMultipleResultAsMap(speciesRequest); @@ -290,8 +291,7 @@ addPopulationIndicatorList(selectPopIndicators). toRequest(); - resultFile = getService().getFileResult(request); - + resultFile = getService().extractRawDataAndResults(locale, request); return SUCCESS; }