r1159 - in trunk: coser-business/src/main/java/fr/ifremer/coser coser-business/src/main/java/fr/ifremer/coser/result coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy coser-business/src/main/java/fr/ifremer/coser/services coser-business/src/main/resources/i18n coser-web/src/main/java/fr/ifremer/coser/web coser-web/src/main/java/fr/ifremer/coser/web/actions/admin coser-web/src/main/java/fr/ifremer/co
Author: tchemit Date: 2014-03-19 11:56:06 +0100 (Wed, 19 Mar 2014) New Revision: 1159 Url: http://forge.codelutin.com/projects/coser/repository/revisions/1159 Log: refs-50 #4753 Publier des r?\195?\169sultats de type EchoBase et RSufi sur le site des indicateurs Added: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserMainRepositoryProvider.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestBuilder.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBaseResultRepository.java trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyResultRepository.java trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties trunk/coser-web/src/main/java/fr/ifremer/coser/web/CoserWebApplicationContext.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/admin/ListProjectsAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDataAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDownloadAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonIndicator.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonZone.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/MapDataAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/SpeciesAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDataAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDownloadAction.java trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/SpeciesAction.java 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/source/SourceDataAction.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/CoserBusinessConfig.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -26,8 +26,10 @@ import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.net.URL; import java.util.Date; import java.util.List; @@ -283,6 +285,35 @@ return dataUpdateDate; } + /** + * Met à jour certaines proprietes apres la mise à jour des données. + * + * @since 1.5 + */ + public void updateDataProperties() { + + File webProperties = getWebPropertiesFile(); + + Properties props = new Properties(); + InputStream iStream = null; + OutputStream oStream = null; + try { + if (webProperties.isFile()) { + iStream = new FileInputStream(webProperties); + props.load(iStream); + } + + props.setProperty("updateDate", String.valueOf(new Date().getTime())); + oStream = new FileOutputStream(webProperties); + props.store(oStream, "Update data"); + } catch (IOException ex) { + throw new CoserTechnicalException("Can't save properties file", ex); + } finally { + IOUtils.closeQuietly(iStream); + IOUtils.closeQuietly(oStream); + } + } + public static enum CoserBusinessOption implements ConfigOptionDef { DATABASE_DIRECTORY("coser.database.directory", t("coser.config.database.directory.description"), File.class, "${user.home}" + File.separator + "coser"), Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserMainRepositoryProvider.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserMainRepositoryProvider.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserMainRepositoryProvider.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -32,6 +32,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Collections; import java.util.Set; /** @@ -75,9 +76,13 @@ public CoserMainRepositoryProvider(Set<ResultRepositoryProvider<?>> repositoryProviders) { Preconditions.checkNotNull(repositoryProviders); - this.repositoryProviders = repositoryProviders; + this.repositoryProviders = Collections.unmodifiableSet(repositoryProviders); } + public Set<ResultRepositoryProvider<?>> getRepositoryProviders() { + return repositoryProviders; + } + public void resetRepositories() { repositories = null; } @@ -85,12 +90,14 @@ public Set<ResultRepository> getResultRepositories() { if (repositories == null) { Set<String> ids = Sets.newHashSet(); - repositories = Sets.newHashSet(); + Set<ResultRepository> resultRepositories = Sets.newHashSet(); for (ResultRepositoryProvider<?> repositoryProvider : repositoryProviders) { Set<ResultRepository> repos = loadFromRepositoryProvider(repositoryProvider, ids); - repositories.addAll(repos); + resultRepositories.addAll(repos); } + + repositories = Collections.unmodifiableSet(resultRepositories); if (log.isInfoEnabled()) { log.info("Found " + repositories.size() + " result repository(ies)."); } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestBuilder.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestBuilder.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestBuilder.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -25,6 +25,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import fr.ifremer.coser.CoserTechnicalException; +import fr.ifremer.coser.result.request.CopyRepositoryRequest; import fr.ifremer.coser.result.request.CoserRequestExtractTypeListAware; import fr.ifremer.coser.result.request.CoserRequestFacadeAware; import fr.ifremer.coser.result.request.CoserRequestIndicatorAware; @@ -37,6 +38,7 @@ import fr.ifremer.coser.util.DataType; import org.apache.commons.collections4.CollectionUtils; +import java.io.File; import java.util.List; import java.util.Locale; import java.util.Map; @@ -83,6 +85,9 @@ protected static final String PARAMETER_EXTRACT_TYPE_LIST = "extractTypeList"; + + protected static final String PARAMETER_TARGET_DIRECTORY = "targetDirectory"; + /** * Locale to inject in request. */ @@ -166,6 +171,11 @@ return this; } + public CoserRequestBuilder<R> addTargetDirectory(File targetDirectory) { + parameters.put(PARAMETER_TARGET_DIRECTORY, targetDirectory); + return this; + } + public R toRequest() { try { R request = requestType.newInstance(); @@ -178,6 +188,7 @@ flushCoserRequestRepositoryResultTypeAware(request); flushCoserRequestExtractTypeListAware(request); flushExtractRawDataAndResultsRequest(request); + flushCopyRepositoryRequest(request); return request; } catch (InstantiationException e) { throw new CoserTechnicalException(e); @@ -186,6 +197,17 @@ } } + protected void flushCopyRepositoryRequest(R request) { + if (request instanceof CopyRepositoryRequest) { + CopyRepositoryRequest r = (CopyRepositoryRequest) request; + + File targetDirectory = getParam(PARAMETER_TARGET_DIRECTORY); + if (targetDirectory != null) { + r.setTargetDirectory(targetDirectory); + } + } + } + protected void flushExtractRawDataAndResultsRequest(R request) { if (request instanceof ExtractRawDataAndResultsRequest) { ExtractRawDataAndResultsRequest r = (ExtractRawDataAndResultsRequest) request; 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-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/CoserRequestExecutor.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -24,18 +24,22 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; 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 fr.ifremer.coser.result.result.MapResult; +import fr.ifremer.coser.result.result.VoidResult; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -60,11 +64,26 @@ */ protected final CoserCommandFactory commandFactory; - public CoserRequestExecutor(CoserApplicationContext applicationContext) { + protected FileResult fileResult; + + protected List<CoserResult> multipleResults; + + protected MapResult mapResult; + + protected VoidResult voidResult; + + public CoserRequestExecutor(CoserApplicationContext applicationContext, + CoserMainRepositoryProvider repositoryProvider) { + Preconditions.checkNotNull(applicationContext); + Preconditions.checkNotNull(repositoryProvider); this.commandFactory = applicationContext.getCommandFactory(); - this.repositoryProvider = applicationContext.getRepositoryProvider(); + this.repositoryProvider = repositoryProvider; } + // --------------------------------------------------------------------- // + // --- Execute API ----------------------------------------------------- // + // --------------------------------------------------------------------- // + /** * Extract some raw data and results from repositories and assembly them as an archive. * @@ -85,12 +104,12 @@ } // Get all extracted stuff from matching repositories - List repositoryResults = executeAll(context, request); + executeAll(context, request); File file = context.getExtracts().assemblyExtractResult(context, extractDirectory, request.getZoneList(), - repositoryResults); + (List) multipleResults); FileResult result = new FileResult("ALL", file); return result; } @@ -106,7 +125,7 @@ * @param request request to execute * @return the unique result */ - public CoserResult executeUnique(CoserRequestContext context, CoserRequest request) { + public CoserRequestExecutor executeUnique(CoserRequestContext context, CoserRequest request) { Preconditions.checkNotNull(request); Preconditions.checkArgument(request.isFilled(), "Request " + request + " is not filled."); @@ -123,8 +142,18 @@ ResultRepository repository = repositories.get(0); + // execute CoserResult result = execute(context, repository, request); - return result; + + // 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; } public void deleteResults(CoserRequestContext context, @@ -146,7 +175,7 @@ * @param request request to execute * @return the list of result (one by each result repository). */ - public List<CoserResult> executeAll(CoserRequestContext context, CoserRequest request) { + public CoserRequestExecutor executeAll(CoserRequestContext context, CoserRequest request) { Preconditions.checkNotNull(request); Preconditions.checkArgument(request.isFilled(), "Request " + request + " is not filled."); @@ -161,9 +190,55 @@ result.add(repositoryResult); } - return result; + this.multipleResults = result; + + return this; } + // --------------------------------------------------------------------- // + // --- Result API ------------------------------------------------------ // + // --------------------------------------------------------------------- // + + public MapResult toMapResult() { + if (mapResult == null) { + throw new CoserTechnicalException("No MapResult found"); + } + return mapResult; + } + + public FileResult toFileResult() { + if (fileResult == null) { + throw new CoserTechnicalException("No FileResult found"); + } + return fileResult; + } + + public <Result extends CoserResult> List<Result> toMultipleResult(Class<Result> resultType) { + if (multipleResults == null) { + throw new CoserTechnicalException("No MultipleResult found"); + } + for (CoserResult coserResult : multipleResults) { + if (!(resultType.isAssignableFrom(coserResult.getClass()))) { + throw new CoserTechnicalException( + "Result should a " + resultType + ", but was: " + coserResult.getClass()); + } + } + return (List<Result>) multipleResults; + } + + public Map<String, String> toMap() { + List<MapResult> mapResults = toMultipleResult(MapResult.class); + Map<String, String> resultAsMap = Maps.newHashMap(); + for (MapResult map : mapResults) { + resultAsMap.putAll(map.getResult()); + } + return resultAsMap; + } + + // --------------------------------------------------------------------- // + // --- Internal Methods ------------------------------------------------ // + // --------------------------------------------------------------------- // + protected List<ResultRepository> getMatchingRepositories(CoserRequestContext context, CoserRequest request) { List<ResultRepository> result = Lists.newArrayList(); Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBaseResultRepository.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBaseResultRepository.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/echobase/EchoBaseResultRepository.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -196,7 +196,7 @@ public boolean matchExtractTypeList(CoserRequestExtractTypeListAware request) { boolean result = false; if (isMapsResult()) { - result = request.getExtractTypeList().contains(DataType.SOURCE); + result = request.getExtractTypeList().contains(DataType.MAP); } else if (isIndicatorsResult()) { result = request.getExtractTypeList().contains(DataType.POPULATION) || request.getExtractTypeList().contains(DataType.COMMUNITY); Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyResultRepository.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyResultRepository.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/result/repository/legacy/LegacyResultRepository.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -264,7 +264,7 @@ public boolean matchExtractTypeList(CoserRequestExtractTypeListAware request) { boolean result = false; if (isMapsResult()) { - result = request.getExtractTypeList().contains(DataType.SOURCE); + result = request.getExtractTypeList().contains(DataType.MAP); } else if (isIndicatorsResult()) { result = request.getExtractTypeList().contains(DataType.POPULATION) || request.getExtractTypeList().contains(DataType.COMMUNITY); Added: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java (rev 0) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -0,0 +1,754 @@ +package fr.ifremer.coser.services; + +/* + * #%L + * Coser :: Business + * %% + * Copyright (C) 2010 - 2014 Ifremer, Codelutin, Chemit Tony + * %% + * 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% + */ + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import fr.ifremer.coser.CoserApplicationContext; +import fr.ifremer.coser.CoserBusinessConfig; +import fr.ifremer.coser.CoserBusinessException; +import fr.ifremer.coser.CoserConstants; +import fr.ifremer.coser.CoserTechnicalException; +import fr.ifremer.coser.CoserUtils; +import fr.ifremer.coser.bean.Project; +import fr.ifremer.coser.bean.RSufiResult; +import fr.ifremer.coser.bean.Selection; +import fr.ifremer.coser.bean.ZoneMap; +import fr.ifremer.coser.result.CoserMainRepositoryProvider; +import fr.ifremer.coser.result.CoserRequest; +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.ResultRepositoryProvider; +import fr.ifremer.coser.result.repository.ResultRepositoryType; +import fr.ifremer.coser.result.repository.echobase.EchoBaseResultRepositoryProvider; +import fr.ifremer.coser.result.repository.echobase.EchoBaseResultRepositoryType; +import fr.ifremer.coser.result.repository.legacy.LegacyResultRepositoryProvider; +import fr.ifremer.coser.result.repository.legacy.LegacyResultRepositoryType; +import fr.ifremer.coser.result.request.CopyRepositoryRequest; +import fr.ifremer.coser.result.request.DeleteResultsRequest; +import fr.ifremer.coser.result.request.ExtractRawDataAndResultsRequest; +import fr.ifremer.coser.result.request.GetResultNameRequest; +import fr.ifremer.coser.result.result.ExtractRawDataAndResultsResult; +import fr.ifremer.coser.result.result.FileResult; +import fr.ifremer.coser.result.util.Extracts; +import fr.ifremer.coser.util.DataType; +import fr.ifremer.coser.util.io.MultipleFileFilter; +import fr.ifremer.coser.util.io.OneRSufiResultFileFilter; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.MultiPartEmail; +import org.nuiton.util.FileUtil; +import org.nuiton.util.ZipUtil; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import static org.nuiton.i18n.I18n.t; + +/** + * Service to be used only by the web server to manage results. + * <p/> + * Created on 3/18/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 1.5 + */ +public class WebResultService { + + /** Logger. */ + private static final Log log = LogFactory.getLog(WebResultService.class); + + protected final CoserApplicationContext applicationContext; + + public WebResultService(CoserApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + // --------------------------------------------------------------------- // + // --- Public API ------------------------------------------------------ // + // --------------------------------------------------------------------- // + + public CoserRequestContext newRequestContext(Locale locale) { + return new DefaultCoserRequestContext(applicationContext, locale); + } + + public CoserRequestExecutor executeUnique(CoserRequestContext context, CoserRequest request) { + CoserRequestExecutor executor = executeUnique(getInternalRepositoryProvider(), context, request); + return executor; + } + + public CoserRequestExecutor executeAll(CoserRequestContext context, CoserRequest request) { + CoserRequestExecutor executor = executeAll(getInternalRepositoryProvider(), context, request); + return executor; + } + + /** + * Extract some raw data and results from repositories and assembly them as an archive. + * + * @param context request context + * @param request extract request + * @return the file result containing the archive + */ + public FileResult extractRawDataAndResults(CoserRequestContext context, + ExtractRawDataAndResultsRequest request) { + + File extractDirectory = new File(context.getTemporaryDirectory(), "Indicateurs_Ifremer"); + request.setExtractDirectory(extractDirectory); + + try { + FileUtils.forceMkdir(extractDirectory); + } catch (IOException e) { + throw new CoserTechnicalException("Could not create directory: " + extractDirectory, e); + } + + // Get all extracted stuff from matching repositories + List<ExtractRawDataAndResultsResult> multipleResults = + executeAll(getInternalRepositoryProvider(), context, request). + toMultipleResult(ExtractRawDataAndResultsResult.class); + + File file = getExtracts().assemblyExtractResult(context, + extractDirectory, + request.getZoneList(), + multipleResults); + FileResult result = new FileResult("ALL", file); + return result; + } + + public void deleteResults(CoserRequestContext context, + DeleteResultsRequest request) { + + // do delete results (don't care about result) + executeAll(getInternalRepositoryProvider(), context, request); + + // reload projects + getInternalRepositoryProvider().resetRepositories(); + } + + public void resetRepositories() { + applicationContext.getRepositoryProvider().resetRepositories(); + } + + public Map<String, ResultRepositoryType> getRepositoryTypes() { + Map<String, ResultRepositoryType> result = Maps.newHashMap(); + for (ResultRepositoryType resultRepositoryType : applicationContext.getRepositoryTypes()) { + result.put(resultRepositoryType.getId(), resultRepositoryType); + } + return result; + } + + /** + * Traite le fichier uploade par l'application client et l'enregistre + * dans le stockage coté web. + * <p/> + * Le nouveau fichier uploadé est mergé avec l'ancien, c'est à dire: + * <ul> + * <li>dezipage dans un fichier temporaire + * <li>recuperation des noms de zones des nouveau fichiers (par type, carte/indicateur) + * <li>suppression dans l'ancien répertoire des resultats deja presents dans le nouveau (pour les conflits zone) + * <li>suppression des selections vides + * <li>suppression des projets vides + * <li>copie (avec ecrasement) des nouveaux fichiers dans l'ancien répertoire + * mais seulement pour ceux des zones concernés (partie difficile) + * </ul> + * <p/> + * TODO chatellier 20110125 l'algorithme n'est pour l'instant pas performant + * et contient pas mal de code dupliqué, mais pour la v1.0 ca ira. + * + * @param login user login + * @param archiveFile uploaded file + */ + public void registerNewUploadedResults(CoserRequestContext context, + String login, + File archiveFile) { + File tempDirectory; + + // dezipage dans un fichier temporaire + try { + tempDirectory = FileUtil.createTempDirectory("coser-upload-", "-tmp"); + ZipUtil.uncompress(archiveFile, tempDirectory); + } catch (IOException e) { + throw new CoserTechnicalException("Can't uncompress archive", e); + } + + NewUploadContext uploadContext = new NewUploadContext(context); + + // recuperer les resultats actuels pour le mail de mise à jour + GetResultNameRequest indicatorsRequest = + requestBuilder(context, GetResultNameRequest.class). + addExtractTypeList(Lists.newArrayList(DataType.COMMUNITY, DataType.POPULATION)).toRequest(); + + GetResultNameRequest mapsRequest = + requestBuilder(context, GetResultNameRequest.class). + addExtractTypeList(Lists.newArrayList(DataType.MAP)). + toRequest(); + + GetResultNameRequest rawDataRequest = + requestBuilder(context, GetResultNameRequest.class). + addExtractTypeList(Lists.newArrayList(DataType.SOURCE)). + toRequest(); + + // recuperer les resultats actuels pour le mail de mise à jour + Map<String, String> indicatorResults = executeAll(getInternalRepositoryProvider(), context, indicatorsRequest).toMap(); + Map<String, String> mapsResults = executeAll(getInternalRepositoryProvider(), context, mapsRequest).toMap(); + Map<String, String> dataResults = executeAll(getInternalRepositoryProvider(), context, rawDataRequest).toMap(); + + uploadContext.indicatorResults.putAll(indicatorResults); + uploadContext.mapsResults.putAll(mapsResults); + uploadContext.dataResults.putAll(dataResults); + + // merge rsufi results + File rsufiDirectory = new File(tempDirectory, LegacyResultRepositoryType.ID); + try { + registerNewUploadedResultsForRSufi(uploadContext, + rsufiDirectory, + indicatorsRequest, + mapsRequest, + rawDataRequest); + } catch (CoserBusinessException e) { + throw new CoserTechnicalException("Could not merge rsufi results", e); + } catch (IOException e) { + throw new CoserTechnicalException("Could not merge rsufi results", e); + } + + // merge echobase results + File echobaseDirectory = new File(tempDirectory, EchoBaseResultRepositoryType.ID); + registerNewUploadedResultsForEchoBase(uploadContext, + echobaseDirectory, + indicatorsRequest, + mapsRequest, + rawDataRequest); + + // update data date + getConfig().updateDataProperties(); + + // reload projects + applicationContext.getRepositoryProvider().resetRepositories(); + + // send email notification + generatedAndSendNewResultNotifications(login, uploadContext); + + // delete temp directory + try { + FileUtils.deleteDirectory(tempDirectory); + } catch (IOException e) { + throw new CoserTechnicalException("Can't delete directory", e); + } + } + + // --------------------------------------------------------------------- // + // --- Internal methods ------------------------------------------------ // + // --------------------------------------------------------------------- // + + protected void registerNewUploadedResultsForEchoBase(NewUploadContext uploadContext, + File basedir, + GetResultNameRequest indicatorsRequest, + GetResultNameRequest mapsRequest, + GetResultNameRequest rawDataRequest) { + + // Creation d'un repository provider + EchoBaseResultRepositoryProvider provider = new EchoBaseResultRepositoryProvider(basedir); + CoserMainRepositoryProvider mainRepositoryProvider = + new CoserMainRepositoryProvider(Sets.<ResultRepositoryProvider<?>>newHashSet(provider)); + + CoserRequestContext context = uploadContext.context; + + // recuperation des noms zone des nouveau fichiers + Map<String, String> indicatorsResultZoneIds = executeAll(mainRepositoryProvider, context, indicatorsRequest).toMap(); + Map<String, String> mapsResultZoneIds = executeAll(mainRepositoryProvider, context, mapsRequest).toMap(); + Map<String, String> dataResultZoneIds = executeAll(mainRepositoryProvider, context, rawDataRequest).toMap(); + + // toutes les zones qui existent + Set<String> existingZones = Sets.newHashSet(); + existingZones.addAll(uploadContext.indicatorResults.keySet()); + existingZones.addAll(uploadContext.mapsResults.keySet()); + existingZones.addAll(uploadContext.dataResults.keySet()); + + // toutes les zones a ajouter + Set<String> zonesToImport = Sets.newHashSet(); + zonesToImport.addAll(indicatorsResultZoneIds.keySet()); + zonesToImport.addAll(mapsResultZoneIds.keySet()); + zonesToImport.addAll(dataResultZoneIds.keySet()); + + // toutes les zones a supprimer (avant ajout) + List<String> zonesToDelete = Lists.newArrayList(zonesToImport); + zonesToDelete.retainAll(existingZones); + + // suppression des results deja existants + DeleteResultsRequest deleteRequest = requestBuilder(context, DeleteResultsRequest.class). + addZoneList(zonesToDelete). + toRequest(); + executeAll(mainRepositoryProvider, context, deleteRequest); + + // ajout des nouvelles zones + CopyRepositoryRequest addRequest = requestBuilder(context, CopyRepositoryRequest.class). + addZoneList(zonesToDelete). + addTargetDirectory(getConfig().getWebEchobaseProjectsDirectory()). + toRequest(); + executeAll(mainRepositoryProvider, context, addRequest); + + // mise a jour du context + uploadContext.indicatorsResultZoneIds.putAll(indicatorsResultZoneIds); + uploadContext.mapsResultZoneIds.putAll(mapsResultZoneIds); + uploadContext.dataResultZoneIds.putAll(dataResultZoneIds); + } + + protected void registerNewUploadedResultsForRSufi(NewUploadContext uploadContext, + File tempDirectory, + GetResultNameRequest indicatorsRequest, + GetResultNameRequest mapsRequest, + GetResultNameRequest rawDataRequest) throws CoserBusinessException, IOException { + + // Creation d'un repository provider + LegacyResultRepositoryProvider provider = new LegacyResultRepositoryProvider(getConfig(), tempDirectory); + CoserMainRepositoryProvider mainRepositoryProvider = new CoserMainRepositoryProvider(Sets.<ResultRepositoryProvider<?>>newHashSet(provider)); + + ProjectService projectService = new ProjectService(getConfig()); + + File projectsDirectory = getConfig().getWebIndicatorsProjectsDirectory(); + File mapsDirectory = getConfig().getWebMapsProjectsDirectory(); + + CoserRequestContext context = uploadContext.context; + + // suppression des resultats qui ont été envoyé mais + // ne sont ni maps result, ni indicator result + Map<String, String> noIndicatorsResultZoneIds = getZonesIds(projectService, tempDirectory, false, null, null); + cleanCurrentProjectDirectory(projectService, projectsDirectory, noIndicatorsResultZoneIds.keySet()); + Map<String, String> noMapsResultZoneIds = getZonesIds(projectService, tempDirectory, null, false, null); + cleanCurrentProjectDirectory(projectService, mapsDirectory, noMapsResultZoneIds.keySet()); + Map<String, String> noDataResultZoneIds = getZonesIds(projectService, tempDirectory, null, null, false); + + // recuperation des noms zone des nouveau fichiers + Map<String, String> indicatorsResultZoneIds = executeAll(mainRepositoryProvider, context, indicatorsRequest).toMap(); + Map<String, String> mapsResultZoneIds = executeAll(mainRepositoryProvider, context, mapsRequest).toMap(); + Map<String, String> dataResultZoneIds = executeAll(mainRepositoryProvider, context, rawDataRequest).toMap(); + + // suppression des resultats a reimporter + cleanCurrentProjectDirectory(projectService, projectsDirectory, indicatorsResultZoneIds.keySet()); + cleanCurrentProjectDirectory(projectService, mapsDirectory, mapsResultZoneIds.keySet()); + + // import des nouveaux resultats + + FileFilter indicatorsFileFilter = getCopyFileFilter(projectService, tempDirectory, false); + CoserUtils.customCopyDirectory(tempDirectory, projectsDirectory, indicatorsFileFilter); + + // creation du filter qui copiera juste ce qu'il faut + FileFilter mapsFileFilter = getCopyFileFilter(projectService, tempDirectory, true); + CoserUtils.customCopyDirectory(tempDirectory, mapsDirectory, mapsFileFilter); + + // mise a jour du context + uploadContext.noIndicatorsResultZoneIds.putAll(noIndicatorsResultZoneIds); + uploadContext.noMapsResultZoneIds.putAll(noMapsResultZoneIds); + uploadContext.noDataResultZoneIds.putAll(noDataResultZoneIds); + uploadContext.indicatorsResultZoneIds.putAll(indicatorsResultZoneIds); + uploadContext.mapsResultZoneIds.putAll(mapsResultZoneIds); + uploadContext.dataResultZoneIds.putAll(dataResultZoneIds); + } + + protected void generatedAndSendNewResultNotifications(String login, + NewUploadContext uploadContext) { + + // generate email content + StringBuilder content = new StringBuilder(); + + ZoneMap zoneMap = getZoneMap(); + int count = 0; + String endOfLine = "\n"; + content.append(t("coser.business.notificationmail.mapsresults")).append(endOfLine); + for (Map.Entry<String, String> noMapsResultZoneId : uploadContext.noMapsResultZoneIds.entrySet()) { + if (uploadContext.mapsResults.containsValue(noMapsResultZoneId.getValue())) { + content.append(" - ").append(t("coser.business.notificationmail.deleted", + zoneMap.getZoneFullName(noMapsResultZoneId.getKey()), + noMapsResultZoneId.getValue())).append(endOfLine); + count++; + } + } + for (Map.Entry<String, String> mapsResultZoneId : uploadContext.mapsResultZoneIds.entrySet()) { + if (!uploadContext.mapsResults.containsValue(mapsResultZoneId.getValue())) { + content.append(" - ").append(t("coser.business.notificationmail.added", + zoneMap.getZoneFullName(mapsResultZoneId.getKey()), + mapsResultZoneId.getValue())).append(endOfLine); + count++; + } + } + content.append(endOfLine); + + content.append(t("coser.business.notificationmail.indicatorsresults")).append(endOfLine); + for (Map.Entry<String, String> noIndicatorsResultZoneId : uploadContext.noIndicatorsResultZoneIds.entrySet()) { + if (uploadContext.indicatorResults.containsValue(noIndicatorsResultZoneId.getValue())) { + content.append(" - ").append(t("coser.business.notificationmail.deleted", + zoneMap.getZoneFullName(noIndicatorsResultZoneId.getKey()), + noIndicatorsResultZoneId.getValue())).append(endOfLine); + count++; + } + + } + for (Map.Entry<String, String> indicatorsResultZoneId : uploadContext.indicatorsResultZoneIds.entrySet()) { + if (!uploadContext.indicatorResults.containsValue(indicatorsResultZoneId.getValue())) { + content.append(" - ").append(t("coser.business.notificationmail.added", + zoneMap.getZoneFullName(indicatorsResultZoneId.getKey()), + indicatorsResultZoneId.getValue())).append(endOfLine); + count++; + } + } + content.append(endOfLine); + + content.append(t("coser.business.notificationmail.dataresults")).append(endOfLine); + for (Map.Entry<String, String> noDataResultZoneId : uploadContext.noDataResultZoneIds.entrySet()) { + if (uploadContext.dataResults.containsValue(noDataResultZoneId.getValue())) { + content.append(" - ").append(t("coser.business.notificationmail.deleted", + zoneMap.getZoneFullName(noDataResultZoneId.getKey()), + noDataResultZoneId.getValue())).append(endOfLine); + count++; + } + } + + for (Map.Entry<String, String> dataResultZoneId : uploadContext.dataResultZoneIds.entrySet()) { + if (!uploadContext.dataResults.containsValue(dataResultZoneId.getValue())) { + content.append(" - ").append(t("coser.business.notificationmail.added", + zoneMap.getZoneFullName(dataResultZoneId.getKey()), + dataResultZoneId.getValue())).append(endOfLine); + count++; + } + } + content.append(endOfLine); + + // send notification mails + sendNewResultNotifications(login, count, content.toString()); + } + + protected CoserRequestExecutor executeUnique(CoserMainRepositoryProvider repositoryProvider, + CoserRequestContext context, + CoserRequest request) { + CoserRequestExecutor executor = new CoserRequestExecutor(applicationContext, repositoryProvider); + executor.executeUnique(context, request); + return executor; + } + + protected CoserRequestExecutor executeAll(CoserMainRepositoryProvider repositoryProvider, + CoserRequestContext context, + CoserRequest request) { + CoserRequestExecutor executor = new CoserRequestExecutor(applicationContext, repositoryProvider); + executor.executeAll(context, request); + return executor; + } + + protected <R extends CoserRequest> CoserRequestBuilder<R> requestBuilder(CoserRequestContext context, + Class<R> requestType) { + return CoserRequestBuilder.newBuilder(context.getLocale(), requestType); + } + + protected CoserBusinessConfig getConfig() { + return applicationContext.getConfig(); + } + + protected ZoneMap getZoneMap() { + return applicationContext.getZoneMap(); + } + + protected Extracts getExtracts() { + return applicationContext.getExtracts(); + } + + protected CoserMainRepositoryProvider getInternalRepositoryProvider() { + return applicationContext.getRepositoryProvider(); + } + + class NewUploadContext { + + final CoserRequestContext context; + + // existing zones for indicator results + Map<String, String> indicatorResults = Maps.newHashMap(); + + // existing zones for map results + Map<String, String> mapsResults = Maps.newHashMap(); + + // existing zones for raw data results + Map<String, String> dataResults = Maps.newHashMap(); + + // incoming zones for not indicator results + Map<String, String> noIndicatorsResultZoneIds = Maps.newHashMap(); + + // incoming zones for not map results + Map<String, String> noMapsResultZoneIds = Maps.newHashMap(); + + // incoming zones for not raw data results + Map<String, String> noDataResultZoneIds = Maps.newHashMap(); + + // incoming zones for indicator results + Map<String, String> indicatorsResultZoneIds = Maps.newHashMap(); + + // incoming zones for map results + Map<String, String> mapsResultZoneIds = Maps.newHashMap(); + + // incoming zones for raw data results + Map<String, String> dataResultZoneIds = Maps.newHashMap(); + + NewUploadContext(CoserRequestContext context) { + this.context = context; + } + } + + // --------------------------------------------------------------------- // + // --- Duplicate code from WebService ---------------------------------- // + // --------------------------------------------------------------------- // + + /** + * Envoi un mail de notification apres la publication des resultat à la + * liste des adresses email renseignées dans la configuration. + * + * @param login user login + * @param count updated data count + * @param detail body mail detail + */ + protected void sendNewResultNotifications(String login, int count, String detail) { + List<String> emails = getConfig().getNewResultNotificationList(); + + for (String email : emails) { + try { + MultiPartEmail emailPart = new MultiPartEmail(); + emailPart.setHostName(getConfig().getSmtpHost()); + emailPart.addTo(email); + emailPart.setFrom("noreply-coser@ifremer.fr", "Coser"); + emailPart.setSubject(t("coser.business.notificationmail.subject", count)); + emailPart.setContent(t("coser.business.notificationmail.body", login, detail), "text/plain; charset=ISO-8859-9"); + + // send mail + emailPart.send(); + } catch (EmailException ex) { + if (log.isErrorEnabled()) { + log.error("Can't send mail", ex); + } + } + } + } + + /** + * Fait le menage dans le dossier courant des projets en supprimant + * tout les resulat qui ont un result id present dans la liste + * {@code newResultIds}. + * <p/> + * Supprime egalement les selections qui n'ont plus de résultats et + * les projets qui n'ont plus de selection. + * + * @param projectService service to load project + * @param projectsDirectory projectsDirectory + * @param newResultIds new ids + * @throws CoserBusinessException + */ + protected void cleanCurrentProjectDirectory(ProjectService projectService, + File projectsDirectory, + Collection<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); + } + } + + /** + * Retourne un file filter qui ne copiera que les dossiers resultat + * correspondant au type demandé. Pour un resultat, le filtre devra + * egalement copier les dossiers projet et selection correspondants. + * + * @param projectService service to load project + * @param scanDirectory directory containing result to copy + * @param mapResults result type to get + * @return aggragated file filter + * @throws CoserBusinessException + */ + protected FileFilter getCopyFileFilter(ProjectService projectService, + File scanDirectory, + boolean mapResults) throws CoserBusinessException { + + MultipleFileFilter aggregateFileFilter = new MultipleFileFilter(); + + File[] projectFiles = scanDirectory.listFiles(); + if (projectFiles != null) { + for (File projectFile : projectFiles) { + if (projectFile.isDirectory()) { + + File selectionsDirectory = new File(projectFile, CoserConstants.STORAGE_SELECTION_DIRECTORY); + File[] selectionFiles = selectionsDirectory.listFiles(); + if (selectionFiles != null) { + for (File selectionFile : selectionFiles) { + if (selectionFile.isDirectory()) { + + File resultsDirectory = new File(selectionFile, CoserConstants.STORAGE_RESULTS_DIRECTORY); + File[] resultFiles = resultsDirectory.listFiles(); + if (resultFiles != null) { + for (File resultFile : resultFiles) { + if (resultFile.isDirectory()) { + RSufiResult rsufiResult = projectService.getRSufiResult(resultFile); + + // return result depending on result type + if ((mapResults && rsufiResult.isMapsResult()) || + (!mapResults && rsufiResult.isIndicatorsResult())) { + + Project p = new Project(projectFile.getName()); + Selection s = new Selection(selectionFile.getName()); + + OneRSufiResultFileFilter resultFileFilter = new OneRSufiResultFileFilter(scanDirectory, p, s, rsufiResult, true); + aggregateFileFilter.add(resultFileFilter); + } + } + } + } + } + } + } + } + } + } + + return aggregateFileFilter; + } + + /** + * Recupere dans un repertoire donné, les zoneid des resultat avec + * pour chaque id, le nom du projet associé. + * <p/> + * Les boolean sont des grands {@code Boolean} car si la valeur + * est {@code null}, on ne tient pas compte du critere lors de la recherche. + * + * @param projectService service to load project + * @param scanDirectory le repertoire a scanner + * @param indicatorResults if true get indicator results + * @param mapResults if true get map results + * @param dataResults if true get data allowed result + * @return une map de resultid/nom visuel des projets + * @throws CoserBusinessException + */ + protected Map<String, String> getZonesIds(ProjectService projectService, + File scanDirectory, + Boolean indicatorResults, + Boolean mapResults, + Boolean dataResults) throws CoserBusinessException { + + Map<String, String> resultIds = new HashMap<String, 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); + + // return result depending on result type + if ((indicatorResults == null || rsufiResult.isIndicatorsResult() == indicatorResults) + && + (mapResults == null || rsufiResult.isMapsResult() == mapResults) + && + (dataResults == null || rsufiResult.isDataAllowed() == dataResults)) { + String resultResultId = rsufiResult.getZone(); + if (StringUtils.isNotBlank(resultResultId)) { + String resultPath = projectFile.getName() + "/" + + selectionFile.getName() + "/" + + resultFile.getName(); + resultIds.put(resultResultId, resultPath); + } + } + } + } + } + } + } + } + } + } + } + + return resultIds; + } +} Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/services/WebResultService.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties =================================================================== --- trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties 2014-03-19 10:56:06 UTC (rev 1159) @@ -149,6 +149,7 @@ coser.business.result.repository.type.legacy=RSufi results coser.business.result.rsufiResultAlreadyExists=Result %s already exists \! coser.business.resultupload.duplicatedresult=Result %s/%s/%s duplicate another result for zone %s \! +coser.business.resultupload.duplicatedresult2=Result %s duplicate another result for zone %s \! coser.business.rsufi.community.header=Survey,Index,Species,Stratum,Year,Estimate,StandardDeviation,CV coser.business.rsufi.population.header=Survey,Index,List,Species,Stratum,Year,Estimate,StandardDeviation,CV coser.business.selection.notValidatedControl=Not validated control \! Modified: trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties =================================================================== --- trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties 2014-03-19 10:56:06 UTC (rev 1159) @@ -149,6 +149,7 @@ coser.business.result.repository.type.legacy=Résultats RSufi coser.business.result.rsufiResultAlreadyExists=Le résultat %s existe déjà \! coser.business.resultupload.duplicatedresult=Le résultat %s/%s/%s duplique un autre résultat pour la zone %s \! +coser.business.resultupload.duplicatedresult2=Le résultat %s duplique un autre résultat pour la zone %s \! coser.business.rsufi.community.header=Campagne,Liste,Espèce,Strate,Annee,Estimation,EcartType,CV coser.business.rsufi.population.header=Campagne,Indice,Liste,Espèce,Strate,Annee,Estimation,EcartType,CV coser.business.selection.notValidatedControl=Contrôle non validé \! Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/CoserWebApplicationContext.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/CoserWebApplicationContext.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/CoserWebApplicationContext.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -23,8 +23,6 @@ import com.google.common.base.Preconditions; import fr.ifremer.coser.DefaultCoserApplicationContext; -import fr.ifremer.coser.result.CoserRequestExecutor; -import fr.ifremer.coser.services.WebService; import org.nuiton.i18n.I18n; import org.nuiton.i18n.init.DefaultI18nInitializer; @@ -68,14 +66,4 @@ public CoserWebConfig getConfig() { return (CoserWebConfig) config; } - - public WebService getWebService() { - return new WebService(config); - } - - public CoserRequestExecutor getRequestExecutor() { - CoserRequestExecutor service = new CoserRequestExecutor(this); - return service; - } - } 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-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/ServiceHelper.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -22,19 +22,14 @@ */ import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; -import fr.ifremer.coser.CoserBusinessException; import fr.ifremer.coser.result.CoserRequest; import fr.ifremer.coser.result.CoserRequestContext; -import fr.ifremer.coser.result.CoserRequestExecutor; -import fr.ifremer.coser.result.CoserResult; -import fr.ifremer.coser.result.DefaultCoserRequestContext; import fr.ifremer.coser.result.repository.ResultRepositoryType; import fr.ifremer.coser.result.request.DeleteResultsRequest; import fr.ifremer.coser.result.request.ExtractRawDataAndResultsRequest; import fr.ifremer.coser.result.result.FileResult; import fr.ifremer.coser.result.result.MapResult; -import fr.ifremer.coser.services.WebService; +import fr.ifremer.coser.services.WebResultService; import fr.ifremer.coser.web.actions.common.CoserAction; import java.io.File; @@ -45,28 +40,25 @@ /** * Wrap any call to business layer. * <p/> - * This was the easiest way to see also what's is really used from the business layer - * and refactor Cobol-style (or Turbo-Pascal maybe?) previous code... - * <p/> * Created on 3/6/14. * * @author Tony Chemit <chemit@codelutin.com> * @since 1.5 */ +//TODO Inject this in action public class ServiceHelper { protected final CoserAction action; - protected WebService webService; - - protected CoserRequestExecutor resultService; - protected final CoserWebApplicationContext applicationContext; + protected final WebResultService webResultService; + public ServiceHelper(CoserAction action) { Preconditions.checkNotNull(action); this.applicationContext = CoserWebApplicationContext.get(); this.action = action; + this.webResultService = new WebResultService(applicationContext); } // --------------------------------------------------------------------- // @@ -103,7 +95,7 @@ } public String getZoneDisplayName(CoserRequest request, String zone) { - Map<String, String> availableZones = getMultipleResultAsMap(request); + Map<String, String> availableZones = toMap(request); String displayName = availableZones.get(zone); return displayName; } @@ -113,7 +105,7 @@ // --------------------------------------------------------------------- // public String getSpeciesDisplayName(CoserRequest request, String species) { - Map<String, String> availableSpecies = getMultipleResultAsMap(request); + Map<String, String> availableSpecies = toMap(request); String displayName = availableSpecies.get(species); return displayName; } @@ -123,7 +115,7 @@ // --------------------------------------------------------------------- // public String getIndicatorDisplayName(CoserRequest request, String indicator) { - Map<String, String> availableIndicators = getMultipleResultAsMap(request); + Map<String, String> availableIndicators = toMap(request); String displayName = availableIndicators.get(indicator); return displayName; } @@ -134,77 +126,37 @@ public FileResult extractRawDataAndResults(Locale locale, ExtractRawDataAndResultsRequest request) { - CoserRequestContext context = newRequestContext(locale); - - FileResult result = getRequestExecutor().executeUnique(context, request); - + FileResult result = webResultService.extractRawDataAndResults(context, request); return result; } - public FileResult getFileResult(CoserRequest request) { - + public void deleteResults(DeleteResultsRequest request) { CoserRequestContext context = newRequestContext(); - - CoserResult result = getRequestExecutor().executeUnique(context, request); - - if (!(result instanceof FileResult)) { - throw new CoserWebException( - "Result should a FileResult, but was: " + result); - } - FileResult fileResult = (FileResult) result; - return fileResult; + webResultService.deleteResults(context, request); } - public MapResult getMapResult(CoserRequest request) { - + public void registerNewUploadedResults(String login, File resultFile) { CoserRequestContext context = newRequestContext(); - - CoserResult result = getRequestExecutor().executeUnique(context, request); - - if (!(result instanceof MapResult)) { - throw new CoserWebException( - "Result should a MapResult, but was: " + result); - } - MapResult fileResult = (MapResult) result; - return fileResult; + webResultService.registerNewUploadedResults(context, login, resultFile); } - public Map<String, String> getMultipleResultAsMap(CoserRequest request) { - + public FileResult toFileResult(CoserRequest request) { CoserRequestContext context = newRequestContext(); - - List<CoserResult> result = getRequestExecutor().executeAll(context, request); - - Map<String, String> resultAsMap = Maps.newHashMap(); - for (CoserResult coserResult : result) { - if (!(coserResult instanceof MapResult)) { - throw new CoserWebException( - "Result should a MapResult, but was: " + result); - } - Map<String, String> map = ((MapResult) coserResult).getResult(); - resultAsMap.putAll(map); - } - return resultAsMap; + FileResult result = webResultService.executeUnique(context, request).toFileResult(); + return result; } - public void deleteResults(DeleteResultsRequest request) { - + public MapResult toMapResult(CoserRequest request) { CoserRequestContext context = newRequestContext(); - - // do delete results (don't care about result) - getRequestExecutor().deleteResults(context, request); + MapResult result = webResultService.executeUnique(context, request).toMapResult(); + return result; } - public void registerNewUploadedResults(String login, File resultFile) { - try { - getWebService().registerNewUploadedResults(login, resultFile); - } catch (CoserBusinessException ex) { - throw new CoserWebException("Can't register new result file", ex); - } - - // reload projects - applicationContext.getRepositoryProvider().resetRepositories(); + public Map<String, String> toMap(CoserRequest request) { + CoserRequestContext context = newRequestContext(); + Map<String, String> result = webResultService.executeAll(context, request).toMap(); + return result; } // --------------------------------------------------------------------- // @@ -216,36 +168,24 @@ } public void reloadProjects() { - applicationContext.getRepositoryProvider().resetRepositories(); + webResultService.resetRepositories(); } public Map<String, ResultRepositoryType> getRepositoryTypes() { - Map<String, ResultRepositoryType> result = Maps.newHashMap(); - for (ResultRepositoryType resultRepositoryType : applicationContext.getRepositoryTypes()) { - result.put(resultRepositoryType.getId(), resultRepositoryType); - } + Map<String, ResultRepositoryType> result = webResultService.getRepositoryTypes(); return result; } - protected WebService getWebService() { - if (webService == null) { - webService = new WebService(getConfig()); - } - return webService; - } + // --------------------------------------------------------------------- // + // --- Internal methods ------------------------------------------------ // + // --------------------------------------------------------------------- // - protected CoserRequestExecutor getRequestExecutor() { - if (resultService == null) { - resultService = new CoserRequestExecutor(applicationContext); - } - return resultService; - } - protected CoserRequestContext newRequestContext() { return newRequestContext(action.getLocale()); } protected CoserRequestContext newRequestContext(Locale locale) { - return new DefaultCoserRequestContext(applicationContext, locale); + return webResultService.newRequestContext(locale); } + } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/admin/ListProjectsAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/admin/ListProjectsAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/admin/ListProjectsAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -130,7 +130,7 @@ // get projects for this type request.setResultType(resultType); - Map<String, String> resultsForType = getService().getMultipleResultAsMap(request); + Map<String, String> resultsForType = getService().toMap(request); results.put(resultType, resultsForType); } } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -121,7 +121,7 @@ addZone(zone). addIndicator(indicator). toRequest(); - lists = getService().getMultipleResultAsMap(request); + lists = getService().toMap(request); return SUCCESS; } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDataAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDataAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDataAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -112,12 +112,12 @@ addZone(zone). addIndicator(indicator). toRequest(); - Map<String, String> speciesMap = getService().getMultipleResultAsMap(speciesRequest); + Map<String, String> speciesMap = getService().toMap(speciesRequest); if (MapUtils.isNotEmpty(speciesMap)) { request.setSpecies(speciesMap.keySet().iterator().next()); } } - result = getService().getFileResult(request); + result = getService().toFileResult(request); return SUCCESS; } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDownloadAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDownloadAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/com/GraphDownloadAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -112,13 +112,13 @@ addZone(zone). addIndicator(indicator). toRequest(); - Map<String, String> speciesMap = getService().getMultipleResultAsMap(speciesRequest); + Map<String, String> speciesMap = getService().toMap(speciesRequest); if (MapUtils.isNotEmpty(speciesMap)) { request.setSpecies(speciesMap.keySet().iterator().next()); } } - result = getService().getFileResult(request); + result = getService().toFileResult(request); return SUCCESS; } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonIndicator.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonIndicator.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonIndicator.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -95,7 +95,7 @@ public String execute() { CoserRequest request = createIndicatorsRequest(); - indicators = getService().getMultipleResultAsMap(request); + indicators = getService().toMap(request); zonePicture = getService().getZonePictures().get(zone); return SUCCESS; Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonZone.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonZone.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/common/CommonZone.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -82,7 +82,7 @@ public String execute() { CoserRequest request = createZonesRequest(); - zones = getService().getMultipleResultAsMap(request); + zones = getService().toMap(request); zonesPictures = getService().getZonePictures(); zonesMetaInfo = getService().getZoneMetaInfo(getLocale()); Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/MapDataAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/MapDataAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/MapDataAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -93,7 +93,7 @@ if (log.isInfoEnabled()) { log.info("Looking for map of species: " + request.getSpecies()); } - result = getService().getFileResult(request); + result = getService().toFileResult(request); return SUCCESS; } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/SpeciesAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/SpeciesAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/map/SpeciesAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -95,7 +95,7 @@ addFacade(facade). addZone(zone). toRequest(); - species = getService().getMultipleResultAsMap(request); + species = getService().toMap(request); if (log.isDebugEnabled()) { Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDataAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDataAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDataAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -98,7 +98,7 @@ addSpecies(species). addIndicator(indicator). toRequest(); - result = getService().getFileResult(request); + result = getService().toFileResult(request); return SUCCESS; } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDownloadAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDownloadAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/GraphDownloadAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -96,7 +96,7 @@ addSpecies(species). addIndicator(indicator). toRequest(); - result = getService().getFileResult(request); + result = getService().toFileResult(request); return SUCCESS; } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/SpeciesAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/SpeciesAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/pop/SpeciesAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -101,7 +101,7 @@ addFacade(facade). addZone(zone). toRequest(); - species = getService().getMultipleResultAsMap(request); + species = getService().toMap(request); if (log.isDebugEnabled()) { log.debug("Species are : " + species); 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-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/search/ExtractAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -22,11 +22,11 @@ package fr.ifremer.coser.web.actions.search; import com.google.common.collect.Lists; -import fr.ifremer.coser.result.result.FileResult; import fr.ifremer.coser.result.request.ExtractRawDataAndResultsRequest; import fr.ifremer.coser.result.request.GetIndicatorsForExtractRawDataAndResultsRequest; import fr.ifremer.coser.result.request.GetSpeciesForExtractRawDataAndResultsRequest; import fr.ifremer.coser.result.request.GetZonesForExtractRawDataAndResultsRequest; +import fr.ifremer.coser.result.result.FileResult; import fr.ifremer.coser.util.DataType; import fr.ifremer.coser.web.actions.common.CoserAction; import org.apache.commons.collections4.CollectionUtils; @@ -192,7 +192,7 @@ GetZonesForExtractRawDataAndResultsRequest zonesRequest = requestBuilder(GetZonesForExtractRawDataAndResultsRequest.class). toRequest(); - zones = getService().getMultipleResultAsMap(zonesRequest); + zones = getService().toMap(zonesRequest); if (CollectionUtils.isNotEmpty(selectZones)) { @@ -201,7 +201,7 @@ addZoneList(selectZones). addExtractTypeList(selectTypes). toRequest(); - species = getService().getMultipleResultAsMap(speciesRequest); + species = getService().toMap(speciesRequest); if (selectTypes != null) { @@ -213,12 +213,12 @@ if (selectTypes.contains(DataType.COMMUNITY)) { indicatorsRequest.setExtractTypeList(Lists.newArrayList(DataType.COMMUNITY)); - comIndicators = getService().getMultipleResultAsMap(indicatorsRequest); + comIndicators = getService().toMap(indicatorsRequest); } if (selectTypes.contains(DataType.POPULATION)) { indicatorsRequest.setExtractTypeList(Lists.newArrayList(DataType.POPULATION)); - popIndicators = getService().getMultipleResultAsMap(indicatorsRequest); + popIndicators = getService().toMap(indicatorsRequest); } } } Modified: trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/source/SourceDataAction.java =================================================================== --- trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/source/SourceDataAction.java 2014-03-19 10:54:43 UTC (rev 1158) +++ trunk/coser-web/src/main/java/fr/ifremer/coser/web/actions/source/SourceDataAction.java 2014-03-19 10:56:06 UTC (rev 1159) @@ -63,7 +63,7 @@ addFacade(facade). addZone(zone). toRequest(); - result = getService().getFileResult(request); + result = getService().toFileResult(request); return SUCCESS; }
participants (1)
-
tchemit@users.forge.codelutin.com