r3653 - in branches/4.0.1/src: main/java/fr/ifremer/isisfish main/java/fr/ifremer/isisfish/mexico main/java/fr/ifremer/isisfish/mexico/export main/java/fr/ifremer/isisfish/mexico/xml main/java/fr/ifremer/isisfish/simulator main/java/fr/ifremer/isisfish/simulator/sensitivity main/java/fr/ifremer/isisfish/simulator/sensitivity/domain main/java/fr/ifremer/isisfish/ui/input main/java/fr/ifremer/isisfish/ui/sensitivity main/java/fr/ifremer/isisfish/ui/sensitivity/model main/java/fr/ifremer/is
Author: echatellier Date: 2012-03-14 15:13:51 +0100 (Wed, 14 Mar 2012) New Revision: 3653 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3653 Log: #724 : Choix de la distribution dans les UIs Refactoring profond de la mise a facteur pour tenir compte de la distribution. Added: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Distribution.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousPanel.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/EquationContinuousPanelUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/FactorWizardUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/MatrixContinuousPanelUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java branches/4.0.1/src/test/resources/mexico/expDesign.xsd Removed: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/MatrixContinuousDomainXMLVisitor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/distribution/ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/ContinuousPanelContainerUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/DefaultContinuousPanelUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/EquationContinuousPanelUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/FactorWizardUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/MatrixContinuousPanelUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtils.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomainTest.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtilsTest.java Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/export/RegionExportFactorXML.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/EquationContinuousDomainXMLVisitor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputContentUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityInputHandler.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySaveVerifier.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/TableBlockingLayerUI.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/model/FactorTreeCellRenderer.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/widget/editor/ScriptParameterDialog.jaxx branches/4.0.1/src/main/resources/i18n/isis-fish_en_GB.properties branches/4.0.1/src/main/resources/i18n/isis-fish_fr_FR.properties branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/export/RegionExplorerTest.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/FactorTest.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisRandomMock.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtilsTest.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomainTest.java branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/FactorTreeModelTest.java Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -119,7 +119,7 @@ * migration de donnees demande automatiquement un changement de version * d'application. */ - protected final static Version version = new Version(4, 0, 0, 3); + protected final static Version version = new Version(4, 0, 1, 0); protected final static Version majorVersion = new Version(version.getNumber(0)); protected final static Version databaseVersion = new Version( Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/MexicoHelper.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -44,7 +44,6 @@ import javax.xml.transform.stream.StreamResult; import org.apache.commons.beanutils.BeanUtils; -import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.ConvertUtilsBean; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringEscapeUtils; @@ -95,11 +94,12 @@ * Get xml representation of a design plan. * * @param designPlan design plan + * @param args some meta information to put into generated xml (author, date, id, license) * @return xml design plan representation */ - public static String getDesignPlanAsXML(DesignPlan designPlan) { + public static String getDesignPlanAsXML(DesignPlan designPlan, String... args) { - DesignPlanXMLVisitor visitor = new DesignPlanXMLVisitor(); + DesignPlanXMLVisitor visitor = new DesignPlanXMLVisitor(args); designPlan.accept(visitor); String designPlanXml = visitor.getXML(); Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/export/RegionExportFactorXML.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/export/RegionExportFactorXML.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/export/RegionExportFactorXML.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -44,9 +44,9 @@ import fr.ifremer.isisfish.entities.StrategyMonthInfo; import fr.ifremer.isisfish.entities.TargetSpecies; import fr.ifremer.isisfish.mexico.MexicoHelper; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils; import fr.ifremer.isisfish.types.RangeOfValues; import fr.ifremer.isisfish.types.TimeUnit; -import fr.ifremer.isisfish.ui.sensitivity.SensitivityUtils; /** * Export implementation for factor into xml. @@ -110,7 +110,6 @@ String factorName = factorClass + "." + propertyName; // test if factor name is enabled - // TODO move SensitivityUtils outside of UI boolean enabled = SensitivityUtils.isSensitivityFactorEnabled(factorName); if (log.isDebugEnabled()) { Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/ContinuousDomainXMLVisitor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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,6 +25,11 @@ package fr.ifremer.isisfish.mexico.xml; +import java.util.Map.Entry; + +import org.nuiton.math.matrix.MatrixND; + +import fr.ifremer.isisfish.mexico.MexicoHelper; import fr.ifremer.isisfish.simulator.sensitivity.Domain; import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; @@ -44,8 +49,7 @@ */ @Override public void start(Domain domain) { - xmlBuffer.append("<domain>"); - xmlBuffer.append("<fixed>"); + super.start(domain); ContinuousDomain cDomain = (ContinuousDomain)domain; appendDomain(cDomain); @@ -57,36 +61,41 @@ * * @param domain domain to print */ - protected void appendDomain(ContinuousDomain domain) { - // facteur continue pourcentage - if (domain.isPercentageType()) { - xmlBuffer.append("<reference coefficient=\"" + domain.getCoefficient() + "\">"); - xmlBuffer.append(domain.getReferenceValue()); - xmlBuffer.append("</reference>"); + protected void appendDomain(ContinuousDomain domain) { + xmlBuffer.append("<distribution name=\"" + domain.getDistribution().toString().toLowerCase() + "\">"); + for (Entry<String, Object> distributionParameterEntry : domain.getDistributionParameters().entrySet()) { + String name = distributionParameterEntry.getKey(); + Object value = distributionParameterEntry.getValue(); + xmlBuffer.append("<distributionParameter name=\"" + name + "\""); + appendParamValue(xmlBuffer, value); + xmlBuffer.append("</distributionParameter>"); } - else { - // facteur continue min/max - xmlBuffer.append("<range>"); - xmlBuffer.append("<min>" + domain.getMinBound() + "</min>"); - xmlBuffer.append("<max>" + domain.getMaxBound() + "</max>"); - xmlBuffer.append("</range>"); - } + xmlBuffer.append("</distribution>"); } /** - * {@inheritDoc} + * Append value type and value content. + * + * @param xmlBuffer buffer + * @param value value to append */ - @Override - public void visit(Domain domain, Object label, Object value) { - + protected void appendParamValue(StringBuffer xmlBuffer, Object value) { + + if (value instanceof MatrixND) { + xmlBuffer.append(" type=\"matrix\">"); + xmlBuffer.append(MexicoHelper.getMatrixAsXML((MatrixND)value)); + } else { + xmlBuffer.append(" type=\"double\">"); + xmlBuffer.append(value.toString()); + } + } /** * {@inheritDoc} */ @Override - public void end(Domain domain) { - xmlBuffer.append("</fixed>"); - xmlBuffer.append("</domain>"); + public void visit(Domain domain, Object label, Object value) { + } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DesignPlanXMLVisitor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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,6 +25,10 @@ package fr.ifremer.isisfish.mexico.xml; +import java.util.Date; + +import org.apache.commons.lang3.ArrayUtils; + import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.visitor.DesignPlanVisitor; @@ -40,17 +44,35 @@ */ public class DesignPlanXMLVisitor extends AbstractXMLVisitor implements DesignPlanVisitor { + protected String[] args; + + public DesignPlanXMLVisitor(String... args) { + this.args = args; + } + /** * {@inheritDoc} * * Changes : - * v2 : depuis la v2, meilleur gestion des min/max, pourcentage poru quasiment + * v3 : depuis la v3, les min/max, pourcentage, coefficient... ont été + * remplacé par les distributions et leur parametres + * v2 : depuis la v2, meilleur gestion des min/max, pourcentage pour quasiment * tous les facteurs continue * v0 : version original */ @Override public void start(DesignPlan designPlan) { - xmlBuffer.append("<experimentalDesign version=\"2\">"); + + int authorIndex = ArrayUtils.indexOf(args, "author"); + int licenseIndex = ArrayUtils.indexOf(args, "license"); + int dateIndex = ArrayUtils.indexOf(args, "date"); + int idIndex = ArrayUtils.indexOf(args, "id"); + + xmlBuffer.append("<experimentalDesign version=\"3\""); + xmlBuffer.append(" author=\"" + (authorIndex != -1 ? args[authorIndex + 1] : "") + "\""); + xmlBuffer.append(" license=\"" + (licenseIndex != -1 ? args[licenseIndex + 1] : "") + "\""); + xmlBuffer.append(" date=\"" + (dateIndex != -1 ? args[dateIndex + 1] : new Date()) + "\""); + xmlBuffer.append(" id=\"" + (idIndex != -1 ? args[idIndex + 1] : "") + "\">"); } /** Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DiscreteDomainXMLVisitor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -43,28 +43,9 @@ * {@inheritDoc} */ @Override - public void start(Domain domain) { - xmlBuffer.append("<domain>"); - xmlBuffer.append("<fixed>"); - xmlBuffer.append("<enumeration>"); - } - - /** - * {@inheritDoc} - */ - @Override public void visit(Domain domain, Object label, Object value) { - String stringValue = MexicoHelper.getStringFromObject(value); - xmlBuffer.append("<value>" + stringValue + "</value>"); + xmlBuffer.append("<level name=\"" + label + "\">"); + xmlBuffer.append(MexicoHelper.getStringFromObject(value)); + xmlBuffer.append("<level>"); } - - /** - * {@inheritDoc} - */ - @Override - public void end(Domain domain) { - xmlBuffer.append("</enumeration>"); - xmlBuffer.append("</fixed>"); - xmlBuffer.append("</domain>"); - } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomXMLParser.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -42,7 +42,6 @@ import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationDiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; /** @@ -102,7 +101,9 @@ List<Element> factorGroupElements = rootElement.selectNodes("child::factors"); FactorGroup factorGroup = null; if (!factorGroupElements.isEmpty()) { - if ("2".equals(version)) { + if ("3".equals(version)) { + factorGroup = parseFactorGroupV3(factorGroupElements.get(0), topiaContext); + } else if ("2".equals(version)) { factorGroup = parseFactorGroupV2(factorGroupElements.get(0), topiaContext); } else { @@ -133,7 +134,7 @@ boolean continuous = "continuous".equalsIgnoreCase(factorGroupType); FactorGroup factorGroup = new FactorGroup(factorGroupName, continuous); - // sub factor group + /*// sub factor group List<Element> factorGroupElements = fgElement.selectNodes("child::factors"); for (Element factorGroupElement : factorGroupElements) { FactorGroup subFactorGroup = parseFactorGroup(factorGroupElement, topiaContext); @@ -306,7 +307,7 @@ } factorGroup.addFactor(factor); } - } + }*/ return factorGroup; } @@ -320,6 +321,10 @@ * @param fgElement factor group element (>factors<) * @param topiaContext context * @return factor group + * + * @deprecated since 4.0.1.0, this parsing method parse experimentalDesign + * in version "2", don't remove for + * data reading purpose, but could be removed in a future version */ protected static FactorGroup parseFactorGroupV2(Element fgElement, TopiaContext topiaContext) { @@ -328,7 +333,7 @@ boolean continuous = "continuous".equalsIgnoreCase(factorGroupType); FactorGroup factorGroup = new FactorGroup(factorGroupName, continuous); - // sub factor group + /*// sub factor group List<Element> factorGroupElements = fgElement.selectNodes("child::factors"); for (Element factorGroupElement : factorGroupElements) { FactorGroup subFactorGroup = parseFactorGroupV2(factorGroupElement, topiaContext); @@ -581,8 +586,284 @@ factor.setCardinality(cardinality); factorGroup.addFactor(factor); } + }*/ + + return factorGroup; + } + + /** + * Recursive parse of factor group elements (>factors<). + * + * This version handle xml file distribution definition in each continuous + * factors. + * + * @param fgElement factor group element (>factors<) + * @param topiaContext context + * @return factor group + * @since 4.0.1.0 + */ + protected static FactorGroup parseFactorGroupV3(Element fgElement, TopiaContext topiaContext) { + + String factorGroupName = fgElement.attributeValue(NAME); + String factorGroupType = fgElement.attributeValue("type"); + boolean continuous = "continuous".equalsIgnoreCase(factorGroupType); + FactorGroup factorGroup = new FactorGroup(factorGroupName, continuous); + + /*// sub factor group + List<Element> factorGroupElements = fgElement.selectNodes("child::factors"); + for (Element factorGroupElement : factorGroupElements) { + FactorGroup subFactorGroup = parseFactorGroupV3(factorGroupElement, topiaContext); + 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); + String property = factorElement.attributeValue(PROPERTY); + String path = factorElement.element(TARGET).getText().trim(); + String cardinalityString = factorElement.attributeValue(CARDINALITY); + Integer cardinality = 0; + if (StringUtils.isNotEmpty(cardinalityString)) { + cardinality = Integer.valueOf(cardinalityString); + } + + // double + if ("real".equals(type)) { + Factor factor = new Factor(name); + factor.setPath(path); + Element fixedElement = factorElement.element(DOMAIN).element(FIXED); + // tous les domaines continues + if (property.endsWith(CONTINUOUS)) { + + ContinuousDomain domain; + if(property.equals(MATRIXCONTINUOUS)) { + + MatrixContinuousDomain mdomain = new MatrixContinuousDomain(); + Element referenceElement = fixedElement.element(REFERENCE); + if (referenceElement != null) { + // matrix specific + // <coefficient operator="-" value="0.799"/> + mdomain.setCoefficient(Double.valueOf(referenceElement.attributeValue(COEFFICIENT))); + // <mx name="test1" step="0">... + Element matrixElement = referenceElement.element(MX); + MatrixND matrix = MexicoHelper.getMatrixFromXml(matrixElement, topiaContext); + mdomain.setReferenceValue(matrix); + mdomain.setPercentageType(true); + } + else { + Element rangeElement = fixedElement.element(RANGE); + Element minElement = rangeElement.element(MIN); + Element maxElement = rangeElement.element(MAX); + MatrixND minMatrix = MexicoHelper.getMatrixFromXml(minElement.element(MX), topiaContext); + MatrixND maxMatrix = MexicoHelper.getMatrixFromXml(maxElement.element(MX), topiaContext); + mdomain.setMinBound(minMatrix); + mdomain.setMaxBound(maxMatrix); + } + + domain = mdomain; + } + else if (property.equals(EQUATIONCONTINUOUS)) { + // equation specific + EquationContinuousDomain edomain = new EquationContinuousDomain(); + edomain.setVariableName(fixedElement.attributeValue(VARIABLE)); + Element referenceElement = fixedElement.element(REFERENCE); + if (referenceElement != null) { + edomain.setCoefficient(Double.valueOf(referenceElement.attributeValue(COEFFICIENT))); + edomain.setReferenceValue(Double.valueOf(referenceElement.getTextTrim())); + edomain.setPercentageType(true); + } + else { + Element rangeElement = fixedElement.element(RANGE); + Element minElement = rangeElement.element(MIN); + Element maxElement = rangeElement.element(MAX); + edomain.setMinBound(Double.valueOf(minElement.getTextTrim())); + edomain.setMaxBound(Double.valueOf(maxElement.getTextTrim())); + } + + domain = edomain; + } + else { + // continous domain + domain = new ContinuousDomain(); + + Element referenceElement = fixedElement.element(REFERENCE); + if (referenceElement != null) { + domain.setCoefficient(Double.valueOf(referenceElement.attributeValue(COEFFICIENT))); + domain.setReferenceValue(Double.valueOf(referenceElement.getTextTrim())); + domain.setPercentageType(true); + } + else { + // <range max="1.0" min="0.0"/> + Element rangeElement = fixedElement.element(RANGE); + Element minElement = rangeElement.element(MIN); + Element maxElement = rangeElement.element(MAX); + domain.setMinBound(Double.valueOf(minElement.getTextTrim())); + domain.setMaxBound(Double.valueOf(maxElement.getTextTrim())); + } + } + + factor.setDomain(domain); + } else if (DISCRETE.equals(property)) { + DiscreteDomain domain = new DiscreteDomain(); + List<Element> valueElements = fixedElement.element( + ENUMERATION).elements(VALUE); + int label = 0; + for (Element valueElement : valueElements) { + domain.getValues().put(label, + Double.valueOf(valueElement.getTextTrim())); + ++label; + } + factor.setDomain(domain); + } + factor.setCardinality(cardinality); + factorGroup.addFactor(factor); + } else if (INTEGER.equals(type)) { + Factor factor = new Factor(name); + factor.setPath(path); + Element fixedElement = factorElement.element(DOMAIN).element(FIXED); + if (CONTINUOUS.equals(property)) { + ContinuousDomain domain; + + if(property.equals(MATRIXCONTINUOUS)) { + + MatrixContinuousDomain mdomain = new MatrixContinuousDomain(); + Element referenceElement = fixedElement.element(REFERENCE); + if (referenceElement != null) { + // matrix specific + // <coefficient operator="-" value="0.799"/> + mdomain.setCoefficient(Double.valueOf(referenceElement.attributeValue(COEFFICIENT))); + // <mx name="test1" step="0">... + Element matrixElement = referenceElement.element(MX); + MatrixND matrix = MexicoHelper.getMatrixFromXml(matrixElement, topiaContext); + mdomain.setReferenceValue(matrix); + mdomain.setPercentageType(true); + } + else { + Element rangeElement = fixedElement.element(RANGE); + Element minElement = rangeElement.element(MIN); + Element maxElement = rangeElement.element(MAX); + MatrixND minMatrix = MexicoHelper.getMatrixFromXml(minElement.element(MX), topiaContext); + MatrixND maxMatrix = MexicoHelper.getMatrixFromXml(maxElement.element(MX), topiaContext); + mdomain.setMinBound(minMatrix); + mdomain.setMaxBound(maxMatrix); + } + + domain = mdomain; + } + else if (property.equals(EQUATIONCONTINUOUS)) { + // equation specific + EquationContinuousDomain edomain = new EquationContinuousDomain(); + edomain.setVariableName(fixedElement.attributeValue(VARIABLE)); + Element referenceElement = fixedElement.element(REFERENCE); + if (referenceElement != null) { + edomain.setCoefficient(Double.valueOf(referenceElement.attributeValue(COEFFICIENT))); + edomain.setReferenceValue(Double.valueOf(referenceElement.getTextTrim())); + edomain.setPercentageType(true); + } + else { + Element rangeElement = fixedElement.element(RANGE); + Element minElement = rangeElement.element(MIN); + Element maxElement = rangeElement.element(MAX); + edomain.setMinBound(Double.valueOf(minElement.getTextTrim())); + edomain.setMaxBound(Double.valueOf(maxElement.getTextTrim())); + } + + domain = edomain; + } + else { + // continous domain + domain = new ContinuousDomain(); + + Element referenceElement = fixedElement.element(REFERENCE); + if (referenceElement != null) { + domain.setCoefficient(Double.valueOf(referenceElement.attributeValue(COEFFICIENT))); + domain.setReferenceValue(Double.valueOf(referenceElement.getTextTrim())); + domain.setPercentageType(true); + } + else { + // <range max="1.0" min="0.0"/> + Element rangeElement = fixedElement.element(RANGE); + Element minElement = rangeElement.element(MIN); + Element maxElement = rangeElement.element(MAX); + domain.setMinBound(Integer.valueOf(minElement.getTextTrim())); + domain.setMaxBound(Integer.valueOf(maxElement.getTextTrim())); + } + } + + factor.setDomain(domain); + } else if (DISCRETE.equals(property)) { + DiscreteDomain domain = new DiscreteDomain(); + List<Element> valueElements = fixedElement.element( + ENUMERATION).elements(VALUE); + int label = 0; + for (Element valueElement : valueElements) { + domain.getValues().put(label, + Integer.valueOf(valueElement.getTextTrim())); + ++label; + } + factor.setDomain(domain); + } + factor.setCardinality(cardinality); + 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)) { + RuleDiscreteDomain domain = new RuleDiscreteDomain(); + 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(label, rulesValue); + ++label; + } + factor.setDomain(domain); + } + factor.setCardinality(cardinality); + factorGroup.addFactor(factor); + } else if (EQUATION.equals(type)) { + Factor factor = new Factor(name); + factor.setPath(path); + Element fixedElement = factorElement.element(DOMAIN).element(FIXED); + if (DISCRETE.equals(property)) { + EquationDiscreteDomain domain = new EquationDiscreteDomain(); + List<Element> valueElements = fixedElement.element(ENUMERATION).elements(VALUE); + int label = 0; + for (Element valueElement : valueElements) { + String content = StringEscapeUtils.unescapeXml(valueElement.getText()); + domain.getValues().put(label, content); + ++label; + } + factor.setDomain(domain); + } + factor.setCardinality(cardinality); + factorGroup.addFactor(factor); + } else if ("string".equals(type)) { + Factor factor = new Factor(name); + factor.setPath(path); + Element fixedElement = factorElement.element(DOMAIN).element(FIXED); + if (DISCRETE.equals(property)) { + DiscreteDomain domain = new DiscreteDomain(); + List<Element> valueElements = fixedElement.element(ENUMERATION).elements(VALUE); + int label = 0; + for (Element valueElement : valueElements) { + String content = valueElement.getText(); + Object object = MexicoHelper.getObjectFromString(content, topiaContext); + domain.getValues().put(label, object); + ++label; + } + factor.setDomain(domain); + } + factor.setCardinality(cardinality); + factorGroup.addFactor(factor); + } + }*/ + return factorGroup; } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/DomainXMLVisitor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -25,6 +25,7 @@ package fr.ifremer.isisfish.mexico.xml; +import fr.ifremer.isisfish.simulator.sensitivity.Domain; import fr.ifremer.isisfish.simulator.sensitivity.visitor.DomainVisitor; /** @@ -38,4 +39,19 @@ */ public abstract class DomainXMLVisitor extends AbstractXMLVisitor implements DomainVisitor { + /** + * {@inheritDoc} + */ + @Override + public void start(Domain domain) { + xmlBuffer.append("<domain>"); + } + + /** + * {@inheritDoc} + */ + @Override + public void end(Domain domain) { + xmlBuffer.append("</domain>"); + } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/EquationContinuousDomainXMLVisitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/EquationContinuousDomainXMLVisitor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/EquationContinuousDomainXMLVisitor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 1999 - 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 1999 - 2012 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.mexico.xml; import fr.ifremer.isisfish.simulator.sensitivity.Domain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; /** @@ -45,44 +44,14 @@ */ @Override public void start(Domain domain) { - xmlBuffer.append("<domain>"); - xmlBuffer.append("<fixed"); + xmlBuffer.append("<domain "); EquationContinuousDomain eDomain = (EquationContinuousDomain)domain; // this version add variable name xmlBuffer.append(" variable=\"") .append(eDomain.getVariableName()) - .append("\">"); + .append(">"); appendDomain(eDomain); } - - /** - * {@inheritDoc} - */ - @Override - protected void appendDomain(ContinuousDomain domain) { - - EquationContinuousDomain eDomain = (EquationContinuousDomain)domain; - - // facteur continue pourcentage - if (domain.isPercentageType()) { - xmlBuffer.append("<reference coefficient=\"") - .append(eDomain.getCoefficient()) - .append( "\">"); - xmlBuffer.append(eDomain.getReferenceValue()); - xmlBuffer.append("</reference>"); - } - else { - // facteur continue min/max - xmlBuffer.append("<range>"); - xmlBuffer.append("<min>") - .append(domain.getMinBound()) - .append("</min>"); - xmlBuffer.append("<max>") - .append(domain.getMaxBound()) - .append("</max>"); - xmlBuffer.append("</range>"); - } - } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/FactorXMLVisitor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -25,20 +25,14 @@ package fr.ifremer.isisfish.mexico.xml; -import org.nuiton.math.matrix.MatrixND; -import org.nuiton.topia.persistence.TopiaEntity; - 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.EquationDiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.visitor.FactorVisitor; -import fr.ifremer.isisfish.types.Month; -import fr.ifremer.isisfish.types.TimeStep; /** * XML factor visitor. @@ -58,44 +52,7 @@ public void start(Factor factor) { xmlBuffer.append("<factor"); xmlBuffer.append(" name=\"").append(factor.getName()).append("\""); - Object referenceValueForType = null; - // property attribute - Domain domain = factor.getDomain(); - - if (domain instanceof ContinuousDomain) { - if (domain instanceof MatrixContinuousDomain) { - xmlBuffer.append(" property=\"matrixcontinuous\""); - } else if (domain instanceof EquationContinuousDomain) { - xmlBuffer.append(" property=\"equationcontinuous\""); - } else { - xmlBuffer.append(" property=\"continuous\""); - } - referenceValueForType = ((ContinuousDomain) domain).getReferenceValue(); - if (referenceValueForType == null) { - referenceValueForType = ((ContinuousDomain) domain).getMinBound(); - } - } else if (domain instanceof DiscreteDomain) { - xmlBuffer.append(" property=\"discrete\""); - Object firstKey = ((DiscreteDomain) domain).getValues().firstKey(); - referenceValueForType = ((DiscreteDomain) domain).getValues().get(firstKey); - } - // type attribute - if (referenceValueForType instanceof Double || referenceValueForType instanceof Float - || referenceValueForType instanceof MatrixND) { - xmlBuffer.append(" type=\"real\""); - } else if (referenceValueForType instanceof Integer) { - xmlBuffer.append(" type=\"integer\""); - } else if (domain instanceof RuleDiscreteDomain) { - xmlBuffer.append(" type=\"rule\""); - } else if (domain instanceof EquationDiscreteDomain) { - xmlBuffer.append(" type=\"equation\""); - } else if (referenceValueForType instanceof TopiaEntity || - referenceValueForType instanceof TimeStep || - referenceValueForType instanceof Month) { - xmlBuffer.append(" type=\"string\""); - } - //cardinality xmlBuffer.append(" cardinality=\""); xmlBuffer.append(factor.getCardinality()); @@ -118,9 +75,7 @@ @Override public void visit(Factor factor, Domain domain) { DomainXMLVisitor visitor = null; - if (factor.getDomain() instanceof MatrixContinuousDomain) { - visitor = new MatrixContinuousDomainXMLVisitor(); - } else if (factor.getDomain() instanceof EquationContinuousDomain) { + if (factor.getDomain() instanceof EquationContinuousDomain) { visitor = new EquationContinuousDomainXMLVisitor(); } else if (factor.getDomain() instanceof ContinuousDomain) { visitor = new ContinuousDomainXMLVisitor(); Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/MatrixContinuousDomainXMLVisitor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/MatrixContinuousDomainXMLVisitor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/mexico/xml/MatrixContinuousDomainXMLVisitor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,73 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * 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 - * 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 org.nuiton.math.matrix.MatrixND; - -import fr.ifremer.isisfish.mexico.MexicoHelper; -import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; - -/** - * XML domain visitor for Matrix continuous. - * - * @author chatellier - * @version $Revision: 1.0 $ - * - * Last update : $Date: 5 mars 2009 $ - * By : $Author: chatellier $ - */ -public class MatrixContinuousDomainXMLVisitor extends ContinuousDomainXMLVisitor { - - /** - * {@inheritDoc} - */ - @Override - protected void appendDomain(ContinuousDomain domain) { - - MatrixContinuousDomain mDomain = (MatrixContinuousDomain)domain; - - // facteur continue pourcentage - if (domain.isPercentageType()) { - xmlBuffer.append("<reference coefficient=\"") - .append(mDomain.getCoefficient()) - .append("\">"); - xmlBuffer.append(MexicoHelper.getMatrixAsXML((MatrixND)mDomain.getReferenceValue())); - xmlBuffer.append("</reference>"); - } - else { - // facteur continue min/max - xmlBuffer.append("<range>"); - xmlBuffer.append("<min>") - .append(MexicoHelper.getMatrixAsXML((MatrixND)mDomain.getMinBound())) - .append("</min>"); - xmlBuffer.append("<max>") - .append(MexicoHelper.getMatrixAsXML((MatrixND)mDomain.getMaxBound())) - .append("</max>"); - xmlBuffer.append("</range>"); - } - } -} Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationParameterImpl.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2006 - 2010 Ifremer, Code Lutin, Cédric Pineau, Benjamin Poussin + * Copyright (C) 2006 - 2012 Ifremer, Code Lutin, Cédric Pineau, Benjamin Poussin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/AbstractSensitivityAnalysis.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -125,12 +125,13 @@ //Binf values - binfValues += ((ContinuousDomain) factor.getDomain()) + // FIXME echatellier to replace since 4.0.1 + /*binfValues += ((ContinuousDomain) factor.getDomain()) .getCalculatorMinBound(); //Bsup values bsupValues += ((ContinuousDomain) factor.getDomain()) - .getCalculatorMaxBound(); + .getCalculatorMaxBound();*/ } else { nominalValues += "\"" + factor.getNominalValue() + "\""; Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/DesignPlan.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -34,6 +34,8 @@ /** * Design plan contenant toutes les valeurs de facteurs possible. * + * It's equivalent to "experimentalDesign" in mexico. + * * @author chatellier * @version $Revision: 1.0 $ * Copied: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Distribution.java (from rev 3646, branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/distribution/Distribution.java) =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Distribution.java (rev 0) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Distribution.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -0,0 +1,120 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 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.simulator.sensitivity; + +import static org.nuiton.i18n.I18n._; + +/** + * Distribution used in sensitivity analysis (for continuous domain). + * + * @author chatellier + * @version $Revision$ + * @since 4.0.1.0 + * + * Last update : $Date$ + * By : $Author$ + */ +public enum Distribution { + + QUNIFPC(_("QUnif %"), + new DistributionParam("reference", _("Reference value"), true), + new DistributionParam("coefficient", _("Coefficient"))), + QUNIFMM(_("QUnif Min/Max"), + new DistributionParam("min", _("Minimum value"), true), + new DistributionParam("max", _("Maximum value"), true)), + DBINOM(_("Dbimom"), + new DistributionParam("size", _("number of trials (zero or more)")), + new DistributionParam("prob", _("probability of success on each trial"))), + DCAUCHY(_("dcauchy"), + new DistributionParam("location", _("location and scale parameters. (location = 0, scale = 1)")), + new DistributionParam("scale", _("location and scale parameters. (location = 0, scale = 1)"))), + DCHISQ(_("dchisq"), + new DistributionParam("df", _("degrees of freedom (non-negative, but can be non-integer)")), + new DistributionParam("ncp", _("non-centrality parameter (non-negative)."))), + DEXP(_("dexp"), + new DistributionParam("rate", _("vector of rates"))), + DF(_("df"), + new DistributionParam("df1", _("degrees of freedom. 'Inf' is allowed")), + new DistributionParam("df2", _("degrees of freedom. 'Inf' is allowed")), + new DistributionParam("ncp", _("non-centrality parameter. If omitted the central F is assumed"))), + DGAMMA(_("dgamma"), + new DistributionParam("rate", _("an alternative way to specify the scale.")), + new DistributionParam("shape", _("shape and scale parameters. Must be positive, 'scale' strictly")), + new DistributionParam("scale", _("shape and scale parameters. Must be positive, 'scale' strictly"))), + DGEOM(_("dgeom"), + new DistributionParam("prob", _("probability of success in each trial. '0 < prob <= 1'"))), + DHYPER(_("dhyper"), + new DistributionParam("m", _("the number of white balls in the urn.")), + new DistributionParam("n", _("the number of black balls in the urn.")), + new DistributionParam("k", _("the number of balls drawn from the urn."))), + DLNORM(_("dlnorm"), + new DistributionParam("meanlog", _("mean and standard deviation of the distribution on the log scale with default values of '0' and '1' respectively.")), + new DistributionParam("sdlog", _("mean and standard deviation of the distribution on the log scale with default values of '0' and '1' respectively."))); + + protected String description; + + protected DistributionParam[] params; + + private Distribution(String description, DistributionParam... params) { + this.description = description; + this.params = params; + } + + public DistributionParam[] getDistibutionParams() { + return params; + } + + public static class DistributionParam { + protected String name; + + protected String description; + + /** If original value must be set in UI (matrix). */ + protected boolean originalValue; + + public DistributionParam(String name, String description, boolean originalValue) { + this.name = name; + this.description = description; + this.originalValue = originalValue; + } + + public DistributionParam(String name, String description) { + this(name, description, false); + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public boolean isOriginalValue() { + return originalValue; + } + } +} Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/Factor.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -25,7 +25,6 @@ package fr.ifremer.isisfish.simulator.sensitivity; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; @@ -98,14 +97,14 @@ * * Par exemple: topiaID#gear aura pour effet de recuperer l'objet * correspondant au topiaID fournit et d'appeler le propriete - * <tt>setGear(value)</tt> dessus. + * {@code setGear(value)} dessus. */ protected String path; /** Cardinality */ protected int cardinality; - /** + /** * Constructor with name. * * @param name factor name @@ -183,9 +182,7 @@ * @return the value */ public Object getDisplayedValue() { - if (domain instanceof MatrixContinuousDomain) { - return identifier; - } if (domain instanceof EquationDiscreteDomain || + if (domain instanceof EquationDiscreteDomain || domain instanceof EquationContinuousDomain) { return "\"" + getValue() + "\""; } else { Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/FactorGroup.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -251,7 +251,9 @@ public Domain getDomain() { Domain domain = null; if (isContinuous()) { - domain = new ContinuousDomain(0.0, 1.0); + domain = new ContinuousDomain(Distribution.QUNIFMM); + ((ContinuousDomain)domain).addDistributionParam("min", 0.0); + ((ContinuousDomain)domain).addDistributionParam("min", 1.0); } else if (isDiscrete()) { // les domaines doivent avoir les même domaines Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -23,8 +23,19 @@ package fr.ifremer.isisfish.simulator.sensitivity; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixND; +import fr.ifremer.isisfish.entities.Equation; +import fr.ifremer.isisfish.types.RangeOfValues; +import fr.ifremer.isisfish.types.TimeUnit; + /** * Utility methods for sensitivity analysis. * @@ -36,6 +47,14 @@ */ public class SensitivityUtils { + private static final Log log = LogFactory.getLog(SensitivityUtils.class); + + /** Properties file resource path. */ + protected final static String PROPERTIES_PATH = "/sensitivity.properties"; + + /** Cached properties. */ + protected static Properties sensitivityProperties; + /** * Escape factor name. * @@ -49,4 +68,108 @@ name = name.replaceAll("\\W", "_"); return name; } + + /** + * Is field sensitivity enabled. + * + * Return true, if field name is present in properties file. + * + * @param sensitivityFactorName name + * @return <tt>true</tt> if factor name is sensitivity enabled + */ + public static boolean isSensitivityFactorEnabled(String sensitivityFactorName) { + Properties data = getProperties(); + return data.getProperty(sensitivityFactorName) != null; + + } + + /** + * Return cached properties file. + * Load it at first call. + * + * @return properties + */ + public static Properties getProperties() { + + if (sensitivityProperties == null) { + sensitivityProperties = new Properties(); + InputStream stream = null; + try { + stream = SensitivityUtils.class.getResourceAsStream(PROPERTIES_PATH); + sensitivityProperties.load(stream); + } catch (IOException ex) { + if (log.isErrorEnabled()) { + log.error("Can't load sensitivity properties file", ex); + } + } finally { + try { + if (stream != null) { + stream.close(); + } + } catch (IOException ex) { + if (log.isErrorEnabled()) { + log.error("Can't load sensitivity properties file", ex); + } + } + } + } + return sensitivityProperties; + } + + /** + * Return true if value can be defined in continuous factor. + * + * Il serait plus interessant de le faire sur les types et non sur les + * valeur mais pour {@link RangeOfValues} par exemple, seule la valeur + * a un type Float... donc pas evident. + * + * @param value value + * @return continuous enabled + */ + public static boolean canBeContinue(Object value) { + boolean result = false; + + if (value instanceof Double) { + result = true; + } else if (value instanceof Long) { + result = true; + } else if (value instanceof Equation) { + result = true; + } else if (value instanceof MatrixND) { + result = true; + } else if (value instanceof RangeOfValues) { + RangeOfValues rangeOfValues = (RangeOfValues)value; + if (rangeOfValues.getType().equals("Float")) { + result = true; + } + } else if (value instanceof TimeUnit) { + result = true; + } else if (value instanceof String) { + // todo fix string value :( + result = true; + } + + return result; + } + + /** + * Return if value is is continue factor enable. + * + * @param value value to test + * @return {@code true} if value is is continue factor enable + */ + public static boolean isContinue(Object value) { + boolean result = false; + if (value instanceof RangeOfValues) { + RangeOfValues range = (RangeOfValues)value; + if (range.getType().equals(RangeOfValues.TYPE_FLOAT)) { + String textValue = range.getValues(); + // TODO need comment !!! + if (textValue.matches("^\\ *[0-9]*\\ *\\-\\ *[0-9]*\\ *$")) { + result = true; + } + } + } + return result; + } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -25,25 +25,18 @@ package fr.ifremer.isisfish.simulator.sensitivity.domain; +import java.util.Map.Entry; +import java.util.SortedMap; +import java.util.TreeMap; + import fr.ifremer.isisfish.IsisFishRuntimeException; +import fr.ifremer.isisfish.simulator.sensitivity.Distribution; +import fr.ifremer.isisfish.simulator.sensitivity.Distribution.DistributionParam; import fr.ifremer.isisfish.simulator.sensitivity.Domain; import fr.ifremer.isisfish.simulator.sensitivity.visitor.DomainVisitor; /** - * - * All the continuous domains can be of 2 different types (min/max or - * percentage). - * - * A min/max domain can take 2 values : {@link #minBound} and {@link #maxBound}. - * A percentage domain got 2 values {@link #coefficient} and - * {@link #referenceValue} that are the basis to calculate the {@link #minBound} - * and {@link #maxBound} values. - * - * A continuous domain also got a cardinality, either filled in by the user or - * the sensitivity method if it manages it. - * - * To do sensitivity calculations, you MUST use {@link #getCalculatorMinBound()}, - * {@link #getCalculatorMaxBound()}. + * All the continuous domains are based on distribution definition. * * @author chatellier * @version $Revision: 1.0 $ @@ -56,189 +49,119 @@ /** serialVersionUID. */ private static final long serialVersionUID = -2037768174807839046L; - /** Min value. */ - protected Object minBound; + /** Continuous domain distribution. */ + protected Distribution distribution; - /** Max value. */ - protected Object maxBound; + /** Distribution params (param name > param value). */ + protected SortedMap<String, Object> distributionParameters = new TreeMap<String, Object>(); - /** Value used to create the factor. */ - protected Object referenceValue; - - /** Coefficient in percent */ - protected Double coefficient; - - /** Flag to know the type of the domain **/ - protected boolean percentageType; - /** - * Min/max type constructor. + * Default constructor. */ public ContinuousDomain() { - this(false); + } /** - * Constructor with bounds. + * Constructor with distribution. * - * @param minBound min bound - * @param maxBound max bound + * @param distribution distribution */ - public ContinuousDomain(Object minBound, Object maxBound) { + public ContinuousDomain(Distribution distribution) { this(); - this.minBound = minBound; - this.maxBound = maxBound; + this.distribution = distribution; } /** - * Constructor with type. + * Constructor with distribution and parameters. * - * @param percentageType if {@code true} percentage type + * @param distribution distribution + * @param distributionParameters distribution params */ - public ContinuousDomain(boolean percentageType) { - this.percentageType = percentageType; + public ContinuousDomain(Distribution distribution, SortedMap<String, Object> distributionParameters) { + this(distribution); + setDistributionParams(distributionParameters); } /** - * Return factor type (min/max or percentage). + * Get distribution. * - * @return {@code true} if percentage type + * @return distribution */ - public boolean isPercentageType() { - return percentageType; + public Distribution getDistribution() { + return distribution; } /** - * Set domain type (min/max or percentage). + * Get distribution parameters. * - * @param percentageType new type value + * @return distribution parameters */ - public void setPercentageType(boolean percentageType) { - this.percentageType = percentageType; + public SortedMap<String, Object> getDistributionParameters() { + return distributionParameters; } - - /** - * Return the minimum bound of the domain. Do not use this value for - * sensitivity calculation, prefer using {@link #getCalculatorMinBound}. - * - * @return the minimum bound - */ - public Object getMinBound() { - Object result; - if (isPercentageType()) { - result = ((Double)referenceValue + (((Double)referenceValue * coefficient) * ((2 * getCalculatorMinBound() - 1)))); - } else { - result = minBound; - } - return result; - } - - /** - * Return the minimum bound for sensitivity calculators. It always returns 0. - * - * @return the minimum bound for sensitivity analysis. - */ - public double getCalculatorMinBound() { - return 0; - } /** - * Set the minimum bound of the domain. + * Set distribution parameters (clear previous). * - * @param minBound the minimum bound. + * @param distributionParameters distribution params */ - public void setMinBound(Object minBound) { - this.minBound = minBound; + public void setDistributionParams(SortedMap<String, Object> distributionParameters) { + distributionParameters.clear(); + addDistributionParams(distributionParameters); } /** - * Return the maximum bound of the domain. Do not use this value for - * sensitivity calculation, prefer using {@link #getCalculatorMaxBound}. + * Add distribution parameters. * - * @return the maximum bound + * @param distributionParameters distribution parameters. */ - public Object getMaxBound() { - Object result; - if (isPercentageType()) { - result = ((Double) referenceValue + - (((Double) referenceValue * coefficient) - * ((2 * getCalculatorMaxBound() - 1)))); - } else { - result = maxBound; + public void addDistributionParams(SortedMap<String, Object> distributionParameters) { + for (Entry<String, Object> entry : distributionParameters.entrySet()) { + addDistributionParam(entry.getKey(), entry.getValue()); } - return result; } - - /** - * Return the minimum bound for sensitivity calculators. It always returns 1. - * - * @return the maximum bound for sensitivity analysis. - */ - public double getCalculatorMaxBound() { - return 1; - } /** - * Set max value. + * Add distribution parameter. * - * @param maxBound the maxBound to set - */ - public void setMaxBound(Object maxBound) { - this.maxBound = maxBound; - } - - - /** - * Get coefficient. + * Parameter name must be in current distribution parameter list. * - * @return the coefficient + * @param name parameter name + * @param value parameter value */ - public Double getCoefficient() { - return coefficient; - } + public void addDistributionParam(String name, Object value) { + + if (distribution == null) { + throw new IllegalStateException("Distribution not set"); + } - /** - * Set coefficient. - * - * @param coefficient the coefficient to set - */ - public void setCoefficient(Double coefficient) { - this.coefficient = coefficient; - } + // get current parameter definition + DistributionParam defDistribParams = distribution.getDistibutionParams()[distributionParameters.size()]; + if (!defDistribParams.getName().equals(name)) { + throw new IllegalArgumentException(String.format("Wrong parameter name, expected %s, got %s", defDistribParams.getName(), name)); + } - /** - * Get reference value. - * - * @return the reference value - */ - public Object getReferenceValue() { - return referenceValue; + distributionParameters.put(name, value); } /** - * Set reference value. - * - * @param referenceValue the reference value.to set - */ - public void setReferenceValue(Object referenceValue) { - this.referenceValue = referenceValue; - } - - /** * {@inheritDoc}. */ public Object getValueForIdentifier(Object identifier) { - Double result; + Double result = 0d; - if (isPercentageType()) { + // FIXME + /*if (isPercentageType()) { // since 3.4.0.0, operator is always * result = ((Double)referenceValue + (((Double)referenceValue * coefficient) * ((2 * (Double)identifier - 1)))); } else { result = ((Double)identifier * ((Double)maxBound - (Double)minBound)) + (Double)minBound; - } + }*/ + return result; } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomain.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -25,12 +25,14 @@ package fr.ifremer.isisfish.simulator.sensitivity.domain; +import java.util.SortedMap; + +import fr.ifremer.isisfish.simulator.sensitivity.Distribution; + /** - * Domaine continu portant sur variable pouvant prendre diférente valeur par + * Domaine continu portant sur variable pouvant prendre différente valeur par * rapport à une valeur initiale. * - * Composé d'un borne min et max et d'un opération. - * * @author chatellier * @version $Revision: 1.0 $ * @@ -45,22 +47,32 @@ protected String variableName; /** - * Min/max type constructor. + * Empty constructor. */ public EquationContinuousDomain() { - super(); + } - + /** - * Constructor with type. + * COnstructor with distribution. * - * @param percentageType if {@code true} percentage type + * @param distribution distribution + * @param params parameters */ - public EquationContinuousDomain(boolean percentageType) { - super(percentageType); + public EquationContinuousDomain(Distribution distribution, SortedMap<String, Object> params) { + super(distribution, params); } /** + * Constructor with distribution. + * + * @param distribution distribution + */ + public EquationContinuousDomain(Distribution distribution) { + super(distribution); + } + + /** * Get variable name. * * @return the variableName @@ -79,21 +91,8 @@ } @Override - public EquationContinuousDomain clone() { - EquationContinuousDomain cloned = (EquationContinuousDomain)super.clone(); - cloned.setMaxBound(this.maxBound); - cloned.setMinBound(this.minBound); - cloned.setCoefficient(this.coefficient); - cloned.setReferenceValue(this.referenceValue); - cloned.setVariableName(this.variableName); - return cloned; - } - - @Override public String toString() { - String result = "variableName=" + variableName + - " coefficient=" + coefficient + " referenceValue=" + referenceValue + - " min=" + minBound + "max=" + maxBound; + String result = super.toString() + ";variableName=" + variableName; return result; } } Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomain.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,132 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * 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 - * 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.domain; - -import org.nuiton.math.matrix.MapFunction; -import org.nuiton.math.matrix.MatrixND; - -/** - * Domaine continu portant sur une matrice. - * - * @author chatellier - * @version $Revision: 1.0 $ - * - * Last update : $Date: 24 févr. 2009 $ By : $Author: chatellier $ - */ -public class MatrixContinuousDomain extends ContinuousDomain { - - /** serialVersionUID. */ - private static final long serialVersionUID = -2037768174807839046L; - - /** - * Min/max type constructor. - */ - public MatrixContinuousDomain() { - super(); - } - - /** - * Constructor with type. - * - * @param percentageType if {@code true} percentage type - */ - public MatrixContinuousDomain(boolean percentageType) { - super(percentageType); - } - - @Override - public Object getValueForIdentifier(Object identifier) { - return getValueForIdentifier((Double)identifier); - } - - /** - * In matrix continuous domain, return a new matrix. - * - * @param identifier identifier - * @return a new computed matrix - */ - public MatrixND getValueForIdentifier(final Double identifier) { - MatrixND temp = ((MatrixND)getReferenceValue()).copy(); - - // since 3.4.0.0, operator is always * - temp.map(new MapFunction() { - public double apply(double val) { - return (val + ((val * coefficient) * ((2 * identifier - 1)))); - } - }); - return temp; - } - - @Override - public MatrixContinuousDomain clone() { - MatrixContinuousDomain cloned = (MatrixContinuousDomain)super.clone(); - return cloned; - } - - /** - * {@inheritDoc} - * - * @return the minimum bound - */ - public Object getMinBound() { - - if (minBound == null) { - MatrixND temp = ((MatrixND) getReferenceValue()).copy(); - - // since 3.4.0.0, operator is always * - temp.map(new MapFunction() { - public double apply(double val) { - return (val + ((val * coefficient) * ((2 * getCalculatorMinBound() - 1)))); - } - }); - return temp; - } else { - return minBound; - } - } - - /** - * {@inheritDoc} - * - * @return the maximum bound - */ - public Object getMaxBound() { - - if (maxBound == null) { - MatrixND temp = ((MatrixND) getReferenceValue()).copy(); - - // since 3.4.0.0, operator is always * - temp.map(new MapFunction() { - public double apply(double val) { - return (val + ((val * coefficient) * ((2 * getCalculatorMaxBound() - 1)))); - } - }); - return temp; - } else { - return maxBound; - } - } -} Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputContentUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputContentUI.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputContentUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -64,7 +64,7 @@ javax.swing.JComponent javax.swing.event.ChangeListener fr.ifremer.isisfish.entities.FisheryRegion - fr.ifremer.isisfish.ui.sensitivity.SensitivityUtils + fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils fr.ifremer.isisfish.ui.WelcomePanelUI org.nuiton.topia.persistence.TopiaEntityContextable org.nuiton.topia.TopiaContext Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/input/InputHandler.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -3,7 +3,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2011 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2011 - 2012 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 @@ -87,8 +87,8 @@ import fr.ifremer.isisfish.ui.input.tree.FisheryTreeSelectionModel; import fr.ifremer.isisfish.ui.input.tree.loadors.PopulationsNodeLoador; import fr.ifremer.isisfish.ui.models.common.StringComboModel; -import fr.ifremer.isisfish.ui.sensitivity.FactorWizardUI; -import fr.ifremer.isisfish.ui.sensitivity.SensitivityInputHandler; +import fr.ifremer.isisfish.ui.sensitivity.wizard.FactorWizardUI; +import fr.ifremer.isisfish.ui.sensitivity.wizard.SensitivityWizardHandler; import fr.ifremer.isisfish.ui.simulator.filter.SimulationFilterUtil; import fr.ifremer.isisfish.vcs.VCSException; @@ -771,7 +771,7 @@ if (bean != null) { FactorWizardUI factorWizardUI = new FactorWizardUI(inputContentUI); - SensitivityInputHandler handler = factorWizardUI.getHandler(); + SensitivityWizardHandler handler = factorWizardUI.getHandler(); handler.initNewFactor(factorWizardUI, bean, sensitivityMethod); factorWizardUI.pack(); factorWizardUI.setLocationRelativeTo(inputContentUI); Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/ContinuousPanelContainerUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/ContinuousPanelContainerUI.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/ContinuousPanelContainerUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,41 +0,0 @@ -<!-- - #%L - IsisFish - - $Id$ - $HeadURL$ - %% - 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 - 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% - --> -<JPanel layout='{new BorderLayout()}' abstract="true"> - - <Boolean id='continuePossible' javaBean='true'/> - - <Boolean id='continueSelected' javaBean='false'/> - - <script><![CDATA[ -/** - * Return true only if UI component are all filled and value are correct - * to define new factor. - */ -public abstract boolean isFactorValid(); - ]]></script> - - <JPanel id='content' layout='{new BorderLayout()}' constraints='BorderLayout.CENTER'/> - -</JPanel> \ No newline at end of file Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/DefaultContinuousPanelUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/DefaultContinuousPanelUI.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/DefaultContinuousPanelUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,158 +0,0 @@ -<!-- - #%L - IsisFish - - $Id$ - $HeadURL$ - %% - 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 - 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% - --> -<ContinuousPanelContainerUI> - - <Boolean id="percentageTypeFactor" javaBean="true" /> - - <import> - org.apache.commons.lang3.StringUtils - java.beans.PropertyChangeEvent - java.beans.PropertyChangeListener - java.awt.CardLayout - </import> - - <script><![CDATA[ -public void init(String min, String max, String referenceValue, String coefficient) { - continueMin.setText(min); - continueMax.setText(max); - referenceValueField.setText(referenceValue); - coefficientField.setText(coefficient); -} - -public void initExisting(String min, String max, String referenceValue, String coefficient) { - init(min, max, referenceValue, coefficient); - setPercentageTypeFactor(StringUtils.isNotBlank(coefficient)); -} - -@Override -public boolean isFactorValid() { - boolean valid = false; - - try { - if (continueSelected) { - if (percentageTypeFactor) { - Double coefficient = Double.parseDouble(coefficientField.getText().trim()); - Double referenceValue = Double.parseDouble(referenceValueField.getText().trim()); - valid = coefficient != null && referenceValue != null; - } - else { - Double minValue = Double.parseDouble(continueMin.getText().trim()); - Double maxValue = Double.parseDouble(continueMax.getText().trim()); - valid = minValue != null && maxValue != null; - } - } - else { - valid = true; - } - } - catch (NumberFormatException eee) { - if (log.isWarnEnabled()) { - log.warn("Double parse error", eee); - } - } - - return valid; -} - -protected void $afterCompleteSetup() { - addPropertyChangeListener(PROPERTY_PERCENTAGE_TYPE_FACTOR, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if ((Boolean)evt.getNewValue()) { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "percentageType"); - } else { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "minMaxType"); - } - } - }); -} - ]]></script> - <JPanel id="content"> - <Table constraints='BorderLayout.CENTER'> - <row> - <cell fill='horizontal' weightx='1'> - <JRadioButton text="isisfish.sensitivity.continuouspercentagetype" - onActionPerformed="setPercentageTypeFactor(true)" - selected="{isPercentageTypeFactor()}"/> - </cell> - <cell fill='horizontal' weightx='1'> - <JRadioButton text="isisfish.sensitivity.continuousminmaxtype" - onActionPerformed="setPercentageTypeFactor(false)" - selected="{!isPercentageTypeFactor()}"/> - </cell> - </row> - <row> - <cell fill='both' columns="2" weightx='1' weighty='1'> - <JPanel layout="{new CardLayout()}" id="hidablePanel"> - <Table constraints='"percentageType"' border='{BorderFactory.createTitledBorder("")}'> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.referencevalue' - enabled='{isPercentageTypeFactor()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='referenceValueField' - enabled='{isPercentageTypeFactor()}'/> - </cell> - </row> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.coefficient' - enabled='{isPercentageTypeFactor()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='coefficientField' - enabled='{isPercentageTypeFactor()}'/> - </cell> - </row> - </Table> - <Table constraints='"minMaxType"' border='{BorderFactory.createTitledBorder("")}'> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.firstValue' - enabled='{!isPercentageTypeFactor()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='continueMin' - enabled='{!isPercentageTypeFactor()}'/> - </cell> - </row> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.lastValue' - enabled='{!isPercentageTypeFactor()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='continueMax' - enabled='{!isPercentageTypeFactor()}'/> - </cell> - </row> - </Table> - </JPanel> - </cell> - </row> - </Table> - </JPanel> -</ContinuousPanelContainerUI> \ No newline at end of file Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/EquationContinuousPanelUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/EquationContinuousPanelUI.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/EquationContinuousPanelUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,328 +0,0 @@ -<!-- - #%L - IsisFish - - $Id$ - $HeadURL$ - %% - 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 - 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% - --> -<ContinuousPanelContainerUI> - - <import> - java.awt.Component - java.awt.Dimension - java.util.ArrayList - java.util.EventObject - java.util.List - java.util.regex.Matcher - java.util.regex.Pattern - javax.swing.table.AbstractTableModel - javax.swing.table.DefaultTableModel - javax.swing.table.TableCellEditor - javax.swing.table.TableModel - javax.swing.JComboBox - javax.swing.DefaultCellEditor - javax.swing.event.CellEditorListener - fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain - org.apache.commons.lang3.StringUtils - java.beans.PropertyChangeEvent - java.beans.PropertyChangeListener - java.awt.CardLayout - </import> - - <String id='text' javaBean='null'/> - <org.nuiton.topia.persistence.TopiaEntityContextable id='bean' javaBean='null'/> - <String id='beanProperty' javaBean='null'/> - <!-- For editor doc purpose --> - <Class id='clazz' javaBean='null'/> - <String id='formuleCategory' javaBean='null'/> - <fr.ifremer.isisfish.entities.Equation id='selectedEquation' javaBean='null'/> - <!-- bean property --> - <fr.ifremer.isisfish.entities.Formule id='formule' javaBean='null'/> - - <Boolean id="selectedDomain" javaBean="false" /> - <Boolean id="percentageTypeDomain" javaBean="false" /> - - <script><![CDATA[ - -protected List<EquationContinuousDomain> domains = new ArrayList<EquationContinuousDomain>(); - -public List<EquationContinuousDomain> getDomains() { - return domains; -} - -protected void addDomain(EquationContinuousDomain domain) { - domains.add(domain); - // fire data change - variablesListModel.setDomains(domains); -} - -/** - * Valid selected domain. - */ -protected void validSelectedDomain() { - // fill selected - EquationContinuousDomain selectedDomain = (EquationContinuousDomain)variablesList.getSelectedValue(); - selectedDomain.setVariableName(variableNameField.getText().trim()); - if (isPercentageTypeDomain()) { - selectedDomain.setPercentageType(true); - selectedDomain.setReferenceValue(Double.parseDouble(referenceValueField.getText())); - selectedDomain.setCoefficient(Double.parseDouble(coefficientField.getText()) / 100); - } else { - selectedDomain.setPercentageType(false); - selectedDomain.setMinBound(Double.parseDouble(minBoundField.getText())); - selectedDomain.setMaxBound(Double.parseDouble(maxBoundField.getText())); - } - - - // parse equation content to replace - // double xxx = 4.0; - // by - // double xxx = context.getValueAndCompute("myfactorname.xxx", 4.0) - // if xxx is the variable name to replace - String variableName = selectedDomain.getVariableName(); - String[] lines = editor.getEditor().getText().split("\n"); - String result = ""; - for (String line : lines) { - Pattern p = Pattern.compile("(^.*\\s+" + variableName + "\\s*\\=\\s*)([\\d\\.]+).*\\;$"); - Matcher matcher = p.matcher(line); - if (matcher.find()) { - String fullVariableName = bean.toString() + "." + StringUtils.uncapitalize(beanProperty) + "." + variableName; - line = matcher.group(1) + "context.getValueAndCompute(\"" + fullVariableName + "\", " + matcher.group(2) + ");"; - } - result += line + "\n"; - } - editor.getEditor().setText(result); - - // fire data change - variablesListModel.setDomains(domains); -} - -protected void addNewVariable() { - EquationContinuousDomain domain = new EquationContinuousDomain(); - domain.setVariableName("X"); - addDomain(domain); - - // auto select - variablesList.setSelectedValue(domain, true); -} - -protected void displaySelectedDomain() { - EquationContinuousDomain selectedDomain = (EquationContinuousDomain)variablesList.getSelectedValue(); - if (selectedDomain != null) { - setSelectedDomain(true); - variableNameField.setText(selectedDomain.getVariableName()); - setPercentageTypeDomain(selectedDomain.getCoefficient() != null); - if (selectedDomain.getCoefficient() != null) { - coefficientField.setText(String.valueOf(selectedDomain.getCoefficient() * 100)); - } else { - coefficientField.setText(""); - } - if (selectedDomain.getReferenceValue() != null) { - referenceValueField.setText(selectedDomain.getReferenceValue().toString()); - } else { - referenceValueField.setText(""); - } - if (selectedDomain.getMinBound() != null) { - minBoundField.setText(selectedDomain.getMinBound().toString()); - } else { - minBoundField.setText(""); - } - if (selectedDomain.getMaxBound() != null) { - maxBoundField.setText(selectedDomain.getMaxBound().toString()); - } else { - maxBoundField.setText(""); - } - } else { - setSelectedDomain(false); - } -} - -protected void removeSelectedVariable() { - int selectedIndex = variablesList.getSelectedIndex(); - domains.remove(selectedIndex); - - // fire data change - variablesList.clearSelection(); - variablesListModel.setDomains(domains); -} - -@Override -public boolean isFactorValid() { - boolean valid = true; - - try { - for (EquationContinuousDomain domain : domains) { - if (StringUtils.isBlank(domain.getVariableName())) { - valid = false; - } - else if (domain.getCoefficient() == null) { - valid = domain.getMinBound() != null && domain.getMaxBound() != null; - } - else { - valid = domain.getReferenceValue() != null; - } - } - } catch (NumberFormatException ex) { - valid = false; - } - - return valid; -} - -protected void $afterCompleteSetup() { - addPropertyChangeListener(PROPERTY_PERCENTAGE_TYPE_DOMAIN, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if ((Boolean)evt.getNewValue()) { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "percentageType"); - } else { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "minMaxType"); - } - } - }); -} - ]]></script> - <JPanel id='content'> - <JScrollPane constraints='BorderLayout.CENTER'> - <Table> - <row> - <cell fill='both' weightx='1' weighty='1'> - <JScrollPane preferredSize="{new Dimension(200, 150)}"> - <fr.ifremer.isisfish.ui.sensitivity.equation.EquationDomainListModel - id="variablesListModel" constructorParams="domains" /> - <JList id="variablesList" model="{variablesListModel}" - cellRenderer="{new fr.ifremer.isisfish.ui.sensitivity.equation.EquationDomainRenderer()}"/> - <ListSelectionModel initializer="variablesList.getSelectionModel()" - onValueChanged="displaySelectedDomain();setSelectedDomain(variablesList.getSelectedIndex() != -1)" /> - </JScrollPane> - </cell> - <cell fill='both' weightx='1' weighty='1'> - <Table> - <row> - <cell fill="horizontal" columns="2"> - <Table> - <row> - <cell> - <JLabel text="isisfish.sensitivity.equation.variablename" enabled='{isSelectedDomain()}' /> - </cell> - <cell fill="horizontal" weightx='1'> - <JTextField id="variableNameField" enabled='{isSelectedDomain()}'/> - </cell> - </row> - </Table> - </cell> - </row> - <row> - <cell fill="horizontal" weightx='1'> - <JRadioButton id="minMaxButton" text="isisfish.sensitivity.continuousminmaxtype" - onActionPerformed="setPercentageTypeDomain(!minMaxButton.isSelected())" - selected="{!isPercentageTypeDomain()}" - enabled='{isSelectedDomain()}'/> - </cell> - <cell fill="horizontal" weightx='1'> - <JRadioButton id="percentageTypeButton" text="isisfish.sensitivity.continuouspercentagetype" - onActionPerformed="setPercentageTypeDomain(percentageTypeButton.isSelected())" - selected="{isPercentageTypeDomain()}" - enabled='{isSelectedDomain()}'/> - </cell> - </row> - <row> - <cell fill="both" weighty='1' columns="2"> - <JPanel layout="{new CardLayout()}" id="hidablePanel"> - <Table border='{BorderFactory.createTitledBorder("")}' constraints='"minMaxType"'> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.firstValue' - enabled='{isSelectedDomain()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='minBoundField' - enabled='{isSelectedDomain()}'/> - </cell> - </row> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.lastValue' - enabled='{isSelectedDomain()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='maxBoundField' - enabled='{isSelectedDomain()}'/> - </cell> - </row> - </Table> - <Table border='{BorderFactory.createTitledBorder("")}' constraints='"percentageType"'> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.referencevalue' - enabled='{isSelectedDomain()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='referenceValueField' - enabled='{isSelectedDomain()}'/> - </cell> - </row> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.coefficient' - enabled='{isSelectedDomain()}'/> - </cell> - <cell fill='horizontal' weightx='0.5'> - <JTextField id='coefficientField' - enabled='{isSelectedDomain()}'/> - </cell> - </row> - </Table> - </JPanel> - </cell> - </row> - <row> - <cell fill="horizontal" columns="2"> - <JButton text="isisfish.sensitivity.equation.valid" - enabled='{isSelectedDomain()}' - onActionPerformed='validSelectedDomain()' /> - </cell> - </row> - </Table> - </cell> - </row> - <row> - <cell fill='horizontal'> - <JButton id='add' text='isisfish.common.add' visible='{isContinuePossible()}' - onActionPerformed='addNewVariable()'/> - </cell> - <cell fill='horizontal'> - <JButton id='remove' text='isisfish.common.remove' visible='{isContinuePossible()}' - enabled='{isSelectedDomain()}' onActionPerformed='removeSelectedVariable()'/> - </cell> - </row> - <row> - <cell fill='both' columns='2' weightx='1' weighty='1'> - <fr.ifremer.isisfish.ui.input.InputOneEquationUI id='editor' constructorParams='this' - autoSaveModification="false" formule='{getFormule()}' text='{getText()}' - bean='{getBean()}' clazz='{getClazz()}' beanProperty='{getBeanProperty()}' - formuleCategory='{getFormuleCategory()}' selectedEquation='{getSelectedEquation()}' - visible='{isContinuePossible()}' active="true" /> - </cell> - </row> - </Table> - </JScrollPane> - </JPanel> -</ContinuousPanelContainerUI> Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/FactorWizardUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/FactorWizardUI.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/FactorWizardUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,188 +0,0 @@ -<!-- - #%L - IsisFish - - $Id$ - $HeadURL$ - %% - 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 - 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% - --> -<JDialog title='isisfish.sensitivity.title' modal='{true}' layout='{new BorderLayout()}'> - - <import> - org.apache.commons.lang3.StringUtils - org.nuiton.topia.persistence.TopiaEntityContextable - fr.ifremer.isisfish.ui.SimulationUI - fr.ifremer.isisfish.ui.simulator.SimulAction - fr.ifremer.isisfish.ui.input.InputSaveVerifier - fr.ifremer.isisfish.simulator.sensitivity.Factor - fr.ifremer.isisfish.simulator.sensitivity.Domain - fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain - fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain - fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain - java.beans.PropertyChangeEvent - java.beans.PropertyChangeListener - java.util.SortedMap - javax.swing.JComponent - java.awt.CardLayout - </import> - - <SensitivityInputHandler id="handler" /> - - <Boolean id='continuePossible' javaBean='false'/> - - <Boolean id='continueSelected' javaBean='false'/> - - <Boolean id='existingValue' javaBean='false'/> - - <String id="factorPath" javaBean="null"/> - - <script><![CDATA[ - -protected java.util.List<JComponent> discretComponents = new ArrayList<JComponent>(); -protected ContinuousPanelContainerUI continuousPanel = null; - -/*protected void $afterCompleteSetup() { - addPropertyChangeListener(PROPERTY_CONTINUE_POSSIBLE, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (continuousPanel != null) { - continuousPanel.setContinuePossible((Boolean)evt.getNewValue()); - } - } - }); - - addPropertyChangeListener(PROPERTY_CONTINUE_SELECTED, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (continuousPanel != null) { - continuousPanel.setContinueSelected((Boolean)evt.getNewValue()); - } - } - }); -}*/ - -protected void $afterCompleteSetup() { - addPropertyChangeListener(PROPERTY_CONTINUE_SELECTED, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if ((Boolean)evt.getNewValue()) { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "continuousPanelContainer"); - } else { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "discretePanelContainer"); - } - - // necessary for validation - if (continuousPanel != null) { - continuousPanel.setContinueSelected((Boolean)evt.getNewValue()); - } - } - }); -} - -protected SimulAction getSimulAction() { - return getContextValue(SimulAction.class); -} - ]]></script> - <Table constraints='BorderLayout.CENTER'> - <row> - <cell columns='4' fill='horizontal'> - <Table> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.name'/> - </cell> - <cell weightx='1' fill='horizontal'> - <JTextField id='factorNameField'/> - </cell> - </row> - </Table> - </cell> - </row> - <row> - <cell fill='horizontal' weightx='1' columns='2'> - <JRadioButton id='discret' text='isisfish.sensitivity.discret' - selected='{true}' buttonGroup='factorType' - onActionPerformed='setContinueSelected(continueRadio.isSelected())'/> - </cell> - <cell fill='horizontal' weightx='1' columns='2'> - <JRadioButton id='continueRadio' text='isisfish.sensitivity.continue' - buttonGroup='factorType' selected='{false}' visible='{isContinuePossible()}' - onActionPerformed='setContinueSelected(continueRadio.isSelected())'/> - </cell> - </row> - <row> - <cell columns='4' fill='both' weightx='1' weighty='3'> - <JPanel layout="{new CardLayout()}" id="hidablePanel"> - - <!-- discrete --> - <Table id='discretePanelContainer' border='{BorderFactory.createTitledBorder("")}' - constraints='"discretePanelContainer"'> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.selectDiscretNumber'/> - </cell> - <cell fill='horizontal' weightx='1'> - <JTextField id='discretNumber'/> - </cell> - <cell fill='horizontal'> - <JButton text='isisfish.sensitivity.validDiscretNumber' - onActionPerformed='getHandler().addTabs(this)'/> - </cell> - </row> - <row> - <cell columns='3' fill='both' weightx='1' weighty='2' anchor="north"> - <JTabbedPane id='tabPane'/> - </cell> - </row> - </Table> - - <!-- continous --> - <JPanel id='continuousPanelContainer' layout='{new BorderLayout()}' - border='{BorderFactory.createTitledBorder("")}' - constraints='"continuousPanelContainer"' /> - </JPanel> - </cell> - </row> - <row> - <cell columns='4' fill='horizontal'> - <JLabel text='isisfish.sensitivity.comment'/> - </cell> - </row> - <row> - <cell columns='4' fill='both' weighty='1'> - <JScrollPane> - <JTextArea id='comment'/> - </JScrollPane> - </cell> - </row> - <row> - <cell fill='horizontal'> - <JButton id='cancel' text='isisfish.common.cancel' onActionPerformed='dispose()'/> - </cell> - <cell fill='horizontal' columns='2'> - <JButton id='remove' text='isisfish.common.remove' visible='{isExistingValue()}' - onActionPerformed='getHandler().remove(this)'/> - </cell> - <cell fill='horizontal'> - <JButton id='save' text='isisfish.common.save' enabled='{!getFactorNameField().getText().isEmpty()}' - onActionPerformed='getHandler().save(this)'/> - </cell> - </row> - </Table> -</JDialog> \ No newline at end of file Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/MatrixContinuousPanelUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/MatrixContinuousPanelUI.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/MatrixContinuousPanelUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,148 +0,0 @@ -<!-- - #%L - IsisFish - - $Id$ - $HeadURL$ - %% - 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 - 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% - --> -<ContinuousPanelContainerUI> - - <Boolean id="percentageTypeFactor" javaBean="true" /> - - <import> - org.apache.commons.lang3.StringUtils - org.nuiton.math.matrix.gui.MatrixPanelEditor - org.nuiton.math.matrix.MatrixND - java.awt.CardLayout - java.beans.PropertyChangeEvent - java.beans.PropertyChangeListener - </import> - - <script><![CDATA[ -public void init(MatrixND min, MatrixND max, MatrixND referenceValue, String coefficient) { - minValuePanel.setMatrix(min); - maxValuePanel.setMatrix(max); - referenceValuePanel.setMatrix(referenceValue); - coefficientField.setText(coefficient); -} - -public void initExisting(MatrixND min, MatrixND max, MatrixND referenceValue, String coefficient) { - init(min, max, referenceValue, coefficient); - setPercentageTypeFactor(StringUtils.isNotBlank(coefficient)); -} - -@Override -public boolean isFactorValid() { - boolean valid = false; - - try { - if (continueSelected) { - if (percentageTypeFactor) { - Double coefficient = Double.parseDouble(coefficientField.getText().trim()); - valid = coefficient != null; - } - else { - valid = true; - } - } - else { - valid = true; - } - } - catch (NumberFormatException eee) { - if (log.isWarnEnabled()) { - log.warn("Double parse error", eee); - } - } - - return valid; -} - -protected void $afterCompleteSetup() { - addPropertyChangeListener(PROPERTY_PERCENTAGE_TYPE_FACTOR, new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if ((Boolean)evt.getNewValue()) { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "percentageType"); - } else { - ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "minMaxType"); - } - } - }); -} - ]]></script> - <JPanel id="content"> - <Table constraints='BorderLayout.CENTER'> - <row> - <cell fill='horizontal' weightx='1'> - <JRadioButton text="isisfish.sensitivity.continuouspercentagetype" - onActionPerformed="setPercentageTypeFactor(true)" - selected="{isPercentageTypeFactor()}"/> - </cell> - <cell fill='horizontal' weightx='1'> - <JRadioButton text="isisfish.sensitivity.continuousminmaxtype" - onActionPerformed="setPercentageTypeFactor(false)" - selected="{!isPercentageTypeFactor()}"/> - </cell> - </row> - <row> - <cell fill='both' weightx='1' weighty='1' columns="2"> - <JPanel layout="{new CardLayout()}" id="hidablePanel"> - <Table constraints='"percentageType"' border='{BorderFactory.createTitledBorder("")}'> - <row> - <cell fill='horizontal' columns="2"> - <JLabel text='isisfish.sensitivity.referencevalue'/> - </cell> - </row> - <row> - <cell fill='both' weighty='1' columns="2"> - <MatrixPanelEditor id='referenceValuePanel'/> - </cell> - </row> - <row> - <cell fill='horizontal'> - <JLabel text='isisfish.sensitivity.coefficient'/> - </cell> - <cell fill='horizontal' weightx='1'> - <JTextField id='coefficientField'/> - </cell> - </row> - </Table> - - <Table constraints='"minMaxType"' border='{BorderFactory.createTitledBorder("")}'> - <row> - <cell fill='both' weightx='1' weighty='1'> - <JTabbedPane> - <tab title="isisfish.sensitivity.firstValue"> - <MatrixPanelEditor id='minValuePanel'/> - </tab> - <tab title="isisfish.sensitivity.lastValue"> - <MatrixPanelEditor id='maxValuePanel'/> - </tab> - </JTabbedPane> - </cell> - </row> - </Table> - </JPanel> - </cell> - </row> - </Table> - </JPanel> -</ContinuousPanelContainerUI> \ No newline at end of file Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityInputHandler.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityInputHandler.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityInputHandler.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -3,7 +3,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2011 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2011 - 2012 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,59 +29,33 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; -import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.List; -import java.util.SortedMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTextField; import javax.swing.event.TreeSelectionEvent; import javax.swing.text.JTextComponent; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; -import jaxx.runtime.context.JAXXInitialContext; - import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.math.matrix.MatrixND; import org.nuiton.math.matrix.gui.MatrixPanelEditor; import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityContextable; import fr.ifremer.isisfish.IsisFishRuntimeException; -import fr.ifremer.isisfish.datastore.RegionStorage; -import fr.ifremer.isisfish.entities.Equation; import fr.ifremer.isisfish.entities.FisheryRegion; -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.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.EquationDiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; import fr.ifremer.isisfish.types.Month; -import fr.ifremer.isisfish.types.RangeOfValues; import fr.ifremer.isisfish.types.TimeStep; -import fr.ifremer.isisfish.types.TimeUnit; -import fr.ifremer.isisfish.ui.SimulationUI; -import fr.ifremer.isisfish.ui.input.InputAction; import fr.ifremer.isisfish.ui.input.InputContentUI; import fr.ifremer.isisfish.ui.input.InputHandler; import fr.ifremer.isisfish.ui.input.InputOneEquationUI; @@ -89,10 +63,9 @@ import fr.ifremer.isisfish.ui.input.tree.FisheryTreeHelper; import fr.ifremer.isisfish.ui.input.tree.FisheryTreeNode; import fr.ifremer.isisfish.ui.input.tree.FisheryTreeRenderer; +import fr.ifremer.isisfish.ui.sensitivity.wizard.FactorWizardUI; +import fr.ifremer.isisfish.ui.sensitivity.wizard.SensitivityWizardHandler; import fr.ifremer.isisfish.ui.simulator.RuleChooser; -import fr.ifremer.isisfish.ui.simulator.SimulAction; -import fr.ifremer.isisfish.ui.widget.editor.StepComponent; -import fr.ifremer.isisfish.ui.widget.editor.MonthComponent; /** * Handler for sensitivity tab ui (fishery region factors). @@ -296,7 +269,7 @@ if (!(selectedObject instanceof FactorGroup)) { Factor selectedFactor = (Factor)selectedObject; FactorWizardUI factorWizardUI = new FactorWizardUI(sensitivityTabUI); - SensitivityInputHandler handler = factorWizardUI.getHandler(); + SensitivityWizardHandler handler = factorWizardUI.getHandler(); handler.initExistingFactor(factorWizardUI, selectedFactor); factorWizardUI.pack(); factorWizardUI.setLocationRelativeTo(sensitivityTabUI); @@ -335,246 +308,6 @@ } /** - * Un init new se fait toujours sur une entité. - * - * On recupere des info sur le type correspondant à la proprieté a mettre - * en facteur pour savoir le composant d'edition et s'il peut etre continue - * ou pas. - * - * @param factorWizardUI factorWizardUI - * @param bean bean in current ui - * @param property bean property to edit - */ - public void initNewFactor(FactorWizardUI factorWizardUI, TopiaEntityContextable bean, String property) { - - // path is topiaId#property - // ex : fwn#fsd#0.3425345#name - // for JAXX : cOrigine start with upper case - // for commons beanutils : must be lower case - String beanProperty = StringUtils.uncapitalize(property); - String path = bean.getTopiaId() + "#" + beanProperty; - factorWizardUI.setFactorPath(path); - factorWizardUI.getFactorNameField().setText(bean.toString() + "." + beanProperty); - - // get value for pointed path - //TopiaContext topiaContext = factorWizardUI.getContextValue(TopiaContext.class); - //Class<?> classForPath = getPropertyClass(path, topiaContext); - // peut etre pas une bonne idée que ce soit basé sur les valeurs - // au lieu des types (mais pour RangeOfValues, pas evident) - Object valueForPath = getPropertyValue(bean, beanProperty); - boolean continuePossible = canBeContinue(valueForPath); - boolean continueSelected = isContinue(valueForPath); - - // init panel - if (continuePossible) { - factorWizardUI.continuousPanel = getContinuousPanel(valueForPath, bean, property); - factorWizardUI.getContinuousPanelContainer().add(factorWizardUI.continuousPanel, BorderLayout.CENTER); - } - - // after, for binding on continuePossible, continueSelected to work - factorWizardUI.setContinuePossible(continuePossible); - factorWizardUI.setContinueSelected(continueSelected); - factorWizardUI.getContinueRadio().setSelected(continueSelected); - } - - /** - * Permet d'intialiser le wizard avec une valeur independante de la - * provenance (utile pour les facteurs sur les parametres de regles). - * - * TODO chatellier : ne doit pas fonctionner pour des equations. - * - * @param factorWizardUI factorWizardUI - * @param value value - */ - public void initNewFactorWithValue(FactorWizardUI factorWizardUI, Object value) { - boolean continuePossible = canBeContinue(value); - boolean continueSelected = isContinue(value); - - // init panel - if (continuePossible) { - factorWizardUI.continuousPanel = getContinuousPanel(value, null, null); - factorWizardUI.getContinuousPanelContainer().add(factorWizardUI.continuousPanel, BorderLayout.CENTER); - } - - // after, for binding on continuePossible, continueSelected to work - factorWizardUI.setContinuePossible(continuePossible); - factorWizardUI.setContinueSelected(continueSelected); - factorWizardUI.getContinueRadio().setSelected(continueSelected); - } - - /** - * Reaffiche un facteur existant. - * - * @param factorWizardUI - * @param factor factor - */ - public void initExistingFactor(FactorWizardUI factorWizardUI, Factor factor) { - - factorWizardUI.setExistingValue(true); - String factorPath = factor.getPath(); - Domain domain = factor.getDomain(); - String factorName = factor.getName(); - factorWizardUI.setFactorPath(factorPath); - factorWizardUI.getComment().setText(factor.getComment()); - - // dans le cas d'un facteur equation - // il faut enlever la varible du nom - // sinon, à la sauvegarde elle sera reajoutée - if (domain instanceof EquationContinuousDomain) { - EquationContinuousDomain equationDomain = (EquationContinuousDomain)domain; - String suffix = equationDomain.getVariableName(); - factorName = StringUtils.removeEnd(factorName, "." + suffix); - // can be called _xxx after char remplacement for R - factorName = StringUtils.removeEnd(factorName, "_" + suffix); - } - - if (domain instanceof ContinuousDomain) { - - ContinuousDomain cDomain = (ContinuousDomain) domain; - - TopiaContext topiaContext = factorWizardUI.getContextValue(TopiaContext.class); - factorWizardUI.continuousPanel = getContinuousPanelWithValue(factor, cDomain, topiaContext); - factorWizardUI.getContinuousPanelContainer().add(factorWizardUI.continuousPanel, BorderLayout.CENTER); - - factorWizardUI.getContinueRadio().setSelected(true); - factorWizardUI.setContinueSelected(true); - factorWizardUI.setContinuePossible(true); - } else { - - // restaure discrete domain - DiscreteDomain dDomain = (DiscreteDomain)domain; - - int nb = dDomain.getValues().size(); - factorWizardUI.getDiscretNumber().setText(String.valueOf(nb)); - factorWizardUI.discretComponents.clear(); - factorWizardUI.getTabPane().removeAll(); - - SortedMap<Object, Object> values = dDomain.getValues(); - int i = 0; - for (Object o : values.values()) { - i++; - JComponent c = null; - if (o != null) { - c = getEditorWithValue(factorWizardUI, factor, dDomain, o); - } - else { - if (log.isWarnEnabled()) { - log.warn("Null value in factor"); - } - } - factorWizardUI.discretComponents.add(c); - JScrollPane js = new JScrollPane(c); - String tabName = _("isisfish.sensitivity.discretevaluelabel", i); - factorWizardUI.getTabPane().addTab(tabName, js); - } - - // init non selected continous panel - if (factorPath.indexOf('#') != -1) { - try { - // get initial value in database - String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); - String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); - TopiaContext topiaContext = factorWizardUI.getContextValue(TopiaContext.class); - TopiaEntityContextable entity = (TopiaEntityContextable)topiaContext.findByTopiaId(topiaId); - String getter = "get" + StringUtils.capitalize(property); - Method m = entity.getClass().getMethod(getter); - Object valueForPath = m.invoke(entity); - - boolean continuePossible = canBeContinue(valueForPath); - factorWizardUI.setContinuePossible(continuePossible); - if (continuePossible) { - factorWizardUI.continuousPanel = getContinuousPanel(valueForPath, entity, property); - factorWizardUI.getContinuousPanelContainer().add(factorWizardUI.continuousPanel, BorderLayout.CENTER); - } - } catch (Exception ex) { - throw new IsisFishRuntimeException("Can't get factor path database value", ex); - } - } - } - - factorWizardUI.getFactorNameField().setText(factorName); - } - - /** - * Refresh tab for discrete factor numbers. - * - * @param factorWizardUI factorWizardUI - */ - public void addTabs(FactorWizardUI factorWizardUI) { - String discreteNumber = factorWizardUI.getDiscretNumber().getText(); - int nbTab = Integer.parseInt(discreteNumber); - factorWizardUI.discretComponents.clear(); - factorWizardUI.getTabPane().removeAll(); - for (int i = 1; i <= nbTab ; i++) { - JComponent c = getNewDiscreteComponent(factorWizardUI); - factorWizardUI.discretComponents.add(c); - String tabName = _("isisfish.sensitivity.discretevaluelabel", i); - factorWizardUI.getTabPane().addTab(tabName, c); - } - factorWizardUI.pack(); - } - - /** - * Retourne le type de valeur pointé par le path du facteur. - * - * Il vaut mieux recuperer le type de la propriété a mettre en facteur - * que la valeur elle meme; elle peut être null et on ne peut pas en - * deduire sont type. - * - * @param factorPath factor path - * @param context context - * @return class - */ - protected Class<?> getPropertyClass(String factorPath, TopiaContext context) { - Class<?> result = null; - if (factorPath.indexOf('#') != -1) { - String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); - String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); - - try { - TopiaEntity entity = context.findByTopiaId(topiaId); - - if (log.isDebugEnabled()) { - log.debug("Factor path " + factorPath + " denoted entity " + entity); - } - - String getter = "get" + StringUtils.capitalize(property); - Method method = entity.getClass().getMethod(getter); - result = method.getReturnType(); - - } catch (Exception ex) { - if (log.isErrorEnabled()) { - log.error("Can't find entity for " + topiaId, ex); - } - } - } - return result; - } - - /** - * Get value for fieldName in entity. - * - * @param entity - * @param fieldName - * @return method return value - */ - protected Object getPropertyValue(Object entity, String fieldName) { - Object result = null; - try { - // fieldName maybe be sometime lower case - String getMethod = "get" + StringUtils.capitalize(fieldName); - - Method m = entity.getClass().getMethod(getMethod); - result = m.invoke(entity); - } catch (Exception ex) { - if (log.isErrorEnabled()) { - log.error("Can't get entity value", ex); - } - } - return result; - } - - /** * Return if type can be defined as a factor. * * @param type type @@ -599,634 +332,6 @@ } /** - * Return true if value can be defined in continuous factor. - * - * Il serait plus interessant de le faire sur les types et non sur les - * valeur mais pour {@link RangeOfValues} par exemple, seule la valeur - * a un type Float... donc pas evident. - * - * @param value value - * @return continuous enabled - */ - public boolean canBeContinue(Object value) { - boolean result = false; - - if (value instanceof Double) { - result = true; - } else if (value instanceof Long) { - result = true; - } else if (value instanceof Equation) { - result = true; - } else if (value instanceof MatrixND) { - result = true; - } else if (value instanceof RangeOfValues) { - RangeOfValues rangeOfValues = (RangeOfValues)value; - if (rangeOfValues.getType().equals("Float")) { - result = true; - } - } else if (value instanceof TimeUnit) { - result = true; - } else if (value instanceof String) { - // todo fix string value :( - result = true; - } - - return result; - } - - /** - * Return if value is is continue factor enable. - * - * @param value value to test - * @return {@code true} if value is is continue factor enable - */ - public boolean isContinue(Object value) { - boolean result = false; - if (value instanceof RangeOfValues) { - RangeOfValues range = (RangeOfValues)value; - if (range.getType().equals(RangeOfValues.TYPE_FLOAT)) { - String textValue = range.getValues(); - // TODO need comment !!! - if (textValue.matches("^\\ *[0-9]*\\ *\\-\\ *[0-9]*\\ *$")) { - result = true; - } - } - } - return result; - } - - /** - * Get copy of component with original entity value as default value. - * - * @param value value - * @param bean bean - * @param property property - * @return component copy - */ - public ContinuousPanelContainerUI getContinuousPanel(Object value, TopiaEntityContextable bean, String property) { - ContinuousPanelContainerUI result; - - if (value instanceof RangeOfValues) { - RangeOfValues rangeOfValues = (RangeOfValues)value; - DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); - String values = rangeOfValues.getValues(); - String min = "0"; - String max = "0"; - if (values.matches("^\\ *[0-9]*\\ *\\-\\ *[0-9]*\\ *$")) { - int first = values.indexOf("-"); - if (first != -1) { - min = values.substring(0, first); - max = values.substring(first + 1); - } - } - ui.init(min, max, min, null); - result = ui; - } - else if (value instanceof Equation) { - Equation equation = (Equation)value; - EquationContinuousPanelUI ui = new EquationContinuousPanelUI(new JAXXInitialContext().add(new InputAction())); - ui.setSelectedEquation(equation); - ui.setText(_("isisfish.common.equation")); // can't get real name - ui.setFormuleCategory(equation.getCategory()); - ui.setClazz(equation.getClass()); - ui.setBeanProperty(property); - ui.setBean(bean); - result = ui; - } else if (value instanceof MatrixND) { - MatrixND matrix = (MatrixND)value; - MatrixContinuousPanelUI matrixPanel = new MatrixContinuousPanelUI(); - matrixPanel.init(matrix.clone(), matrix.clone(), matrix.clone(), null); - result = matrixPanel; - } else if (value instanceof TimeUnit) { - TimeUnit timeUnit = (TimeUnit)value; - DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); - ui.init(String.valueOf(timeUnit.getTime()), String.valueOf(timeUnit.getTime()), - String.valueOf(timeUnit.getTime()), null); - result = ui; - } else { - DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); - ui.init(String.valueOf(value), String.valueOf(value), String.valueOf(value), null); - result = ui; - } - - if (log.isDebugEnabled()) { - log.debug("Component for " + value + " (" + bean + ", " + property + ")"); - log.debug(" > " + result); - } - - return result; - } - - /** - * Get continuous editor for component with given value. - * - * @param domain domain - * @param factor factor - * @param topiaContext context used to get database value in case of equation factors - * @return component copy - */ - public ContinuousPanelContainerUI getContinuousPanelWithValue(Factor factor, ContinuousDomain domain, TopiaContext topiaContext) { - ContinuousPanelContainerUI result = null; - - if (domain instanceof EquationContinuousDomain) { - String factorPath = factor.getPath(); - if (factor.getPath().indexOf('#') != -1) { - String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); - String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); - - // get bean in database - try { - TopiaEntityContextable entity = (TopiaEntityContextable)topiaContext.findByTopiaId(topiaId); - - String getter = "get" + StringUtils.capitalize(property); - Method m = entity.getClass().getMethod(getter); - Equation value = (Equation)m.invoke(entity); - - // fill component - EquationContinuousPanelUI ui = new EquationContinuousPanelUI( - new JAXXInitialContext().add(new InputAction())); - ui.setText(value.getContent()); - ui.setFormuleCategory(value.getCategory()); - ui.setText(_("isisfish.common.equation")); // can't get real name - ui.setClazz(value.getClass()); - ui.setBeanProperty(property); - ui.setBean(entity); - - EquationContinuousDomain equationDomain = (EquationContinuousDomain) domain; - ui.addDomain(equationDomain); - - result = ui; - } catch (Exception ex) { - throw new IsisFishRuntimeException("Can't restore initial factor database property", ex); - } - } - // TODO path with no # (normalement pas possible pour les equations) - } else if (domain instanceof MatrixContinuousDomain) { - MatrixContinuousPanelUI continuousPanel = new MatrixContinuousPanelUI(); - // factor numerique continue (percentage) - if (domain.isPercentageType()) { - MatrixND matrix = (MatrixND)domain.getReferenceValue(); - // il y a bien 3 fois domain.getReferenceValue() pas d'erreur - continuousPanel.initExisting( - matrix.clone(), - matrix.clone(), - matrix.clone(), - String.valueOf(domain.getCoefficient() * 100.0)); - } - else { - // factor numerique continue (min/max) - // pas d'erreur sur 2 fois domain.getMinBound() - MatrixND matrixMin = (MatrixND)domain.getMinBound(); - MatrixND matrixMax = (MatrixND)domain.getMaxBound(); - continuousPanel.initExisting( - matrixMin.clone(), - matrixMax.clone(), - matrixMin.clone(), - ""); - } - result = continuousPanel; - } else { - DefaultContinuousPanelUI continuousPanel = new DefaultContinuousPanelUI(); - - // factor numerique continue (percentage) - if (domain.isPercentageType()) { - // il y a bien 3 fois domain.getReferenceValue() pas d'erreur - continuousPanel.initExisting( - String.valueOf(domain.getReferenceValue()), - String.valueOf(domain.getReferenceValue()), - String.valueOf(domain.getReferenceValue()), - String.valueOf(domain.getCoefficient() * 100.0 )); - } - else { - // factor numerique continue (min/max) - // pas d'erreur sur 2 fois domain.getMinBound() - // on initialise avec minBound comme valeur de référence. - continuousPanel.initExisting( - String.valueOf(domain.getMinBound()), - String.valueOf(domain.getMaxBound()), - String.valueOf(domain.getMinBound()), - ""); - } - result = continuousPanel; - } - - return result; - } - - /** - * Get editor for value (discrete). - * - * @param factorWizardUI context for context value (RegionStorage) - * @param value type to get editor - * @param factor - * @param domain - * @return component - */ - protected JComponent getEditorWithValue(FactorWizardUI factorWizardUI, Factor factor, Domain domain, Object value) { - - JComponent result = null; - - if (Double.class.isAssignableFrom(value.getClass())) { - result = new JTextField(); - ((JTextField)result).setText(String.valueOf(value)); - } - else if (double.class.isAssignableFrom(value.getClass())) { - result = new JTextField(); - ((JTextField)result).setText(String.valueOf(value)); - } - else if (MatrixND.class.isAssignableFrom(value.getClass())) { - result = new MatrixPanelEditor(); - ((MatrixPanelEditor)result).setMatrix((MatrixND)value); - } - else if (domain instanceof RuleDiscreteDomain) { - result = new RuleChooser(factorWizardUI); - ((RuleChooser)result).setRulesList((List<Rule>)value); - } - else if (domain instanceof EquationDiscreteDomain) { - String factorPath = factor.getPath(); - if (factor.getPath().indexOf('#') != -1) { - String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); - String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); - - // get bean in database - try { - TopiaContext topiaContext = factorWizardUI.getContextValue(TopiaContext.class); - TopiaEntityContextable entity = (TopiaEntityContextable)topiaContext.findByTopiaId(topiaId); - - String getter = "get" + StringUtils.capitalize(property); - Method m = entity.getClass().getMethod(getter); - Equation equation = (Equation)m.invoke(entity); - - // fill component - InputOneEquationUI ui = new InputOneEquationUI(factorWizardUI); - ui.setAutoSaveModification(false); - ui.setFormuleCategory(equation.getCategory()); - ui.setText(_("isisfish.common.equation")); // can't get real name - ui.setClazz(value.getClass()); - ui.setBeanProperty(property); - ui.setBean(entity); // set bean fire content modification event - ui.getEditor().setText((String)value); - ui.setActive(true); - - result = ui; - } catch (Exception ex) { - throw new IsisFishRuntimeException("Can't restore initial factor database property", ex); - } - } - // TODO path with no # (normalement pas possible pour les equations) - } - else if (value instanceof TimeUnit) { - result = new JTextField(); - ((JTextField)result).setText(String.valueOf(((TimeUnit)value).getTime())); - } else if (value instanceof TopiaEntity) { - RegionStorage regionStorage = factorWizardUI.getContextValue(RegionStorage.class); - TopiaContext context = null; - try { - context = regionStorage.getStorage().beginTransaction(); - List list = context.find("from " + value.getClass().getName()); - JComboBox c = new JComboBox(list.toArray()); - c.setSelectedItem(value); - result = c; - } catch (TopiaException ex) { - throw new IsisFishRuntimeException("Can't get entity list", ex); - } finally { - if (context != null) { - try { - context.closeContext(); - } catch (TopiaException ex) { - throw new IsisFishRuntimeException("Can't get entity list", ex); - } - } - } - } else if (value instanceof TimeStep) { - TimeStep timeStep = (TimeStep)value; - result = new StepComponent(timeStep.getMonth().getMonthNumber(), timeStep.getYear()); - } else if (value instanceof Month) { - Month month = (Month)value; - result = MonthComponent.createMounthCombo(month.getMonthNumber()); - } else if (value instanceof String) { - // valeur non typées ??? - result = new JTextField(); - ((JTextField)result).setText(String.valueOf(value)); - } - - if (log.isDebugEnabled()) { - log.debug("Editor for value " + value + " is " + result); - } - - return result; - } - - /** - * Get copy of component with original entity value as default value. - * Used to add new tab to a new or existing factor. - * - * Le composant retourné est inclut dans un jscrollpane (sauf pour les - * matrices qui contient deja un jscrollpane) - * - * @param factorWizardUI factorWizardUI - * @return component copy - */ - public JComponent getNewDiscreteComponent(FactorWizardUI factorWizardUI) { - - JComponent result = null; - String factorPath = factorWizardUI.getFactorPath(); - - if (factorPath.indexOf('#') != -1) { - String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); - String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); - TopiaContext topiaContext = factorWizardUI.getContextValue(TopiaContext.class); - - try { - // get bean in database - TopiaEntityContextable entity = (TopiaEntityContextable)topiaContext.findByTopiaId(topiaId); - String getter = "get" + StringUtils.capitalize(property); - Method m = entity.getClass().getMethod(getter); - Object value = m.invoke(entity); - - // init new jcomponent for value - if (value instanceof Number) { - result = new JTextField(String.valueOf(value)); - } else if (value instanceof MatrixND) { - result = new MatrixPanelEditor(); - MatrixND matrix = ((MatrixND)value).copy(); - ((MatrixPanelEditor)result).setMatrix(matrix); - } else if (value instanceof RangeOfValues) { - RangeOfValues rangeOfValues = (RangeOfValues)value; - result = new JTextField(rangeOfValues.getValues()); - } else if (value instanceof TimeUnit) { - TimeUnit timeUnit = (TimeUnit)value; - result = new JTextField(String.valueOf(timeUnit.getTime())); - } else if (value instanceof Equation) { - Equation equation = (Equation)value; - // fill component - InputOneEquationUI ui = new InputOneEquationUI(factorWizardUI); - ui.setAutoSaveModification(false); - ui.setText(equation.getContent()); - ui.setFormuleCategory(equation.getCategory()); - ui.setText(_("isisfish.common.equation")); // can't get real name - ui.setClazz(value.getClass()); - ui.setBeanProperty(property); - ui.setBean(entity); - ui.setActive(true); - result = ui; - } - - } catch (Exception ex) { - throw new IsisFishRuntimeException("Can't restore intial factor database property", ex); - } - } - else { - // dans ce cas c'est des regles, pop de départ ou parametres de regles - // c'est un peu galere car le code n'a rien a voir avec le reste - // donc, c'est du cas par cas - if (factorPath.equals("parameters.rules")) { - result = new RuleChooser(factorWizardUI); - } else if (factorPath.startsWith("parameters.population.")) { - MatrixContinuousPanelUI currentPanel = (MatrixContinuousPanelUI)factorWizardUI.continuousPanel; - // on copie une des matrices du composant - MatrixND matrix = currentPanel.getReferenceValuePanel().getMatrix().copy(); - result = new MatrixPanelEditor(); // bug in 2.2.x with matrix in constructor - ((MatrixPanelEditor)result).setMatrix(matrix); - } else if (factorPath.startsWith("parameters.rule.")) { - Pattern pattern = Pattern.compile("^parameters\\.rule\\.\\d+\\.parameter\\.\\w+\\.(.+)$"); - Matcher matcher = pattern.matcher(factorPath); - if (matcher.matches()) { - String className = matcher.group(1); - try { - if (log.isDebugEnabled()) { - log.debug("Looking for a component for class : " + className); - } - Class type = Class.forName(className); - result = getRuleDiscreteComponent(factorWizardUI, type); - } catch (ClassNotFoundException ex) { - if (log.isWarnEnabled()) { - log.warn("Can't find class for rule parameter", ex); - } - } - } else { - // double... - result = new JTextField(); - } - } else { - if (log.isWarnEnabled()) { - log.warn("Can't find component for path " + factorPath); - } - } - } - - if (log.isDebugEnabled()) { - log.debug("Component for path " + factorPath + " is " + result); - } - - // hack : si on met 2 fois un jscrollpane, rien ne s'affiche - if (!(result instanceof MatrixPanelEditor)) { - result = new JScrollPane(result); - } - - return result; - } - - /** - * Get new special - * @param clazz - * @return - */ - protected JComponent getRuleDiscreteComponent(FactorWizardUI factorWizardUI, Class type) { - - JComponent result = null; - - if (TopiaEntity.class.isAssignableFrom(type)) { - RegionStorage regionStorage = factorWizardUI.getContextValue(RegionStorage.class); - TopiaContext context = null; - try { - context = regionStorage.getStorage().beginTransaction(); - List list = context.find("from " + type.getName()); - JComboBox c = new JComboBox(list.toArray()); - result = c; - } catch (TopiaException ex) { - throw new IsisFishRuntimeException("Can't get entity list", ex); - } finally { - if (context != null) { - try { - context.closeContext(); - } catch (TopiaException ex) { - throw new IsisFishRuntimeException("Can't get entity list", ex); - } - } - } - } else if (TimeStep.class.isAssignableFrom(type)) { - result = new StepComponent(0, 0); - } else if (Month.class.isAssignableFrom(type)) { - result = MonthComponent.createMounthCombo(0); - } else { - result = new JTextField(); - } - - return result; - } - - /** - * Save current factor. - * - * @param factorWizardUI factorWizardUI - */ - public void save(FactorWizardUI factorWizardUI) { - - // first check is factor is valid - boolean factorValid = true; - ContinuousPanelContainerUI continuousPanel = factorWizardUI.continuousPanel; - if (continuousPanel != null) { - factorValid = continuousPanel.isFactorValid(); - } - if (!factorValid) { - JOptionPane.showMessageDialog(factorWizardUI, _("isisfish.sensitivity.factor.notvalid"), - _("isisfish.sensitivity.title"), JOptionPane.ERROR_MESSAGE); - return; - } - - // call specific method depending on continuous/discrete - if (factorWizardUI.getContinueRadio().isSelected()) { - saveContinue(factorWizardUI.getFactorNameField().getText(), - factorWizardUI.getComment().getText(), factorWizardUI.getFactorPath(), factorWizardUI.continuousPanel, - factorWizardUI.getSimulAction(), factorWizardUI.isExistingValue()); - } else { - saveDiscret(factorWizardUI.getFactorNameField().getText(), - factorWizardUI.getComment().getText(), factorWizardUI.getFactorPath(), factorWizardUI.discretComponents, - factorWizardUI.getSimulAction(), factorWizardUI.isExistingValue()); - } - - // refresh factor list - factorWizardUI.getContextValue(SimulationUI.class, "SimulationUI").refreshFactorTree(); - - // close window - factorWizardUI.dispose(); - } - - /** - * Save a continous factor. - * - * @param name factor name - * @param comment comment - * @param path factor path - * @param panel panel - * @param action action - * @param exist exist - */ - protected void saveContinue(String name, - String comment, String path, ContinuousPanelContainerUI panel, - SimulAction action, boolean exist) { - if (panel instanceof MatrixContinuousPanelUI) { - MatrixContinuousPanelUI matrixPanel = (MatrixContinuousPanelUI) panel; - if (matrixPanel.isPercentageTypeFactor()) { - MatrixND referenceValue = matrixPanel.getReferenceValuePanel().getMatrix(); - Double coefficient = Double.valueOf(matrixPanel.getCoefficientField().getText()) / 100; - action.addContinuousMatrixFactor(name, comment, path, - referenceValue, coefficient, exist); - } - else { - MatrixND minBound = matrixPanel.getMinValuePanel().getMatrix(); - MatrixND maxBound = matrixPanel.getMaxValuePanel().getMatrix(); - action.addContinuousMatrixFactor(name, comment, path, - minBound, maxBound, exist); - } - - } else if (panel instanceof EquationContinuousPanelUI) { - try { - EquationContinuousPanelUI equationPanel = (EquationContinuousPanelUI) panel; - - TopiaEntityContextable bean = equationPanel.getBean(); - TopiaContext topiaContext = bean.getTopiaContext(); - - String property = equationPanel.getBeanProperty(); - property = StringUtils.capitalize(property) + "Content"; - Method m = bean.getClass().getMethod("set" + property, String.class); - m.invoke(bean, equationPanel.getEditor().getEditor().getText()); - - // Save equation - bean.update(); - topiaContext.commitTransaction(); - - List<EquationContinuousDomain> domains = equationPanel.getDomains(); - for (EquationContinuousDomain domain : domains) { - action.addContinuousEquationFactor(name, comment, path, domain, exist); - } - } catch (Exception ex) { - if (log.isErrorEnabled()) { - log.error("Can't call method : ", ex); - } - } - } else if (panel instanceof DefaultContinuousPanelUI) { - DefaultContinuousPanelUI defaultPanel = (DefaultContinuousPanelUI) panel; - - if (defaultPanel.isPercentageTypeFactor()) { - Double referenceValue = Double.valueOf(defaultPanel.getReferenceValueField().getText()); - Double coefficient = Double.valueOf(defaultPanel.getCoefficientField().getText()) / 100; - action.addContinuousPercentageFactor(name, comment, path, - referenceValue, coefficient, exist); - } - else { - double minBound = Double.parseDouble(defaultPanel.getContinueMin().getText()); - double maxBound = Double.parseDouble(defaultPanel.getContinueMax().getText()); - action.addContinuousFactor(name, comment, path, - minBound, maxBound, exist); - } - } - } - - /** - * Save a discret factor. - * - * @param name - * @param comment - * @param path - * @param components - * @param action - * @param exist - */ - protected void saveDiscret(String name, - String comment, String path, List<JComponent> components, - SimulAction action, boolean exist) { - List<Object> values = new ArrayList<Object>(); - - boolean ruleFactor = false; - boolean equationFactor = false; - for (JComponent component : components) { - - // get internat component value - Object result = null; - if (component instanceof JTextComponent) { - result = ((JTextComponent) component).getText(); - } else if (component instanceof MatrixPanelEditor) { - result = ((MatrixPanelEditor) component).getMatrix(); - } else if (component instanceof InputOneEquationUI) { - result = ((InputOneEquationUI) component).getEditor().getText(); - equationFactor = true; - } else if (component instanceof RuleChooser) { - result = ((RuleChooser)component).getRulesList(); - ruleFactor = true; - } else if (component instanceof StepComponent) { - result = new TimeStep(((StepComponent)component).getSelectedValue()); - } else if (component instanceof MonthComponent) { - result = new Month(((MonthComponent)component).getSelectedValue()); - } else if (component instanceof JComboBox) { - // on suppose qu'il y a dedans des TopiaEntity - result = ((JComboBox)component).getSelectedItem(); - } - - values.add(result); - } - - if (ruleFactor) { - action.addDiscreteRuleFactor(name, comment, path, values, exist); - } else if (equationFactor) { - action.addDiscreteEquationFactor(name, comment, path, values, exist); - } else { - action.addDiscreteFactor(name, comment, path, values, exist); - } - } - - /** * Return value in swing component that could be next used into factor * for discrete factor values. * @@ -1250,15 +355,4 @@ return result; } - - /** - * Remove current factor. - * - * @param factorWizardUI factorWizardUI - */ - public void remove(FactorWizardUI factorWizardUI) { - factorWizardUI.getSimulAction().removeFactor(factorWizardUI.getFactorPath()); - factorWizardUI.getContextValue(SimulationUI.class, "SimulationUI").refreshFactorTree(); - factorWizardUI.dispose(); - } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySaveVerifier.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySaveVerifier.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySaveVerifier.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -3,7 +3,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2011 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2011 - 2012 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 @@ -50,5 +50,4 @@ return JOptionPane.YES_OPTION; } - } Deleted: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtils.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtils.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtils.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,101 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin - * %% - * 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.ui.sensitivity; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Utility class to parse Sensitivity properties file. - * - * @author letellier - * @version $Revision$ - * - * Last update: $Date$ - * by : $Author$ - */ -public class SensitivityUtils { - - /** Log. */ - private static final Log log = LogFactory.getLog(SensitivityUtils.class); - - /** Properties file resource path. */ - protected final static String PROPERTIES_PATH = "/sensitivity.properties"; - - /** Cached properties. */ - protected static Properties sensitivityProperties; - - /** - * Is field sensitivity enabled. - * - * Return true, if field name is present in properties file. - * - * @param sensitivityFactorName name - * @return <tt>true</tt> if factor name is sensitivity enabled - */ - public static boolean isSensitivityFactorEnabled(String sensitivityFactorName) { - Properties data = getProperties(); - return data.getProperty(sensitivityFactorName) != null; - - } - - /** - * Return cached properties file. - * Load it at first call. - * - * @return properties - */ - public static Properties getProperties() { - - if (sensitivityProperties == null) { - sensitivityProperties = new Properties(); - InputStream stream = null; - try { - stream = SensitivityUtils.class.getResourceAsStream(PROPERTIES_PATH); - sensitivityProperties.load(stream); - } catch (IOException ex) { - if (log.isErrorEnabled()) { - log.error("Can't load sensitivity properties file", ex); - } - } finally { - try { - if (stream != null) { - stream.close(); - } - } catch (IOException ex) { - if (log.isErrorEnabled()) { - log.error("Can't load sensitivity properties file", ex); - } - } - } - } - return sensitivityProperties; - } -} Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/TableBlockingLayerUI.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/TableBlockingLayerUI.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/TableBlockingLayerUI.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -38,9 +38,9 @@ import org.jdesktop.jxlayer.JXLayer; import org.jdesktop.jxlayer.plaf.AbstractLayerUI; import org.jdesktop.jxlayer.plaf.LayerUI; -import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityContextable; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils; import fr.ifremer.isisfish.ui.input.InputContentUI; /** Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/model/FactorTreeCellRenderer.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/model/FactorTreeCellRenderer.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/model/FactorTreeCellRenderer.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -42,8 +42,6 @@ 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.EquationContinuousDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; /** * Factor tree cell renderer. @@ -65,8 +63,6 @@ public FactorTreeCellRenderer() { iconCache = new HashMap<String, Icon>(); iconCache.put("c", Resource.getIcon("/icons/factors/c.png")); // continuous - //iconCache.put("ce", Resource.getIcon("/icons/factors/ce.png")); // continuous equation - //iconCache.put("cm", Resource.getIcon("/icons/factors/cm.png")); // continuous matrix iconCache.put("d", Resource.getIcon("/icons/factors/d.png")); // discrete iconCache.put("dg", Resource.getIcon("/icons/factors/dgroup.png")); // group discrete iconCache.put("cg", Resource.getIcon("/icons/factors/cgroup.png")); // group continuous @@ -112,14 +108,7 @@ else { icon = "d"; } - - // get factor data type - /*if (domain instanceof EquationContinuousDomain) { - icon += "e"; - } - else if (domain instanceof MatrixContinuousDomain) { - icon += "m"; - }*/ + text = factor.getName(); } } Added: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java (rev 0) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -0,0 +1,329 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 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.ui.sensitivity.wizard; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.text.JTextComponent; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixND; +import org.nuiton.math.matrix.gui.MatrixPanelEditor; + +import fr.ifremer.isisfish.simulator.sensitivity.Distribution; +import fr.ifremer.isisfish.simulator.sensitivity.Distribution.DistributionParam; +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; + +/** + * Panel dynamique qui se construit suivant la distribution sélectionnée. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class ContinuousDistributionPanel extends ContinuousPanel implements ItemListener { + + /** Class logger. */ + private static Log log = LogFactory.getLog(ContinuousDistributionPanel.class); + + /** serialVersionUID. */ + private static final long serialVersionUID = 2289588676194644582L; + + /** Distribution combo. */ + protected JComboBox distributionCombo; + + /** Panel that contains dynamics components. */ + protected JPanel dynamicPanel; + + /** Original value used to auto fill some components. */ + protected Object originalValue; + + /** UI components used to fill distribution params value. */ + protected List<JComponent> paramComponents = new ArrayList<JComponent>(); + + public ContinuousDistributionPanel(Object originalValue) { + + setLayout(new GridBagLayout()); + + // combobox + distributionCombo = new JComboBox(Distribution.values()); + // important : for setSelectedItem to fire event + distributionCombo.setSelectedItem(null); + distributionCombo.addItemListener(this); + add(distributionCombo, new GridBagConstraints(0, 0, 1, 1, 0, 0, + GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, + new Insets(0, 0, 0, 0), 0, 0)); + + // sub dynamic panel containing stuff + dynamicPanel = new JPanel(new GridBagLayout()); + add(dynamicPanel, new GridBagConstraints(0, 1, 1, 1, 1, 1, + GridBagConstraints.CENTER, GridBagConstraints.BOTH, + new Insets(5, 0, 0, 0), 0, 0)); + + this.originalValue = originalValue; + } + + /** + * @param domain + */ + @Override + public void initWithDomain(ContinuousDomain domain) { + // this fire components list modification + Distribution distrib = domain.getDistribution(); + + // can be null in creation state + if (distrib == null) { + return; + } + + distributionCombo.setSelectedItem(distrib); + + DistributionParam[] params = distrib.getDistibutionParams(); + int paramComponentIndex = 0; + for (DistributionParam param : params) { + Object value = domain.getDistributionParameters().get(param.getName()); + if (value != null) { + JComponent comp = paramComponents.get(paramComponentIndex); + + if (comp instanceof MatrixPanelEditor) { + ((MatrixPanelEditor)comp).setMatrix((MatrixND)value); + } else { + ((JTextComponent)comp).setText(value.toString()); + } + } else { + if (log.isWarnEnabled()) { + log.warn("Param " + param.getName() + " not found during init"); + } + } + + paramComponentIndex++; + } + } + + /* + * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent) + */ + @Override + public void itemStateChanged(ItemEvent e) { + + if (e.getStateChange() != ItemEvent.SELECTED) { + return; + } + + Distribution distrib = (Distribution)e.getItem(); + + if (log.isDebugEnabled()) { + log.debug("Refreshing component for distribution : " + distrib); + } + + dynamicPanel.removeAll(); + paramComponents.clear(); + + // location is good (after removeAll) + if (distrib == null) { + return; + } + + // pas de gros composant = liste de composants + // un seul, on gros et une liste mixé + // plusieurs gros, ui par onglet + int numberOfBigComponents = getNumberOfBigComponents(distrib); + + // rendu en liste / liste mixée + JTabbedPane tabbedPane = null; + if (numberOfBigComponents >= 2) { + tabbedPane = new JTabbedPane(); + dynamicPanel.add(tabbedPane, new GridBagConstraints(0, 0, 1, 1, 1, 1, + GridBagConstraints.CENTER, GridBagConstraints.BOTH, + new Insets(0, 0, 0, 0), 0, 0)); + } + + int index = 0; + DistributionParam[] params = distrib.getDistibutionParams(); + for (DistributionParam param : params) { + JLabel paramLabel = new JLabel(param.getName() + " :"); + paramLabel.setToolTipText(param.getDescription()); + + JComponent paramField = getParamField(param); + paramField.setToolTipText(param.getDescription()); + + // rendu en onglet + if (numberOfBigComponents >= 2) { + tabbedPane.add(param.getName(), paramField); + } + // rendu mixé + else if (isParamBigComponent(param)) { + dynamicPanel.add(paramLabel, new GridBagConstraints(0, index, 2, 1, 0, 0, + GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, + new Insets(0, 0, 0, 0), 0, 0)); + index++; + + dynamicPanel.add(paramField, new GridBagConstraints(0, index, 2, 1, 1, 1, + GridBagConstraints.NORTH, GridBagConstraints.BOTH, + new Insets(0, 0, 0, 0), 0, 0)); + index++; + // rendu simple + } else { + dynamicPanel.add(paramLabel, new GridBagConstraints(0, index, 1, 1, 0, 0, + GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, + new Insets(0, 0, 0, 0), 0, 0)); + + dynamicPanel.add(paramField, new GridBagConstraints(1, index, 1, 1, 1, 0, + GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, + new Insets(0, 0, 0, 0), 0, 0)); + index++; + } + + paramComponents.add(paramField); + } + + repaint(); + validate(); + } + + /** + * Return new component used to edit parameter. + * + * If {@link DistributionParam#isOriginalValue()} return true, then component + * is rendered according to original value. + * + * @param param param to render + * @return component + */ + protected JComponent getParamField(DistributionParam param) { + + JComponent result; + + if (param.isOriginalValue()) { + if (originalValue instanceof MatrixND) { + result = new MatrixPanelEditor(); + ((MatrixPanelEditor)result).setMatrix((MatrixND)originalValue); + } else { + result = new JTextField(originalValue.toString()); + } + } else { + result = new JTextField(); + } + + return result; + } + + /** + * Return the number of big components necessary to edit + * selected distribution. + * + * @return number of big components + */ + protected int getNumberOfBigComponents(Distribution distrib) { + + int result = 0; + + DistributionParam[] params = distrib.getDistibutionParams(); + for (DistributionParam param : params) { + if (isParamBigComponent(param)) { + result++; + } + } + + return result; + } + + /** + * Param will be rendered as big ui component only a param + * allows it and current value is big rendering (matrix?). + * + * @param param param to test (with current value) + * @return + */ + protected boolean isParamBigComponent(DistributionParam param) { + return param.isOriginalValue() && originalValue instanceof MatrixND; + } + + /* + * @see fr.ifremer.isisfish.ui.sensitivity.wizard.ContinuousPanelContainerUI#isFactorValid() + */ + @Override + public boolean isFactorValid() { + return true; + } + + /** + * Return distribution selected in combo box. + * + * @return selected distribution + */ + public Distribution getDistribution() { + return (Distribution)distributionCombo.getSelectedItem(); + } + + /** + * Generate domain filled with distribution and distribution parameters. + * + * @return filled domain + */ + public ContinuousDomain generateDomain() { + Distribution distrib = (Distribution)distributionCombo.getSelectedItem(); + ContinuousDomain domain = new ContinuousDomain(distrib); + + DistributionParam[] params = distrib.getDistibutionParams(); + int paramComponentIndex = 0; + for (DistributionParam param : params) { + JComponent comp = paramComponents.get(paramComponentIndex); + + if (comp instanceof MatrixPanelEditor) { + domain.addDistributionParam(param.getName(), ((MatrixPanelEditor)comp).getMatrix()); + } else { + domain.addDistributionParam(param.getName(), ((JTextComponent)comp).getText().trim()); + } + + paramComponentIndex++; + } + return domain; + } + + @Override + public void setEnabled(boolean enabled) { + if (!enabled) { + distributionCombo.setSelectedItem(null); + } + distributionCombo.setEnabled(enabled); + } +} Property changes on: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousPanel.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousPanel.java (rev 0) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousPanel.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -0,0 +1,71 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 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.ui.sensitivity.wizard; + +import javax.swing.JPanel; + +import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; + +/** + * Common code for all continuous panels: + * <ul> + * <li>{@link EquationContinuousPanelUI}</li> + * <li>{@link ContinuousDistributionPanel}</li> + * <ul> + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public abstract class ContinuousPanel extends JPanel { + + /** serialVersionUID. */ + private static final long serialVersionUID = -7759972555434206618L; + + protected boolean continuePossible; + + /** + * Return true only if UI component are all filled and value are correct + * to define new factor. + * + * @return {@code true} if factor is valid + */ + public abstract boolean isFactorValid(); + + public boolean isContinuePossible() { + return continuePossible; + } + + public void setContinuePossible(boolean continuePossible) { + boolean oldValue = this.continuePossible; + this.continuePossible = continuePossible; + firePropertyChange("continuePossible", oldValue, continuePossible); + } + + public abstract void initWithDomain(ContinuousDomain domain); +} Property changes on: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousPanel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/EquationContinuousPanelUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/EquationContinuousPanelUI.jaxx (rev 0) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/EquationContinuousPanelUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -0,0 +1,212 @@ +<!-- + #%L + IsisFish + + $Id$ + $HeadURL$ + %% + Copyright (C) 2009 - 2012 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% + --> +<ContinuousPanel layout="{new BorderLayout()}"> + + <import> + java.awt.CardLayout + java.awt.Component + java.awt.Dimension + java.beans.PropertyChangeEvent + java.beans.PropertyChangeListener + java.util.ArrayList + java.util.EventObject + java.util.List + java.util.regex.Matcher + java.util.regex.Pattern + javax.swing.table.AbstractTableModel + javax.swing.table.DefaultTableModel + javax.swing.table.TableCellEditor + javax.swing.table.TableModel + javax.swing.JComboBox + javax.swing.DefaultCellEditor + javax.swing.event.CellEditorListener + fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain + fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain + org.apache.commons.lang3.StringUtils + </import> + + <String id='text' javaBean='null'/> + <org.nuiton.topia.persistence.TopiaEntityContextable id='bean' javaBean='null'/> + <String id='beanProperty' javaBean='null'/> + <!-- For editor doc purpose --> + <Class id='clazz' javaBean='null'/> + <String id='formuleCategory' javaBean='null'/> + <fr.ifremer.isisfish.entities.Equation id='selectedEquation' javaBean='null'/> + <!-- bean property --> + <fr.ifremer.isisfish.entities.Formule id='formule' javaBean='null'/> + + <Boolean id="selectedDomain" javaBean="false" /> + + <java.util.List id="domains" genericType="EquationContinuousDomain" initializer="new ArrayList<EquationContinuousDomain>()" /> + + <script><![CDATA[ + +@Override +public void initWithDomain(ContinuousDomain domain) { + addDomain((EquationContinuousDomain)domain); +} + +protected void addDomain(EquationContinuousDomain domain) { + domains.add(domain); + // fire data change + variablesListModel.setDomains(domains); +} + +/** + * Valid selected domain. + */ +protected void validSelectedDomain() { + // fill selected + EquationContinuousDomain selectedDomain = (EquationContinuousDomain)variablesList.getSelectedValue(); + selectedDomain.setVariableName(variableNameField.getText().trim()); + + + // parse equation content to replace + // double xxx = 4.0; + // by + // double xxx = context.getValueAndCompute("myfactorname.xxx", 4.0) + // if xxx is the variable name to replace + String variableName = selectedDomain.getVariableName(); + String[] lines = editor.getEditor().getText().split("\n"); + String result = ""; + for (String line : lines) { + Pattern p = Pattern.compile("(^.*\\s+" + variableName + "\\s*\\=\\s*)([\\d\\.]+).*\\;$"); + Matcher matcher = p.matcher(line); + if (matcher.find()) { + String fullVariableName = bean.toString() + "." + StringUtils.uncapitalize(beanProperty) + "." + variableName; + line = matcher.group(1) + "context.getValueAndCompute(\"" + fullVariableName + "\", " + matcher.group(2) + ");"; + } + result += line + "\n"; + } + editor.getEditor().setText(result); + + // fire data change + variablesListModel.setDomains(domains); +} + +protected void addNewVariable() { + EquationContinuousDomain domain = new EquationContinuousDomain(); + domain.setVariableName("X"); + addDomain(domain); + + // auto select + variablesList.setSelectedValue(domain, true); +} + +protected void displaySelectedDomain() { + EquationContinuousDomain selectedDomain = (EquationContinuousDomain)variablesList.getSelectedValue(); + variableNameField.setText(selectedDomain.getVariableName()); + distributionPanel.initWithDomain(selectedDomain); +} + +protected void removeSelectedVariable() { + int selectedIndex = variablesList.getSelectedIndex(); + domains.remove(selectedIndex); + + // fire data change + variablesList.clearSelection(); + variablesListModel.setDomains(domains); +} + +@Override +public boolean isFactorValid() { + boolean valid = true; + + for (EquationContinuousDomain domain : domains) { + if (StringUtils.isBlank(domain.getVariableName())) { + valid = false; + } + } + + return valid; +} + ]]></script> + <JScrollPane constraints='BorderLayout.CENTER'> + <Table> + <row> + <cell fill='both' weightx='1' weighty='1'> + <JScrollPane> + <fr.ifremer.isisfish.ui.sensitivity.equation.EquationDomainListModel + id="variablesListModel" constructorParams="domains" /> + <JList id="variablesList" model="{variablesListModel}" + cellRenderer="{new fr.ifremer.isisfish.ui.sensitivity.equation.EquationDomainRenderer()}"/> + <ListSelectionModel initializer="variablesList.getSelectionModel()" + onValueChanged="displaySelectedDomain();setSelectedDomain(variablesList.getSelectedIndex() != -1)" /> + </JScrollPane> + </cell> + <cell fill='both' weightx='1' weighty='1'> + <Table> + <row> + <cell fill="horizontal" columns="2"> + <Table> + <row> + <cell> + <JLabel text="isisfish.sensitivity.equation.variablename" enabled='{isSelectedDomain()}' /> + </cell> + <cell fill="horizontal" weightx='1'> + <JTextField id="variableNameField" enabled='{isSelectedDomain()}'/> + </cell> + </row> + </Table> + </cell> + </row> + <row> + <cell fill="both" weighty='1' columns="2" weightx='1'> + <ContinuousDistributionPanel id="distributionPanel" enabled='{isSelectedDomain()}' + constructorParams="0.0d"/> + </cell> + </row> + <row> + <cell fill="horizontal" columns="2"> + <JButton text="isisfish.sensitivity.equation.valid" + enabled='{isSelectedDomain()}' + onActionPerformed='validSelectedDomain()' /> + </cell> + </row> + </Table> + </cell> + </row> + <row> + <cell fill='horizontal'> + <JButton id='add' text='isisfish.common.add' + onActionPerformed='addNewVariable()'/> + </cell> + <cell fill='horizontal'> + <JButton id='remove' text='isisfish.common.remove' + enabled='{isSelectedDomain()}' onActionPerformed='removeSelectedVariable()'/> + </cell> + </row> + <row> + <cell fill='both' columns='2' weightx='1' weighty='1'> + <fr.ifremer.isisfish.ui.input.InputOneEquationUI id='editor' constructorParams='this' + autoSaveModification="false" formule='{getFormule()}' text='{getText()}' + bean='{getBean()}' clazz='{getClazz()}' beanProperty='{getBeanProperty()}' + formuleCategory='{getFormuleCategory()}' selectedEquation='{getSelectedEquation()}' + active="true" /> + </cell> + </row> + </Table> + </JScrollPane> +</ContinuousPanel> Added: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/FactorWizardUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/FactorWizardUI.jaxx (rev 0) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/FactorWizardUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -0,0 +1,147 @@ +<!-- + #%L + IsisFish + + $Id$ + $HeadURL$ + %% + Copyright (C) 2009 - 2012 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% + --> +<JDialog title='isisfish.sensitivity.title' modal='{true}' layout='{new BorderLayout()}'> + + <import> + java.beans.PropertyChangeEvent + java.beans.PropertyChangeListener + javax.swing.JComponent + java.awt.CardLayout + </import> + + <SensitivityWizardHandler id="handler" /> + + <Boolean id='continuePossible' javaBean='false'/> + + <Boolean id='continueSelected' javaBean='false'/> + + <Boolean id='editingState' javaBean='false'/> + + <String id="factorPath" javaBean="null"/> + + <script><![CDATA[ +protected void $afterCompleteSetup() { + addPropertyChangeListener(PROPERTY_CONTINUE_SELECTED, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if ((Boolean)evt.getNewValue()) { + ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "continuousPanelContainer"); + } else { + ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "discretePanelContainer"); + } + } + }); +} + + ]]></script> + <Table constraints='BorderLayout.CENTER'> + <row> + <cell columns='4' fill='horizontal'> + <Table> + <row> + <cell fill='horizontal'> + <JLabel text='isisfish.sensitivity.name'/> + </cell> + <cell weightx='1' fill='horizontal'> + <JTextField id='factorNameField'/> + </cell> + </row> + </Table> + </cell> + </row> + <row> + <cell fill='horizontal' weightx='1' columns='2'> + <JRadioButton id='discret' text='isisfish.sensitivity.discret' + selected='{true}' buttonGroup='factorType' + onActionPerformed='setContinueSelected(continueRadio.isSelected())'/> + </cell> + <cell fill='horizontal' weightx='1' columns='2'> + <JRadioButton id='continueRadio' text='isisfish.sensitivity.continue' + buttonGroup='factorType' selected='{false}' visible='{isContinuePossible()}' + onActionPerformed='setContinueSelected(continueRadio.isSelected())'/> + </cell> + </row> + <row> + <cell columns='4' fill='both' weightx='1' weighty='3'> + <JPanel layout="{new CardLayout()}" id="hidablePanel"> + + <!-- discrete --> + <Table id='discretePanelContainer' border='{BorderFactory.createTitledBorder("")}' + constraints='"discretePanelContainer"'> + <row> + <cell fill='horizontal'> + <JLabel text='isisfish.sensitivity.selectDiscretNumber'/> + </cell> + <cell fill='horizontal' weightx='1'> + <JTextField id='discretNumber'/> + </cell> + <cell fill='horizontal'> + <JButton text='isisfish.sensitivity.validDiscretNumber' + onActionPerformed='getHandler().addTabs(this)'/> + </cell> + </row> + <row> + <cell columns='3' fill='both' weightx='1' weighty='2' anchor="north"> + <JTabbedPane id='tabPane' /> + </cell> + </row> + </Table> + + <!-- continous --> + <JPanel id='continuousPanelContainer' layout='{new BorderLayout()}' + border='{BorderFactory.createTitledBorder("")}' + constraints='"continuousPanelContainer"'> + + </JPanel> + </JPanel> + </cell> + </row> + <row> + <cell columns='4' fill='horizontal'> + <JLabel text='isisfish.sensitivity.comment'/> + </cell> + </row> + <row> + <cell columns='4' fill='both' weighty='1'> + <JScrollPane> + <JTextArea id='comment'/> + </JScrollPane> + </cell> + </row> + <row> + <cell fill='horizontal'> + <JButton id='cancel' text='isisfish.common.cancel' onActionPerformed='dispose()'/> + </cell> + <cell fill='horizontal' columns='2'> + <JButton id='remove' text='isisfish.common.remove' visible='{isEditingState()}' + onActionPerformed='getHandler().remove(this)'/> + </cell> + <cell fill='horizontal'> + <JButton id='save' text='isisfish.common.save' enabled='{!getFactorNameField().getText().isEmpty()}' + onActionPerformed='getHandler().save(this)'/> + </cell> + </row> + </Table> +</JDialog> \ No newline at end of file Added: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/MatrixContinuousPanelUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/MatrixContinuousPanelUI.jaxx (rev 0) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/MatrixContinuousPanelUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -0,0 +1,154 @@ +<!-- + #%L + IsisFish + + $Id$ + $HeadURL$ + %% + Copyright (C) 2009 - 2012 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% + --> +<ContinuousPanel> + + <Boolean id="percentageTypeFactor" javaBean="true" /> + + <import> + org.apache.commons.lang3.StringUtils + org.nuiton.math.matrix.gui.MatrixPanelEditor + org.nuiton.math.matrix.MatrixND + java.awt.CardLayout + java.beans.PropertyChangeEvent + java.beans.PropertyChangeListener + fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain + </import> + + <script><![CDATA[ +public void init(MatrixND min, MatrixND max, MatrixND referenceValue, String coefficient) { + minValuePanel.setMatrix(min); + maxValuePanel.setMatrix(max); + referenceValuePanel.setMatrix(referenceValue); + coefficientField.setText(coefficient); +} + +public void initExisting(MatrixND min, MatrixND max, MatrixND referenceValue, String coefficient) { + init(min, max, referenceValue, coefficient); + setPercentageTypeFactor(StringUtils.isNotBlank(coefficient)); +} + +@Override +public boolean isFactorValid() { + boolean valid = false; + + /*try { + if (continueSelected) { + if (percentageTypeFactor) { + Double coefficient = Double.parseDouble(coefficientField.getText().trim()); + valid = coefficient != null; + } + else { + valid = true; + } + } + else { + valid = true; + } + } + catch (NumberFormatException eee) { + if (log.isWarnEnabled()) { + log.warn("Double parse error", eee); + } + }*/ + + return valid; +} + +protected void $afterCompleteSetup() { + addPropertyChangeListener(PROPERTY_PERCENTAGE_TYPE_FACTOR, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if ((Boolean)evt.getNewValue()) { + ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "percentageType"); + } else { + ((CardLayout) hidablePanel.getLayout()).show(hidablePanel, "minMaxType"); + } + } + }); +} + +@Override +public void initWithDomain(ContinuousDomain domain) { + +} + ]]></script> + <JPanel id="content"> + <Table constraints='BorderLayout.CENTER'> + <row> + <cell fill='horizontal' weightx='1'> + <JRadioButton text="isisfish.sensitivity.continuouspercentagetype" + onActionPerformed="setPercentageTypeFactor(true)" + selected="{isPercentageTypeFactor()}"/> + </cell> + <cell fill='horizontal' weightx='1'> + <JRadioButton text="isisfish.sensitivity.continuousminmaxtype" + onActionPerformed="setPercentageTypeFactor(false)" + selected="{!isPercentageTypeFactor()}"/> + </cell> + </row> + <row> + <cell fill='both' weightx='1' weighty='1' columns="2"> + <JPanel layout="{new CardLayout()}" id="hidablePanel"> + <Table constraints='"percentageType"' border='{BorderFactory.createTitledBorder("")}'> + <row> + <cell fill='horizontal' columns="2"> + <JLabel text='isisfish.sensitivity.referencevalue'/> + </cell> + </row> + <row> + <cell fill='both' weighty='1' columns="2"> + <MatrixPanelEditor id='referenceValuePanel'/> + </cell> + </row> + <row> + <cell fill='horizontal'> + <JLabel text='isisfish.sensitivity.coefficient'/> + </cell> + <cell fill='horizontal' weightx='1'> + <JTextField id='coefficientField'/> + </cell> + </row> + </Table> + + <Table constraints='"minMaxType"' border='{BorderFactory.createTitledBorder("")}'> + <row> + <cell fill='both' weightx='1' weighty='1'> + <JTabbedPane> + <tab title="isisfish.sensitivity.firstValue"> + <MatrixPanelEditor id='minValuePanel'/> + </tab> + <tab title="isisfish.sensitivity.lastValue"> + <MatrixPanelEditor id='maxValuePanel'/> + </tab> + </JTabbedPane> + </cell> + </row> + </Table> + </JPanel> + </cell> + </row> + </Table> + </JPanel> +</ContinuousPanel> \ No newline at end of file Added: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java (rev 0) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -0,0 +1,876 @@ +/* + * #%L + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 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.ui.sensitivity.wizard; + +import static org.nuiton.i18n.I18n._; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.ArrayList; +import java.util.List; +import java.util.SortedMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.text.JTextComponent; + +import jaxx.runtime.context.JAXXInitialContext; + +import org.apache.commons.beanutils.PropertyUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixND; +import org.nuiton.math.matrix.gui.MatrixPanelEditor; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaEntityContextable; + +import fr.ifremer.isisfish.IsisFishDAOHelper; +import fr.ifremer.isisfish.IsisFishRuntimeException; +import fr.ifremer.isisfish.datastore.RegionStorage; +import fr.ifremer.isisfish.datastore.RuleStorage; +import fr.ifremer.isisfish.entities.Equation; +import fr.ifremer.isisfish.entities.Population; +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.SensitivityUtils; +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.EquationDiscreteDomain; +import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; +import fr.ifremer.isisfish.types.Month; +import fr.ifremer.isisfish.types.RangeOfValues; +import fr.ifremer.isisfish.types.TimeStep; +import fr.ifremer.isisfish.types.TimeUnit; +import fr.ifremer.isisfish.ui.SimulationUI; +import fr.ifremer.isisfish.ui.input.InputAction; +import fr.ifremer.isisfish.ui.input.InputOneEquationUI; +import fr.ifremer.isisfish.ui.simulator.RuleChooser; +import fr.ifremer.isisfish.ui.simulator.SimulAction; +import fr.ifremer.isisfish.ui.widget.editor.MonthComponent; +import fr.ifremer.isisfish.ui.widget.editor.StepComponent; +import freemarker.template.utility.StringUtil; + +/** + * Handler for all class in wizard packages. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class SensitivityWizardHandler { + + /** Class logger. */ + private static Log log = LogFactory.getLog(SensitivityWizardHandler.class); + + /** + * Return opened topia context that need to be closed. + * + * There is several things in ugly jaxx context: + * <ul> + * <li>opened TopiaContext from SensitivityTabUI that is null in ParamUI + * <li>RegionStorage on SimulAction + * </ul> + * + * Use region storage here. + * + * @return opened topia context + * @throws TopiaException + */ + protected TopiaContext getTopiaContext(FactorWizardUI factorWizardUI) throws TopiaException { + // RegionStorage object is common to ParamsUI + // and SensitivityTabUI and may be valued + RegionStorage regionStorage = factorWizardUI.getContextValue(RegionStorage.class); + TopiaContext context = regionStorage.getStorage().beginTransaction(); + return context; + } + + /** + * Initialize un nouveau wizard avec lorsque l'utilisateur clic sur + * un layer sont le sous composant accepte la mise en facteur. + * + * On recupere des info sur le type correspondant à la proprieté a mettre + * en facteur pour savoir le composant d'edition et s'il peut etre continue + * ou pas. + * + * @param factorWizardUI factorWizardUI + * @param bean bean in current ui + * @param property bean property to edit + */ + public void initNewFactor(FactorWizardUI factorWizardUI, TopiaEntityContextable bean, String property) { + + // path is topiaId#property + // ex : fwn#fsd#0.3425345#name + // for JAXX : cOrigine start with upper case + // for commons beanutils : must be lower case + String beanProperty = StringUtils.uncapitalize(property); + String path = bean.getTopiaId() + "#" + beanProperty; + factorWizardUI.setFactorPath(path); + factorWizardUI.getFactorNameField().setText(bean.toString() + "." + beanProperty); + + // get value for pointed path + //TopiaContext topiaContext = factorWizardUI.getContextValue(TopiaContext.class); + //Class<?> classForPath = getPropertyClass(path, topiaContext); + // peut etre pas une bonne idée que ce soit basé sur les valeurs + // au lieu des types (mais pour RangeOfValues, pas evident) + try { + Object valueForPath = PropertyUtils.getProperty(bean, beanProperty); + boolean continuePossible = SensitivityUtils.canBeContinue(valueForPath); + boolean continueSelected = SensitivityUtils.isContinue(valueForPath); + + // init panel + if (continuePossible) { + JComponent comp = getContinuousPanel(valueForPath, bean, property); + factorWizardUI.getContinuousPanelContainer().add(comp, BorderLayout.CENTER); + } + + // after, for binding on continuePossible, continueSelected to work + factorWizardUI.setContinuePossible(continuePossible); + factorWizardUI.setContinueSelected(continueSelected); + factorWizardUI.getContinueRadio().setSelected(continueSelected); + } catch (Exception ex) { + throw new IsisFishRuntimeException("Can't init wizard", ex); + } + } + + /** + * Appelé suite a un double clic sur l'arbre des facteurs pour modifier un + * facteur. + * + * @param factorWizardUI view to init + * @param factor factor factor to edit + */ + public void initExistingFactor(FactorWizardUI factorWizardUI, Factor factor) { + + factorWizardUI.setEditingState(true); + String factorPath = factor.getPath(); + Domain domain = factor.getDomain(); + String factorName = factor.getName(); + factorWizardUI.setFactorPath(factorPath); + factorWizardUI.getComment().setText(factor.getComment()); + + // dans le cas d'un facteur equation + // il faut enlever la varible du nom + // sinon, à la sauvegarde elle sera reajoutée + if (domain instanceof EquationContinuousDomain) { + EquationContinuousDomain equationDomain = (EquationContinuousDomain)domain; + String suffix = equationDomain.getVariableName(); + factorName = StringUtils.removeEnd(factorName, "." + suffix); + // can be called _xxx after char replacement for R + factorName = StringUtils.removeEnd(factorName, "_" + suffix); + } + + if (domain instanceof ContinuousDomain) { + + ContinuousDomain cDomain = (ContinuousDomain) domain; + ContinuousPanel comp = getNewContinuousComponent(factorWizardUI, factor.getPath()); + comp.initWithDomain(cDomain); + factorWizardUI.getContinuousPanelContainer().add(comp, BorderLayout.CENTER); + + factorWizardUI.getContinueRadio().setSelected(true); + factorWizardUI.setContinueSelected(true); + factorWizardUI.setContinuePossible(true); + } else { + + // un facteur pour être edité sans domain + // lors de la creation + if (domain != null) { + // restaure discrete domain + DiscreteDomain dDomain = (DiscreteDomain)domain; + + int nb = dDomain.getValues().size(); + factorWizardUI.getDiscretNumber().setText(String.valueOf(nb)); + factorWizardUI.getTabPane().removeAll(); + + SortedMap<Object, Object> values = dDomain.getValues(); + int i = 0; + for (Object o : values.values()) { + i++; + JComponent c = null; + if (o != null) { + c = getEditorWithValue(factorWizardUI, factor, dDomain, o); + } + else { + if (log.isWarnEnabled()) { + log.warn("Null value in factor"); + } + } + JScrollPane js = new JScrollPane(c); + String tabName = _("isisfish.sensitivity.discretevaluelabel", i); + factorWizardUI.getTabPane().addTab(tabName, js); + } + } + + // init non selected continous panel + JComponent comp = getNewContinuousComponent(factorWizardUI, factor.getPath()); + if (comp != null) { + factorWizardUI.setContinuePossible(true); + factorWizardUI.getContinuousPanelContainer().add(comp, BorderLayout.CENTER); + } + } + + factorWizardUI.getFactorNameField().setText(factorName); + } + + /** + * Renvoie un componsant gaphique initialisé avec la valeur + * qui est enregistré dans le domain. + * Pour réédition d'un facteur existant (facteur discret). + * + * @param factorWizardUI context for context value (RegionStorage) + * @param value type to get editor + * @param factor factor for path value + * @param domain domain for domain type + * @return component ui component with value + */ + protected JComponent getEditorWithValue(FactorWizardUI factorWizardUI, Factor factor, Domain domain, Object value) { + + JComponent result = null; + + if (Double.class.isAssignableFrom(value.getClass())) { + result = new JTextField(); + ((JTextField)result).setText(String.valueOf(value)); + } + else if (double.class.isAssignableFrom(value.getClass())) { + result = new JTextField(); + ((JTextField)result).setText(String.valueOf(value)); + } + else if (MatrixND.class.isAssignableFrom(value.getClass())) { + result = new MatrixPanelEditor(); + ((MatrixPanelEditor)result).setMatrix((MatrixND)value); + } + else if (domain instanceof RuleDiscreteDomain) { + result = new RuleChooser(factorWizardUI); + ((RuleChooser)result).setRulesList((List<Rule>)value); + } + else if (domain instanceof EquationDiscreteDomain) { + String factorPath = factor.getPath(); + if (factor.getPath().indexOf('#') != -1) { + String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); + String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); + + // get bean in database + try { + TopiaContext topiaContext = getTopiaContext(factorWizardUI); + TopiaEntityContextable entity = (TopiaEntityContextable)topiaContext.findByTopiaId(topiaId); + Equation equation = (Equation)PropertyUtils.getProperty(entity, property); + topiaContext.closeContext(); + + // fill component + InputOneEquationUI ui = new InputOneEquationUI(factorWizardUI); + ui.setAutoSaveModification(false); + ui.setFormuleCategory(equation.getCategory()); + ui.setText(_("isisfish.common.equation")); // can't get real name + ui.setClazz(value.getClass()); + ui.setBeanProperty(property); + ui.setBean(entity); // set bean fire content modification event + ui.getEditor().setText((String)value); + ui.setActive(true); + + result = ui; + } catch (Exception ex) { + throw new IsisFishRuntimeException("Can't restore initial factor database property", ex); + } + } + // TODO path with no # (normalement pas possible pour les equations) + } + else if (value instanceof TimeUnit) { + result = new JTextField(); + ((JTextField)result).setText(String.valueOf(((TimeUnit)value).getTime())); + } else if (value instanceof TopiaEntity) { + RegionStorage regionStorage = factorWizardUI.getContextValue(RegionStorage.class); + TopiaContext context = null; + try { + context = regionStorage.getStorage().beginTransaction(); + List list = context.find("from " + value.getClass().getName()); + JComboBox c = new JComboBox(list.toArray()); + c.setSelectedItem(value); + result = c; + } catch (TopiaException ex) { + throw new IsisFishRuntimeException("Can't get entity list", ex); + } finally { + if (context != null) { + try { + context.closeContext(); + } catch (TopiaException ex) { + throw new IsisFishRuntimeException("Can't get entity list", ex); + } + } + } + } else if (value instanceof TimeStep) { + TimeStep timeStep = (TimeStep)value; + result = new StepComponent(timeStep.getMonth().getMonthNumber(), timeStep.getYear()); + } else if (value instanceof Month) { + Month month = (Month)value; + result = MonthComponent.createMounthCombo(month.getMonthNumber()); + } else if (value instanceof String) { + // valeur non typées ??? + result = new JTextField(); + ((JTextField)result).setText(String.valueOf(value)); + } + + if (log.isDebugEnabled()) { + log.debug("Editor for value " + value + " is " + result); + } + + return result; + } + + /** + * Retourne le componant permettant de mettre en facteur continue + * une valeur. + * + * @param value value (must be continuable) + * @param bean bean (in case of equation) + * @param property bean property (in case of equation) + * @return component initialized + */ + protected ContinuousPanel getContinuousPanel(Object value, TopiaEntityContextable bean, String property) { + ContinuousPanel result; + + if (value instanceof RangeOfValues) { + RangeOfValues rangeOfValues = (RangeOfValues)value; + //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); + String values = rangeOfValues.getValues(); + String min = "0"; + String max = "0"; + if (values.matches("^\\ *[0-9]*\\ *\\-\\ *[0-9]*\\ *$")) { + int first = values.indexOf("-"); + if (first != -1) { + min = values.substring(0, first); + max = values.substring(first + 1); + } + } + //ui.init(min, max, min, null); + //result = ui; + result = new ContinuousDistributionPanel(min); + } else if (value instanceof Equation) { + Equation equation = (Equation)value; + EquationContinuousPanelUI ui = new EquationContinuousPanelUI(new JAXXInitialContext().add(new InputAction())); + ui.setSelectedEquation(equation); + ui.setText(_("isisfish.common.equation")); // can't get real name + ui.setFormuleCategory(equation.getCategory()); + ui.setClazz(equation.getClass()); + ui.setBeanProperty(property); + ui.setBean(bean); + result = ui; + } else if (value instanceof MatrixND) { + MatrixND matrix = (MatrixND)value; + //MatrixContinuousPanelUI matrixPanel = new MatrixContinuousPanelUI(); + //matrixPanel.init(matrix.clone(), matrix.clone(), matrix.clone(), null); + //result = matrixPanel; + result = new ContinuousDistributionPanel(matrix.clone()); + } else if (value instanceof TimeUnit) { + TimeUnit timeUnit = (TimeUnit)value; + //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); + //ui.init(String.valueOf(timeUnit.getTime()), String.valueOf(timeUnit.getTime()), + // String.valueOf(timeUnit.getTime()), null); + //result = ui; + result = new ContinuousDistributionPanel(String.valueOf(timeUnit.getTime())); + } else { + //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); + //ui.init(String.valueOf(value), String.valueOf(value), String.valueOf(value), null); + //result = ui; + result = new ContinuousDistributionPanel(String.valueOf(value)); + } + + if (log.isDebugEnabled()) { + log.debug("Component for " + value + " (" + bean + ", " + property + ")"); + log.debug(" > " + result); + } + + return result; + } + + /** + * Rafraichit l'assistant de facteur pour modifier le nombre de valeurs + * (onglet) d'un composant discret. + * + * @param factorWizardUI factorWizardUI + */ + public void addTabs(FactorWizardUI factorWizardUI) { + String discreteNumber = factorWizardUI.getDiscretNumber().getText(); + int nbTab = Integer.parseInt(discreteNumber); + int currentCount = factorWizardUI.getTabPane().getTabCount(); + + // remove useless tab + for (int tab = currentCount - 1; tab > nbTab -1 ; tab--) { + factorWizardUI.getTabPane().remove(tab); + } + + // add new tabs + for (int tab = currentCount ; tab < nbTab ; tab++) { + JComponent c = getNewDiscreteComponent(factorWizardUI); + String tabName = _("isisfish.sensitivity.discretevaluelabel", tab); + factorWizardUI.getTabPane().addTab(tabName, c); + } + + factorWizardUI.pack(); + } + + /** + * Return new discrete component inited with value defined by factor path. + * + * Le composant retourné est inclut dans un jscrollpane (sauf pour les + * matrices qui contient deja un jscrollpane) + * + * @param factorWizardUI factorWizardUI + * @return component copy + */ + protected JComponent getNewDiscreteComponent(FactorWizardUI factorWizardUI) { + + JComponent result = null; + String factorPath = factorWizardUI.getFactorPath(); + + try { + if (factorPath.indexOf('#') != -1) { + String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); + String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); + + // get bean in database + TopiaContext topiaContext = getTopiaContext(factorWizardUI); + TopiaEntityContextable entity = (TopiaEntityContextable)topiaContext.findByTopiaId(topiaId); + Object value = PropertyUtils.getProperty(entity, property); + + // init new jcomponent for value + if (value instanceof Number) { + result = new JTextField(String.valueOf(value)); + } else if (value instanceof MatrixND) { + result = new MatrixPanelEditor(); + MatrixND matrix = ((MatrixND)value).copy(); + ((MatrixPanelEditor)result).setMatrix(matrix); + } else if (value instanceof RangeOfValues) { + RangeOfValues rangeOfValues = (RangeOfValues)value; + result = new JTextField(rangeOfValues.getValues()); + } else if (value instanceof TimeUnit) { + TimeUnit timeUnit = (TimeUnit)value; + result = new JTextField(String.valueOf(timeUnit.getTime())); + } else if (value instanceof Equation) { + Equation equation = (Equation)value; + // fill component + InputOneEquationUI ui = new InputOneEquationUI(factorWizardUI); + ui.setAutoSaveModification(false); + ui.setText(equation.getContent()); + ui.setFormuleCategory(equation.getCategory()); + ui.setText(_("isisfish.common.equation")); // can't get real name + ui.setClazz(value.getClass()); + ui.setBeanProperty(property); + ui.setBean(entity); + ui.setActive(true); + result = ui; + } + + topiaContext.closeContext(); + + } + else { + // dans ce cas c'est des regles, pop de départ ou parametres de regles + // c'est un peu galere car le code n'a rien a voir avec le reste + // donc, c'est du cas par cas + if (factorPath.equals("parameters.rules")) { + result = new RuleChooser(factorWizardUI); + } else if (factorPath.startsWith("parameters.population.")) { + // la seule facon d'avoir les parametres ici est d'aller + // les chercher dans les parametres de simulation + Pattern pattern = Pattern.compile("^parameters\\.population\\.(\\w+)(\\.(.+)?)$"); + Matcher matcher = pattern.matcher(factorPath); + if (matcher.matches()) { + String populationName = matcher.group(1); + if (log.isDebugEnabled()) { + log.debug("Loading population : " + populationName); + } + TopiaContext topiaContext = getTopiaContext(factorWizardUI); + Population pop = IsisFishDAOHelper.getPopulationDAO(topiaContext).findByName(populationName); + SimulAction action = factorWizardUI.getContextValue(SimulAction.class); + MatrixND N = action.getSimulationParameter().getNumberOf(pop); + result = new MatrixPanelEditor(); + ((MatrixPanelEditor)result).setMatrix(N.clone()); + topiaContext.closeContext(); + } + } else if (factorPath.startsWith("parameters.rule.")) { + Pattern pattern = Pattern.compile("^parameters\\.rule\\.(\\d+)\\.parameter\\.(\\w+)(\\..+)?$"); + Matcher matcher = pattern.matcher(factorPath); + if (matcher.matches()) { + int ruleIndex = Integer.parseInt(matcher.group(1)); + SimulAction action = factorWizardUI.getContextValue(SimulAction.class); + Rule rule = action.getSimulationParameter().getRules().get(ruleIndex); + Class valueClazz = RuleStorage.getParameterType(rule, matcher.group(2)); + Object value = RuleStorage.getParameterValue(rule, matcher.group(2)); + result = getTypeDiscreteComponent(factorWizardUI, valueClazz, value); + + } else { + // double... + result = new JTextField("0.0"); + } + } else { + if (log.isWarnEnabled()) { + log.warn("Can't find component for path " + factorPath); + } + } + } + } catch (Exception ex) { + throw new IsisFishRuntimeException("Can't restore intial factor database property", ex); + } + + if (log.isDebugEnabled()) { + log.debug("Component for path " + factorPath + " is " + result); + } + + // hack : si on met 2 fois un jscrollpane, rien ne s'affiche + if (!(result instanceof MatrixPanelEditor)) { + result = new JScrollPane(result); + } + + return result; + } + + /** + * Return new continuous component inited with value defined by factor path. + * + * @param factorWizardUI (to use topia context) + * @param factorPath factor path + * @return component initialized + */ + protected ContinuousPanel getNewContinuousComponent(FactorWizardUI factorWizardUI, String factorPath) { + ContinuousPanel result = null; + + try { + if (factorPath.indexOf('#') != -1) { + String topiaId = factorPath.substring(0, factorPath.lastIndexOf('#')); + String property = factorPath.substring(factorPath.lastIndexOf('#') + 1); + + // get bean in database + TopiaContext topiaContext = getTopiaContext(factorWizardUI); + TopiaEntityContextable entity = (TopiaEntityContextable)topiaContext.findByTopiaId(topiaId); + Object value = PropertyUtils.getProperty(entity, property); + + if (value instanceof RangeOfValues) { + RangeOfValues rangeOfValues = (RangeOfValues)value; + //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); + String values = rangeOfValues.getValues(); + String min = "0"; + String max = "0"; + if (values.matches("^\\ *[0-9]*\\ *\\-\\ *[0-9]*\\ *$")) { + int first = values.indexOf("-"); + if (first != -1) { + min = values.substring(0, first); + max = values.substring(first + 1); + } + } + result = new ContinuousDistributionPanel(min); + } else if (value instanceof Equation) { + Equation equation = (Equation)value; + EquationContinuousPanelUI ui = new EquationContinuousPanelUI(new JAXXInitialContext().add(new InputAction())); + ui.setSelectedEquation(equation); + ui.setText(_("isisfish.common.equation")); // can't get real name + ui.setFormuleCategory(equation.getCategory()); + ui.setClazz(equation.getClass()); + ui.setBeanProperty(property); + ui.setBean(entity); + result = ui; + } else if (value instanceof MatrixND) { + MatrixND matrix = (MatrixND)value; + //MatrixContinuousPanelUI matrixPanel = new MatrixContinuousPanelUI(); + //matrixPanel.init(matrix.clone(), matrix.clone(), matrix.clone(), null); + //result = matrixPanel; + result = new ContinuousDistributionPanel(matrix.clone()); + } else if (value instanceof TimeUnit) { + TimeUnit timeUnit = (TimeUnit)value; + //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); + //ui.init(String.valueOf(timeUnit.getTime()), String.valueOf(timeUnit.getTime()), + // String.valueOf(timeUnit.getTime()), null); + //result = ui; + result = new ContinuousDistributionPanel(String.valueOf(timeUnit.getTime())); + } else { + //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); + //ui.init(String.valueOf(value), String.valueOf(value), String.valueOf(value), null); + //result = ui; + result = new ContinuousDistributionPanel(String.valueOf(value)); + } + + topiaContext.closeContext(); + + } else { + if (factorPath.startsWith("parameters.population.")) { + // la seule facon d'avoir les parametres ici est d'aller + // les chercher dans les parametres de simulation + Pattern pattern = Pattern.compile("^parameters\\.population\\.(\\w+)(\\.(.+)?)$"); + Matcher matcher = pattern.matcher(factorPath); + if (matcher.matches()) { + String populationName = matcher.group(1); + if (log.isDebugEnabled()) { + log.debug("Loading population : " + populationName); + } + TopiaContext topiaContext = getTopiaContext(factorWizardUI); + Population pop = IsisFishDAOHelper.getPopulationDAO(topiaContext).findByName(populationName); + SimulAction action = factorWizardUI.getContextValue(SimulAction.class); + MatrixND N = action.getSimulationParameter().getNumberOf(pop); + result = new ContinuousDistributionPanel(N.clone()); + topiaContext.closeContext(); + } + } else if (factorPath.startsWith("parameters.rule.")) { + Pattern pattern = Pattern.compile("^parameters\\.rule\\.(\\d+)\\.parameter\\.(\\w+)(\\..+)?$"); + Matcher matcher = pattern.matcher(factorPath); + if (matcher.matches()) { + int ruleIndex = Integer.parseInt(matcher.group(1)); + SimulAction action = factorWizardUI.getContextValue(SimulAction.class); + Rule rule = action.getSimulationParameter().getRules().get(ruleIndex); + Class valueClazz = RuleStorage.getParameterType(rule, matcher.group(2)); + Object value = RuleStorage.getParameterValue(rule, matcher.group(2)); + result = getTypeContinousComponent(factorWizardUI, valueClazz, value); + + } else { + // double... + result = getContinuousPanel(0.0, null, null); + } + } else { + if (log.isWarnEnabled()) { + log.warn("Can't find component for path " + factorPath); + } + } + } + } catch (Exception ex) { + throw new IsisFishRuntimeException("Can't init wizard", ex); + } + + return result; + } + + /** + * Get new special component for typed parameters. + * + * @param factorWizardUI + * @param type + * @return rule discrete component + */ + protected JComponent getTypeDiscreteComponent(FactorWizardUI factorWizardUI, Class type, Object value) { + + JComponent result = null; + + if (TopiaEntity.class.isAssignableFrom(type)) { + try { + TopiaContext context = getTopiaContext(factorWizardUI); + List list = context.find("from " + type.getName()); + JComboBox c = new JComboBox(list.toArray()); + result = c; + context.closeContext(); + } catch (TopiaException ex) { + throw new IsisFishRuntimeException("Can't get entity list", ex); + } + } else if (TimeStep.class.isAssignableFrom(type)) { + result = new StepComponent(0, 0); + } else if (Month.class.isAssignableFrom(type)) { + result = MonthComponent.createMounthCombo(0); + } else { + if (value != null) { + result = new JTextField(value.toString()); + } else { + result = new JTextField(); + } + + } + + return result; + } + + /** + * Get new special component for typed parameters. + * + * @param factorWizardUI + * @param type type to get component + * @return rule discrete component + */ + protected ContinuousPanel getTypeContinousComponent(FactorWizardUI factorWizardUI, Class type, Object value) { + + ContinuousPanel result = null; + + if (Double.class.isAssignableFrom(type) || double.class.isAssignableFrom(type)) { + if (value != null) { + result = new ContinuousDistributionPanel(value.toString()); + } else { + result = new ContinuousDistributionPanel(0.0); + } + } + + return result; + } + + /** + * Save current factor. + * + * @param factorWizardUI factorWizardUI + */ + public void save(FactorWizardUI factorWizardUI) { + + // get continuous component if any + ContinuousPanel continuousPanel = null; + if (factorWizardUI.getContinuousPanelContainer().getComponentCount() > 0) { + continuousPanel = (ContinuousPanel)factorWizardUI.getContinuousPanelContainer().getComponent(0); + } + + // first check is factor is valid + boolean factorValid = true; + if (continuousPanel != null) { + factorValid = continuousPanel.isFactorValid(); + } + if (!factorValid) { + JOptionPane.showMessageDialog(factorWizardUI, _("isisfish.sensitivity.factor.notvalid"), + _("isisfish.sensitivity.title"), JOptionPane.ERROR_MESSAGE); + return; + } + + // call specific method depending on continuous/discrete + if (factorWizardUI.getContinueRadio().isSelected()) { + saveContinue(factorWizardUI.getFactorNameField().getText(), + factorWizardUI.getComment().getText(), factorWizardUI.getFactorPath(), continuousPanel, + factorWizardUI.getContextValue(SimulAction.class), factorWizardUI.isEditingState()); + } else { + Component[] discreteComponents = factorWizardUI.getTabPane().getComponents(); + saveDiscret(factorWizardUI.getFactorNameField().getText(), + factorWizardUI.getComment().getText(), factorWizardUI.getFactorPath(), discreteComponents, + factorWizardUI.getContextValue(SimulAction.class), factorWizardUI.isEditingState()); + } + + // refresh factor list + factorWizardUI.getContextValue(SimulationUI.class, "SimulationUI").refreshFactorTree(); + + // close window + factorWizardUI.dispose(); + } + + /** + * Save a continous factor. + * + * @param name factor name + * @param comment comment + * @param path factor path + * @param panel panel + * @param action action + * @param exist exist + */ + protected void saveContinue(String name, + String comment, String path, ContinuousPanel panel, + SimulAction action, boolean exist) { + if (panel instanceof EquationContinuousPanelUI) { + try { + EquationContinuousPanelUI equationPanel = (EquationContinuousPanelUI) panel; + String property = StringUtils.uncapitalize(equationPanel.getBeanProperty()) + "Content"; + TopiaEntityContextable bean = equationPanel.getBean(); + TopiaContext topiaContext = bean.getTopiaContext(); + PropertyUtils.setProperty(bean, property, equationPanel.getEditor().getEditor().getText()); + + // Save equation + bean.update(); + topiaContext.commitTransaction(); + + List<EquationContinuousDomain> domains = equationPanel.getDomains(); + for (EquationContinuousDomain domain : domains) { + action.addContinuousEquationFactor(name, comment, path, domain, exist); + } + } catch (Exception ex) { + if (log.isErrorEnabled()) { + log.error("Can't call method : ", ex); + } + } + } else if (panel instanceof ContinuousDistributionPanel) { + ContinuousDistributionPanel defaultPanel = (ContinuousDistributionPanel) panel; + ContinuousDomain domain = defaultPanel.generateDomain(); + action.addContinuousFactor(name, comment, path, domain, exist); + } + } + + /** + * Save a discret factor. + * + * @param name + * @param comment + * @param path + * @param components + * @param action + * @param exist + */ + protected void saveDiscret(String name, + String comment, String path, Component[] components, + SimulAction action, boolean exist) { + List<Object> values = new ArrayList<Object>(); + + boolean ruleFactor = false; + boolean equationFactor = false; + for (Component component : components) { + + // get internat component value + Object result = null; + if (component instanceof JTextComponent) { + result = ((JTextComponent) component).getText(); + } else if (component instanceof MatrixPanelEditor) { + result = ((MatrixPanelEditor) component).getMatrix(); + } else if (component instanceof InputOneEquationUI) { + result = ((InputOneEquationUI) component).getEditor().getText(); + equationFactor = true; + } else if (component instanceof RuleChooser) { + result = ((RuleChooser)component).getRulesList(); + ruleFactor = true; + } else if (component instanceof StepComponent) { + result = new TimeStep(((StepComponent)component).getSelectedValue()); + } else if (component instanceof MonthComponent) { + result = new Month(((MonthComponent)component).getSelectedValue()); + } else if (component instanceof JComboBox) { + // on suppose qu'il y a dedans des TopiaEntity + result = ((JComboBox)component).getSelectedItem(); + } + + values.add(result); + } + + if (ruleFactor) { + action.addDiscreteRuleFactor(name, comment, path, values, exist); + } else if (equationFactor) { + action.addDiscreteEquationFactor(name, comment, path, values, exist); + } else { + action.addDiscreteFactor(name, comment, path, values, exist); + } + } + + /** + * Remove current factor. + * + * @param factorWizardUI factorWizardUI + */ + public void remove(FactorWizardUI factorWizardUI) { + factorWizardUI.getContextValue(SimulAction.class).removeFactor(factorWizardUI.getFactorPath()); + factorWizardUI.getContextValue(SimulationUI.class, "SimulationUI").refreshFactorTree(); + factorWizardUI.dispose(); + } +} Property changes on: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -29,7 +29,6 @@ <Boolean id='sensitivity' javaBean='false' /> <import> - java.util.EventObject; java.text.ParseException; fr.ifremer.isisfish.datastore.RegionStorage fr.ifremer.isisfish.datastore.StorageChangeEvent @@ -42,32 +41,20 @@ fr.ifremer.isisfish.ui.WelcomePanelUI fr.ifremer.isisfish.ui.WelcomeTabUI fr.ifremer.isisfish.ui.models.common.StringComboModel - fr.ifremer.isisfish.ui.models.rule.RuleComboModel - fr.ifremer.isisfish.ui.models.rule.RuleNamesListRenderer - fr.ifremer.isisfish.ui.models.rule.RuleListModel - fr.ifremer.isisfish.ui.sensitivity.FactorWizardUI fr.ifremer.isisfish.ui.sensitivity.SensitivityUI fr.ifremer.isisfish.ui.widget.FilterableComboBox - fr.ifremer.isisfish.rule.Rule fr.ifremer.isisfish.simulator.launcher.SimulatorLauncher fr.ifremer.isisfish.simulator.launcher.SimulationService fr.ifremer.isisfish.simulator.launcher.SimulationJob fr.ifremer.isisfish.simulator.launcher.SimulationServiceListener - fr.ifremer.isisfish.simulator.sensitivity.Factor org.nuiton.topia.TopiaException org.nuiton.topia.TopiaContext - org.nuiton.math.matrix.MatrixND - org.nuiton.math.matrix.gui.MatrixPanelEditor - org.apache.commons.lang3.ArrayUtils javax.swing.SwingUtilities javax.swing.DefaultComboBoxModel java.awt.CardLayout java.awt.Dimension java.io.IOException - java.awt.BorderLayout - javax.swing.AbstractAction javax.swing.DefaultListModel - javax.swing.JComponent javax.swing.ComboBoxModel </import> <script><![CDATA[ @@ -104,6 +91,10 @@ } SimulationService.getService().addSimulationServiceListener(simulationListener); +// la gestion des regles est maintenant independante de SimulAction +// il faut faire la lié aux parametres de simulations +simulAction.getSimulationParameter().setRules(ruleChooser.getRulesList()); + public void refresh() { if (simulAction.getSimulationStorage() != null) { fieldSimulParamsName.setText(simulAction.getSimulationStorage().getName()); @@ -151,7 +142,8 @@ protected void setSensitivityTabRegion() { if (isSensitivity()) { try { - // FIXME this transation in never closed + // FIXME this transaction in never closed + // and can't be closed because used in TopiaContext tx = simulAction.getRegionStorage().getStorage().beginTransaction(); FisheryRegion fisheryRegion = RegionStorage.getFisheryRegion(tx); getParentContainer(SensitivityUI.class).getSensitivityTabUI().setFisheryRegion(fisheryRegion); @@ -218,11 +210,6 @@ */ protected void launchSimulation() { - // la gestion des regles est maintenant independante de SimulAction - // il faut faire le set qui va bien avant le lancement - simulAction.getSimulationParameter().setRules(ruleChooser.getRulesList()); - - if (!isSensitivity()) { simulAction.launchSimulation(fieldSimulParamsName.getText(), (SimulatorLauncher)comboSelLauncher.getSelectedItem()); } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -39,19 +39,10 @@ java.beans.PropertyChangeEvent java.beans.PropertyChangeListener java.util.List - fr.ifremer.isisfish.IsisFishException - fr.ifremer.isisfish.IsisFishRuntimeException - fr.ifremer.isisfish.datastore.RuleStorage fr.ifremer.isisfish.rule.Rule fr.ifremer.isisfish.ui.models.rule.RuleListModel fr.ifremer.isisfish.ui.models.common.ScriptParametersTableModel - fr.ifremer.isisfish.ui.models.common.ScriptParametersTableCellEditor - fr.ifremer.isisfish.ui.models.common.ScriptParametersTableCellRenderer - fr.ifremer.isisfish.ui.models.rule.RuleParametersFactorTableCellRenderer - fr.ifremer.isisfish.ui.models.rule.RuleParametersFactorTableCellEditor - fr.ifremer.isisfish.ui.util.ErrorHelper fr.ifremer.isisfish.ui.SimulationUI - fr.ifremer.isisfish.datastore.RegionStorage </import> <script><![CDATA[ Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/simulator/SimulAction.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -86,20 +86,21 @@ import fr.ifremer.isisfish.simulator.launcher.SimulationService; import fr.ifremer.isisfish.simulator.launcher.SimulatorLauncher; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Distribution; import fr.ifremer.isisfish.simulator.sensitivity.Factor; import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityAnalysis; import fr.ifremer.isisfish.simulator.sensitivity.SensitivityException; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils; 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.EquationDiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; import fr.ifremer.isisfish.ui.SimulationUI; -import fr.ifremer.isisfish.ui.sensitivity.FactorWizardUI; import fr.ifremer.isisfish.ui.sensitivity.SensitivityChooserUI; -import fr.ifremer.isisfish.ui.sensitivity.SensitivityInputHandler; +import fr.ifremer.isisfish.ui.sensitivity.wizard.FactorWizardUI; +import fr.ifremer.isisfish.ui.sensitivity.wizard.SensitivityWizardHandler; import fr.ifremer.isisfish.ui.util.ErrorHelper; import fr.ifremer.isisfish.ui.widget.editor.ScriptParameterDialog; @@ -121,7 +122,11 @@ private static final SimpleDateFormat DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd-HH-mm"); - /** Les parametres de simulation (commun a tous les onglet de l'interface de simulation). */ + /** + * Les parametres de simulation (commun a tous les onglet de l'interface de simulation). + * Les parametres doivent toujours être liés avec les selections et état de l'ui. + * La mise en facteur des parametres et des regles est basé sur cet objet. + */ protected SimulationParameter param = null; protected RegionStorage regionStorage = null; @@ -900,16 +905,12 @@ * @param name * @param comment * @param path - * @param min - * @param max + * @param domain * @param exist */ - public void addContinuousFactor(String name, String comment, String path, Double min, - Double max, boolean exist) { + public void addContinuousFactor(String name, String comment, String path, + ContinuousDomain domain, boolean exist) { Factor f = new Factor(name); - ContinuousDomain domain = new ContinuousDomain(); - domain.setMinBound(min); - domain.setMaxBound(max); f.setDomain(domain); f.setComment(comment); f.setPath(path); @@ -919,31 +920,6 @@ addFactor(f); } - /** - * Ajout d'un facteur continue de type pourcentage. - * - * @param name - * @param comment - * @param path - * @param referenceValue - * @param coefficient - * @param exist - */ - public void addContinuousPercentageFactor(String name, String comment, String path, Double referenceValue, - Double coefficient, boolean exist) { - Factor f = new Factor(name); - ContinuousDomain domain = new ContinuousDomain(true); - domain.setReferenceValue(referenceValue); - domain.setCoefficient(coefficient); - f.setDomain(domain); - f.setComment(comment); - f.setPath(path); - if (exist) { - removeFactor(path); - } - addFactor(f); - } - public void addDiscreteFactor(String name, String comment, String path, List<Object> values, boolean exist) { addDiscreteFactor(new DiscreteDomain(), name, comment, path, values, exist); @@ -996,36 +972,6 @@ addFactor(f); } - public void addContinuousMatrixFactor(String name, String comment, String path, - MatrixND referenceValue, Double coef, boolean exist) { - Factor f = new Factor(name); - MatrixContinuousDomain domain = new MatrixContinuousDomain(true); - domain.setReferenceValue(referenceValue); - domain.setCoefficient(coef); - f.setComment(comment); - f.setDomain(domain); - f.setPath(path); - if (exist) { - removeFactor(path); - } - addFactor(f); - } - - public void addContinuousMatrixFactor(String name, String comment, String path, - MatrixND minBound, MatrixND maxBound, boolean exist) { - Factor f = new Factor(name); - MatrixContinuousDomain domain = new MatrixContinuousDomain(); - domain.setMinBound(minBound); - domain.setMaxBound(maxBound); - f.setComment(comment); - f.setDomain(domain); - f.setPath(path); - if (exist) { - removeFactor(path); - } - addFactor(f); - } - /* ************ * General @@ -1301,7 +1247,7 @@ if (selectedFactor == null) { selectedFactor = new Factor(_("isisfish.sensitivity.rulesfactorname")); selectedFactor.setPath(factorPath); - selectedFactor.setDomain(new RuleDiscreteDomain()); + //selectedFactor.setDomain(new RuleDiscreteDomain()); } } @@ -1313,17 +1259,20 @@ if (selectedFactor == null) { selectedFactor = new Factor(_("isisfish.sensitivity.populationfactorname", population.getName())); selectedFactor.setPath(factorPath); - MatrixContinuousDomain factorDomain = new MatrixContinuousDomain(); - MatrixND populationEffectives = getSimulationParameter().getNumberOf(population); + //MatrixND populationEffectives = getSimulationParameter().getNumberOf(population); + /*MatrixContinuousDomain factorDomain = new MatrixContinuousDomain(); factorDomain.setReferenceValue(populationEffectives.copy()); factorDomain.setCoefficient(0.0); - selectedFactor.setDomain(factorDomain); + ContinuousDomain domain = new ContinuousDomain(Distribution.QUNIFPC); + domain.addDistributionParam(Distribution.QUNIFPC.getDistibutionParams()[0].getName(), populationEffectives.copy()); + domain.addDistributionParam(Distribution.QUNIFPC.getDistibutionParams()[1].getName(), 0.0d); + selectedFactor.setDomain(domain);*/ } } if (selectedFactor != null) { FactorWizardUI wizard = new FactorWizardUI(paramsUI); - SensitivityInputHandler handler = wizard.getHandler(); + SensitivityWizardHandler handler = wizard.getHandler(); handler.initExistingFactor(wizard, selectedFactor); wizard.pack(); wizard.setLocationRelativeTo(paramsUI); @@ -1342,22 +1291,18 @@ */ public void addRuleParameterFactor(RuleChooser ruleChooser, Rule rule, String paramName) { - // get sensitivity handler (this break package rules) - // but no other choice :( - SensitivityInputHandler handler = ruleChooser.getContextValue(SensitivityInputHandler.class); - // get index of rule in rule list // warning, factor path must always be cohérent // with rule list, if a rule is deleted, factor on it must // be deleted too, et next factor must be renamed int index = ruleChooser.getRulesList().indexOf(rule); String factorPath = "parameters.rule." + index + ".parameter." + paramName; - try { + //try { - // on a besoin de la valeur pour savoir s'il peut être continue + /*// on a besoin de la valeur pour savoir s'il peut être continue Object paramValue = RuleStorage.getParameterValue(rule, paramName); - if (!handler.canBeContinue(paramValue)) { + if (!SensitivityUtils.canBeContinue(paramValue)) { // dans le cas ou il ne peut pas être continue, on le gere // differement et on utilise sont type comme // valeur @@ -1371,12 +1316,24 @@ factorWizardUI.getFactorNameField().setText(_("isisfish.sensitivity.ruleparameterfactorname", rule.getClass().getSimpleName(), paramName)); factorWizardUI.setFactorPath(factorPath); + SensitivityWizardHandler handler = factorWizardUI.getHandler(); handler.initNewFactorWithValue(factorWizardUI, paramValue); factorWizardUI.pack(); factorWizardUI.setLocationRelativeTo(ruleChooser); + factorWizardUI.setVisible(true);*/ + + Factor factor = new Factor(_("isisfish.sensitivity.ruleparameterfactorname", + rule.getClass().getSimpleName(), paramName)); + factor.setPath(factorPath); + FactorWizardUI factorWizardUI = new FactorWizardUI(ruleChooser); + SensitivityWizardHandler handler = factorWizardUI.getHandler(); + handler.initExistingFactor(factorWizardUI, factor); + factorWizardUI.pack(); + factorWizardUI.setLocationRelativeTo(ruleChooser); factorWizardUI.setVisible(true); - } catch (IsisFishException ex) { + + /*} catch (IsisFishException ex) { throw new IsisFishRuntimeException("Can't add factor on rule", ex); - } + }*/ } } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/widget/editor/ScriptParameterDialog.jaxx =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/widget/editor/ScriptParameterDialog.jaxx 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/ui/widget/editor/ScriptParameterDialog.jaxx 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2011 Ifremer, Code Lutin, Chatellier Eric + Copyright (C) 2011 - 2012 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 @@ -84,10 +84,10 @@ </row> <row> <cell anchor="east" weightx='1.0'> - <JButton text="isisfish.common.ok" onActionPerformed="{okAction = true; dispose();}" /> + <JButton text="isisfish.common.ok" onActionPerformed="okAction = true; dispose();" /> </cell> <cell anchor="west" weightx='1.0'> - <JButton text="isisfish.common.cancel" onActionPerformed="{okAction = false; dispose();}" /> + <JButton text="isisfish.common.cancel" onActionPerformed="okAction = false; dispose();" /> </cell> </row> </Table> Modified: branches/4.0.1/src/main/resources/i18n/isis-fish_en_GB.properties =================================================================== --- branches/4.0.1/src/main/resources/i18n/isis-fish_en_GB.properties 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/resources/i18n/isis-fish_en_GB.properties 2012-03-14 14:13:51 UTC (rev 3653) @@ -19,8 +19,10 @@ Can't\ read\ ssh\ key\ \:\ %s= Can't\ simulate\ %s= Check\ state\ of\ local\ repository\:\ %s= +Coefficient= Command\ '%s'\ fail\ to\ execute= Could\ not\ found\ formule\ type\ %s\ autorised\ type\ are\ %s= +Dbimom= Empty\ zones= Error\ during\ vcs\ initialisation= Error\ while\ uploading\ public\ key\ to\ remote\ serveur\ authorized_keys= @@ -34,11 +36,16 @@ Launcher\ %s\ will\ be\ stopped\ because\ there\ are\ too\ many\ error\ (%s)= Local\ repository\ don't\ exist= Local\ repository\ exists\ but\ it's\ not\ valide\ for\ current\ vcs\:\ %s= +Maximum\ value= +Minimum\ value= Missing\ name= No\ port\ cell= Normal\ stop\ thread,\ this\ is\ not\ an\ error= Not\ start\ simulation\ %s\ because\ user\ ask\ stop= Process\ template\ error= +QUnif\ %= +QUnif\ Min/Max= +Reference\ value= Region\ %s\ allready\ exist\ in\ repository.\ Can't\ import= Region\ %s\ already\ inited= Remote\ control\ file\ doesn't\ exists\ %s= @@ -55,14 +62,25 @@ Use\ branches,\ switch\ not\ needed= User\ restart\ simulation\ %s= User\ stop\ simulation\ %s= +an\ alternative\ way\ to\ specify\ the\ scale.= could\ not\ close\ reader\ %1$s=could not close reader %1$s could\ not\ found\ %s= could\ not\ found\ log\ file\ %1$s=could not found log file %1$s could\ not\ found\ region\ %s= could\ not\ found\ simulation\ %s= could\ not\ read\ at\ offset\ %1$s\ for\ reason\ %2$s=could not read at offset %1$s for reason %2$s +dcauchy= +dchisq= +degrees\ of\ freedom\ (non-negative,\ but\ can\ be\ non-integer)= +degrees\ of\ freedom.\ 'Inf'\ is\ allowed= destination\ already\ exists\ %s\ use\ 'force'\ argument\ to\ force\ overwrite= destination\ already\ exists\ %s\ use\ \\'force\\'\ argument\ to\ force\ overwrite= +dexp= +df= +dgamma= +dgeom= +dhyper= +dlnorm= filter\ loaded\ in\ %1$s\ ms\ \:\ found\ %2$s\ lines.=filter loaded in %1$s ms \: found %2$s lines. isisfish.about.abouthtmltext=<html><b>ISIS-Fish (%s)</b><br /><br />Copyright IFREMER-MAERHA 2000-2011.<br /><br /><a href\="http\://www.isis-fish.org">http\://www.isis-fish.org</a><br /><br />Please, report any bug you can found.<html> isisfish.about.licensetext=You can modify and redistribute the program under the conditions of the GNU General Public License (version 2 or later). A copy of the GPL is in the file "LICENSE.txt" provided with ISIS-Fish. All rights reserved. No guarantees are provided for use of this program. @@ -695,14 +713,11 @@ isisfish.populationMigration.selectSeason=Select a season isisfish.populationMigration.title=Migration isisfish.populationMigration.useEquation=Use equation -isisfish.populationMigrationEmigration.coefficient=Coefficient isisfish.populationMigrationEmigration.departureZone=Departure Zone isisfish.populationMigrationEmigration.title=Population emigration isisfish.populationMigrationImmigration.arrivalZone=Arrival Zone -isisfish.populationMigrationImmigration.coefficient=Coefficient isisfish.populationMigrationImmigration.title=Population immigration isisfish.populationMigrationMigration.arrivalZone=Arrival zone -isisfish.populationMigrationMigration.coefficient=Coefficient isisfish.populationMigrationMigration.departureZone=Departure zone isisfish.populationMigrationMigration.title=Population migration isisfish.populationPrice.title=Price @@ -865,7 +880,6 @@ isisfish.sensitivity.newfactordgroup.tip=Add new discrete factor group isisfish.sensitivity.newfactorname=Factor group name isisfish.sensitivity.populationfactorname=Population %s -isisfish.sensitivity.referencevalue=Reference value isisfish.sensitivity.ruleparameterfactorname=Param rule %s.%s isisfish.sensitivity.rulesfactorname=Rule set isisfish.sensitivity.secondpass=Analyze results @@ -1095,8 +1109,20 @@ isisfish.zone.cells=Zone cells isisfish.zone.comments=Comments isisfish.zone.name=Name +location\ and\ scale\ parameters.\ (location\ \=\ 0,\ scale\ \=\ 1)= matrixAbundance= matrixCatchPerStrategyMetPerZoneMet= matrixDiscardsPerStrMetPerZonePop= +mean\ and\ standard\ deviation\ of\ the\ distribution\ on\ the\ log\ scale\ with\ default\ values\ of\ '0'\ and\ '1'\ respectively.= +non-centrality\ parameter\ (non-negative).= +non-centrality\ parameter.\ If\ omitted\ the\ central\ F\ is\ assumed= +number\ of\ trials\ (zero\ or\ more)= +probability\ of\ success\ in\ each\ trial.\ '0\ <\ prob\ <\=\ 1'= +probability\ of\ success\ on\ each\ trial= region\ already\ exists\ %s\ use\ 'force'\ argument\ to\ force\ overwrite= +shape\ and\ scale\ parameters.\ Must\ be\ positive,\ 'scale'\ strictly= simulate\ %s\ with\ file\ %s= +the\ number\ of\ balls\ drawn\ from\ the\ urn.= +the\ number\ of\ black\ balls\ in\ the\ urn.= +the\ number\ of\ white\ balls\ in\ the\ urn.= +vector\ of\ rates= Modified: branches/4.0.1/src/main/resources/i18n/isis-fish_fr_FR.properties =================================================================== --- branches/4.0.1/src/main/resources/i18n/isis-fish_fr_FR.properties 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/main/resources/i18n/isis-fish_fr_FR.properties 2012-03-14 14:13:51 UTC (rev 3653) @@ -19,8 +19,10 @@ Can't\ read\ ssh\ key\ \:\ %s= Can't\ simulate\ %s= Check\ state\ of\ local\ repository\:\ %s= +Coefficient= Command\ '%s'\ fail\ to\ execute= Could\ not\ found\ formule\ type\ %s\ autorised\ type\ are\ %s= +Dbimom= Empty\ zones= Error\ during\ vcs\ initialisation= Error\ while\ uploading\ public\ key\ to\ remote\ serveur\ authorized_keys= @@ -34,11 +36,16 @@ Launcher\ %s\ will\ be\ stopped\ because\ there\ are\ too\ many\ error\ (%s)= Local\ repository\ don't\ exist= Local\ repository\ exists\ but\ it's\ not\ valide\ for\ current\ vcs\:\ %s= +Maximum\ value= +Minimum\ value= Missing\ name= No\ port\ cell= Normal\ stop\ thread,\ this\ is\ not\ an\ error= Not\ start\ simulation\ %s\ because\ user\ ask\ stop= Process\ template\ error= +QUnif\ %= +QUnif\ Min/Max= +Reference\ value= Region\ %s\ allready\ exist\ in\ repository.\ Can't\ import= Region\ %s\ already\ inited=La région %s a déjà été initialisée Remote\ control\ file\ doesn't\ exists\ %s= @@ -55,14 +62,25 @@ Use\ branches,\ switch\ not\ needed= User\ restart\ simulation\ %s= User\ stop\ simulation\ %s= +an\ alternative\ way\ to\ specify\ the\ scale.= could\ not\ close\ reader\ %1$s=could not close reader %1$s could\ not\ found\ %s= could\ not\ found\ log\ file\ %1$s=could not found log file %1$s could\ not\ found\ region\ %s= could\ not\ found\ simulation\ %s= could\ not\ read\ at\ offset\ %1$s\ for\ reason\ %2$s=could not read at offset %1$s for reason %2$s +dcauchy= +dchisq= +degrees\ of\ freedom\ (non-negative,\ but\ can\ be\ non-integer)= +degrees\ of\ freedom.\ 'Inf'\ is\ allowed= destination\ already\ exists\ %s\ use\ 'force'\ argument\ to\ force\ overwrite= destination\ already\ exists\ %s\ use\ \\'force\\'\ argument\ to\ force\ overwrite= +dexp= +df= +dgamma= +dgeom= +dhyper= +dlnorm= filter\ loaded\ in\ %1$s\ ms\ \:\ found\ %2$s\ lines.=filter loaded in %1$s ms \: found %2$s lines. isisfish.about.abouthtmltext=<html><b>ISIS-Fish (%s)</b><br /><br />Copyright IFREMER-MAERHA 2000-2011.<br /><br /><a href\="http\://www.isis-fish.org">http\://www.isis-fish.org</a><br /><br />Merci de rapporter les bugs.<html> isisfish.about.licensetext=Vous pouvez modifier et redistribuer ce programme sous les conditions énoncées par la licence GNU GPL (version 2 ou ultérieure). Une copie de la licence GPL est dans le fichier « LICENSE.txt » fourni avec ISIS-Fish. Tous droits réservés. Aucune garantie n'est fournie pour l'utilisation de ce programme. @@ -695,14 +713,11 @@ isisfish.populationMigration.selectSeason=Sélectionnez une saison isisfish.populationMigration.title=Migration isisfish.populationMigration.useEquation=Utiliser l'équation -isisfish.populationMigrationEmigration.coefficient=Coefficient isisfish.populationMigrationEmigration.departureZone=Zone de départ isisfish.populationMigrationEmigration.title=Emmigration isisfish.populationMigrationImmigration.arrivalZone=Zone d'arrivée -isisfish.populationMigrationImmigration.coefficient=Coefficient isisfish.populationMigrationImmigration.title=Immigration isisfish.populationMigrationMigration.arrivalZone=Zone d'arrivée -isisfish.populationMigrationMigration.coefficient=Coefficient isisfish.populationMigrationMigration.departureZone=Zone de départ isisfish.populationMigrationMigration.title=Migration de population isisfish.populationPrice.title=Prix @@ -1095,8 +1110,20 @@ isisfish.zone.cells=Cellules de la zone isisfish.zone.comments=Commentaires isisfish.zone.name=Nom +location\ and\ scale\ parameters.\ (location\ \=\ 0,\ scale\ \=\ 1)= matrixAbundance= matrixCatchPerStrategyMetPerZoneMet= matrixDiscardsPerStrMetPerZonePop= +mean\ and\ standard\ deviation\ of\ the\ distribution\ on\ the\ log\ scale\ with\ default\ values\ of\ '0'\ and\ '1'\ respectively.= +non-centrality\ parameter\ (non-negative).= +non-centrality\ parameter.\ If\ omitted\ the\ central\ F\ is\ assumed= +number\ of\ trials\ (zero\ or\ more)= +probability\ of\ success\ in\ each\ trial.\ '0\ <\ prob\ <\=\ 1'= +probability\ of\ success\ on\ each\ trial= region\ already\ exists\ %s\ use\ 'force'\ argument\ to\ force\ overwrite= +shape\ and\ scale\ parameters.\ Must\ be\ positive,\ 'scale'\ strictly= simulate\ %s\ with\ file\ %s= +the\ number\ of\ balls\ drawn\ from\ the\ urn.= +the\ number\ of\ black\ balls\ in\ the\ urn.= +the\ number\ of\ white\ balls\ in\ the\ urn.= +vector\ of\ rates= Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/MexicoHelperTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -27,12 +27,19 @@ import java.io.File; import java.io.IOException; +import java.io.StringReader; +import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.SortedMap; import java.util.TreeMap; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; + import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -59,13 +66,13 @@ 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.Distribution; 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.EquationDiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; import fr.ifremer.isisfish.types.TimeStep; @@ -127,9 +134,9 @@ // factor 1 Factor factorContinuous = new Factor("factor 1 (double continuous)"); - ContinuousDomain domain1 = new ContinuousDomain(); - domain1.setMinBound(0.0); - domain1.setMaxBound(50.0); + ContinuousDomain domain1 = new ContinuousDomain(Distribution.QUNIFMM); + domain1.addDistributionParam("min", 0.0); + domain1.addDistributionParam("max", 0.0); factorContinuous.setDomain(domain1); factorContinuous.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength"); @@ -156,28 +163,25 @@ // factor 4 Factor factorMatrixContinuous = new Factor("factor 4 (MatrixContinuous)"); - MatrixContinuousDomain domain4 = new MatrixContinuousDomain(); - domain4.setCoefficient(0.799); - domain4.setReferenceValue(matrix1); - domain4.setPercentageType(true); + ContinuousDomain domain4 = new ContinuousDomain(Distribution.QUNIFPC); + domain4.addDistributionParam("reference", matrix1); + domain4.addDistributionParam("coefficient", 0.799); factorMatrixContinuous.setDomain(domain4); factorMatrixContinuous.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#minLength"); // factor 5 Factor factorEquationContinuous = new Factor("factor 5 (EquationContinuous)"); - EquationContinuousDomain domain5 = new EquationContinuousDomain(); - domain5.setCoefficient(0.1); - domain5.setReferenceValue(45.0); - domain5.setVariableName("L1"); - domain5.setPercentageType(true); + EquationContinuousDomain domain5 = new EquationContinuousDomain(Distribution.QUNIFPC); + domain5.addDistributionParam("reference", 0.1); + domain5.addDistributionParam("coefficient", 45.0); factorEquationContinuous.setDomain(domain5); factorEquationContinuous.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#maxLength"); // factor 1 Factor factorContinuousPercentage = new Factor("factor 6 (double continuous percentage)"); - ContinuousDomain domain6 = new ContinuousDomain(true); - domain6.setCoefficient(5.0); - domain6.setReferenceValue(14.0); + ContinuousDomain domain6 = new ContinuousDomain(Distribution.QUNIFPC); + domain6.addDistributionParam("reference", 14.0); + domain6.addDistributionParam("coefficient", 5.0); factorContinuousPercentage.setCardinality(5); factorContinuousPercentage.setDomain(domain6); factorContinuousPercentage.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1142003453434#0.223499349929004#size"); @@ -294,9 +298,9 @@ // assert on continuous factor (percentage, non percentage) (3.4.0.0) ContinuousDomain domain1 = (ContinuousDomain)factors.get(0).getDomain(); - Assert.assertNull(domain1.getCoefficient()); + Assert.assertNull(domain1.getDistributionParameters().get("coefficient")); ContinuousDomain domain6 = (ContinuousDomain)factors.get(5).getDomain(); - Assert.assertNotNull(domain6.getCoefficient()); + Assert.assertNotNull(domain6.getDistributionParameters().get("coefficient")); } /** @@ -437,25 +441,25 @@ // factor x1 Factor factorContinuous = new Factor("factor x1"); - ContinuousDomain domain1 = new ContinuousDomain(true); - domain1.setReferenceValue(42.0); - domain1.setCoefficient(0.05); + ContinuousDomain domain1 = new ContinuousDomain(Distribution.QUNIFPC); + domain1.addDistributionParam("reference", 42.0); + domain1.addDistributionParam("coefficient", 0.05); factorContinuous.setDomain(domain1); factorContinuous.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength"); // factor x4 Factor factorMatrixContinuous = new Factor("factor x4"); - MatrixContinuousDomain domain4 = new MatrixContinuousDomain(); - domain4.setMinBound(matrix1); - domain4.setMaxBound(matrix1); + ContinuousDomain domain4 = new ContinuousDomain(Distribution.QUNIFMM); + domain4.addDistributionParam("min", matrix1); + domain4.addDistributionParam("min", matrix1); factorMatrixContinuous.setDomain(domain4); factorMatrixContinuous.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#minLength"); // factor x5 Factor factorEquationContinuous = new Factor("factor x5"); - EquationContinuousDomain domain5 = new EquationContinuousDomain(); - domain5.setMinBound(40.0); - domain5.setMaxBound(50.0); + EquationContinuousDomain domain5 = new EquationContinuousDomain(Distribution.QUNIFMM); + domain5.addDistributionParam("min", 40.0); + domain5.addDistributionParam("max", 50.0); domain5.setVariableName("Lx1"); factorEquationContinuous.setDomain(domain5); factorEquationContinuous.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#maxLength"); @@ -580,4 +584,25 @@ context.closeContext(); } + + /** + * Test que le xml généré est valide avec la xsd mexico (exp design). + * + * @throws Exception + */ + @Test + public void validOutputXml() throws Exception { + + DesignPlan testDesignPlan = getTestDesignPlan(false); + String xml1 = MexicoHelper.getDesignPlanAsXML(testDesignPlan); + + URL schemaUrl = MexicoHelperTest.class.getResource("/mexico/expDesign.xsd"); + + String schemaLang = "http://www.w3.org/2001/XMLSchema"; + SchemaFactory factory = SchemaFactory.newInstance(schemaLang); + Schema schema = factory.newSchema(schemaUrl); + Validator validator = schema.newValidator(); + // at last perform validation: + validator.validate(new StreamSource(new StringReader(xml1))); + } } Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/export/RegionExplorerTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/export/RegionExplorerTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/mexico/export/RegionExplorerTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2006 - 2010 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2006 - 2012 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 @@ -40,7 +40,7 @@ import fr.ifremer.isisfish.datastore.RegionStorage; import fr.ifremer.isisfish.datastore.StorageException; import fr.ifremer.isisfish.entities.FisheryRegion; -import fr.ifremer.isisfish.ui.sensitivity.SensitivityUtils; +import fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils; /** * Test class for {@link RegionExplorer}. @@ -125,7 +125,7 @@ explorer.explore(fisheryRegion, xmlFactorExport); String xmlExport = FileUtils.readFileToString(file); - // test that all sensitity properties appear in xml content + // test that all sensitivity properties appear in xml content // entity part and property part must appear in factors names for (String property : SensitivityUtils.getProperties().stringPropertyNames()) { String entityPart = property.substring(0, property.indexOf('.')); Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -59,6 +59,7 @@ import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.simulator.SimulationParameterImpl; import fr.ifremer.isisfish.simulator.sensitivity.DesignPlan; +import fr.ifremer.isisfish.simulator.sensitivity.Distribution; import fr.ifremer.isisfish.simulator.sensitivity.Factor; import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.Scenario; @@ -68,7 +69,6 @@ import fr.ifremer.isisfish.simulator.sensitivity.domain.DiscreteDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.EquationDiscreteDomain; -import fr.ifremer.isisfish.simulator.sensitivity.domain.MatrixContinuousDomain; import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; /** @@ -101,9 +101,9 @@ // factor 1 Factor factor1 = new Factor("factor 1 (double)"); - ContinuousDomain domain1 = new ContinuousDomain(); - domain1.setMinBound(0.0); - domain1.setMaxBound(50.0); + ContinuousDomain domain1 = new ContinuousDomain(Distribution.QUNIFMM); + domain1.addDistributionParam("min", 0.0); + domain1.addDistributionParam("max", 50.0); factor1.setCardinality(4); factor1.setDomain(domain1); factor1.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength"); @@ -121,9 +121,9 @@ // factor 3 Factor factor3 = new Factor("factor 3 (double)"); - ContinuousDomain domain3 = new ContinuousDomain(); - domain3.setMinBound(12.0); - domain3.setMaxBound(99.0); + ContinuousDomain domain3 = new ContinuousDomain(Distribution.QUNIFMM); + domain3.addDistributionParam("min", 12.0); + domain3.addDistributionParam("max", 99.0); factor3.setCardinality(4); factor3.setDomain(domain3); factor3.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521076#0.6526656643346673#minLength"); @@ -238,9 +238,9 @@ // factor Factor factor = new Factor("test"); - ContinuousDomain domain = new ContinuousDomain(); - domain.setMinBound(0.0); - domain.setMaxBound(50.0); + ContinuousDomain domain = new ContinuousDomain(Distribution.QUNIFMM); + domain.addDistributionParam("min", 0.0); + domain.addDistributionParam("max", 50.0); factor.setDomain(domain); factor.setPath("fr.ifremer.entities.Cell#1234567890#length"); factor.setValueForIdentifier(0.5); @@ -332,11 +332,10 @@ // factor Factor factorEquation = new Factor("test.equation.name.K1"); - EquationContinuousDomain domain1 = new EquationContinuousDomain(); - domain1.setReferenceValue(10.0); - domain1.setCoefficient(0.1); + EquationContinuousDomain domain1 = new EquationContinuousDomain(Distribution.QUNIFPC); + domain1.addDistributionParam("reference", 10.0); + domain1.addDistributionParam("coefficient", 0.1); domain1.setVariableName("K1"); - domain1.setPercentageType(true); factorEquation.setDomain(domain1); factorEquation.setPath("fr.ifremer.equation1#testFactorPreScriptEquation"); factorEquation.setValueForIdentifier(0.4); @@ -375,7 +374,7 @@ // factor pop Factor factorPop = new Factor("myPopulationParams"); - factorPop.setDomain(new MatrixContinuousDomain()); + factorPop.setDomain(new ContinuousDomain()); factorPop.setPath("parameters.population.xxx.number"); MatrixND mat = MatrixFactory.getInstance().create(new int[]{2, 3}); MatrixHelper.convertToId(mat); @@ -430,7 +429,7 @@ // factor pop Factor factorPop = new Factor("parameters of rule TACpoids"); - factorPop.setDomain(new MatrixContinuousDomain()); + factorPop.setDomain(new ContinuousDomain()); factorPop.setPath("parameters.rule.0.parameter.tacInTons"); factorPop.setValue(42.0); @@ -462,18 +461,18 @@ // factor 1 Factor factor1 = new Factor("factor 1 (double)"); - ContinuousDomain domain1 = new ContinuousDomain(); - domain1.setMinBound(0.0); - domain1.setMaxBound(50.0); + ContinuousDomain domain1 = new ContinuousDomain(Distribution.QUNIFMM); + domain1.addDistributionParam("min", 0.0); + domain1.addDistributionParam("max", 50.0); factor1.setCardinality(4); factor1.setDomain(domain1); factor1.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521013#0.1715620681984218#maxLength"); // factor 2 Factor factor2 = new Factor("factor 2 (double)"); - ContinuousDomain domain2 = new ContinuousDomain(); - domain2.setMinBound(1.0); - domain2.setMaxBound(9.0); + ContinuousDomain domain2 = new ContinuousDomain(Distribution.QUNIFMM); + domain2.addDistributionParam("min", 1.0); + domain2.addDistributionParam("max", 9.0); factor2.setCardinality(3); factor2.setDomain(domain2); factor2.setPath("fr.ifremer.isisfish.entities.PopulationGroup#1156461521064#0.022976136053553198#minLength"); Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/FactorTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/FactorTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/FactorTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2010 Ifremer, Code Lutin + * Copyright (C) 2009 - 2012 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 @@ -40,7 +40,6 @@ 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.RuleDiscreteDomain; /** @@ -63,9 +62,9 @@ public void testIntFactor() { Factor factor = new Factor("testint"); - ContinuousDomain domain = new ContinuousDomain(); - domain.setMinBound(0.0); - domain.setMaxBound(50.0); + ContinuousDomain domain = new ContinuousDomain(Distribution.QUNIFMM); + domain.addDistributionParam("min", 0.0); + domain.addDistributionParam("max", 50.0); factor.setDomain(domain); factor.setPath("org.nuiton.factor#1234567890#0.12242345354#name"); factor.setValueForIdentifier(0.5); @@ -170,9 +169,9 @@ // factor Factor factor = new Factor("testmatrix"); - MatrixContinuousDomain domain = new MatrixContinuousDomain(true); - domain.setReferenceValue(matrix1); - domain.setCoefficient(0.1); + ContinuousDomain domain = new ContinuousDomain(Distribution.QUNIFPC); + domain.addDistributionParam("reference", matrix1); + domain.addDistributionParam("coefficient", 0.1); factor.setDomain(domain); factor.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor.setValueForIdentifier(0.1); @@ -193,9 +192,9 @@ // factor 2 Factor factor2 = new Factor("testmatrix"); - MatrixContinuousDomain domain2 = new MatrixContinuousDomain(true); - domain2.setReferenceValue(matrix2); - domain2.setCoefficient(0.1); + ContinuousDomain domain2 = new ContinuousDomain(Distribution.QUNIFPC); + domain2.addDistributionParam("reference", matrix2); + domain2.addDistributionParam("coefficient", 0.1); factor2.setDomain(domain2); factor2.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor2.setValueForIdentifier(0.2); @@ -217,9 +216,9 @@ // factor 3 Factor factor3 = new Factor("testmatrix"); - MatrixContinuousDomain domain3 = new MatrixContinuousDomain(true); - domain3.setReferenceValue(matrix3); - domain3.setCoefficient(0.2); + ContinuousDomain domain3 = new ContinuousDomain(Distribution.QUNIFPC); + domain3.addDistributionParam("reference", matrix3); + domain3.addDistributionParam("coefficient", 0.2); factor3.setDomain(domain3); factor3.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor3.setValueForIdentifier(0.1); @@ -241,9 +240,9 @@ // factor 3 Factor factor4 = new Factor("testmatrix"); - MatrixContinuousDomain domain4 = new MatrixContinuousDomain(true); - domain4.setReferenceValue(matrix4); - domain4.setCoefficient(0.3); + ContinuousDomain domain4 = new ContinuousDomain(Distribution.QUNIFPC); + domain4.addDistributionParam("reference", matrix4); + domain4.addDistributionParam("coefficient", 0.3); factor4.setDomain(domain4); factor4.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor4.setValueForIdentifier(0.4); @@ -268,59 +267,59 @@ // factor Factor factor = new Factor("testequation"); - EquationContinuousDomain domain = new EquationContinuousDomain(true); - domain.setCoefficient(0.1); + EquationContinuousDomain domain = new EquationContinuousDomain(Distribution.QUNIFPC); + domain.addDistributionParam("reference", 3.0); + domain.addDistributionParam("coefficient", 0.1); domain.setVariableName("Linf"); - domain.setReferenceValue(3.0); factor.setDomain(domain); factor.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor.setValueForIdentifier(0.1); Assert.assertEquals(2.76, (Double)factor.getValue(),0.0000001); - Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); - Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); + //Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); + //Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); // factor 2 Factor factor2 = new Factor("testequation"); - EquationContinuousDomain domain2 = new EquationContinuousDomain(true); - domain2.setCoefficient(0.1); + EquationContinuousDomain domain2 = new EquationContinuousDomain(Distribution.QUNIFPC); + domain2.addDistributionParam("reference", 3.0); + domain2.addDistributionParam("coefficient", 0.1); domain2.setVariableName("Linf"); - domain2.setReferenceValue(3.0); factor2.setDomain(domain2); factor2.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor2.setValueForIdentifier(0.1); Assert.assertEquals(2.76, (Double)factor2.getValue(),0.0000001); - Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); - Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); + //Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); + //Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); // factor 3 Factor factor3 = new Factor("testequation"); - EquationContinuousDomain domain3 = new EquationContinuousDomain(true); - domain3.setCoefficient(0.1); + EquationContinuousDomain domain3 = new EquationContinuousDomain(Distribution.QUNIFPC); + domain3.addDistributionParam("reference", 3.0); + domain3.addDistributionParam("coefficient", 0.1); domain3.setVariableName("Linf"); - domain3.setReferenceValue(3.0); factor3.setDomain(domain3); factor3.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor3.setValueForIdentifier(0.2); Assert.assertEquals(2.82, (Double)factor3.getValue(),0.0000001); - Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); - Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); + //Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); + //Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); // factor 4 Factor factor4 = new Factor("testequation"); - EquationContinuousDomain domain4 = new EquationContinuousDomain(true); - domain4.setCoefficient(0.05); + EquationContinuousDomain domain4 = new EquationContinuousDomain(Distribution.QUNIFPC); + domain4.addDistributionParam("reference", 3.0); + domain4.addDistributionParam("coefficient", 0.05); domain4.setVariableName("Linf"); - domain4.setReferenceValue(3.0); factor4.setDomain(domain4); factor4.setPath("org.nuiton.math.matrix.MatrixND#563456293453#2.456347646#dim"); factor4.setValueForIdentifier(0.1); Assert.assertEquals(2.88, (Double)factor4.getValue(),0.0000001); - Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); - Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); + //Assert.assertEquals(2.7,(Double)((ContinuousDomain)factor.getDomain()).getMinBound(),0); + //Assert.assertEquals(3.3,(Double)((ContinuousDomain)factor.getDomain()).getMaxBound(),0); if (log.isInfoEnabled()) { log.info("factor#toString() = " + factor); @@ -370,9 +369,9 @@ factor.setPath("fr.ifremer.isisfish.entities.Cell#lenght"); factor.setComment("answer to life"); - ContinuousDomain domain = new ContinuousDomain(); - domain.setMinBound(0.0); - domain.setMaxBound(50.0); + ContinuousDomain domain = new ContinuousDomain(Distribution.QUNIFMM); + domain.addDistributionParam("min", 0.0); + domain.addDistributionParam("max", 50.0); factor.setDomain(domain); factor.setCardinality(2); Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisRandomMock.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisRandomMock.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityAnalysisRandomMock.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -35,8 +35,6 @@ import fr.ifremer.isisfish.simulator.launcher.SimulationServiceTest; 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; /** * Implementation of SensitivityAnalysis that take random value in available @@ -100,28 +98,10 @@ Factor factor = factors.get(pickedFactor); Domain domain = factor.getDomain(); - if (domain instanceof MatrixContinuousDomain) { - MatrixContinuousDomain cDomain = (MatrixContinuousDomain) domain; - Object minValue = cDomain.getMinBound(); - Object maxValue = cDomain.getMaxBound(); - - factor.setValueForIdentifier(minValue.toString()); - scenario.addFactor(factor); - factor.setValueForIdentifier(maxValue.toString()); - scenario.addFactor(factor); - } else if (domain instanceof EquationContinuousDomain) { - EquationContinuousDomain cDomain = (EquationContinuousDomain) domain; - Object minValue = cDomain.getMinBound(); - Object maxValue = cDomain.getMaxBound(); - - factor.setValueForIdentifier(minValue.toString()); - scenario.addFactor(factor); - factor.setValueForIdentifier(maxValue.toString()); - scenario.addFactor(factor); - } else if (domain instanceof ContinuousDomain) { + if (domain instanceof ContinuousDomain) { ContinuousDomain cDomain = (ContinuousDomain) domain; - Object minValue = cDomain.getMinBound(); - Object maxValue = cDomain.getMaxBound(); + Object minValue = 10.5; //cDomain.getMinBound(); + Object maxValue = 15.5; //cDomain.getMaxBound(); factor.setValueForIdentifier(minValue); scenario.addFactor(factor); Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtilsTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtilsTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtilsTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -23,9 +23,25 @@ package fr.ifremer.isisfish.simulator.sensitivity; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Test; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaContextFactory; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.TopiaNotFoundException; +import org.nuiton.topia.persistence.TopiaDAO; +import org.nuiton.topia.persistence.TopiaEntity; +import fr.ifremer.isisfish.IsisFishDAOHelper; +import fr.ifremer.isisfish.datastore.IsisH2Config; + /** * Test for SensitivityUtils class. * @@ -37,6 +53,9 @@ */ public class SensitivityUtilsTest { + /** Logger for this class */ + private static final Log log = LogFactory.getLog(SensitivityUtilsTest.class); + /** * Test le résultat attendu de l'echappement des noms de facteurs. */ @@ -45,4 +64,61 @@ Assert.assertEquals("test_factor_pour_R", SensitivityUtils.espaceFactorName("test factor pour R")); Assert.assertEquals("factor2_selectivite", SensitivityUtils.espaceFactorName("factor2.sélectivité")); } + + /** + * Return a basic valid topia context. + * + * @throws TopiaNotFoundException + */ + protected TopiaContext getTopiaContext() throws TopiaNotFoundException { + Properties config = new Properties(); + IsisH2Config.addMemDatabaseConfig(config, "test"); + IsisH2Config.addHibernateMapping(config); + TopiaContext context = TopiaContextFactory.getContext(config); + return context; + } + + /** + * Test (par introspection) que tous les facteurs existent. + * + * @throws ClassNotFoundException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws NoSuchMethodException + * @throws SecurityException + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws TopiaException + */ + @Test + public void testFactorExistence() throws InstantiationException, IllegalAccessException, + ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, + InvocationTargetException, TopiaException { + Properties factors = SensitivityUtils.getProperties(); + + TopiaContext testTC = getTopiaContext(); + TopiaContext context = testTC.beginTransaction(); + for (String factorName : factors.stringPropertyNames()) { + String className = factorName.substring(0, factorName.indexOf(".")); + String propertyName = StringUtils.capitalize(factorName.substring(factorName.indexOf(".") + 1)); + + // Simple method + // TopiaEntity entity = (TopiaEntity)Class.forName("fr.ifremer.isisfish.entities." + className + "Impl").newInstance(); + + // Harder method + // but topia context is needed by some getXXX() methods + Method mStatic = IsisFishDAOHelper.class.getMethod("get" + className + "DAO", TopiaContext.class); + TopiaDAO<TopiaEntity> dao = (TopiaDAO<TopiaEntity>) mStatic.invoke(null, new Object[] { context }); + Assert.assertNotNull("No DOA found for factor " + factorName, dao); + TopiaEntity entity = dao.create(); + + // call proper property + if (log.isDebugEnabled()) { + log.debug(" and call get" + propertyName + "() on " + className); + } + Method m = entity.getClass().getMethod("get" + propertyName); + m.invoke(entity, (Object[]) null); + } + context.closeContext(); + } } Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomainTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomainTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/EquationContinuousDomainTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 - 2011 CodeLutin, Chatellier Eric + * Copyright (C) 2010 - 2012 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 @@ -25,10 +25,11 @@ package fr.ifremer.isisfish.simulator.sensitivity.domain; -import junit.framework.Assert; - +import org.junit.Assert; import org.junit.Test; +import fr.ifremer.isisfish.simulator.sensitivity.Distribution; + /** * Test on {@link EquationContinuousDomain}. * @@ -45,23 +46,17 @@ */ @Test public void testClone() { - EquationContinuousDomain domain = new EquationContinuousDomain(); - // parent - domain.setMinBound(0.55); - domain.setMaxBound(0.74); - // child + EquationContinuousDomain domain = new EquationContinuousDomain(Distribution.QUNIFMM); + domain.addDistributionParam("min", 0.55); + domain.addDistributionParam("max", 0.74); domain.setVariableName("varname"); - domain.setCoefficient(0.05); - domain.setReferenceValue(90.0); - + // clone - EquationContinuousDomain clone = domain.clone(); + EquationContinuousDomain clone = (EquationContinuousDomain)domain.clone(); // test on clone - Assert.assertEquals(0.55, clone.minBound); // getter return 0.0 - Assert.assertEquals(0.74, clone.maxBound); // getter return 1.0 + Assert.assertEquals(0.55, clone.getDistributionParameters().get("min")); + Assert.assertEquals(0.74, clone.getDistributionParameters().get("max")); Assert.assertEquals("varname", clone.getVariableName()); - Assert.assertEquals(0.05, clone.getCoefficient()); - Assert.assertEquals(90.0, clone.getReferenceValue()); } } Deleted: branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomainTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomainTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/simulator/sensitivity/domain/MatrixContinuousDomainTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,72 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2010 - 2011 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.domain; - -import junit.framework.Assert; - -import org.junit.Test; -import org.nuiton.math.matrix.MatrixFactory; -import org.nuiton.math.matrix.MatrixND; - -/** - * Test on {@link MatrixContinuousDomain}. - * - * @author chatellier - * @version $Revision$ - * - * Last update : $Date$ - * By : $Author$ - */ -public class MatrixContinuousDomainTest { - - /** - * Assert that clone do work (with inheritance). - */ - @Test - public void testClone() { - - // test matrix - MatrixND matrix = MatrixFactory.getInstance().create("test", new int[] { 4, 5 }, new String[] {"dim1", "dim2"}); - matrix.setValue(2, 2, 42); - - MatrixContinuousDomain domain = new MatrixContinuousDomain(); - // parent - domain.setMinBound(0.55); - domain.setMaxBound(0.74); - // child - domain.setReferenceValue(matrix); - domain.setCoefficient(0.05); - - // clone - MatrixContinuousDomain clone = domain.clone(); - - // test on clone - Assert.assertEquals(0.55, clone.minBound); // getter return 0.0 - Assert.assertEquals(0.74, clone.maxBound); // getter return 1.0 - Assert.assertEquals(matrix, clone.getReferenceValue()); - Assert.assertEquals(0.05, clone.getCoefficient()); - } -} Modified: branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/FactorTreeModelTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/FactorTreeModelTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/FactorTreeModelTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -42,6 +42,7 @@ import org.nuiton.math.matrix.MatrixND; import fr.ifremer.isisfish.AbstractIsisFishTest; +import fr.ifremer.isisfish.simulator.sensitivity.Distribution; import fr.ifremer.isisfish.simulator.sensitivity.Factor; import fr.ifremer.isisfish.simulator.sensitivity.FactorGroup; import fr.ifremer.isisfish.simulator.sensitivity.domain.ContinuousDomain; @@ -79,9 +80,9 @@ Factor factor1 = new Factor( "testint"); - ContinuousDomain domain1 = new ContinuousDomain(); - domain1.setMinBound(0.0); - domain1.setMaxBound(50.0); + ContinuousDomain domain1 = new ContinuousDomain(Distribution.QUNIFMM); + domain1.addDistributionParam("min", 0.0); + domain1.addDistributionParam("max", 50.0); factor1.setDomain(domain1); factor1.setPath("org.nuiton.factor#1234567890#0.12242345354#name"); factor1.setValueForIdentifier(0.5); Deleted: branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtilsTest.java =================================================================== --- branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtilsTest.java 2012-03-09 09:54:32 UTC (rev 3652) +++ branches/4.0.1/src/test/java/fr/ifremer/isisfish/ui/sensitivity/SensitivityUtilsTest.java 2012-03-14 14:13:51 UTC (rev 3653) @@ -1,119 +0,0 @@ -/* - * #%L - * IsisFish - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 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 - * 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.ui.sensitivity; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Properties; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.junit.Assert; -import org.junit.Test; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaContextFactory; -import org.nuiton.topia.TopiaException; -import org.nuiton.topia.TopiaNotFoundException; -import org.nuiton.topia.persistence.TopiaDAO; -import org.nuiton.topia.persistence.TopiaEntity; - -import fr.ifremer.isisfish.AbstractIsisFishTest; -import fr.ifremer.isisfish.IsisFishDAOHelper; -import fr.ifremer.isisfish.datastore.IsisH2Config; - -/** - * Test for {@link SensitivityUtils} class. - * - * @author chatellier - * @version $Revision$ - * - * Last update : $Date$ - * By : $Author$ - */ -public class SensitivityUtilsTest extends AbstractIsisFishTest { - - /** Logger for this class */ - private static final Log log = LogFactory - .getLog(SensitivityUtilsTest.class); - - /** - * Return a basic valid topia context. - * - * @throws TopiaNotFoundException - */ - protected TopiaContext getTopiaContext() throws TopiaNotFoundException { - Properties config = new Properties(); - IsisH2Config.addMemDatabaseConfig(config, "test"); - IsisH2Config.addHibernateMapping(config); - TopiaContext context = TopiaContextFactory.getContext(config); - return context; - } - - /** - * Test (par introspection) que tous les facteurs existent. - * - * @throws ClassNotFoundException - * @throws IllegalAccessException - * @throws InstantiationException - * @throws NoSuchMethodException - * @throws SecurityException - * @throws InvocationTargetException - * @throws IllegalArgumentException - * @throws TopiaException - */ - @Test - public void testFactorExistence() throws InstantiationException, IllegalAccessException, - ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, - InvocationTargetException, TopiaException { - Properties factors = SensitivityUtils.getProperties(); - - TopiaContext testTC = getTopiaContext(); - TopiaContext context = testTC.beginTransaction(); - for (String factorName : factors.stringPropertyNames()) { - String className = factorName.substring(0, factorName.indexOf(".")); - String propertyName = StringUtils.capitalize(factorName.substring(factorName.indexOf(".") + 1)); - - // Simple method - // TopiaEntity entity = (TopiaEntity)Class.forName("fr.ifremer.isisfish.entities." + className + "Impl").newInstance(); - - // Harder method - // but topia context is needed by some getXXX() methods - Method mStatic = IsisFishDAOHelper.class.getMethod("get" + className + "DAO", TopiaContext.class); - TopiaDAO<TopiaEntity> dao = (TopiaDAO<TopiaEntity>) mStatic.invoke(null, new Object[] { context }); - Assert.assertNotNull("No DOA found for factor " + factorName, dao); - TopiaEntity entity = dao.create(); - - // call proper property - if (log.isDebugEnabled()) { - log.debug(" and call get" + propertyName + "() on " + className); - } - Method m = entity.getClass().getMethod("get" + propertyName); - m.invoke(entity, (Object[]) null); - } - context.closeContext(); - } -} Added: branches/4.0.1/src/test/resources/mexico/expDesign.xsd =================================================================== (Binary files differ) Property changes on: branches/4.0.1/src/test/resources/mexico/expDesign.xsd ___________________________________________________________________ Added: svn:mime-type + application/xml
participants (1)
-
echatellier@users.forge.codelutin.com