This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository izi-eval. See http://git.codelutin.com/izi-eval.git commit 082f99decdec72c1e2496817400e00e7fdea55c5 Author: Eric Chatellier <chatellier@codelutin.com> Date: Tue Jan 12 15:44:36 2016 +0100 fixes #7572 : Importer des valeurs seuils fixes #7563 : Importation de données qualitatives --- masc-api/pom.xml | 6 ++ .../inra/masc/io/parser/CsvThresholdsParser.java | 82 +++++++++++++++++++++ .../inra/masc/io/writer/CsvThresholdsWriter.java | 85 ++++++++++++++++++++++ .../fr/inra/masc/services/ThresholdService.java | 44 +++++++---- masc-ui/pom.xml | 1 + .../main/java/fr/inra/masc/ui/MascUIHelper.java | 4 +- .../editor/threshold/ThresholdEditorHandler.java | 32 +++++--- .../inra/masc/ui/widget/SvgImagePanelHandler.java | 3 - .../main/resources/i18n/masc-ui_en_GB.properties | 4 + .../main/resources/i18n/masc-ui_fr_FR.properties | 4 + 10 files changed, 234 insertions(+), 31 deletions(-) diff --git a/masc-api/pom.xml b/masc-api/pom.xml index 35a2bb2..8399c10 100644 --- a/masc-api/pom.xml +++ b/masc-api/pom.xml @@ -166,6 +166,12 @@ <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-codec</artifactId> </dependency> + + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-csv</artifactId> + <version>1.2</version> + </dependency> </dependencies> diff --git a/masc-api/src/main/java/fr/inra/masc/io/parser/CsvThresholdsParser.java b/masc-api/src/main/java/fr/inra/masc/io/parser/CsvThresholdsParser.java new file mode 100644 index 0000000..db5fd52 --- /dev/null +++ b/masc-api/src/main/java/fr/inra/masc/io/parser/CsvThresholdsParser.java @@ -0,0 +1,82 @@ +package fr.inra.masc.io.parser; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; +import org.apache.commons.io.IOUtils; + +import com.google.common.base.Charsets; +import com.google.common.collect.Lists; +import com.google.common.io.Files; + +import fr.inra.masc.model.EditableCriteria; +import fr.inra.masc.model.EditableCriteriaImpl; +import fr.inra.masc.model.ThresholdOperator; +import fr.inra.masc.model.ThresholdValue; +import fr.inra.masc.model.ThresholdValueImpl; + +public class CsvThresholdsParser { + + public List<EditableCriteria> getModel(File file) throws IOException { + + List<EditableCriteria> criterias = Lists.newArrayList(); + + BufferedReader reader = Files.newReader(file, Charsets.UTF_8); + CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.withAllowMissingColumnNames()); + + try { + + String line; + + for (CSVRecord record : parser) { + EditableCriteria criteria = loadCriteria(record); + criterias.add(criteria); + } + + // close reader + parser.close(); + } finally { + + // make sure model is closed + IOUtils.closeQuietly(parser); + } + + return criterias; + } + + protected EditableCriteria loadCriteria(CSVRecord record) { + + Iterator<String> itr = record.iterator(); + + String criteriaName = itr.next(); + String unit = itr.next(); + + List<ThresholdValue> values = Lists.newArrayList(); + + EditableCriteria result = new EditableCriteriaImpl(); + result.setUnit(unit); + result.setName(criteriaName); + while (itr.hasNext()) { + + String operatorString = itr.next(); + ThresholdOperator operator = + ThresholdOperator.fromString(operatorString); + + String valueString = itr.next(); + Double value = Double.valueOf(valueString); + + values.add(new ThresholdValueImpl(value, + operator.getSign(), + operator.isCanBeEqual())); + } + result.setValues(values); + + return result; + } +} diff --git a/masc-api/src/main/java/fr/inra/masc/io/writer/CsvThresholdsWriter.java b/masc-api/src/main/java/fr/inra/masc/io/writer/CsvThresholdsWriter.java new file mode 100644 index 0000000..cf66ee5 --- /dev/null +++ b/masc-api/src/main/java/fr/inra/masc/io/writer/CsvThresholdsWriter.java @@ -0,0 +1,85 @@ +package fr.inra.masc.io.writer; +/* + * #%L + * Masc :: API + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2016 Inra, Codelutin, Tony chemit + * %% + * 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% + */ + +import com.google.common.base.Charsets; +import com.google.common.io.Files; +import fr.inra.masc.model.EditableCriteria; +import fr.inra.masc.model.ThresholdOperator; +import fr.inra.masc.model.ThresholdValue; +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.util.List; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVPrinter; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +/** + * To export in a file thresholds as csv format. + */ +public class CsvThresholdsWriter { + + public void write(List<EditableCriteria> criterias, File file) throws IOException { + + BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8); + CSVPrinter printer = CSVFormat.DEFAULT.withAllowMissingColumnNames().print(writer); + try { + + for (EditableCriteria criteria : criterias) { + criteriaToString(criteria, printer); + } + + // close writer + printer.close(); + } finally { + IOUtils.closeQuietly(printer); + } + } + + protected String criteriaToString(EditableCriteria criteria, CSVPrinter printer) throws IOException { + List<ThresholdValue> values = criteria.getValues(); + String result = null; + + if (!CollectionUtils.isEmpty(values)) { + + printer.print(criteria.getName()); + String unit = criteria.getUnit(); + printer.print(StringUtils.isBlank(unit) ? "" : unit); + + for (ThresholdValue value : values) { + + ThresholdOperator operator = + ThresholdOperator.fromThresholdValue(value); + printer.print(operator.getText()); + printer.print(value.getValue()); + } + + printer.println(); + } + return result; + } +} diff --git a/masc-api/src/main/java/fr/inra/masc/services/ThresholdService.java b/masc-api/src/main/java/fr/inra/masc/services/ThresholdService.java index c362050..afde6bb 100644 --- a/masc-api/src/main/java/fr/inra/masc/services/ThresholdService.java +++ b/masc-api/src/main/java/fr/inra/masc/services/ThresholdService.java @@ -1,5 +1,16 @@ package fr.inra.masc.services; +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + /* * #%L * Masc :: API @@ -27,25 +38,18 @@ package fr.inra.masc.services; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; + import fr.inra.masc.MascTechnicalException; -import fr.inra.masc.utils.MascUtil; +import fr.inra.masc.io.parser.CsvThresholdsParser; import fr.inra.masc.io.parser.ThresholdsParser; +import fr.inra.masc.io.writer.CsvThresholdsWriter; import fr.inra.masc.io.writer.ThresholdsWriter; import fr.inra.masc.model.Criterias; import fr.inra.masc.model.EditableCriteria; import fr.inra.masc.model.MascModel; import fr.inra.masc.model.ThresholdValue; import fr.inra.masc.model.ThresholdValueImpl; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import fr.inra.masc.utils.MascUtil; /** * Service to import/export thresholds. @@ -68,8 +72,13 @@ public class ThresholdService extends MascService { List<EditableCriteria> criterias; try { - ThresholdsParser parser = new ThresholdsParser(); - criterias = parser.getModel(file); + if (file.getName().toLowerCase().endsWith(".csv")) { + CsvThresholdsParser parser = new CsvThresholdsParser(); + criterias = parser.getModel(file); + } else { + ThresholdsParser parser = new ThresholdsParser(); + criterias = parser.getModel(file); + } } catch (IOException e) { throw new MascTechnicalException( @@ -147,8 +156,13 @@ public class ThresholdService extends MascService { log.debug("Will export threshold to file: " + file); } try { - ThresholdsWriter writer = new ThresholdsWriter(); - writer.write(criterias, file); + if (file.getName().toLowerCase().endsWith(".csv")) { + CsvThresholdsWriter writer = new CsvThresholdsWriter(); + writer.write(criterias, file); + } else { + ThresholdsWriter writer = new ThresholdsWriter(); + writer.write(criterias, file); + } } catch (IOException eee) { throw new MascTechnicalException( "Failed to write thresholds file", eee); diff --git a/masc-ui/pom.xml b/masc-ui/pom.xml index be5e3fd..5c3098d 100644 --- a/masc-ui/pom.xml +++ b/masc-ui/pom.xml @@ -243,6 +243,7 @@ <configuration> <entries> <entry> + <basedir>${project.basedir}/src/main/java/</basedir> <basedir>${project.build.directory}/generated-sources/java/</basedir> </entry> </entries> diff --git a/masc-ui/src/main/java/fr/inra/masc/ui/MascUIHelper.java b/masc-ui/src/main/java/fr/inra/masc/ui/MascUIHelper.java index 238862c..08609b2 100644 --- a/masc-ui/src/main/java/fr/inra/masc/ui/MascUIHelper.java +++ b/masc-ui/src/main/java/fr/inra/masc/ui/MascUIHelper.java @@ -67,7 +67,9 @@ public class MascUIHelper extends JAXXWidgetUtil { JPG(_("masc.file.app.image.dialog"), null, _("masc.fileType.app.jpg"), ".jpg", ".jpeg"), SVG(_("masc.file.app.image.svg"), null, _("masc.fileType.app.svg"), ".svg"), CSV(_("masc.file.app.import.csv"), null, _("masc.fileType.app.csv"), ".csv"), - REPORT(null, _("masc.file.report.dialog"), _("masc.fileType.pdf"), ".pdf"); + REPORT(null, _("masc.file.report.dialog"), _("masc.fileType.pdf"), ".pdf"), + THRESHOLD(_("masc.file.app.threshold.open"), _("masc.file.app.threashold.save"), _("masc.fileType.threshold"), ".mthreshold"), + THRESHOLDCSV(_("masc.file.app.threshold.open"), _("masc.file.app.threashold.save"), _("masc.fileType.threshold.csv"), ".csv"); private String openTitle; diff --git a/masc-ui/src/main/java/fr/inra/masc/ui/content/editor/threshold/ThresholdEditorHandler.java b/masc-ui/src/main/java/fr/inra/masc/ui/content/editor/threshold/ThresholdEditorHandler.java index c4eafbe..df8e30e 100644 --- a/masc-ui/src/main/java/fr/inra/masc/ui/content/editor/threshold/ThresholdEditorHandler.java +++ b/masc-ui/src/main/java/fr/inra/masc/ui/content/editor/threshold/ThresholdEditorHandler.java @@ -172,15 +172,19 @@ public class ThresholdEditorHandler extends MascHandler { public void importValues() { - ImportThresholdModel model = new ImportThresholdModel(); + //ImportThresholdModel model = new ImportThresholdModel(); - boolean accept = showImportUI(model); + //boolean accept = showImportUI(model); + + File importFile = MascUIHelper.openFile( + ui, MascUIHelper.MascFileType.THRESHOLD.getOpenTitle(), + MascUIHelper.MascFileType.THRESHOLD, MascUIHelper.MascFileType.THRESHOLDCSV); - if (accept) { + if (importFile != null) { // can import thresholds - File importFile = model.getImportFile(); + //File importFile = model.getImportFile(); if (log.isInfoEnabled()) { log.info("Import threshold from " + importFile); @@ -222,15 +226,19 @@ public class ThresholdEditorHandler extends MascHandler { public void exportValues() { - ExportThresholdModel model = new ExportThresholdModel(); + File exportFile = MascUIHelper.saveAsFile( + ui, MascUIHelper.MascFileType.THRESHOLD.getOpenTitle(), "izi-eval", + MascUIHelper.MascFileType.THRESHOLD, MascUIHelper.MascFileType.THRESHOLDCSV); + + //ExportThresholdModel model = new ExportThresholdModel(); - boolean accept = showExportUI(model); + //boolean accept = showExportUI(model); - if (accept) { + if (exportFile != null) { // export thresholds - File exportFile = model.getExportFile(getThresholdExtension()); + //File exportFile = model.getExportFile(getThresholdExtension()); if (log.isInfoEnabled()) { log.info("Export thresholds to file " + exportFile); @@ -257,7 +265,7 @@ public class ThresholdEditorHandler extends MascHandler { return _("masc.config.threshold.extension"); } - protected boolean showExportUI(ExportThresholdModel model) { + /*protected boolean showExportUI(ExportThresholdModel model) { // show ui @@ -318,9 +326,9 @@ public class ThresholdEditorHandler extends MascHandler { doIt = valid || showExportUI(model); } return doIt; - } + }*/ - protected boolean showImportUI(ImportThresholdModel model) { + /*protected boolean showImportUI(ImportThresholdModel model) { // show ui @@ -369,7 +377,7 @@ public class ThresholdEditorHandler extends MascHandler { doIt = valid || showImportUI(model); } return doIt; - } + }*/ protected void reloadModel() { // reload model diff --git a/masc-ui/src/main/java/fr/inra/masc/ui/widget/SvgImagePanelHandler.java b/masc-ui/src/main/java/fr/inra/masc/ui/widget/SvgImagePanelHandler.java index 3bdcd32..ff5c366 100644 --- a/masc-ui/src/main/java/fr/inra/masc/ui/widget/SvgImagePanelHandler.java +++ b/masc-ui/src/main/java/fr/inra/masc/ui/widget/SvgImagePanelHandler.java @@ -39,8 +39,6 @@ import java.util.Date; import javax.swing.JComponent; import javax.swing.JOptionPane; -import org.apache.batik.ext.awt.image.spi.ImageWriter; -import org.apache.batik.ext.awt.image.spi.ImageWriterRegistry; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.swing.JSVGScrollPane; import org.apache.batik.swing.svg.GVTTreeBuilderAdapter; @@ -54,7 +52,6 @@ import org.apache.batik.transcoder.image.PNGTranscoder; import org.apache.batik.transcoder.svg2svg.SVGTranscoder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.xmlgraphics.image.writer.imageio.ImageIOJPEGImageWriter; import org.w3c.dom.svg.SVGDocument; import fr.inra.masc.ui.MascUIHelper; diff --git a/masc-ui/src/main/resources/i18n/masc-ui_en_GB.properties b/masc-ui/src/main/resources/i18n/masc-ui_en_GB.properties index d27c183..c2bf8cd 100644 --- a/masc-ui/src/main/resources/i18n/masc-ui_en_GB.properties +++ b/masc-ui/src/main/resources/i18n/masc-ui_en_GB.properties @@ -101,6 +101,10 @@ masc.file.app.r.dialog=Please select DEXi executable file. masc.file.export.dialog=Please select a file to export. masc.file.import.dialog=Please select a DEXi file. masc.file.open.dialog=Open a DEXi (*.dxi) or IZI-EVAL (*.izi) file +masc.file.app.threshold.open=Open threshold file +masc.file.app.threshold.save=Save threshold file +masc.fileType.threshold=IZI-EVAL threshold file (*.mthreshold) +masc.fileType.threshold.csv=IZI-EVAL threshold file (*.csv) masc.file.report.dialog=Please select a file to save the reports masc.file.saveAs.dialog=Save as a IZI-EVAL file masc.fileType.app.csv=CSV file (*.csv) diff --git a/masc-ui/src/main/resources/i18n/masc-ui_fr_FR.properties b/masc-ui/src/main/resources/i18n/masc-ui_fr_FR.properties index 8595dcf..3a0b531 100644 --- a/masc-ui/src/main/resources/i18n/masc-ui_fr_FR.properties +++ b/masc-ui/src/main/resources/i18n/masc-ui_fr_FR.properties @@ -108,7 +108,11 @@ masc.fileType.app.dexi=Fichier exécutable (*.exe) masc.fileType.app.dexiEval=Fichier exécutable (*.exe) masc.fileType.app.jpg=Image JPEG (*.jpg) masc.fileType.app.png=Image PNG (*.png) +masc.file.app.threshold.open=Ouvrir un fichier de valeurs-seuils +masc.file.app.threshold.save=Exporter un fichier de valeurs-seuils masc.fileType.app.r=Fichier exécutable (*.exe) +masc.fileType.threshold=IZI-EVAL fichier de valeurs-seuils (*.mthreshold) +masc.fileType.threshold.csv=IZI-EVAL fichier de valeurs-seuils (*.csv) masc.fileType.app.svg=Image SVG (*.svg) masc.fileType.dexi=Fichier DEXi (*.dxi) masc.fileType.masc=Fichier IZI-EVAL (*.izi) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.