Sandbox-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
December 2011
- 2 participants
- 15 discussions
r523 - in masc/masc-api: . src/main/java/fr/inra/masc/io src/main/java/fr/inra/masc/io/parser src/main/java/fr/inra/masc/io/writer src/main/java/fr/inra/masc/services src/main/xmi src/test/java/fr/inra/masc/services
by sletellier@users.nuiton.org 15 Dec '11
by sletellier@users.nuiton.org 15 Dec '11
15 Dec '11
Author: sletellier
Date: 2011-12-15 17:13:00 +0100 (Thu, 15 Dec 2011)
New Revision: 523
Url: http://nuiton.org/repositories/revision/sandbox/523
Log:
Rename fr.ifremer to fr.inra :(
Modified:
masc/masc-api/pom.xml
masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
masc/masc-api/src/main/xmi/mexico.zargo
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
Modified: masc/masc-api/pom.xml
===================================================================
--- masc/masc-api/pom.xml 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/pom.xml 2011-12-15 16:13:00 UTC (rev 523)
@@ -117,8 +117,8 @@
<id>mexico-beans</id>
<phase>generate-sources</phase>
<configuration>
- <defaultPackage>fr.ifremer.mexico</defaultPackage>
- <fullPackagePath>fr.ifremer.mexico</fullPackagePath>
+ <defaultPackage>fr.inra.mexico</defaultPackage>
+ <fullPackagePath>fr.inra.mexico</fullPackagePath>
<inputs>src/main/xmi:mexico.zargo</inputs>
</configuration>
<goals>
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,11 +1,11 @@
package fr.inra.masc.io;
-import fr.ifremer.mexico.model.Domain;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.Factor;
-import fr.ifremer.mexico.model.Feature;
-import fr.ifremer.mexico.model.InputDesign;
-import fr.ifremer.mexico.model.Scenario;
+import fr.inra.mexico.model.Domain;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.Factor;
+import fr.inra.mexico.model.Feature;
+import fr.inra.mexico.model.InputDesign;
+import fr.inra.mexico.model.Scenario;
/**
* Regroup all mexico xml constants tags
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -2,15 +2,15 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import fr.ifremer.mexico.model.Domain;
-import fr.ifremer.mexico.model.DomainImpl;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.ExperimentDesignImpl;
-import fr.ifremer.mexico.model.Factor;
-import fr.ifremer.mexico.model.FactorImpl;
-import fr.ifremer.mexico.model.Feature;
-import fr.ifremer.mexico.model.FeatureImpl;
-import fr.ifremer.mexico.model.ValueType;
+import fr.inra.mexico.model.Domain;
+import fr.inra.mexico.model.DomainImpl;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.ExperimentDesignImpl;
+import fr.inra.mexico.model.Factor;
+import fr.inra.mexico.model.FactorImpl;
+import fr.inra.mexico.model.Feature;
+import fr.inra.mexico.model.FeatureImpl;
+import fr.inra.mexico.model.ValueType;
import fr.inra.masc.MascTechnicalException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -2,12 +2,12 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.Factor;
-import fr.ifremer.mexico.model.InputDesign;
-import fr.ifremer.mexico.model.InputDesignImpl;
-import fr.ifremer.mexico.model.Scenario;
-import fr.ifremer.mexico.model.ScenarioImpl;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.Factor;
+import fr.inra.mexico.model.InputDesign;
+import fr.inra.mexico.model.InputDesignImpl;
+import fr.inra.mexico.model.Scenario;
+import fr.inra.mexico.model.ScenarioImpl;
import fr.inra.masc.MascTechnicalException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,6 +1,5 @@
package fr.inra.masc.io.parser;
-import fr.inra.masc.io.DateFormatFactory;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,8 +1,8 @@
package fr.inra.masc.io.writer;
-import fr.ifremer.mexico.model.Domain;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.Factor;
+import fr.inra.mexico.model.Domain;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.Factor;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,8 +1,8 @@
package fr.inra.masc.io.writer;
-import fr.ifremer.mexico.model.Factor;
-import fr.ifremer.mexico.model.InputDesign;
-import fr.ifremer.mexico.model.Scenario;
+import fr.inra.mexico.model.Factor;
+import fr.inra.mexico.model.InputDesign;
+import fr.inra.mexico.model.Scenario;
import java.io.File;
import java.io.IOException;
@@ -18,7 +18,7 @@
import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO_ORDER_NUMBER;
/**
- * Writer to create input design file with {@link fr.ifremer.mexico.model.InputDesign} model
+ * Writer to create input design file with {@link fr.inra.mexico.model.InputDesign} model
*
* @author sletellier <letellier(a)codelutin.com>
* @since 0.1
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,6 +1,6 @@
package fr.inra.masc.io.writer;
-import fr.ifremer.mexico.model.Feature;
+import fr.inra.mexico.model.Feature;
import fr.inra.masc.io.DateFormatFactory;
import java.io.File;
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,7 +1,7 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.InputDesign;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.InputDesign;
import fr.inra.masc.io.parser.ExperimentDesignParser;
import fr.inra.masc.io.parser.InputDesignParser;
import org.apache.commons.logging.Log;
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -2,17 +2,17 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.ExperimentDesignImpl;
-import fr.ifremer.mexico.model.Factor;
-import fr.ifremer.mexico.model.FactorImpl;
-import fr.ifremer.mexico.model.Feature;
-import fr.ifremer.mexico.model.FeatureImpl;
-import fr.ifremer.mexico.model.InputDesign;
-import fr.ifremer.mexico.model.InputDesignImpl;
-import fr.ifremer.mexico.model.Scenario;
-import fr.ifremer.mexico.model.ScenarioImpl;
-import fr.ifremer.mexico.model.ValueType;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.ExperimentDesignImpl;
+import fr.inra.mexico.model.Factor;
+import fr.inra.mexico.model.FactorImpl;
+import fr.inra.mexico.model.Feature;
+import fr.inra.mexico.model.FeatureImpl;
+import fr.inra.mexico.model.InputDesign;
+import fr.inra.mexico.model.InputDesignImpl;
+import fr.inra.mexico.model.Scenario;
+import fr.inra.mexico.model.ScenarioImpl;
+import fr.inra.mexico.model.ValueType;
import fr.inra.masc.model.Criteria;
import fr.inra.masc.model.EditableCriteria;
import fr.inra.masc.model.MascModel;
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,7 +1,7 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.InputDesign;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.InputDesign;
import fr.inra.masc.io.writer.ExperimentDesignXmlWriter;
import fr.inra.masc.io.writer.InputDesignXmlWriter;
import org.apache.commons.logging.Log;
Modified: masc/masc-api/src/main/xmi/mexico.zargo
===================================================================
(Binary files differ)
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,7 +1,7 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.InputDesign;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.InputDesign;
import fr.inra.masc.model.MascModel;
import org.junit.Test;
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,8 +1,8 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.InputDesign;
-import fr.ifremer.mexico.model.Scenario;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.InputDesign;
+import fr.inra.mexico.model.Scenario;
import fr.inra.masc.model.Criteria;
import fr.inra.masc.model.EditableCriteria;
import fr.inra.masc.model.MascModel;
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java 2011-12-15 11:55:36 UTC (rev 522)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java 2011-12-15 16:13:00 UTC (rev 523)
@@ -1,7 +1,7 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperimentDesign;
-import fr.ifremer.mexico.model.InputDesign;
+import fr.inra.mexico.model.ExperimentDesign;
+import fr.inra.mexico.model.InputDesign;
import fr.inra.masc.model.MascModel;
import org.junit.Test;
1
0
15 Dec '11
Author: sletellier
Date: 2011-12-15 12:55:36 +0100 (Thu, 15 Dec 2011)
New Revision: 522
Url: http://nuiton.org/repositories/revision/sandbox/522
Log:
Fix tests
Modified:
masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java 2011-12-15 10:50:26 UTC (rev 521)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java 2011-12-15 11:55:36 UTC (rev 522)
@@ -25,8 +25,11 @@
*/
public class InputDesignXmlWriter extends MexicoXmlWriter<InputDesign> {
+ protected ExperimentDesignXmlWriter experimentDesignXmlWriter;
+
public InputDesignXmlWriter(File file, InputDesign model) throws IOException {
super(file, model);
+ experimentDesignXmlWriter = new ExperimentDesignXmlWriter(file, model.getExperimentDesign());
}
@Override
@@ -45,7 +48,7 @@
addParameter(rootXmlNode, INPUT_DESIGN_DATE, formatDate(date));
// experiement design
- rootXmlNode.add(getRootElement());
+ rootXmlNode.add(experimentDesignXmlWriter.getRootElement());
}
protected void composeScenarios(XmlNode rootXmlNode) {
1
0
r521 - in masc/masc-api/src: main/java/fr/inra/masc/io main/java/fr/inra/masc/io/parser main/java/fr/inra/masc/io/writer main/java/fr/inra/masc/services main/xmi test/java/fr/inra/masc/services
by sletellier@users.nuiton.org 15 Dec '11
by sletellier@users.nuiton.org 15 Dec '11
15 Dec '11
Author: sletellier
Date: 2011-12-15 11:50:26 +0100 (Thu, 15 Dec 2011)
New Revision: 521
Url: http://nuiton.org/repositories/revision/sandbox/521
Log:
Rename mexico experienceDesign to experimentDesign
Added:
masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java
Removed:
masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java
Modified:
masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
masc/masc-api/src/main/xmi/mexico.zargo
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,7 +1,7 @@
package fr.inra.masc.io;
import fr.ifremer.mexico.model.Domain;
-import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperimentDesign;
import fr.ifremer.mexico.model.Factor;
import fr.ifremer.mexico.model.Feature;
import fr.ifremer.mexico.model.InputDesign;
@@ -15,13 +15,13 @@
*/
public class MexicoXmlConstant {
- public static final String EXPERIMENT_DESIGN = ExperienceDesign.class.getSimpleName().toLowerCase();
- public static final String EXPERIMENT_DESIGN_DATE = ExperienceDesign.PROPERTY_DATE;
- public static final String EXPERIMENT_DESIGN_ID = ExperienceDesign.PROPERTY_ID;
- public static final String EXPERIMENT_DESIGN_AUTHOR = ExperienceDesign.PROPERTY_AUTHOR;
- public static final String EXPERIMENT_DESIGN_LICENCE = ExperienceDesign.PROPERTY_LICENCE;
- public static final String EXPERIMENT_DESIGN_DESCRIPTION = ExperienceDesign.PROPERTY_DESCRIPTION;
- public static final String FACTORS = ExperienceDesign.PROPERTY_FACTORS;
+ public static final String EXPERIMENT_DESIGN = ExperimentDesign.class.getSimpleName().toLowerCase();
+ public static final String EXPERIMENT_DESIGN_DATE = ExperimentDesign.PROPERTY_DATE;
+ public static final String EXPERIMENT_DESIGN_ID = ExperimentDesign.PROPERTY_ID;
+ public static final String EXPERIMENT_DESIGN_AUTHOR = ExperimentDesign.PROPERTY_AUTHOR;
+ public static final String EXPERIMENT_DESIGN_LICENCE = ExperimentDesign.PROPERTY_LICENCE;
+ public static final String EXPERIMENT_DESIGN_DESCRIPTION = ExperimentDesign.PROPERTY_DESCRIPTION;
+ public static final String FACTORS = ExperimentDesign.PROPERTY_FACTORS;
public static final String FACTOR = Factor.class.getSimpleName().toLowerCase();
public static final String FACTOR_ID = Factor.PROPERTY_ID;
public static final String FACTOR_NAME = Factor.PROPERTY_NAME;
Deleted: masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,215 +0,0 @@
-package fr.inra.masc.io.parser;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import fr.ifremer.mexico.model.Domain;
-import fr.ifremer.mexico.model.DomainImpl;
-import fr.ifremer.mexico.model.ExperienceDesign;
-import fr.ifremer.mexico.model.ExperienceDesignImpl;
-import fr.ifremer.mexico.model.Factor;
-import fr.ifremer.mexico.model.FactorImpl;
-import fr.ifremer.mexico.model.Feature;
-import fr.ifremer.mexico.model.FeatureImpl;
-import fr.ifremer.mexico.model.ValueType;
-import fr.inra.masc.MascTechnicalException;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.text.ParseException;
-import java.util.List;
-import java.util.Map;
-
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_DISTRIBUTION_PARAMETER;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_LEVEL;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NAME;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NOMINAL_VALUE;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_VALUE_TYPE;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_AUTHOR;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DATE;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DESCRIPTION;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_ID;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_LICENCE;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTORS;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_DESCRIPTION;
-import static fr.inra.masc.io.MexicoXmlConstant.FEATURE;
-import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_NAME;
-import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE;
-import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE_TYPE;
-
-/**
-* @author sletellier <letellier(a)codelutin.com>
-*/
-public class ExperienceDesignParser extends MexicoXmlParser<ExperienceDesign> {
-
- protected Map<String, Factor> factors;
-
- public ExperienceDesignParser(File file) throws FileNotFoundException {
- super(file);
- this.factors = Maps.newHashMap();
- }
-
- @Override
- protected ExperienceDesign parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException {
- ExperienceDesign model = new ExperienceDesignImpl();
-
- parseExperienceDesignMeta(parser, model);
- parseFactors(parser, model);
-
- return model;
- }
-
- protected void parseExperienceDesignMeta(XmlPullParser parser, ExperienceDesign model) throws IOException, XmlPullParserException, ParseException {
-
- // file must start with experiment design tag
- if (parser.nextTag() == XmlPullParser.START_TAG &&
- !parserEqual(parser, EXPERIMENT_DESIGN)) {
- throw new MascTechnicalException("Experiment design file must start with " + EXPERIMENT_DESIGN + " tag");
- }
-
- // parse experiment design id
- String id = parser.getAttributeValue(null, EXPERIMENT_DESIGN_ID);
- model.setId(id);
-
- // parse date
- String dateAsString = parser.getAttributeValue(null, EXPERIMENT_DESIGN_DATE);
- model.setDate(parseDate(dateAsString));
-
- // parse author
- String author = parser.getAttributeValue(null, EXPERIMENT_DESIGN_AUTHOR);
- model.setAuthor(author);
-
- // parse license
- String license = parser.getAttributeValue(null, EXPERIMENT_DESIGN_LICENCE);
- model.setLicence(license);
-
- // parse description
- if (parser.nextTag() == XmlPullParser.START_TAG &&
- parserEqual(parser, EXPERIMENT_DESIGN_DESCRIPTION)) {
-
- model.setDescription(parser.nextText());
-
- // read next tag
- parser.nextTag();
- }
- }
- protected void parseFactors(XmlPullParser parser, ExperienceDesign model) throws IOException, XmlPullParserException {
-
- // factors
- int eventType = parser.getEventType();
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, FACTORS)) {
-
- List<Factor> factors = Lists.newArrayList();
- while (!(parser.nextTag() == XmlPullParser.END_TAG &&
- parserEqual(parser, FACTORS))) {
-
- // factor
- factors.add(parseFactor(parser));
- }
- model.setFactors(factors);
- }
-
- // read experience design next tag
- parser.nextTag();
- }
-
- protected Factor parseFactor(XmlPullParser parser) throws IOException, XmlPullParserException {
-
- Factor factor = new FactorImpl();
-
- // parse description
- int eventType = parser.nextTag();
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, FACTOR_DESCRIPTION)) {
- factor.setDescription(parser.nextText());
-
- // read function close tag
- eventType = parser.nextTag();
- }
-
- // domain
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, DOMAIN)) {
- factor.setDomain(parseDomain(parser));
- }
-
- // features
- if (parser.getEventType() == XmlPullParser.START_TAG &&
- parserEqual(parser, FEATURE)) {
-
- List<Feature> features = Lists.newArrayList();
-
- while (parserEqual(parser, FEATURE)) {
-
- // feature
- features.add(parseFeature(parser));
-
- // read feature close tag
- parser.nextTag();
-
- // read next tag
- parser.nextTag();
- }
- factor.setFeatures(features);
- }
-
- // keep factors
- factors.put(factor.getId(), factor);
-
- return factor;
- }
- protected Domain parseDomain(XmlPullParser parser) throws XmlPullParserException {
- Domain domain = new DomainImpl();
-
- // name
- String name = parser.getAttributeValue(null, DOMAIN_NAME);
- domain.setName(name);
-
- // distributionParameter
- String distributionParameter = parser.getAttributeValue(null, DOMAIN_DISTRIBUTION_PARAMETER);
- domain.setDistributionParameter(distributionParameter);
-
- // level
- String level = parser.getAttributeValue(null, DOMAIN_LEVEL);
- domain.setLevel(Integer.parseInt(level));
-
- // valueType
- String valueType = parser.getAttributeValue(null, DOMAIN_VALUE_TYPE);
- domain.setValueType(ValueType.valueOf(valueType));
-
- // nominaleValue
- // TODO sletellier 20111215 : take care of type
- String nominaleValue = parser.getAttributeValue(null, DOMAIN_NOMINAL_VALUE);
- domain.setNominalValue(nominaleValue);
-
- return domain;
- }
-
- protected Feature parseFeature(XmlPullParser parser) {
- Feature feature = new FeatureImpl();
-
- // name
- String name = parser.getAttributeValue(null, FEATURE_NAME);
- feature.setName(name);
-
- // value
- // TODO sletellier 20111215 : take care of type
- String value = parser.getAttributeValue(null, FEATURE_VALUE);
- feature.setValue(value);
-
- // value type
- String valueType = parser.getAttributeValue(null, FEATURE_VALUE_TYPE);
- feature.setValueType(ValueType.valueOf(valueType));
-
- return feature;
- }
-
- public Map<String, Factor> getFactors() {
- return factors;
- }
-}
Copied: masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java (from rev 520, masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java)
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperimentDesignParser.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -0,0 +1,215 @@
+package fr.inra.masc.io.parser;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import fr.ifremer.mexico.model.Domain;
+import fr.ifremer.mexico.model.DomainImpl;
+import fr.ifremer.mexico.model.ExperimentDesign;
+import fr.ifremer.mexico.model.ExperimentDesignImpl;
+import fr.ifremer.mexico.model.Factor;
+import fr.ifremer.mexico.model.FactorImpl;
+import fr.ifremer.mexico.model.Feature;
+import fr.ifremer.mexico.model.FeatureImpl;
+import fr.ifremer.mexico.model.ValueType;
+import fr.inra.masc.MascTechnicalException;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_DISTRIBUTION_PARAMETER;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_LEVEL;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NOMINAL_VALUE;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_VALUE_TYPE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_AUTHOR;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DATE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_ID;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_LICENCE;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTORS;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE_TYPE;
+
+/**
+* @author sletellier <letellier(a)codelutin.com>
+*/
+public class ExperimentDesignParser extends MexicoXmlParser<ExperimentDesign> {
+
+ protected Map<String, Factor> factors;
+
+ public ExperimentDesignParser(File file) throws FileNotFoundException {
+ super(file);
+ this.factors = Maps.newHashMap();
+ }
+
+ @Override
+ protected ExperimentDesign parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException {
+ ExperimentDesign model = new ExperimentDesignImpl();
+
+ parseExperimentDesignMeta(parser, model);
+ parseFactors(parser, model);
+
+ return model;
+ }
+
+ protected void parseExperimentDesignMeta(XmlPullParser parser, ExperimentDesign model) throws IOException, XmlPullParserException, ParseException {
+
+ // file must start with experiment design tag
+ if (parser.nextTag() == XmlPullParser.START_TAG &&
+ !parserEqual(parser, EXPERIMENT_DESIGN)) {
+ throw new MascTechnicalException("Experiment design file must start with " + EXPERIMENT_DESIGN + " tag");
+ }
+
+ // parse experiment design id
+ String id = parser.getAttributeValue(null, EXPERIMENT_DESIGN_ID);
+ model.setId(id);
+
+ // parse date
+ String dateAsString = parser.getAttributeValue(null, EXPERIMENT_DESIGN_DATE);
+ model.setDate(parseDate(dateAsString));
+
+ // parse author
+ String author = parser.getAttributeValue(null, EXPERIMENT_DESIGN_AUTHOR);
+ model.setAuthor(author);
+
+ // parse license
+ String license = parser.getAttributeValue(null, EXPERIMENT_DESIGN_LICENCE);
+ model.setLicence(license);
+
+ // parse description
+ if (parser.nextTag() == XmlPullParser.START_TAG &&
+ parserEqual(parser, EXPERIMENT_DESIGN_DESCRIPTION)) {
+
+ model.setDescription(parser.nextText());
+
+ // read next tag
+ parser.nextTag();
+ }
+ }
+ protected void parseFactors(XmlPullParser parser, ExperimentDesign model) throws IOException, XmlPullParserException {
+
+ // factors
+ int eventType = parser.getEventType();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FACTORS)) {
+
+ List<Factor> factors = Lists.newArrayList();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, FACTORS))) {
+
+ // factor
+ factors.add(parseFactor(parser));
+ }
+ model.setFactors(factors);
+ }
+
+ // read experience design next tag
+ parser.nextTag();
+ }
+
+ protected Factor parseFactor(XmlPullParser parser) throws IOException, XmlPullParserException {
+
+ Factor factor = new FactorImpl();
+
+ // parse description
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FACTOR_DESCRIPTION)) {
+ factor.setDescription(parser.nextText());
+
+ // read function close tag
+ eventType = parser.nextTag();
+ }
+
+ // domain
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, DOMAIN)) {
+ factor.setDomain(parseDomain(parser));
+ }
+
+ // features
+ if (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, FEATURE)) {
+
+ List<Feature> features = Lists.newArrayList();
+
+ while (parserEqual(parser, FEATURE)) {
+
+ // feature
+ features.add(parseFeature(parser));
+
+ // read feature close tag
+ parser.nextTag();
+
+ // read next tag
+ parser.nextTag();
+ }
+ factor.setFeatures(features);
+ }
+
+ // keep factors
+ factors.put(factor.getId(), factor);
+
+ return factor;
+ }
+ protected Domain parseDomain(XmlPullParser parser) throws XmlPullParserException {
+ Domain domain = new DomainImpl();
+
+ // name
+ String name = parser.getAttributeValue(null, DOMAIN_NAME);
+ domain.setName(name);
+
+ // distributionParameter
+ String distributionParameter = parser.getAttributeValue(null, DOMAIN_DISTRIBUTION_PARAMETER);
+ domain.setDistributionParameter(distributionParameter);
+
+ // level
+ String level = parser.getAttributeValue(null, DOMAIN_LEVEL);
+ domain.setLevel(Integer.parseInt(level));
+
+ // valueType
+ String valueType = parser.getAttributeValue(null, DOMAIN_VALUE_TYPE);
+ domain.setValueType(ValueType.valueOf(valueType));
+
+ // nominaleValue
+ // TODO sletellier 20111215 : take care of type
+ String nominaleValue = parser.getAttributeValue(null, DOMAIN_NOMINAL_VALUE);
+ domain.setNominalValue(nominaleValue);
+
+ return domain;
+ }
+
+ protected Feature parseFeature(XmlPullParser parser) {
+ Feature feature = new FeatureImpl();
+
+ // name
+ String name = parser.getAttributeValue(null, FEATURE_NAME);
+ feature.setName(name);
+
+ // value
+ // TODO sletellier 20111215 : take care of type
+ String value = parser.getAttributeValue(null, FEATURE_VALUE);
+ feature.setValue(value);
+
+ // value type
+ String valueType = parser.getAttributeValue(null, FEATURE_VALUE_TYPE);
+ feature.setValueType(ValueType.valueOf(valueType));
+
+ return feature;
+ }
+
+ public Map<String, Factor> getFactors() {
+ return factors;
+ }
+}
Modified: masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -2,7 +2,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperimentDesign;
import fr.ifremer.mexico.model.Factor;
import fr.ifremer.mexico.model.InputDesign;
import fr.ifremer.mexico.model.InputDesignImpl;
@@ -32,11 +32,11 @@
*/
public class InputDesignParser extends MexicoXmlParser<InputDesign> {
- protected ExperienceDesignParser experienceDesignParser;
+ protected ExperimentDesignParser experimentDesignParser;
public InputDesignParser(File file) throws FileNotFoundException {
super(file);
- experienceDesignParser = new ExperienceDesignParser(file);
+ experimentDesignParser = new ExperimentDesignParser(file);
}
@Override
@@ -46,8 +46,8 @@
parseInputDesignMeta(parser, model);
// parse experiment design
- ExperienceDesign experienceDesign = experienceDesignParser.parseModel(parser);
- model.setExperienceDesign(experienceDesign);
+ ExperimentDesign experimentDesign = experimentDesignParser.parseModel(parser);
+ model.setExperimentDesign(experimentDesign);
parseScenarios(parser, model);
@@ -105,7 +105,7 @@
// get factor
String factorId = parser.getAttributeValue(null, FACTOR);
- Factor factor = experienceDesignParser.getFactors().get(factorId);
+ Factor factor = experimentDesignParser.getFactors().get(factorId);
// factor value
String value = parser.nextText();
Deleted: masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,113 +0,0 @@
-package fr.inra.masc.io.writer;
-
-import fr.ifremer.mexico.model.Domain;
-import fr.ifremer.mexico.model.ExperienceDesign;
-import fr.ifremer.mexico.model.Factor;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Date;
-
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_DISTRIBUTION_PARAMETER;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_LEVEL;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NAME;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NOMINAL_VALUE;
-import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_VALUE_TYPE;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_AUTHOR;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DATE;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DESCRIPTION;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_ID;
-import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_LICENCE;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTOR;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTORS;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_DESCRIPTION;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_ID;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_NAME;
-import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_UNIT;
-
-/**
- * Writer to create experiment design file with {@link ExperienceDesign} model
- *
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class ExperienceDesignXmlWriter extends MexicoXmlWriter<ExperienceDesign> {
-
- public ExperienceDesignXmlWriter(File file, ExperienceDesign model) throws IOException {
- super(file, model);
- }
-
- @Override
- public XmlNode getRootElement() {
-
- XmlNode rootXmlNode = new XmlNode(EXPERIMENT_DESIGN);
- composeExperienceDesignMeta(rootXmlNode);
- composeFactors(rootXmlNode);
-
- // TODO sletellier 2011/12/14 : implement workflow
- // composeWorkFlow(rootXmlNode);
-
- return rootXmlNode;
- }
-
- protected void composeExperienceDesignMeta(XmlNode rootXmlNode) {
-
- // date
- Date date = model.getDate();
- addParameter(rootXmlNode, EXPERIMENT_DESIGN_DATE, formatDate(date));
-
- addParameter(rootXmlNode, EXPERIMENT_DESIGN_ID, model.getId());
- addParameter(rootXmlNode, EXPERIMENT_DESIGN_AUTHOR, model.getAuthor());
- addParameter(rootXmlNode, EXPERIMENT_DESIGN_LICENCE, model.getLicence());
-
- // description
- String description = model.getDescription();
- if (StringUtils.isNotEmpty(description)) {
- XmlNode.createElement(rootXmlNode, EXPERIMENT_DESIGN_DESCRIPTION, description);
- }
- }
-
- protected void composeFactors(XmlNode rootXmlNode) {
- Collection<Factor> factors = model.getFactors();
-
- // do nothing if no factors in model
- if (factors.isEmpty()) {
- return;
- }
-
- // creating factors node
- XmlNode factorsXmlNode = XmlNode.createElement(rootXmlNode, FACTORS);
- for (Factor factor : factors) {
-
- // factor
- XmlNode factorXmlNode = XmlNode.createElement(factorsXmlNode, FACTOR);
- addParameter(factorXmlNode, FACTOR_ID, factor.getId());
- addParameter(factorXmlNode, FACTOR_NAME, factor.getName());
- addParameter(factorXmlNode, FACTOR_UNIT, factor.getUnit());
-
- // description
- String description = model.getDescription();
- if (StringUtils.isNotEmpty(description)) {
- XmlNode.createElement(factorXmlNode, FACTOR_DESCRIPTION, factor.getDescription());
- }
-
- // domain
- Domain domain = factor.getDomain();
- if (domain != null) {
- XmlNode domainXmlNode = XmlNode.createElement(factorXmlNode, DOMAIN);
- addParameter(domainXmlNode, DOMAIN_NAME, domain.getName());
- addParameter(domainXmlNode, DOMAIN_DISTRIBUTION_PARAMETER, domain.getDistributionParameter());
- addParameter(domainXmlNode, DOMAIN_LEVEL, String.valueOf(domain.getLevel()));
- addParameter(domainXmlNode, DOMAIN_VALUE_TYPE, domain.getValueType());
- addParameter(domainXmlNode, DOMAIN_NOMINAL_VALUE, domain.getNominalValue());
- }
-
- // features
- addAllFeature(factorXmlNode, factor.getFeatures());
- }
- }
-}
Copied: masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java (from rev 520, masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java)
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperimentDesignXmlWriter.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -0,0 +1,113 @@
+package fr.inra.masc.io.writer;
+
+import fr.ifremer.mexico.model.Domain;
+import fr.ifremer.mexico.model.ExperimentDesign;
+import fr.ifremer.mexico.model.Factor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Date;
+
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_DISTRIBUTION_PARAMETER;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_LEVEL;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NOMINAL_VALUE;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_VALUE_TYPE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_AUTHOR;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DATE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_ID;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_LICENCE;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTORS;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_ID;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_UNIT;
+
+/**
+ * Writer to create experiment design file with {@link ExperimentDesign} model
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class ExperimentDesignXmlWriter extends MexicoXmlWriter<ExperimentDesign> {
+
+ public ExperimentDesignXmlWriter(File file, ExperimentDesign model) throws IOException {
+ super(file, model);
+ }
+
+ @Override
+ public XmlNode getRootElement() {
+
+ XmlNode rootXmlNode = new XmlNode(EXPERIMENT_DESIGN);
+ composeExperimentDesignMeta(rootXmlNode);
+ composeFactors(rootXmlNode);
+
+ // TODO sletellier 2011/12/14 : implement workflow
+ // composeWorkFlow(rootXmlNode);
+
+ return rootXmlNode;
+ }
+
+ protected void composeExperimentDesignMeta(XmlNode rootXmlNode) {
+
+ // date
+ Date date = model.getDate();
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_DATE, formatDate(date));
+
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_ID, model.getId());
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_AUTHOR, model.getAuthor());
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_LICENCE, model.getLicence());
+
+ // description
+ String description = model.getDescription();
+ if (StringUtils.isNotEmpty(description)) {
+ XmlNode.createElement(rootXmlNode, EXPERIMENT_DESIGN_DESCRIPTION, description);
+ }
+ }
+
+ protected void composeFactors(XmlNode rootXmlNode) {
+ Collection<Factor> factors = model.getFactors();
+
+ // do nothing if no factors in model
+ if (factors.isEmpty()) {
+ return;
+ }
+
+ // creating factors node
+ XmlNode factorsXmlNode = XmlNode.createElement(rootXmlNode, FACTORS);
+ for (Factor factor : factors) {
+
+ // factor
+ XmlNode factorXmlNode = XmlNode.createElement(factorsXmlNode, FACTOR);
+ addParameter(factorXmlNode, FACTOR_ID, factor.getId());
+ addParameter(factorXmlNode, FACTOR_NAME, factor.getName());
+ addParameter(factorXmlNode, FACTOR_UNIT, factor.getUnit());
+
+ // description
+ String description = model.getDescription();
+ if (StringUtils.isNotEmpty(description)) {
+ XmlNode.createElement(factorXmlNode, FACTOR_DESCRIPTION, factor.getDescription());
+ }
+
+ // domain
+ Domain domain = factor.getDomain();
+ if (domain != null) {
+ XmlNode domainXmlNode = XmlNode.createElement(factorXmlNode, DOMAIN);
+ addParameter(domainXmlNode, DOMAIN_NAME, domain.getName());
+ addParameter(domainXmlNode, DOMAIN_DISTRIBUTION_PARAMETER, domain.getDistributionParameter());
+ addParameter(domainXmlNode, DOMAIN_LEVEL, String.valueOf(domain.getLevel()));
+ addParameter(domainXmlNode, DOMAIN_VALUE_TYPE, domain.getValueType());
+ addParameter(domainXmlNode, DOMAIN_NOMINAL_VALUE, domain.getNominalValue());
+ }
+
+ // features
+ addAllFeature(factorXmlNode, factor.getFeatures());
+ }
+ }
+}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,8 +1,8 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperimentDesign;
import fr.ifremer.mexico.model.InputDesign;
-import fr.inra.masc.io.parser.ExperienceDesignParser;
+import fr.inra.masc.io.parser.ExperimentDesignParser;
import fr.inra.masc.io.parser.InputDesignParser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -26,29 +26,29 @@
return log;
}
- public ExperienceDesign loadExperienceDesignModel(File experienceDesignFile) {
+ public ExperimentDesign loadExperimentDesignModel(File experimentDesignFile) {
- ExperienceDesign experienceDesignModel = null;
+ ExperimentDesign experimentDesign = null;
try {
- ExperienceDesignParser experienceDesignParser = new ExperienceDesignParser(experienceDesignFile);
+ ExperimentDesignParser experimentDesignParser = new ExperimentDesignParser(experimentDesignFile);
try {
- // parse experienceDesign
- experienceDesignModel = experienceDesignParser.getModel();
+ // parse experimentDesign
+ experimentDesign = experimentDesignParser.getModel();
} finally {
- experienceDesignParser.close();
+ experimentDesignParser.close();
}
} catch (XmlPullParserException eee) {
- throwMascTechnicalException("Failed to parse ExperienceDesign file '" + experienceDesignFile.getName() + "'", eee);
+ throwMascTechnicalException("Failed to parse ExperimentDesign file '" + experimentDesignFile.getName() + "'", eee);
} catch (FileNotFoundException eee) {
- throwMascTechnicalException("ExperienceDesign file '" + experienceDesignFile.getName() + "' not found", eee);
+ throwMascTechnicalException("ExperimentDesign file '" + experimentDesignFile.getName() + "' not found", eee);
} catch (IOException eee) {
- throwMascTechnicalException("Error reading ExperienceDesign file '" + experienceDesignFile.getName() + "'", eee);
+ throwMascTechnicalException("Error reading ExperimentDesign file '" + experimentDesignFile.getName() + "'", eee);
} catch (ParseException eee) {
- throwMascTechnicalException("Failed to parse ExperienceDesign file '" + experienceDesignFile.getName() + "'", eee);
+ throwMascTechnicalException("Failed to parse ExperimentDesign file '" + experimentDesignFile.getName() + "'", eee);
}
- return experienceDesignModel;
+ return experimentDesign;
}
public InputDesign loadInputDesignDesignModel(File inputDesignFile) {
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -2,8 +2,8 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import fr.ifremer.mexico.model.ExperienceDesign;
-import fr.ifremer.mexico.model.ExperienceDesignImpl;
+import fr.ifremer.mexico.model.ExperimentDesign;
+import fr.ifremer.mexico.model.ExperimentDesignImpl;
import fr.ifremer.mexico.model.Factor;
import fr.ifremer.mexico.model.FactorImpl;
import fr.ifremer.mexico.model.Feature;
@@ -42,11 +42,11 @@
return log;
}
- public InputDesign convertMascModelToMexicoInputDesignModel(MascModel mascModel, ExperienceDesign experienceDesign) {
+ public InputDesign convertMascModelToMexicoInputDesignModel(MascModel mascModel, ExperimentDesign experimentDesign) {
InputDesign inputDesign = new InputDesignImpl();
// experience design
- inputDesign.setExperienceDesign(experienceDesign);
+ inputDesign.setExperimentDesign(experimentDesign);
// date is now
inputDesign.setDate(new Date());
@@ -70,7 +70,7 @@
// optionValue = entry of factorValues
for (OptionValue optionValue : option.getOptionValue()) {
- Collection<Factor> factors = experienceDesign.getFactors();
+ Collection<Factor> factors = experimentDesign.getFactors();
for (Factor factor : factors) {
String criteriaName = optionValue.getCriteria().getName();
if (factor.getId().equals(criteriaName)) {
@@ -87,18 +87,18 @@
return inputDesign;
}
- public ExperienceDesign convertMascModelToMexicoExperienceDesignModel(MascModel mascModel) {
- ExperienceDesign experienceDesign = new ExperienceDesignImpl();
+ public ExperimentDesign convertMascModelToMexicoExperimentDesignModel(MascModel mascModel) {
+ ExperimentDesign experimentDesign = new ExperimentDesignImpl();
// id = mascModel name
- experienceDesign.setId(mascModel.getName());
+ experimentDesign.setId(mascModel.getName());
// description
String description = StringUtils.join(mascModel.getDescription(), "\n");
- experienceDesign.setDescription(description);
+ experimentDesign.setDescription(description);
// date is now
- experienceDesign.setDate(new Date());
+ experimentDesign.setDate(new Date());
// criterias = factors
Collection<Criteria> criterias = mascModel.getCriteria();
@@ -107,9 +107,9 @@
for (Criteria criteria : criterias) {
factors.addAll(getFactors(criteria));
}
- experienceDesign.setFactors(factors);
+ experimentDesign.setFactors(factors);
- return experienceDesign;
+ return experimentDesign;
}
protected Collection<Factor> getFactors(Criteria criteria) {
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,8 +1,8 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperimentDesign;
import fr.ifremer.mexico.model.InputDesign;
-import fr.inra.masc.io.writer.ExperienceDesignXmlWriter;
+import fr.inra.masc.io.writer.ExperimentDesignXmlWriter;
import fr.inra.masc.io.writer.InputDesignXmlWriter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -26,10 +26,10 @@
return log;
}
- public void saveExperienceDesign(ExperienceDesign experienceDesign, File toSave) {
+ public void saveExperimentDesign(ExperimentDesign experimentDesign, File toSave) {
try {
- ExperienceDesignXmlWriter writer = new ExperienceDesignXmlWriter(toSave, experienceDesign);
+ ExperimentDesignXmlWriter writer = new ExperimentDesignXmlWriter(toSave, experimentDesign);
try {
writer.write();
} finally {
Modified: masc/masc-api/src/main/xmi/mexico.zargo
===================================================================
(Binary files differ)
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,6 +1,6 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperimentDesign;
import fr.ifremer.mexico.model.InputDesign;
import fr.inra.masc.model.MascModel;
import org.junit.Test;
@@ -14,17 +14,17 @@
public class MexicoLoadModelServiceTest extends AbstractServiceTest {
@Test
- public void testLoadExperienceDesignModel() throws Exception {
+ public void testLoadExperimentDesignModel() throws Exception {
MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
File dexiTestFile = getDexiTestFile();
MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
- ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+ ExperimentDesign experimentDesign = mexicoModelConvertorService.convertMascModelToMexicoExperimentDesignModel(mascModel);
- File savedFile = new File(testWorkDir, "experienceDesignTestFileResult.xml");
- getService(MexicoSaveModelService.class).saveExperienceDesign(experienceDesign, savedFile);
+ File savedFile = new File(testWorkDir, "experimentDesignTestFileResult.xml");
+ getService(MexicoSaveModelService.class).saveExperimentDesign(experimentDesign, savedFile);
- ExperienceDesign loadedExperienceDesign = getService(MexicoLoadModelService.class).loadExperienceDesignModel(savedFile);
- assertExperimentDesignEqual(experienceDesign, loadedExperienceDesign);
+ ExperimentDesign loadedExperimentDesign = getService(MexicoLoadModelService.class).loadExperimentDesignModel(savedFile);
+ assertExperimentDesignEqual(experimentDesign, loadedExperimentDesign);
}
@Test
@@ -32,20 +32,20 @@
File dexiTestFile = getDexiTestFile();
MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
- ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
- InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experienceDesign);
+ ExperimentDesign experimentDesign = mexicoModelConvertorService.convertMascModelToMexicoExperimentDesignModel(mascModel);
+ InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experimentDesign);
File savedFile = new File(testWorkDir, "inputDesignTestFileResult.xml");
getService(MexicoSaveModelService.class).saveInputDesign(inputDesign, savedFile);
InputDesign loadedInputDesign = getService(MexicoLoadModelService.class).loadInputDesignDesignModel(savedFile);
- assertExperimentDesignEqual(inputDesign.getExperienceDesign(), loadedInputDesign.getExperienceDesign());
+ assertExperimentDesignEqual(inputDesign.getExperimentDesign(), loadedInputDesign.getExperimentDesign());
assertEquals(inputDesign.getScenarios().size(), loadedInputDesign.getScenarios().size());
}
- protected void assertExperimentDesignEqual(ExperienceDesign expectedExperienceDesign, ExperienceDesign experienceDesign) {
- assertEquals(expectedExperienceDesign.getId(), experienceDesign.getId());
- assertEquals(expectedExperienceDesign.getFactors().size(), experienceDesign.getFactors().size());
+ protected void assertExperimentDesignEqual(ExperimentDesign expectedExperimentDesign, ExperimentDesign experimentDesign) {
+ assertEquals(expectedExperimentDesign.getId(), experimentDesign.getId());
+ assertEquals(expectedExperimentDesign.getFactors().size(), experimentDesign.getFactors().size());
}
}
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,6 +1,6 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperimentDesign;
import fr.ifremer.mexico.model.InputDesign;
import fr.ifremer.mexico.model.Scenario;
import fr.inra.masc.model.Criteria;
@@ -20,11 +20,11 @@
public class MexicoModelConvertorServiceTest extends AbstractServiceTest {
@Test
- public void testConvertMascModelToMexicoExperienceDesignModel() throws Exception {
+ public void testConvertMascModelToMexicoExperimentDesignModel() throws Exception {
MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
File dexiTestFile = getDexiTestFile();
MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
- ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+ ExperimentDesign experimentDesign = mexicoModelConvertorService.convertMascModelToMexicoExperimentDesignModel(mascModel);
// count masc model criteria
Collection<Criteria> criterias = mascModel.getCriteria();
@@ -32,7 +32,7 @@
for (Criteria criteria : criterias) {
count += countChildren(criteria);
}
- assertEquals(count, experienceDesign.getFactors().size());
+ assertEquals(count, experimentDesign.getFactors().size());
}
protected int countChildren(Criteria criteria) {
@@ -53,8 +53,8 @@
File dexiTestFile = getDexiTestFile();
MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
- ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
- InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experienceDesign);
+ ExperimentDesign experimentDesign = mexicoModelConvertorService.convertMascModelToMexicoExperimentDesignModel(mascModel);
+ InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experimentDesign);
Collection<Option> options = mascModel.getOption();
assertEquals(options.size(), inputDesign.getScenarios().size());
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java 2011-12-15 10:31:40 UTC (rev 520)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java 2011-12-15 10:50:26 UTC (rev 521)
@@ -1,6 +1,6 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperimentDesign;
import fr.ifremer.mexico.model.InputDesign;
import fr.inra.masc.model.MascModel;
import org.junit.Test;
@@ -14,14 +14,14 @@
public class MexicoSaveModelServiceTest extends AbstractServiceTest {
@Test
- public void testSaveExperienceDesign() throws Exception {
+ public void testSaveExperimentDesign() throws Exception {
MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
File dexiTestFile = getDexiTestFile();
MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
- ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+ ExperimentDesign experimentDesign = mexicoModelConvertorService.convertMascModelToMexicoExperimentDesignModel(mascModel);
- File savedFile = new File(testWorkDir, "experienceDesignTestFileResult.xml");
- getService(MexicoSaveModelService.class).saveExperienceDesign(experienceDesign, savedFile);
+ File savedFile = new File(testWorkDir, "experimentDesignTestFileResult.xml");
+ getService(MexicoSaveModelService.class).saveExperimentDesign(experimentDesign, savedFile);
}
@Test
@@ -29,8 +29,8 @@
File dexiTestFile = getDexiTestFile();
MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
- ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
- InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experienceDesign);
+ ExperimentDesign experimentDesign = mexicoModelConvertorService.convertMascModelToMexicoExperimentDesignModel(mascModel);
+ InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experimentDesign);
File savedFile = new File(testWorkDir, "inputDesignTestFileResult.xml");
getService(MexicoSaveModelService.class).saveInputDesign(inputDesign, savedFile);
1
0
r520 - in masc/masc-api/src: main/java/fr/inra/masc/io main/java/fr/inra/masc/io/parser main/java/fr/inra/masc/io/writer main/java/fr/inra/masc/model main/java/fr/inra/masc/services test/java/fr/inra/masc/services
by sletellier@users.nuiton.org 15 Dec '11
by sletellier@users.nuiton.org 15 Dec '11
15 Dec '11
Author: sletellier
Date: 2011-12-15 11:31:40 +0100 (Thu, 15 Dec 2011)
New Revision: 520
Url: http://nuiton.org/repositories/revision/sandbox/520
Log:
- Parse mexico xml files (inputDesign and experimentDesign)
- Add test parsing mexico xml files
- Refactor creating specific writer and parser
- Rename Element to XmlNode
Added:
masc/masc-api/src/main/java/fr/inra/masc/io/DateFormatFactory.java
masc/masc-api/src/main/java/fr/inra/masc/io/MascXmlConstant.java
masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/
masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/MascModelParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/MexicoXmlParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/
masc/masc-api/src/main/java/fr/inra/masc/io/writer/DexiXmlWriter.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlNode.java
masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlWriter.java
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java
Removed:
masc/masc-api/src/main/java/fr/inra/masc/io/Element.java
masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java
Modified:
masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
Added: masc/masc-api/src/main/java/fr/inra/masc/io/DateFormatFactory.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/DateFormatFactory.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/DateFormatFactory.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,21 @@
+package fr.inra.masc.io;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ */
+public class DateFormatFactory {
+
+ public static final String MEXICO_DATE_PATTERN = "yyyy-MM-dd";
+ protected static DateFormat mexicoDateFormat;
+
+ public static DateFormat getMexicoDateFormat() {
+ // singleton
+ if (mexicoDateFormat == null) {
+ mexicoDateFormat = new SimpleDateFormat(MEXICO_DATE_PATTERN);
+ }
+ return mexicoDateFormat;
+ }
+}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/io/Element.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/Element.java 2011-12-14 15:37:31 UTC (rev 519)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/Element.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -1,115 +0,0 @@
-package fr.inra.masc.io;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang3.StringEscapeUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Represent an XML node
- *
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class Element {
-
- public static final String XML_META = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
- public static final String CLOSED_TAG = "%s<%s%s/>\n";
- public static final String START_TAG = "%s<%s%s>";
- public static final String END_TAG = "%s</%s>\n";
-
- protected LinkedList<Element> children;
- protected Map<String, String> parameters;
- protected String tagName;
- protected String text;
-
- public Element(String tagName) {
- this(tagName, null);
- }
-
- public Element(String tagName, String text) {
- this.tagName = tagName;
- this.text = text;
- this.children = Lists.newLinkedList();
- this.parameters = Maps.newHashMap();
- }
-
- public void add(Element e) {
- this.children.add(e);
- }
-
- public void addParameter(String name, String value) {
- this.parameters.put(name, value);
- }
-
- public String toXml(int indent) {
- StringBuilder stringBuilder = new StringBuilder(XML_META).append("\n");
- buildXml(-indent, indent, stringBuilder);
- return stringBuilder.toString();
- }
-
- protected void buildXml(int start, int indent, StringBuilder stringBuilder) {
-
- // closed tag if content is empty
- if (children.isEmpty() && StringUtils.isEmpty(text)) {
- addToBuilder(stringBuilder, CLOSED_TAG, getIndentPrefix(start, indent), tagName);
- return;
- }
-
- // start tag
- addToBuilder(stringBuilder, START_TAG, getIndentPrefix(start, indent), tagName);
- if (StringUtils.isNotEmpty(text)) {
-
- // end inline tag
- addToBuilder(stringBuilder, END_TAG, StringEscapeUtils.escapeXml(text), tagName);
- } else {
- stringBuilder.append("\n");
- for (Element child : children) {
- child.buildXml(start + indent, indent, stringBuilder);
- }
- // end tag
- addToBuilder(stringBuilder, END_TAG, getIndentPrefix(start, indent), tagName);
- }
- }
-
- protected void addToBuilder(StringBuilder stringBuilder, String template, String prefix, String tagName) {
- stringBuilder.append(String.format(template, prefix, tagName, getParametersAsString()));
- }
-
- protected String getIndentPrefix(int start, int lenght) {
- String result = "";
- for (int i=0;i<start + lenght;i++) {
- result += " ";
- }
- return result;
- }
-
- protected String getParametersAsString() {
- StringBuilder builder = new StringBuilder();
- Set<Map.Entry<String,String>> entries = parameters.entrySet();
- for (Map.Entry<String,String> entry : entries) {
-
- // add to builder param like : name="value"
- builder.append(" ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
- }
- return builder.toString();
- }
-
- public static Element createElement(Element parentElement, String tagName) {
- return createElement(parentElement, tagName, null);
- }
-
- public static Element createElement(Element parentElement, String tagName, String text) {
- Element element = createElement(tagName, text);
- parentElement.add(element);
- return element;
- }
-
- public static Element createElement(String tagName, String text) {
- return new Element(tagName, text);
- }
-}
Copied: masc/masc-api/src/main/java/fr/inra/masc/io/MascXmlConstant.java (from rev 516, masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java)
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/MascXmlConstant.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/MascXmlConstant.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,36 @@
+package fr.inra.masc.io;
+
+import fr.inra.masc.model.ComputableCriteria;
+import fr.inra.masc.model.Criteria;
+import fr.inra.masc.model.Function;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.ScaleValue;
+
+/**
+ * Regroup all masc xml constants tags
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MascXmlConstant {
+
+ public static final String DEXI = "DEXi";
+ public static final String LINE = "line";
+ public static final String ATTRIBUTE = "attribute";
+ public static final String MODEL_NAME = MascModel.PROPERTY_NAME;
+ public static final String MODEL_DESCRIPTION = MascModel.PROPERTY_DESCRIPTION;
+ public static final String OPTION = MascModel.PROPERTY_OPTION;
+ public static final String SETTINGS = MascModel.PROPERTY_SETTINGS;
+ public static final String CRITERIA_NAME = Criteria.PROPERTY_NAME;
+ public static final String CRITERIA_DESCRIPTION = Criteria.PROPERTY_DESCRIPTION;
+ public static final String SCALE = Criteria.PROPERTY_SCALE;
+ public static final String SCALE_VALUE = ScaleValue.class.getSimpleName();
+ public static final String SCALE_VALUE_NAME = ScaleValue.PROPERTY_NAME;
+ public static final String SCALE_VALUE_DESCRIPTION = ScaleValue.PROPERTY_DESCRIPTION;
+ public static final String SCALE_VALUE_GROUP = ScaleValue.PROPERTY_GROUP;
+ public static final String FUNCTION = ComputableCriteria.PROPERTY_FUNCTION;
+ public static final String FUNCTION_LOW = Function.PROPERTY_LOW;
+ public static final String FUNCTION_ENTERED = Function.PROPERTY_ENTERED;
+ public static final String FUNCTION_WEIGHTS = Function.PROPERTY_WEIGHTS;
+ public static final String FUNCTION_CONSIST = Function.PROPERTY_CONSIST;
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/MexicoXmlConstant.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,46 @@
+package fr.inra.masc.io;
+
+import fr.ifremer.mexico.model.Domain;
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.Factor;
+import fr.ifremer.mexico.model.Feature;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.ifremer.mexico.model.Scenario;
+
+/**
+ * Regroup all mexico xml constants tags
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MexicoXmlConstant {
+
+ public static final String EXPERIMENT_DESIGN = ExperienceDesign.class.getSimpleName().toLowerCase();
+ public static final String EXPERIMENT_DESIGN_DATE = ExperienceDesign.PROPERTY_DATE;
+ public static final String EXPERIMENT_DESIGN_ID = ExperienceDesign.PROPERTY_ID;
+ public static final String EXPERIMENT_DESIGN_AUTHOR = ExperienceDesign.PROPERTY_AUTHOR;
+ public static final String EXPERIMENT_DESIGN_LICENCE = ExperienceDesign.PROPERTY_LICENCE;
+ public static final String EXPERIMENT_DESIGN_DESCRIPTION = ExperienceDesign.PROPERTY_DESCRIPTION;
+ public static final String FACTORS = ExperienceDesign.PROPERTY_FACTORS;
+ public static final String FACTOR = Factor.class.getSimpleName().toLowerCase();
+ public static final String FACTOR_ID = Factor.PROPERTY_ID;
+ public static final String FACTOR_NAME = Factor.PROPERTY_NAME;
+ public static final String FACTOR_UNIT = Factor.PROPERTY_UNIT;
+ public static final String FACTOR_DESCRIPTION = Factor.PROPERTY_DESCRIPTION;
+ public static final String DOMAIN = Factor.PROPERTY_DOMAIN;
+ public static final String DOMAIN_NAME = Domain.PROPERTY_NAME;
+ public static final String DOMAIN_DISTRIBUTION_PARAMETER = Domain.PROPERTY_DISTRIBUTION_PARAMETER;
+ public static final String DOMAIN_LEVEL = Domain.PROPERTY_LEVEL;
+ public static final String DOMAIN_VALUE_TYPE = Domain.PROPERTY_VALUE_TYPE;
+ public static final String DOMAIN_NOMINAL_VALUE = Domain.PROPERTY_NOMINAL_VALUE;
+ public static final String FEATURE = Feature.class.getSimpleName().toLowerCase();
+ public static final String FEATURE_NAME = Feature.PROPERTY_NAME;
+ public static final String FEATURE_VALUE = Feature.PROPERTY_VALUE;
+ public static final String FEATURE_VALUE_TYPE = Feature.PROPERTY_VALUE_TYPE;
+ public static final String INPUT_DESIGN = InputDesign.class.getSimpleName().toLowerCase();
+ public static final String INPUT_DESIGN_DATE = InputDesign.PROPERTY_DATE;
+ public static final String SCENARIO = Scenario.class.getSimpleName().toLowerCase();
+ public static final String SCENARIO_NAME = Scenario.PROPERTY_NAME;
+ public static final String SCENARIO_ORDER_NUMBER = Scenario.PROPERTY_ORDER_NUMBER;
+ public static final String SCENARIO_FACTOR_VALUES = Scenario.PROPERTY_FACTOR_VALUES;
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/ExperienceDesignParser.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,215 @@
+package fr.inra.masc.io.parser;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import fr.ifremer.mexico.model.Domain;
+import fr.ifremer.mexico.model.DomainImpl;
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperienceDesignImpl;
+import fr.ifremer.mexico.model.Factor;
+import fr.ifremer.mexico.model.FactorImpl;
+import fr.ifremer.mexico.model.Feature;
+import fr.ifremer.mexico.model.FeatureImpl;
+import fr.ifremer.mexico.model.ValueType;
+import fr.inra.masc.MascTechnicalException;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_DISTRIBUTION_PARAMETER;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_LEVEL;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NOMINAL_VALUE;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_VALUE_TYPE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_AUTHOR;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DATE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_ID;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_LICENCE;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTORS;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE_TYPE;
+
+/**
+* @author sletellier <letellier(a)codelutin.com>
+*/
+public class ExperienceDesignParser extends MexicoXmlParser<ExperienceDesign> {
+
+ protected Map<String, Factor> factors;
+
+ public ExperienceDesignParser(File file) throws FileNotFoundException {
+ super(file);
+ this.factors = Maps.newHashMap();
+ }
+
+ @Override
+ protected ExperienceDesign parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException {
+ ExperienceDesign model = new ExperienceDesignImpl();
+
+ parseExperienceDesignMeta(parser, model);
+ parseFactors(parser, model);
+
+ return model;
+ }
+
+ protected void parseExperienceDesignMeta(XmlPullParser parser, ExperienceDesign model) throws IOException, XmlPullParserException, ParseException {
+
+ // file must start with experiment design tag
+ if (parser.nextTag() == XmlPullParser.START_TAG &&
+ !parserEqual(parser, EXPERIMENT_DESIGN)) {
+ throw new MascTechnicalException("Experiment design file must start with " + EXPERIMENT_DESIGN + " tag");
+ }
+
+ // parse experiment design id
+ String id = parser.getAttributeValue(null, EXPERIMENT_DESIGN_ID);
+ model.setId(id);
+
+ // parse date
+ String dateAsString = parser.getAttributeValue(null, EXPERIMENT_DESIGN_DATE);
+ model.setDate(parseDate(dateAsString));
+
+ // parse author
+ String author = parser.getAttributeValue(null, EXPERIMENT_DESIGN_AUTHOR);
+ model.setAuthor(author);
+
+ // parse license
+ String license = parser.getAttributeValue(null, EXPERIMENT_DESIGN_LICENCE);
+ model.setLicence(license);
+
+ // parse description
+ if (parser.nextTag() == XmlPullParser.START_TAG &&
+ parserEqual(parser, EXPERIMENT_DESIGN_DESCRIPTION)) {
+
+ model.setDescription(parser.nextText());
+
+ // read next tag
+ parser.nextTag();
+ }
+ }
+ protected void parseFactors(XmlPullParser parser, ExperienceDesign model) throws IOException, XmlPullParserException {
+
+ // factors
+ int eventType = parser.getEventType();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FACTORS)) {
+
+ List<Factor> factors = Lists.newArrayList();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, FACTORS))) {
+
+ // factor
+ factors.add(parseFactor(parser));
+ }
+ model.setFactors(factors);
+ }
+
+ // read experience design next tag
+ parser.nextTag();
+ }
+
+ protected Factor parseFactor(XmlPullParser parser) throws IOException, XmlPullParserException {
+
+ Factor factor = new FactorImpl();
+
+ // parse description
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FACTOR_DESCRIPTION)) {
+ factor.setDescription(parser.nextText());
+
+ // read function close tag
+ eventType = parser.nextTag();
+ }
+
+ // domain
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, DOMAIN)) {
+ factor.setDomain(parseDomain(parser));
+ }
+
+ // features
+ if (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, FEATURE)) {
+
+ List<Feature> features = Lists.newArrayList();
+
+ while (parserEqual(parser, FEATURE)) {
+
+ // feature
+ features.add(parseFeature(parser));
+
+ // read feature close tag
+ parser.nextTag();
+
+ // read next tag
+ parser.nextTag();
+ }
+ factor.setFeatures(features);
+ }
+
+ // keep factors
+ factors.put(factor.getId(), factor);
+
+ return factor;
+ }
+ protected Domain parseDomain(XmlPullParser parser) throws XmlPullParserException {
+ Domain domain = new DomainImpl();
+
+ // name
+ String name = parser.getAttributeValue(null, DOMAIN_NAME);
+ domain.setName(name);
+
+ // distributionParameter
+ String distributionParameter = parser.getAttributeValue(null, DOMAIN_DISTRIBUTION_PARAMETER);
+ domain.setDistributionParameter(distributionParameter);
+
+ // level
+ String level = parser.getAttributeValue(null, DOMAIN_LEVEL);
+ domain.setLevel(Integer.parseInt(level));
+
+ // valueType
+ String valueType = parser.getAttributeValue(null, DOMAIN_VALUE_TYPE);
+ domain.setValueType(ValueType.valueOf(valueType));
+
+ // nominaleValue
+ // TODO sletellier 20111215 : take care of type
+ String nominaleValue = parser.getAttributeValue(null, DOMAIN_NOMINAL_VALUE);
+ domain.setNominalValue(nominaleValue);
+
+ return domain;
+ }
+
+ protected Feature parseFeature(XmlPullParser parser) {
+ Feature feature = new FeatureImpl();
+
+ // name
+ String name = parser.getAttributeValue(null, FEATURE_NAME);
+ feature.setName(name);
+
+ // value
+ // TODO sletellier 20111215 : take care of type
+ String value = parser.getAttributeValue(null, FEATURE_VALUE);
+ feature.setValue(value);
+
+ // value type
+ String valueType = parser.getAttributeValue(null, FEATURE_VALUE_TYPE);
+ feature.setValueType(ValueType.valueOf(valueType));
+
+ return feature;
+ }
+
+ public Map<String, Factor> getFactors() {
+ return factors;
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/InputDesignParser.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,126 @@
+package fr.inra.masc.io.parser;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.Factor;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.ifremer.mexico.model.InputDesignImpl;
+import fr.ifremer.mexico.model.Scenario;
+import fr.ifremer.mexico.model.ScenarioImpl;
+import fr.inra.masc.MascTechnicalException;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR;
+import static fr.inra.masc.io.MexicoXmlConstant.INPUT_DESIGN;
+import static fr.inra.masc.io.MexicoXmlConstant.INPUT_DESIGN_DATE;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO_FACTOR_VALUES;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO_ORDER_NUMBER;
+
+/**
+* @author sletellier <letellier(a)codelutin.com>
+*/
+public class InputDesignParser extends MexicoXmlParser<InputDesign> {
+
+ protected ExperienceDesignParser experienceDesignParser;
+
+ public InputDesignParser(File file) throws FileNotFoundException {
+ super(file);
+ experienceDesignParser = new ExperienceDesignParser(file);
+ }
+
+ @Override
+ protected InputDesign parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException {
+ InputDesign model = new InputDesignImpl();
+
+ parseInputDesignMeta(parser, model);
+
+ // parse experiment design
+ ExperienceDesign experienceDesign = experienceDesignParser.parseModel(parser);
+ model.setExperienceDesign(experienceDesign);
+
+ parseScenarios(parser, model);
+
+ return model;
+ }
+
+ protected void parseInputDesignMeta(XmlPullParser parser, InputDesign model) throws IOException, XmlPullParserException, ParseException {
+
+ // file must start with input design tag
+ if (parser.next() == XmlPullParser.START_TAG &&
+ !parserEqual(parser, INPUT_DESIGN)) {
+ throw new MascTechnicalException("Input design file must start with " + INPUT_DESIGN + " tag");
+ }
+
+ // parse date
+ String dateAsString = parser.getAttributeValue(null, INPUT_DESIGN_DATE);
+ model.setDate(parseDate(dateAsString));
+ }
+
+ protected void parseScenarios(XmlPullParser parser, InputDesign model) throws IOException, XmlPullParserException {
+
+ // scenarios
+ if (parser.nextTag() == XmlPullParser.START_TAG &&
+ parserEqual(parser, SCENARIO)) {
+
+ List<Scenario> scenarios = Lists.newArrayList();
+ while (!(parser.getEventType() == XmlPullParser.END_TAG &&
+ parserEqual(parser, INPUT_DESIGN))) {
+
+ // factor
+ scenarios.add(parseScenario(parser));
+ }
+ model.setScenarios(scenarios);
+ }
+ }
+
+ protected Scenario parseScenario(XmlPullParser parser) throws IOException, XmlPullParserException {
+ Scenario scenario = new ScenarioImpl();
+
+ // name
+ String name = parser.getAttributeValue(null, SCENARIO_NAME);
+ scenario.setName(name);
+
+ // orderValue
+ String orderValue = parser.getAttributeValue(null, SCENARIO_ORDER_NUMBER);
+ scenario.setOrderNumber(Integer.parseInt(orderValue));
+
+ // factor values
+ if (parser.nextTag() == XmlPullParser.START_TAG &&
+ parserEqual(parser, SCENARIO_FACTOR_VALUES)) {
+
+ Map<Factor, Object> factorValues = Maps.newHashMap();
+ while (!(parser.getEventType() == XmlPullParser.END_TAG &&
+ parserEqual(parser, SCENARIO))) {
+
+ // get factor
+ String factorId = parser.getAttributeValue(null, FACTOR);
+ Factor factor = experienceDesignParser.getFactors().get(factorId);
+
+ // factor value
+ String value = parser.nextText();
+
+ factorValues.put(factor, value);
+
+ // read next tag
+ parser.nextTag();
+ }
+ scenario.setFactorValues(factorValues);
+ }
+
+ // read next tag
+ parser.nextTag();
+
+ return scenario;
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/parser/MascModelParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/MascModelParser.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/MascModelParser.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,372 @@
+package fr.inra.masc.io.parser;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import fr.inra.masc.MascTechnicalException;
+import fr.inra.masc.model.ComputableCriteria;
+import fr.inra.masc.model.ComputableCriteriaImpl;
+import fr.inra.masc.model.Criteria;
+import fr.inra.masc.model.Function;
+import fr.inra.masc.model.FunctionImpl;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.MascModelImpl;
+import fr.inra.masc.model.Option;
+import fr.inra.masc.model.OptionImpl;
+import fr.inra.masc.model.OptionValue;
+import fr.inra.masc.model.OptionValueImpl;
+import fr.inra.masc.model.ScaleGroup;
+import fr.inra.masc.model.ScaleValue;
+import fr.inra.masc.model.ScaleValueImpl;
+import fr.inra.masc.model.ThresholdCriteria;
+import fr.inra.masc.model.ThresholdCriteriaImpl;
+import fr.inra.masc.model.ValuedCriteriaImpl;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import static fr.inra.masc.io.MascXmlConstant.ATTRIBUTE;
+import static fr.inra.masc.io.MascXmlConstant.CRITERIA_DESCRIPTION;
+import static fr.inra.masc.io.MascXmlConstant.CRITERIA_NAME;
+import static fr.inra.masc.io.MascXmlConstant.DEXI;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_CONSIST;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_ENTERED;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_LOW;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_WEIGHTS;
+import static fr.inra.masc.io.MascXmlConstant.LINE;
+import static fr.inra.masc.io.MascXmlConstant.MODEL_DESCRIPTION;
+import static fr.inra.masc.io.MascXmlConstant.MODEL_NAME;
+import static fr.inra.masc.io.MascXmlConstant.OPTION;
+import static fr.inra.masc.io.MascXmlConstant.SCALE;
+import static fr.inra.masc.io.MascXmlConstant.SCALE_VALUE_DESCRIPTION;
+import static fr.inra.masc.io.MascXmlConstant.SCALE_VALUE_GROUP;
+import static fr.inra.masc.io.MascXmlConstant.SCALE_VALUE_NAME;
+import static fr.inra.masc.io.MascXmlConstant.SETTINGS;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ */
+public class MascModelParser extends XmlParser<MascModel> {
+
+ protected Multimap<String,Integer> thresholds;
+
+ public MascModelParser(File file, Multimap<String,Integer> thresholds) throws FileNotFoundException {
+ super(file);
+ this.thresholds = thresholds;
+ }
+
+ @Override
+ protected MascModel parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException {
+ MascModel model = new MascModelImpl();
+
+ parseMeta(parser, model);
+ parseAttributes(parser, model);
+
+ return model;
+ }
+
+ protected void parseMeta(XmlPullParser parser, MascModel model) throws IOException, XmlPullParserException {
+
+ // file must start with DEXi tag
+ if (parser.next() == XmlPullParser.START_TAG &&
+ !parserEqual(parser, DEXI)) {
+ throw new MascTechnicalException("Masc file must start with " + DEXI + " tag");
+ }
+
+ // start parsing model attributes
+ // parse name
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, MODEL_NAME)) {
+ model.setName(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse description
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, MODEL_DESCRIPTION)) {
+
+ List<String> descriptions = Lists.newArrayList();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, MODEL_DESCRIPTION))) {
+
+ if (parserEqual(parser, LINE)) {
+ descriptions.add(parser.nextText());
+ }
+ }
+
+ model.setDescription(descriptions);
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse options
+ List<Option> options = Lists.newLinkedList();
+ while (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, OPTION)) {
+
+ Option option = new OptionImpl();
+ option.setName(parser.nextText());
+ options.add(option);
+
+ // read end option tag
+ eventType = parser.nextTag();
+ }
+ model.setOption(options);
+
+ // parse settings
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, SETTINGS)) {
+
+ Map<String, String> settings = new LinkedHashMap<String, String>();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, SETTINGS))) {
+ settings.put(parser.getName(), parser.nextText());
+ }
+ model.setSettings(settings);
+
+ // read next tag
+ parser.nextTag();
+ }
+ }
+
+ protected void parseAttributes(XmlPullParser parser, MascModel model) throws IOException, XmlPullParserException {
+ List<Criteria> criterias = Lists.newArrayList();
+ while (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, ATTRIBUTE)) {
+
+ Criteria criteria = parseAttribute(parser, model);
+ criterias.add(criteria);
+
+ // Read closeTag
+ parser.nextTag();
+ }
+ model.setCriteria(criterias);
+ }
+
+ protected Criteria parseAttribute(XmlPullParser parser, MascModel model) throws IOException, XmlPullParserException {
+
+ // parse name
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ !parserEqual(parser, CRITERIA_NAME)) {
+
+ throw new MascTechnicalException("All criteria must have a name");
+ }
+ String name = parser.nextText();
+
+ // read next tag
+ eventType = parser.nextTag();
+
+ // parse description
+ String description = null;
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, CRITERIA_DESCRIPTION)) {
+
+ description = parser.nextText();
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse scales
+ if (eventType == XmlPullParser.START_TAG &&
+ !parserEqual(parser, SCALE)) {
+
+ throw new MascTechnicalException("All criteria must have a scalesValue");
+ }
+ List<ScaleValue> scaleValues = parseScale(parser);
+
+ // parse function
+ Function function = null;
+ if (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION)) {
+
+ function = parseFunction(parser);
+ }
+
+ // parse option value
+ int optionValueCnt = 0;
+ List<OptionValue> optionValues = Lists.newLinkedList();
+ while (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, OPTION)) {
+
+ OptionValue optionValue = new OptionValueImpl();
+ optionValue.setValue(Integer.parseInt(parser.nextText()));
+ Option option = model.getOption(optionValueCnt++);
+
+ // initialize option value list
+ if (option.getOptionValue() == null) {
+ LinkedList<OptionValue> optionValuesList = Lists.newLinkedList();
+ option.setOptionValue(optionValuesList);
+ }
+ option.addOptionValue(optionValue);
+ optionValues.add(optionValue);
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse attributes
+ List<Criteria> criterias = new ArrayList<Criteria>();
+ if (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, ATTRIBUTE)) {
+
+ while (!(parser.getEventType() == XmlPullParser.END_TAG &&
+ parserEqual(parser, ATTRIBUTE))) {
+
+ criterias.add(parseAttribute(parser, model));
+ parser.nextTag();
+ }
+ }
+
+ Criteria current;
+ if (function != null) {
+
+ // non editable criteria
+ ComputableCriteria computableCriteria = new ComputableCriteriaImpl();
+ computableCriteria.setFunction(function);
+ current = computableCriteria;
+ } else {
+
+ // editable criteria
+ // check on properties if its a threshold criteria
+ if (thresholds.containsKey(name)) {
+ ThresholdCriteria thresholdCriteria = new ThresholdCriteriaImpl();
+ Collection<Integer> values = thresholds.get(name);
+ thresholdCriteria.setValues(values);
+ current = thresholdCriteria;
+ } else {
+ // else is a valued one
+ current = new ValuedCriteriaImpl();
+ }
+ }
+
+ // fill options values
+ for (OptionValue optionValue : optionValues) {
+ optionValue.setCriteria(current);
+ }
+
+ // fill criteria
+ current.setName(name);
+ current.setDescription(description);
+ current.setScale(scaleValues);
+ current.setChildren(criterias);
+
+ return current;
+ }
+
+ protected List<ScaleValue> parseScale(XmlPullParser parser) throws IOException, XmlPullParserException {
+
+ List<ScaleValue> scaleValues = new ArrayList<ScaleValue>();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, SCALE))) {
+
+ // parse name
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ !parserEqual(parser, SCALE_VALUE_NAME)) {
+
+ throw new MascTechnicalException("All scale value must have a name");
+ }
+ ScaleValue scaleValue = new ScaleValueImpl();
+ scaleValue.setName(parser.nextText());
+ eventType = parser.nextTag();
+
+ // parse description
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, SCALE_VALUE_DESCRIPTION)) {
+
+ scaleValue.setDescription(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse group
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, SCALE_VALUE_GROUP)) {
+
+ String groupValue = parser.nextText();
+ scaleValue.setGroup(ScaleGroup.valueOf(groupValue));
+
+ // read next tag
+ parser.nextTag();
+ }
+ scaleValues.add(scaleValue);
+ }
+ // read scale close tag
+ parser.nextTag();
+
+ return scaleValues;
+ }
+
+ protected Function parseFunction(XmlPullParser parser) throws IOException, XmlPullParserException {
+ Function function = new FunctionImpl();
+
+ // parse low
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_LOW)) {
+
+ function.setLow(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse entered
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_ENTERED)) {
+
+ function.setEntered(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse weights
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_WEIGHTS)) {
+
+ function.setWeights(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse consist
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_CONSIST)) {
+
+ function.setConsist(Boolean.parseBoolean(parser.nextText()));
+
+ // read next tag
+ parser.nextTag();
+ }
+
+ // read function close tag
+ parser.nextTag();
+
+ return function;
+ }
+
+ @Override
+ public boolean parserEqual(XmlPullParser parser, String name) {
+ String tagName = parser.getName();
+ return tagName.equalsIgnoreCase(name);
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/parser/MexicoXmlParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/MexicoXmlParser.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/MexicoXmlParser.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,22 @@
+package fr.inra.masc.io.parser;
+
+import fr.inra.masc.io.DateFormatFactory;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.text.ParseException;
+import java.util.Date;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ */
+public abstract class MexicoXmlParser<M> extends XmlParser<M> {
+
+ public MexicoXmlParser(File file) throws FileNotFoundException {
+ super(file);
+ }
+
+ public Date parseDate(String toParse) throws ParseException {
+ return DateFormatFactory.getMexicoDateFormat().parse(toParse);
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/parser/XmlParser.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,42 @@
+package fr.inra.masc.io.parser;
+
+import fr.inra.masc.io.DateFormatFactory;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.text.ParseException;
+
+/**
+ * Abstract parser to get model from xml file using XPP3
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public abstract class XmlParser<M> extends FileReader {
+
+ public XmlParser(File file) throws FileNotFoundException {
+ super(file);
+ }
+
+ public M getModel() throws XmlPullParserException, IOException, ParseException {
+
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ XmlPullParser parser = factory.newPullParser();
+ parser.setInput(this);
+
+ // parse model
+ return parseModel(parser);
+ }
+
+ protected abstract M parseModel(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException;
+
+ public boolean parserEqual(XmlPullParser parser, String name) {
+ String tagName = parser.getName();
+ return tagName.equals(name);
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/writer/DexiXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/DexiXmlWriter.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/DexiXmlWriter.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,174 @@
+package fr.inra.masc.io.writer;
+
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Multimap;
+import fr.inra.masc.model.ComputableCriteria;
+import fr.inra.masc.model.Criteria;
+import fr.inra.masc.model.Function;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.Option;
+import fr.inra.masc.model.OptionValue;
+import fr.inra.masc.model.ScaleValue;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+
+import static fr.inra.masc.io.MascXmlConstant.ATTRIBUTE;
+import static fr.inra.masc.io.MascXmlConstant.CRITERIA_DESCRIPTION;
+import static fr.inra.masc.io.MascXmlConstant.CRITERIA_NAME;
+import static fr.inra.masc.io.MascXmlConstant.DEXI;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_CONSIST;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_ENTERED;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_LOW;
+import static fr.inra.masc.io.MascXmlConstant.FUNCTION_WEIGHTS;
+import static fr.inra.masc.io.MascXmlConstant.LINE;
+import static fr.inra.masc.io.MascXmlConstant.MODEL_DESCRIPTION;
+import static fr.inra.masc.io.MascXmlConstant.MODEL_NAME;
+import static fr.inra.masc.io.MascXmlConstant.OPTION;
+import static fr.inra.masc.io.MascXmlConstant.SCALE;
+import static fr.inra.masc.io.MascXmlConstant.SCALE_VALUE;
+import static fr.inra.masc.io.MascXmlConstant.SCALE_VALUE_DESCRIPTION;
+import static fr.inra.masc.io.MascXmlConstant.SCALE_VALUE_GROUP;
+import static fr.inra.masc.io.MascXmlConstant.SCALE_VALUE_NAME;
+import static fr.inra.masc.io.MascXmlConstant.SETTINGS;
+
+/**
+ * Writer to create DEXi file with {@link MascModel} model
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class DexiXmlWriter extends XmlWriter<MascModel> {
+
+ protected Multimap<Criteria, OptionValue> criteriaOptionValues;
+
+ public DexiXmlWriter(File file, MascModel model) throws IOException {
+ super(file, model);
+ this.criteriaOptionValues = LinkedListMultimap.create();
+ }
+
+ @Override
+ public XmlNode getRootElement() {
+ XmlNode rootXmlNode = new XmlNode(DEXI);
+ composeMeta(rootXmlNode);
+ composeAttributes(rootXmlNode);
+
+ return rootXmlNode;
+ }
+
+ protected void composeMeta(XmlNode rootXmlNode) {
+
+ // model name
+ add(rootXmlNode, MODEL_NAME, model.getName());
+
+ // model description
+ XmlNode descriptionXmlNode = createElement(rootXmlNode, MODEL_DESCRIPTION);
+ for (String line : model.getDescription()) {
+ add(descriptionXmlNode, LINE, line);
+ }
+
+ // options
+ for (Option option : model.getOption()) {
+ add(rootXmlNode, OPTION, option.getName());
+
+ // load all option values
+ for (OptionValue optionValue : option.getOptionValue()) {
+
+ // fill map
+ Criteria criteria = optionValue.getCriteria();
+ criteriaOptionValues.put(criteria, optionValue);
+ }
+ }
+
+ // settings
+ Map<String,String> settings = model.getSettings();
+ if (MapUtils.isNotEmpty(settings)) {
+ XmlNode settingXmlNode = createElement(rootXmlNode, SETTINGS);
+ for (String settingName : settings.keySet()) {
+ String settingsValue = settings.get(settingName);
+ add(settingXmlNode, settingName, settingsValue);
+ }
+ }
+ }
+
+ protected void composeAttributes(XmlNode rootXmlNode) {
+ Collection<Criteria> criterias = model.getCriteria();
+ if (CollectionUtils.isNotEmpty(criterias)) {
+ for (Criteria criteria : criterias) {
+ composeAttribute(criteria, rootXmlNode);
+ }
+ }
+ }
+
+ protected void composeAttribute(Criteria criteria, XmlNode rootXmlNode) {
+ XmlNode attributeXmlNode = createElement(rootXmlNode, ATTRIBUTE);
+
+ // attribute name
+ add(attributeXmlNode, CRITERIA_NAME, criteria.getName());
+
+ // attribute description
+ add(attributeXmlNode, CRITERIA_DESCRIPTION, criteria.getDescription());
+
+ // scale
+ XmlNode scaleXmlNode = createElement(attributeXmlNode, SCALE);
+
+ // scale values
+ for (ScaleValue scaleValue : criteria.getScale()) {
+ XmlNode scaleValueXmlNode = createElement(scaleXmlNode, SCALE_VALUE);
+ add(scaleValueXmlNode, SCALE_VALUE_NAME, scaleValue.getName());
+ add(scaleValueXmlNode, SCALE_VALUE_DESCRIPTION, scaleValue.getDescription());
+ add(scaleValueXmlNode, SCALE_VALUE_GROUP, scaleValue.getGroup());
+ }
+
+ // function
+ if (criteria instanceof ComputableCriteria) {
+ ComputableCriteria computableCriteria = (ComputableCriteria) criteria;
+ XmlNode functionXmlNode = createElement(attributeXmlNode, FUNCTION);
+ Function function = computableCriteria.getFunction();
+ add(functionXmlNode, FUNCTION_LOW, function.getLow());
+ add(functionXmlNode, FUNCTION_ENTERED, function.getEntered());
+ add(functionXmlNode, FUNCTION_WEIGHTS, function.getWeights());
+ add(functionXmlNode, FUNCTION_CONSIST, function.getConsist());
+ }
+
+ // options
+ Collection<OptionValue> optionValues = criteriaOptionValues.get(criteria);
+ for (OptionValue optionValue : optionValues) {
+ add(attributeXmlNode, OPTION, optionValue.getValue());
+ }
+
+ // children
+ for (Criteria child : criteria.getChildren()) {
+ composeAttribute(child, attributeXmlNode);
+ }
+ }
+
+ protected void add(XmlNode parentXmlNode, String tagName, Object value) {
+ if (value != null) {
+ String toString = value.toString();
+
+ // boolean are capitalized in masc xml file
+ if (value instanceof Boolean) {
+ toString = StringUtils.capitalize(toString);
+ }
+ createElement(parentXmlNode, tagName, toString);
+ }
+ }
+
+ // Override to upper case tagNames
+ public XmlNode createElement(XmlNode parentXmlNode, String tagName) {
+ return createElement(parentXmlNode, tagName, null);
+ }
+
+ public XmlNode createElement(XmlNode parentXmlNode, String tagName, String text) {
+ XmlNode xmlNode = XmlNode.createElement(tagName.toUpperCase(), text);
+ parentXmlNode.add(xmlNode);
+ return xmlNode;
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/ExperienceDesignXmlWriter.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,113 @@
+package fr.inra.masc.io.writer;
+
+import fr.ifremer.mexico.model.Domain;
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.Factor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Date;
+
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_DISTRIBUTION_PARAMETER;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_LEVEL;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_NOMINAL_VALUE;
+import static fr.inra.masc.io.MexicoXmlConstant.DOMAIN_VALUE_TYPE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_AUTHOR;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DATE;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_ID;
+import static fr.inra.masc.io.MexicoXmlConstant.EXPERIMENT_DESIGN_LICENCE;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTORS;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_DESCRIPTION;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_ID;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR_UNIT;
+
+/**
+ * Writer to create experiment design file with {@link ExperienceDesign} model
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class ExperienceDesignXmlWriter extends MexicoXmlWriter<ExperienceDesign> {
+
+ public ExperienceDesignXmlWriter(File file, ExperienceDesign model) throws IOException {
+ super(file, model);
+ }
+
+ @Override
+ public XmlNode getRootElement() {
+
+ XmlNode rootXmlNode = new XmlNode(EXPERIMENT_DESIGN);
+ composeExperienceDesignMeta(rootXmlNode);
+ composeFactors(rootXmlNode);
+
+ // TODO sletellier 2011/12/14 : implement workflow
+ // composeWorkFlow(rootXmlNode);
+
+ return rootXmlNode;
+ }
+
+ protected void composeExperienceDesignMeta(XmlNode rootXmlNode) {
+
+ // date
+ Date date = model.getDate();
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_DATE, formatDate(date));
+
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_ID, model.getId());
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_AUTHOR, model.getAuthor());
+ addParameter(rootXmlNode, EXPERIMENT_DESIGN_LICENCE, model.getLicence());
+
+ // description
+ String description = model.getDescription();
+ if (StringUtils.isNotEmpty(description)) {
+ XmlNode.createElement(rootXmlNode, EXPERIMENT_DESIGN_DESCRIPTION, description);
+ }
+ }
+
+ protected void composeFactors(XmlNode rootXmlNode) {
+ Collection<Factor> factors = model.getFactors();
+
+ // do nothing if no factors in model
+ if (factors.isEmpty()) {
+ return;
+ }
+
+ // creating factors node
+ XmlNode factorsXmlNode = XmlNode.createElement(rootXmlNode, FACTORS);
+ for (Factor factor : factors) {
+
+ // factor
+ XmlNode factorXmlNode = XmlNode.createElement(factorsXmlNode, FACTOR);
+ addParameter(factorXmlNode, FACTOR_ID, factor.getId());
+ addParameter(factorXmlNode, FACTOR_NAME, factor.getName());
+ addParameter(factorXmlNode, FACTOR_UNIT, factor.getUnit());
+
+ // description
+ String description = model.getDescription();
+ if (StringUtils.isNotEmpty(description)) {
+ XmlNode.createElement(factorXmlNode, FACTOR_DESCRIPTION, factor.getDescription());
+ }
+
+ // domain
+ Domain domain = factor.getDomain();
+ if (domain != null) {
+ XmlNode domainXmlNode = XmlNode.createElement(factorXmlNode, DOMAIN);
+ addParameter(domainXmlNode, DOMAIN_NAME, domain.getName());
+ addParameter(domainXmlNode, DOMAIN_DISTRIBUTION_PARAMETER, domain.getDistributionParameter());
+ addParameter(domainXmlNode, DOMAIN_LEVEL, String.valueOf(domain.getLevel()));
+ addParameter(domainXmlNode, DOMAIN_VALUE_TYPE, domain.getValueType());
+ addParameter(domainXmlNode, DOMAIN_NOMINAL_VALUE, domain.getNominalValue());
+ }
+
+ // features
+ addAllFeature(factorXmlNode, factor.getFeatures());
+ }
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/InputDesignXmlWriter.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,71 @@
+package fr.inra.masc.io.writer;
+
+import fr.ifremer.mexico.model.Factor;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.ifremer.mexico.model.Scenario;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+
+import static fr.inra.masc.io.MexicoXmlConstant.FACTOR;
+import static fr.inra.masc.io.MexicoXmlConstant.INPUT_DESIGN;
+import static fr.inra.masc.io.MexicoXmlConstant.INPUT_DESIGN_DATE;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO_FACTOR_VALUES;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.SCENARIO_ORDER_NUMBER;
+
+/**
+ * Writer to create input design file with {@link fr.ifremer.mexico.model.InputDesign} model
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class InputDesignXmlWriter extends MexicoXmlWriter<InputDesign> {
+
+ public InputDesignXmlWriter(File file, InputDesign model) throws IOException {
+ super(file, model);
+ }
+
+ @Override
+ public XmlNode getRootElement() {
+ XmlNode rootXmlNode = new XmlNode(INPUT_DESIGN);
+ composeInputDesignMeta(rootXmlNode);
+ composeScenarios(rootXmlNode);
+
+ return rootXmlNode;
+ }
+
+ protected void composeInputDesignMeta(XmlNode rootXmlNode) {
+
+ // date
+ Date date = model.getDate();
+ addParameter(rootXmlNode, INPUT_DESIGN_DATE, formatDate(date));
+
+ // experiement design
+ rootXmlNode.add(getRootElement());
+ }
+
+ protected void composeScenarios(XmlNode rootXmlNode) {
+
+ // scenarios
+ for (Scenario scenario : model.getScenarios()) {
+ XmlNode scenariosXmlNode = XmlNode.createElement(rootXmlNode, SCENARIO);
+ addParameter(scenariosXmlNode, SCENARIO_NAME, scenario.getName());
+ addParameter(scenariosXmlNode, SCENARIO_ORDER_NUMBER, scenario.getOrderNumber());
+
+ // factor values
+ Map<Factor,Object> factorValues = scenario.getFactorValues();
+ for (Map.Entry<Factor,Object> entry : factorValues.entrySet()) {
+ Object value = entry.getValue();
+ XmlNode factorValueXmlNode = XmlNode.createElement(scenariosXmlNode, SCENARIO_FACTOR_VALUES, String.valueOf(value));
+ factorValueXmlNode.addAttribute(FACTOR, entry.getKey().getId());
+ }
+
+ // features
+ addAllFeature(scenariosXmlNode, scenario.getFeatures());
+ }
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/MexicoXmlWriter.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,48 @@
+package fr.inra.masc.io.writer;
+
+import fr.ifremer.mexico.model.Feature;
+import fr.inra.masc.io.DateFormatFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Date;
+
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_NAME;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE;
+import static fr.inra.masc.io.MexicoXmlConstant.FEATURE_VALUE_TYPE;
+
+/**
+ * Abstract writer create mexico files with specific model
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public abstract class MexicoXmlWriter<M> extends XmlWriter<M> {
+
+ protected MexicoXmlWriter(File file, M model) throws IOException {
+ super(file, model);
+ }
+
+ public void addParameter(XmlNode xmlNode, String parameterName, Object value) {
+ if (value != null) {
+ xmlNode.addAttribute(parameterName, value.toString());
+ }
+ }
+
+ protected void addAllFeature(XmlNode factorXmlNode, Collection<Feature> features) {
+ if (features != null) {
+ for (Feature feature : features) {
+ XmlNode featureXmlNode = XmlNode.createElement(factorXmlNode, FEATURE);
+ addParameter(featureXmlNode, FEATURE_NAME, feature.getName());
+ addParameter(featureXmlNode, FEATURE_VALUE, feature.getValue());
+ addParameter(featureXmlNode, FEATURE_VALUE_TYPE, feature.getValueType());
+ }
+ }
+ }
+
+ public String formatDate(Date toFormat) {
+ return DateFormatFactory.getMexicoDateFormat().format(toFormat);
+ }
+}
Copied: masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlNode.java (from rev 519, masc/masc-api/src/main/java/fr/inra/masc/io/Element.java)
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlNode.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlNode.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,115 @@
+package fr.inra.masc.io.writer;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Represent an XML node
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class XmlNode {
+
+ public static final String XML_META = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ public static final String CLOSED_TAG = "%s<%s%s/>\n";
+ public static final String START_TAG = "%s<%s%s>";
+ public static final String END_TAG = "%s</%s>\n";
+
+ protected LinkedList<XmlNode> children;
+ protected Map<String, String> attributes;
+ protected String tagName;
+ protected String text;
+
+ public XmlNode(String tagName) {
+ this(tagName, null);
+ }
+
+ public XmlNode(String tagName, String text) {
+ this.tagName = tagName;
+ this.text = text;
+ this.children = Lists.newLinkedList();
+ this.attributes = Maps.newHashMap();
+ }
+
+ public void add(XmlNode e) {
+ this.children.add(e);
+ }
+
+ public void addAttribute(String name, String value) {
+ this.attributes.put(name, value);
+ }
+
+ public String toXml(int indent) {
+ StringBuilder stringBuilder = new StringBuilder(XML_META).append("\n");
+ buildXml(-indent, indent, stringBuilder);
+ return stringBuilder.toString();
+ }
+
+ protected void buildXml(int start, int indent, StringBuilder stringBuilder) {
+
+ // closed tag if content is empty
+ if (children.isEmpty() && StringUtils.isEmpty(text)) {
+ addToBuilder(stringBuilder, CLOSED_TAG, getIndentPrefix(start, indent), tagName);
+ return;
+ }
+
+ // start tag
+ addToBuilder(stringBuilder, START_TAG, getIndentPrefix(start, indent), tagName);
+ if (StringUtils.isNotEmpty(text)) {
+
+ // end inline tag
+ addToBuilder(stringBuilder, END_TAG, StringEscapeUtils.escapeXml(text), tagName);
+ } else {
+ stringBuilder.append("\n");
+ for (XmlNode child : children) {
+ child.buildXml(start + indent, indent, stringBuilder);
+ }
+ // end tag
+ addToBuilder(stringBuilder, END_TAG, getIndentPrefix(start, indent), tagName);
+ }
+ }
+
+ protected void addToBuilder(StringBuilder stringBuilder, String template, String prefix, String tagName) {
+ stringBuilder.append(String.format(template, prefix, tagName, getAttributesAsString()));
+ }
+
+ protected String getIndentPrefix(int start, int lenght) {
+ String result = "";
+ for (int i=0;i<start + lenght;i++) {
+ result += " ";
+ }
+ return result;
+ }
+
+ protected String getAttributesAsString() {
+ StringBuilder builder = new StringBuilder();
+ Set<Map.Entry<String,String>> entries = attributes.entrySet();
+ for (Map.Entry<String,String> entry : entries) {
+
+ // add to builder param like : name="value"
+ builder.append(" ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
+ }
+ return builder.toString();
+ }
+
+ public static XmlNode createElement(XmlNode parentXmlNode, String tagName) {
+ return createElement(parentXmlNode, tagName, null);
+ }
+
+ public static XmlNode createElement(XmlNode parentXmlNode, String tagName, String text) {
+ XmlNode xmlNode = createElement(tagName, text);
+ parentXmlNode.add(xmlNode);
+ return xmlNode;
+ }
+
+ public static XmlNode createElement(String tagName, String text) {
+ return new XmlNode(tagName, text);
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlWriter.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlWriter.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/writer/XmlWriter.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,32 @@
+package fr.inra.masc.io.writer;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * Abstract writer to create xml files using {@link XmlNode}
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public abstract class XmlWriter<M> extends FileWriter {
+
+ public static final int INDENT = 2;
+
+ protected M model;
+
+ public XmlWriter(File file, M model) throws IOException {
+ super(file);
+ this.model = model;
+ }
+
+ public void write() throws IOException {
+
+ String toWrite = getRootElement().toXml(INDENT);
+ super.write(toWrite);
+ }
+
+ public abstract XmlNode getRootElement();
+
+}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java 2011-12-14 15:37:31 UTC (rev 519)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -1,30 +0,0 @@
-package fr.inra.masc.model;
-
-/**
- * Regroup all masc xml constants tags
- *
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class MascXmlConstant {
-
- public static final String DEXI = "DEXi";
- public static final String LINE = "line";
- public static final String ATTRIBUTE = "attribute";
- public static final String MODEL_NAME = MascModel.PROPERTY_NAME;
- public static final String MODEL_DESCRIPTION = MascModel.PROPERTY_DESCRIPTION;
- public static final String OPTION = MascModel.PROPERTY_OPTION;
- public static final String SETTINGS = MascModel.PROPERTY_SETTINGS;
- public static final String CRITERIA_NAME = Criteria.PROPERTY_NAME;
- public static final String CRITERIA_DESCRIPTION = Criteria.PROPERTY_DESCRIPTION;
- public static final String SCALE = Criteria.PROPERTY_SCALE;
- public static final String SCALE_VALUE = ScaleValue.class.getSimpleName();
- public static final String SCALE_VALUE_NAME = ScaleValue.PROPERTY_NAME;
- public static final String SCALE_VALUE_DESCRIPTION = ScaleValue.PROPERTY_DESCRIPTION;
- public static final String SCALE_VALUE_GROUP = ScaleValue.PROPERTY_GROUP;
- public static final String FUNCTION = ComputableCriteria.PROPERTY_FUNCTION;
- public static final String FUNCTION_LOW = Function.PROPERTY_LOW;
- public static final String FUNCTION_ENTERED = Function.PROPERTY_ENTERED;
- public static final String FUNCTION_WEIGHTS = Function.PROPERTY_WEIGHTS;
- public static final String FUNCTION_CONSIST = Function.PROPERTY_CONSIST;
-}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java 2011-12-14 15:37:31 UTC (rev 519)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -1,60 +1,16 @@
package fr.inra.masc.services;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import fr.inra.masc.model.ComputableCriteria;
-import fr.inra.masc.model.ComputableCriteriaImpl;
-import fr.inra.masc.model.Criteria;
-import fr.inra.masc.model.Function;
-import fr.inra.masc.model.FunctionImpl;
+import fr.inra.masc.io.parser.MascModelParser;
import fr.inra.masc.model.MascModel;
-import fr.inra.masc.model.MascModelImpl;
-import fr.inra.masc.model.Option;
-import fr.inra.masc.model.OptionImpl;
-import fr.inra.masc.model.OptionValue;
-import fr.inra.masc.model.OptionValueImpl;
-import fr.inra.masc.model.ScaleGroup;
-import fr.inra.masc.model.ScaleValue;
-import fr.inra.masc.model.ScaleValueImpl;
-import fr.inra.masc.model.ThresholdCriteria;
-import fr.inra.masc.model.ThresholdCriteriaImpl;
-import fr.inra.masc.model.ValuedCriteriaImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
import java.io.File;
import java.io.FileNotFoundException;
-import java.io.FileReader;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.text.ParseException;
-import static fr.inra.masc.model.MascXmlConstant.ATTRIBUTE;
-import static fr.inra.masc.model.MascXmlConstant.CRITERIA_DESCRIPTION;
-import static fr.inra.masc.model.MascXmlConstant.CRITERIA_NAME;
-import static fr.inra.masc.model.MascXmlConstant.DEXI;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_CONSIST;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_ENTERED;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_LOW;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_WEIGHTS;
-import static fr.inra.masc.model.MascXmlConstant.LINE;
-import static fr.inra.masc.model.MascXmlConstant.MODEL_DESCRIPTION;
-import static fr.inra.masc.model.MascXmlConstant.MODEL_NAME;
-import static fr.inra.masc.model.MascXmlConstant.OPTION;
-import static fr.inra.masc.model.MascXmlConstant.SCALE;
-import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_DESCRIPTION;
-import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_GROUP;
-import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_NAME;
-import static fr.inra.masc.model.MascXmlConstant.SETTINGS;
-
/**
* Service use to parse mascXmlFile and build MascModel corresponding
*
@@ -75,12 +31,14 @@
MascModel mascModel = null;
try {
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- XmlPullParser parser = factory.newPullParser();
- parser.setInput(new FileReader(mascFile));
+ MascModelParser mascModelParser = new MascModelParser(mascFile, getConfig().getThresholds());
- // parse model parameters
- mascModel = parseMascModel(parser);
+ try {
+ // parse model
+ mascModel = mascModelParser.getModel();
+ } finally {
+ mascModelParser.close();
+ }
} catch (XmlPullParserException eee) {
throwMascTechnicalException("Failed to parse masc file '" + mascFile.getName() + "'", eee);
@@ -88,314 +46,11 @@
throwMascTechnicalException("Masc file '" + mascFile.getName() + "' not found", eee);
} catch (IOException eee) {
throwMascTechnicalException("Error reading masc file '" + mascFile.getName() + "'", eee);
+ } catch (ParseException eee) {
+ throwMascTechnicalException("Failed to parse masc file '" + mascFile.getName() + "'", eee);
}
return mascModel;
}
- protected MascModel parseMascModel(XmlPullParser parser) throws IOException, XmlPullParserException {
-
- MascModel model = new MascModelImpl();
-
- parseMeta(model, parser);
- parseAttributes(model, parser);
-
- return model;
- }
-
- protected void parseMeta(MascModel model, XmlPullParser parser) throws IOException, XmlPullParserException {
-
- // file must start with DEXi balise
- if (parser.next() == XmlPullParser.START_TAG &&
- !parserEqual(parser, DEXI)) {
- throwMascTechnicalException("Masc file must start with " + DEXI + " tag");
- }
-
- // start parsing model parameters
- // parse name
- int eventType = parser.nextTag();
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, MODEL_NAME)) {
- model.setName(parser.nextText());
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse description
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, MODEL_DESCRIPTION)) {
-
- List<String> descriptions = Lists.newArrayList();
- while (!(parser.nextTag() == XmlPullParser.END_TAG &&
- parserEqual(parser, MODEL_DESCRIPTION))) {
-
- if (parserEqual(parser, LINE)) {
- descriptions.add(parser.nextText());
- }
- }
-
- model.setDescription(descriptions);
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse options
- List<Option> options = Lists.newLinkedList();
- while (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, OPTION)) {
-
- Option option = new OptionImpl();
- option.setName(parser.nextText());
- options.add(option);
-
- // read end option tag
- eventType = parser.nextTag();
- }
- model.setOption(options);
-
- // parse settings
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, SETTINGS)) {
-
- Map<String, String> settings = new LinkedHashMap<String, String>();
- while (!(parser.nextTag() == XmlPullParser.END_TAG &&
- parserEqual(parser, SETTINGS))) {
- settings.put(parser.getName(), parser.nextText());
- }
- model.setSettings(settings);
-
- // read next tag
- parser.nextTag();
- }
- }
-
- protected void parseAttributes(MascModel model, XmlPullParser parser) throws IOException, XmlPullParserException {
- List<Criteria> criterias = Lists.newArrayList();
- while (parser.getEventType() == XmlPullParser.START_TAG &&
- parserEqual(parser, ATTRIBUTE)) {
-
- Criteria criteria = parseAttribute(model, parser);
- criterias.add(criteria);
-
- // Read closeTag
- parser.nextTag();
- }
- model.setCriteria(criterias);
- }
-
- protected Criteria parseAttribute(MascModel model, XmlPullParser parser) throws IOException, XmlPullParserException {
-
- // parse name
- int eventType = parser.nextTag();
- if (eventType == XmlPullParser.START_TAG &&
- !parserEqual(parser, CRITERIA_NAME)) {
-
- log.info(parser.getName());
- throwMascTechnicalException("All criteria must have a name");
- }
- String name = parser.nextText();
-
- // read next tag
- eventType = parser.nextTag();
-
- // parse description
- String description = null;
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, CRITERIA_DESCRIPTION)) {
-
- description = parser.nextText();
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse scales
- if (eventType == XmlPullParser.START_TAG &&
- !parserEqual(parser, SCALE)) {
-
- throwMascTechnicalException("All criteria must have a scalesValue");
- }
- List<ScaleValue> scaleValues = parseScale(parser);
-
- // parse function
- Function function = null;
- if (parser.getEventType() == XmlPullParser.START_TAG &&
- parserEqual(parser, FUNCTION)) {
-
- function = parseFunction(parser);
- }
-
- // parse option value
- int optionValueCnt = 0;
- List<OptionValue> optionValues = Lists.newLinkedList();
- while (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, OPTION)) {
-
- OptionValue optionValue = new OptionValueImpl();
- optionValue.setValue(Integer.parseInt(parser.nextText()));
- Option option = model.getOption(optionValueCnt++);
-
- // initialize option value list
- if (option.getOptionValue() == null) {
- LinkedList<OptionValue> optionValuesList = Lists.newLinkedList();
- option.setOptionValue(optionValuesList);
- }
- option.addOptionValue(optionValue);
- optionValues.add(optionValue);
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse attributes
- List<Criteria> criterias = new ArrayList<Criteria>();
- if (parser.getEventType() == XmlPullParser.START_TAG &&
- parserEqual(parser, ATTRIBUTE)) {
-
- while (!(parser.getEventType() == XmlPullParser.END_TAG &&
- parserEqual(parser, ATTRIBUTE))) {
-
- criterias.add(parseAttribute(model, parser));
- parser.nextTag();
- }
- }
-
- Criteria current;
- if (function != null) {
-
- // non editable criteria
- ComputableCriteria computableCriteria = new ComputableCriteriaImpl();
- computableCriteria.setFunction(function);
- current = computableCriteria;
- } else {
-
- // editable criteria
- // check on properties if its a threshold criteria
- Multimap<String,Integer> thresholds = getConfig().getThresholds();
- if (thresholds.containsKey(name)) {
- ThresholdCriteria thresholdCriteria = new ThresholdCriteriaImpl();
- Collection<Integer> values = thresholds.get(name);
- thresholdCriteria.setValues(values);
- current = thresholdCriteria;
- } else {
- // else is a valued one
- current = new ValuedCriteriaImpl();
- }
- }
-
- // fill options values
- for (OptionValue optionValue : optionValues) {
- optionValue.setCriteria(current);
- }
-
- // fill criteria
- current.setName(name);
- current.setDescription(description);
- current.setScale(scaleValues);
- current.setChildren(criterias);
-
- return current;
- }
-
- protected List<ScaleValue> parseScale(XmlPullParser parser) throws IOException, XmlPullParserException {
-
- List<ScaleValue> scaleValues = new ArrayList<ScaleValue>();
- while (!(parser.nextTag() == XmlPullParser.END_TAG &&
- parserEqual(parser, SCALE))) {
-
- // parse name
- int eventType = parser.nextTag();
- if (eventType == XmlPullParser.START_TAG &&
- !parserEqual(parser, SCALE_VALUE_NAME)) {
-
- throwMascTechnicalException("All scale value must have a name");
- }
- ScaleValue scaleValue = new ScaleValueImpl();
- scaleValue.setName(parser.nextText());
- eventType = parser.nextTag();
-
- // parse description
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, SCALE_VALUE_DESCRIPTION)) {
-
- scaleValue.setDescription(parser.nextText());
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse group
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, SCALE_VALUE_GROUP)) {
-
- String groupValue = parser.nextText();
- scaleValue.setGroup(ScaleGroup.valueOf(groupValue));
-
- // read next tag
- parser.nextTag();
- }
- scaleValues.add(scaleValue);
- }
- // read scale close tag
- parser.nextTag();
-
- return scaleValues;
- }
-
- protected Function parseFunction(XmlPullParser parser) throws IOException, XmlPullParserException {
- Function function = new FunctionImpl();
-
- // parse low
- int eventType = parser.nextTag();
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, FUNCTION_LOW)) {
-
- function.setLow(parser.nextText());
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse entered
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, FUNCTION_ENTERED)) {
-
- function.setEntered(parser.nextText());
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse weights
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, FUNCTION_WEIGHTS)) {
-
- function.setWeights(parser.nextText());
-
- // read next tag
- eventType = parser.nextTag();
- }
-
- // parse consist
- if (eventType == XmlPullParser.START_TAG &&
- parserEqual(parser, FUNCTION_CONSIST)) {
-
- function.setConsist(Boolean.parseBoolean(parser.nextText()));
-
- // read next tag
- parser.nextTag();
- }
-
- // read function close tag
- parser.nextTag();
-
- return function;
- }
-
- protected boolean parserEqual(XmlPullParser parser, String name) {
- String tagName = parser.getName();
- return tagName.equalsIgnoreCase(name);
- }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java 2011-12-14 15:37:31 UTC (rev 519)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -1,10 +1,17 @@
package fr.inra.masc.services;
import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.inra.masc.io.parser.ExperienceDesignParser;
+import fr.inra.masc.io.parser.InputDesignParser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.text.ParseException;
/**
* @author sletellier <letellier(a)codelutin.com>
@@ -19,15 +26,54 @@
return log;
}
- public File loadExperienceDesign(ExperienceDesign mexicoModel, File toSave) {
+ public ExperienceDesign loadExperienceDesignModel(File experienceDesignFile) {
- // TODO sletellier : load mexico experience design xml file
- return toSave;
+ ExperienceDesign experienceDesignModel = null;
+ try {
+ ExperienceDesignParser experienceDesignParser = new ExperienceDesignParser(experienceDesignFile);
+ try {
+ // parse experienceDesign
+ experienceDesignModel = experienceDesignParser.getModel();
+ } finally {
+ experienceDesignParser.close();
+ }
+
+ } catch (XmlPullParserException eee) {
+ throwMascTechnicalException("Failed to parse ExperienceDesign file '" + experienceDesignFile.getName() + "'", eee);
+ } catch (FileNotFoundException eee) {
+ throwMascTechnicalException("ExperienceDesign file '" + experienceDesignFile.getName() + "' not found", eee);
+ } catch (IOException eee) {
+ throwMascTechnicalException("Error reading ExperienceDesign file '" + experienceDesignFile.getName() + "'", eee);
+ } catch (ParseException eee) {
+ throwMascTechnicalException("Failed to parse ExperienceDesign file '" + experienceDesignFile.getName() + "'", eee);
+ }
+
+ return experienceDesignModel;
}
- public File loadInputDesignDesign(ExperienceDesign mexicoModel, File toSave) {
+ public InputDesign loadInputDesignDesignModel(File inputDesignFile) {
- // TODO sletellier : write mexico input design xml file
- return toSave;
+ InputDesign inputDesignModel = null;
+ try {
+ // parse inputDesign
+ InputDesignParser inputDesignParser = new InputDesignParser(inputDesignFile);
+ try {
+ inputDesignModel = inputDesignParser.getModel();
+ } finally {
+ inputDesignParser.close();
+ }
+
+ } catch (XmlPullParserException eee) {
+ throwMascTechnicalException("Failed to parse InputDesign file '" + inputDesignFile.getName() + "'", eee);
+ } catch (FileNotFoundException eee) {
+ throwMascTechnicalException("InputDesign file '" + inputDesignFile.getName() + "' not found", eee);
+ } catch (IOException eee) {
+ throwMascTechnicalException("Error reading InputDesign file '" + inputDesignFile.getName() + "'", eee);
+ } catch (ParseException eee) {
+ throwMascTechnicalException("Failed to parse InputDesign file '" + inputDesignFile.getName() + "'", eee);
+ }
+
+ return inputDesignModel;
}
+
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-14 15:37:31 UTC (rev 519)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -1,23 +1,14 @@
package fr.inra.masc.services;
-import fr.ifremer.mexico.model.Domain;
import fr.ifremer.mexico.model.ExperienceDesign;
-import fr.ifremer.mexico.model.Factor;
-import fr.ifremer.mexico.model.Feature;
import fr.ifremer.mexico.model.InputDesign;
-import fr.ifremer.mexico.model.Scenario;
-import fr.inra.masc.io.Element;
-import org.apache.commons.lang3.StringUtils;
+import fr.inra.masc.io.writer.ExperienceDesignXmlWriter;
+import fr.inra.masc.io.writer.InputDesignXmlWriter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Map;
/**
* Service to save mexico model to mexico xml file
@@ -37,204 +28,30 @@
public void saveExperienceDesign(ExperienceDesign experienceDesign, File toSave) {
- ExperienceDesignXmlWriter experienceDesignXmlWriter = new ExperienceDesignXmlWriter(experienceDesign);
- String xml = experienceDesignXmlWriter.composeXml(2);
-
- log.info(xml);
-
- FileWriter writer = null;
try {
- writer = new FileWriter(toSave);
- writer.write(xml);
- } catch (IOException eee) {
- throwMascTechnicalException("Failed to write exp design xml file", eee);
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException eee) {
- throwMascTechnicalException("Failed to close exp design xml file", eee);
- }
+ ExperienceDesignXmlWriter writer = new ExperienceDesignXmlWriter(toSave, experienceDesign);
+ try {
+ writer.write();
+ } finally {
+ writer.close();
}
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to write experiment design xml file", eee);
}
}
public void saveInputDesign(InputDesign inputDesign, File toSave) {
- InputDesignXmlWriter inputDesignXmlWriter = new InputDesignXmlWriter(inputDesign);
- String xml = inputDesignXmlWriter.composeXml(2);
-
- log.info(xml);
-
- FileWriter writer = null;
try {
- writer = new FileWriter(toSave);
- writer.write(xml);
- } catch (IOException eee) {
- throwMascTechnicalException("Failed to write exp design xml file", eee);
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException eee) {
- throwMascTechnicalException("Failed to close exp design xml file", eee);
- }
+ InputDesignXmlWriter writer = new InputDesignXmlWriter(toSave, inputDesign);
+ try {
+ writer.write();
+ } finally {
+ writer.close();
}
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to write input design xml file", eee);
}
}
- public class ExperienceDesignXmlWriter {
-
- protected ExperienceDesign model;
-
- public ExperienceDesignXmlWriter(ExperienceDesign model) {
- this.model = model;
- }
-
- public String composeXml(int indent) {
-
- return getRootElement().toXml(indent);
- }
-
- public Element getRootElement() {
-
- Element rootElement = new Element(ExperienceDesign.class.getSimpleName());
- composeExperienceDesignMeta(rootElement);
- composeFactors(rootElement);
-
- // TODO sletellier 2011/12/14 : implement workflow
- // composeWorkFlow(rootElement);
-
- return rootElement;
- }
-
- protected void composeExperienceDesignMeta(Element rootElement) {
-
- // date
- Date date = model.getDate();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- String formatedDate = dateFormat.format(date);
- addParameter(rootElement, ExperienceDesign.PROPERTY_DATE, formatedDate);
-
- addParameter(rootElement, ExperienceDesign.PROPERTY_ID, model.getId());
- addParameter(rootElement, ExperienceDesign.PROPERTY_AUTHOR, model.getAuthor());
- addParameter(rootElement, ExperienceDesign.PROPERTY_LICENCE, model.getLicence());
-
- // description
- String description = model.getDescription();
- if (StringUtils.isNotEmpty(description)) {
- Element.createElement(rootElement, ExperienceDesign.PROPERTY_DESCRIPTION, description);
- }
- }
-
- protected void composeFactors(Element rootElement) {
- Collection<Factor> factors = model.getFactors();
-
- // do nothing if no factors in model
- if (factors.isEmpty()) {
- return;
- }
-
- // creating factors node
- Element factorsElement = Element.createElement(rootElement, ExperienceDesign.PROPERTY_FACTORS);
- for (Factor factor : factors) {
-
- // factor
- Element factorElement = Element.createElement(factorsElement, Factor.class.getSimpleName());
- addParameter(factorElement, Factor.PROPERTY_ID, factor.getId());
- addParameter(factorElement,Factor.PROPERTY_NAME, factor.getName());
- addParameter(factorElement, Factor.PROPERTY_UNIT, factor.getUnit());
-
- // description
- String description = model.getDescription();
- if (StringUtils.isNotEmpty(description)) {
- Element.createElement(factorElement, Factor.PROPERTY_DESCRIPTION, factor.getDescription());
- }
-
- // domain
- Domain domain = factor.getDomain();
- if (domain != null) {
- Element domainElement = Element.createElement(factorElement, Factor.PROPERTY_DOMAIN);
- addParameter(domainElement, Domain.PROPERTY_NAME, domain.getName());
- addParameter(domainElement, Domain.PROPERTY_DISTRIBUTION_PARAMETER, domain.getDistributionParameter());
- addParameter(domainElement, Domain.PROPERTY_LEVEL, String.valueOf(domain.getLevel()));
- addParameter(domainElement, Domain.PROPERTY_VALUE_TYPE, domain.getValueType());
- addParameter(domainElement, Domain.PROPERTY_NOMINAL_VALUE, domain.getNominalValue());
- }
-
- // features
- addAllFeature(factorElement, factor.getFeatures());
- }
- }
-
- protected void addAllFeature(Element factorElement, Collection<Feature> features) {
- if (features != null) {
- for (Feature feature : features) {
- Element featureElement = Element.createElement(factorElement, Factor.PROPERTY_FEATURES);
- addParameter(featureElement, Feature.PROPERTY_NAME, feature.getName());
- addParameter(featureElement, Feature.PROPERTY_VALUE, feature.getValue());
- addParameter(featureElement, Feature.PROPERTY_VALUE_TYPE, feature.getValueType());
- }
- }
- }
-
- protected void addParameter(Element element, String parameterName, Object value) {
- if (value != null) {
- element.addParameter(parameterName, value.toString());
- }
- }
- }
-
- public class InputDesignXmlWriter extends ExperienceDesignXmlWriter{
-
- protected InputDesign model;
-
- public InputDesignXmlWriter(InputDesign model) {
- super(model.getExperienceDesign());
- this.model = model;
- }
-
- @Override
- public String composeXml(int indent) {
-
- Element rootElement = new Element(InputDesign.class.getSimpleName());
- composeInputDesignMeta(rootElement);
- composeScenarios(rootElement);
-
- return rootElement.toXml(indent);
- }
-
- protected void composeInputDesignMeta(Element rootElement) {
-
- // date
- Date date = model.getDate();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- String formatedDate = dateFormat.format(date);
- addParameter(rootElement, InputDesign.PROPERTY_DATE, formatedDate);
-
- // experiement design
- rootElement.add(getRootElement());
- }
-
- protected void composeScenarios(Element rootElement) {
-
- // scenarios
- for (Scenario scenario : model.getScenarios()) {
- Element scenariosElement = Element.createElement(rootElement, InputDesign.PROPERTY_SCENARIOS);
- addParameter(scenariosElement, Scenario.PROPERTY_NAME, scenario.getName());
- addParameter(scenariosElement, Scenario.PROPERTY_ORDER_NUMBER, scenario.getOrderNumber());
-
- // factor values
- Map<Factor,Object> factorValues = scenario.getFactorValues();
- for (Map.Entry<Factor,Object> entry : factorValues.entrySet()) {
- Object value = entry.getValue();
- Element factorValueElement = Element.createElement(scenariosElement, Scenario.PROPERTY_FACTOR_VALUES, String.valueOf(value));
- factorValueElement.addParameter(Factor.class.getSimpleName(), entry.getKey().getId());
- }
-
- // features
- addAllFeature(scenariosElement, scenario.getFeatures());
- }
- }
- }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-14 15:37:31 UTC (rev 519)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -1,47 +1,13 @@
package fr.inra.masc.services;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.Multimap;
-import fr.inra.masc.io.Element;
-import fr.inra.masc.model.ComputableCriteria;
-import fr.inra.masc.model.Criteria;
-import fr.inra.masc.model.Function;
+import fr.inra.masc.io.writer.DexiXmlWriter;
import fr.inra.masc.model.MascModel;
-import fr.inra.masc.model.Option;
-import fr.inra.masc.model.OptionValue;
-import fr.inra.masc.model.ScaleValue;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
-import java.util.Collection;
-import java.util.Map;
-import static fr.inra.masc.model.MascXmlConstant.ATTRIBUTE;
-import static fr.inra.masc.model.MascXmlConstant.CRITERIA_DESCRIPTION;
-import static fr.inra.masc.model.MascXmlConstant.CRITERIA_NAME;
-import static fr.inra.masc.model.MascXmlConstant.DEXI;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_CONSIST;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_ENTERED;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_LOW;
-import static fr.inra.masc.model.MascXmlConstant.FUNCTION_WEIGHTS;
-import static fr.inra.masc.model.MascXmlConstant.LINE;
-import static fr.inra.masc.model.MascXmlConstant.MODEL_DESCRIPTION;
-import static fr.inra.masc.model.MascXmlConstant.MODEL_NAME;
-import static fr.inra.masc.model.MascXmlConstant.OPTION;
-import static fr.inra.masc.model.MascXmlConstant.SCALE;
-import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE;
-import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_DESCRIPTION;
-import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_GROUP;
-import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_NAME;
-import static fr.inra.masc.model.MascXmlConstant.SETTINGS;
-
/**
* Service to save masc model to DEXi xml file
*
@@ -60,153 +26,16 @@
public void saveModel(MascModel model, File saveFile) {
- DexiXmlWriter dexiXmlWriter = new DexiXmlWriter(model);
- String xml = dexiXmlWriter.composeXml(2);
-
- FileWriter writer = null;
try {
- writer = new FileWriter(saveFile);
- writer.write(xml);
+ DexiXmlWriter writer = new DexiXmlWriter(saveFile, model);
+ try {
+ writer.write();
+ } finally {
+ writer.close();
+ }
} catch (IOException eee) {
throwMascTechnicalException("Failed to write DEXi xml file", eee);
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException eee) {
- throwMascTechnicalException("Failed to close DEXi xml file", eee);
- }
- }
}
}
- protected class DexiXmlWriter {
-
- protected MascModel model;
- protected Multimap<Criteria, OptionValue> criteriaOptionValues;
-
- public DexiXmlWriter(MascModel model) {
- this.model = model;
- this.criteriaOptionValues = LinkedListMultimap.create();
- }
-
- public String composeXml(int indent) {
- Element rootElement = new Element(DEXI);
- composeMeta(rootElement);
- composeAttributes(rootElement);
-
- return rootElement.toXml(indent);
- }
-
-
- protected void composeMeta(Element rootElement) {
-
- // model name
- add(rootElement, MODEL_NAME, model.getName());
-
- // model description
- Element descriptionElement = createElement(rootElement, MODEL_DESCRIPTION);
- for (String line : model.getDescription()) {
- add(descriptionElement, LINE, line);
- }
-
- // options
- for (Option option : model.getOption()) {
- add(rootElement, OPTION, option.getName());
-
- // load all option values
- for (OptionValue optionValue : option.getOptionValue()) {
-
- // fill map
- Criteria criteria = optionValue.getCriteria();
- criteriaOptionValues.put(criteria, optionValue);
- }
- }
-
- // settings
- Map<String,String> settings = model.getSettings();
- if (MapUtils.isNotEmpty(settings)) {
- Element settingElement = createElement(rootElement, SETTINGS);
- for (String settingName : settings.keySet()) {
- String settingsValue = settings.get(settingName);
- add(settingElement, settingName, settingsValue);
- }
- }
- }
-
- protected void composeAttributes(Element rootElement) {
- Collection<Criteria> criterias = model.getCriteria();
- if (CollectionUtils.isNotEmpty(criterias)) {
- for (Criteria criteria : criterias) {
- composeAttribute(criteria, rootElement);
- }
- }
- }
-
- protected void composeAttribute(Criteria criteria, Element rootElement) {
- Element attributeElement = createElement(rootElement, ATTRIBUTE);
-
- // attribute name
- add(attributeElement, CRITERIA_NAME, criteria.getName());
-
- // attribute description
- add(attributeElement, CRITERIA_DESCRIPTION, criteria.getDescription());
-
- // scale
- Element scaleElement = createElement(attributeElement, SCALE);
-
- // scale values
- for (ScaleValue scaleValue : criteria.getScale()) {
- Element scaleValueElement = createElement(scaleElement, SCALE_VALUE);
- add(scaleValueElement, SCALE_VALUE_NAME, scaleValue.getName());
- add(scaleValueElement, SCALE_VALUE_DESCRIPTION, scaleValue.getDescription());
- add(scaleValueElement, SCALE_VALUE_GROUP, scaleValue.getGroup());
- }
-
- // function
- if (criteria instanceof ComputableCriteria) {
- ComputableCriteria computableCriteria = (ComputableCriteria) criteria;
- Element functionElement = createElement(attributeElement, FUNCTION);
- Function function = computableCriteria.getFunction();
- add(functionElement, FUNCTION_LOW, function.getLow());
- add(functionElement, FUNCTION_ENTERED, function.getEntered());
- add(functionElement, FUNCTION_WEIGHTS, function.getWeights());
- add(functionElement, FUNCTION_CONSIST, function.getConsist());
- }
-
- // options
- Collection<OptionValue> optionValues = criteriaOptionValues.get(criteria);
- for (OptionValue optionValue : optionValues) {
- add(attributeElement, OPTION, optionValue.getValue());
- }
-
- // children
- for (Criteria child : criteria.getChildren()) {
- composeAttribute(child, attributeElement);
- }
- }
-
- protected void add(Element parentElement, String tagName, Object value) {
- if (value != null) {
- String toString = value.toString();
-
- // boolean are capitalized in masc xml file
- if (value instanceof Boolean) {
- toString = StringUtils.capitalize(toString);
- }
- createElement(parentElement, tagName, toString);
- }
- }
-
- // Override to upper case tagNames
- public Element createElement(Element parentElement, String tagName) {
- return createElement(parentElement, tagName, null);
- }
-
- public Element createElement(Element parentElement, String tagName, String text) {
- Element element = Element.createElement(tagName.toUpperCase(), text);
- parentElement.add(element);
- return element;
- }
- }
}
Added: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoLoadModelServiceTest.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -0,0 +1,51 @@
+package fr.inra.masc.services;
+
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.inra.masc.model.MascModel;
+import org.junit.Test;
+
+import java.io.File;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MexicoLoadModelServiceTest extends AbstractServiceTest {
+
+ @Test
+ public void testLoadExperienceDesignModel() throws Exception {
+ MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+
+ File savedFile = new File(testWorkDir, "experienceDesignTestFileResult.xml");
+ getService(MexicoSaveModelService.class).saveExperienceDesign(experienceDesign, savedFile);
+
+ ExperienceDesign loadedExperienceDesign = getService(MexicoLoadModelService.class).loadExperienceDesignModel(savedFile);
+ assertExperimentDesignEqual(experienceDesign, loadedExperienceDesign);
+ }
+
+ @Test
+ public void testLoadInputDesignDesignModel() throws Exception {
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
+ ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+ InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experienceDesign);
+
+ File savedFile = new File(testWorkDir, "inputDesignTestFileResult.xml");
+ getService(MexicoSaveModelService.class).saveInputDesign(inputDesign, savedFile);
+
+ InputDesign loadedInputDesign = getService(MexicoLoadModelService.class).loadInputDesignDesignModel(savedFile);
+
+ assertExperimentDesignEqual(inputDesign.getExperienceDesign(), loadedInputDesign.getExperienceDesign());
+ assertEquals(inputDesign.getScenarios().size(), loadedInputDesign.getScenarios().size());
+ }
+
+ protected void assertExperimentDesignEqual(ExperienceDesign expectedExperienceDesign, ExperienceDesign experienceDesign) {
+ assertEquals(expectedExperienceDesign.getId(), experienceDesign.getId());
+ assertEquals(expectedExperienceDesign.getFactors().size(), experienceDesign.getFactors().size());
+ }
+}
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java 2011-12-14 15:37:31 UTC (rev 519)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java 2011-12-15 10:31:40 UTC (rev 520)
@@ -20,7 +20,7 @@
MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
- File savedFile = new File(testWorkDir, "ExperienceDesignTestFileResult.xml");
+ File savedFile = new File(testWorkDir, "experienceDesignTestFileResult.xml");
getService(MexicoSaveModelService.class).saveExperienceDesign(experienceDesign, savedFile);
}
1
0
r519 - in masc/masc-api/src: main/java/fr/inra/masc main/java/fr/inra/masc/io main/java/fr/inra/masc/services test/java/fr/inra/masc/services
by sletellier@users.nuiton.org 14 Dec '11
by sletellier@users.nuiton.org 14 Dec '11
14 Dec '11
Author: sletellier
Date: 2011-12-14 16:37:31 +0100 (Wed, 14 Dec 2011)
New Revision: 519
Url: http://nuiton.org/repositories/revision/sandbox/519
Log:
- Improve Element to write xml
- Write mexico xml files
- Write tests
Added:
masc/masc-api/src/main/java/fr/inra/masc/io/
masc/masc-api/src/main/java/fr/inra/masc/io/Element.java
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
Modified:
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java
Added: masc/masc-api/src/main/java/fr/inra/masc/io/Element.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/io/Element.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/io/Element.java 2011-12-14 15:37:31 UTC (rev 519)
@@ -0,0 +1,115 @@
+package fr.inra.masc.io;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Represent an XML node
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class Element {
+
+ public static final String XML_META = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ public static final String CLOSED_TAG = "%s<%s%s/>\n";
+ public static final String START_TAG = "%s<%s%s>";
+ public static final String END_TAG = "%s</%s>\n";
+
+ protected LinkedList<Element> children;
+ protected Map<String, String> parameters;
+ protected String tagName;
+ protected String text;
+
+ public Element(String tagName) {
+ this(tagName, null);
+ }
+
+ public Element(String tagName, String text) {
+ this.tagName = tagName;
+ this.text = text;
+ this.children = Lists.newLinkedList();
+ this.parameters = Maps.newHashMap();
+ }
+
+ public void add(Element e) {
+ this.children.add(e);
+ }
+
+ public void addParameter(String name, String value) {
+ this.parameters.put(name, value);
+ }
+
+ public String toXml(int indent) {
+ StringBuilder stringBuilder = new StringBuilder(XML_META).append("\n");
+ buildXml(-indent, indent, stringBuilder);
+ return stringBuilder.toString();
+ }
+
+ protected void buildXml(int start, int indent, StringBuilder stringBuilder) {
+
+ // closed tag if content is empty
+ if (children.isEmpty() && StringUtils.isEmpty(text)) {
+ addToBuilder(stringBuilder, CLOSED_TAG, getIndentPrefix(start, indent), tagName);
+ return;
+ }
+
+ // start tag
+ addToBuilder(stringBuilder, START_TAG, getIndentPrefix(start, indent), tagName);
+ if (StringUtils.isNotEmpty(text)) {
+
+ // end inline tag
+ addToBuilder(stringBuilder, END_TAG, StringEscapeUtils.escapeXml(text), tagName);
+ } else {
+ stringBuilder.append("\n");
+ for (Element child : children) {
+ child.buildXml(start + indent, indent, stringBuilder);
+ }
+ // end tag
+ addToBuilder(stringBuilder, END_TAG, getIndentPrefix(start, indent), tagName);
+ }
+ }
+
+ protected void addToBuilder(StringBuilder stringBuilder, String template, String prefix, String tagName) {
+ stringBuilder.append(String.format(template, prefix, tagName, getParametersAsString()));
+ }
+
+ protected String getIndentPrefix(int start, int lenght) {
+ String result = "";
+ for (int i=0;i<start + lenght;i++) {
+ result += " ";
+ }
+ return result;
+ }
+
+ protected String getParametersAsString() {
+ StringBuilder builder = new StringBuilder();
+ Set<Map.Entry<String,String>> entries = parameters.entrySet();
+ for (Map.Entry<String,String> entry : entries) {
+
+ // add to builder param like : name="value"
+ builder.append(" ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
+ }
+ return builder.toString();
+ }
+
+ public static Element createElement(Element parentElement, String tagName) {
+ return createElement(parentElement, tagName, null);
+ }
+
+ public static Element createElement(Element parentElement, String tagName, String text) {
+ Element element = createElement(tagName, text);
+ parentElement.add(element);
+ return element;
+ }
+
+ public static Element createElement(String tagName, String text) {
+ return new Element(tagName, text);
+ }
+}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-14 10:05:14 UTC (rev 518)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-14 15:37:31 UTC (rev 519)
@@ -1,13 +1,29 @@
package fr.inra.masc.services;
+import fr.ifremer.mexico.model.Domain;
import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.Factor;
+import fr.ifremer.mexico.model.Feature;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.ifremer.mexico.model.Scenario;
+import fr.inra.masc.io.Element;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
/**
+ * Service to save mexico model to mexico xml file
+ *
* @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
*/
public class MexicoSaveModelService extends MascService {
@@ -19,15 +35,206 @@
return log;
}
- public File saveExperienceDesign(ExperienceDesign mexicoModel, File toSave) {
+ public void saveExperienceDesign(ExperienceDesign experienceDesign, File toSave) {
- // TODO sletellier : write mexico experience design xml file
- return toSave;
+ ExperienceDesignXmlWriter experienceDesignXmlWriter = new ExperienceDesignXmlWriter(experienceDesign);
+ String xml = experienceDesignXmlWriter.composeXml(2);
+
+ log.info(xml);
+
+ FileWriter writer = null;
+ try {
+ writer = new FileWriter(toSave);
+ writer.write(xml);
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to write exp design xml file", eee);
+ } finally {
+ if (writer != null) {
+ try {
+ writer.close();
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to close exp design xml file", eee);
+ }
+ }
+ }
}
- public File saveInputDesignDesign(ExperienceDesign mexicoModel, File toSave) {
+ public void saveInputDesign(InputDesign inputDesign, File toSave) {
- // TODO sletellier : write mexico input design xml file
- return toSave;
+ InputDesignXmlWriter inputDesignXmlWriter = new InputDesignXmlWriter(inputDesign);
+ String xml = inputDesignXmlWriter.composeXml(2);
+
+ log.info(xml);
+
+ FileWriter writer = null;
+ try {
+ writer = new FileWriter(toSave);
+ writer.write(xml);
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to write exp design xml file", eee);
+ } finally {
+ if (writer != null) {
+ try {
+ writer.close();
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to close exp design xml file", eee);
+ }
+ }
+ }
}
+
+ public class ExperienceDesignXmlWriter {
+
+ protected ExperienceDesign model;
+
+ public ExperienceDesignXmlWriter(ExperienceDesign model) {
+ this.model = model;
+ }
+
+ public String composeXml(int indent) {
+
+ return getRootElement().toXml(indent);
+ }
+
+ public Element getRootElement() {
+
+ Element rootElement = new Element(ExperienceDesign.class.getSimpleName());
+ composeExperienceDesignMeta(rootElement);
+ composeFactors(rootElement);
+
+ // TODO sletellier 2011/12/14 : implement workflow
+ // composeWorkFlow(rootElement);
+
+ return rootElement;
+ }
+
+ protected void composeExperienceDesignMeta(Element rootElement) {
+
+ // date
+ Date date = model.getDate();
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ String formatedDate = dateFormat.format(date);
+ addParameter(rootElement, ExperienceDesign.PROPERTY_DATE, formatedDate);
+
+ addParameter(rootElement, ExperienceDesign.PROPERTY_ID, model.getId());
+ addParameter(rootElement, ExperienceDesign.PROPERTY_AUTHOR, model.getAuthor());
+ addParameter(rootElement, ExperienceDesign.PROPERTY_LICENCE, model.getLicence());
+
+ // description
+ String description = model.getDescription();
+ if (StringUtils.isNotEmpty(description)) {
+ Element.createElement(rootElement, ExperienceDesign.PROPERTY_DESCRIPTION, description);
+ }
+ }
+
+ protected void composeFactors(Element rootElement) {
+ Collection<Factor> factors = model.getFactors();
+
+ // do nothing if no factors in model
+ if (factors.isEmpty()) {
+ return;
+ }
+
+ // creating factors node
+ Element factorsElement = Element.createElement(rootElement, ExperienceDesign.PROPERTY_FACTORS);
+ for (Factor factor : factors) {
+
+ // factor
+ Element factorElement = Element.createElement(factorsElement, Factor.class.getSimpleName());
+ addParameter(factorElement, Factor.PROPERTY_ID, factor.getId());
+ addParameter(factorElement,Factor.PROPERTY_NAME, factor.getName());
+ addParameter(factorElement, Factor.PROPERTY_UNIT, factor.getUnit());
+
+ // description
+ String description = model.getDescription();
+ if (StringUtils.isNotEmpty(description)) {
+ Element.createElement(factorElement, Factor.PROPERTY_DESCRIPTION, factor.getDescription());
+ }
+
+ // domain
+ Domain domain = factor.getDomain();
+ if (domain != null) {
+ Element domainElement = Element.createElement(factorElement, Factor.PROPERTY_DOMAIN);
+ addParameter(domainElement, Domain.PROPERTY_NAME, domain.getName());
+ addParameter(domainElement, Domain.PROPERTY_DISTRIBUTION_PARAMETER, domain.getDistributionParameter());
+ addParameter(domainElement, Domain.PROPERTY_LEVEL, String.valueOf(domain.getLevel()));
+ addParameter(domainElement, Domain.PROPERTY_VALUE_TYPE, domain.getValueType());
+ addParameter(domainElement, Domain.PROPERTY_NOMINAL_VALUE, domain.getNominalValue());
+ }
+
+ // features
+ addAllFeature(factorElement, factor.getFeatures());
+ }
+ }
+
+ protected void addAllFeature(Element factorElement, Collection<Feature> features) {
+ if (features != null) {
+ for (Feature feature : features) {
+ Element featureElement = Element.createElement(factorElement, Factor.PROPERTY_FEATURES);
+ addParameter(featureElement, Feature.PROPERTY_NAME, feature.getName());
+ addParameter(featureElement, Feature.PROPERTY_VALUE, feature.getValue());
+ addParameter(featureElement, Feature.PROPERTY_VALUE_TYPE, feature.getValueType());
+ }
+ }
+ }
+
+ protected void addParameter(Element element, String parameterName, Object value) {
+ if (value != null) {
+ element.addParameter(parameterName, value.toString());
+ }
+ }
+ }
+
+ public class InputDesignXmlWriter extends ExperienceDesignXmlWriter{
+
+ protected InputDesign model;
+
+ public InputDesignXmlWriter(InputDesign model) {
+ super(model.getExperienceDesign());
+ this.model = model;
+ }
+
+ @Override
+ public String composeXml(int indent) {
+
+ Element rootElement = new Element(InputDesign.class.getSimpleName());
+ composeInputDesignMeta(rootElement);
+ composeScenarios(rootElement);
+
+ return rootElement.toXml(indent);
+ }
+
+ protected void composeInputDesignMeta(Element rootElement) {
+
+ // date
+ Date date = model.getDate();
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ String formatedDate = dateFormat.format(date);
+ addParameter(rootElement, InputDesign.PROPERTY_DATE, formatedDate);
+
+ // experiement design
+ rootElement.add(getRootElement());
+ }
+
+ protected void composeScenarios(Element rootElement) {
+
+ // scenarios
+ for (Scenario scenario : model.getScenarios()) {
+ Element scenariosElement = Element.createElement(rootElement, InputDesign.PROPERTY_SCENARIOS);
+ addParameter(scenariosElement, Scenario.PROPERTY_NAME, scenario.getName());
+ addParameter(scenariosElement, Scenario.PROPERTY_ORDER_NUMBER, scenario.getOrderNumber());
+
+ // factor values
+ Map<Factor,Object> factorValues = scenario.getFactorValues();
+ for (Map.Entry<Factor,Object> entry : factorValues.entrySet()) {
+ Object value = entry.getValue();
+ Element factorValueElement = Element.createElement(scenariosElement, Scenario.PROPERTY_FACTOR_VALUES, String.valueOf(value));
+ factorValueElement.addParameter(Factor.class.getSimpleName(), entry.getKey().getId());
+ }
+
+ // features
+ addAllFeature(scenariosElement, scenario.getFeatures());
+ }
+ }
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-14 10:05:14 UTC (rev 518)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-14 15:37:31 UTC (rev 519)
@@ -1,8 +1,8 @@
package fr.inra.masc.services;
import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
+import fr.inra.masc.io.Element;
import fr.inra.masc.model.ComputableCriteria;
import fr.inra.masc.model.Criteria;
import fr.inra.masc.model.Function;
@@ -12,7 +12,6 @@
import fr.inra.masc.model.ScaleValue;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -21,7 +20,6 @@
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;
-import java.util.LinkedList;
import java.util.Map;
import static fr.inra.masc.model.MascXmlConstant.ATTRIBUTE;
@@ -45,7 +43,7 @@
import static fr.inra.masc.model.MascXmlConstant.SETTINGS;
/**
- * Service to save masc model
+ * Service to save masc model to DEXi xml file
*
* @author sletellier <letellier(a)codelutin.com>
* @since 0.1
@@ -63,20 +61,20 @@
public void saveModel(MascModel model, File saveFile) {
DexiXmlWriter dexiXmlWriter = new DexiXmlWriter(model);
- Element xml = dexiXmlWriter.composeXml();
+ String xml = dexiXmlWriter.composeXml(2);
FileWriter writer = null;
try {
writer = new FileWriter(saveFile);
- writer.write(xml.toXml(2));
+ writer.write(xml);
} catch (IOException eee) {
- throwMascTechnicalException("Failed to write document", eee);
+ throwMascTechnicalException("Failed to write DEXi xml file", eee);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException eee) {
- throwMascTechnicalException("Failed to close document", eee);
+ throwMascTechnicalException("Failed to close DEXi xml file", eee);
}
}
}
@@ -92,12 +90,12 @@
this.criteriaOptionValues = LinkedListMultimap.create();
}
- public Element composeXml() {
+ public String composeXml(int indent) {
Element rootElement = new Element(DEXI);
composeMeta(rootElement);
composeAttributes(rootElement);
- return rootElement;
+ return rootElement.toXml(indent);
}
@@ -200,81 +198,15 @@
}
}
- protected Element createElement(Element parentElement, String tagName) {
+ // Override to upper case tagNames
+ public Element createElement(Element parentElement, String tagName) {
return createElement(parentElement, tagName, null);
}
-
- protected Element createElement(Element parentElement, String tagName, String text) {
- Element element = createElement(tagName.toUpperCase(), text);
+
+ public Element createElement(Element parentElement, String tagName, String text) {
+ Element element = Element.createElement(tagName.toUpperCase(), text);
parentElement.add(element);
return element;
}
-
- protected Element createElement(String tagName, String text) {
- return new Element(tagName, text);
- }
-
}
-
- protected class Element {
-
- public static final String XML_META = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
-
- protected LinkedList<Element> children;
- protected String tagName;
- protected String text;
-
- public Element(String tagName) {
- this(tagName, null);
- }
-
- public Element(String tagName, String text) {
- this.tagName = tagName;
- this.text = text;
- this.children = Lists.newLinkedList();
- }
-
- public void add(Element e) {
- this.children.add(e);
- }
-
- public String toXml(int indent) {
- StringBuilder stringBuilder = new StringBuilder(XML_META).append("\n");
- buildXml(-indent, indent, stringBuilder);
- return stringBuilder.toString();
- }
-
- protected void buildXml(int start, int indent, StringBuilder stringBuilder) {
-
- // closed tag if content is empty
- if (children.isEmpty() && StringUtils.isEmpty(text)) {
- stringBuilder.append(getIndentPrefix(start, indent)).append("<").append(tagName).append("/>").append("\n");
- return;
- }
-
- // start tag
- stringBuilder.append(getIndentPrefix(start, indent)).append("<").append(tagName).append(">");
- if (StringUtils.isNotEmpty(text)) {
- stringBuilder.append(StringEscapeUtils.escapeXml(text));
-
- // end inline tag
- stringBuilder.append("</").append(tagName).append(">").append("\n");
- } else {
- stringBuilder.append("\n");
- for (Element child : children) {
- child.buildXml(start + indent, indent, stringBuilder);
- }
- // end tag
- stringBuilder.append(getIndentPrefix(start, indent)).append("</").append(tagName).append(">").append("\n");
- }
- }
-
- protected String getIndentPrefix(int start, int lenght) {
- String result = "";
- for (int i=0;i<start + lenght;i++) {
- result += " ";
- }
- return result;
- }
- }
}
Added: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoSaveModelServiceTest.java 2011-12-14 15:37:31 UTC (rev 519)
@@ -0,0 +1,38 @@
+package fr.inra.masc.services;
+
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.inra.masc.model.MascModel;
+import org.junit.Test;
+
+import java.io.File;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MexicoSaveModelServiceTest extends AbstractServiceTest {
+
+ @Test
+ public void testSaveExperienceDesign() throws Exception {
+ MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+
+ File savedFile = new File(testWorkDir, "ExperienceDesignTestFileResult.xml");
+ getService(MexicoSaveModelService.class).saveExperienceDesign(experienceDesign, savedFile);
+ }
+
+ @Test
+ public void testSaveInputDesign() throws Exception {
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
+ ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+ InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experienceDesign);
+
+ File savedFile = new File(testWorkDir, "inputDesignTestFileResult.xml");
+ getService(MexicoSaveModelService.class).saveInputDesign(inputDesign, savedFile);
+ }
+}
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java 2011-12-14 10:05:14 UTC (rev 518)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java 2011-12-14 15:37:31 UTC (rev 519)
@@ -3,7 +3,6 @@
import fr.inra.masc.model.MascModel;
import org.apache.commons.io.FileUtils;
import org.custommonkey.xmlunit.Diff;
-import org.junit.Ignore;
import org.junit.Test;
import org.xml.sax.SAXException;
@@ -16,7 +15,6 @@
public class SaveModelServiceTest extends AbstractServiceTest {
@Test
- @Ignore // TODO sletellier 20111209 : fix line separator
public void testSaveModelWithDexiTestModelFile() throws Exception {
File dexiTestFile = getDexiModelTestFile();
@@ -46,6 +44,9 @@
String input = FileUtils.readFileToString(in);
String output = FileUtils.readFileToString(out);
+ // Hack to don't take care of end of line char
+ input = input.replaceAll("\r\n", "\n");
+
assertEquals(input.trim(), output.trim());
Diff myDiff = new Diff(input, output);
1
0
r518 - in masc/masc-api/src: main/java/fr/inra/masc main/java/fr/inra/masc/services main/xmi test/java/fr/inra/masc/services
by sletellier@users.nuiton.org 14 Dec '11
by sletellier@users.nuiton.org 14 Dec '11
14 Dec '11
Author: sletellier
Date: 2011-12-14 11:05:14 +0100 (Wed, 14 Dec 2011)
New Revision: 518
Url: http://nuiton.org/repositories/revision/sandbox/518
Log:
Optimize imports
Modified:
masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java
masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java
masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
masc/masc-api/src/main/xmi/mexico.zargo
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
Modified: masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java 2011-12-12 16:59:10 UTC (rev 517)
+++ masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java 2011-12-14 10:05:14 UTC (rev 518)
@@ -1,14 +1,23 @@
package fr.inra.masc;
import com.google.common.base.Preconditions;
-import com.google.common.collect.*;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.nuiton.util.*;
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.util.ArgumentsParserException;
+import org.nuiton.util.FileUtil;
+import org.nuiton.util.Version;
+import org.nuiton.util.VersionUtil;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java 2011-12-12 16:59:10 UTC (rev 517)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java 2011-12-14 10:05:14 UTC (rev 518)
@@ -1,6 +1,5 @@
package fr.inra.masc.services;
-import fr.inra.masc.MascTechnicalException;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.logging.Log;
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java 2011-12-12 16:59:10 UTC (rev 517)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java 2011-12-14 10:05:14 UTC (rev 518)
@@ -2,7 +2,23 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
-import fr.inra.masc.model.*;
+import fr.inra.masc.model.ComputableCriteria;
+import fr.inra.masc.model.ComputableCriteriaImpl;
+import fr.inra.masc.model.Criteria;
+import fr.inra.masc.model.Function;
+import fr.inra.masc.model.FunctionImpl;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.MascModelImpl;
+import fr.inra.masc.model.Option;
+import fr.inra.masc.model.OptionImpl;
+import fr.inra.masc.model.OptionValue;
+import fr.inra.masc.model.OptionValueImpl;
+import fr.inra.masc.model.ScaleGroup;
+import fr.inra.masc.model.ScaleValue;
+import fr.inra.masc.model.ScaleValueImpl;
+import fr.inra.masc.model.ThresholdCriteria;
+import fr.inra.masc.model.ThresholdCriteriaImpl;
+import fr.inra.masc.model.ValuedCriteriaImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xmlpull.v1.XmlPullParser;
@@ -13,9 +29,31 @@
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
-import static fr.inra.masc.model.MascXmlConstant.*;
+import static fr.inra.masc.model.MascXmlConstant.ATTRIBUTE;
+import static fr.inra.masc.model.MascXmlConstant.CRITERIA_DESCRIPTION;
+import static fr.inra.masc.model.MascXmlConstant.CRITERIA_NAME;
+import static fr.inra.masc.model.MascXmlConstant.DEXI;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_CONSIST;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_ENTERED;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_LOW;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_WEIGHTS;
+import static fr.inra.masc.model.MascXmlConstant.LINE;
+import static fr.inra.masc.model.MascXmlConstant.MODEL_DESCRIPTION;
+import static fr.inra.masc.model.MascXmlConstant.MODEL_NAME;
+import static fr.inra.masc.model.MascXmlConstant.OPTION;
+import static fr.inra.masc.model.MascXmlConstant.SCALE;
+import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_DESCRIPTION;
+import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_GROUP;
+import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_NAME;
+import static fr.inra.masc.model.MascXmlConstant.SETTINGS;
/**
* Service use to parse mascXmlFile and build MascModel corresponding
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java 2011-12-12 16:59:10 UTC (rev 517)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java 2011-12-14 10:05:14 UTC (rev 518)
@@ -2,8 +2,23 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import fr.ifremer.mexico.model.*;
-import fr.inra.masc.model.*;
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.ExperienceDesignImpl;
+import fr.ifremer.mexico.model.Factor;
+import fr.ifremer.mexico.model.FactorImpl;
+import fr.ifremer.mexico.model.Feature;
+import fr.ifremer.mexico.model.FeatureImpl;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.ifremer.mexico.model.InputDesignImpl;
+import fr.ifremer.mexico.model.Scenario;
+import fr.ifremer.mexico.model.ScenarioImpl;
+import fr.ifremer.mexico.model.ValueType;
+import fr.inra.masc.model.Criteria;
+import fr.inra.masc.model.EditableCriteria;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.Option;
+import fr.inra.masc.model.OptionValue;
+import fr.inra.masc.model.ScaleValue;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-12 16:59:10 UTC (rev 517)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-14 10:05:14 UTC (rev 518)
@@ -3,7 +3,13 @@
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
-import fr.inra.masc.model.*;
+import fr.inra.masc.model.ComputableCriteria;
+import fr.inra.masc.model.Criteria;
+import fr.inra.masc.model.Function;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.Option;
+import fr.inra.masc.model.OptionValue;
+import fr.inra.masc.model.ScaleValue;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringEscapeUtils;
@@ -18,7 +24,25 @@
import java.util.LinkedList;
import java.util.Map;
-import static fr.inra.masc.model.MascXmlConstant.*;
+import static fr.inra.masc.model.MascXmlConstant.ATTRIBUTE;
+import static fr.inra.masc.model.MascXmlConstant.CRITERIA_DESCRIPTION;
+import static fr.inra.masc.model.MascXmlConstant.CRITERIA_NAME;
+import static fr.inra.masc.model.MascXmlConstant.DEXI;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_CONSIST;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_ENTERED;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_LOW;
+import static fr.inra.masc.model.MascXmlConstant.FUNCTION_WEIGHTS;
+import static fr.inra.masc.model.MascXmlConstant.LINE;
+import static fr.inra.masc.model.MascXmlConstant.MODEL_DESCRIPTION;
+import static fr.inra.masc.model.MascXmlConstant.MODEL_NAME;
+import static fr.inra.masc.model.MascXmlConstant.OPTION;
+import static fr.inra.masc.model.MascXmlConstant.SCALE;
+import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE;
+import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_DESCRIPTION;
+import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_GROUP;
+import static fr.inra.masc.model.MascXmlConstant.SCALE_VALUE_NAME;
+import static fr.inra.masc.model.MascXmlConstant.SETTINGS;
/**
* Service to save masc model
Modified: masc/masc-api/src/main/xmi/mexico.zargo
===================================================================
(Binary files differ)
Modified: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java 2011-12-12 16:59:10 UTC (rev 517)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java 2011-12-14 10:05:14 UTC (rev 518)
@@ -3,7 +3,11 @@
import fr.ifremer.mexico.model.ExperienceDesign;
import fr.ifremer.mexico.model.InputDesign;
import fr.ifremer.mexico.model.Scenario;
-import fr.inra.masc.model.*;
+import fr.inra.masc.model.Criteria;
+import fr.inra.masc.model.EditableCriteria;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.Option;
+import fr.inra.masc.model.OptionValue;
import org.junit.Test;
import java.io.File;
@@ -60,7 +64,7 @@
Scenario scenario = inputDesign.getScenarios(i++);
Collection<OptionValue> optionValues = option.getOptionValue();
- // count option with editable criteria
+ // count optionValues with editable criteria
int count = 0;
for (OptionValue optionValue : optionValues) {
Criteria criteria = optionValue.getCriteria();
1
0
r517 - in masc/masc-api: . src/main/java/fr/inra/masc/services src/main/xmi src/test/java/fr/inra/masc/services
by sletellier@users.nuiton.org 12 Dec '11
by sletellier@users.nuiton.org 12 Dec '11
12 Dec '11
Author: sletellier
Date: 2011-12-12 17:59:10 +0100 (Mon, 12 Dec 2011)
New Revision: 517
Url: http://nuiton.org/repositories/revision/sandbox/517
Log:
- Add mexico zargo file include in build
- Creating services to write/load xml and manipulates models
- Implement MexicoModelConvertorService to convert MascModel to MexicoModel
Added:
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
masc/masc-api/src/main/xmi/mexico.zargo
masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
Modified:
masc/masc-api/pom.xml
masc/masc-api/src/main/xmi/masc.zargo
Modified: masc/masc-api/pom.xml
===================================================================
--- masc/masc-api/pom.xml 2011-12-09 18:13:28 UTC (rev 516)
+++ masc/masc-api/pom.xml 2011-12-12 16:59:10 UTC (rev 517)
@@ -93,25 +93,38 @@
<groupId>org.nuiton.eugene</groupId>
<artifactId>maven-eugene-plugin</artifactId>
<configuration>
- <defaultPackage>fr.inra.masc</defaultPackage>
- <fullPackagePath>fr.inra.masc</fullPackagePath>
+ <resolver>org.nuiton.util.FasterCachedResourceResolver</resolver>
+ <templates>
+ org.nuiton.eugene.java.JavaInterfaceTransformer,
+ org.nuiton.eugene.java.JavaBeanTransformer,
+ org.nuiton.eugene.java.JavaEnumerationTransformer
+ </templates>
</configuration>
<executions>
<execution>
+ <id>masc-beans</id>
<phase>generate-sources</phase>
<configuration>
- <inputs>zargo</inputs>
- <resolver>org.nuiton.util.FasterCachedResourceResolver</resolver>
- <templates>
- org.nuiton.eugene.java.JavaInterfaceTransformer,
- org.nuiton.eugene.java.JavaBeanTransformer,
- org.nuiton.eugene.java.JavaEnumerationTransformer
- </templates>
+ <defaultPackage>fr.inra.masc</defaultPackage>
+ <fullPackagePath>fr.inra.masc</fullPackagePath>
+ <inputs>src/main/xmi:masc.zargo</inputs>
</configuration>
<goals>
<goal>smart-generate</goal>
</goals>
</execution>
+ <execution>
+ <id>mexico-beans</id>
+ <phase>generate-sources</phase>
+ <configuration>
+ <defaultPackage>fr.ifremer.mexico</defaultPackage>
+ <fullPackagePath>fr.ifremer.mexico</fullPackagePath>
+ <inputs>src/main/xmi:mexico.zargo</inputs>
+ </configuration>
+ <goals>
+ <goal>smart-generate</goal>
+ </goals>
+ </execution>
</executions>
</plugin>
Added: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoLoadModelService.java 2011-12-12 16:59:10 UTC (rev 517)
@@ -0,0 +1,33 @@
+package fr.inra.masc.services;
+
+import fr.ifremer.mexico.model.ExperienceDesign;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.File;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ */
+public class MexicoLoadModelService extends MascService {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(MexicoLoadModelService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
+
+ public File loadExperienceDesign(ExperienceDesign mexicoModel, File toSave) {
+
+ // TODO sletellier : load mexico experience design xml file
+ return toSave;
+ }
+
+ public File loadInputDesignDesign(ExperienceDesign mexicoModel, File toSave) {
+
+ // TODO sletellier : write mexico input design xml file
+ return toSave;
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoModelConvertorService.java 2011-12-12 16:59:10 UTC (rev 517)
@@ -0,0 +1,149 @@
+package fr.inra.masc.services;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import fr.ifremer.mexico.model.*;
+import fr.inra.masc.model.*;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MexicoModelConvertorService extends MascService {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(MexicoModelConvertorService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
+
+ public InputDesign convertMascModelToMexicoInputDesignModel(MascModel mascModel, ExperienceDesign experienceDesign) {
+ InputDesign inputDesign = new InputDesignImpl();
+
+ // experience design
+ inputDesign.setExperienceDesign(experienceDesign);
+
+ // date is now
+ inputDesign.setDate(new Date());
+
+ // scenarios = options
+ Collection<Option> options = mascModel.getOption();
+ List<Scenario> scenarios = Lists.newArrayList();
+ int i = 0;
+ for (Option option : options) {
+ Scenario scenario = new ScenarioImpl();
+
+ // order
+ scenario.setOrderNumber(i++);
+
+ // name
+ scenario.setName(option.getName());
+
+ // get factor corresponding to criteria
+ Map<Factor, Object> factorValues = Maps.newHashMap();
+
+ // optionValue = entry of factorValues
+ for (OptionValue optionValue : option.getOptionValue()) {
+
+ Collection<Factor> factors = experienceDesign.getFactors();
+ for (Factor factor : factors) {
+ String criteriaName = optionValue.getCriteria().getName();
+ if (factor.getId().equals(criteriaName)) {
+ factorValues.put(factor, optionValue.getValue());
+ }
+ }
+ }
+ scenario.setFactorValues(factorValues);
+
+ scenarios.add(scenario);
+ }
+ inputDesign.setScenarios(scenarios);
+
+ return inputDesign;
+ }
+
+ public ExperienceDesign convertMascModelToMexicoExperienceDesignModel(MascModel mascModel) {
+ ExperienceDesign experienceDesign = new ExperienceDesignImpl();
+
+ // id = mascModel name
+ experienceDesign.setId(mascModel.getName());
+
+ // description
+ String description = StringUtils.join(mascModel.getDescription(), "\n");
+ experienceDesign.setDescription(description);
+
+ // date is now
+ experienceDesign.setDate(new Date());
+
+ // criterias = factors
+ Collection<Criteria> criterias = mascModel.getCriteria();
+ List<Factor> factors = Lists.newArrayList();
+
+ for (Criteria criteria : criterias) {
+ factors.addAll(getFactors(criteria));
+ }
+ experienceDesign.setFactors(factors);
+
+ return experienceDesign;
+ }
+
+ protected Collection<Factor> getFactors(Criteria criteria) {
+
+ List<Factor> factors = Lists.newArrayList();
+
+ // keep only editable criterias
+ if (criteria instanceof EditableCriteria) {
+ Factor factor = new FactorImpl();
+
+ // id = criteria.name
+ factor.setId(criteria.getName());
+
+ // description
+ factor.setDescription(criteria.getDescription());
+
+ // scales are put in features
+ List<Feature> features = Lists.newArrayList();
+ Collection<ScaleValue> scaleValues = criteria.getScale();
+ for (ScaleValue scaleValue : scaleValues) {
+ Feature feature = new FeatureImpl();
+
+ // name
+ String scaleValuePrefix = ScaleValue.class.getSimpleName() + "_";
+ feature.setName(scaleValuePrefix + ScaleValue.PROPERTY_NAME);
+ feature.setValue(scaleValue.getName());
+ feature.setValueType(ValueType.STRING);
+
+ // description
+ feature.setName(scaleValuePrefix + ScaleValue.PROPERTY_DESCRIPTION);
+ feature.setValue(scaleValue.getDescription());
+ feature.setValueType(ValueType.STRING);
+
+ // group
+ feature.setName(scaleValuePrefix + ScaleValue.PROPERTY_GROUP);
+ feature.setValue(scaleValue.getGroup());
+ feature.setValueType(ValueType.STRING);
+
+ features.add(feature);
+ }
+ factor.setFeatures(features);
+
+ factors.add(factor);
+ }
+
+ // get all children factors
+ for (Criteria child : criteria.getChildren()) {
+ factors.addAll(getFactors(child));
+ }
+ return factors;
+ }
+}
Added: masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MexicoSaveModelService.java 2011-12-12 16:59:10 UTC (rev 517)
@@ -0,0 +1,33 @@
+package fr.inra.masc.services;
+
+import fr.ifremer.mexico.model.ExperienceDesign;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.File;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ */
+public class MexicoSaveModelService extends MascService {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(MexicoLoadModelService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
+
+ public File saveExperienceDesign(ExperienceDesign mexicoModel, File toSave) {
+
+ // TODO sletellier : write mexico experience design xml file
+ return toSave;
+ }
+
+ public File saveInputDesignDesign(ExperienceDesign mexicoModel, File toSave) {
+
+ // TODO sletellier : write mexico input design xml file
+ return toSave;
+ }
+}
Modified: masc/masc-api/src/main/xmi/masc.zargo
===================================================================
(Binary files differ)
Added: masc/masc-api/src/main/xmi/mexico.zargo
===================================================================
(Binary files differ)
Property changes on: masc/masc-api/src/main/xmi/mexico.zargo
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/MexicoModelConvertorServiceTest.java 2011-12-12 16:59:10 UTC (rev 517)
@@ -0,0 +1,74 @@
+package fr.inra.masc.services;
+
+import fr.ifremer.mexico.model.ExperienceDesign;
+import fr.ifremer.mexico.model.InputDesign;
+import fr.ifremer.mexico.model.Scenario;
+import fr.inra.masc.model.*;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.Collection;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MexicoModelConvertorServiceTest extends AbstractServiceTest {
+
+ @Test
+ public void testConvertMascModelToMexicoExperienceDesignModel() throws Exception {
+ MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+
+ // count masc model criteria
+ Collection<Criteria> criterias = mascModel.getCriteria();
+ int count = 0;
+ for (Criteria criteria : criterias) {
+ count += countChildren(criteria);
+ }
+ assertEquals(count, experienceDesign.getFactors().size());
+ }
+
+ protected int countChildren(Criteria criteria) {
+ Collection<Criteria> children = criteria.getChildren();
+
+ // only editable criterias
+ int count = criteria instanceof EditableCriteria ? 1 : 0;
+
+ for (Criteria child : children) {
+ count += countChildren(child);
+ }
+ return count;
+ }
+
+ @Test
+ public void testConvertMascModelToMexicoInputDesignModel() throws Exception {
+
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ MexicoModelConvertorService mexicoModelConvertorService = getService(MexicoModelConvertorService.class);
+ ExperienceDesign experienceDesign = mexicoModelConvertorService.convertMascModelToMexicoExperienceDesignModel(mascModel);
+ InputDesign inputDesign = mexicoModelConvertorService.convertMascModelToMexicoInputDesignModel(mascModel, experienceDesign);
+
+ Collection<Option> options = mascModel.getOption();
+ assertEquals(options.size(), inputDesign.getScenarios().size());
+
+ int i = 0;
+ for (Option option : options) {
+ Scenario scenario = inputDesign.getScenarios(i++);
+ Collection<OptionValue> optionValues = option.getOptionValue();
+
+ // count option with editable criteria
+ int count = 0;
+ for (OptionValue optionValue : optionValues) {
+ Criteria criteria = optionValue.getCriteria();
+ if (criteria instanceof EditableCriteria) {
+ count++;
+ }
+ }
+ assertEquals(count, scenario.getFactorValues().size());
+ }
+ }
+}
1
0
Author: sletellier
Date: 2011-12-09 19:13:28 +0100 (Fri, 09 Dec 2011)
New Revision: 516
Url: http://nuiton.org/repositories/revision/sandbox/516
Log:
- Add dependencies
Modified:
masc/pom.xml
Modified: masc/pom.xml
===================================================================
--- masc/pom.xml 2011-12-09 18:13:06 UTC (rev 515)
+++ masc/pom.xml 2011-12-09 18:13:28 UTC (rev 516)
@@ -111,12 +111,59 @@
<version>${nuitonI18nVersion}</version>
</dependency>
+ <!-- jaxx dependencies -->
<dependency>
+ <groupId>org.nuiton.jaxx</groupId>
+ <artifactId>jaxx-runtime</artifactId>
+ <version>${jaxxVersion}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.nuiton.jaxx</groupId>
+ <artifactId>jaxx-validator</artifactId>
+ <version>${jaxxVersion}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.nuiton.jaxx</groupId>
+ <artifactId>jaxx-widgets</artifactId>
+ <version>${jaxxVersion}</version>
+ </dependency>
+
+ <!-- commons -->
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-exec</artifactId>
+ <version>1.1</version>
+ </dependency>
+
+ <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>10.0.1</version>
</dependency>
+ <!-- xml parser -->
+ <dependency>
+ <groupId>xpp3</groupId>
+ <artifactId>xpp3</artifactId>
+ <version>1.1.4c</version>
+ </dependency>
+
+ <!-- xml lexer -->
+ <dependency>
+ <groupId>dom4j</groupId>
+ <artifactId>dom4j</artifactId>
+ <version>1.6.1</version>
+ </dependency>
+
+ <!-- xml unit for tests -->
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ <version>1.3</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</dependencyManagement>
1
0
r515 - in masc/masc-api: . src src/main src/main/java/fr/inra/masc src/main/java/fr/inra/masc/model src/main/java/fr/inra/masc/services src/main/resources src/main/xmi src/test src/test/java src/test/java/fr src/test/java/fr/inra src/test/java/fr/inra/masc src/test/java/fr/inra/masc/services src/test/resources src/test/resources/dxi
by sletellier@users.nuiton.org 09 Dec '11
by sletellier@users.nuiton.org 09 Dec '11
09 Dec '11
Author: sletellier
Date: 2011-12-09 19:13:06 +0100 (Fri, 09 Dec 2011)
New Revision: 515
Url: http://nuiton.org/repositories/revision/sandbox/515
Log:
- Add import/export masc model
- Remove visitable entities
- Add some tests and test fils
- Add threshold.csv file to list threshold possible values
Added:
masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java
masc/masc-api/src/main/resources/
masc/masc-api/src/main/resources/threshold.csv
masc/masc-api/src/test/
masc/masc-api/src/test/java/
masc/masc-api/src/test/java/fr/
masc/masc-api/src/test/java/fr/inra/
masc/masc-api/src/test/java/fr/inra/masc/
masc/masc-api/src/test/java/fr/inra/masc/services/
masc/masc-api/src/test/java/fr/inra/masc/services/AbstractServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/EvalInvokerServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/InvokerServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/LoadModelServiceTest.java
masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java
masc/masc-api/src/test/resources/
masc/masc-api/src/test/resources/dxi/
masc/masc-api/src/test/resources/dxi/dexi-model2.0.dxi
masc/masc-api/src/test/resources/dxi/dexi2.0.dxi
masc/masc-api/src/test/resources/log4j.properties
Removed:
masc/masc-api/src/main/java/fr/inra/masc/model/ComputableCriteriaImpl.java
masc/masc-api/src/main/java/fr/inra/masc/model/EditableCriteriaImpl.java
masc/masc-api/src/main/java/fr/inra/masc/model/MascModelImpl.java
masc/masc-api/src/main/java/fr/inra/masc/model/OptionImpl.java
masc/masc-api/src/main/java/fr/inra/masc/model/OptionValueImpl.java
masc/masc-api/src/main/java/fr/inra/masc/model/ScaleValueImpl.java
masc/masc-api/src/main/java/fr/inra/masc/model/ThresholdCriteriaImpl.java
masc/masc-api/src/main/java/fr/inra/masc/model/ValuedCriteriaImpl.java
Modified:
masc/masc-api/pom.xml
masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java
masc/masc-api/src/main/java/fr/inra/masc/model/CriteriaImpl.java
masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java
masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java
masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java
masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java
masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java
masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java
masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java
masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
masc/masc-api/src/main/xmi/masc.zargo
Modified: masc/masc-api/pom.xml
===================================================================
--- masc/masc-api/pom.xml 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/pom.xml 2011-12-09 18:13:06 UTC (rev 515)
@@ -37,10 +37,46 @@
</dependency>
<dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-exec</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
+ <!-- xml parser -->
+ <dependency>
+ <groupId>xpp3</groupId>
+ <artifactId>xpp3</artifactId>
+ </dependency>
+
+ <!-- xml lexer -->
+ <dependency>
+ <groupId>dom4j</groupId>
+ <artifactId>dom4j</artifactId>
+ </dependency>
+
+ <!-- tests -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>xmlunit</groupId>
+ <artifactId>xmlunit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
</dependencies>
<!-- ************************************************************* -->
Modified: masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,16 +1,21 @@
package fr.inra.masc;
import com.google.common.base.Preconditions;
+import com.google.common.collect.*;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.*;
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
+import java.net.URISyntaxException;
import java.net.URL;
+import java.util.List;
import java.util.Properties;
+import static org.nuiton.i18n.I18n.n_;
+
/**
* Masc configuration.
*
@@ -26,6 +31,10 @@
/** Delegate application config object containing configuration. */
protected ApplicationConfig applicationConfig;
+ public static final String THRESHOLD_FILE = "/threshold.csv";
+ public static final String CSV_SEPARATOR = ";";
+ protected Multimap<String, Integer> thresholds;
+
public MascConfig() {
this("masc.properties");
}
@@ -46,6 +55,9 @@
"Could not parse configuration", e);
}
+ // create directory if needed
+ createDirectory(MascConfigOption.DATA_DIRECTORY);
+
if (log.isDebugEnabled()) {
log.debug("parsed options in config file" + applicationConfig.getOptions());
}
@@ -61,6 +73,12 @@
return result;
}
+ public File getDataDirectory() {
+ File file = applicationConfig.getOptionAsFile(MascConfigOption.DATA_DIRECTORY.key);
+ Preconditions.checkNotNull(file);
+ return file;
+ }
+
public Version getApplicationVersion() {
String versionStr = applicationConfig.getOption(MascConfigOption.VERSION.key);
String s = VersionUtil.removeSnapshot(versionStr);
@@ -75,18 +93,70 @@
return url;
}
- public String getDexiPath() {
- String dexyPath = applicationConfig.getOption(MascConfigOption.DEXI_APP_PATH.key);
- Preconditions.checkNotNull(dexyPath);
- return dexyPath;
+ public File getDexiExecutableFile() {
+ File dexiExecutableFile = applicationConfig.getOptionAsFile(MascConfigOption.DEXI_APP_PATH.key);
+ return dexiExecutableFile;
}
- public String getDexiEvalPath() {
- String dexyEvalPath = applicationConfig.getOption(MascConfigOption.DEXI_EVAL_APP_PATH.key);
- Preconditions.checkNotNull(dexyEvalPath);
- return dexyEvalPath;
+ public File getDexiEvalExecutableFile() {
+ File dexiEvalExecutableFile = applicationConfig.getOptionAsFile(MascConfigOption.DEXI_EVAL_APP_PATH.key);
+ return dexiEvalExecutableFile;
}
+
+ public File getThresholdFile() throws FileNotFoundException, URISyntaxException {
+ File thresholdFile = new File(getDataDirectory(), THRESHOLD_FILE);
+ // if file doesnt exist, search it on classpath
+ if (!thresholdFile.exists()) {
+ URL thresholdUrl = MascConfig.class.getResource(THRESHOLD_FILE);
+ thresholdFile = new File(thresholdUrl.toURI());
+ }
+
+ return thresholdFile;
+ }
+
+ public Multimap<String, Integer> getThresholds() {
+
+ // use singleton to parse just one time
+ if (thresholds == null) {
+ try {
+ thresholds = ArrayListMultimap.create();
+
+ // get file
+ File thresholdFile = getThresholdFile();
+
+ // read file
+ BufferedReader thresholdReader = FileUtil.getReader(thresholdFile);
+
+ // read line
+ String line = thresholdReader.readLine();
+
+ // parse all file
+ while (StringUtils.isNotEmpty(line)) {
+ String[] splitedLine = line.split(CSV_SEPARATOR);
+
+ // first is the key
+ String key = splitedLine[0];
+
+ // parse values
+ List<Integer> values = Lists.newArrayList();
+ for (int i=1;i<splitedLine.length;i++) {
+ values.add(Integer.parseInt(splitedLine[i]));
+ }
+ thresholds.putAll(key, values);
+
+ // read line
+ line = thresholdReader.readLine();
+ }
+ } catch (Exception eee) {
+ String msg = "Failed to read threshold file";
+ log.error(msg, eee);
+ throw new MascTechnicalException(msg, eee);
+ }
+ }
+ return thresholds;
+ }
+
public boolean getOptionAsBoolean(String propertyName) {
Boolean result = applicationConfig.getOptionAsBoolean(propertyName);
return result != null && result;
@@ -127,7 +197,11 @@
*/
public enum MascConfigOption implements ApplicationConfig.OptionDef {
- /** Main directory where to put echobase data (logs, and others...). */
+ /** Main directory where to put masc data (logs, and others...). */
+ DATA_DIRECTORY("data.directory",
+ n_("masc.config.data.directory.description"),
+ "/var/local/masc",
+ File.class),
VERSION("project.version",
"Version de l'application",
"", Version.class),
@@ -136,10 +210,10 @@
"", URL.class),
DEXI_APP_PATH("masc.dexi.path",
"Chemin de l'application masc",
- "", String.class),
+ null, String.class),
DEXI_EVAL_APP_PATH("masc.dexiEval.path",
"Chemin de l'application masc eval",
- "", String.class);
+ null, String.class);
/** Configuration key. */
protected final String key;
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/ComputableCriteriaImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/ComputableCriteriaImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/ComputableCriteriaImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,15 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class ComputableCriteriaImpl extends ComputableCriteria {
-
- @Override
- public void accept(MascVisitor visitor) {
- // TODO
- }
-}
Modified: masc/masc-api/src/main/java/fr/inra/masc/model/CriteriaImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/CriteriaImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/CriteriaImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -5,4 +5,17 @@
* @since 0.1
*/
public abstract class CriteriaImpl extends Criteria {
+
+ @Override
+ public boolean equals(Object o) {
+
+ // only for criteria
+ if (!(o instanceof Criteria)) {
+ return false;
+ }
+ Criteria criteria = (Criteria) o;
+
+ // name is unique key
+ return super.getName().equals(criteria.getName());
+ }
}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/EditableCriteriaImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/EditableCriteriaImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/EditableCriteriaImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,10 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public abstract class EditableCriteriaImpl extends EditableCriteria {
-}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/MascModelImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/MascModelImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/MascModelImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,15 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class MascModelImpl extends MascModel {
-
- @Override
- public void accept(MascVisitor visitor) {
- // TODO
- }
-}
Added: masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java (rev 0)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/MascXmlConstant.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,30 @@
+package fr.inra.masc.model;
+
+/**
+ * Regroup all masc xml constants tags
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MascXmlConstant {
+
+ public static final String DEXI = "DEXi";
+ public static final String LINE = "line";
+ public static final String ATTRIBUTE = "attribute";
+ public static final String MODEL_NAME = MascModel.PROPERTY_NAME;
+ public static final String MODEL_DESCRIPTION = MascModel.PROPERTY_DESCRIPTION;
+ public static final String OPTION = MascModel.PROPERTY_OPTION;
+ public static final String SETTINGS = MascModel.PROPERTY_SETTINGS;
+ public static final String CRITERIA_NAME = Criteria.PROPERTY_NAME;
+ public static final String CRITERIA_DESCRIPTION = Criteria.PROPERTY_DESCRIPTION;
+ public static final String SCALE = Criteria.PROPERTY_SCALE;
+ public static final String SCALE_VALUE = ScaleValue.class.getSimpleName();
+ public static final String SCALE_VALUE_NAME = ScaleValue.PROPERTY_NAME;
+ public static final String SCALE_VALUE_DESCRIPTION = ScaleValue.PROPERTY_DESCRIPTION;
+ public static final String SCALE_VALUE_GROUP = ScaleValue.PROPERTY_GROUP;
+ public static final String FUNCTION = ComputableCriteria.PROPERTY_FUNCTION;
+ public static final String FUNCTION_LOW = Function.PROPERTY_LOW;
+ public static final String FUNCTION_ENTERED = Function.PROPERTY_ENTERED;
+ public static final String FUNCTION_WEIGHTS = Function.PROPERTY_WEIGHTS;
+ public static final String FUNCTION_CONSIST = Function.PROPERTY_CONSIST;
+}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/OptionImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/OptionImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/OptionImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,15 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class OptionImpl extends Option {
-
- @Override
- public void accept(MascVisitor visitor) {
- // TODO
- }
-}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/OptionValueImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/OptionValueImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/OptionValueImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,15 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class OptionValueImpl extends OptionValue {
-
- @Override
- public void accept(MascVisitor visitor) {
- // TODO
- }
-}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/ScaleValueImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/ScaleValueImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/ScaleValueImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,15 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class ScaleValueImpl extends ScaleValue {
-
- @Override
- public void accept(MascVisitor visitor) {
- // TODO
- }
-}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/ThresholdCriteriaImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/ThresholdCriteriaImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/ThresholdCriteriaImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,15 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class ThresholdCriteriaImpl extends ThresholdCriteria {
-
- @Override
- public void accept(MascVisitor visitor) {
- // TODO
- }
-}
Deleted: masc/masc-api/src/main/java/fr/inra/masc/model/ValuedCriteriaImpl.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/model/ValuedCriteriaImpl.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/model/ValuedCriteriaImpl.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,15 +0,0 @@
-package fr.inra.masc.model;
-
-import fr.inra.masc.MascVisitor;
-
-/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
-public class ValuedCriteriaImpl extends ValuedCriteria {
-
- @Override
- public void accept(MascVisitor visitor) {
- // TODO
- }
-}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,8 +1,53 @@
package fr.inra.masc.services;
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.DefaultExecutor;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.File;
+import java.io.IOException;
+
/**
* @author sletellier <letellier(a)codelutin.com>
*/
public class DexiEvalInvokerService extends MascService {
+ /** Logger */
+ private static Log log = LogFactory.getLog(OptionCRUDService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
+
+ /**
+ * Invoke DExIEval application with arguments
+ *
+ * @param importFile file to open in DEXiEval
+ * @param args additional arguments for DEXiEval
+ * @return evaluated file
+ * @throws java.io.IOException if command line fail
+ */
+ public File invokeDexiEval(File importFile, String... args) throws IOException {
+ File dexyEvalExecutableFile = getConfig().getDexiEvalExecutableFile();
+
+ CommandLine commandLine = new CommandLine(dexyEvalExecutableFile);
+
+ // add all arguments
+ commandLine.addArguments(args);
+
+ // open open dexi file
+ commandLine.addArgument(importFile.getAbsolutePath());
+
+ DefaultExecutor executor = new DefaultExecutor();
+
+ // invoke
+ int exitValue = executor.execute(commandLine);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Command line '" + commandLine.toString() + "' exit with value : " + exitValue);
+ }
+ return importFile;
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,8 +1,61 @@
package fr.inra.masc.services;
+import fr.inra.masc.MascTechnicalException;
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.DefaultExecutor;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.File;
+import java.io.IOException;
+
/**
* @author sletellier <letellier(a)codelutin.com>
* @since 0.1
*/
public class DexiInvokerService extends MascService {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(DexiInvokerService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
+
+ /**
+ * Invoke DEXi application
+ *
+ * @param importFile file to open in DEXi
+ */
+ public void invokeDexi(File importFile) {
+
+ File dexiApp = getConfig().getDexiExecutableFile();
+
+ final CommandLine commandLine = new CommandLine(dexiApp);
+
+ // open open dexi file
+ String dexiInputFile = importFile.getPath();
+ commandLine.addArgument(dexiInputFile);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Starting DEXi with input file '" + dexiInputFile + "'");
+ }
+
+ // lunch DEXi in other thread
+ Thread tread = new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ // invoke dexi
+ try {
+ DefaultExecutor executor = new DefaultExecutor();
+ executor.execute(commandLine);
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to lunch DEXi", eee);
+ }
+ }
+ });
+ tread.start();
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,8 +1,19 @@
package fr.inra.masc.services;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
/**
* @author sletellier <letellier(a)codelutin.com>
* @since 0.1
*/
public class ImageGeneratorService extends MascService {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(ImageGeneratorService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,17 +1,363 @@
package fr.inra.masc.services;
-import fr.inra.masc.model.MascModel;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import fr.inra.masc.model.*;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.*;
+import static fr.inra.masc.model.MascXmlConstant.*;
+
/**
+ * Service use to parse mascXmlFile and build MascModel corresponding
+ *
* @author sletellier <letellier(a)codelutin.com>
* @since 0.1
*/
public class LoadModelService extends MascService {
+ /** Logger */
+ private static Log log = LogFactory.getLog(LoadModelService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
+
public MascModel loadModel(File mascFile) {
- // TODO
- return null;
+
+ MascModel mascModel = null;
+ try {
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ XmlPullParser parser = factory.newPullParser();
+ parser.setInput(new FileReader(mascFile));
+
+ // parse model parameters
+ mascModel = parseMascModel(parser);
+
+ } catch (XmlPullParserException eee) {
+ throwMascTechnicalException("Failed to parse masc file '" + mascFile.getName() + "'", eee);
+ } catch (FileNotFoundException eee) {
+ throwMascTechnicalException("Masc file '" + mascFile.getName() + "' not found", eee);
+ } catch (IOException eee) {
+ throwMascTechnicalException("Error reading masc file '" + mascFile.getName() + "'", eee);
+ }
+
+ return mascModel;
}
+
+ protected MascModel parseMascModel(XmlPullParser parser) throws IOException, XmlPullParserException {
+
+ MascModel model = new MascModelImpl();
+
+ parseMeta(model, parser);
+ parseAttributes(model, parser);
+
+ return model;
+ }
+
+ protected void parseMeta(MascModel model, XmlPullParser parser) throws IOException, XmlPullParserException {
+
+ // file must start with DEXi balise
+ if (parser.next() == XmlPullParser.START_TAG &&
+ !parserEqual(parser, DEXI)) {
+ throwMascTechnicalException("Masc file must start with " + DEXI + " tag");
+ }
+
+ // start parsing model parameters
+ // parse name
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, MODEL_NAME)) {
+ model.setName(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse description
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, MODEL_DESCRIPTION)) {
+
+ List<String> descriptions = Lists.newArrayList();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, MODEL_DESCRIPTION))) {
+
+ if (parserEqual(parser, LINE)) {
+ descriptions.add(parser.nextText());
+ }
+ }
+
+ model.setDescription(descriptions);
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse options
+ List<Option> options = Lists.newLinkedList();
+ while (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, OPTION)) {
+
+ Option option = new OptionImpl();
+ option.setName(parser.nextText());
+ options.add(option);
+
+ // read end option tag
+ eventType = parser.nextTag();
+ }
+ model.setOption(options);
+
+ // parse settings
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, SETTINGS)) {
+
+ Map<String, String> settings = new LinkedHashMap<String, String>();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, SETTINGS))) {
+ settings.put(parser.getName(), parser.nextText());
+ }
+ model.setSettings(settings);
+
+ // read next tag
+ parser.nextTag();
+ }
+ }
+
+ protected void parseAttributes(MascModel model, XmlPullParser parser) throws IOException, XmlPullParserException {
+ List<Criteria> criterias = Lists.newArrayList();
+ while (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, ATTRIBUTE)) {
+
+ Criteria criteria = parseAttribute(model, parser);
+ criterias.add(criteria);
+
+ // Read closeTag
+ parser.nextTag();
+ }
+ model.setCriteria(criterias);
+ }
+
+ protected Criteria parseAttribute(MascModel model, XmlPullParser parser) throws IOException, XmlPullParserException {
+
+ // parse name
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ !parserEqual(parser, CRITERIA_NAME)) {
+
+ log.info(parser.getName());
+ throwMascTechnicalException("All criteria must have a name");
+ }
+ String name = parser.nextText();
+
+ // read next tag
+ eventType = parser.nextTag();
+
+ // parse description
+ String description = null;
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, CRITERIA_DESCRIPTION)) {
+
+ description = parser.nextText();
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse scales
+ if (eventType == XmlPullParser.START_TAG &&
+ !parserEqual(parser, SCALE)) {
+
+ throwMascTechnicalException("All criteria must have a scalesValue");
+ }
+ List<ScaleValue> scaleValues = parseScale(parser);
+
+ // parse function
+ Function function = null;
+ if (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION)) {
+
+ function = parseFunction(parser);
+ }
+
+ // parse option value
+ int optionValueCnt = 0;
+ List<OptionValue> optionValues = Lists.newLinkedList();
+ while (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, OPTION)) {
+
+ OptionValue optionValue = new OptionValueImpl();
+ optionValue.setValue(Integer.parseInt(parser.nextText()));
+ Option option = model.getOption(optionValueCnt++);
+
+ // initialize option value list
+ if (option.getOptionValue() == null) {
+ LinkedList<OptionValue> optionValuesList = Lists.newLinkedList();
+ option.setOptionValue(optionValuesList);
+ }
+ option.addOptionValue(optionValue);
+ optionValues.add(optionValue);
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse attributes
+ List<Criteria> criterias = new ArrayList<Criteria>();
+ if (parser.getEventType() == XmlPullParser.START_TAG &&
+ parserEqual(parser, ATTRIBUTE)) {
+
+ while (!(parser.getEventType() == XmlPullParser.END_TAG &&
+ parserEqual(parser, ATTRIBUTE))) {
+
+ criterias.add(parseAttribute(model, parser));
+ parser.nextTag();
+ }
+ }
+
+ Criteria current;
+ if (function != null) {
+
+ // non editable criteria
+ ComputableCriteria computableCriteria = new ComputableCriteriaImpl();
+ computableCriteria.setFunction(function);
+ current = computableCriteria;
+ } else {
+
+ // editable criteria
+ // check on properties if its a threshold criteria
+ Multimap<String,Integer> thresholds = getConfig().getThresholds();
+ if (thresholds.containsKey(name)) {
+ ThresholdCriteria thresholdCriteria = new ThresholdCriteriaImpl();
+ Collection<Integer> values = thresholds.get(name);
+ thresholdCriteria.setValues(values);
+ current = thresholdCriteria;
+ } else {
+ // else is a valued one
+ current = new ValuedCriteriaImpl();
+ }
+ }
+
+ // fill options values
+ for (OptionValue optionValue : optionValues) {
+ optionValue.setCriteria(current);
+ }
+
+ // fill criteria
+ current.setName(name);
+ current.setDescription(description);
+ current.setScale(scaleValues);
+ current.setChildren(criterias);
+
+ return current;
+ }
+
+ protected List<ScaleValue> parseScale(XmlPullParser parser) throws IOException, XmlPullParserException {
+
+ List<ScaleValue> scaleValues = new ArrayList<ScaleValue>();
+ while (!(parser.nextTag() == XmlPullParser.END_TAG &&
+ parserEqual(parser, SCALE))) {
+
+ // parse name
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ !parserEqual(parser, SCALE_VALUE_NAME)) {
+
+ throwMascTechnicalException("All scale value must have a name");
+ }
+ ScaleValue scaleValue = new ScaleValueImpl();
+ scaleValue.setName(parser.nextText());
+ eventType = parser.nextTag();
+
+ // parse description
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, SCALE_VALUE_DESCRIPTION)) {
+
+ scaleValue.setDescription(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse group
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, SCALE_VALUE_GROUP)) {
+
+ String groupValue = parser.nextText();
+ scaleValue.setGroup(ScaleGroup.valueOf(groupValue));
+
+ // read next tag
+ parser.nextTag();
+ }
+ scaleValues.add(scaleValue);
+ }
+ // read scale close tag
+ parser.nextTag();
+
+ return scaleValues;
+ }
+
+ protected Function parseFunction(XmlPullParser parser) throws IOException, XmlPullParserException {
+ Function function = new FunctionImpl();
+
+ // parse low
+ int eventType = parser.nextTag();
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_LOW)) {
+
+ function.setLow(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse entered
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_ENTERED)) {
+
+ function.setEntered(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse weights
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_WEIGHTS)) {
+
+ function.setWeights(parser.nextText());
+
+ // read next tag
+ eventType = parser.nextTag();
+ }
+
+ // parse consist
+ if (eventType == XmlPullParser.START_TAG &&
+ parserEqual(parser, FUNCTION_CONSIST)) {
+
+ function.setConsist(Boolean.parseBoolean(parser.nextText()));
+
+ // read next tag
+ parser.nextTag();
+ }
+
+ // read function close tag
+ parser.nextTag();
+
+ return function;
+ }
+
+ protected boolean parserEqual(XmlPullParser parser, String name) {
+ String tagName = parser.getName();
+ return tagName.equalsIgnoreCase(name);
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,6 +1,8 @@
package fr.inra.masc.services;
import fr.inra.masc.MascConfig;
+import fr.inra.masc.MascTechnicalException;
+import org.apache.commons.logging.Log;
/**
* Contract to place on each Masc service to push the {@code serviceContext}
@@ -21,4 +23,16 @@
public MascConfig getConfig() {
return serviceContext.getConfig();
}
+
+ public abstract Log getLogger();
+
+ protected void throwMascTechnicalException(String msg, Exception eee) {
+ getLogger().error(msg, eee);
+ throw new MascTechnicalException(msg, eee);
+ }
+
+ protected void throwMascTechnicalException(String msg) {
+ getLogger().error(msg);
+ throw new MascTechnicalException(msg);
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,8 +1,36 @@
package fr.inra.masc.services;
+import fr.inra.masc.model.MascModel;
+import fr.inra.masc.model.Option;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
/**
* @author sletellier <letellier(a)codelutin.com>
* @since 0.1
*/
public class OptionCRUDService extends MascService {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(OptionCRUDService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
+
+ public MascModel addOption(MascModel mascModel, Option option) {
+ // TODO
+ return mascModel;
+ }
+
+ public MascModel removeOption(MascModel mascModel, Option option) {
+ // TODO
+ return mascModel;
+ }
+
+ public MascModel editOption(MascModel mascModel, Option option) {
+ // TODO
+ return mascModel;
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,8 +1,19 @@
package fr.inra.masc.services;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
/**
* @author sletellier <letellier(a)codelutin.com>
* @since 0.1
*/
public class ReportGeneratorService extends MascService {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(ReportGeneratorService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
+ }
}
Modified: masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java
===================================================================
--- masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-09 18:10:32 UTC (rev 514)
+++ masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -1,17 +1,256 @@
package fr.inra.masc.services;
-import fr.inra.masc.model.MascModel;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import fr.inra.masc.model.*;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Map;
+import static fr.inra.masc.model.MascXmlConstant.*;
+
/**
- * @author sletellier <letellier(a)codelutin.com>
- * @since 0.1
- */
+ * Service to save masc model
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
public class SaveModelService extends MascService {
- public File saveModel(MascModel mascModel) {
- // TODO
- return null;
+ /** Logger */
+ private static Log log = LogFactory.getLog(SaveModelService.class);
+
+ @Override
+ public Log getLogger() {
+ return log;
}
+
+ public void saveModel(MascModel model, File saveFile) {
+
+ DexiXmlWriter dexiXmlWriter = new DexiXmlWriter(model);
+ Element xml = dexiXmlWriter.composeXml();
+
+ FileWriter writer = null;
+ try {
+ writer = new FileWriter(saveFile);
+ writer.write(xml.toXml(2));
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to write document", eee);
+ } finally {
+ if (writer != null) {
+ try {
+ writer.close();
+ } catch (IOException eee) {
+ throwMascTechnicalException("Failed to close document", eee);
+ }
+ }
+ }
+ }
+
+ protected class DexiXmlWriter {
+
+ protected MascModel model;
+ protected Multimap<Criteria, OptionValue> criteriaOptionValues;
+
+ public DexiXmlWriter(MascModel model) {
+ this.model = model;
+ this.criteriaOptionValues = LinkedListMultimap.create();
+ }
+
+ public Element composeXml() {
+ Element rootElement = new Element(DEXI);
+ composeMeta(rootElement);
+ composeAttributes(rootElement);
+
+ return rootElement;
+ }
+
+
+ protected void composeMeta(Element rootElement) {
+
+ // model name
+ add(rootElement, MODEL_NAME, model.getName());
+
+ // model description
+ Element descriptionElement = createElement(rootElement, MODEL_DESCRIPTION);
+ for (String line : model.getDescription()) {
+ add(descriptionElement, LINE, line);
+ }
+
+ // options
+ for (Option option : model.getOption()) {
+ add(rootElement, OPTION, option.getName());
+
+ // load all option values
+ for (OptionValue optionValue : option.getOptionValue()) {
+
+ // fill map
+ Criteria criteria = optionValue.getCriteria();
+ criteriaOptionValues.put(criteria, optionValue);
+ }
+ }
+
+ // settings
+ Map<String,String> settings = model.getSettings();
+ if (MapUtils.isNotEmpty(settings)) {
+ Element settingElement = createElement(rootElement, SETTINGS);
+ for (String settingName : settings.keySet()) {
+ String settingsValue = settings.get(settingName);
+ add(settingElement, settingName, settingsValue);
+ }
+ }
+ }
+
+ protected void composeAttributes(Element rootElement) {
+ Collection<Criteria> criterias = model.getCriteria();
+ if (CollectionUtils.isNotEmpty(criterias)) {
+ for (Criteria criteria : criterias) {
+ composeAttribute(criteria, rootElement);
+ }
+ }
+ }
+
+ protected void composeAttribute(Criteria criteria, Element rootElement) {
+ Element attributeElement = createElement(rootElement, ATTRIBUTE);
+
+ // attribute name
+ add(attributeElement, CRITERIA_NAME, criteria.getName());
+
+ // attribute description
+ add(attributeElement, CRITERIA_DESCRIPTION, criteria.getDescription());
+
+ // scale
+ Element scaleElement = createElement(attributeElement, SCALE);
+
+ // scale values
+ for (ScaleValue scaleValue : criteria.getScale()) {
+ Element scaleValueElement = createElement(scaleElement, SCALE_VALUE);
+ add(scaleValueElement, SCALE_VALUE_NAME, scaleValue.getName());
+ add(scaleValueElement, SCALE_VALUE_DESCRIPTION, scaleValue.getDescription());
+ add(scaleValueElement, SCALE_VALUE_GROUP, scaleValue.getGroup());
+ }
+
+ // function
+ if (criteria instanceof ComputableCriteria) {
+ ComputableCriteria computableCriteria = (ComputableCriteria) criteria;
+ Element functionElement = createElement(attributeElement, FUNCTION);
+ Function function = computableCriteria.getFunction();
+ add(functionElement, FUNCTION_LOW, function.getLow());
+ add(functionElement, FUNCTION_ENTERED, function.getEntered());
+ add(functionElement, FUNCTION_WEIGHTS, function.getWeights());
+ add(functionElement, FUNCTION_CONSIST, function.getConsist());
+ }
+
+ // options
+ Collection<OptionValue> optionValues = criteriaOptionValues.get(criteria);
+ for (OptionValue optionValue : optionValues) {
+ add(attributeElement, OPTION, optionValue.getValue());
+ }
+
+ // children
+ for (Criteria child : criteria.getChildren()) {
+ composeAttribute(child, attributeElement);
+ }
+ }
+
+ protected void add(Element parentElement, String tagName, Object value) {
+ if (value != null) {
+ String toString = value.toString();
+
+ // boolean are capitalized in masc xml file
+ if (value instanceof Boolean) {
+ toString = StringUtils.capitalize(toString);
+ }
+ createElement(parentElement, tagName, toString);
+ }
+ }
+
+ protected Element createElement(Element parentElement, String tagName) {
+ return createElement(parentElement, tagName, null);
+ }
+
+ protected Element createElement(Element parentElement, String tagName, String text) {
+ Element element = createElement(tagName.toUpperCase(), text);
+ parentElement.add(element);
+ return element;
+ }
+
+ protected Element createElement(String tagName, String text) {
+ return new Element(tagName, text);
+ }
+
+ }
+
+ protected class Element {
+
+ public static final String XML_META = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+
+ protected LinkedList<Element> children;
+ protected String tagName;
+ protected String text;
+
+ public Element(String tagName) {
+ this(tagName, null);
+ }
+
+ public Element(String tagName, String text) {
+ this.tagName = tagName;
+ this.text = text;
+ this.children = Lists.newLinkedList();
+ }
+
+ public void add(Element e) {
+ this.children.add(e);
+ }
+
+ public String toXml(int indent) {
+ StringBuilder stringBuilder = new StringBuilder(XML_META).append("\n");
+ buildXml(-indent, indent, stringBuilder);
+ return stringBuilder.toString();
+ }
+
+ protected void buildXml(int start, int indent, StringBuilder stringBuilder) {
+
+ // closed tag if content is empty
+ if (children.isEmpty() && StringUtils.isEmpty(text)) {
+ stringBuilder.append(getIndentPrefix(start, indent)).append("<").append(tagName).append("/>").append("\n");
+ return;
+ }
+
+ // start tag
+ stringBuilder.append(getIndentPrefix(start, indent)).append("<").append(tagName).append(">");
+ if (StringUtils.isNotEmpty(text)) {
+ stringBuilder.append(StringEscapeUtils.escapeXml(text));
+
+ // end inline tag
+ stringBuilder.append("</").append(tagName).append(">").append("\n");
+ } else {
+ stringBuilder.append("\n");
+ for (Element child : children) {
+ child.buildXml(start + indent, indent, stringBuilder);
+ }
+ // end tag
+ stringBuilder.append(getIndentPrefix(start, indent)).append("</").append(tagName).append(">").append("\n");
+ }
+ }
+
+ protected String getIndentPrefix(int start, int lenght) {
+ String result = "";
+ for (int i=0;i<start + lenght;i++) {
+ result += " ";
+ }
+ return result;
+ }
+ }
}
Modified: masc/masc-api/src/main/xmi/masc.zargo
===================================================================
(Binary files differ)
Added: masc/masc-api/src/test/java/fr/inra/masc/services/AbstractServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/AbstractServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/AbstractServiceTest.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,82 @@
+package fr.inra.masc.services;
+
+import fr.inra.masc.MascConfig;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public abstract class AbstractServiceTest extends Assert {
+
+ protected static File testWorkDir;
+ protected static File testResourcesDir;
+ public static final String DEXI_FILE = "dexi2.0.dxi";
+ public static final String DEXI_MODEL_FILE = "dexi-model2.0.dxi";
+
+ protected MascConfig config;
+ protected MascServiceFactory serviceFactory;
+
+ @BeforeClass
+ public static void initTest() throws IOException {
+ // get maven env basedir
+ String basedir = System.getenv("basedir");
+ if (basedir == null) {
+
+ // says basedir is where we start tests.
+ basedir = new File("").getAbsolutePath();
+ }
+ File basedirFile = new File(basedir);
+ testWorkDir = new File(basedirFile,
+ "target" + File.separator +
+ "surefire-workdir");
+
+ boolean b = testWorkDir.exists() || testWorkDir.mkdirs();
+ if (!b) {
+ throw new IOException(
+ "Could not create workdir directory " + testWorkDir);
+ }
+
+ testResourcesDir = new File(basedirFile,
+ "src" + File.separator +
+ "test" + File.separator +
+ "resources" + File.separator);
+ }
+
+ public File getTestFile(String testName) {
+ return new File(testResourcesDir, testName);
+ }
+
+ public File getDexiTestFile() {
+ return getTestFile("dxi" + File.separator + DEXI_FILE);
+ }
+
+ public File getDexiModelTestFile() {
+ return getTestFile("dxi" + File.separator + DEXI_MODEL_FILE);
+ }
+
+ public MascServiceFactory getServiceFactory() {
+ if (serviceFactory == null) {
+ serviceFactory = new MascServiceFactory();
+ }
+ return serviceFactory;
+ }
+
+ public MascConfig getConfig() {
+ if (config == null) {
+ config = new MascConfig();
+ }
+ return config;
+ }
+
+ protected <E extends MascService> E getService(Class<E> clazz) throws Exception {
+
+ MascServiceContext context = new MascServiceContext(getConfig(), getServiceFactory());
+ return getServiceFactory().newService(clazz, context);
+ }
+
+}
Added: masc/masc-api/src/test/java/fr/inra/masc/services/EvalInvokerServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/EvalInvokerServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/EvalInvokerServiceTest.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,25 @@
+package fr.inra.masc.services;
+
+import org.junit.Assume;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.File;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class EvalInvokerServiceTest extends AbstractServiceTest {
+
+ @Test
+ @Ignore // not yet implemented
+ public void testInvokeDexiEval() throws Exception {
+ // assume that DEXiEval executable is configured
+ File dexiEvalExecutableFile = getConfig().getDexiEvalExecutableFile();
+ Assume.assumeTrue(dexiEvalExecutableFile != null && dexiEvalExecutableFile.exists());
+
+ DexiEvalInvokerService service = getService(DexiEvalInvokerService.class);
+ service.invokeDexiEval(getDexiTestFile());
+ }
+}
Added: masc/masc-api/src/test/java/fr/inra/masc/services/InvokerServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/InvokerServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/InvokerServiceTest.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,23 @@
+package fr.inra.masc.services;
+
+import org.junit.Assume;
+import org.junit.Test;
+
+import java.io.File;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class InvokerServiceTest extends AbstractServiceTest {
+
+ @Test
+ public void testInvokeDexi() throws Exception {
+ // assume that DEXi executable is configured
+ File dexiExecutableFile = getConfig().getDexiExecutableFile();
+ Assume.assumeTrue(dexiExecutableFile != null && dexiExecutableFile.exists());
+
+ DexiInvokerService service = getService(DexiInvokerService.class);
+ service.invokeDexi(getDexiTestFile());
+ }
+}
Added: masc/masc-api/src/test/java/fr/inra/masc/services/LoadModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/LoadModelServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/LoadModelServiceTest.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,26 @@
+package fr.inra.masc.services;
+
+import fr.inra.masc.model.MascModel;
+import org.junit.Test;
+
+import java.io.File;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ */
+public class LoadModelServiceTest extends AbstractServiceTest {
+
+ @Test
+ public void testLoadModelWithDexiTestModelFile() throws Exception {
+ File dexiTestFile = getDexiModelTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ assertNotNull(mascModel);
+ }
+
+ @Test
+ public void testLoadModelWithDexiTestFile() throws Exception {
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+ assertNotNull(mascModel);
+ }
+}
Added: masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java
===================================================================
--- masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java (rev 0)
+++ masc/masc-api/src/test/java/fr/inra/masc/services/SaveModelServiceTest.java 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,57 @@
+package fr.inra.masc.services;
+
+import fr.inra.masc.model.MascModel;
+import org.apache.commons.io.FileUtils;
+import org.custommonkey.xmlunit.Diff;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ */
+public class SaveModelServiceTest extends AbstractServiceTest {
+
+ @Test
+ @Ignore // TODO sletellier 20111209 : fix line separator
+ public void testSaveModelWithDexiTestModelFile() throws Exception {
+
+ File dexiTestFile = getDexiModelTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+
+ File savedFile = new File(testWorkDir, "dexiTestModelFileResult.dxi");
+ getService(SaveModelService.class).saveModel(mascModel, savedFile);
+
+ // compare input and output files
+ assertFilesEquals(dexiTestFile, savedFile);
+ }
+
+ @Test
+ public void testSaveWithDexiTestFile() throws Exception {
+
+ File dexiTestFile = getDexiTestFile();
+ MascModel mascModel = getService(LoadModelService.class).loadModel(dexiTestFile);
+
+ File savedFile = new File(testWorkDir, "dexiTestFileResult.dxi");
+ getService(SaveModelService.class).saveModel(mascModel, savedFile);
+
+ // compare input and output files
+ assertFilesEquals(dexiTestFile, savedFile);
+ }
+
+ protected void assertFilesEquals(File in, File out) throws IOException, SAXException {
+ String input = FileUtils.readFileToString(in);
+ String output = FileUtils.readFileToString(out);
+
+ assertEquals(input.trim(), output.trim());
+
+ Diff myDiff = new Diff(input, output);
+ assertTrue("XML similar " + myDiff.toString(),
+ myDiff.similar());
+ assertTrue("XML identical " + myDiff.toString(),
+ myDiff.identical());
+ }
+}
Added: masc/masc-api/src/test/resources/dxi/dexi-model2.0.dxi
===================================================================
--- masc/masc-api/src/test/resources/dxi/dexi-model2.0.dxi (rev 0)
+++ masc/masc-api/src/test/resources/dxi/dexi-model2.0.dxi 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,2916 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DEXi>
+ <NAME>MASC 2.0</NAME>
+ <DESCRIPTION>
+ <LINE>Le modele MASC 2.0 a ete conçu pour faciliter l evaluation multicritere de la contribution des systemes de grandes cultures au developpement durable. Il peut etre utilise dans le cadre de diverses etudes a caractere exploratoire pour effectuer notamment :</LINE>
+ <LINE/>
+ <LINE>- de l analyse des performances globales des systemes de culture ou d une comparaison des performances de plusieurs systemes existants dans un territoire (evaluation ex post)</LINE>
+ <LINE/>
+ <LINE>- des études de nouveaux systèmes de culture en comparaison (ou non) avec des systemes existants construits dans le cadre d'une conception par prototypage suivi d'une evaluation ex ante.</LINE>
+ <LINE/>
+ <LINE>Il s agit de confronter les performances elementaires du systeme de culture a un jeu de preferences afin d'obtenir une note globale de durabilite puis eventuellement de fournir un classement comparatif et argumente de plusieurs systemes de cultures evalues avec un meme profil de preferences.</LINE>
+ <LINE/>
+ <LINE>Le modele MASC 2.0 derive du modele MASC V1.0 (Sadok et al., 2009). Il a ete developpe dans le cadre du projet GIS HPEE, en tenant compte de l'experience acquise par les utilisateurs de la version 1.0 de l'outil. Il fait l'objet des documents d'accompagnement suivants :</LINE>
+ <LINE/>
+ <LINE>Craheix D., Angevin F., Bergez J.-E., Bockstaller C., Colomb B., Guichard L., Reau R., Sadok W., Doré T (2011). MASC 2.0, Un outil pour l analyse de la contribution des systèmes de culture au developpement durable. Jeu complet de fiches criteres de MASC 2.0. INRA - AgroParisTech - GIS GC HP2E, 133 p.</LINE>
+ <LINE/>
+ <LINE>Craheix D., Angevin F., Bergez J.-E., Bockstaller C., Colomb B., Guichard L., Reau R., Sadok W., Doré T (2011). MASC 2.0, Un outil pour l'analyse de la contribution des systemes de culture au developpement durable. Presentation & principes d utilisation. INRA - AgroParisTech - GIS GC HP2E, 54 p.</LINE>
+ <LINE/>
+ <LINE>Le modele d evaluation qualitative etabli avec le present outil DEXi 3.03 repose sur la definition de fonctions d utilite qui realisent les agregations des criteres d evaluation a partir de regles de raisonnement qualitatif. Ces regles determinent la ponderation des critères dans le processus d'agregation, pour parvenir au diagnostic de leur contribution au developpement durable. Les regles incorporees actuellement dans l'outil et les ponderations qui en decoulent ne doivent pas être considerees comme normatives. Elles ont ete etablies a titre d'exemple et doivent être reconsiderees par les utilisateurs, en fonction des specificites du projet d'evaluation et des preoccupations associees aux systemes de culture a evaluer. </LINE>
+ <LINE/>
+ <LINE>Le choix des modes de calcul ou d'evaluation par expertise dirigee des indicateurs basiques est sous l entiere responsabilite de l utilisateur ou du collectif d utilisation. Aucun choix normatif concernant ces modes n'est associe à la presente version du modele MASC 2.0.</LINE>
+ </DESCRIPTION>
+ <SETTINGS>
+ <LINKING>True</LINKING>
+ <PAGEBREAK>True</PAGEBREAK>
+ <EVALTRIM>10</EVALTRIM>
+ <FONTSIZE>8</FONTSIZE>
+ <FONTNAME>Courier New</FONTNAME>
+ </SETTINGS>
+ <ATTRIBUTE>
+ <NAME>Contribution au developpement durable</NAME>
+ <DESCRIPTION>CDDUR Contribution du SDC au developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>assez faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>assez elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>00000000110011201123012330001100112012231123412345001120122312334123452345601123122341234523456345660123312345234563456635666</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Dimension economique</NAME>
+ <DESCRIPTION>CDECO Contribution du SDC a la dimension economique du developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0001001101121123001101121123123301121123123423441123123423443444</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Resultats economiques</NAME>
+ <DESCRIPTION>RES Resultats economiques du SDC pour l agriculteur</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000000111000111122222111122223233112222333333</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Rentabilite</NAME>
+ <DESCRIPTION>MSN Rentabilite a court terme du SDC calculee avec la marge semi-nette</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Autonomie economique</NAME>
+ <DESCRIPTION>AUTECO Autonomie du SDC vis a vis des aides publiques et des intrants</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Independance economique</NAME>
+ <DESCRIPTION>IND Independance economique vis-a-vis dess aides incluses dans la marge semi-nette</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Efficience economique</NAME>
+ <DESCRIPTION>EFF Efficience economique vis-a-vis des intrants comptabilises dans la marge semi-nette</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Surcout en materiel</NAME>
+ <DESCRIPTION>MAT Surcout en investissements lies au materiel supplementaire specifique au SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Capacite productive a long terme</NAME>
+ <DESCRIPTION>CPLT Evolution de la capacite productive des parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite physico-chimique</NAME>
+ <DESCRIPTION>MFPC Evolution de la fertilite physico-chimique dans les parcelles soumises au SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise du statut acido-basique du sol</NAME>
+ <DESCRIPTION>MSAB Evolution du statut acido-basique du sol dans les parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l etat structural du sol</NAME>
+ <DESCRIPTION>MES Evolution de la structure du sol dans les parcelles soumises au SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite phosphopotassique</NAME>
+ <DESCRIPTION>MFPP Evolution de la fertilite phospho-potassique des parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des bioagresseurs</NAME>
+ <DESCRIPTION>MBAGR Evolution de la pression des bioagresseurs dans les parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des maladies et ravageurs</NAME>
+ <DESCRIPTION>MMR Evolution de la pression de maladies et de ravageurs telluriques </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des adventices</NAME>
+ <DESCRIPTION>MADV Evolution de la pression des adventices </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Contribution au developpement economique</NAME>
+ <DESCRIPTION>CDEV Contribution du SDC au developpement economique des filieres et du territoire</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000112223333</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Qualite des produits</NAME>
+ <DESCRIPTION>QP Risque de non atteinte de niveau de qualite des recoltes exige par les filieres</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000112233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Qualite sanitaire</NAME>
+ <DESCRIPTION>QS Risque de non atteinte de niveau de qualite sanitaire exige par les filieres</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Qualite technonologique et esthetique des produits</NAME>
+ <DESCRIPTION>QTEP Risque de non atteinte du niveau de qualite technologique/esthetique exige</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Contribution a l emergence de filieres</NAME>
+ <DESCRIPTION>CENF Contribution a l emergence de nouvelles filieres</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>nulle</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>Moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dimension sociale</NAME>
+ <DESCRIPTION>CDSOC Contribution du SDC a la dimension sociale du developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0012012312342344</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Satisfaction des attentes de la societe</NAME>
+ <DESCRIPTION>SATISS Compatibilite du SDC avec les attentes supposees de la societe</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Contribution a l emploi</NAME>
+ <DESCRIPTION>EMP Contribution du SDC a l insertion sociale et au developpement local par les emplois </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Fourniture de matieres premieres</NAME>
+ <DESCRIPTION>FMP Contribution du SDC a satisfaire les besoins de la societe en produits agricoles</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Satisfaction des attentes de l agriculteur</NAME>
+ <DESCRIPTION>SATISA Compatibilite du SDC avec les attentes sociales de l agriculteur</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Facilite de mise en oeuvre</NAME>
+ <DESCRIPTION>FMO Appreciation qualitative des difficultes techniques liees a la realisation du SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000112123333</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Complexite des itineraires techniques</NAME>
+ <DESCRIPTION>CIT Complexite des interventions culturales induites par le SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Temps de veille technico-economique</NAME>
+ <DESCRIPTION>TVTE Difficulte de mise en oeuvre d un SDC compose de cultures differentes</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Qualite des conditions de travail</NAME>
+ <DESCRIPTION>QCT Impact du SDC sur les conditions de travail de l agriculteur ou des ouvriers</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000011012000012023000023033</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Surcharge de travail</NAME>
+ <DESCRIPTION>SDT Contribution du SDC a la surcharge de travail en periode de pointe</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Risque pour la sante de l applicateur</NAME>
+ <DESCRIPTION>TOX Risque d intoxication du travailleur lors de la manipulation des produits phytosanitaires</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <DESCRIPTION>> 2</DESCRIPTION>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ <DESCRIPTION>1 < Tox < ou = 2</DESCRIPTION>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <DESCRIPTION>0 < Tox < ou = 1</DESCRIPTION>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Difficulte physique</NAME>
+ <DESCRIPTION>DIFF Niveau de penibilite physique associe a la conduite des operations culturales du SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dimension environnementale</NAME>
+ <DESCRIPTION>CDENV Contribution du SDC a la dimension environnementale du developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0001001101121123001101121123123301121123123423441123123423443444</LOW>
+ <WEIGHTS>33;33;33</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Contribution a la qualite du milieu</NAME>
+ <DESCRIPTION>CQM Contribution du SDC a preserver les composantes air-eau-sol du milieu</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Contribution a la qualite de l eau</NAME>
+ <DESCRIPTION>CQE Contribution du SDC a preserver la qualite de l eau</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de pesticides Eaux</NAME>
+ <DESCRIPTION>MPPE Risque de pollution des eaux profondes et superficielles par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise pertes dans les eaux profondes</NAME>
+ <DESCRIPTION>MPEP Risque de pollution des eaux profondes par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise pertes dans les eaux superficielles</NAME>
+ <DESCRIPTION>MPES Risque de pollution des eaux superficielles par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de NO3</NAME>
+ <DESCRIPTION>MPNO3 Risque de pollution des eaux induit par les nitrates</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de P</NAME>
+ <DESCRIPTION>MPPH Risque de pollution des eaux induit par le phosphore</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Contribution a la qualite air</NAME>
+ <DESCRIPTION>CQA Contribution du SDC a preserver la qualite de l air</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000000100110112000000110112112300010112112312330011012212332333</LOW>
+ <WEIGHTS>30;40;30</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des emissions de NH3</NAME>
+ <DESCRIPTION>MNH3 Risque de pertes d ammoniac par volatilisation </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des emissions de N2O</NAME>
+ <DESCRIPTION>MN2O Risque de pertes de protoxyde d azote dans l air</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des emissions de pesticides Air</NAME>
+ <DESCRIPTION>MPA Risque de pollution atmospherique par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Preservation de la qualite du sol</NAME>
+ <DESCRIPTION>PQS Contribution du SDC a preserver la qualite du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000000000000000000000110111011200110111012301330011011201330233</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l accumulation d elements toxiques</NAME>
+ <DESCRIPTION>MAET Maitrise a long terme de l accumulation d elements toxiques dans le sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise du statut organique</NAME>
+ <DESCRIPTION>MSO Maitrise de la teneur en matiere organique du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l erosion</NAME>
+ <DESCRIPTION>MERO Maitrise du risque d erosion du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pression sur les ressources abiotiques</NAME>
+ <DESCRIPTION>PSRA Pression exercee par le SDC sur les ressources abiotiques</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <WEIGHTS>33;33;33</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Pression Eau</NAME>
+ <DESCRIPTION>PSEAU Pression exercee par le SDC sur la disponibilite locale en eau douce</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001112233</LOW>
+ <WEIGHTS>70;30</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Conso. en eau d irrigation en periode critique</NAME>
+ <DESCRIPTION>IRRC Consommation d eau d irrigation en periodes critiques (secheresse/etiage)</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dependance vis a vis de la ressource en eau</NAME>
+ <DESCRIPTION>DPEAU Autonomie du SDC vis-a-vis de la ressource en eau</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pression Energie</NAME>
+ <DESCRIPTION>PSEN Impact du SDC sur la durabilite des ressources energetiques</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>011122123</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Consommation en energie</NAME>
+ <DESCRIPTION>CEN Consommation brute en energie fossile associee a la conduite du SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <DESCRIPTION><4</DESCRIPTION>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ <DESCRIPTION>[4-7[</DESCRIPTION>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <DESCRIPTION>>=7</DESCRIPTION>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Efficience energetique</NAME>
+ <DESCRIPTION>EEN Rapport d efficience entre lenergie produite et energie consommee par le SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pression Phosphore</NAME>
+ <DESCRIPTION>PSPH Pression exerce par leSDC sur les ressources biogeochimiques en phosphore</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la biodiversite</NAME>
+ <DESCRIPTION>CBIODI Contribution du SDC a preserver la biodiversite peu mobile</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000000101121122000000111122122300000122122322330000112222332333</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Conservation de la macrofaune</NAME>
+ <DESCRIPTION>CMF Contribution du SDC a preserver l abondance et la diversite de la macrofaune</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012201230233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Conservation des insectes volants</NAME>
+ <DESCRIPTION>CMIV Contribution du SDC a preserver l abondance et la diversite des insectes volants</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la macrofaune du sol</NAME>
+ <DESCRIPTION>CMS Contribution du SDC a preserver l abondance et la diversite de la macrofaune du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la flore</NAME>
+ <DESCRIPTION>CFLO Contribution du SDC a preserver l abondance et la diversite floristique</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Abondance floristique</NAME>
+ <DESCRIPTION>ABOF Contribution du SDC a preserver l abondance floristique</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>3210</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des adventices</NAME>
+ <DESCRIPTION>MADV Pression sur la flore adventice (inverse du critere maitrise des adventices)</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Diversite floristique</NAME>
+ <DESCRIPTION>DF Contribution du SDC a preserver la diversite floristique dans les parcelles</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation des micro-organismes du sol</NAME>
+ <DESCRIPTION>CMOS Contribution du SDC a preserver l abondance et la diversite des microorganismes du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise du statut acido-basique du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001100220012012201220133222202232233</LOW>
+ <ENTERED>++++++++++++++++++++++++++--+---+---</ENTERED>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Statut acido-basique initial</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>CEC (Pouvoir tampon du sol)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Impact du SDC</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0012012212222223</LOW>
+ <ENTERED>+--------------+</ENTERED>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Effet des pratiques acidifiantes</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des amendements basiques</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l etat structural du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011001212332233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Degradation de la structure du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>01122323</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Proportion de cultures recoltees en mauvaises conditions</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des equipements limitant le tassement</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Regeneration de la structure du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0012012211132233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Aptitude du sol a la fissuration</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Regeneration mecanique de la structure</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite phosphopotassique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101230133</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertitilite phosphorique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000111221001222333001233333</LOW>
+ <WEIGHTS>60;29;20</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Etat de fertilite initiale P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Bilan et recyclage interne de P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001001111122222</LOW>
+ <WEIGHTS>62;39</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Bilan annuel moyen de P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Recyclage du P par les residus de recolte</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pouvoir tampon du sol P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite potassique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000111221001222333001233333</LOW>
+ <WEIGHTS>28;63;6</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Etat de la fertilite initiale de K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Bilan et recyclage interne de K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000001112122222</LOW>
+ <WEIGHTS>60.3960396039604;39.6039603960396</WEIGHTS>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Bilan annuel moyen de K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Recyclage du K par les residus de recolte</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pouvoir tampon du sol K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des maladies et ravageurs</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000011111011111112122111122233233</LOW>
+ <WEIGHTS>50;30;20</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des familles cultivees</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du travail du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des methodes de lutte (maladies et ravageurs)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des adventices</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001011012112122122122223223223</LOW>
+ <WEIGHTS>38.4615384615385;38.4615384615385;23.0769230769231</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des periodes d implantation</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du labour</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des methodes de lutte (adventices)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000000001000011111111011112223233112222233333</LOW>
+ <WEIGHTS>55;30;15</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Gestion des amendements</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>011122223</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Quantite de P apportee en moyenne</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Methode d incorporaton des amendements P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l erosion</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Teneur en P du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>210</LOW>
+ <WEIGHTS>100</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Etat de fertilite initiale P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l erosion</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>00110012112312332333</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Sensibilite du milieu</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres forte</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>forte</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du SDC</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000111111112211221122222222333322223322332333</LOW>
+ <WEIGHTS>55;35;10</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Defauts de couverture du sol en periodes a risque (erosion)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du travail du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l etat structural du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dependance vis a vis de la ressource en eau</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001101121122</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Demande en eau des cultures</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Autonomie de la ressource</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation des insectes volants</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001111221223</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des familles cultivees</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>IFT Insecticides</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>nulle</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la macrofaune du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0001001111111122011111111122122211121122223322331122222222332333</LOW>
+ <WEIGHTS>38;32;20</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Effet du travail du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des apports de matieres organiques</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>IFT Insecticides</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>nulle</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Diversite floristique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000011000111122111112223122223233222233333</LOW>
+ <WEIGHTS>50;35;14</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des periodes d implantation</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Utilisation d herbicides a spectre large</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>Nulle</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Gestion des bords de champs</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation des micro-organismes du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000001011001011112122112122222233222223233333</LOW>
+ <WEIGHTS>50;25;25</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <ATTRIBUTE>
+ <NAME>Effet des apports de matieres organiques</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des pesticides</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>nul</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des familles cultivees</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+</DEXi>
\ No newline at end of file
Added: masc/masc-api/src/test/resources/dxi/dexi2.0.dxi
===================================================================
--- masc/masc-api/src/test/resources/dxi/dexi2.0.dxi (rev 0)
+++ masc/masc-api/src/test/resources/dxi/dexi2.0.dxi 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,3180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<DEXi>
+ <NAME>MASC 2.0</NAME>
+ <DESCRIPTION>
+ <LINE>Le modele MASC 2.0 a ete conçu pour faciliter l evaluation multicritere de la contribution des systemes de grandes cultures au developpement durable. Il peut etre utilise dans le cadre de diverses etudes a caractere exploratoire pour effectuer notamment :</LINE>
+ <LINE/>
+ <LINE>- de l analyse des performances globales des systemes de culture ou d une comparaison des performances de plusieurs systemes existants dans un territoire (evaluation ex post)</LINE>
+ <LINE/>
+ <LINE>- des études de nouveaux systèmes de culture en comparaison (ou non) avec des systemes existants construits dans le cadre d'une conception par prototypage suivi d'une evaluation ex ante.</LINE>
+ <LINE/>
+ <LINE>Il s agit de confronter les performances elementaires du systeme de culture a un jeu de preferences afin d'obtenir une note globale de durabilite puis eventuellement de fournir un classement comparatif et argumente de plusieurs systemes de cultures evalues avec un meme profil de preferences.</LINE>
+ <LINE/>
+ <LINE>Le modele MASC 2.0 derive du modele MASC V1.0 (Sadok et al., 2009). Il a ete developpe dans le cadre du projet GIS HPEE, en tenant compte de l'experience acquise par les utilisateurs de la version 1.0 de l'outil. Il fait l'objet des documents d'accompagnement suivants :</LINE>
+ <LINE/>
+ <LINE>Craheix D., Angevin F., Bergez J.-E., Bockstaller C., Colomb B., Guichard L., Reau R., Sadok W., Doré T (2011). MASC 2.0, Un outil pour l analyse de la contribution des systèmes de culture au developpement durable. Jeu complet de fiches criteres de MASC 2.0. INRA - AgroParisTech - GIS GC HP2E, 133 p.</LINE>
+ <LINE/>
+ <LINE>Craheix D., Angevin F., Bergez J.-E., Bockstaller C., Colomb B., Guichard L., Reau R., Sadok W., Doré T (2011). MASC 2.0, Un outil pour l'analyse de la contribution des systemes de culture au developpement durable. Presentation & principes d utilisation. INRA - AgroParisTech - GIS GC HP2E, 54 p.</LINE>
+ <LINE/>
+ <LINE>Le modele d evaluation qualitative etabli avec le present outil DEXi 3.03 repose sur la definition de fonctions d utilite qui realisent les agregations des criteres d evaluation a partir de regles de raisonnement qualitatif. Ces regles determinent la ponderation des critères dans le processus d'agregation, pour parvenir au diagnostic de leur contribution au developpement durable. Les regles incorporees actuellement dans l'outil et les ponderations qui en decoulent ne doivent pas être considerees comme normatives. Elles ont ete etablies a titre d'exemple et doivent être reconsiderees par les utilisateurs, en fonction des specificites du projet d'evaluation et des preoccupations associees aux systemes de culture a evaluer. </LINE>
+ <LINE/>
+ <LINE>Le choix des modes de calcul ou d'evaluation par expertise dirigee des indicateurs basiques est sous l entiere responsabilite de l utilisateur ou du collectif d utilisation. Aucun choix normatif concernant ces modes n'est associe à la presente version du modele MASC 2.0.</LINE>
+ </DESCRIPTION>
+ <OPTION>ACTUEL</OPTION>
+ <OPTION>Pest -</OPTION>
+ <SETTINGS>
+ <LINKING>True</LINKING>
+ <PAGEBREAK>True</PAGEBREAK>
+ <EVALTRIM>10</EVALTRIM>
+ <FONTSIZE>8</FONTSIZE>
+ <FONTNAME>Courier New</FONTNAME>
+ </SETTINGS>
+ <ATTRIBUTE>
+ <NAME>Contribution au developpement durable</NAME>
+ <DESCRIPTION>CDDUR Contribution du SDC au developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>assez faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>assez elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>00000000110011201123012330001100112012231123412345001120122312334123452345601123122341234523456345660123312345234563456635666</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>4</OPTION>
+ <ATTRIBUTE>
+ <NAME>Dimension economique</NAME>
+ <DESCRIPTION>CDECO Contribution du SDC a la dimension economique du developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0001001101121123001101121123123301121123123423441123123423443444</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Resultats economiques</NAME>
+ <DESCRIPTION>RES Resultats economiques du SDC pour l agriculteur</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000000111000111122222111122223233112222333333</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Rentabilite</NAME>
+ <DESCRIPTION>MSN Rentabilite a court terme du SDC calculee avec la marge semi-nette</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Autonomie economique</NAME>
+ <DESCRIPTION>AUTECO Autonomie du SDC vis a vis des aides publiques et des intrants</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Independance economique</NAME>
+ <DESCRIPTION>IND Independance economique vis-a-vis dess aides incluses dans la marge semi-nette</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Efficience economique</NAME>
+ <DESCRIPTION>EFF Efficience economique vis-a-vis des intrants comptabilises dans la marge semi-nette</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Surcout en materiel</NAME>
+ <DESCRIPTION>MAT Surcout en investissements lies au materiel supplementaire specifique au SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Capacite productive a long terme</NAME>
+ <DESCRIPTION>CPLT Evolution de la capacite productive des parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite physico-chimique</NAME>
+ <DESCRIPTION>MFPC Evolution de la fertilite physico-chimique dans les parcelles soumises au SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise du statut acido-basique du sol</NAME>
+ <DESCRIPTION>MSAB Evolution du statut acido-basique du sol dans les parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l etat structural du sol</NAME>
+ <DESCRIPTION>MES Evolution de la structure du sol dans les parcelles soumises au SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite phosphopotassique</NAME>
+ <DESCRIPTION>MFPP Evolution de la fertilite phospho-potassique des parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des bioagresseurs</NAME>
+ <DESCRIPTION>MBAGR Evolution de la pression des bioagresseurs dans les parcelles soumises au SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des maladies et ravageurs</NAME>
+ <DESCRIPTION>MMR Evolution de la pression de maladies et de ravageurs telluriques </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des adventices</NAME>
+ <DESCRIPTION>MADV Evolution de la pression des adventices </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Contribution au developpement economique</NAME>
+ <DESCRIPTION>CDEV Contribution du SDC au developpement economique des filieres et du territoire</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000112223333</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Qualite des produits</NAME>
+ <DESCRIPTION>QP Risque de non atteinte de niveau de qualite des recoltes exige par les filieres</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000112233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Qualite sanitaire</NAME>
+ <DESCRIPTION>QS Risque de non atteinte de niveau de qualite sanitaire exige par les filieres</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Qualite technonologique et esthetique des produits</NAME>
+ <DESCRIPTION>QTEP Risque de non atteinte du niveau de qualite technologique/esthetique exige</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Contribution a l emergence de filieres</NAME>
+ <DESCRIPTION>CENF Contribution a l emergence de nouvelles filieres</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>nulle</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>Moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dimension sociale</NAME>
+ <DESCRIPTION>CDSOC Contribution du SDC a la dimension sociale du developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0012012312342344</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Satisfaction des attentes de la societe</NAME>
+ <DESCRIPTION>SATISS Compatibilite du SDC avec les attentes supposees de la societe</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Contribution a l emploi</NAME>
+ <DESCRIPTION>EMP Contribution du SDC a l insertion sociale et au developpement local par les emplois </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Fourniture de matieres premieres</NAME>
+ <DESCRIPTION>FMP Contribution du SDC a satisfaire les besoins de la societe en produits agricoles</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Satisfaction des attentes de l agriculteur</NAME>
+ <DESCRIPTION>SATISA Compatibilite du SDC avec les attentes sociales de l agriculteur</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Facilite de mise en oeuvre</NAME>
+ <DESCRIPTION>FMO Appreciation qualitative des difficultes techniques liees a la realisation du SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000112123333</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Complexite des itineraires techniques</NAME>
+ <DESCRIPTION>CIT Complexite des interventions culturales induites par le SDC </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Temps de veille technico-economique</NAME>
+ <DESCRIPTION>TVTE Difficulte de mise en oeuvre d un SDC compose de cultures differentes</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Qualite des conditions de travail</NAME>
+ <DESCRIPTION>QCT Impact du SDC sur les conditions de travail de l agriculteur ou des ouvriers</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000011012000012023000023033</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Surcharge de travail</NAME>
+ <DESCRIPTION>SDT Contribution du SDC a la surcharge de travail en periode de pointe</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Risque pour la sante de l applicateur</NAME>
+ <DESCRIPTION>TOX Risque d intoxication du travailleur lors de la manipulation des produits phytosanitaires</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <DESCRIPTION>> 2</DESCRIPTION>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ <DESCRIPTION>1 < Tox < ou = 2</DESCRIPTION>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <DESCRIPTION>0 < Tox < ou = 1</DESCRIPTION>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Difficulte physique</NAME>
+ <DESCRIPTION>DIFF Niveau de penibilite physique associe a la conduite des operations culturales du SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dimension environnementale</NAME>
+ <DESCRIPTION>CDENV Contribution du SDC a la dimension environnementale du developpement durable</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0001001101121123001101121123123301121123123423441123123423443444</LOW>
+ <WEIGHTS>33;33;33</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Contribution a la qualite du milieu</NAME>
+ <DESCRIPTION>CQM Contribution du SDC a preserver les composantes air-eau-sol du milieu</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Contribution a la qualite de l eau</NAME>
+ <DESCRIPTION>CQE Contribution du SDC a preserver la qualite de l eau</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de pesticides Eaux</NAME>
+ <DESCRIPTION>MPPE Risque de pollution des eaux profondes et superficielles par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise pertes dans les eaux profondes</NAME>
+ <DESCRIPTION>MPEP Risque de pollution des eaux profondes par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise pertes dans les eaux superficielles</NAME>
+ <DESCRIPTION>MPES Risque de pollution des eaux superficielles par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de NO3</NAME>
+ <DESCRIPTION>MPNO3 Risque de pollution des eaux induit par les nitrates</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de P</NAME>
+ <DESCRIPTION>MPPH Risque de pollution des eaux induit par le phosphore</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Contribution a la qualite air</NAME>
+ <DESCRIPTION>CQA Contribution du SDC a preserver la qualite de l air</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000000100110112000000110112112300010112112312330011012212332333</LOW>
+ <WEIGHTS>30;40;30</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des emissions de NH3</NAME>
+ <DESCRIPTION>MNH3 Risque de pertes d ammoniac par volatilisation </DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des emissions de N2O</NAME>
+ <DESCRIPTION>MN2O Risque de pertes de protoxyde d azote dans l air</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des emissions de pesticides Air</NAME>
+ <DESCRIPTION>MPA Risque de pollution atmospherique par les pesticides</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Preservation de la qualite du sol</NAME>
+ <DESCRIPTION>PQS Contribution du SDC a preserver la qualite du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000000000000000000000110111011200110111012301330011011201330233</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l accumulation d elements toxiques</NAME>
+ <DESCRIPTION>MAET Maitrise a long terme de l accumulation d elements toxiques dans le sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise du statut organique</NAME>
+ <DESCRIPTION>MSO Maitrise de la teneur en matiere organique du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l erosion</NAME>
+ <DESCRIPTION>MERO Maitrise du risque d erosion du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pression sur les ressources abiotiques</NAME>
+ <DESCRIPTION>PSRA Pression exercee par le SDC sur les ressources abiotiques</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101110112001101121122122301111122122312330112122312332333</LOW>
+ <WEIGHTS>33;33;33</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Pression Eau</NAME>
+ <DESCRIPTION>PSEAU Pression exercee par le SDC sur la disponibilite locale en eau douce</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001112233</LOW>
+ <WEIGHTS>70;30</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Conso. en eau d irrigation en periode critique</NAME>
+ <DESCRIPTION>IRRC Consommation d eau d irrigation en periodes critiques (secheresse/etiage)</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dependance vis a vis de la ressource en eau</NAME>
+ <DESCRIPTION>DPEAU Autonomie du SDC vis-a-vis de la ressource en eau</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pression Energie</NAME>
+ <DESCRIPTION>PSEN Impact du SDC sur la durabilite des ressources energetiques</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>011122123</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Consommation en energie</NAME>
+ <DESCRIPTION>CEN Consommation brute en energie fossile associee a la conduite du SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <DESCRIPTION><4</DESCRIPTION>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ <DESCRIPTION>[4-7[</DESCRIPTION>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <DESCRIPTION>>=7</DESCRIPTION>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Efficience energetique</NAME>
+ <DESCRIPTION>EEN Rapport d efficience entre lenergie produite et energie consommee par le SDC</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pression Phosphore</NAME>
+ <DESCRIPTION>PSPH Pression exerce par leSDC sur les ressources biogeochimiques en phosphore</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la biodiversite</NAME>
+ <DESCRIPTION>CBIODI Contribution du SDC a preserver la biodiversite peu mobile</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000000101121122000000111122122300000122122322330000112222332333</LOW>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Conservation de la macrofaune</NAME>
+ <DESCRIPTION>CMF Contribution du SDC a preserver l abondance et la diversite de la macrofaune</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012201230233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Conservation des insectes volants</NAME>
+ <DESCRIPTION>CMIV Contribution du SDC a preserver l abondance et la diversite des insectes volants</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la macrofaune du sol</NAME>
+ <DESCRIPTION>CMS Contribution du SDC a preserver l abondance et la diversite de la macrofaune du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la flore</NAME>
+ <DESCRIPTION>CFLO Contribution du SDC a preserver l abondance et la diversite floristique</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011012212231233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Abondance floristique</NAME>
+ <DESCRIPTION>ABOF Contribution du SDC a preserver l abondance floristique</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>3210</LOW>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>0</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise des adventices</NAME>
+ <DESCRIPTION>MADV Pression sur la flore adventice (inverse du critere maitrise des adventices)</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Diversite floristique</NAME>
+ <DESCRIPTION>DF Contribution du SDC a preserver la diversite floristique dans les parcelles</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation des micro-organismes du sol</NAME>
+ <DESCRIPTION>CMOS Contribution du SDC a preserver l abondance et la diversite des microorganismes du sol</DESCRIPTION>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise du statut acido-basique du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001100220012012201220133222202232233</LOW>
+ <ENTERED>++++++++++++++++++++++++++--+---+---</ENTERED>
+ <WEIGHTS>33.3333333333333;33.3333333333333;33.3333333333333</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Statut acido-basique initial</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>CEC (Pouvoir tampon du sol)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Impact du SDC</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0012012212222223</LOW>
+ <ENTERED>+--------------+</ENTERED>
+ <WEIGHTS>50;50</WEIGHTS>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Effet des pratiques acidifiantes</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des amendements basiques</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l etat structural du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0011001212332233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Degradation de la structure du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>01122323</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Proportion de cultures recoltees en mauvaises conditions</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des equipements limitant le tassement</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Regeneration de la structure du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0012012211132233</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Aptitude du sol a la fissuration</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Regeneration mecanique de la structure</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite phosphopotassique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0000001101230133</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertitilite phosphorique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000111221001222333001233333</LOW>
+ <WEIGHTS>60;29;20</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Etat de fertilite initiale P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Bilan et recyclage interne de P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001001111122222</LOW>
+ <WEIGHTS>62;39</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Bilan annuel moyen de P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Recyclage du P par les residus de recolte</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pouvoir tampon du sol P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de la fertilite potassique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000111221001222333001233333</LOW>
+ <WEIGHTS>28;63;6</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Etat de la fertilite initiale de K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Bilan et recyclage interne de K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000001112122222</LOW>
+ <WEIGHTS>60.3960396039604;39.6039603960396</WEIGHTS>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Bilan annuel moyen de K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Recyclage du K par les residus de recolte</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Pouvoir tampon du sol K</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des maladies et ravageurs</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000011111011111112122111122233233</LOW>
+ <WEIGHTS>50;30;20</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des familles cultivees</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du travail du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des methodes de lutte (maladies et ravageurs)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des adventices</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001011012112122122122223223223</LOW>
+ <WEIGHTS>38.4615384615385;38.4615384615385;23.0769230769231</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des periodes d implantation</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>4</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du labour</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des methodes de lutte (adventices)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise des pertes de P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000000001000011111111011112223233112222233333</LOW>
+ <WEIGHTS>55;30;15</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Gestion des amendements</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>011122223</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Quantite de P apportee en moyenne</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Methode d incorporaton des amendements P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l erosion</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Teneur en P du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>210</LOW>
+ <WEIGHTS>100</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Etat de fertilite initiale P</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l erosion</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>00110012112312332333</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Sensibilite du milieu</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres forte</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>forte</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>4</OPTION>
+ <OPTION>4</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du SDC</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>defavorable</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres favorable</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000111111112211221122222222333322223322332333</LOW>
+ <WEIGHTS>55;35;10</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>3</OPTION>
+ <ATTRIBUTE>
+ <NAME>Defauts de couverture du sol en periodes a risque (erosion)</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet du travail du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Maitrise de l etat structural du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Dependance vis a vis de la ressource en eau</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001101121122</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>2</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Demande en eau des cultures</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Autonomie de la ressource</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>3</OPTION>
+ <OPTION>3</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation des insectes volants</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>001111221223</LOW>
+ <WEIGHTS>50;50</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des familles cultivees</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>IFT Insecticides</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>nulle</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation de la macrofaune du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>0001001111111122011111111122122211121122223322331122222222332333</LOW>
+ <WEIGHTS>38;32;20</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ <ATTRIBUTE>
+ <NAME>Effet du travail du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen a eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyen</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des apports de matieres organiques</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>IFT Insecticides</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>nulle</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Diversite floristique</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000011000111122111112223122223233222233333</LOW>
+ <WEIGHTS>50;35;14</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des periodes d implantation</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>4</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Utilisation d herbicides a spectre large</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>Nulle</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Gestion des bords de champs</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>0</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Conservation des micro-organismes du sol</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <FUNCTION>
+ <LOW>000000001011001011112122112122222233222223233333</LOW>
+ <WEIGHTS>50;25;25</WEIGHTS>
+ <CONSIST>False</CONSIST>
+ </FUNCTION>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ <ATTRIBUTE>
+ <NAME>Effet des apports de matieres organiques</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>tres faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible a moyenne</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyenne a elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>tres elevee</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>1</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet des pesticides</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>nul</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>0</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ <ATTRIBUTE>
+ <NAME>Effet de la diversite des familles cultivees</NAME>
+ <SCALE>
+ <SCALEVALUE>
+ <NAME>faible</NAME>
+ <GROUP>BAD</GROUP>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>moyen</NAME>
+ </SCALEVALUE>
+ <SCALEVALUE>
+ <NAME>eleve</NAME>
+ <GROUP>GOOD</GROUP>
+ </SCALEVALUE>
+ </SCALE>
+ <OPTION>1</OPTION>
+ <OPTION>2</OPTION>
+ </ATTRIBUTE>
+ </ATTRIBUTE>
+</DEXi>
\ No newline at end of file
Added: masc/masc-api/src/test/resources/log4j.properties
===================================================================
--- masc/masc-api/src/test/resources/log4j.properties (rev 0)
+++ masc/masc-api/src/test/resources/log4j.properties 2011-12-09 18:13:06 UTC (rev 515)
@@ -0,0 +1,9 @@
+# Global logging configuration
+log4j.rootLogger=ERROR, stdout
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} %5p [%t] (%F:%L) %M - %m%n
+
+# package level
+log4j.logger.fr.inra.masc=INFO
1
0
r514 - in masc/masc-ui: . src/main/java/fr/inra/mask src/main/java/fr/inra/mask/ui
by sletellier@users.nuiton.org 09 Dec '11
by sletellier@users.nuiton.org 09 Dec '11
09 Dec '11
Author: sletellier
Date: 2011-12-09 19:10:32 +0100 (Fri, 09 Dec 2011)
New Revision: 514
Url: http://nuiton.org/repositories/revision/sandbox/514
Log:
- Creation of masc main ui
Added:
masc/masc-ui/src/main/java/fr/inra/mask/MascApplicationContext.java
masc/masc-ui/src/main/java/fr/inra/mask/RunMasc.java
masc/masc-ui/src/main/java/fr/inra/mask/ui/
masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUI.jaxx
masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUIHandler.java
Modified:
masc/masc-ui/pom.xml
Modified: masc/masc-ui/pom.xml
===================================================================
--- masc/masc-ui/pom.xml 2011-12-08 16:04:32 UTC (rev 513)
+++ masc/masc-ui/pom.xml 2011-12-09 18:10:32 UTC (rev 514)
@@ -18,6 +18,34 @@
<dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>masc-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <!-- jaxx dependencies -->
+ <dependency>
+ <groupId>org.nuiton.jaxx</groupId>
+ <artifactId>jaxx-runtime</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.nuiton.jaxx</groupId>
+ <artifactId>jaxx-validator</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.nuiton.jaxx</groupId>
+ <artifactId>jaxx-widgets</artifactId>
+ </dependency>
+
+ <!-- logging dependencies -->
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </dependency>
+
</dependencies>
<!-- ************************************************************* -->
Added: masc/masc-ui/src/main/java/fr/inra/mask/MascApplicationContext.java
===================================================================
--- masc/masc-ui/src/main/java/fr/inra/mask/MascApplicationContext.java (rev 0)
+++ masc/masc-ui/src/main/java/fr/inra/mask/MascApplicationContext.java 2011-12-09 18:10:32 UTC (rev 514)
@@ -0,0 +1,46 @@
+package fr.inra.mask;
+
+import fr.inra.masc.MascConfig;
+import fr.inra.masc.model.MascModel;
+
+/**
+ * Context of masc application
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MascApplicationContext {
+
+ protected static ThreadLocal<MascApplicationContext> threadLocal;
+
+ protected MascConfig config;
+ protected MascModel mascModel;
+
+ public static MascApplicationContext getContext() {
+ if (threadLocal == null) {
+ threadLocal = new ThreadLocal<MascApplicationContext>();
+ threadLocal.set(new MascApplicationContext());
+ }
+ return threadLocal.get();
+ }
+
+ // use singleton
+ protected MascApplicationContext() {
+ }
+
+ public MascModel getMascModel() {
+ return mascModel;
+ }
+
+ public void setMascModel(MascModel mascModel) {
+ this.mascModel = mascModel;
+ }
+
+ public MascConfig getConfig() {
+ return config;
+ }
+
+ public void setConfig(MascConfig config) {
+ this.config = config;
+ }
+}
Added: masc/masc-ui/src/main/java/fr/inra/mask/RunMasc.java
===================================================================
--- masc/masc-ui/src/main/java/fr/inra/mask/RunMasc.java (rev 0)
+++ masc/masc-ui/src/main/java/fr/inra/mask/RunMasc.java 2011-12-09 18:10:32 UTC (rev 514)
@@ -0,0 +1,34 @@
+package fr.inra.mask;
+
+import fr.inra.mask.ui.MascMainUI;
+import fr.inra.mask.ui.MascMainUIHandler;
+import jaxx.runtime.context.JAXXInitialContext;
+import jaxx.runtime.swing.ErrorDialogUI;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class RunMasc {
+
+ /** Logger */
+ private static Log log = LogFactory.getLog(RunMasc.class);
+
+ public static void main(String[] args) {
+
+ try {
+ MascApplicationContext applicationContext = MascApplicationContext.getContext();
+ JAXXInitialContext jaxxContext = new JAXXInitialContext();
+ jaxxContext.add(applicationContext);
+
+ MascMainUIHandler mainHandler = new MascMainUIHandler();
+ MascMainUI mainUI = mainHandler.initUI(jaxxContext);
+ } catch (Exception eee) {
+ log.error(eee.getMessage(), eee);
+ ErrorDialogUI.showError(eee);
+ System.exit(1);
+ }
+ }
+}
Added: masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUI.jaxx
===================================================================
--- masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUI.jaxx (rev 0)
+++ masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUI.jaxx 2011-12-09 18:10:32 UTC (rev 514)
@@ -0,0 +1,7 @@
+<JFrame id='mainFrame' decorator='help'
+ width='800' height='800'
+ onWindowClosing='getHandler().closeApplication(this)'>
+
+ <MascMainUIHandler id="handler"
+ initializer='getContextValue(MascMainUIHandler.class)'/>
+</JFrame>
\ No newline at end of file
Added: masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUIHandler.java
===================================================================
--- masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUIHandler.java (rev 0)
+++ masc/masc-ui/src/main/java/fr/inra/mask/ui/MascMainUIHandler.java 2011-12-09 18:10:32 UTC (rev 514)
@@ -0,0 +1,34 @@
+package fr.inra.mask.ui;
+
+import jaxx.runtime.context.JAXXInitialContext;
+import jaxx.runtime.swing.ErrorDialogUI;
+
+/**
+ * Handler of main UI
+ *
+ * @author sletellier <letellier(a)codelutin.com>
+ * @since 0.1
+ */
+public class MascMainUIHandler {
+
+ public void closeApplication(MascMainUI ui) {
+ ui.dispose();
+ }
+
+ public MascMainUI initUI(JAXXInitialContext context) {
+
+ // share handler
+ context.add(this);
+
+ // construt main UI
+ MascMainUI ui = new MascMainUI(context);
+
+ // display
+ ui.setVisible(true);
+
+ // synch to error dialog
+ ErrorDialogUI.init(ui);
+
+ return ui;
+ }
+}
1
0