Author: chatellier Date: 2011-03-23 14:48:15 +0000 (Wed, 23 Mar 2011) New Revision: 3202 Log: Fix l'import/export xml des DesignPlan avec groupe de facteurs et r?\195?\168gles. Added: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/AbstractXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorGroupXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/RuleDomainXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/FactorGroupVisitor.java isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_factorgroupdp.xml Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ScenarioXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/SensitivityScenariosXMLVisitor.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/package-info.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/DesignPlanVisitor.java isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_designplan.xml Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2009 - 2011 Ifremer, Code Lutin, 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 @@ -25,25 +25,27 @@ package fr.ifremer.isisfish.mexico; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; -import java.io.Writer; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.stream.StreamResult; import org.apache.commons.beanutils.ConvertUtilsBean; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.xml.serialize.OutputFormat; -import org.apache.xml.serialize.XMLSerializer; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -54,11 +56,14 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.persistence.TopiaEntity; import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +import fr.ifremer.isisfish.IsisFishException; import fr.ifremer.isisfish.IsisFishRuntimeException; +import fr.ifremer.isisfish.datastore.RuleStorage; import fr.ifremer.isisfish.mexico.xml.DesignPlanXMLVisitor; import fr.ifremer.isisfish.mexico.xml.DomXMLParser; +import fr.ifremer.isisfish.rule.Rule; +import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; import fr.ifremer.isisfish.util.ConverterUtil; @@ -97,24 +102,6 @@ } - /* - * Get xml representation of a scenario. - * - * @param scenarios sensitivity scenarios - * @return xml sensitivity scenarios representation - * - * TODO : non finished and untested - * - public static String getSensitivityScenarionsAsXML( - SensitivityScenarios scenarios) { - - SensitivityScenariosXMLVisitor visitor = new SensitivityScenariosXMLVisitor(); - scenarios.accept(visitor); - String sensitivityScenariosXml = visitor.getXML(); - return sensitivityScenariosXml; - - }*/ - /** * Parse xmlFile with sax, and return a {@link DesignPlan}. * @@ -140,29 +127,6 @@ } return designPlan; } - - /* - * Parse xmlFile with sax, and return a {@link SensitivityScenarios}. - * - * @param xmlFile file path to parse - * @return SensitivityScenarios - * @throws IOException - * - * TODO : non finished and untested - * - public static SensitivityScenarios getSensitivityScenariosFromXML( - String xmlFile) throws IOException { - SensitivityScenarios scenarios = null; - try { - SAXReader reader = new SAXReader(); - Document doc = reader.read(xmlFile); - Element root = doc.getRootElement(); - scenarios = DomXMLParser.parseSensitivityScenarios(root); - } catch (DocumentException e) { - throw new IOException(e); - } - return scenarios; - }*/ /** * Format xml string. @@ -170,37 +134,22 @@ * @param unformattedXml non formatted xml string (must be valid xml) * @return xml, formatted and indented * + * Code from http://stackoverflow.com/questions/139076/how-to-pretty-print-xml-from-java + * * @throws IsisFishRuntimeException * @throws IllegalArgumentException if input xml is not valid - * - * @deprecated use standard java xml api instead of xerces */ - @Deprecated public static String formatXML(String unformattedXml) { - try { - // parseXmlFile - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - InputSource is = new InputSource(new StringReader(unformattedXml)); - org.w3c.dom.Document document = db.parse(is); - - // format - OutputFormat format = new OutputFormat(document); - format.setLineWidth(65); - format.setIndenting(true); - format.setIndent(2); - Writer out = new StringWriter(); - XMLSerializer serializer = new XMLSerializer(out, format); - serializer.serialize(document); - - return out.toString(); - } catch (IOException e) { + Transformer serializer= SAXTransformerFactory.newInstance().newTransformer(); + serializer.setOutputProperty(OutputKeys.INDENT, "yes"); + serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + Source xmlSource=new SAXSource(new InputSource(new ByteArrayInputStream(unformattedXml.getBytes()))); + StreamResult res = new StreamResult(new ByteArrayOutputStream()); + serializer.transform(xmlSource, res); + return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray()); + } catch (Exception e) { throw new IsisFishRuntimeException("Can't format xml", e); - } catch (ParserConfigurationException e) { - throw new IllegalArgumentException("Can't format xml", e); - } catch (SAXException e) { - throw new IllegalArgumentException("Can't format xml", e); } } @@ -248,17 +197,6 @@ List<?> semantics = matrix.getSemantic(dimIndex); buffer.append("<dimension name=\"" + matrix.getDimensionName(dimIndex) + "\" size=\"" + semantics.size() + "\">"); for (Object semantic : semantics) { - /*if (semantic == null) { - buffer.append("<label/>"); - } - else if (semantic instanceof TopiaEntity) { - TopiaEntity semanticTE = (TopiaEntity)semantic; - buffer.append("<label>" + semanticTE.getTopiaId() + "</label>"); - } - else { - buffer.append("<label>" + semantic.toString() + "</label>"); - }*/ - buffer.append("<label>"); appendString(buffer, semantic); buffer.append("</label>"); @@ -420,4 +358,98 @@ } return qualifiedName; } + + /** + * Transform rules list as xml. + * + * Format is : + * <pre> + * <rules> + * <rule name="RuleName1"> + * <param key="rule.0.parameter.param1">param1</param> + * <param key="rule.0.parameter.pop">topiaId1</param> + * </rule> + * <rule name="RuleName2"> + * <param key="rule.0.parameter.param1">param2</param> + * <param key="rule.0.parameter.pop">topiaId2</param> + * </rule> + * </rules> + * </pre> + * + * @param rules rules list + * @return rules as xml + */ + public static String getRulesAsXml(List<Rule> rules) { + StringBuffer ruleAsString = new StringBuffer(); + ruleAsString.append("<rules>"); + for (Rule rule : rules) { + Properties props = RuleHelper.getRuleAsProperties(0, null, rule); + + // rule name and rule parameters + ruleAsString.append("<rule name=\""); + ruleAsString.append(rule.getClass().getSimpleName()); + ruleAsString.append("\">"); + for (String propName : props.stringPropertyNames()) { + ruleAsString.append("<param key=\""); + ruleAsString.append(propName); + ruleAsString.append("\">"); + ruleAsString.append(StringEscapeUtils.escapeXml(props.getProperty(propName))); + ruleAsString.append("</param>"); + } + ruleAsString.append("</rule>"); + } + ruleAsString.append("</rules>"); + return ruleAsString.toString(); + } + + /** + * Parse xml as rules list. + * + * Format is : + * <pre> + * <rules> + * <rule name="RuleName1"> + * <param key="rule.0.parameter.param1">param1</param> + * <param key="rule.0.parameter.pop">topiaId1</param> + * </rule> + * <rule name="RuleName2"> + * <param key="rule.0.parameter.param1">param2</param> + * <param key="rule.0.parameter.pop">topiaId2</param> + * </rule> + * </rules> + * </pre> + * + * @param rulesElement rules dom element + * @param topiaContext topia context (for rules parameters) + * @return rules as xml + */ + public static List<Rule> getRulesFromXml(Element rulesElement, TopiaContext topiaContext) { + List<Rule> rules = new ArrayList<Rule>(); + List<Element> ruleElements = rulesElement.elements("rule"); + for (Element ruleElement : ruleElements) { + String name = ruleElement.attributeValue("name"); + try { + Rule rule = RuleStorage.getRule(name).getNewRuleInstance(); + + // get properties + Properties props = new Properties(); + List<Element> paramElements = ruleElement.elements("param"); + for (Element paramElement : paramElements) { + String key = paramElement.attributeValue("key"); + String value = paramElement.getTextTrim(); + props.setProperty(key, value); + } + RuleHelper.populateRule(0, topiaContext, rule, props); + + rules.add(rule); + } + catch (IsisFishException ex) { + if (log.isWarnEnabled()) { + log.warn("Can't make instance of rule " + name, ex); + } + } + } + + return rules; + } } Added: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/AbstractXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/AbstractXMLVisitor.java (rev 0) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/AbstractXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -0,0 +1,60 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 Ifremer, Codelutin, Chatellier Eric + * %% + * 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% + */ + +package fr.ifremer.isisfish.mexico.xml; + +/** + * Abstract xml visitor containing xml string buffer. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class AbstractXMLVisitor { + + /** XML text buffer. */ + protected StringBuffer xmlBuffer; + + /** + * Constructor. + * + * Init xml buffer. + */ + public AbstractXMLVisitor() { + xmlBuffer = new StringBuffer(); + } + + /** + * Get xml buffer content. + * + * @return content as string + */ + public String getXML() { + String xml = xmlBuffer.toString(); + return xml; + } +} Property changes on: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/AbstractXMLVisitor.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -29,7 +29,7 @@ import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; /** - * XML domain visitor. + * XML continuous domain visitor. * * @author chatellier * @version $Revision: 1.0 $ Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -26,7 +26,7 @@ package fr.ifremer.isisfish.mexico.xml; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.visitor.DesignPlanVisitor; /** @@ -38,37 +38,14 @@ * Last update : $Date: 5 mars 2009 $ * By : $Author: chatellier $ */ -public class DesignPlanXMLVisitor implements DesignPlanVisitor { +public class DesignPlanXMLVisitor extends AbstractXMLVisitor implements DesignPlanVisitor { - /** XML text buffer. */ - protected StringBuffer xmlBuffer; - /** - * Constructor. - * - * Init xml buffer. - */ - public DesignPlanXMLVisitor() { - xmlBuffer = new StringBuffer(); - } - - /** - * Get xml buffer content. - * - * @return content as string - */ - public String getXML() { - String xml = xmlBuffer.toString(); - return xml; - } - - /** * {@inheritDoc} */ @Override public void start(DesignPlan designPlan) { xmlBuffer.append("<experimentalDesign>"); - xmlBuffer.append("<factors>"); } /** @@ -76,9 +53,9 @@ */ @Override public void visit(DesignPlan designPlan, - Factor factor) { - FactorXMLVisitor visitor = new FactorXMLVisitor(); - factor.accept(visitor); + FactorGroup factorGroup) { + FactorGroupXMLVisitor visitor = new FactorGroupXMLVisitor(); + factorGroup.accept(visitor); xmlBuffer.append(visitor.getXML()); } @@ -87,7 +64,6 @@ */ @Override public void end(DesignPlan designPlan) { - xmlBuffer.append("</factors>"); xmlBuffer.append("</experimentalDesign>"); } Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2011 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 @@ -29,7 +29,7 @@ import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; /** - * XML domain visitor. + * XML discrete domain visitor. * * @author chatellier * @version $Revision: 1.0 $ Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin, CHatellier Eric + * Copyright (C) 2009 - 2011 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 @@ -32,12 +32,15 @@ import org.nuiton.topia.TopiaContext; import fr.ifremer.isisfish.mexico.MexicoHelper; +import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDomain; /** * Parse xml using dom. @@ -63,9 +66,41 @@ DesignPlan plan = new DesignPlan(); - List<Element> factorElements = rootElement - .selectNodes("child::factors/factor"); + List<Element> factorGroupElements = rootElement.selectNodes("child::factors"); + FactorGroup factorGroup = null; + if (!factorGroupElements.isEmpty()) { + factorGroup = parseFactorGroup(factorGroupElements.get(0), topiaContext, true); + } + plan.setFactorGroup(factorGroup); + + return plan; + } + /** + * Recursive parse of factor group elements (>factors<). + * + * @param fgElement factor group element (>factors<) + * @param topiaContext context + * @param mixed {@code true} if create factor group need to be mixed + * @return factor group + * + * @see FactorGroup#isMixed() + */ + protected static FactorGroup parseFactorGroup(Element fgElement, TopiaContext topiaContext, boolean mixed) { + + String factorGroupName = fgElement.attributeValue("name"); + FactorGroup factorGroup = new FactorGroup(factorGroupName, mixed); + + // sub factor group + List<Element> factorGroupElements = fgElement.selectNodes("child::factors"); + for (Element factorGroupElement : factorGroupElements) { + FactorGroup subFactorGroup = parseFactorGroup(factorGroupElement, topiaContext, false); + factorGroup.addFactor(subFactorGroup); + } + + // normal factors + List<Element> factorElements = fgElement.selectNodes("child::factor"); + for (Element factorElement : factorElements) { String type = factorElement.attributeValue("type"); String name = factorElement.attributeValue("name"); @@ -76,8 +111,7 @@ if ("real".equals(type)) { Factor factor = new Factor(name); factor.setPath(path); - Element fixedElement = factorElement.element("domain").element( - "fixed"); + Element fixedElement = factorElement.element("domain").element("fixed"); // tous les domaines continues if (property.endsWith("continuous")) { @@ -135,7 +169,7 @@ } factor.setDomain(domain); } - plan.add(factor); + factorGroup.addFactor(factor); } else if ("integer".equals(type)) { Factor factor = new Factor(name); factor.setPath(path); @@ -198,11 +232,28 @@ } factor.setDomain(domain); } - plan.add(factor); + factorGroup.addFactor(factor); + } else if ("rule".equals(type)) { + Factor factor = new Factor(name); + factor.setPath(path); + Element fixedElement = factorElement.element("domain").element("fixed"); + if ("discrete".equals(property)) { + RuleDomain domain = new RuleDomain(); + List<Element> valueElements = fixedElement.element("enumeration").elements("value"); + int label = 0; + for (Element valueElement : valueElements) { + Element rulesElement = valueElement.element("rules"); + List<Rule> rulesValue = MexicoHelper.getRulesFromXml(rulesElement, topiaContext); + domain.getValues().put(Integer.valueOf(label), rulesValue); + ++label; + } + factor.setDomain(domain); + } + factorGroup.addFactor(factor); } } - return plan; + return factorGroup; } /* Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -36,27 +36,6 @@ * Last update : $Date: 5 mars 2009 $ * By : $Author: chatellier $ */ -public abstract class DomainXMLVisitor implements DomainVisitor { +public abstract class DomainXMLVisitor extends AbstractXMLVisitor implements DomainVisitor { - /** XML text buffer. */ - protected StringBuffer xmlBuffer; - - /** - * Constructor. - * - * Init xml buffer. - */ - public DomainXMLVisitor() { - xmlBuffer = new StringBuffer(); - } - - /** - * Get xml buffer content. - * - * @return content as string - */ - public String getXML() { - String xml = xmlBuffer.toString(); - return xml; - } } Added: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorGroupXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorGroupXMLVisitor.java (rev 0) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorGroupXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -0,0 +1,80 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 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 2 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-2.0.html>. + * #L% + */ + +package fr.ifremer.isisfish.mexico.xml; + +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; +import fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorGroupVisitor; + +/** + * XML factor group visitor. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class FactorGroupXMLVisitor extends AbstractXMLVisitor implements FactorGroupVisitor { + + /* + * @see fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorGroupVisitor#start(fr.ifremer.isisfish.simulator.sensitivity.FactorGroup) + */ + @Override + public void start(FactorGroup factorGroup) { + xmlBuffer.append("<factors"); + if (factorGroup.getName() != null) { + xmlBuffer.append(" name=\"" + factorGroup.getName() + "\""); + } + xmlBuffer.append(">"); + } + + /* + * @see fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorGroupVisitor#visit(fr.ifremer.isisfish.simulator.sensitivity.FactorGroup, fr.ifremer.isisfish.simulator.sensitivity.Factor) + */ + @Override + public void visit(FactorGroup factorGroup, Factor factor) { + if (factor instanceof FactorGroup) { + FactorGroup factorGroup2 = (FactorGroup)factor; + FactorGroupXMLVisitor visitor = new FactorGroupXMLVisitor(); + factorGroup2.accept(visitor); + xmlBuffer.append(visitor.getXML()); + } + else { + FactorXMLVisitor visitor = new FactorXMLVisitor(); + factor.accept(visitor); + xmlBuffer.append(visitor.getXML()); + } + } + + /* + * @see fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorGroupVisitor#end(fr.ifremer.isisfish.simulator.sensitivity.FactorGroup) + */ + @Override + public void end(FactorGroup factorGroup) { + xmlBuffer.append("</factors>"); + } +} Property changes on: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorGroupXMLVisitor.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -27,12 +27,14 @@ import java.io.Serializable; +import fr.ifremer.isisfish.rule.Rule; import fr.ifremer.isisfish.simulator.sensitivity.Domain; import fr.ifremer.isisfish.simulator.sensitivity.Factor; import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDomain; import fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorVisitor; /** @@ -44,30 +46,8 @@ * Last update : $Date: 5 mars 2009 $ * By : $Author: chatellier $ */ -public class FactorXMLVisitor implements FactorVisitor { +public class FactorXMLVisitor extends AbstractXMLVisitor implements FactorVisitor { - /** XML text buffer. */ - protected StringBuffer xmlBuffer; - - /** - * Constructor. - * - * Init xml buffer. - */ - public FactorXMLVisitor() { - xmlBuffer = new StringBuffer(); - } - - /** - * Get xml buffer content. - * - * @return content as string - */ - public String getXML() { - String xml = xmlBuffer.toString(); - return xml; - } - /* * @see fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorVisitor#start(fr.ifremer.isisfish.simulator.sensitivity.Factor) */ @@ -101,6 +81,9 @@ else if (referenceValueForType instanceof Integer) { xmlBuffer.append(" type=\"integer\""); } + else if (factor.getDomain() instanceof RuleDomain) { + xmlBuffer.append(" type=\"rule\""); + } xmlBuffer.append(">"); // target element xmlBuffer.append("<target>" + factor.getPath() + "</target>"); @@ -127,6 +110,9 @@ else if (factor.getDomain() instanceof ContinuousDomain) { visitor = new ContinuousDomainXMLVisitor(); } + else if (factor.getDomain() instanceof RuleDomain) { + visitor = new RuleDomainXMLVisitor(); + } else if (factor.getDomain() instanceof DiscreteDomain) { visitor = new DiscreteDomainXMLVisitor(); } Added: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/RuleDomainXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/RuleDomainXMLVisitor.java (rev 0) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/RuleDomainXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -0,0 +1,57 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 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 2 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-2.0.html>. + * #L% + */ + +package fr.ifremer.isisfish.mexico.xml; + +import java.util.List; + +import fr.ifremer.isisfish.mexico.MexicoHelper; +import fr.ifremer.isisfish.rule.Rule; +import fr.ifremer.isisfish.simulator.sensitivity.Domain; + +/** + * XML rule domain visitor. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class RuleDomainXMLVisitor extends DiscreteDomainXMLVisitor { + + /** + * {@inheritDoc} + */ + @Override + public void visit(Domain domain, Object label, Object value) { + List<Rule> rulesList = (List<Rule>)value; + String rulesAsXml = MexicoHelper.getRulesAsXml(rulesList); + + xmlBuffer.append("<value>"); + xmlBuffer.append(rulesAsXml); + xmlBuffer.append("</value>"); + } +} Property changes on: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/RuleDomainXMLVisitor.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ScenarioXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ScenarioXMLVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ScenarioXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -38,31 +38,9 @@ * Last update : $Date: 5 mars 2009 $ * By : $Author: chatellier $ */ -public class ScenarioXMLVisitor implements ScenarioVisitor { +public class ScenarioXMLVisitor extends AbstractXMLVisitor implements ScenarioVisitor { - /** XML text buffer. */ - protected StringBuffer xmlBuffer; - /** - * Constructor. - * - * Init xml buffer. - */ - public ScenarioXMLVisitor() { - xmlBuffer = new StringBuffer(); - } - - /** - * Get xml buffer content. - * - * @return content as string - */ - public String getXML() { - String xml = xmlBuffer.toString(); - return xml; - } - - /** * {@inheritDoc} */ @Override Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/SensitivityScenariosXMLVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/SensitivityScenariosXMLVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/SensitivityScenariosXMLVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -38,31 +38,9 @@ * Last update : $Date: 5 mars 2009 $ * By : $Author: chatellier $ */ -public class SensitivityScenariosXMLVisitor implements SensitivityScenariosVisitor { +public class SensitivityScenariosXMLVisitor extends AbstractXMLVisitor implements SensitivityScenariosVisitor { - /** XML text buffer. */ - protected StringBuffer xmlBuffer; - /** - * Constructor. - * - * Init xml buffer. - */ - public SensitivityScenariosXMLVisitor() { - xmlBuffer = new StringBuffer(); - } - - /** - * Get xml buffer content. - * - * @return content as string - */ - public String getXML() { - String xml = xmlBuffer.toString(); - return xml; - } - - /** * {@inheritDoc} */ @Override Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/package-info.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/package-info.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/mexico/xml/package-info.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 1999 - 2011 CodeLutin + * Copyright (C) 2009 - 2011 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 Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin + * Copyright (C) 2009 - 2011 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 @@ -26,7 +26,6 @@ package fr.ifremer.isisfish.simulator.sensitivity; import java.io.Serializable; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -46,43 +45,41 @@ /** serialVersionUID. */ private static final long serialVersionUID = 977975461743758075L; - /** Liste des facteurs a utiliser */ - protected List<Factor> factors; - + /** Groupe de facteur principal du design plan. */ + protected FactorGroup factorGroup; + /** * Constructor. */ public DesignPlan() { - factors = new ArrayList<Factor>(); + factorGroup = new FactorGroup(null, true); } /** - * Get factors list (not modifiable). + * Get factors list, first level of factor groups (not modifiable). * * @return factors list */ public List<Factor> getFactors() { - return Collections.unmodifiableList(factors); + return Collections.unmodifiableList(factorGroup.getFactors()); } /** * Add factor. * * @param f factor to add - * @return {@code true} if factor has been added - * @see java.util.List#add(java.lang.Object) */ - public boolean add(Factor f) { - return factors.add(f); + public void addFactor(Factor f) { + factorGroup.addFactor(f); } /** - * Set factors list. + * Set factors group. * - * @param factors the factors list to set + * @param factorGroup main factor group */ - public void setFactors(List<Factor> factors) { - this.factors = factors; + public void setFactorGroup(FactorGroup factorGroup) { + this.factorGroup = factorGroup; } /** @@ -92,9 +89,7 @@ */ public void accept(DesignPlanVisitor visitor) { visitor.start(this); - for (Factor factor : factors) { - visitor.visit(this, factor); - } + visitor.visit(this, factorGroup); visitor.end(this); } } Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -33,6 +33,7 @@ import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; +import fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorGroupVisitor; /** * Factor group. Used for group screening. @@ -176,6 +177,15 @@ } /** + * Remove single factor. + * + * @param factor factor to remove + */ + public void remove(Factor factor) { + factors.remove(factor); + } + + /** * Remove factors collection. * * @param allFactors factors to remove @@ -262,6 +272,19 @@ return result; } + /** + * Accept a new visitor. + * + * @param visitor + */ + public void accept(FactorGroupVisitor visitor) { + visitor.start(this); + for (Factor factor : factors) { + visitor.visit(this, factor); + } + visitor.end(this); + } + @Override public String toString() { return "FactorGroup(" + name + ")"; Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -189,13 +189,6 @@ @Override public MatrixContinuousDomain clone() { MatrixContinuousDomain cloned = (MatrixContinuousDomain)super.clone(); - /*cloned.setCardinality(this.cardinality); - cloned.setMaxBound(this.maxBound); - cloned.setMinBound(this.minBound); - cloned.setCoefficient(this.coefficient); - cloned.setMatrix(this.matrix); - cloned.setOperator(this.operator); - cloned.setValue(this.value);*/ return cloned; } Modified: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/DesignPlanVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/DesignPlanVisitor.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/DesignPlanVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -26,7 +26,7 @@ package fr.ifremer.isisfish.simulator.sensitivity.visitor; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; -import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; /** * DesignPlan visitor. @@ -50,9 +50,9 @@ * Visit factor. * * @param designPlan design plan - * @param factor factor + * @param factorGroup factor group */ - void visit(DesignPlan designPlan, Factor factor); + void visit(DesignPlan designPlan, FactorGroup factorGroup); /** * End. Added: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/FactorGroupVisitor.java =================================================================== --- isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/FactorGroupVisitor.java (rev 0) +++ isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/FactorGroupVisitor.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -0,0 +1,63 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 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 2 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-2.0.html>. + * #L% + */ + +package fr.ifremer.isisfish.simulator.sensitivity.visitor; + +import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; + +/** + * Factor group visitor. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public interface FactorGroupVisitor { + + /** + * Start. + * + * @param factorGroup factorGroup + */ + void start(FactorGroup factorGroup); + + /** + * Visit domain. + * + * @param factorGroup factorGroup + * @param factor factor + */ + void visit(FactorGroup factorGroup, Factor factor); + + /** + * End. + * + * @param factorGroup factorGroup + */ + void end(FactorGroup factorGroup); +} Property changes on: isis-fish/branches/3.3.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/visitor/FactorGroupVisitor.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java =================================================================== --- isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2006 - 2010 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2006 - 2011 Ifremer, Code Lutin, 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 @@ -27,22 +27,34 @@ import java.io.File; import java.io.IOException; +import java.util.Arrays; +import java.util.Properties; +import java.util.SortedMap; +import java.util.TreeMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.nuiton.math.matrix.MatrixFactory; import org.nuiton.math.matrix.MatrixND; import org.nuiton.topia.TopiaContext; import fr.ifremer.isisfish.AbstractIsisFishTest; +import fr.ifremer.isisfish.IsisFishException; +import fr.ifremer.isisfish.datastore.RegionStorage; +import fr.ifremer.isisfish.datastore.RuleStorage; +import fr.ifremer.isisfish.rule.Rule; +import fr.ifremer.isisfish.rule.RuleHelper; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; import fr.ifremer.isisfish.simulator.sensitivity.Factor; +import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDomain; /** * Test for MexicoHelper class. @@ -58,12 +70,22 @@ /** Commons logging log. */ private static Log log = LogFactory.getLog(MexicoHelperTest.class); + protected TopiaContext regionContext; + + @Before + public void setUpRegion() { + RegionStorage regionStorage = RegionStorage.getRegion("BaseMotosICA"); + regionContext = regionStorage.getStorage(); + } + /** * Get a test design plan composed with all possibles value types. * + * @param useGroupAndRule build design plan with sub factor groups * @return a test design plan + * @throws IsisFishException */ - protected DesignPlan getTestDesignPlan() { + protected DesignPlan getTestDesignPlan(boolean useGroupAndRule) throws IsisFishException { DesignPlan designPlan = new DesignPlan(); // matrix 1 @@ -76,6 +98,19 @@ matrix1.setValue(new int[] { 2, 0 }, 12); matrix1.setValue(new int[] { 2, 1 }, -1); + // rule 1, species = c'est une des especes de la base BaseMotosICA + Rule ruleTacPoids = RuleStorage.getRule("TACpoids").getNewRuleInstance(); + Properties props = new Properties(); + props.setProperty("rule.0.parameter.species", "fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378"); + RuleHelper.populateRule(0, regionContext, ruleTacPoids, props); + + // rule 2, species = c'est une des especes de la base BaseMotosICA + Rule ruleTailleMin = RuleStorage.getRule("TailleMin").getNewRuleInstance(); + props = new Properties(); + props.setProperty("rule.0.parameter.species", "fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378"); + props.setProperty("rule.0.parameter.propSurvie", "42"); + RuleHelper.populateRule(0, regionContext, ruleTailleMin, props); + // factor 1 Factor factorContinuous = new Factor("factor 1 (double continuous)"); ContinuousDomain domain1 = new ContinuousDomain(); @@ -123,31 +158,60 @@ domain5.setOperator("-"); factorEquationContinuous.setDomain(domain5); factorEquationContinuous.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#maxLength"); + + // factor 6 : rule factor + Factor factorRuleDiscrete = new Factor("factor 6 (RuleDiscrete)"); + RuleDomain domain6 = new RuleDomain(); + SortedMap<Object, Object> rules = new TreeMap<Object, Object>(); + rules.put("ruleset1", Arrays.asList(ruleTacPoids, ruleTailleMin)); + rules.put("ruleset2", Arrays.asList(ruleTailleMin)); + domain6.setValues(rules); + factorRuleDiscrete.setDomain(domain6); + + // 3.3.1.0 + if (useGroupAndRule) { + FactorGroup group1 = new FactorGroup("discretegrp"); + group1.addFactor(factorDiscrete); + group1.addFactor(factorRuleDiscrete); + FactorGroup group2 = new FactorGroup("continuousgrp"); + group2.addFactor(factorContinuous); + group2.addFactor(factorMatrixContinuous); + group2.addFactor(factorEquationContinuous); + + designPlan.addFactor(group1); + designPlan.addFactor(group2); + designPlan.addFactor(factorContinuous2); + } + else { + // 3.3.0.0 + designPlan.addFactor(factorContinuous); + designPlan.addFactor(factorDiscrete); + designPlan.addFactor(factorContinuous2); + designPlan.addFactor(factorMatrixContinuous); + designPlan.addFactor(factorEquationContinuous); + } - designPlan.add(factorContinuous); - designPlan.add(factorDiscrete); - designPlan.add(factorContinuous2); - designPlan.add(factorMatrixContinuous); - designPlan.add(factorEquationContinuous); - return designPlan; } /** * Test method {@link MexicoHelper#getDesignPlanAsXML(DesignPlan)}. * + * Sans groupe de facteur, tel qu'il était en 3.3.0.0. + * * @throws IOException + * @throws IsisFishException */ @Test - public void testGetDesignPlanAsXML() throws IOException { + public void testGetDesignPlanAsXML() throws IOException, IsisFishException { - DesignPlan testDesignPlan = getTestDesignPlan(); + DesignPlan testDesignPlan = getTestDesignPlan(false); // test xml export String xml = MexicoHelper.getDesignPlanAsXML(testDesignPlan); // factor 1 - Assert.assertTrue(xml.indexOf("<range max=\"50.0\" min=\"0.0\"/>") != -1); + Assert.assertTrue(xml.indexOf("<range min=\"0.0\" max=\"50.0\"/>") != -1); // factor 2 Assert.assertTrue(xml.indexOf("<factor name=\"factor 2 (double discrete)\"") != -1); Assert.assertTrue(xml.indexOf("<value>70.9</value>") != -1); @@ -158,7 +222,7 @@ Assert.assertTrue(xml.indexOf("0.799") != -1); Assert.assertTrue(xml.indexOf("<mx name=\"test1\">") != -1); // factor 5 - Assert.assertTrue(xml.indexOf("reference=\"45.0\" variable=\"L1\"") != -1); + Assert.assertTrue(xml.indexOf("variable=\"L1\" reference=\"45.0\"") != -1); if (log.isDebugEnabled()) { log.debug("testGetDesignPlanAsXML xml = " + xml); @@ -168,6 +232,8 @@ /** * Test method {@link MexicoHelper#getDesignPlanFromXML(File, TopiaContext)}. * + * Sans groupe de facteur. + * * @throws IOException */ @Test @@ -189,12 +255,13 @@ * Test que l'export XML de l'import XML produise le meme xml. * * @throws IOException + * @throws IsisFishException */ @Test - public void testExportImport() throws IOException { + public void testExportImport() throws IOException, IsisFishException { // first export - DesignPlan testDesignPlan = getTestDesignPlan(); + DesignPlan testDesignPlan = getTestDesignPlan(false); String xml1 = MexicoHelper.getDesignPlanAsXML(testDesignPlan); if (log.isDebugEnabled()) { log.debug("xml 1 = " + xml1); @@ -203,11 +270,68 @@ // export File testFile = new File("src/test/resources/mexico/mexicohelper_designplan.xml"); // topia context can be null in tests - DesignPlan plan = MexicoHelper.getDesignPlanFromXML(testFile, null); + DesignPlan plan = MexicoHelper.getDesignPlanFromXML(testFile, regionContext); String xml2 = MexicoHelper.getDesignPlanAsXML(plan); if (log.isDebugEnabled()) { log.debug("xml 2 = " + xml2); } Assert.assertEquals(xml1, xml2); } + + /** + * Test le chargement des groupes de facteurs et des facteurs de type + * regles depuis isis 3.3.1.0. + * + * @throws IOException + * @throws IsisFishException + */ + @Test + public void testFactorGroupAndRule() throws IOException, IsisFishException { + + DesignPlan testDesignPlan = getTestDesignPlan(true); + + // test xml export + String xml = MexicoHelper.getDesignPlanAsXML(testDesignPlan); + + // factor groups + Assert.assertTrue(xml.indexOf("<factors name=\"continuousgrp\">") != -1); + Assert.assertTrue(xml.indexOf("<factors name=\"continuousgrp\">") != -1); + + // factor 6 + Assert.assertTrue(xml.indexOf("<rule name=\"TACpoids\">") != -1); + Assert.assertTrue(xml.indexOf("<rule name=\"TailleMin\">") != -1); + Assert.assertTrue(xml.indexOf("<param key=\"rule.0.parameter.propSurvie\">42.0</param>") != -1); + Assert.assertTrue(xml.indexOf("<param key=\"rule.0.parameter.species\">fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378</param>") != -1); + + if (log.isDebugEnabled()) { + log.debug("testFactorGroupAndRule xml = " + xml); + } + } + + /** + * Test que l'export XML de l'import XML produise le meme xml. + * + * @throws IOException + * @throws IsisFishException + */ + @Test + public void testExportImportWithGroup() throws IOException, IsisFishException { + + // first export + DesignPlan testDesignPlan = getTestDesignPlan(true); + String xml1 = MexicoHelper.getDesignPlanAsXML(testDesignPlan); + if (log.isDebugEnabled()) { + log.debug("xml 1 = " + xml1); + } + + // export + File testFile = new File("src/test/resources/mexico/mexicohelper_factorgroupdp.xml"); + // topia context can be null in tests + DesignPlan plan = MexicoHelper.getDesignPlanFromXML(testFile, regionContext); + String xml2 = MexicoHelper.getDesignPlanAsXML(plan); + if (log.isDebugEnabled()) { + log.debug("xml 2 = " + xml2); + } + Assert.assertEquals(xml1, xml2); + } } Modified: isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java =================================================================== --- isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2011-03-23 14:48:15 UTC (rev 3202) @@ -108,9 +108,9 @@ factor3.setDomain(domain3); factor3.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#minLength"); - designPlan.add(factor1); + designPlan.addFactor(factor1); //designPlan.add(factor2); - designPlan.add(factor3); + designPlan.addFactor(factor3); return designPlan; } Modified: isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_designplan.xml =================================================================== --- isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_designplan.xml 2011-03-23 14:46:56 UTC (rev 3201) +++ isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_designplan.xml 2011-03-23 14:48:15 UTC (rev 3202) @@ -6,7 +6,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2009 - 2010 Ifremer, Code Lutin + Copyright (C) 2009 - 2011 Ifremer, Code Lutin, 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 @@ -23,7 +23,6 @@ <http://www.gnu.org/licenses/gpl-2.0.html>. #L% --> - <experimentalDesign> <factors> <factor name="factor 1 (double continuous)" property="continuous" type="real"> Added: isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_factorgroupdp.xml =================================================================== --- isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_factorgroupdp.xml (rev 0) +++ isis-fish/branches/3.3.1/src/test/resources/mexico/mexicohelper_factorgroupdp.xml 2011-03-23 14:48:15 UTC (rev 3202) @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8"?> +<experimentalDesign> + <factors> + <factors name="continuousgrp"> + <factor name="factor 1 (double continuous)" property="continuous" type="real"> + <target>fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength</target> + <domain> + <fixed cardinality="0"> + <range min="0.0" max="50.0"/> + </fixed> + </domain> + </factor> + <factor name="factor 4 (MatrixContinuous)" property="matrixcontinuous" type="real"> + <target>fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#minLength</target> + <domain> + <fixed cardinality="0"> + <range min="0.0" max="1.0"/> + <coefficient value="0.799" operator="-"/> + <mx name="test1"> + <dimension name="col1" size="3"> + <label>null()</label> + <label>null()</label> + <label>null()</label> + </dimension> + <dimension name="col2" size="2"> + <label>null()</label> + <label>null()</label> + </dimension> + <d>13.0</d> + <d>-14.0</d> + <d>21.0</d> + <d>2.0</d> + <d>12.0</d> + <d>-1.0</d> + </mx> + </fixed> + </domain> + </factor> + <factor name="factor 5 (EquationContinuous)" property="equationcontinuous" type="real"> + <target>fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#maxLength</target> + <domain> + <fixed cardinality="0"> + <range min="0.0" max="1.0"/> + <coefficient value="0.1" operator="-"/> + <equation variable="L1" reference="45.0"/> + </fixed> + </domain> + </factor> + </factors> + <factors name="discretegrp"> + <factor name="factor 2 (double discrete)" property="discrete" type="real"> + <target>fr.ifremer.isisfish.entities.PopulationGroup#1156461521064#0.022976136053553198#minLength</target> + <domain> + <fixed cardinality="5"> + <enumeration> + <value>12.3</value> + <value>70.9</value> + <value>21.0</value> + <value>-12.1</value> + <value>-8.45</value> + </enumeration> + </fixed> + </domain> + </factor> + <factor name="factor 6 (RuleDiscrete)" property="discrete" type="rule"> + <target>null</target> + <domain> + <fixed cardinality="2"> + <enumeration> + <value> + <rules> + <rule name="TACpoids"> + <param key="rule.0.parameter.beginDate">0</param> + <param key="rule.0.parameter.tacInTons">0.0</param> + <param key="rule.0.parameter.species">fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378</param> + <param key="rule.0.parameter.propSurvie">0.0</param> + <param key="rule.0.parameter.endDate">0</param> + <param key="rule.0.parameter.propTac">0.0</param> + </rule> + <rule name="TailleMin"> + <param key="rule.0.parameter.beginDate">0</param> + <param key="rule.0.parameter.species">fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378</param> + <param key="rule.0.parameter.propSurvie">42.0</param> + <param key="rule.0.parameter.endDate">0</param> + <param key="rule.0.parameter.TailleMin">0.0</param> + </rule> + </rules> + </value> + <value> + <rules> + <rule name="TailleMin"> + <param key="rule.0.parameter.beginDate">0</param> + <param key="rule.0.parameter.species">fr.ifremer.isisfish.entities.Species#1169028645830#0.022262364425031378</param> + <param key="rule.0.parameter.propSurvie">42.0</param> + <param key="rule.0.parameter.endDate">0</param> + <param key="rule.0.parameter.TailleMin">0.0</param> + </rule> + </rules> + </value> + </enumeration> + </fixed> + </domain> + </factor> + </factors> + <factor name="factor 3 (integer discrete)" property="discrete" type="integer"> + <target>fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#minLength</target> + <domain> + <fixed cardinality="3"> + <enumeration> + <value>13</value> + <value>14</value> + <value>45</value> + </enumeration> + </fixed> + </domain> + </factor> + </factors> +</experimentalDesign> \ No newline at end of file