r86 - in trunk/jmexico-model/src/main/java/fr/reseaumexico/model: parser writer
Author: tchemit Date: 2012-10-07 18:22:58 +0200 (Sun, 07 Oct 2012) New Revision: 86 Url: http://forge.codelutin.com/repositories/revision/jmexico/86 Log: fixes #1578: Import model parsers and writers refs #1576: Add import scenario action (implements Scenario parser) refs #1577: Add export scenario operation (implementsScenario writer) Added: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ScenarioXmlParser.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ScenarioXmlWriter.java Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ExperimentDesignParser.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/InputDesignParser.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/MexicoXmlParser.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/XmlParser.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ExperimentDesignXmlWriter.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/InputDesignXmlWriter.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/MexicoXmlWriter.java trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/XmlWriter.java Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ExperimentDesignParser.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ExperimentDesignParser.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ExperimentDesignParser.java 2012-10-07 16:22:58 UTC (rev 86) @@ -41,15 +41,13 @@ import fr.reseaumexico.model.MexicoTechnicalException; import fr.reseaumexico.model.MexicoXmlConstant; import fr.reseaumexico.model.ValueType; -import java.io.File; -import java.io.FileNotFoundException; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.util.List; import java.util.Map; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; /** * Parser for experiment design xml files, build a {@link ExperimentDesign} model. @@ -59,15 +57,18 @@ */ public class ExperimentDesignParser extends MexicoXmlParser<ExperimentDesign> implements MexicoXmlConstant { - protected Map<String, Factor> factors; + /** + * Cache of factors indexed by their id. + * + * @since 0.1 + */ + protected Map<String, Factor> factorCache; - public ExperimentDesignParser(File file) throws FileNotFoundException, UnsupportedEncodingException { - super(file); - factors = Maps.newLinkedHashMap(); - } - @Override protected ExperimentDesign parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException { + + factorCache = Maps.newLinkedHashMap(); + ExperimentDesign model = new ExperimentDesignImpl(); parseExperimentDesignMeta(parser, model); @@ -76,11 +77,12 @@ return model; } - protected void parseExperimentDesignMeta(XmlPullParser parser, ExperimentDesign model) throws IOException, XmlPullParserException, ParseException { + protected void parseExperimentDesignMeta(XmlPullParser parser, + ExperimentDesign model) throws IOException, XmlPullParserException, ParseException { // file must start with experiment design tag if (parser.nextTag() == XmlPullParser.START_TAG && - !parserEqual(parser, EXPERIMENT_DESIGN)) { + !parserEqual(parser, EXPERIMENT_DESIGN)) { throw new MexicoTechnicalException("Experiment design file must start with " + EXPERIMENT_DESIGN + " tag"); } @@ -101,8 +103,7 @@ model.setLicence(license); // parse description - if (parser.nextTag() == XmlPullParser.START_TAG && - parserEqual(parser, EXPERIMENT_DESIGN_DESCRIPTION)) { + if (testNextStartTag(parser, EXPERIMENT_DESIGN_DESCRIPTION)) { model.setDescription(parser.nextText()); @@ -111,16 +112,14 @@ } } - protected void parseFactors(XmlPullParser parser, ExperimentDesign model) throws IOException, XmlPullParserException { + protected void parseFactors(XmlPullParser parser, + ExperimentDesign model) throws IOException, XmlPullParserException { // factors - int eventType = parser.getEventType(); - if (eventType == XmlPullParser.START_TAG && - parserEqual(parser, FACTORS)) { + if (testCurrentStartTag(parser, FACTORS)) { List<Factor> factors = Lists.newArrayList(); - while (!(parser.nextTag() == XmlPullParser.END_TAG && - parserEqual(parser, FACTORS))) { + while (!testNextEndTag(parser, FACTORS)) { // factor factors.add(parseFactor(parser)); @@ -145,28 +144,23 @@ factor.setName(name); // while all child attributes is not parsed - while (!(parser.getEventType() == XmlPullParser.END_TAG && - parserEqual(parser, FACTOR))) { + while (!(testCurrentEndTag(parser, FACTOR))) { // parse description - int eventType = parser.nextTag(); - if (eventType == XmlPullParser.START_TAG && - parserEqual(parser, FACTOR_DESCRIPTION)) { + if (testNextStartTag(parser, FACTOR_DESCRIPTION)) { factor.setDescription(parser.nextText()); // read function close tag - eventType = parser.nextTag(); + parser.nextTag(); } // domain - if (eventType == XmlPullParser.START_TAG && - parserEqual(parser, DOMAIN)) { + if (testCurrentStartTag(parser, DOMAIN)) { factor.setDomain(parseDomain(parser)); } // features - if (parser.getEventType() == XmlPullParser.START_TAG && - parserEqual(parser, FEATURE)) { + if (testCurrentStartTag(parser, FEATURE)) { List<Feature> features = Lists.newArrayList(); @@ -186,7 +180,7 @@ } // keep factors - factors.put(factor.getId(), factor); + factorCache.put(factor.getId(), factor); return factor; } @@ -213,13 +207,10 @@ domain.setNominalValue(getTypedValue(domaineType, nominaleValue)); // while all child attributes is not parsed - while (!(parser.getEventType() == XmlPullParser.END_TAG && - parserEqual(parser, DOMAIN))) { + while (!(testCurrentEndTag(parser, DOMAIN))) { // distributionParameters - int eventType = parser.nextTag(); - if (eventType == XmlPullParser.START_TAG && - parserEqual(parser, DOMAIN_DISTRIBUTION_PARAMETER)) { + if (testNextStartTag(parser, DOMAIN_DISTRIBUTION_PARAMETER)) { List<DistributionParameter> distributionParameters = Lists.newArrayList(); while (parserEqual(parser, DOMAIN_DISTRIBUTION_PARAMETER)) { @@ -244,14 +235,13 @@ parser.nextTag(); // read next start tag - eventType = parser.nextTag(); + parser.nextTag(); } domain.setDistributionParameter(distributionParameters); } // level - if (eventType == XmlPullParser.START_TAG && - parserEqual(parser, DOMAIN_LEVEL)) { + if (testCurrentStartTag(parser, DOMAIN_LEVEL)) { List<Level> levels = Lists.newArrayList(); while (parserEqual(parser, DOMAIN_LEVEL)) { @@ -292,7 +282,7 @@ return feature; } - public Map<String, Factor> getFactors() { - return factors; + public Map<String, Factor> getFactorCache() { + return factorCache; } } Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/InputDesignParser.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/InputDesignParser.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/InputDesignParser.java 2012-10-07 16:22:58 UTC (rev 86) @@ -25,35 +25,23 @@ package fr.reseaumexico.model.parser; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import fr.reseaumexico.model.ExperimentDesign; -import fr.reseaumexico.model.Factor; import fr.reseaumexico.model.InputDesign; import fr.reseaumexico.model.InputDesignImpl; -import fr.reseaumexico.model.MexicoTechnicalException; import fr.reseaumexico.model.Scenario; -import fr.reseaumexico.model.ScenarioImpl; -import fr.reseaumexico.model.ValueType; -import java.io.File; -import java.io.FileNotFoundException; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.util.List; -import java.util.Map; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import static fr.reseaumexico.model.MexicoXmlConstant.FACTOR; import static fr.reseaumexico.model.MexicoXmlConstant.INPUT_DESIGN; import static fr.reseaumexico.model.MexicoXmlConstant.INPUT_DESIGN_DATE; import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO; -import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO_FACTOR_VALUES; -import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO_NAME; -import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO_ORDER_NUMBER; /** - * Parser for input design xml files, build a {@link InputDesign} model + * Parser for input design xml files, build a {@link InputDesign} model. * * @author sletellier <letellier@codelutin.com> * @since 0.1 @@ -62,9 +50,9 @@ protected ExperimentDesignParser experimentDesignParser; - public InputDesignParser(File file) throws FileNotFoundException, UnsupportedEncodingException { - super(file); - experimentDesignParser = new ExperimentDesignParser(file); + public InputDesignParser() { + super(); + experimentDesignParser = new ExperimentDesignParser(); } @Override @@ -85,72 +73,31 @@ protected void parseInputDesignMeta(XmlPullParser parser, InputDesign model) throws IOException, XmlPullParserException, ParseException { // file must start with input design tag - if (parser.next() == XmlPullParser.START_TAG && - !parserEqual(parser, INPUT_DESIGN)) { - throw new MexicoTechnicalException("Input design file must start with " + INPUT_DESIGN + " tag"); - } + checkStartFile( + parser, INPUT_DESIGN, + "Input design file must start with " + INPUT_DESIGN + " tag"); // parse date String dateAsString = parser.getAttributeValue(null, INPUT_DESIGN_DATE); model.setDate(parseDate(dateAsString)); } - protected void parseScenarios(XmlPullParser parser, InputDesign model) throws IOException, XmlPullParserException { + protected void parseScenarios(XmlPullParser parser, InputDesign model) throws IOException, XmlPullParserException, ParseException { // scenarios - if (parser.nextTag() == XmlPullParser.START_TAG && - parserEqual(parser, SCENARIO)) { + if (testNextStartTag(parser, SCENARIO)) { + ScenarioXmlParser scenarioXmlParser = + new ScenarioXmlParser( + experimentDesignParser.getFactorCache(), false); + List<Scenario> scenarios = Lists.newArrayList(); - while (!(parser.getEventType() == XmlPullParser.END_TAG && - parserEqual(parser, INPUT_DESIGN))) { + while (!(testCurrentEndTag(parser, INPUT_DESIGN))) { - // factor - scenarios.add(parseScenario(parser)); + Scenario scenario = scenarioXmlParser.parseModel(parser); + scenarios.add(scenario); } model.setScenario(scenarios); } } - - protected Scenario parseScenario(XmlPullParser parser) throws IOException, XmlPullParserException { - Scenario scenario = new ScenarioImpl(); - - // name - String name = parser.getAttributeValue(null, SCENARIO_NAME); - scenario.setName(name); - - // orderValue - String orderValue = parser.getAttributeValue(null, SCENARIO_ORDER_NUMBER); - scenario.setOrderNumber(Integer.parseInt(orderValue)); - - // factor values - if (parser.nextTag() == XmlPullParser.START_TAG && - parserEqual(parser, SCENARIO_FACTOR_VALUES)) { - - Map<Factor, Object> factorValues = Maps.newLinkedHashMap(); - while (!(parser.getEventType() == XmlPullParser.END_TAG && - parserEqual(parser, SCENARIO))) { - - // get factor - String factorId = parser.getAttributeValue(null, FACTOR); - Factor factor = experimentDesignParser.getFactors().get(factorId); - - ValueType valueType = factor.getDomain().getValueType(); - - // factor value - String value = parser.nextText(); - - factorValues.put(factor, getTypedValue(valueType, value)); - - // read next tag - parser.nextTag(); - } - scenario.setFactorValues(factorValues); - } - - // read next tag - parser.nextTag(); - - return scenario; - } } Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/MexicoXmlParser.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/MexicoXmlParser.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/MexicoXmlParser.java 2012-10-07 16:22:58 UTC (rev 86) @@ -27,9 +27,7 @@ import fr.reseaumexico.model.DateFormatFactory; import fr.reseaumexico.model.MexicoUtil; import fr.reseaumexico.model.ValueType; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.UnsupportedEncodingException; + import java.text.ParseException; import java.util.Date; @@ -41,10 +39,6 @@ */ public abstract class MexicoXmlParser<M> extends XmlParser<M> { - public MexicoXmlParser(File file) throws FileNotFoundException, UnsupportedEncodingException { - super(file); - } - public Date parseDate(String toParse) throws ParseException { return DateFormatFactory.getMexicoDateFormat().parse(toParse); } Added: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ScenarioXmlParser.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ScenarioXmlParser.java (rev 0) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ScenarioXmlParser.java 2012-10-07 16:22:58 UTC (rev 86) @@ -0,0 +1,133 @@ +package fr.reseaumexico.model.parser; + +/* + * #%L + * JMexico :: Model + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Réseau Mexico, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.Maps; +import fr.reseaumexico.model.Factor; +import fr.reseaumexico.model.Scenario; +import fr.reseaumexico.model.ScenarioImpl; +import fr.reseaumexico.model.ValueType; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.text.ParseException; +import java.util.Map; + +import static fr.reseaumexico.model.MexicoXmlConstant.FACTOR; +import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO; +import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO_FACTOR_VALUES; +import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO_NAME; +import static fr.reseaumexico.model.MexicoXmlConstant.SCENARIO_ORDER_NUMBER; + +/** + * Parser for input design xml files, build a {@link Scenario} model. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.7 + */ +public class ScenarioXmlParser extends MexicoXmlParser<Scenario> { + + /** + * Factors in input design model indexed by their id. + * + * @since 0.7 + */ + protected final Map<String, Factor> factors; + + /** + * Flag to know if parser is used standalone (says to import a scenario) or + * as part of input designer parser. + * + * @since 0.7 + */ + protected final boolean standalone; + + public ScenarioXmlParser(Map<String, Factor> factors) { + this(factors, true); + } + + public ScenarioXmlParser(Map<String, Factor> factors, boolean standalone) { + this.factors = factors; + this.standalone = standalone; + } + + @Override + protected Scenario parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException { + + if (standalone) { + // file must start with input design tag + checkStartFile( + parser, SCENARIO, + "Scenario file must start with " + SCENARIO + " tag"); + } + + Scenario scenario = new ScenarioImpl(); + + // name + String name = parser.getAttributeValue(null, SCENARIO_NAME); + scenario.setName(name); + + // orderValue + String orderValue = parser.getAttributeValue(null, SCENARIO_ORDER_NUMBER); + scenario.setOrderNumber(Integer.parseInt(orderValue)); + + // factor values + if (testNextStartTag(parser, SCENARIO_FACTOR_VALUES)) { + + Map<Factor, Object> factorValues = Maps.newLinkedHashMap(); + while (!(testCurrentEndTag(parser, SCENARIO))) { + + // get factor + String factorId = parser.getAttributeValue(null, FACTOR); + Factor factor = factors.get(factorId); + + if (factor == null) { + throw new IOException( + "Could not find factor named '" + + factorId + "' at line " + parser.getLineNumber()); + } + ValueType valueType = factor.getDomain().getValueType(); + + // factor value + String value = parser.nextText(); + + factorValues.put(factor, getTypedValue(valueType, value)); + + // read next tag + parser.nextTag(); + } + scenario.setFactorValues(factorValues); + } + + if (!standalone) { + + // read next tag + parser.nextTag(); + } + + return scenario; + } +} Property changes on: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/ScenarioXmlParser.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/XmlParser.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/XmlParser.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/parser/XmlParser.java 2012-10-07 16:22:58 UTC (rev 86) @@ -24,17 +24,19 @@ */ package fr.reseaumexico.model.parser; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.text.ParseException; +import com.google.common.base.Charsets; +import com.google.common.io.Closeables; +import com.google.common.io.Files; +import fr.reseaumexico.model.MexicoTechnicalException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.text.ParseException; + /** * Abstract parser to get model from xml file using XPP3 * @@ -42,20 +44,32 @@ * @see XmlPullParser * @since 0.1 */ -public abstract class XmlParser<M> extends InputStreamReader { +public abstract class XmlParser<M> { - public XmlParser(File file) throws FileNotFoundException, UnsupportedEncodingException { - super(new FileInputStream(file), "UTF-8"); - } + public M getModel(File file) throws XmlPullParserException, IOException, ParseException { - public M getModel() throws XmlPullParserException, IOException, ParseException { + Reader reader = Files.newReader(file, Charsets.UTF_8); - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - XmlPullParser parser = factory.newPullParser(); - parser.setInput(this); + try { - // parse model - return parseModel(parser); + // create xpp parser + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + XmlPullParser parser = factory.newPullParser(); + parser.setInput(reader); + + // parse model + M result = parseModel(parser); + + // close reader + reader.close(); + + // return model + return result; + } finally { + + // make sure model is closed + Closeables.closeQuietly(reader); + } } protected abstract M parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException; @@ -64,4 +78,48 @@ String tagName = parser.getName(); return tagName.equals(name); } + + /** + * Check that parser starts with the given tag. + * + * @param parser xpp parser used + * @param requiredTag required first tag + * @param errorMessage error message to send if required tag was not found + * @throws IOException + * @throws XmlPullParserException + */ + protected void checkStartFile(XmlPullParser parser, + String requiredTag, + String errorMessage) throws IOException, XmlPullParserException { + + // file must start with input design tag + if (parser.next() == XmlPullParser.START_TAG && + !parserEqual(parser, requiredTag)) { + throw new MexicoTechnicalException(errorMessage); + } + } + + protected boolean testNextStartTag(XmlPullParser parser, + String requiredTag) throws IOException, XmlPullParserException { + return parser.nextTag() == XmlPullParser.START_TAG && + parserEqual(parser, requiredTag); + } + + protected boolean testNextEndTag(XmlPullParser parser, + String requiredTag) throws IOException, XmlPullParserException { + return parser.nextTag() == XmlPullParser.END_TAG && + parserEqual(parser, requiredTag); + } + + protected boolean testCurrentEndTag(XmlPullParser parser, + String requiredTag) throws IOException, XmlPullParserException { + return parser.getEventType() == XmlPullParser.END_TAG && + parserEqual(parser, requiredTag); + } + + protected boolean testCurrentStartTag(XmlPullParser parser, + String requiredTag) throws IOException, XmlPullParserException { + return parser.getEventType() == XmlPullParser.START_TAG && + parserEqual(parser, requiredTag); + } } Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ExperimentDesignXmlWriter.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ExperimentDesignXmlWriter.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ExperimentDesignXmlWriter.java 2012-10-07 16:22:58 UTC (rev 86) @@ -29,11 +29,11 @@ import fr.reseaumexico.model.ExperimentDesign; import fr.reseaumexico.model.Factor; import fr.reseaumexico.model.Level; -import java.io.File; +import org.apache.commons.lang3.StringUtils; + import java.io.IOException; import java.util.Collection; import java.util.Date; -import org.apache.commons.lang3.StringUtils; /** * Writer to create experiment design file with {@link ExperimentDesign} model @@ -43,8 +43,8 @@ */ public class ExperimentDesignXmlWriter extends MexicoXmlWriter<ExperimentDesign> { - public ExperimentDesignXmlWriter(File file, ExperimentDesign model) throws IOException { - super(file, model); + public ExperimentDesignXmlWriter(ExperimentDesign model) throws IOException { + super(model); } @Override Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/InputDesignXmlWriter.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/InputDesignXmlWriter.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/InputDesignXmlWriter.java 2012-10-07 16:22:58 UTC (rev 86) @@ -24,14 +24,12 @@ */ package fr.reseaumexico.model.writer; -import fr.reseaumexico.model.Factor; import fr.reseaumexico.model.InputDesign; import fr.reseaumexico.model.Scenario; -import java.io.File; + import java.io.IOException; import java.util.Collection; import java.util.Date; -import java.util.Map; /** * Writer to create input design file with {@link InputDesign} model @@ -43,9 +41,9 @@ protected ExperimentDesignXmlWriter experimentDesignXmlWriter; - public InputDesignXmlWriter(File file, InputDesign model) throws IOException { - super(file, model); - experimentDesignXmlWriter = new ExperimentDesignXmlWriter(file, model.getExperimentDesign()); + public InputDesignXmlWriter(InputDesign model) throws IOException { + super(model); + experimentDesignXmlWriter = new ExperimentDesignXmlWriter(model.getExperimentDesign()); } @Override @@ -73,20 +71,11 @@ Collection<Scenario> scenarios = model.getScenario(); if (scenarios != null) { for (Scenario scenario : scenarios) { - XmlNode scenariosXmlNode = XmlNode.createElement(rootXmlNode, SCENARIO); - addParameter(scenariosXmlNode, SCENARIO_NAME, scenario.getName()); - addParameter(scenariosXmlNode, SCENARIO_ORDER_NUMBER, scenario.getOrderNumber()); - // factor values - Map<Factor, Object> factorValues = scenario.getFactorValues(); - for (Map.Entry<Factor, Object> entry : factorValues.entrySet()) { - Object value = entry.getValue(); - XmlNode factorValueXmlNode = XmlNode.createElement(scenariosXmlNode, SCENARIO_FACTOR_VALUES, String.valueOf(value)); - factorValueXmlNode.addAttribute(FACTOR, entry.getKey().getId()); - } + ScenarioXmlWriter scenarioXmlWriter = new ScenarioXmlWriter(scenario); - // features - addAllFeature(scenariosXmlNode, scenario.getFeature()); + XmlNode scenariosXmlNode = scenarioXmlWriter.getRootElement(); + rootXmlNode.add(scenariosXmlNode); } } } Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/MexicoXmlWriter.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/MexicoXmlWriter.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/MexicoXmlWriter.java 2012-10-07 16:22:58 UTC (rev 86) @@ -40,8 +40,8 @@ */ public abstract class MexicoXmlWriter<M> extends XmlWriter<M> implements MexicoXmlConstant { - protected MexicoXmlWriter(File file, M model) throws IOException { - super(file, model); + protected MexicoXmlWriter(M model) { + super(model); } public void addParameter(XmlNode xmlNode, String parameterName, Object value) { Added: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ScenarioXmlWriter.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ScenarioXmlWriter.java (rev 0) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ScenarioXmlWriter.java 2012-10-07 16:22:58 UTC (rev 86) @@ -0,0 +1,70 @@ +package fr.reseaumexico.model.writer; + +/* + * #%L + * JMexico :: Model + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Réseau Mexico, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +import fr.reseaumexico.model.Factor; +import fr.reseaumexico.model.Scenario; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +/** + * Writes a scenario from a input design as a xml file. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.7 + */ +public class ScenarioXmlWriter extends MexicoXmlWriter<Scenario> { + + public static void write(Scenario model, File exportFile) throws IOException { + ScenarioXmlWriter writer = new ScenarioXmlWriter(model); + writer.write(exportFile); + } + + public ScenarioXmlWriter(Scenario model) { + super(model); + } + + @Override + public XmlNode getRootElement() { + XmlNode rootXmlNode = new XmlNode(SCENARIO); + addParameter(rootXmlNode, Scenario.PROPERTY_NAME, model.getName()); + addParameter(rootXmlNode, Scenario.PROPERTY_ORDER_NUMBER, model.getOrderNumber()); + + // factor values + Map<Factor, Object> factorValues = model.getFactorValues(); + for (Map.Entry<Factor, Object> entry : factorValues.entrySet()) { + Object value = entry.getValue(); + XmlNode factorValueXmlNode = XmlNode.createElement( + rootXmlNode, Scenario.PROPERTY_FACTOR_VALUES, String.valueOf(value)); + factorValueXmlNode.addAttribute(FACTOR, entry.getKey().getId()); + } + + // features + addAllFeature(rootXmlNode, model.getFeature()); + return rootXmlNode; + } +} Property changes on: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/ScenarioXmlWriter.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/XmlWriter.java =================================================================== --- trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/XmlWriter.java 2012-10-07 12:00:10 UTC (rev 85) +++ trunk/jmexico-model/src/main/java/fr/reseaumexico/model/writer/XmlWriter.java 2012-10-07 16:22:58 UTC (rev 86) @@ -24,10 +24,13 @@ */ package fr.reseaumexico.model.writer; +import com.google.common.base.Charsets; +import com.google.common.io.Closeables; +import com.google.common.io.Files; + import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.Writer; /** * Abstract writer to create xml files using {@link XmlNode} @@ -35,23 +38,37 @@ * @author sletellier <letellier@codelutin.com> * @since 0.1 */ -public abstract class XmlWriter<M> extends OutputStreamWriter { +public abstract class XmlWriter<M> { public static final int INDENT = 2; protected M model; - public XmlWriter(File file, M model) throws IOException { - super(new FileOutputStream(file), "UTF-8"); + protected abstract XmlNode getRootElement(); + + protected XmlWriter(M model) { this.model = model; } - public void write() throws IOException { + public void write(File file) throws IOException { - String toWrite = getRootElement().toXml(INDENT); - write(toWrite); + Writer writer = Files.newWriter(file, Charsets.UTF_8); + try { + + // get root xml node + XmlNode rootElement = getRootElement(); + + // transform it to string + String toWrite = rootElement.toXml(INDENT); + + // write it into file + writer.write(toWrite); + + // close writer + writer.close(); + } finally { + Closeables.closeQuietly(writer); + } } - public abstract XmlNode getRootElement(); - }
participants (1)
-
tchemit@users.forge.codelutin.com