r4166 - in trunk/src: main/java/fr/ifremer/isisfish main/java/fr/ifremer/isisfish/datastore main/java/fr/ifremer/isisfish/export main/java/fr/ifremer/isisfish/simulator main/java/fr/ifremer/isisfish/simulator/launcher main/java/fr/ifremer/isisfish/ui/models/export main/java/fr/ifremer/isisfish/ui/models/optimization main/java/fr/ifremer/isisfish/ui/result main/java/fr/ifremer/isisfish/ui/script main/java/fr/ifremer/isisfish/ui/simulator main/resources/i18n main/resources/templates/script
Author: bpoussin Date: 2014-12-19 18:40:04 +0000 (Fri, 19 Dec 2014) New Revision: 4166 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4166 Log: fixes #5844: export de resultats durant la simulation Added: trunk/src/main/java/fr/ifremer/isisfish/export/ExportInfo.java trunk/src/main/java/fr/ifremer/isisfish/export/ExportStep.java trunk/src/main/resources/templates/script/exportStep.ftl trunk/src/test/java/fr/ifremer/isisfish/datastore/ExportStepStorageTest.java Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java trunk/src/main/java/fr/ifremer/isisfish/datastore/ExportStorage.java trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationInformation.java trunk/src/main/java/fr/ifremer/isisfish/export/Export.java trunk/src/main/java/fr/ifremer/isisfish/export/ExportHelper.java trunk/src/main/java/fr/ifremer/isisfish/export/SensitivityExport.java trunk/src/main/java/fr/ifremer/isisfish/simulator/ResultManager.java trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameter.java trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterCache.java trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListModel.java trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListRenderer.java trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportNameListRenderer.java trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportObservationTableModel.java trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportTableCellRenderer.java trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/OptimizationHandler.java trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java trunk/src/main/resources/i18n/isis-fish_en_GB.properties trunk/src/main/resources/i18n/isis-fish_fr_FR.properties Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -68,6 +68,7 @@ import fr.ifremer.isisfish.util.IsisCacheBackend; import fr.ifremer.isisfish.util.IsisCacheBackendOnGuava; import fr.ifremer.isisfish.vcs.VCS; +import java.nio.charset.Charset; /** * Isis fish configuration. @@ -135,6 +136,10 @@ protected static Version version; protected static Version databaseVersion; protected static Version apiVersion; + // IDEA: perhaps add this in simulation configuration to permit easy portable + // export between CapArmor and Windows world + public static final Charset charset = Charset.forName("UTF-8"); + public static final String COMPRESSION_EXTENSION = ".gz"; /** * Le nombre global ex: 3.2.0.0 Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ExportStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ExportStorage.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ExportStorage.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -36,12 +36,12 @@ import org.apache.commons.logging.LogFactory; import fr.ifremer.isisfish.IsisFish; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.util.Doc; import fr.ifremer.isisfish.vcs.VCSException; /** - * Gestion des fichers VCS de type {@link Export} + * Gestion des fichers VCS de type {@link ExportInfo} * (appartenant au module exports). * * Created: 18 août 2005 15:07:36 CEST @@ -61,6 +61,8 @@ /** Template freemarker pour les scripts d'export . */ public static final String EXPORT_TEMPLATE = "templates/script/export.ftl"; + /** Template freemarker pour les scripts d'export . */ + public static final String EXPORT_STEP_TEMPLATE = "templates/script/exportStep.ftl"; /** Instance cache. */ private static Map<String, ExportStorage> exportCache = new ReferenceMap<String, ExportStorage>(); @@ -152,16 +154,16 @@ } /** - * <b>Be ware this method require to instantiate a Export, so - * it would be better to call as often as possible.</b> + * <b>Be ware this method require to instantiate a ExportInfo, so + it would be better to call as often as possible.</b> * - * @return the description of the instantiate Export + * @return the description of the instantiate ExportInfo * @see Doc */ public String getDescription() { String result = null; try { - Export export = getNewInstance(); + ExportInfo export = getNewInstance(); if (export != null) { result = export.getDescription(); } Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultDatabaseStorage.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -53,7 +53,7 @@ import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.Result; import fr.ifremer.isisfish.entities.ResultDAO; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.simulator.Objective; @@ -266,7 +266,7 @@ for (String exportName : exportNames) { ExportStorage storage = ExportStorage.getExport(exportName); try { - Export export = storage.getNewInstance(); + ExportInfo export = storage.getNewInstance(); for (String resultName : export.getNecessaryResult()) { enabledResult.add(resultName); } Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorage.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -32,7 +32,7 @@ import fr.ifremer.isisfish.IsisFishException; import fr.ifremer.isisfish.entities.Population; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.simulator.SimulationPlan; Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageAbstract.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -53,7 +53,7 @@ import fr.ifremer.isisfish.IsisFishException; import fr.ifremer.isisfish.IsisFishRuntimeException; import fr.ifremer.isisfish.entities.Population; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.simulator.Objective; @@ -391,7 +391,7 @@ for (String exportName : exportNames) { ExportStorage storage = ExportStorage.getExport(exportName); try { - Export export = storage.getNewInstance(); + ExportInfo export = storage.getNewInstance(); Collections.addAll(enabledResult, export.getNecessaryResult()); } catch (IsisFishException eee) { if (log.isWarnEnabled()) { Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultStorageCSV.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -23,6 +23,7 @@ */ +import fr.ifremer.isisfish.IsisConfig; import fr.ifremer.isisfish.IsisFish; import fr.ifremer.isisfish.IsisFishRuntimeException; import fr.ifremer.isisfish.simulator.SimulationContext; @@ -38,7 +39,6 @@ import java.io.LineNumberReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -103,8 +103,6 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(ResultStorageCSV.class); - static final private Charset charset = Charset.forName("UTF-8"); - /** number of step result to store on disk. 0 for none, negative for all result */ protected int storeOnDiskStep = -1; /** number of step in cache */ @@ -190,7 +188,7 @@ } protected File getMatrixFile(TimeStep step, String name) { - File file = new File(getMatrixDirectory(name), step.getStep() + "-" + name + ".csv.gz"); + File file = new File(getMatrixDirectory(name), step.getStep() + "-" + name + ".csv" + IsisConfig.COMPRESSION_EXTENSION); return file; } @@ -227,7 +225,7 @@ LineNumberReader in = null; try { in = new LineNumberReader(new InputStreamReader( - new GZIPInputStream(new FileInputStream(file)), charset)); + new GZIPInputStream(new FileInputStream(file)), IsisConfig.charset)); SimpleParser sp = new SimpleParser(in, true); @@ -389,7 +387,7 @@ try { out = new PrintWriter(new BufferedWriter(new OutputStreamWriter( new GZIPOutputStream(counter = new CountingOutputStream(new FileOutputStream(file))), - charset + IsisConfig.charset ))); out.print(name); Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationInformation.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationInformation.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/SimulationInformation.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -72,6 +72,7 @@ private static final String END_SIMULATION = "simulationEnd"; private static final String EXPORT_TIME = "exportTime"; private static final String EXPORT_SIZE = "exportSize"; + private static final String EXPORT_EXCEPTION = "exportException"; private static final String RULE_TIME = "ruleTime"; private static final String RULE_TIME_INIT = RULE_TIME + ".init"; private static final String RULE_TIME_PRE = RULE_TIME + ".pre"; @@ -133,15 +134,12 @@ // exports Map<String, Long> exportTime = getExportTimes(); if (exportTime.size() > 0) { - result += "Export time: " + - DurationFormatUtils.formatDuration(getAllExportTime(), - "s'.'S") + "s\n"; + result += "Export time: " + StringUtil.convertTime(getAllExportTime()) + "\n"; for (Map.Entry<String, Long> entry : exportTime.entrySet()) { result += "\t" + entry.getKey() + " : " - + DurationFormatUtils.formatDuration(entry.getValue(), - "s'.'S") + "s\n"; + + StringUtil.convertTime(entry.getValue()) + "\n"; } } @@ -219,9 +217,21 @@ // Exception v = getException(); if (v != null) { - result += "Exception:\n" + v + "\n"; + result += "Simulation exception:\n" + v + "\n"; } + // exports Exception + Map<String, String> exportException = getExportExceptions(); + if (exportException.size() > 0) { + result += "Export exception:\n "; + for (Map.Entry<String, String> entry : exportException.entrySet()) { + result += entry.getKey() + + " : " + + entry.getValue() + "\n\n"; + } + } + + return result; } @@ -307,6 +317,10 @@ setInfo(EXPORT_SIZE + "." + exportName, String.valueOf(size)); } + public void addExportException(String exportName, Throwable eee) { + setInfo(EXPORT_EXCEPTION + "." + exportName, exceptionToString(eee)); + } + public void addAllExportTime(long time) { setInfo(EXPORT_TIME, String.valueOf(time)); } @@ -348,6 +362,22 @@ } /** + * Get all export exception in map. + * + * @return a map with all export exception + */ + protected Map<String, String> getExportExceptions() { + Map<String, String> result = new TreeMap<String, String>(); + for (String key : info.stringPropertyNames()) { + if (key.startsWith(EXPORT_EXCEPTION + ".")) { + String exportName = key.substring(EXPORT_EXCEPTION.length() + 1); + result.put(exportName, info.getProperty(key)); + } + } + return result; + } + + /** * Get all export time in map. * * @return a map with all export time @@ -567,11 +597,16 @@ } public void setException(Throwable eee) { + String v = exceptionToString(eee); + setInfo(SIMULATION_EXCEPTION, v); + } + + protected String exceptionToString(Throwable eee) { StringWriter w = new StringWriter(); PrintWriter pw = new PrintWriter(w); eee.printStackTrace(pw); String v = w.getBuffer().toString(); - setInfo(SIMULATION_EXCEPTION, v); + return v; } /** Modified: trunk/src/main/java/fr/ifremer/isisfish/export/Export.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/export/Export.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/export/Export.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -30,7 +30,8 @@ import fr.ifremer.isisfish.datastore.SimulationStorage; /** - * Interface que doivent implanter les classes d'export de resultats. + * Interface que doivent implanter les classes d'export de resultats pour les + * export qui ne peuvent pas etre fait pas de temps par pas de temps * * Le nom du fichier d'export qui sera utilisé sera le basé sur le nom de la * classe d'export @@ -43,39 +44,11 @@ * Last update: $Date$ * by : $Author$ */ -public interface Export { +public interface Export extends ExportInfo { /** - * Necessary results names for export execution. + * Exporte les resultat apres la simulation. * - * @return the necessaryResult name - */ - public String[] getNecessaryResult(); - - /** - * Return Export description. - * - * @return string displayable to the end user - */ - public String getDescription(); - - /** - * Return filename used to contains export data. - * - * @return filename by example "myexport" - */ - public String getExportFilename(); - - /** - * Return extension used as filename name extension. - * - * @return extension by example ".csv" - */ - public String getExtensionFilename(); - - /** - * Exporte les resultat. - * * @param simulation la simulation dont on souhaite exporter les resultats * @param out la sortie sur lequel il faut ecrire l'export * @throws Exception if export fail Modified: trunk/src/main/java/fr/ifremer/isisfish/export/ExportHelper.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/export/ExportHelper.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/export/ExportHelper.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -25,28 +25,26 @@ package fr.ifremer.isisfish.export; -import fr.ifremer.isisfish.IsisFish; -import java.io.BufferedWriter; -import java.io.File; -import java.io.Writer; -import java.util.List; +import fr.ifremer.isisfish.IsisConfig; +import fr.ifremer.isisfish.IsisFishException; +import fr.ifremer.isisfish.datastore.ExportStorage; +import fr.ifremer.isisfish.datastore.SimulationStorage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.TopiaContext; -import fr.ifremer.isisfish.datastore.ExportStorage; -import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.StorageHelper; import fr.ifremer.isisfish.simulator.SimulationParameterPropertiesHelper; +import fr.ifremer.isisfish.types.TimeStep; +import java.io.BufferedWriter; +import java.io.File; import java.io.FileOutputStream; -import java.io.OutputStream; +import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.nio.charset.Charset; +import java.io.Writer; import java.util.Properties; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.output.CountingOutputStream; import org.apache.commons.lang3.StringUtils; @@ -66,51 +64,103 @@ /** Class logger. */ private static Log log = LogFactory.getLog(ExportHelper.class); - static final private String COMPRESSION_EXTENSION = ".gz"; - // IDEA: perhaps add this in simulation configuration to permit easy portable - // export between CapArmor and Windows world - static final private Charset charset = Charset.forName("UTF-8"); +// /** +// * Permet de faire les exports pour une simulation. +// * +// * @param simulation La simulation pour lequel il faut faire les exports +// * @param destdir le repertoire dans lequel il faut ecrire les exports +// * @param exports les instances des exports à faire +// * @param compileDir le nom du répertoire ou les classes d'export sont compilées +// */ +// public static void doExport(SimulationStorage simulation, File destdir, +// List<Export> exports, File compileDir) { +// +// // on ne compte plus ici les temps d'instanciations +// // deplacer dans SimulationExportResultWrapper#afterSimulation(SimulationContext) +// +// long writtenAll = 0; +// long timeStart = System.currentTimeMillis(); +// for (Export export : exports) { +// String exportName = ExportStorage.getName(export); +// long written = 0; +// long time = System.currentTimeMillis(); +// try { +// written = exportToFile(simulation, destdir, export); +// writtenAll += written; +// } catch (Exception eee) { +// if (log.isWarnEnabled()) { +// log.warn("Can't export object: " + exportName, eee); +// } +// } +// simulation.getInformation().addExportSize(exportName, written); +// simulation.getInformation().addExportTime(exportName, +// System.currentTimeMillis() - time); +// } +// simulation.getInformation().addAllExportSize(writtenAll); +// simulation.getInformation().addAllExportTime( +// System.currentTimeMillis() - timeStart); +// } +// +// /** +// * Do single export. +// * +// * @param simulation la simulation pour lequel il faut faire les exports +// * @param destdir le repertoire dans lequel il faut ecrire les exports +// * @param export le nom des exports a faire +// * +// * @return number of byte written on disk +// * +// * @throws Exception si une erreur survient +// */ +// protected static long exportToFile(SimulationStorage simulation, +// File destdir, Export export) throws Exception { +// long result = 0; +// +// String filename = export.getExportFilename(); +// String extension = export.getExtensionFilename(); +// +// if (!StringUtils.endsWithIgnoreCase(extension, IsisConfig.COMPRESSION_EXTENSION) +// && IsisFish.config.getExportForceCompression()) { +// extension += IsisConfig.COMPRESSION_EXTENSION; +// } +// +// File file = new File(destdir, filename + extension); +// // prevent two export with same name +// // name MyExport.csv become MyExport_1.csv +// int val = 0; +// while (file.exists()) { +// val++; +// file = new File(destdir, filename + extension + "_" + val); +// } +// +// Writer out = null; +// CountingOutputStream counter = null; +// try { +// +// OutputStream os = new FileOutputStream(file); +// os = counter = new CountingOutputStream(os); +// +// // if compression is needed by extension, add compression writer +// if (StringUtils.endsWithIgnoreCase(extension, IsisConfig.COMPRESSION_EXTENSION)) { +// os = new GZIPOutputStream(os); +// } +// +// out = new PrintWriter(new BufferedWriter( +// new OutputStreamWriter(os, IsisConfig.charset))); +// +// export.export(simulation, out); +// } finally { +// IOUtils.closeQuietly(out); +// if (counter != null) { +// result = counter.getByteCount(); +// } +// } +// return result; +// } /** - * Permet de faire les exports pour une simulation. - * - * @param simulation La simulation pour lequel il faut faire les exports - * @param destdir le repertoire dans lequel il faut ecrire les exports - * @param exports les instances des exports à faire - * @param compileDir le nom du répertoire ou les classes d'export sont compilées - */ - public static void doExport(SimulationStorage simulation, File destdir, - List<Export> exports, File compileDir) { - - // on ne compte plus ici les temps d'instanciations - // deplacer dans SimulationExportResultWrapper#afterSimulation(SimulationContext) - - long writtenAll = 0; - long timeStart = System.currentTimeMillis(); - for (Export export : exports) { - String exportName = ExportStorage.getName(export); - long written = 0; - long time = System.currentTimeMillis(); - try { - written = exportToFile(simulation, destdir, export); - writtenAll += written; - } catch (Exception eee) { - if (log.isWarnEnabled()) { - log.warn("Can't export object: " + exportName, eee); - } - } - simulation.getInformation().addExportSize(exportName, written); - simulation.getInformation().addExportTime(exportName, - System.currentTimeMillis() - time); - } - simulation.getInformation().addAllExportSize(writtenAll); - simulation.getInformation().addAllExportTime( - System.currentTimeMillis() - timeStart); - } - - /** * Do single export. - * + * * @param simulation la simulation pour lequel il faut faire les exports * @param destdir le repertoire dans lequel il faut ecrire les exports * @param export le nom des exports a faire @@ -119,50 +169,35 @@ * * @throws Exception si une erreur survient */ - protected static long exportToFile(SimulationStorage simulation, - File destdir, Export export) throws Exception { - long result = 0; - - String filename = export.getExportFilename(); - String extension = export.getExtensionFilename(); - - if (!StringUtils.endsWithIgnoreCase(extension, COMPRESSION_EXTENSION) - && IsisFish.config.getExportForceCompression()) { - extension += COMPRESSION_EXTENSION; - } - - File file = new File(destdir, filename + extension); - // prevent two export with same name - // name MyExport.csv become MyExport_1.csv - int val = 0; - while (file.exists()) { - val++; - file = new File(destdir, filename + extension + "_" + val); - } - + public static void exportToFile(SimulationStorage simulationStorage, String exportName, File file) throws Exception { + ExportStorage storage = ExportStorage.getExport(exportName); + ExportInfo exportInfo = storage.getNewInstance(); Writer out = null; - CountingOutputStream counter = null; try { + if (StringUtils.endsWithIgnoreCase(file.getName(), IsisConfig.COMPRESSION_EXTENSION)) { + out = new BufferedWriter(new OutputStreamWriter( + new GZIPOutputStream(new FileOutputStream(file)), + IsisConfig.charset)); + } else { + out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), + IsisConfig.charset)); + } - OutputStream os = new FileOutputStream(file); - os = counter = new CountingOutputStream(os); + if (exportInfo instanceof ExportStep) { + ExportStep exportStep = (ExportStep)exportInfo; + TimeStep lastStep = simulationStorage.getResultStorage().getLastStep(); + for (TimeStep step = new TimeStep(0); !step.after(lastStep); step = step.next()) { + exportStep.export(simulationStorage, step, out); + } + exportStep.exportEnd(simulationStorage, out); - // if compression is needed by extension, add compression writer - if (StringUtils.endsWithIgnoreCase(extension, COMPRESSION_EXTENSION)) { - os = new GZIPOutputStream(os); + } else { + Export export = (Export)exportInfo; + export.export(simulationStorage, out); } - - out = new PrintWriter(new BufferedWriter( - new OutputStreamWriter(os, charset))); - - export.export(simulation, out); } finally { IOUtils.closeQuietly(out); - if (counter != null) { - result = counter.getByteCount(); - } } - return result; } /** Copied: trunk/src/main/java/fr/ifremer/isisfish/export/ExportInfo.java (from rev 4158, trunk/src/main/java/fr/ifremer/isisfish/export/Export.java) =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/export/ExportInfo.java (rev 0) +++ trunk/src/main/java/fr/ifremer/isisfish/export/ExportInfo.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -0,0 +1,76 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2006 - 2010 Ifremer, Code Lutin, Cédric Pineau, Benjamin Poussin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +package fr.ifremer.isisfish.export; + +import java.io.Writer; + +import fr.ifremer.isisfish.datastore.SimulationStorage; + +/** + * Interface que doivent implanter les classes d'export de resultats. + * + * Le nom du fichier d'export qui sera utilisé sera le basé sur le nom de la + * classe d'export + * + * Created: 22 janv. 2006 21:12:58 + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public interface ExportInfo { + + /** + * Necessary results names for export execution. + * + * @return the necessaryResult name + */ + public String[] getNecessaryResult(); + + /** + * Return ExportInfo description. + * + * @return string displayable to the end user + */ + public String getDescription(); + + /** + * Return filename used to contains export data. + * + * @return filename by example "myexport" + */ + public String getExportFilename(); + + /** + * Return extension used as filename name extension. + * + * @return extension by example ".csv" + */ + public String getExtensionFilename(); + +} Copied: trunk/src/main/java/fr/ifremer/isisfish/export/ExportStep.java (from rev 4158, trunk/src/main/java/fr/ifremer/isisfish/export/Export.java) =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/export/ExportStep.java (rev 0) +++ trunk/src/main/java/fr/ifremer/isisfish/export/ExportStep.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -0,0 +1,73 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2006 - 2014 Ifremer, Code Lutin, Benjamin Poussin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +package fr.ifremer.isisfish.export; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.types.TimeStep; +import java.io.Writer; + + +/** + * Interface que doivent implanter les classes d'export de resultats qui veulent + * exporter au fur et a mesure de la simulation. + * + * Created: 18 dec. 2014 15:03 + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + * + * @since 4.4.0.0 + */ +public interface ExportStep extends ExportInfo { + + /** + * Exporte les resultats, cette methode est appellee a la fin de chaque pas + * de temps. Elle peut ecrire dans le fichier via le parametre out, + * ou collecter les informations et les ecrires a la fin de la simulation + * lorsque la methode {@link #export(fr.ifremer.isisfish.datastore.SimulationStorage, java.io.Writer) + * est appelee. + * + * @param simulation la simulation dont on souhaite exporter les resultats + * @param step le pas de temps courant de la simulation + * @param out la sortie sur lequel il faut ecrire l'export + * @throws Exception if export fail + */ + public void export(SimulationStorage simulation, TimeStep step, Writer out) + throws Exception; + + /** + * Appeler a la fin de l'export + * + * @param simulation la simulation dont on souhaite exporter les resultats + * @param out la sortie sur lequel il faut ecrire l'export + * @throws Exception if export fail + */ + public void exportEnd(SimulationStorage simulation, Writer out) + throws Exception; +} Modified: trunk/src/main/java/fr/ifremer/isisfish/export/SensitivityExport.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/export/SensitivityExport.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/export/SensitivityExport.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -36,6 +36,6 @@ * Last update: $Date$ * by : $Author$ */ -public interface SensitivityExport extends Export { +public interface SensitivityExport extends ExportInfo { } Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/ResultManager.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/ResultManager.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/ResultManager.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -42,7 +42,7 @@ import fr.ifremer.isisfish.datastore.ExportStorage; import fr.ifremer.isisfish.entities.Observation; import fr.ifremer.isisfish.entities.Population; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.types.TimeStep; @@ -76,7 +76,7 @@ public ResultManager(SimulationContext context) { this.context = context; } - + /** * Don't use this method to add listener, use * {@link SimulationContext#addSimulationListener(SimulationListener)} @@ -125,7 +125,7 @@ for (String exportName : exportNames) { ExportStorage storage = ExportStorage.getExport(exportName); try { - Export export = storage.getNewInstance(); + ExportInfo export = storage.getNewInstance(); for (String resultName : export.getNecessaryResult()) { enabledResult.add(resultName); } @@ -169,9 +169,9 @@ } // optimization export - Map<Export, Observation> optimizationExportsObservations = param.getOptimizationExportsObservations(); + Map<ExportInfo, Observation> optimizationExportsObservations = param.getOptimizationExportsObservations(); if (optimizationExportsObservations != null) { - for (Export export : optimizationExportsObservations.keySet()) { + for (ExportInfo export : optimizationExportsObservations.keySet()) { for (String resultName : export.getNecessaryResult()) { enabledResult.add(resultName); } Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -240,6 +240,10 @@ } } + /** + * @deprecated a supprimer lorsqu'on aura supprimer ResultDatabaseStorage + */ + @Deprecated public void closeDBResult() { if (dbResult != null) { try { @@ -429,8 +433,11 @@ /** * this method return TopiaContext that must be used to save result * @return Returns the dbResult. - * @throws TopiaException + * @throws TopiaException + * + * @deprecated ne sert plus a rien lorsque ResultDatabaseStorage sera supprime */ + @Deprecated public TopiaContext getDbResult() throws TopiaException { if (dbResult == null && getSimulationStorage() != null) { dbResult = getSimulationStorage().getStorage().beginTransaction(); @@ -444,7 +451,9 @@ * @param step time step to remove data * @since 4.1.1.0 * @throws TopiaException + * @deprecated ne sert plus a rien, le cache est directement listener de la simulation */ + @Deprecated public void clearCache(TimeStep step) throws TopiaException { getCache().clear(step); } @@ -553,16 +562,29 @@ * @since 4.3.1.0 */ public void rollbackRuleChanges() throws TopiaException { - TopiaContext tx = getDB(); - tx.rollbackTransaction(); + if (db != null) { + db.rollbackTransaction(); + } } /** + * Valide (commit) database modification + */ + public void validateDBChanges() throws TopiaException { + if (db != null) { + db.commitTransaction(); + } + } + + /** * Commit result storage transaction. * * @throws TopiaException * @since 4.3.1.0 + * + * @deprecated ne sert plus a rien lorsque ResultDatabaseStorage sera supprime */ + @Deprecated public void commitResults() throws TopiaException { TopiaContext tx = getDbResult(); tx.commitTransaction(); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationExportResultWrapper.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -25,10 +25,12 @@ package fr.ifremer.isisfish.simulator; +import fr.ifremer.isisfish.IsisConfig; +import fr.ifremer.isisfish.IsisFish; + import static org.nuiton.i18n.I18n.t; import java.io.File; -import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -39,12 +41,26 @@ import fr.ifremer.isisfish.datastore.ExportStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.export.Export; -import fr.ifremer.isisfish.export.ExportHelper; +import fr.ifremer.isisfish.export.ExportInfo; +import fr.ifremer.isisfish.export.ExportStep; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.types.TimeStep; +import java.io.BufferedWriter; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.Writer; +import java.util.HashMap; +import java.util.Map; +import java.util.zip.GZIPOutputStream; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.output.CountingOutputStream; +import org.apache.commons.lang3.StringUtils; /** - * Export simulation listener. + * ExportInfo simulation listener. * * Do export after simulation ends. * @@ -62,27 +78,121 @@ private static Log log = LogFactory .getLog(SimulationExportResultWrapper.class); + protected TimeStep lastStep; + + private class ExportContext { + ExportInfo export; + File exportDir; + Writer out; + CountingOutputStream counter; + long time = 0; + long bytes = 0; + Exception exception = null; + + public ExportContext(ExportInfo export, File exportDir) { + this.export = export; + this.exportDir = exportDir; + } + public void close() { + IOUtils.closeQuietly(out); + if (counter != null) { + bytes = counter.getByteCount(); + } + } + + public Writer getOut() throws IOException { + if (out == null) { + String filename = export.getExportFilename(); + String extension = export.getExtensionFilename(); + + if (!StringUtils.endsWithIgnoreCase(extension, IsisConfig.COMPRESSION_EXTENSION) + && IsisFish.config.getExportForceCompression()) { + extension += IsisConfig.COMPRESSION_EXTENSION; + } + + File file = new File(exportDir, filename + extension); + // prevent two export with same name + // name MyExport.csv become MyExport_1.csv + int val = 0; + while (file.exists()) { + val++; + file = new File(exportDir, filename + extension + "_" + val); + } + + + OutputStream os = new FileOutputStream(file); + os = counter = new CountingOutputStream(os); + + // if compression is needed by extension, add compression writer + if (StringUtils.endsWithIgnoreCase(extension, IsisConfig.COMPRESSION_EXTENSION)) { + os = new GZIPOutputStream(os); + } + + out = new PrintWriter(new BufferedWriter( + new OutputStreamWriter(os, IsisConfig.charset))); + } + return out; + } + + public void addTime(long time) { + this.time += time; + } + + public void export(SimulationStorage simulation, TimeStep step) throws Exception { + if (export instanceof ExportStep) { + long timeStart = System.nanoTime(); + ((ExportStep)export).export(simulation, step, getOut()); + addTime(System.nanoTime() - timeStart); + } + } + + public void exportEnd(SimulationStorage simulation) throws Exception { + if (export instanceof ExportStep) { + long timeStart = System.nanoTime(); + ((ExportStep)export).exportEnd(simulation, getOut()); + addTime(System.nanoTime() - timeStart); + } + } + + public void export(SimulationStorage simulation) throws Exception { + if (export instanceof Export) { + long timeStart = System.nanoTime(); + ((Export)export).export(simulation, getOut()); + addTime(System.nanoTime() - timeStart); + } + } + + public void setException(Exception exception) { + this.exception = exception; + } + + } + + protected Map<ExportInfo, ExportContext> allExports = new HashMap<ExportInfo, ExportContext>(); + /* - * @see fr.ifremer.isisfish.simulator.SimulationListener#afterSimulation(fr.ifremer.isisfish.simulator.SimulationContext) + * @see fr.ifremer.isisfish.simulator.SimulationListener#beforeSimulation(fr.ifremer.isisfish.simulator.SimulationContext) */ @Override - public void afterSimulation(SimulationContext context) { + public void beforeSimulation(SimulationContext context) { SimulationStorage simulation = context.getSimulationStorage(); SimulationParameter parameters = simulation.getParameter(); File rootDirectory = simulation.getDirectory(); - SimulationControl control = context.getSimulationControl(); + File exportDir = SimulationStorage + .getResultExportDirectory(rootDirectory); + exportDir.mkdirs(); + // Ici on contantene les 2 listes d'exports // first, make export instances based on export // names - List<Export> allExports = new ArrayList<Export>(); if (parameters.getExportNames() != null) { for (String exportName : parameters.getExportNames()) { try { ExportStorage storage = ExportStorage.getExport(exportName); - Export export = storage.getNewInstance(); - allExports.add(export); + ExportInfo export = storage.getNewInstance(); + allExports.put(export, new ExportContext(export, exportDir)); } catch (IsisFishException e) { if (log.isErrorEnabled()) { log.error("Can't get export instance " + exportName, e); @@ -90,43 +200,94 @@ } } } - + // second, add already instanciated sensitivity // exports (with parameters) List<SensitivityExport> sensitivityExports = parameters.getSensitivityExport(); if (sensitivityExports != null) { - allExports.addAll(sensitivityExports); + for (ExportInfo e : sensitivityExports) { + allExports.put(e, new ExportContext(e, exportDir)); + } } // third, optimization export - Set<Export> optimizationExports = parameters.getOptimizationExportsObservations().keySet(); - for (Export export : optimizationExports) { + Set<ExportInfo> optimizationExports = parameters.getOptimizationExportsObservations().keySet(); + for (ExportInfo export : optimizationExports) { // exclude export already added with regular exports String exportName = ExportStorage.getName(export); if (parameters.getExportNames() == null || !parameters.getExportNames().contains(exportName)) { - allExports.add(export); + allExports.put(export, new ExportContext(export, exportDir)); } } + } + + @Override + public void stepChange(SimulationContext context, TimeStep step) { + SimulationControl control = context.getSimulationControl(); + + // we keep step to use in after simulation, for last call + lastStep = step; + // step is next step, we need previous for export + step = step.previous(); // make exports if (!allExports.isEmpty()) { control.setText(t("isisfish.message.export.export")); - File exportDir = SimulationStorage - .getResultExportDirectory(rootDirectory); - exportDir.mkdirs(); - ExportHelper.doExport(simulation, exportDir, allExports, - rootDirectory); + SimulationStorage simulation = context.getSimulationStorage(); + for (ExportContext e : allExports.values()) { + try { + e.export(simulation, step); + } catch (Exception eee) { + e.setException(eee); + } + } } } - /* - * @see fr.ifremer.isisfish.simulator.SimulationListener#beforeSimulation(fr.ifremer.isisfish.simulator.SimulationContext) - */ @Override - public void beforeSimulation(SimulationContext context) { + public void afterSimulation(SimulationContext context) { + SimulationControl control = context.getSimulationControl(); + + // make exports + if (!allExports.isEmpty()) { + control.setText(t("isisfish.message.export.export")); + SimulationStorage simulation = context.getSimulationStorage(); + for (ExportContext e : allExports.values()) { + // on ne met pas les deux exports dans le meme try-catch, au cas ou une seul des deux echouerait + try { + // un seul des deux est reellement fait + // pour les ExportStep + e.export(simulation, lastStep); + // pour les Export + e.export(simulation); + } catch (Exception eee) { + e.setException(eee); + } + try { + // pour les ExportStep + e.exportEnd(simulation); + } catch (Exception eee) { + e.setException(eee); + } + // il n'y aura plus d'ecriture dans le fichier on le ferme + e.close(); + } + + long writtenAll = 0; + long timeAll = 0; + for (ExportContext e : allExports.values()) { + String exportName = ExportStorage.getName(e.export); + writtenAll += e.bytes; + timeAll += e.time; + simulation.getInformation().addExportSize(exportName, e.bytes); + simulation.getInformation().addExportTime(exportName, e.time); + if (e.exception != null) { + simulation.getInformation().addExportException(exportName, e.exception); + } + } + simulation.getInformation().addAllExportSize(writtenAll); + simulation.getInformation().addAllExportTime(timeAll); + } } - @Override - public void stepChange(SimulationContext context, TimeStep step) { - } } Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationListener.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -49,7 +49,7 @@ * Receive event when simulation change step * * @param context - * @param step + * @param step new Step */ public void stepChange(SimulationContext context, TimeStep step); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameter.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameter.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameter.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -38,7 +38,7 @@ import fr.ifremer.isisfish.entities.Observation; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.Strategy; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityAnalysis; @@ -381,14 +381,14 @@ * * @return exports and observations map */ - public Map<Export, Observation> getOptimizationExportsObservations(); + public Map<ExportInfo, Observation> getOptimizationExportsObservations(); /** * Set exports and observations map. * * @param exportsObservations exports and observations map */ - public void setOptimizationExportsObservations(Map<Export, Observation> exportsObservations); + public void setOptimizationExportsObservations(Map<ExportInfo, Observation> exportsObservations); /** * If this simulation is generated by Optimization, return generation number Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterCache.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterCache.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterCache.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -48,7 +48,7 @@ import fr.ifremer.isisfish.entities.Observation; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.Strategy; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityAnalysis; @@ -990,13 +990,13 @@ } @Override - public Map<Export, Observation> getOptimizationExportsObservations() { + public Map<ExportInfo, Observation> getOptimizationExportsObservations() { SimulationParameter param = getParam(); return param.getOptimizationExportsObservations(); } @Override - public void setOptimizationExportsObservations(Map<Export, Observation> exportsObservations) { + public void setOptimizationExportsObservations(Map<ExportInfo, Observation> exportsObservations) { SimulationParameter param = getParam(); param.setOptimizationExportsObservations(exportsObservations); store(param); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -68,7 +68,7 @@ import fr.ifremer.isisfish.entities.PopulationDAO; import fr.ifremer.isisfish.entities.Strategy; import fr.ifremer.isisfish.entities.StrategyDAO; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.ExportHelper; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.rule.Rule; @@ -163,7 +163,7 @@ * plan la valeur est -1. */ protected Integer simulationPlanNumber; - /** Export utilisés pour les analyses de sensibilités. */ + /** ExportInfo utilisés pour les analyses de sensibilités. */ protected List<SensitivityExport> sensitivityExports; /** @@ -197,7 +197,7 @@ protected Objective objective; /** Exports et observations (optimisation). */ - protected Map<Export, Observation> optimizationExportsObservations; + protected Map<ExportInfo, Observation> optimizationExportsObservations; /** If this simulation is generated by Optimization, generation number */ protected Integer optimizationGeneration; @@ -992,7 +992,7 @@ } @Override - public Map<Export, Observation> getOptimizationExportsObservations() { + public Map<ExportInfo, Observation> getOptimizationExportsObservations() { if (optimizationExportsObservations == null) { // must be sorted for ui (LinkedHashMap) optimizationExportsObservations = new LinkedHashMap<>(); @@ -1019,7 +1019,7 @@ for (String name : optimizationExportList) { if (StringUtils.isNotBlank(name)) { try { - Export export = ExportStorage.getExport(name).getNewInstance(); + ExportInfo export = ExportStorage.getExport(name).getNewInstance(); Observation observation = null; String observationId = propertiesParameters.getProperty( SimulationParameterPropertiesHelper. @@ -1055,7 +1055,7 @@ } @Override - public void setOptimizationExportsObservations(Map<Export, Observation> optimizationExportsObservations) { + public void setOptimizationExportsObservations(Map<ExportInfo, Observation> optimizationExportsObservations) { this.optimizationExportsObservations = optimizationExportsObservations; } @@ -1653,7 +1653,7 @@ result.optimization = optimization; } if (optimizationExportsObservations != null) { - result.optimizationExportsObservations = new LinkedHashMap<Export, Observation>(optimizationExportsObservations); + result.optimizationExportsObservations = new LinkedHashMap<ExportInfo, Observation>(optimizationExportsObservations); } if (resultEnabled != null) { result.resultEnabled = new LinkedList<String>(resultEnabled); @@ -1852,8 +1852,8 @@ String optimizationExportsList = ""; int optimizationExportIndex = 0; ConvertUtilsBean beanUtils = ConverterUtil.getConverter(null); - for (Map.Entry<Export, Observation> exportObservationEntry : optimizationExportsObservations.entrySet()) { - Export export = exportObservationEntry.getKey(); + for (Map.Entry<ExportInfo, Observation> exportObservationEntry : optimizationExportsObservations.entrySet()) { + ExportInfo export = exportObservationEntry.getKey(); optimizationExportsList += ExportStorage.getName(export) + LIST_SEPARATOR; // add in props observation id export index Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -553,6 +553,9 @@ SimulationStorage simulation = context.getSimulationStorage(); // enregistrement des listeners de resultat // - ResultStorage + // TODO poussin 20141219 ca ne sert plus a rien que le result storage + // soit listener avec ResultStorageCSV, donc a supprimer et l'implement + // dans ResultStorage de SimulationListener context.addSimulationListener(simulation.getResultStorage()); // - TODO: mexico xml result Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/OptimizationPrepareJob.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -25,6 +25,8 @@ * #L% */ +import fr.ifremer.isisfish.IsisConfig; + import static org.nuiton.i18n.I18n.t; import java.io.File; @@ -41,12 +43,19 @@ import fr.ifremer.isisfish.IsisFishRuntimeException; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.entities.Observation; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.simulator.Objective; import fr.ifremer.isisfish.simulator.Optimization; import fr.ifremer.isisfish.simulator.OptimizationContextInternal; import fr.ifremer.isisfish.simulator.SimulationControl; import fr.ifremer.isisfish.simulator.SimulationParameter; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.zip.GZIPInputStream; +import org.apache.commons.lang3.StringUtils; /** * Permet de generer l'enchainement des simulations d'optimisation. @@ -179,15 +188,29 @@ List<MatrixND> observations = new ArrayList<>(); // recuperation des exports et observations - Map<Export, Observation> exportsObservations = sim.getParameter().getOptimizationExportsObservations(); - for (Map.Entry<Export, Observation> exportObservation : exportsObservations.entrySet()) { - Export export = exportObservation.getKey(); + Map<ExportInfo, Observation> exportsObservations = sim.getParameter().getOptimizationExportsObservations(); + for (Map.Entry<ExportInfo, Observation> exportObservation : exportsObservations.entrySet()) { + ExportInfo export = exportObservation.getKey(); Observation observation = exportObservation.getValue(); File rootDirectory = sim.getDirectory(); File resultExportDirectory = SimulationStorage.getResultExportDirectory(rootDirectory); String fullFilename = export.getExportFilename() + export.getExtensionFilename(); File exportFile = new File(resultExportDirectory, fullFilename); + + if (!exportFile.isFile() && !StringUtils.endsWithIgnoreCase(fullFilename, IsisConfig.COMPRESSION_EXTENSION)) { + // file doesn't exist, perhaps gzipped version exist, we try with .gz + fullFilename += ".gz"; + exportFile = new File(resultExportDirectory, fullFilename); + } + + Reader reader; + if (StringUtils.endsWithIgnoreCase(fullFilename, IsisConfig.COMPRESSION_EXTENSION)) { + reader = new BufferedReader(new InputStreamReader( + new GZIPInputStream(new FileInputStream(exportFile)), IsisConfig.charset)); + } else { + reader = new BufferedReader(new FileReader(exportFile)); + } // read matrix file MatrixND exportMatrix = null; @@ -198,7 +221,7 @@ exportMatrix = observation.getValue().clone(); // import - exportMatrix.importCSV(exportFile, new int[] {0, 0}); + exportMatrix.importCSV(reader, new int[] {0, 0}); } exports.add(exportMatrix); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -77,7 +77,7 @@ import fr.ifremer.isisfish.datastore.SimulationPlanStorage; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.SimulatorStorage; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.mexico.MexicoHelper; import fr.ifremer.isisfish.rule.Rule; @@ -831,7 +831,7 @@ } // copie des export d'optimisation - for (Export export : param.getOptimizationExportsObservations().keySet()) { + for (ExportInfo export : param.getOptimizationExportsObservations().keySet()) { String name = ExportStorage.getName(export); if (!param.getExportNames().contains(name)) { // duplicated code Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListModel.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListModel.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListModel.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -29,7 +29,7 @@ import javax.swing.AbstractListModel; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; /** * Model pour la liste des instances d'exports. @@ -40,12 +40,12 @@ * Last update : $Date$ * By : $Author$ */ -public class ExportListModel extends AbstractListModel<Export> { +public class ExportListModel extends AbstractListModel<ExportInfo> { /** serialVersionUID. */ private static final long serialVersionUID = -4070846632975105788L; - protected List<Export> exports; + protected List<ExportInfo> exports; /** * Empty constructor. @@ -59,7 +59,7 @@ * * @param exports exports */ - public ExportListModel(List<Export> exports) { + public ExportListModel(List<ExportInfo> exports) { setExport(exports); } @@ -68,7 +68,7 @@ * * @return the exports */ - public List<Export> getExports() { + public List<ExportInfo> getExports() { return exports; } @@ -77,7 +77,7 @@ * * @param exports the exports to set */ - public void setExport(List<Export> exports) { + public void setExport(List<ExportInfo> exports) { this.exports = exports; } @@ -85,7 +85,7 @@ * @see javax.swing.ListModel#getElementAt(int) */ @Override - public Export getElementAt(int index) { + public ExportInfo getElementAt(int index) { return exports.get(index); } Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListRenderer.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListRenderer.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportListRenderer.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -32,7 +32,7 @@ import javax.swing.JList; import fr.ifremer.isisfish.datastore.ExportStorage; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; /** * Renderer pour la liste des export. @@ -60,7 +60,7 @@ JLabel c = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - Export export = (Export) value; + ExportInfo export = (ExportInfo) value; c.setText(ExportStorage.getName(export)); try { Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportNameListRenderer.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportNameListRenderer.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/models/export/ExportNameListRenderer.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -36,7 +36,7 @@ import javax.swing.JList; import fr.ifremer.isisfish.datastore.ExportStorage; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.ui.util.TooltipHelper; /** @@ -53,14 +53,14 @@ /** serialVersionUID. */ private static final long serialVersionUID = -4070846632975105788L; - /** Export cache. */ - protected Map<String, Export> exportCache; + /** ExportInfo cache. */ + protected Map<String, ExportInfo> exportCache; /** * Empty constructor. */ public ExportNameListRenderer() { - exportCache = new HashMap<String, Export>(); + exportCache = new HashMap<String, ExportInfo>(); } /* @@ -81,7 +81,7 @@ // c'est tres couteux d'avoir une instance // on les met en cache try { - Export export = exportCache.get(exportName); + ExportInfo export = exportCache.get(exportName); if (export == null) { ExportStorage storage = ExportStorage.getExport(exportName); export = storage.getNewInstance(); Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportObservationTableModel.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportObservationTableModel.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportObservationTableModel.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -31,7 +31,7 @@ import javax.swing.table.AbstractTableModel; import fr.ifremer.isisfish.entities.Observation; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; public class ExportObservationTableModel extends AbstractTableModel { @@ -39,10 +39,10 @@ private static final long serialVersionUID = 7555677813473489539L; /** Optimizations exports and observations. */ - protected Map<Export, Observation> optimizationExportsObservations; + protected Map<ExportInfo, Observation> optimizationExportsObservations; /** Indexed keys list. */ - protected List<Export> keysCache; + protected List<ExportInfo> keysCache; /** Columns names. */ public final static String[] COLUMN_NAMES = { @@ -54,22 +54,22 @@ } - public ExportObservationTableModel(Map<Export, Observation> optimizationExportsObservations) { + public ExportObservationTableModel(Map<ExportInfo, Observation> optimizationExportsObservations) { this(); setOptimizationExportsObservations(optimizationExportsObservations); } - public void setOptimizationExportsObservations(Map<Export, Observation> optimizationExportsObservations) { + public void setOptimizationExportsObservations(Map<ExportInfo, Observation> optimizationExportsObservations) { this.optimizationExportsObservations = optimizationExportsObservations; - keysCache = new ArrayList<Export>(optimizationExportsObservations.keySet()); + keysCache = new ArrayList<ExportInfo>(optimizationExportsObservations.keySet()); fireTableDataChanged(); } - public Export getExportForRow(int line) { + public ExportInfo getExportForRow(int line) { return keysCache.get(line); } - public void deleteExport(Export export) { + public void deleteExport(ExportInfo export) { int index = keysCache.indexOf(export); keysCache.remove(index); fireTableRowsDeleted(index, index); @@ -106,7 +106,7 @@ @Override public Object getValueAt(int rowIndex, int columnIndex) { - Export export = keysCache.get(rowIndex); + ExportInfo export = keysCache.get(rowIndex); Object result = export; if (columnIndex == 1) { result = optimizationExportsObservations.get(export); @@ -124,7 +124,7 @@ @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - Export export = getExportForRow(rowIndex); + ExportInfo export = getExportForRow(rowIndex); this.optimizationExportsObservations.put(export, (Observation)aValue); } } Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportTableCellRenderer.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportTableCellRenderer.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/models/optimization/ExportTableCellRenderer.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -32,10 +32,10 @@ import javax.swing.table.DefaultTableCellRenderer; import fr.ifremer.isisfish.entities.Observation; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; /** - * Export renderer for table. + * ExportInfo renderer for table. * * @author chatellier * @version $Revision$ @@ -60,7 +60,7 @@ switch (column) { case 0: - Export export = (Export)value; + ExportInfo export = (ExportInfo)value; stringValue = value.getClass().getSimpleName(); tooltip = export.getDescription(); break; Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -23,6 +23,8 @@ package fr.ifremer.isisfish.ui.result; +import fr.ifremer.isisfish.IsisConfig; + import static org.nuiton.i18n.I18n.t; import java.awt.BorderLayout; @@ -33,13 +35,13 @@ import java.beans.PropertyVetoException; import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; import java.io.Writer; import java.util.List; import javax.swing.JMenuItem; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.math.matrix.MatrixND; @@ -56,12 +58,19 @@ import fr.ifremer.isisfish.datastore.StorageException; import fr.ifremer.isisfish.entities.FisheryRegion; import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportHelper; +import fr.ifremer.isisfish.export.ExportInfo; +import fr.ifremer.isisfish.export.ExportStep; import fr.ifremer.isisfish.logging.SimulationLoggerUtil; import fr.ifremer.isisfish.simulator.launcher.SimulationJob; import fr.ifremer.isisfish.simulator.launcher.SimulationService; import fr.ifremer.isisfish.simulator.launcher.SimulationServiceListener; +import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.ui.CommonHandler; import fr.ifremer.isisfish.ui.models.common.GenericComboModel; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.util.zip.GZIPOutputStream; /** * Handler for result UIs. @@ -245,23 +254,14 @@ public void actionPerformed(ActionEvent e) { try { - File file = FileUtil.getFile(".+\\.csv", t("isisfish.result.export.file")); - // add csv extension if not set - if (!file.getName().endsWith(".csv")) { - file = new File(file.getAbsolutePath() + ".csv"); - } + File file = FileUtil.getFile(".+\\.csv(\\.gz)?", t("isisfish.result.export.file")); if (file != null) { - Writer out = null; - try { - out = new BufferedWriter(new FileWriter(file)); - ExportStorage storage = ExportStorage.getExport(exportName); - Export export = storage.getNewInstance(); - export.export(simulationStorage, out); + // add csv extension if not set + if (!file.getName().matches(".+\\.csv(\\.gz)?")) { + file = new File(file.getAbsolutePath() + ".csv.gz"); } - finally { - IOUtils.closeQuietly(out); - } - } + ExportHelper.exportToFile(simulationStorage, exportName, file); + } } catch(Exception eee) { if (log.isWarnEnabled()) { log.warn("Erreur lors de l'export ", eee); Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -476,6 +476,7 @@ script = SimulationPlanStorage.getSimulationPlan(file.getName(), Location.OFFICIAL); break; case Export: + case ExportStep: script = ExportStorage.getExport(file.getName(), Location.OFFICIAL); break; case Script: @@ -503,6 +504,7 @@ script = SimulationPlanStorage.getSimulationPlan(file.getName(), Location.COMMUNITY); break; case CommunityExport: + case CommunityExportStep: script = ExportStorage.getExport(file.getName(), Location.COMMUNITY); break; case CommunityScript: @@ -1130,6 +1132,9 @@ Export( ExportStorage.getExportDirectory(), ExportStorage.EXPORT_TEMPLATE, true), + ExportStep( + ExportStorage.getExportDirectory(), + ExportStorage.EXPORT_STEP_TEMPLATE, true), Rule( RuleStorage.getRuleDirectory(), RuleStorage.RULE_TEMPLATE, true), @@ -1159,8 +1164,11 @@ FormuleStorage.FORMULE_TEMPLATE, true), CommunityExport( - ExportStorage.getCommunityExportDirectory(), + ExportStorage.getCommunityExportDirectory(), ExportStorage.EXPORT_TEMPLATE), + CommunityExportStep( + ExportStorage.getCommunityExportDirectory(), + ExportStorage.EXPORT_STEP_TEMPLATE), CommunityObjective( ObjectiveStorage.getCommunityObjectiveDirectory(), ObjectiveStorage.OBJECTIVE_TEMPLATE, true), Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx 2014-12-19 18:40:04 UTC (rev 4166) @@ -51,6 +51,8 @@ onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.CommunitySimulator)' icon="script.png" /> <JMenuItem id="miNewExport" text="isisfish.script.menu.txtNewExport" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.CommunityExport)' icon="script.png" /> + <JMenuItem id="miNewExportStep" text="isisfish.script.menu.txtNewExportStep" + onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.CommunityExportStep)' icon="script.png" /> <JMenuItem id="miNewRule" text="isisfish.script.menu.txtNewRule" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.CommunityRule)' icon="script.png" /> <JMenuItem id="miNewSImulationPlan" text="isisfish.script.menu.txtNewSimulationPlan" Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/OptimizationHandler.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/OptimizationHandler.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/OptimizationHandler.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -45,7 +45,7 @@ import fr.ifremer.isisfish.datastore.RegionStorage; import fr.ifremer.isisfish.entities.FisheryRegion; import fr.ifremer.isisfish.entities.Observation; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.simulator.Objective; import fr.ifremer.isisfish.simulator.Optimization; import fr.ifremer.isisfish.simulator.SimulationParameter; @@ -286,7 +286,7 @@ } /** - * Export model for combo box. + * ExportInfo model for combo box. * * @return model */ @@ -306,14 +306,14 @@ } /** - * Export model for combo box. + * ExportInfo model for combo box. * * @param view view * @return model */ public ExportObservationTableModel getExportObservationTableModel(OptimizationUI view) { SimulationParameter param = getSimulationParameter(view); - Map<Export, Observation> optimizationExportsObservations = param.getOptimizationExportsObservations(); + Map<ExportInfo, Observation> optimizationExportsObservations = param.getOptimizationExportsObservations(); ExportObservationTableModel model = new ExportObservationTableModel(optimizationExportsObservations); return model; } @@ -334,10 +334,10 @@ try { // create export instance ExportStorage exportStorage = ExportStorage.getExport(selectedExport); - Export export = exportStorage.getNewInstance(); + ExportInfo export = exportStorage.getNewInstance(); // add export instance into parameters - Map<Export, Observation> optimizationExports = param.getOptimizationExportsObservations(); + Map<ExportInfo, Observation> optimizationExports = param.getOptimizationExportsObservations(); optimizationExports.put(export, null); // new entry tableModel.setOptimizationExportsObservations(optimizationExports); // FIXME add fire param.setOptimizationExportsObservations(optimizationExports); @@ -355,14 +355,14 @@ public void removeExports(OptimizationUI view) { // get element SimulationParameter param = getSimulationParameter(view); - Map<Export, Observation> optimizationExports = param.getOptimizationExportsObservations(); + Map<ExportInfo, Observation> optimizationExports = param.getOptimizationExportsObservations(); ExportObservationTableModel tableModel = (ExportObservationTableModel)view.getExportObservationTable().getModel(); JTable table = view.getExportObservationTable(); int[] rows = table.getSelectedRows(); // reverse order for (int i = rows.length - 1; i >= 0; i--) { - Export export = tableModel.getExportForRow(rows[i]); + ExportInfo export = tableModel.getExportForRow(rows[i]); optimizationExports.remove(export); tableModel.deleteExport(export); } @@ -379,7 +379,7 @@ public void clearExports(OptimizationUI view) { // get elements SimulationParameter param = getSimulationParameter(view); - Map<Export, Observation> optimizationExports = param.getOptimizationExportsObservations(); + Map<ExportInfo, Observation> optimizationExports = param.getOptimizationExportsObservations(); ExportObservationTableModel tableModel = (ExportObservationTableModel)view.getExportObservationTable().getModel(); // clear Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -75,7 +75,7 @@ import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.Species; import fr.ifremer.isisfish.entities.Strategy; -import fr.ifremer.isisfish.export.Export; +import fr.ifremer.isisfish.export.ExportInfo; import fr.ifremer.isisfish.export.SensitivityExport; import fr.ifremer.isisfish.mexico.MexicoHelper; import fr.ifremer.isisfish.rule.Rule; @@ -774,7 +774,7 @@ return SensitivityExportStorage.getParameterNames(export); } - public void setSensitivityExportParameterValue(Export export, + public void setSensitivityExportParameterValue(ExportInfo export, String paramName, Object value) { if (value != null) { try { Modified: trunk/src/main/resources/i18n/isis-fish_en_GB.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2014-12-19 18:40:04 UTC (rev 4166) @@ -896,6 +896,7 @@ isisfish.script.menu.txtImport=Import isisfish.script.menu.txtNewEquationModel=New equation model isisfish.script.menu.txtNewExport=New export +isisfish.script.menu.txtNewExportStep=New export per Step isisfish.script.menu.txtNewObjective=New objective function isisfish.script.menu.txtNewOptimization=New optimization script isisfish.script.menu.txtNewRule=New rule Modified: trunk/src/main/resources/i18n/isis-fish_fr_FR.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2014-12-18 12:17:02 UTC (rev 4165) +++ trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2014-12-19 18:40:04 UTC (rev 4166) @@ -894,6 +894,7 @@ isisfish.script.menu.txtImport=Importer isisfish.script.menu.txtNewEquationModel=Nouvelle formule isisfish.script.menu.txtNewExport=Nouveau script d'export +isisfish.script.menu.txtNewExportStep=Nouveau script d'export par pas de temps isisfish.script.menu.txtNewObjective=Nouvelle fonction d'objectif isisfish.script.menu.txtNewOptimization=Nouveau script d'optimisation isisfish.script.menu.txtNewRule=Nouvelle règle Added: trunk/src/main/resources/templates/script/exportStep.ftl =================================================================== --- trunk/src/main/resources/templates/script/exportStep.ftl (rev 0) +++ trunk/src/main/resources/templates/script/exportStep.ftl 2014-12-19 18:40:04 UTC (rev 4166) @@ -0,0 +1,173 @@ +<#-- + #%L + IsisFish + + $Id: export.ftl 4156 2014-12-09 11:27:18Z echatellier $ + $HeadURL: http://svn.forge.codelutin.com/svn/isis-fish/trunk/src/main/resources/templa... $ + %% + Copyright (C) 2009 - 2014 Ifremer, CodeLutin, Chatellier Eric + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU 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 Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% +--> +/* + * Copyright (C) ${date?date?string("yyyy")} ${author} + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + */ + +package exports; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.Writer; + +import org.nuiton.math.matrix.*; + +import scripts.ResultName; + +import fr.ifremer.isisfish.util.Doc; +import fr.ifremer.isisfish.entities.*; +import fr.ifremer.isisfish.export.ExportStep; +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.datastore.ResultStorage; + +/** + * ${name}.java + * + * Created: ${date?date?string.long} + * + * @author ${author} <${email}> + * @version $Revision: 4156 $ + * + * Last update: $Date: 2014-12-09 12:27:18 +0100 (mar. 09 déc. 2014) ${date?date?string.long} $ + * by : $Author: echatellier ${author} $ + */ +public class ${name} implements ExportStep { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + private static Log log = LogFactory.getLog(${name}.class); + + protected String[] necessaryResult = { + // put here all necessary result for this rule + // example: + // ResultName.MATRIX_BIOMASS, + // ResultName.MATRIX_EFFORT_PER_STRATEGY_MET, + }; + + /** + * Necessary results names for export execution. + * + * @return the necessaryResult name + */ + @Override + public String[] getNecessaryResult() { + return this.necessaryResult; + } + + /** + * Return Export description. + * + * @return string displayable to the end user + */ + @Override + public String getExportFilename() { + return "${name}"; + } + + /** + * Return filename used to contains export data. + * + * @return filename by example "myexport" + */ + @Override + public String getExtensionFilename() { + return ".csv"; + } + + /** + * Return extension used as filename name extension. + * + * @return extension by example ".csv" + */ + @Override + public String getDescription() { + return "TODO export description"; + } + + /** + * Exporte les resultats, cette methode est appellee a la fin de chaque pas + * de temps. Elle peut ecrire dans le fichier via le parametre out, + * ou collecter les informations et les ecrires a la fin de la simulation + * lorsque la methode {@link #export(fr.ifremer.isisfish.datastore.SimulationStorage, java.io.Writer) + * est appelee. + * + * @param simulation la simulation dont on souhaite exporter les resultats + * @param step le pas de temps courant de la simulation + * @param out la sortie sur lequel il faut ecrire l'export + * @throws Exception if export fail + */ + @Override + public void export(SimulationStorage simulation, TimeStep step, Writer out) + throws Exception { + // If your export can be done by step, write your code here. + // You can collect data and write result in exportEnd method. + // If you need to access database during simulation + // you can use: TopiaContext tx = SimulationContext.get().getDB() + + // example: + // MatrixND mat = simulation.getResultStorage().getMatrix(step, + // ResultName.MATRIX_EFFORT_PER_STRATEGY_MET); + // if (mat != null) { // can be null if no result for this step + // for (MatrixIterator i = mat.iterator(); i.hasNext();) { + // i.next(); + // Object[] sems = i.getSemanticsCoordinates(); + // Strategy strategy = (Strategy) sems[0]; + // Metier metier = (Metier) sems[1]; + // + // double val = i.getValue(); + // out.write(step.getStep() + strategy.getName() + ";" + // + metier.getName() + val + "\n"); + // } + // } + } + + /** + * Appeler a la fin de l'export + * + * @param simulation la simulation dont on souhaite exporter les resultats + * @param out la sortie sur lequel il faut ecrire l'export + * @throws Exception if export fail + */ + public void exportEnd(SimulationStorage simulation, Writer out) + throws Exception { + // if you need to do something at the end of export, put your code here + } + + +} Copied: trunk/src/test/java/fr/ifremer/isisfish/datastore/ExportStepStorageTest.java (from rev 4158, trunk/src/test/java/fr/ifremer/isisfish/datastore/ExportStorageTest.java) =================================================================== --- trunk/src/test/java/fr/ifremer/isisfish/datastore/ExportStepStorageTest.java (rev 0) +++ trunk/src/test/java/fr/ifremer/isisfish/datastore/ExportStepStorageTest.java 2014-12-19 18:40:04 UTC (rev 4166) @@ -0,0 +1,95 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2014 Ifremer, CodeLutin, Chatellier Eric, Poussin Benjamin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +package fr.ifremer.isisfish.datastore; + +import java.io.StringWriter; +import java.io.Writer; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import fr.ifremer.isisfish.AbstractIsisFishTest; +import fr.ifremer.isisfish.IsisFish; +import fr.ifremer.isisfish.datastore.CodeSourceStorage.Location; +import freemarker.template.Configuration; +import freemarker.template.Template; + +/** + * ExportStorageTest. + * + * Created: 19 dec. 2014 18:22 + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class ExportStepStorageTest extends AbstractIsisFishTest { + + protected Configuration freemarkerConfiguration; + + @Before + public void setUp() throws Exception { + freemarkerConfiguration = getFreemarkerConfiguration(); + } + + @Test + public void testNewExportWithCompilation() throws Exception { + + String fileName = "TestExport1"; + + ExportStorage exportStorage = ExportStorage.createExport(fileName, Location.COMMUNITY); + + // get template + Template template = freemarkerConfiguration + .getTemplate(ExportStorage.EXPORT_STEP_TEMPLATE); + + // context values + Map<String, Object> root = new HashMap<String, Object>(); + // FIXME what is category ? + root.put("category", ""); + root.put("name", fileName); + root.put("date", new Date()); + root.put("author", IsisFish.config.getUserName()); + root.put("email", IsisFish.config.getUserMail()); + + // process template + Writer out = new StringWriter(); + template.process(root, out); + out.flush(); + exportStorage.setContent(out.toString()); + + // 0 = compile success + int compileResult = exportStorage.compile(false, null); + Assert.assertEquals(0, compileResult); + } + +}
participants (1)
-
bpoussin@users.forge.codelutin.com