From f5afbfc17b5360689fd793704187f064c05240c4 Mon Sep 17 00:00:00 2001
From: Achraf <aai@kereval.com>
Date: Wed, 1 Jun 2022 10:29:33 +0200
Subject: [PATCH] Choices initial solution structure

---
 hl7templates/goc-tests/.gitignore             |   1 +
 .../interlay/GenerationConfiguration.java     |  13 +-
 .../interlay/ValidatorGeneratorImpl.java      |   3 +-
 .../main/resources/choice/decor_choice.xml    |  73 +++++++
 .../impl/ChoiceDefinitionProcessorImpl.java   |   4 +-
 .../action/ChoiceDefinitionAnalyzer.java      |   1 -
 .../gazelle/tempgen/action/OCLGenerator.java  |  20 ++
 .../action/RuleDefinitionAnalyzer.java        |  22 +-
 .../RDMaximumMultiplicityAnalyzer.java        |  18 +-
 .../RDMinimumMultiplicityAnalyzer.java        |  13 ++
 .../test/resources/processors/decor_name.xml  | 195 ++++++++++++++++++
 .../RuleDefinitionDistinguisherUtil.java      |  16 +-
 .../art/utils/RuleDefinitionProblemUtil.java  |  21 +-
 .../hl7templates-packager-jar/pom.xml         |   4 +-
 .../peripherals/GOCExecutor.java              |  12 +-
 .../peripherals/HL7Templates2GOC.java         |   4 +-
 16 files changed, 389 insertions(+), 31 deletions(-)
 create mode 100644 hl7templates/goc-tests/.gitignore
 create mode 100644 hl7templates/goc-tests/goc-tests-runner/src/main/resources/choice/decor_choice.xml
 create mode 100644 hl7templates/hl7templates-generator-jar/src/test/resources/processors/decor_name.xml

diff --git a/hl7templates/goc-tests/.gitignore b/hl7templates/goc-tests/.gitignore
new file mode 100644
index 0000000..42639b2
--- /dev/null
+++ b/hl7templates/goc-tests/.gitignore
@@ -0,0 +1 @@
+lab/
\ No newline at end of file
diff --git a/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/GenerationConfiguration.java b/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/GenerationConfiguration.java
index 89646b4..0b63402 100644
--- a/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/GenerationConfiguration.java
+++ b/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/GenerationConfiguration.java
@@ -20,6 +20,8 @@ public class GenerationConfiguration {
 
     private String versionLabel;
 
+    private String hl7Conf;
+
 
     public GenerationConfiguration(URL bbrUrl, String outputFolder, String mvn) {
         this.bbrUrl = bbrUrl;
@@ -28,7 +30,7 @@ public class GenerationConfiguration {
     }
 
     public GenerationConfiguration(URL bbrUrl, String outputFolder, String mvn, Boolean ignoreTemplateIdRequirements,
-                                   Boolean ignoreCdaBasicRequirements, Boolean ignoreChoicesPredicates, String serviceName) {
+                                   Boolean ignoreCdaBasicRequirements, Boolean ignoreChoicesPredicates, String serviceName, String hl7Conf) {
         this.bbrUrl = bbrUrl;
         this.outputFolder = outputFolder;
         this.mvn = mvn;
@@ -36,6 +38,7 @@ public class GenerationConfiguration {
         this.ignoreCdaBasicRequirements = ignoreCdaBasicRequirements;
         this.ignoreChoicesPredicates = ignoreChoicesPredicates;
         this.serviceName = serviceName;
+        this.hl7Conf = hl7Conf;
     }
 
     public URL getBbrUrl() {
@@ -101,4 +104,12 @@ public class GenerationConfiguration {
     public void setVersionLabel(String versionLabel) {
         this.versionLabel = versionLabel;
     }
+
+    public String getHl7Conf() {
+        return hl7Conf;
+    }
+
+    public void setHl7Conf(String hl7Conf) {
+        this.hl7Conf = hl7Conf;
+    }
 }
diff --git a/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/ValidatorGeneratorImpl.java b/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/ValidatorGeneratorImpl.java
index 321225c..d785646 100644
--- a/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/ValidatorGeneratorImpl.java
+++ b/hl7templates/goc-tests/goc-tests-runner/src/main/java/net/ihe/gazelle/goctests/interlay/ValidatorGeneratorImpl.java
@@ -33,11 +33,12 @@ public class ValidatorGeneratorImpl implements ValidatorGenerator {
         Boolean ignoreChoicesPredicates = generationConfiguration.isIgnoreChoicesPredicates();
         String serviceName = generationConfiguration.getServiceName();
         String versionLabel = generationConfiguration.getVersionLabel();
+        String hl7Conf = generationConfiguration.getHl7Conf();
 
         //Run GOC
         GOCExecutor gocExecutor = new GOCExecutor(outputFolder);
         ValidatorConfiguration validatorConfiguration = gocExecutor.execute(new StreamBBRResource(bbrUrl),mvn,
-                versionLabel, ignoreTemplateIdRequirements, ignoreCdaBasicRequirements, serviceName, ignoreChoicesPredicates);
+                versionLabel, ignoreTemplateIdRequirements, ignoreCdaBasicRequirements, serviceName, ignoreChoicesPredicates, hl7Conf);
 
         StringBuilder logPath = new StringBuilder(outputFolder)
                 .append("/").append(GeneratedValidator.ROOT_LOG_DIRECTORY)
diff --git a/hl7templates/goc-tests/goc-tests-runner/src/main/resources/choice/decor_choice.xml b/hl7templates/goc-tests/goc-tests-runner/src/main/resources/choice/decor_choice.xml
new file mode 100644
index 0000000..375747a
--- /dev/null
+++ b/hl7templates/goc-tests/goc-tests-runner/src/main/resources/choice/decor_choice.xml
@@ -0,0 +1,73 @@
+<decor>
+
+    <project id="2.16.840.1.113883.2.4.3.11.60.22" prefix="card-" defaultLanguage="en-US">
+    </project>
+
+    <rules>
+        <template id="1.1.1.1.1.1.1.1" name="TestCardinality" displayName="Test Cardinality Template" effectiveDate="2022-01-01T00:00:00" statusCode="active" versionLabel="1.0">
+            <context id="**"></context>
+            <element name="cda:section" id="2.16.840.1.113883.3.1937.99.3.9.5334">
+
+                <element name="cda:templateId" datatype="II" minimumMultiplicity="1" maximumMultiplicity="1" isMandatory="true">
+                    <item label="CONF:0001"></item>
+                    <attribute name="root" value="1.1.1.1.1.1.1.1" datatype="uid"></attribute>
+                </element>
+                <element name="cda:code" datatype="CE" minimumMultiplicity="1" maximumMultiplicity="1" isMandatory="true" id="2.16.840.1.113883.3.1937.99.3.9.5338">
+                    <desc language="en-US">SHALL contain exactly one [1..1] code (CONF:0002).</desc>
+                    <item label="CONF:0002"></item>
+                    <vocabulary code="29545-1" codeSystem="2.11.111.1.111111.1.1"></vocabulary>
+                </element>
+                <element name="cda:title" datatype="ST" minimumMultiplicity="1" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.5339">
+                    <desc language="en-US">SHALL contain exactly one [1..1] title (CONF:0003).</desc>
+                    <item label="CONF:0003"></item>
+                </element>
+
+                <element name="cda:entry" minimumMultiplicity="1" maximumMultiplicity="*" id="2.16.840.1.113883.3.1937.99.3.9.5341">
+                    <element name="cda:substanceAdministration" minimumMultiplicity="1" maximumMultiplicity="*" id="2.16.840.1.113883.3.1937.99.3.9.5347">
+
+                        <!-- Test element: NEED TO BE FALSE 1_1 -->
+                        <element name="cda:realmCode" minimumMultiplicity="1" maximumMultiplicity="1">
+                            <item label="CONF:0004"></item>
+                        </element>
+
+<!--                        <choice minimumMultiplicity="1" maximumMultiplicity="1">-->
+<!--                            <element name="cda:effectiveTime">-->
+
+<!--                            </element>-->
+<!--                        </choice>-->
+
+                        <choice minimumMultiplicity="6" maximumMultiplicity="*">
+                            <element name="cda:effectiveTime" datatype="TS" minimumMultiplicity="1" maximumMultiplicity="2" conformance="C" id="2.16.840.1.113883.3.1937.99.3.9.5850">
+                                <attribute name="value" datatype="ts" isOptional="true" id="2.16.840.1.113883.3.1937.99.3.9.5851"></attribute>
+                            </element>
+                            <element name="cda:effectiveTime[not(@operator='A')]" datatype="IVL_TS" minimumMultiplicity="5" maximumMultiplicity="7" conformance="C" id="2.16.840.1.113883.3.1937.99.3.9.222">
+                                <element name="cda:low" datatype="TS" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.223">
+                                </element>
+                                <element name="cda:high" datatype="TS" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.224">
+                                </element>
+                            </element>
+
+                            <element name="cda:effectiveTime" datatype="IVL_TS" minimumMultiplicity="5" maximumMultiplicity="7" conformance="C" id="2.16.840.1.113883.3.1937.99.3.9.222">
+                                <element name="cda:low" datatype="TS" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.223">
+                                </element>
+                                <element name="cda:high" datatype="TS" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.224">
+                                </element>
+                            </element>
+                        </choice>
+<!--                        <element name="cda:effectiveTime[@operator='A']" datatype="SXCM_TS" minimumMultiplicity="0" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.225">-->
+<!--                            <attribute name="operator" value="A" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.226">-->
+<!--                            </attribute>-->
+<!--                            <assert role="error" test="count(preceding-sibling::cda:effectiveTime) = 1 and .[@operator='A'][@xsi:type='PIVL_TS' or @xsi:type='EIVL_TS']">SHOULD contain zero or one [0..1] effectiveTime (CONF:7513) such that it</assert>-->
+<!--                        </element>-->
+<!--                        -->
+                        <attribute name="classCode"/>
+                        <attribute name="moodCode" />
+
+                    </element>
+                    <item label="CONF:0007"></item>
+                </element>
+
+            </element>
+        </template>
+    </rules>
+</decor>
\ No newline at end of file
diff --git a/hl7templates/hl7templates-api-jar/src/main/java/net/ihe/gazelle/tempapi/impl/ChoiceDefinitionProcessorImpl.java b/hl7templates/hl7templates-api-jar/src/main/java/net/ihe/gazelle/tempapi/impl/ChoiceDefinitionProcessorImpl.java
index f59463c..275ee23 100644
--- a/hl7templates/hl7templates-api-jar/src/main/java/net/ihe/gazelle/tempapi/impl/ChoiceDefinitionProcessorImpl.java
+++ b/hl7templates/hl7templates-api-jar/src/main/java/net/ihe/gazelle/tempapi/impl/ChoiceDefinitionProcessorImpl.java
@@ -19,7 +19,7 @@ public abstract class ChoiceDefinitionProcessorImpl implements ChoiceDefinitionP
 			this.processConstraints(ChoiceDefinitionUtil.getConstraints(t));
 			this.processDescs(t.getDesc());
 			//elements are processed according to the predicates type
-			//this.processElements(ChoiceDefinitionUtil.getElements(t));
+			this.processElements(ChoiceDefinitionUtil.getElements(t));
 			this.processIncludes(ChoiceDefinitionUtil.getIncludes(t));
 			this.processMaximumMultiplicity(t.getMaximumMultiplicity());
 			this.processMinimumMultiplicity(t.getMinimumMultiplicity());
@@ -27,7 +27,7 @@ public abstract class ChoiceDefinitionProcessorImpl implements ChoiceDefinitionP
 			this.processItem(t.getItem());
 
 			//Comment next line to disable processing of the unsported HL7 choices specs
-			this.processPredicates(ChoiceDefinitionUtil.getElements(t));
+//			this.processPredicates(ChoiceDefinitionUtil.getElements(t));
 		}
 	}
 
diff --git a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/ChoiceDefinitionAnalyzer.java b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/ChoiceDefinitionAnalyzer.java
index aa90417..6cb360a 100644
--- a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/ChoiceDefinitionAnalyzer.java
+++ b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/ChoiceDefinitionAnalyzer.java
@@ -6,7 +6,6 @@ import java.util.regex.Pattern;
 
 import gnu.trove.map.hash.THashMap;
 import net.ihe.gazelle.goc.uml.utils.OwnedRuleUtil;
-import net.ihe.gazelle.goc.uml.utils.PackagedElementUtil;
 import net.ihe.gazelle.goc.xmm.OwnedRule;
 import net.ihe.gazelle.goc.xmm.OwnedRuleKind;
 import net.ihe.gazelle.goc.xmm.OwnedRuleType;
diff --git a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/OCLGenerator.java b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/OCLGenerator.java
index fb7841a..0658622 100644
--- a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/OCLGenerator.java
+++ b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/OCLGenerator.java
@@ -435,4 +435,24 @@ public class OCLGenerator {
         }
         return addNullFlavorChecks(rules);
     }
+
+
+    public String appendDTDistinguisher(RuleDefinition ruleDefinition, String constraint){
+        if(constraint == null || ruleDefinition == null){
+            return constraint;
+        }
+        String rdName = RuleDefinitionUtil.getRealNameOfRuleDefinition(ruleDefinition);
+        StringBuilder selectionRule = new StringBuilder(rdName);
+        String datatype = ruleDefinition.getDatatype().getLocalPart();
+        if(datatype == null){
+            return constraint;
+        }
+        String datatypeForOCL = datatype.replace("_","");
+        selectionRule.append("->select(aa | CommonOperationsStatic::compareExactType(aa, '")
+                .append(datatypeForOCL)
+                .append("'))");
+        ImportElementHandler.handleAddingElement("CommonOperationsStatic");
+        return constraint.replace(rdName, selectionRule);
+
+    }
 }
diff --git a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/RuleDefinitionAnalyzer.java b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/RuleDefinitionAnalyzer.java
index 973c24d..9a9e80c 100644
--- a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/RuleDefinitionAnalyzer.java
+++ b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/action/RuleDefinitionAnalyzer.java
@@ -44,6 +44,9 @@ public class RuleDefinitionAnalyzer extends RuleDefinitionProcessorImpl {
 
     private List<OwnedRule> listGeneratedOwnedRule = new ArrayList<>();
 
+    private Boolean generateDTDistinguisher = Boolean.FALSE;
+
+
     private boolean containsError = false;
 
     protected static void updateListDistinguisherFollower(RuleDefinition ruleDefinition, Pair<String, String> pairDisting) {
@@ -141,6 +144,10 @@ public class RuleDefinitionAnalyzer extends RuleDefinitionProcessorImpl {
         }
         this.currentPackagedElement = (PackagedElement) objects[0];
         this.selectedRuleDefinition = ruleDefinition;
+        Object parentRule = this.selectedRuleDefinition.getParentObject();
+        if(parentRule instanceof ChoiceDefinition){
+            this.generateDTDistinguisher = (RuleDefinitionDistinguisherUtil.elementsShouldBeDistinguisedWithDT((ChoiceDefinition) parentRule));
+        }
         if (objects.length > 1) {
             this.ignoreTemplateIdRequirements = (Boolean) objects[1];
         }
@@ -162,6 +169,9 @@ public class RuleDefinitionAnalyzer extends RuleDefinitionProcessorImpl {
             return;
         }
         updateDistinguisherFollowerIfNeeded();
+
+        // Add a method that adds and 'AND' constraint based on datatype to the processing
+
         super.process(this.selectedRuleDefinition, objects);
 
 //		-- still not done
@@ -418,13 +428,13 @@ public class RuleDefinitionAnalyzer extends RuleDefinitionProcessorImpl {
     @Override
     public void processMinimumMultiplicity(Integer minimumMultiplicity) {
         // TODO: 23/12/2021 Highly need to be reviewed
-        if (this.ignoreMinCardinality()) {
-            // this is the case where the RuleDefinition is included in a choice
-            return;
-        }
+//        if (this.ignoreMinCardinality()) {
+//            // this is the case where the RuleDefinition is included in a choice
+//            return;
+//        }
         if (checkIfConstraintCanBeGeneratedForMinimumMultiplicity(minimumMultiplicity, this.selectedRuleDefinition)) {
             if (!(this.selectedRuleDefinition.getParentObject() instanceof TemplateDefinition)) {
-                fulfillOwnedRuleForConstraintGenerator((new RDMinimumMultiplicityAnalyzer()), this.currentPackagedElement, OwnedRuleKind.CARDINALITY,
+                fulfillOwnedRuleForConstraintGenerator((new RDMinimumMultiplicityAnalyzer(this.generateDTDistinguisher)), this.currentPackagedElement, OwnedRuleKind.CARDINALITY,
                         (minimumMultiplicity.intValue() == 0 && selectedRuleDefinition.getConformance().equals(ConformanceType.R))?
                                 OwnedRuleType.WARNING: OwnedRuleType.ERROR);
             } else {
@@ -458,7 +468,7 @@ public class RuleDefinitionAnalyzer extends RuleDefinitionProcessorImpl {
         boolean isPossibleToHaveConstraint = maximumMultiplicity.intValue() < elementMaxMultiplicity;
         if (isPossibleToHaveConstraint ||  (selectedRuleDefinition.getParentObject() instanceof RuleDefinition
                 && ((RuleDefinition) selectedRuleDefinition.getParentObject()).getParentObject() instanceof ChoiceDefinition )) {
-            fulfillOwnedRuleForConstraintGenerator((new RDMaximumMultiplicityAnalyzer()), this.currentPackagedElement, OwnedRuleKind.CARDINALITY);
+            fulfillOwnedRuleForConstraintGenerator((new RDMaximumMultiplicityAnalyzer(this.generateDTDistinguisher)), this.currentPackagedElement, OwnedRuleKind.CARDINALITY);
         }
     }
 
diff --git a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMaximumMultiplicityAnalyzer.java b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMaximumMultiplicityAnalyzer.java
index 109226d..467d688 100644
--- a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMaximumMultiplicityAnalyzer.java
+++ b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMaximumMultiplicityAnalyzer.java
@@ -17,7 +17,17 @@ import net.ihe.gazelle.tempmodel.org.decor.art.utils.RuleDefinitionUtil;
 public class RDMaximumMultiplicityAnalyzer implements ConstraintGenerator{
 	
 	static final int MAX_INTEGER = 1000000000;
-	
+
+	private final Boolean generateDTDistinguisher;
+
+	public RDMaximumMultiplicityAnalyzer(Boolean generateDTDistinguisher) {
+		this.generateDTDistinguisher = generateDTDistinguisher;
+	}
+
+	public RDMaximumMultiplicityAnalyzer() {
+		this.generateDTDistinguisher = Boolean.FALSE;
+	}
+
 	@Override
 	public String generateOCLConstraint(RuleDefinition ruleDefinition) {
 		Integer maximumMultiplicity = null;
@@ -30,7 +40,8 @@ public class RDMaximumMultiplicityAnalyzer implements ConstraintGenerator{
 				maximumMultiplicity = Integer.valueOf(maximumMultiplicityString);
 			}
 		}
-		String contextRule = (new OCLGenerator()).generateRuleToParentFromPath(ruleDefinition);
+		OCLGenerator generator = new OCLGenerator();
+		String contextRule = generator.generateRuleToParentFromPath(ruleDefinition);
 		String res = "";
 		if (contextRule.equals("self")){
 			res = contextRule + "." + RuleDefinitionUtil.getRealNameOfRuleDefinition(ruleDefinition)
@@ -49,6 +60,9 @@ public class RDMaximumMultiplicityAnalyzer implements ConstraintGenerator{
 						+ "->size()<" +  + (maximumMultiplicity.intValue() +1) + ")";
 			}
 		}
+		if(generateDTDistinguisher == Boolean.TRUE){
+			return generator.appendDTDistinguisher(ruleDefinition, res);
+		}
 		return res;
 	}
 	
diff --git a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMinimumMultiplicityAnalyzer.java b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMinimumMultiplicityAnalyzer.java
index 81db57b..056b87a 100644
--- a/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMinimumMultiplicityAnalyzer.java
+++ b/hl7templates/hl7templates-generator-jar/src/main/java/net/ihe/gazelle/tempgen/rules/analyzer/RDMinimumMultiplicityAnalyzer.java
@@ -15,6 +15,16 @@ import net.ihe.gazelle.tempmodel.org.decor.art.utils.RuleDefinitionUtil;
  */
 public class RDMinimumMultiplicityAnalyzer implements ConstraintGenerator {
 
+	private final Boolean generateDTDistinguisher;
+
+	public RDMinimumMultiplicityAnalyzer(Boolean generateDTDistinguisher) {
+		this.generateDTDistinguisher = generateDTDistinguisher;
+	}
+
+	public RDMinimumMultiplicityAnalyzer(){
+		this.generateDTDistinguisher = Boolean.FALSE;
+	}
+
 	@Override
 	public String generateOCLConstraint(RuleDefinition ruleDefinition) {
 		OCLGenerator generator = new OCLGenerator();
@@ -26,6 +36,9 @@ public class RDMinimumMultiplicityAnalyzer implements ConstraintGenerator {
 		} else {
 			constraint.append(generator.getMinimumMultiplicityRuleForRD(constraint.toString(), ruleDefinition));
 		}
+		if(this.generateDTDistinguisher == Boolean.TRUE){
+			return generator.appendDTDistinguisher(ruleDefinition, constraint.toString());
+		}
 		return constraint.toString();
 	}
 
diff --git a/hl7templates/hl7templates-generator-jar/src/test/resources/processors/decor_name.xml b/hl7templates/hl7templates-generator-jar/src/test/resources/processors/decor_name.xml
new file mode 100644
index 0000000..a4c2c62
--- /dev/null
+++ b/hl7templates/hl7templates-generator-jar/src/test/resources/processors/decor_name.xml
@@ -0,0 +1,195 @@
+<?xml-model href="http://art-decor.org/ADAR/rv/DECOR.xsd" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
+<decor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:epsos="urn:epSOS:ps:ps:2010" xsi:noNamespaceSchemaLocation="http://art-decor.org/ADAR/rv/DECOR.xsd" repository="true" epsos:dummy-1="urn:epSOS:ps:ps:2010" xsi:dummy-2="http://www.w3.org/2001/XMLSchema-instance" versionDate="2015-06-09T11:03:41" versionLabel="" compilationDate="2015-06-09T11:03:41" language="en-US" deeplinkprefix="http://decor.nictiz.nl/art-decor/" deeplinkprefixservices="http://decor.nictiz.nl/decor/services/">
+    <project>
+    </project>
+    <rules>
+        <template id="2.16.840.1.113883.10.20.22.4.16" name="MedicationActivity" displayName="Medication Activity" effectiveDate="2013-01-31T00:00:00" statusCode="draft" versionLabel="1.1">
+            <desc language="en-US">A medication activity describes substance administrations that have actually occurred (e.g. pills ingested or injections given) or are intended to occur (e.g. "take 2 tablets twice a day for the next 10 days"). Medication activities in "INT" mood are reflections of what a clinician intends a patient to be taking. Medication activities in "EVN" mood reflect actual
+                use. Medication timing is complex. This template requires that there be a substanceAdministration/effectiveTime valued with a time interval, representing the start and stop dates. Additional effectiveTime elements are optional, and can be used to represent frequency and other aspects of more detailed dosing regimens.</desc>
+            <classification type="cdaentrylevel"></classification>
+            <context id="**"></context>
+            <element name="cda:substanceAdministration" id="2.16.840.1.113883.3.1937.99.3.9.211">
+                <desc language="en-US">Medication Activity SHOULD include doseQuantity OR rateQuantity</desc>
+                <attribute name="classCode" value="SBADM" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.212">
+                    <item label="conf-7496"></item>
+                </attribute>
+                <attribute name="moodCode" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.213">
+                    <item label="conf-7497"></item>
+                    <vocabulary valueSet="2.16.840.1.113883.11.20.9.18"></vocabulary>
+                </attribute>
+                <element name="cda:templateId" datatype="II" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" isMandatory="true" id="2.16.840.1.113883.3.1937.99.3.9.214">
+                    <desc language="en-US">SHALL contain exactly one [1..1] templateId (CONF:7499) such that it</desc>
+                    <item label="conf-7499"></item>
+                    <attribute name="root" value="2.16.840.1.113883.10.20.22.4.16" datatype="uid" id="2.16.840.1.113883.3.1937.99.3.9.215">
+                        <item label="conf-10504"></item>
+                    </attribute>
+                </element>
+                <element name="cda:id" datatype="II" minimumMultiplicity="1" maximumMultiplicity="*" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.216">
+                    <desc language="en-US">SHALL contain at least one [1..*] id (CONF:7500).</desc>
+                    <item label="conf-7500"></item>
+                </element>
+                <element name="cda:code" datatype="CD" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.217">
+                    <desc language="en-US">MAY contain zero or one [0..1] code (CONF:7506).</desc>
+                    <item label="conf-7506"></item>
+                </element>
+                <element name="cda:text" datatype="ED" minimumMultiplicity="0" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.218">
+                    <desc language="en-US">SHOULD contain zero or one [0..1] text (CONF:7501).</desc>
+                    <item label="conf-7501"></item>
+                    <element name="cda:reference" minimumMultiplicity="0" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.219">
+                        <desc language="en-US">The text, if present, SHOULD contain zero or one [0..1] reference (CONF:15977).<p></p>This reference/@value SHALL begin with a '#' and SHALL point to its corresponding narrative (using the approach defined in CDA Release 2, section 4.3.5.1)</desc>
+                        <item label="conf-15977"></item>
+                        <attribute name="value" isOptional="true" id="2.16.840.1.113883.3.1937.99.3.9.220">
+                            <item label="conf-15978"></item>
+                        </attribute>
+                        <assert role="error" test="not(@value) or starts-with(@value, '#')">This reference/@value SHALL begin with a '#' and SHALL point to its corresponding narrative (using the approach defined in CDA Release 2, section 4.3.5.1)</assert>
+                    </element>
+                </element>
+                <element name="cda:statusCode" datatype="CS" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.221">
+                    <desc language="en-US">SHALL contain exactly one [1..1] statusCode (CONF:7507).</desc>
+                    <item label="conf-7507"></item>
+                </element>
+<!--                <choice minimumMultiplicity="1" maximumMultiplicity="1">-->
+<!--                    <desc language="en-US">This effectiveTime SHALL contain either a low or a @value but not both (CONF:26528).<br clear="none" />-->
+<!--                    </desc>-->
+<!--                    <item label="conf-26528"></item>-->
+<!--                    <element name="cda:effectiveTime" datatype="TS" minimumMultiplicity="0" maximumMultiplicity="1" conformance="C" id="2.16.840.1.113883.3.1937.99.3.9.5850">-->
+<!--                        <desc language="en-US">Note: This effectiveTime represents either the medication duration (i.e., the time the medication was started and stopped) or the single-administration timestamp.<br clear="none" />-->
+<!--                        </desc>-->
+<!--                        <item label="conf-26525">-->
+<!--                            <desc language="en-US">Note: indicates a single-administration timestamp [CONF:26525]<br clear="none" />-->
+<!--                            </desc>-->
+<!--                        </item>-->
+<!--                        <attribute name="value" datatype="ts" isOptional="true" id="2.16.840.1.113883.3.1937.99.3.9.5851"></attribute>-->
+<!--                    </element>-->
+<!--                    <element name="cda:effectiveTime[not(@operator='A')]" datatype="IVL_TS" minimumMultiplicity="0" maximumMultiplicity="1" conformance="C" id="2.16.840.1.113883.3.1937.99.3.9.222">-->
+<!--                        <desc language="en-US">SHALL contain exactly one [1..1] effectiveTime (CONF:7508) such that it</desc>-->
+<!--                        <item label="conf-7508"></item>-->
+<!--                        <element name="cda:low" datatype="TS" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.223">-->
+<!--                            <desc language="en-US">SHALL contain exactly one [1..1] low (CONF:26526).<br clear="none" />Note: indicates when medication started<br clear="none" />-->
+<!--                            </desc>-->
+<!--                            <item label="conf-26526"></item>-->
+<!--                        </element>-->
+<!--                        <element name="cda:high" datatype="TS" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.224">-->
+<!--                            <desc language="en-US">SHALL contain exactly one [1..1] high (CONF:26527).<br clear="none" />Note: indicates when medication stopped<br clear="none" />-->
+<!--                            </desc>-->
+<!--                            <item label="conf-26527"></item>-->
+<!--                        </element>-->
+<!--                    </element>-->
+<!--                </choice>-->
+                <element name="cda:effectiveTime[@operator='A']" datatype="SXCM_TS" minimumMultiplicity="0" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.225">
+                    <desc language="en-US">SHOULD contain zero or one [0..1] effectiveTime (CONF:7513) such that it<p></p> SHALL contain exactly one [1..1] @xsi:type=”PIVL_TS” or “EIVL_TS”</desc>
+                    <item label="conf-7513"></item>
+                    <attribute name="operator" value="A" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.226">
+                        <item label="conf-9106"></item>
+                    </attribute>
+                    <assert role="error" test="count(preceding-sibling::cda:effectiveTime) = 1 and .[@operator='A'][@xsi:type='PIVL_TS' or @xsi:type='EIVL_TS']">SHOULD contain zero or one [0..1] effectiveTime (CONF:7513) such that it</assert>
+                </element>
+                <element name="cda:repeatNumber" datatype="IVL_INT" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.227">
+                    <desc language="en-US">MAY contain zero or one [0..1] repeatNumber (CONF:7555).<p></p>In "INT" (intent) mood, the repeatNumber defines the number of allowed administrations. For example, a repeatNumber of "3" means that the substance can be administered up to 3 times. In "EVN" (event) mood, the repeatNumber is the number of occurrences. For example, a repeatNumber of "3" in a
+                        substance administration event means that the current administration is the 3rd in a series.</desc>
+                    <item label="conf-7555"></item>
+                </element>
+                <element name="cda:routeCode" datatype="CE" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.228">
+                    <desc language="en-US">MAY contain zero or one [0..1] routeCode, which SHALL be selected from ValueSet Medication Route FDA 2.16.840.1.113883.3.88.12.3221.8.7 DYNAMIC (CONF:7514).</desc>
+                    <item label="conf-7514"></item>
+                    <vocabulary valueSet="2.16.840.1.113883.3.88.12.3221.8.7"></vocabulary>
+                </element>
+                <element name="cda:approachSiteCode" datatype="CD" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.229">
+                    <desc language="en-US">MAY contain zero or one [0..1] approachSiteCode, where the code SHALL be selected from ValueSet Body Site 2.16.840.1.113883.3.88.12.3221.8.9 DYNAMIC (CONF:7515).</desc>
+                    <item label="conf-7515"></item>
+                    <vocabulary valueSet="2.16.840.1.113883.3.88.12.3221.8.9"></vocabulary>
+                </element>
+                <choice minimumMultiplicity="0">
+                    <desc language="nl-NL">Medication Activity SHOULD include doseQuantity OR rateQuantity</desc>
+                    <element name="cda:doseQuantity" datatype="IVL_PQ" minimumMultiplicity="0" maximumMultiplicity="1" conformance="R" id="2.16.840.1.113883.3.1937.99.3.9.230">
+                        <desc language="en-US">SHOULD contain zero or one [0..1] doseQuantity (CONF:7516).<p></p>Pre-coordinated consumable: If the consumable code is a pre-coordinated unit dose (e.g. "metoprolol 25mg tablet") then doseQuantity is a unitless number that indicates the number of products given per administration (e.g. "2", meaning 2 x "metoprolol 25mg tablet").<p></p>Not pre-coordinated
+                            consumable: If the consumable code is not pre-coordinated (e.g. is simply "metoprolol"), then doseQuantity must represent a physical quantity with @unit, e.g. "25" and "mg", specifying the amount of product given per administration.</desc>
+                        <item label="conf-7516"></item>
+                        <attribute name="unit" datatype="cs" isOptional="true" id="2.16.840.1.113883.3.1937.99.3.9.231">
+                            <item label="conf-7526"></item>
+                            <vocabulary valueSet="2.16.840.1.113883.1.11.12839"></vocabulary>
+                        </attribute>
+                    </element>
+                    <element name="cda:rateQuantity" datatype="IVL_PQ" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.232">
+                        <desc language="en-US">MAY contain zero or one [0..1] rateQuantity (CONF:7517).</desc>
+                        <item label="conf-7517"></item>
+                        <attribute name="unit" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.233">
+                            <item label="conf-7525"></item>
+                            <vocabulary valueSet="2.16.840.1.113883.1.11.12839"></vocabulary>
+                        </attribute>
+                    </element>
+                </choice>
+                <element name="cda:maxDoseQuantity" datatype="RTO_PQ_PQ" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.234">
+                    <desc language="en-US">MAY contain zero or one [0..1] maxDoseQuantity (CONF:7518).</desc>
+                    <item label="conf-7518"></item>
+                </element>
+                <element name="cda:administrationUnitCode" datatype="CE" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.235">
+                    <desc language="en-US"><span style="font-family: Arial, Helvetica, Geneva, sans-serif; font-size: 12px;">MAY contain zero or one [0..1] administrationUnitCode, which SHALL be selected from ValueSet AdministrationUnitDoseForm 2.16.840.1.113762.1.4.1021.30 DYNAMIC (CONF:7519).</span><br clear="none" />
+                    </desc>
+                    <item label="conf-7519"></item>
+                    <vocabulary valueSet="2.16.840.1.113762.1.4.1021.30" flexibility="dynamic"></vocabulary>
+                </element>
+                <element name="cda:consumable" contains="2.16.840.1.113883.10.20.22.4.23" flexibility="2013-01-31T00:00:00" minimumMultiplicity="1" maximumMultiplicity="1" conformance="R" isMandatory="false" id="2.16.840.1.113883.3.1937.99.3.9.236">
+                    <item label="conf-7520"></item>
+                </element>
+                <element name="cda:performer" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.237">
+                    <desc language="en-US">MAY contain zero or one [0..1] performer (CONF:7522).</desc>
+                    <item label="conf-7522"></item>
+                </element>
+                <element name="cda:participant" contains="2.16.840.1.113883.10.20.22.4.24" flexibility="2013-01-31T00:00:00" minimumMultiplicity="0" maximumMultiplicity="*" id="2.16.840.1.113883.3.1937.99.3.9.238">
+                    <item label="conf-7523"></item>
+                    <attribute name="typeCode" value="CSM" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.239">
+                        <item label="conf-7524"></item>
+                    </attribute>
+                </element>
+                <element name="cda:entryRelationship" contains="2.16.840.1.113883.10.20.22.4.19" flexibility="2013-01-31T00:00:00" minimumMultiplicity="0" maximumMultiplicity="*" id="2.16.840.1.113883.3.1937.99.3.9.240">
+                    <item label="conf-7536"></item>
+                    <attribute name="typeCode" value="RSON" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.241">
+                        <item label="conf-7537"></item>
+                    </attribute>
+                </element>
+                <element name="cda:entryRelationship" contains="2.16.840.1.113883.10.20.22.4.20" flexibility="2013-01-31T00:00:00" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.242">
+                    <item label="conf-7539"></item>
+                    <attribute name="typeCode" value="SUBJ" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.243">
+                        <item label="conf-7540"></item>
+                    </attribute>
+                    <attribute name="inversionInd" value="true" datatype="bl" id="2.16.840.1.113883.3.1937.99.3.9.244">
+                        <item label="conf-7542"></item>
+                    </attribute>
+                </element>
+                <element name="cda:entryRelationship" contains="2.16.840.1.113883.10.20.22.4.17" flexibility="2013-01-31T00:00:00" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.245">
+                    <item label="conf-7543"></item>
+                    <attribute name="typeCode" value="REFR" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.246">
+                        <item label="conf-7547"></item>
+                    </attribute>
+                </element>
+                <element name="cda:entryRelationship" contains="2.16.840.1.113883.10.20.22.4.18" flexibility="2013-01-31T00:00:00" minimumMultiplicity="0" maximumMultiplicity="*" id="2.16.840.1.113883.3.1937.99.3.9.247">
+                    <item label="conf-7549"></item>
+                    <attribute name="typeCode" value="REFR" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.248">
+                        <item label="conf-7553"></item>
+                    </attribute>
+                </element>
+                <element name="cda:entryRelationship" contains="2.16.840.1.113883.10.20.22.4.9" flexibility="2013-01-31T00:00:00" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.249">
+                    <item label="conf-7552"></item>
+                    <attribute name="typeCode" value="CAUS" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.250">
+                        <item label="conf-7544"></item>
+                    </attribute>
+                </element>
+                <element name="cda:entryRelationship" contains="2.16.840.1.113883.10.20.22.4.147" flexibility="2015-08-13T00:00:00" minimumMultiplicity="0" maximumMultiplicity="1" id="2.16.840.1.113883.3.1937.99.3.9.5846">
+                    <attribute name="typeCode" value="COMP" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.5847">
+                        <item label="conf-32908">
+                            <desc language="en-US">SHALL contain exactly one [1..1] @typeCode="COMP" Has component (CodeSystem: HL7ActRelationshipType urn:oid:2.16.840.1.113883.5.1002) (CONF:32908).<br clear="none" />
+                            </desc>
+                        </item>
+                    </attribute>
+                </element>
+                <element name="cda:precondition" contains="2.16.840.1.113883.10.20.22.4.25" flexibility="2013-01-31T00:00:00" minimumMultiplicity="0" maximumMultiplicity="*" id="2.16.840.1.113883.3.1937.99.3.9.5848">
+                    <item label="conf-7546"></item>
+                    <attribute name="typeCode" value="PRCN" datatype="cs" id="2.16.840.1.113883.3.1937.99.3.9.5849">
+                        <item label="conf-7550"></item>
+                    </attribute>
+                </element>
+            </element>
+        </template>
+    </rules>
+</decor>
\ No newline at end of file
diff --git a/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionDistinguisherUtil.java b/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionDistinguisherUtil.java
index caec88c..0b64f69 100644
--- a/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionDistinguisherUtil.java
+++ b/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionDistinguisherUtil.java
@@ -10,10 +10,8 @@ import net.ihe.gazelle.tempmodel.org.decor.art.model.TemplateDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import javax.xml.namespace.QName;
+import java.util.*;
 import java.util.Map.Entry;
 
 /**
@@ -123,4 +121,14 @@ public class RuleDefinitionDistinguisherUtil {
         return null;
     }
 
+    public static Boolean elementsShouldBeDistinguisedWithDT(ChoiceDefinition choiceDefinition){
+        Set<String> names = new HashSet<>();
+        int count = 0;
+        for(RuleDefinition rd : ChoiceDefinitionUtil.getElements(choiceDefinition)){
+            names.add(RuleDefinitionUtil.getRealNameOfRuleDefinition(rd));
+            count++;
+        }
+        return Boolean.valueOf(names.size() != count);
+    }
+
 }
diff --git a/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionProblemUtil.java b/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionProblemUtil.java
index 23ed812..8ac4639 100644
--- a/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionProblemUtil.java
+++ b/hl7templates/hl7templates-model-jar/src/main/java/net/ihe/gazelle/tempmodel/org/decor/art/utils/RuleDefinitionProblemUtil.java
@@ -9,9 +9,12 @@ import net.ihe.gazelle.tempmodel.org.decor.art.model.TemplateDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.xml.namespace.QName;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
 /**
  * @author Abderrazek Boufahja
@@ -89,19 +92,31 @@ public class RuleDefinitionProblemUtil {
         if (parent instanceof TemplateDefinition) {
             List<RuleDefinition> lrd = TemplateDefinitionUtil.getElementsByName((TemplateDefinition) parent,
                     RuleDefinitionUtil.getRealNameOfRuleDefinition(ruleDefinition));
-            return lrd.size() == 1;
+            Set<QName> datatypes = new HashSet<>();
+            for(RuleDefinition rd : lrd){
+                datatypes.add(rd.getDatatype());
+            }
+            return lrd.size() == datatypes.size();
         } else if (parent instanceof RuleDefinition) {
             RuleDefinition parentRD = (RuleDefinition) parent;
             List<RuleDefinition> lrd = RuleDefinitionUtil.getElementsByName(parentRD,
                     RuleDefinitionUtil.getRealNameOfRuleDefinition(ruleDefinition));
-            return lrd.size() == 1;
+            Set<QName> datatypes = new HashSet<>();
+            for(RuleDefinition rd : lrd){
+                datatypes.add(rd.getDatatype());
+            }
+            return lrd.size() == datatypes.size();
         } else if (parent instanceof ChoiceDefinition) {
             ChoiceDefinition choiceDefinition = (ChoiceDefinition) parent;
             if (choiceDefinition.getParentObject() instanceof RuleDefinition) {
                 RuleDefinition parentOfChoice = (RuleDefinition) choiceDefinition.getParentObject();
                 List<RuleDefinition> lrd = RuleDefinitionUtil.getElementsByName(parentOfChoice,
                         RuleDefinitionUtil.getRealNameOfRuleDefinition(ruleDefinition));
-                return lrd.size() == 1;
+                Set<QName> datatypes = new HashSet<>();
+                for(RuleDefinition rd : lrd){
+                    datatypes.add(rd.getDatatype());
+                }
+                return lrd.size() == datatypes.size();
             }
         }
         return false;
diff --git a/hl7templates/hl7templates-packager-jar/pom.xml b/hl7templates/hl7templates-packager-jar/pom.xml
index 652546f..eed4248 100644
--- a/hl7templates/hl7templates-packager-jar/pom.xml
+++ b/hl7templates/hl7templates-packager-jar/pom.xml
@@ -193,12 +193,12 @@
         <dependency>
             <groupId>net.ihe.gazelle.model</groupId>
             <artifactId>cda-model</artifactId>
-            <version>3.0.0</version>
+            <version>3.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>net.ihe.gazelle.model</groupId>
             <artifactId>cdaepsos-model</artifactId>
-            <version>3.0.0</version>
+            <version>3.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
diff --git a/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/GOCExecutor.java b/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/GOCExecutor.java
index a8b89d2..ca02c2b 100644
--- a/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/GOCExecutor.java
+++ b/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/GOCExecutor.java
@@ -21,14 +21,12 @@ public class GOCExecutor {
 
     private String hl7Resources;
 
-    private String hl7Conf;
 
     private static final SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss");
 
-    public GOCExecutor(String outputFile, String hl7Resources, String hl7Conf) {
+    public GOCExecutor(String outputFile, String hl7Resources) {
         this.outputFile = outputFile;
         this.hl7Resources = hl7Resources;
-        this.hl7Conf = hl7Conf;
     }
 
     public GOCExecutor(String outputFile){
@@ -36,12 +34,12 @@ public class GOCExecutor {
     }
 
     public ValidatorConfiguration execute(BBRResource bbrResource, String mvnExecPath){
-        return execute(bbrResource,mvnExecPath,null,true,false,null,false);
+        return execute(bbrResource,mvnExecPath,null,true,false,null,false,null);
     }
 
     public ValidatorConfiguration execute(BBRResource bbrResource,String mvnExecPath,
                                           String versionLabel, Boolean ignoreTemplateIdRequirements,
-                                          Boolean ignoreCdaBasicRequirements, String serviceName,Boolean ignoreChoicesPredicates) {
+                                          Boolean ignoreCdaBasicRequirements, String serviceName,Boolean ignoreChoicesPredicates, String hl7Conf) {
 
         try{
             addSubDirectoryToOutput("/validator");
@@ -61,9 +59,9 @@ public class GOCExecutor {
             this.hl7Resources = this.hl7Resources==null?
                     getWorkspaceRoot()+"/hl7templates-resources":this.hl7Resources;
 
-            this.hl7Conf = this.hl7Conf == null ? "cdabasic":this.hl7Conf;
+            String HL7ConfFolder = (hl7Conf == null) ? "cdabasic":hl7Conf;
 
-            EnvironementConfiguration.setSystemVariables("HL7TEMP_CDACONFFOLDERNAME",hl7Conf,
+            EnvironementConfiguration.setSystemVariables("HL7TEMP_CDACONFFOLDERNAME",HL7ConfFolder,
                     "HL7TEMP_RESOURCES_PATH",this.hl7Resources,"JAVA_EXEC",System.getProperty("java.home")+"/bin/java");
 
             EnvironementConfiguration.configure();
diff --git a/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/HL7Templates2GOC.java b/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/HL7Templates2GOC.java
index 19290a7..5c744d9 100644
--- a/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/HL7Templates2GOC.java
+++ b/hl7templates/hl7templates-packager-jar/src/main/java/net/ihe/gazelle/lib/hl7templatespackager/peripherals/HL7Templates2GOC.java
@@ -201,9 +201,9 @@ public class HL7Templates2GOC implements GOCEntry {
         try {
             parser.parseArgument(args);
 
-            GOCExecutor gocExecutor = new GOCExecutor(outputFile, HL7TEMP_RESOURCES_PATH,HL7TEMP_CDACONFFOLDERNAME);
+            GOCExecutor gocExecutor = new GOCExecutor(outputFile, HL7TEMP_RESOURCES_PATH);
             gocExecutor.execute(new PathBBRResource(bbr),mvnExecPath,versionLabel,
-                    ignoreTemplateIdRequirements,ignoreCdaBasicRequirements, serviceName,ignoreChoicesPredicates);
+                    ignoreTemplateIdRequirements,ignoreCdaBasicRequirements, serviceName,ignoreChoicesPredicates, HL7TEMP_CDACONFFOLDERNAME);
 
         } catch (CmdLineException e) {
             System.err.println("Exception in the execution of command line");
-- 
GitLab