diff --git a/README.md b/README.md index 5fb296d6a..459cd3a3b 100644 --- a/README.md +++ b/README.md @@ -453,7 +453,8 @@ The following features are experimental. This means its working or API will like Starting from version 0.7, Archie can import ADL 1.4 files, and convert them to ADL 2. To do so, do the following: ```java -ADL14ConversionConfiguration conversionConfiguration = new ADL14ConversionConfiguration(); +//this is the default configuration. You can implement your own if you want to +ADL14ConversionConfiguration conversionConfiguration = OpenEHRADL14ConversionConfiguration.getConfig(); ADL14Converter converter = new ADL14Converter(BuiltinReferenceModels.getMetaModels(), conversionConfiguration); List archetypes = new ArrayList<>(); @@ -498,7 +499,7 @@ The conversion log can be serialized to a file for storage using Jackson, so it ### Conversion Configuration -You may have noticed an instance of `ADL14ConversionConfiguration` in the previous example. In this configuration the mapping from term codes as used in ADL 1.4 to term URIs as used in ADL 2 can be specified. See the `ConversionConfigForTest.java` file for an example on how this works, and how this can be serialized to a file, and the file `/tools/src/test/java/com/nedap/archie/adl14/configuration.json` for an example of a simple serialized configuration that contains sane defaults for snomed, loinc and openehr URIs. +You may have noticed an instance of `ADL14ConversionConfiguration` in the previous example. In this configuration the mapping from term codes as used in ADL 1.4 to term URIs as used in ADL 2 can be specified. The archie-utils package provides a default configuration in the class `OpenEHRADL14ConversionConfiguration`. It is possible to supply your own, see the default implementation on how this works, and how this can be serialized to a file, and the file `/archie-utils/src/main/resources/adl14conversionconfiguration.json` for an example of a simple serialized configuration that contains sane defaults for snomed, loinc and openehr URIs. If you leave the configuration empty, the converter will fall back to a default URI conversion. diff --git a/aom/src/main/java/com/nedap/archie/adl14/treewalkers/Adl14CComplexObjectParser.java b/aom/src/main/java/com/nedap/archie/adl14/treewalkers/Adl14CComplexObjectParser.java index 51f7526ce..0d0893af8 100644 --- a/aom/src/main/java/com/nedap/archie/adl14/treewalkers/Adl14CComplexObjectParser.java +++ b/aom/src/main/java/com/nedap/archie/adl14/treewalkers/Adl14CComplexObjectParser.java @@ -163,17 +163,15 @@ private CObject parseNonPrimitiveObject(C_non_primitive_objectContext objectCont } else if (objectContext.archetype_slot() != null) { return parseArchetypeSlot(objectContext.archetype_slot()); } else if(objectContext.domainSpecificExtension() != null) { - CComplexObject result = new CComplexObject(); + String type = objectContext.domainSpecificExtension().type_id().getText(); if(type.equalsIgnoreCase("C_DV_QUANTITY")) { - parseCDVQuantity(objectContext, result); + return parseCDVQuantity(objectContext); } else if (type.equalsIgnoreCase("C_DV_ORDINAL")) { - parseCDVOrdinal(objectContext, result); + return parseCDVOrdinal(objectContext); } else { throw new IllegalArgumentException("unknown domain specific type: " + type); } - - return result; } else if (objectContext.c_ordinal() != null) { C_ordinalContext ordinalContext = objectContext.c_ordinal(); @@ -208,137 +206,163 @@ private CObject parseNonPrimitiveObject(C_non_primitive_objectContext objectCont throw new IllegalArgumentException("unknown non-primitive object: " + objectContext.getText()); } - private void parseCDVOrdinal(C_non_primitive_objectContext objectContext, CComplexObject result) { - result.setRmTypeName("DV_ORDINAL"); + private CComplexObject parseCDVOrdinal(C_non_primitive_objectContext objectContext) { + if(objectContext.domainSpecificExtension().odin_text() != null) { CDVOrdinal cdvOrdinal = odinParser.convert(objectContext.domainSpecificExtension().odin_text().getText(), CDVOrdinal.class); - if (cdvOrdinal.getList() != null && !cdvOrdinal.getList().isEmpty()) { - CAttributeTuple tuple = new CAttributeTuple(); - boolean hasValue = cdvOrdinal.getList().values().stream().anyMatch(i -> i.getValue() != null); - boolean hasSymbol = cdvOrdinal.getList().values().stream().anyMatch(i -> i.getSymbol() != null); + return convertCDVOrdinal(cdvOrdinal); + } else { + CComplexObject result = new CComplexObject(); + result.setRmTypeName("DV_ORDINAL"); + return result; + } + } + public static CComplexObject convertCDVOrdinal(CDVOrdinal cdvOrdinal) { + CComplexObject result = new CComplexObject(); + result.setRmTypeName("DV_ORDINAL"); - if (hasValue) { - tuple.addMember(new CAttribute("value")); - } - if (hasSymbol) { - tuple.addMember(new CAttribute("symbol")); - } + if (cdvOrdinal.getList() != null && !cdvOrdinal.getList().isEmpty()) { + CAttributeTuple tuple = new CAttributeTuple(); + boolean hasValue = cdvOrdinal.getList().values().stream().anyMatch(i -> i.getValue() != null); + boolean hasSymbol = cdvOrdinal.getList().values().stream().anyMatch(i -> i.getSymbol() != null); - for (CDVOrdinalItem item : cdvOrdinal.getList().values()) { - CPrimitiveTuple primitiveTuple = new CPrimitiveTuple(); - if(item.getValue() != null) { - primitiveTuple.addMember(item.getValueAdl2()); - } else if (hasValue) { - CInteger integer = new CInteger(); - integer.addConstraint(Interval.upperUnbounded(0L, true)); - primitiveTuple.addMember(integer); - } - if (item.getSymbol() != null) { - primitiveTuple.addMember(item.getSymbolAdl2()); - } else if (hasSymbol) { - CTerminologyCode code = new CTerminologyCode(); - primitiveTuple.addMember(code);//nothing we can do here! - } - tuple.addTuple(primitiveTuple); + if (hasValue) { + tuple.addMember(new CAttribute("value")); + } + if (hasSymbol) { + tuple.addMember(new CAttribute("symbol")); + } + + for (CDVOrdinalItem item : cdvOrdinal.getList().values()) { + CPrimitiveTuple primitiveTuple = new CPrimitiveTuple(); + if(item.getValue() != null) { + primitiveTuple.addMember(item.getValueAdl2()); + } else if (hasValue) { + CInteger integer = new CInteger(); + integer.addConstraint(Interval.upperUnbounded(0L, true)); + primitiveTuple.addMember(integer); } - result.addAttributeTuple(tuple); + if (item.getSymbol() != null) { + primitiveTuple.addMember(item.getSymbolAdl2()); + } else if (hasSymbol) { + CTerminologyCode code = new CTerminologyCode(); + primitiveTuple.addMember(code);//nothing we can do here! + } + + tuple.addTuple(primitiveTuple); } + result.addAttributeTuple(tuple); } + return result; } - private void parseCDVQuantity(C_non_primitive_objectContext objectContext, CComplexObject result) { - result.setRmTypeName("DV_QUANTITY"); + private CComplexObject parseCDVQuantity(C_non_primitive_objectContext objectContext) { + if(objectContext.domainSpecificExtension().odin_text() != null) { CDVQuantity cdvQuantity = odinParser.convert(objectContext.domainSpecificExtension().odin_text().getText(), CDVQuantity.class); - if(cdvQuantity.getProperty() != null) { - CAttribute property = new CAttribute("property"); - CTerminologyCode code = new CTerminologyCode(); - //will be converted later - code.addConstraint(cdvQuantity.getProperty().toString()); - property.addChild(code); - result.addAttribute(property); - } - if (cdvQuantity.getList() != null && !cdvQuantity.getList().isEmpty()) { - if(cdvQuantity.getList().size() == 1) { - CDVQuantityItem item = cdvQuantity.getList().values().iterator().next(); - if (item.getMagnitude() != null) { - CAttribute magnitude = new CAttribute("magnitude"); - CReal magnitudeAdl2 = item.getMagnitudeAdl2(); - magnitude.addChild(magnitudeAdl2); - result.addAttribute(magnitude); - if(cdvQuantity.getAssumedValue() != null && cdvQuantity.getAssumedValue().getMagnitude() != null) { - Double assumedMagnitude = cdvQuantity.getAssumedValue().getMagnitude(); - magnitudeAdl2.setAssumedValue(assumedMagnitude); - } - } - if (item.getUnits() != null) { - CAttribute units = new CAttribute("units"); - CString unitsAdl2 = item.getUnitsAdl2(); - units.addChild(unitsAdl2); - result.addAttribute(units); - if(cdvQuantity.getAssumedValue() != null && cdvQuantity.getAssumedValue().getUnits() != null) { - String assumedUnits = cdvQuantity.getAssumedValue().getUnits(); - unitsAdl2.setAssumedValue(assumedUnits); - } - } - if (item.getPrecision() != null) { - CAttribute precision = new CAttribute("precision"); - CInteger precisionAdl2 = item.getPrecisionAdl2(); - precision.addChild(precisionAdl2); - result.addAttribute(precision); - if(cdvQuantity.getAssumedValue() != null && cdvQuantity.getAssumedValue().getPrecision() != null) { - Long assumedPrecision = cdvQuantity.getAssumedValue().getPrecision(); - precisionAdl2.setAssumedValue(assumedPrecision); - } + return convertCDvQuantity(cdvQuantity); + } else { + CComplexObject result = new CComplexObject(); + result.setRmTypeName("DV_QUANTITY"); + return result; + } + + } + + public static CComplexObject convertCDvQuantity(CDVQuantity cdvQuantity) { + + CComplexObject result = new CComplexObject(); + result.setRmTypeName("DV_QUANTITY"); + + if(cdvQuantity.getProperty() != null) { + CAttribute property = new CAttribute("property"); + CTerminologyCode code = new CTerminologyCode(); + //will be converted later + code.addConstraint(cdvQuantity.getProperty().toString()); + property.addChild(code); + result.addAttribute(property); + } + if (cdvQuantity.getList() != null && !cdvQuantity.getList().isEmpty()) { + if(cdvQuantity.getList().size() == 1) { + CDVQuantityItem item = cdvQuantity.getList().values().iterator().next(); + if (item.getMagnitude() != null) { + CAttribute magnitude = new CAttribute("magnitude"); + CReal magnitudeAdl2 = item.getMagnitudeAdl2(); + magnitude.addChild(magnitudeAdl2); + result.addAttribute(magnitude); + if(cdvQuantity.getAssumedValue() != null && cdvQuantity.getAssumedValue().getMagnitude() != null) { + Double assumedMagnitude = cdvQuantity.getAssumedValue().getMagnitude(); + magnitudeAdl2.setAssumedValue(assumedMagnitude); } - } else { - CAttributeTuple tuple = new CAttributeTuple(); - boolean hasMagnitude = cdvQuantity.getList().values().stream().anyMatch(i -> i.getMagnitude() != null); - boolean hasUnits = cdvQuantity.getList().values().stream().anyMatch(i -> i.getUnits() != null); - boolean hasPrecision = cdvQuantity.getList().values().stream().anyMatch(i -> i.getPrecision() != null); - - if (hasMagnitude) { - tuple.addMember(new CAttribute("magnitude")); + } + if (item.getUnits() != null) { + CAttribute units = new CAttribute("units"); + CString unitsAdl2 = item.getUnitsAdl2(); + units.addChild(unitsAdl2); + result.addAttribute(units); + if(cdvQuantity.getAssumedValue() != null && cdvQuantity.getAssumedValue().getUnits() != null) { + String assumedUnits = cdvQuantity.getAssumedValue().getUnits(); + unitsAdl2.setAssumedValue(assumedUnits); } - if (hasUnits) { - tuple.addMember(new CAttribute("units")); + } + if (item.getPrecision() != null) { + CAttribute precision = new CAttribute("precision"); + CInteger precisionAdl2 = item.getPrecisionAdl2(); + precision.addChild(precisionAdl2); + result.addAttribute(precision); + if(cdvQuantity.getAssumedValue() != null && cdvQuantity.getAssumedValue().getPrecision() != null) { + Long assumedPrecision = cdvQuantity.getAssumedValue().getPrecision(); + precisionAdl2.setAssumedValue(assumedPrecision); } - if (hasPrecision) { - tuple.addMember(new CAttribute("precision")); + } + } else { + CAttributeTuple tuple = new CAttributeTuple(); + boolean hasMagnitude = cdvQuantity.getList().values().stream().anyMatch(i -> i.getMagnitude() != null); + boolean hasUnits = cdvQuantity.getList().values().stream().anyMatch(i -> i.getUnits() != null); + boolean hasPrecision = cdvQuantity.getList().values().stream().anyMatch(i -> i.getPrecision() != null); + + if (hasMagnitude) { + tuple.addMember(new CAttribute("magnitude")); + } + if (hasUnits) { + tuple.addMember(new CAttribute("units")); + } + if (hasPrecision) { + tuple.addMember(new CAttribute("precision")); + } + for (CDVQuantityItem item : cdvQuantity.getList().values()) { + CPrimitiveTuple primitiveTuple = new CPrimitiveTuple(); + if (item.getMagnitude() != null) { + primitiveTuple.addMember(item.getMagnitudeAdl2()); + } else if (hasMagnitude) { + CReal cReal = new CReal(); + cReal.addConstraint(Interval.upperUnbounded(0.0, true)); + primitiveTuple.addMember(cReal); } - for (CDVQuantityItem item : cdvQuantity.getList().values()) { - CPrimitiveTuple primitiveTuple = new CPrimitiveTuple(); - if (item.getMagnitude() != null) { - primitiveTuple.addMember(item.getMagnitudeAdl2()); - } else if (hasMagnitude) { - CReal cReal = new CReal(); - cReal.addConstraint(Interval.upperUnbounded(0.0, true)); - primitiveTuple.addMember(cReal); - } - if (item.getUnits() != null) { - primitiveTuple.addMember(item.getUnitsAdl2()); - } else if (hasUnits) { - primitiveTuple.addMember(new CString("/.*/")); - } + if (item.getUnits() != null) { + primitiveTuple.addMember(item.getUnitsAdl2()); + } else if (hasUnits) { + primitiveTuple.addMember(new CString("/.*/")); + } - if (item.getPrecision() != null) { - primitiveTuple.addMember(item.getPrecisionAdl2()); - } else if (hasPrecision) { - CInteger cInteger = new CInteger(); - cInteger.addConstraint(Interval.upperUnbounded(0l, true)); - primitiveTuple.addMember(cInteger); - } - tuple.addTuple(primitiveTuple); + if (item.getPrecision() != null) { + primitiveTuple.addMember(item.getPrecisionAdl2()); + } else if (hasPrecision) { + CInteger cInteger = new CInteger(); + cInteger.addConstraint(Interval.upperUnbounded(0l, true)); + primitiveTuple.addMember(cInteger); } - result.addAttributeTuple(tuple); + tuple.addTuple(primitiveTuple); } - //TODO: assumed value is possible in ADL 1.4, but not really in ADL 2, unless there is just one option possible. Cannot be solved until - //ADL 2 spec is changed + result.addAttributeTuple(tuple); } + //TODO: assumed value is possible in ADL 1.4, but not really in ADL 2, unless there is just one option possible. Cannot be solved until + //ADL 2 spec is changed } + return result; } private CComplexObjectProxy parseCComplexObjectProxy(C_complex_object_proxyContext proxyContext) { diff --git a/archie-utils/build.gradle b/archie-utils/build.gradle index dcd0bfabf..1919ea670 100644 --- a/archie-utils/build.gradle +++ b/archie-utils/build.gradle @@ -1,4 +1,4 @@ -description = "Utils for the Archie OpenEHR library" +description = "OpenEHR-RM specific utils for the Archie OpenEHR library" dependencies { compile project(':base') diff --git a/tools/src/test/java/com/nedap/archie/adl14/ConversionConfigForTest.java b/archie-utils/src/main/java/com/nedap/archie/adl14/OpenEHRADL14ConversionConfiguration.java similarity index 64% rename from tools/src/test/java/com/nedap/archie/adl14/ConversionConfigForTest.java rename to archie-utils/src/main/java/com/nedap/archie/adl14/OpenEHRADL14ConversionConfiguration.java index 7562e9b43..75560fef2 100644 --- a/tools/src/test/java/com/nedap/archie/adl14/ConversionConfigForTest.java +++ b/archie-utils/src/main/java/com/nedap/archie/adl14/OpenEHRADL14ConversionConfiguration.java @@ -1,18 +1,17 @@ package com.nedap.archie.adl14; + import com.nedap.archie.json.JacksonUtil; import java.io.IOException; import java.io.InputStream; -public class ConversionConfigForTest { - +public class OpenEHRADL14ConversionConfiguration { public static ADL14ConversionConfiguration getConfig() throws IOException { - - try(InputStream stream = ConversionConfigForTest.class.getResourceAsStream("configuration.json")) { + try(InputStream stream = OpenEHRADL14ConversionConfiguration.class.getResourceAsStream("/adl14conversionconfiguration.json")) { return JacksonUtil.getObjectMapper().readValue(stream, ADL14ConversionConfiguration.class); } - } + } diff --git a/archie-utils/src/main/resources/adl14conversionconfiguration.json b/archie-utils/src/main/resources/adl14conversionconfiguration.json new file mode 100644 index 000000000..5957cf218 --- /dev/null +++ b/archie-utils/src/main/resources/adl14conversionconfiguration.json @@ -0,0 +1,25 @@ +{ + "terminology_conversion_templates": [ + { + "terminology_id": "snomedct", + "template": "http://snomed.info/id/$code_string" + }, + { + "terminology_id": "snomed-ct", + "template": "http://snomed.info/id/$code_string" + }, + { + "terminology_id": "snomed", + "template": "http://snomed.info/id/$code_string" + }, + { + "terminology_id": "openehr", + "template": "http://openehr.org/id/$code_string" + }, + { + "terminology_id": "loinc", + "template": "http://loinc.org/id/$code_string" + } + + ] +} \ No newline at end of file diff --git a/opt14/src/main/java/com/nedap/archie/opt14/IntervalConverter.java b/opt14/src/main/java/com/nedap/archie/opt14/BaseTypesConverter.java similarity index 85% rename from opt14/src/main/java/com/nedap/archie/opt14/IntervalConverter.java rename to opt14/src/main/java/com/nedap/archie/opt14/BaseTypesConverter.java index 554102180..522f9c61b 100644 --- a/opt14/src/main/java/com/nedap/archie/opt14/IntervalConverter.java +++ b/opt14/src/main/java/com/nedap/archie/opt14/BaseTypesConverter.java @@ -3,8 +3,9 @@ import com.nedap.archie.base.Cardinality; import com.nedap.archie.base.Interval; import com.nedap.archie.base.MultiplicityInterval; +import com.nedap.archie.base.terminology.TerminologyCode; -public class IntervalConverter { +public class BaseTypesConverter { public static Cardinality convertCardinality(CARDINALITY cardinality14) { if(cardinality14 == null) { @@ -52,4 +53,11 @@ public static com.nedap.archie.base.Interval convertInterval(IntervalOfR range.isUpperIncluded() == null ? true : range.isUpperIncluded()); } + public static TerminologyCode convert(CODEPHRASE definingCode) { + if(definingCode == null) { + return null; + } + return TerminologyCode.createFromString(definingCode.getTerminologyId().getValue(), null, definingCode.getCodeString()); + } + } diff --git a/opt14/src/main/java/com/nedap/archie/opt14/DefinitionConverter.java b/opt14/src/main/java/com/nedap/archie/opt14/DefinitionConverter.java index 1ad4ee9c5..c27812803 100644 --- a/opt14/src/main/java/com/nedap/archie/opt14/DefinitionConverter.java +++ b/opt14/src/main/java/com/nedap/archie/opt14/DefinitionConverter.java @@ -9,8 +9,8 @@ import com.nedap.archie.aom.Template; import com.nedap.archie.aom.TemplateOverlay; -import static com.nedap.archie.opt14.IntervalConverter.convertCardinality; -import static com.nedap.archie.opt14.IntervalConverter.convertMultiplicity; +import static com.nedap.archie.opt14.BaseTypesConverter.convertCardinality; +import static com.nedap.archie.opt14.BaseTypesConverter.convertMultiplicity; import static com.nedap.archie.opt14.PrimitiveConverter.convertPrimitive; public class DefinitionConverter { @@ -30,7 +30,7 @@ private CComplexObject convert(CCOMPLEXOBJECT cComplexObject14) { CComplexObject cComplexObject = new CComplexObject(); cComplexObject.setNodeId(cComplexObject14.getNodeId()); cComplexObject.setRmTypeName(cComplexObject14.getRmTypeName()); - cComplexObject.setOccurrences(IntervalConverter.convertMultiplicity(cComplexObject14.getOccurrences())); + cComplexObject.setOccurrences(BaseTypesConverter.convertMultiplicity(cComplexObject14.getOccurrences())); for (CATTRIBUTE attribute14 : cComplexObject14.getAttributes()) { cComplexObject.addAttribute(convert(attribute14)); @@ -81,7 +81,7 @@ private CObject convertSlot(ARCHETYPESLOT cobject14) { archetypeSlot.setNodeId(cobject14.getNodeId()); archetypeSlot.setRmTypeName(cobject14.getRmTypeName()); - archetypeSlot.setOccurrences(IntervalConverter.convertMultiplicity(cobject14.getOccurrences())); + archetypeSlot.setOccurrences(BaseTypesConverter.convertMultiplicity(cobject14.getOccurrences())); //TODO: assertions for include/exclude, should be straightforward return archetypeSlot; } @@ -99,7 +99,7 @@ private CObject convertRoot(CARCHETYPEROOT cRoot14) { CArchetypeRoot root = new CArchetypeRoot(); root.setArchetypeRef(overlay.getArchetypeId().getFullId()); root.setNodeId(cRoot14.getNodeId()); - root.setOccurrences(IntervalConverter.convertMultiplicity(cRoot14.getOccurrences())); + root.setOccurrences(BaseTypesConverter.convertMultiplicity(cRoot14.getOccurrences())); root.setRmTypeName(cRoot14.getRmTypeName()); return root; } diff --git a/opt14/src/main/java/com/nedap/archie/opt14/DescriptionConverter.java b/opt14/src/main/java/com/nedap/archie/opt14/DescriptionConverter.java index 5453cab16..03ad636de 100644 --- a/opt14/src/main/java/com/nedap/archie/opt14/DescriptionConverter.java +++ b/opt14/src/main/java/com/nedap/archie/opt14/DescriptionConverter.java @@ -19,14 +19,18 @@ public static void convert(Template template, OPERATIONALTEMPLATE opt14) { author.put(item.getId(), item.getValue()); } } + if(description14.getOtherDetails() != null) { + for(StringDictionaryItem item:description14.getOtherDetails()) { + description.getOtherDetails().put(item.getId(), item.getValue()); + } + } + + description.setOtherContributors(description14.getOtherContributors()); + description.setOriginalAuthor(author); template.setDescription(description); - template.setOriginalLanguage( - TerminologyCode.createFromString( - opt14.getLanguage().getTerminologyId().getValue(), - null, - opt14.getLanguage().getCodeString())); + template.setOriginalLanguage(BaseTypesConverter.convert(opt14.getLanguage())); //TODO: implement me further } } diff --git a/opt14/src/main/java/com/nedap/archie/opt14/DomainTypeConverter.java b/opt14/src/main/java/com/nedap/archie/opt14/DomainTypeConverter.java index 4a80456b9..522b2446f 100644 --- a/opt14/src/main/java/com/nedap/archie/opt14/DomainTypeConverter.java +++ b/opt14/src/main/java/com/nedap/archie/opt14/DomainTypeConverter.java @@ -1,9 +1,82 @@ package com.nedap.archie.opt14; +import com.nedap.archie.adl14.aom14.CDVOrdinal; +import com.nedap.archie.adl14.aom14.CDVOrdinalItem; +import com.nedap.archie.adl14.aom14.CDVQuantity; + +import com.nedap.archie.adl14.aom14.CDVQuantityAssumedValue; +import com.nedap.archie.adl14.aom14.CDVQuantityItem; +import com.nedap.archie.adl14.treewalkers.Adl14CComplexObjectParser; import com.nedap.archie.aom.CObject; +import com.nedap.archie.base.terminology.TerminologyCode; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static com.nedap.archie.opt14.BaseTypesConverter.convert; public class DomainTypeConverter { public static CObject convertDomainType(CDOMAINTYPE cobject14) { + if(cobject14 instanceof CDVORDINAL) { + return convertCDVOrdinal((CDVORDINAL) cobject14); + } else if (cobject14 instanceof CDVQUANTITY) { + return convertCDVQuantity((CDVQUANTITY) cobject14); + } else if (cobject14 instanceof CDVSTATE) { + + } else if (cobject14 instanceof CCODEPHRASE) { + + } return null; } + + private static CObject convertCDVOrdinal(CDVORDINAL ordinal14) { + CDVOrdinal ordinal = new CDVOrdinal(); + Map items = new LinkedHashMap<>(); + if(ordinal14.getList() != null) { + Integer i = 0; + for(DVORDINAL dvordinal14:ordinal14.getList()) { + CDVOrdinalItem item = new CDVOrdinalItem(); + item.setValue(dvordinal14.getValue()); + if(dvordinal14.getSymbol() != null) { + item.setSymbol(convert(dvordinal14.getSymbol().getDefiningCode())); + } + items.put(i.toString(), item); + i++; + } + } + //TODO: no assumed value in our own model, but there is in the OPT form. + + return Adl14CComplexObjectParser.convertCDVOrdinal(ordinal); + } + + private static CObject convertCDVQuantity(CDVQUANTITY cobject14) { + CDVQUANTITY quantity14 = cobject14; + CDVQuantity quantity = new CDVQuantity(); + Map items = new LinkedHashMap<>(); + + if(quantity14.getList() != null) { + Integer i = 0; + for(CQUANTITYITEM item14:quantity14.getList()) { + CDVQuantityItem item = new CDVQuantityItem(); + item.setMagnitude(BaseTypesConverter.convertInterval(item14.getMagnitude())); + item.setPrecision(BaseTypesConverter.convertInterval(item14.getPrecision())); + item.setUnits(item14.getUnits()); + items.put(i.toString(), item); + i++; + } + } + quantity.setList(items); + + quantity.setProperty(convert(quantity14.getProperty())); + + DVQUANTITY assumedValue14 = quantity14.getAssumedValue(); + if(assumedValue14 != null) { + CDVQuantityAssumedValue assumedValue = new CDVQuantityAssumedValue(); + assumedValue.setMagnitude(assumedValue14.getMagnitude()); + assumedValue.setPrecision(assumedValue14.getPrecision() == null ? null : assumedValue14.getPrecision().longValue()); + assumedValue.setUnits(assumedValue14.getUnits()); + quantity.setAssumedValue(assumedValue); + } + return Adl14CComplexObjectParser.convertCDvQuantity(quantity); + } } diff --git a/opt14/src/main/java/com/nedap/archie/opt14/Opt14Converter.java b/opt14/src/main/java/com/nedap/archie/opt14/Opt14Converter.java index 53153e323..4ad0f1ab4 100644 --- a/opt14/src/main/java/com/nedap/archie/opt14/Opt14Converter.java +++ b/opt14/src/main/java/com/nedap/archie/opt14/Opt14Converter.java @@ -9,6 +9,9 @@ public Template convert(OPERATIONALTEMPLATE opt14) { Template template = new Template(); template.setArchetypeId(new ArchetypeHRID("openEHR-EHR-" + opt14.getDefinition().getRmTypeName() + "." + opt14.getTemplateId().getValue() + "v1.0.0")); template.setParentArchetypeId(opt14.getDefinition().getArchetypeId().getValue()); + if(opt14.getUid() != null) { + template.setUid(opt14.getUid().getValue()); + } DescriptionConverter.convert(template, opt14); new DefinitionConverter().convert(template, opt14); diff --git a/opt14/src/main/java/com/nedap/archie/opt14/PrimitiveConverter.java b/opt14/src/main/java/com/nedap/archie/opt14/PrimitiveConverter.java index 075c94b2f..aae5b355c 100644 --- a/opt14/src/main/java/com/nedap/archie/opt14/PrimitiveConverter.java +++ b/opt14/src/main/java/com/nedap/archie/opt14/PrimitiveConverter.java @@ -6,7 +6,7 @@ import com.nedap.archie.aom.primitives.CReal; import com.nedap.archie.aom.primitives.CString; -import static com.nedap.archie.opt14.IntervalConverter.convertInterval; +import static com.nedap.archie.opt14.BaseTypesConverter.convertInterval; public class PrimitiveConverter { diff --git a/opt14/src/main/java/com/nedap/archie/opt14/TerminologyConverter.java b/opt14/src/main/java/com/nedap/archie/opt14/TerminologyConverter.java index be1df9fe6..6ac41cfa1 100644 --- a/opt14/src/main/java/com/nedap/archie/opt14/TerminologyConverter.java +++ b/opt14/src/main/java/com/nedap/archie/opt14/TerminologyConverter.java @@ -17,7 +17,7 @@ public static ArchetypeTerminology createTerminology(OPERATIONALTEMPLATE opt14, ArchetypeTerm term = new ArchetypeTerm(); term.setCode(term14.getCode()); for(StringDictionaryItem item:term14.getItems()) { - term.put(item.getId(), item.getId()); + term.put(item.getId(), item.getValue()); } terms.put(term14.getCode(), term); } diff --git a/tools/src/main/java/com/nedap/archie/adl14/OpenEHRADL14ConversionConfiguration.java b/tools/src/main/java/com/nedap/archie/adl14/OpenEHRADL14ConversionConfiguration.java new file mode 100644 index 000000000..e69de29bb diff --git a/tools/src/test/java/com/nedap/archie/adl14/ADL14TerminologySupportTest.java b/tools/src/test/java/com/nedap/archie/adl14/ADL14TerminologySupportTest.java index 1383013a1..94cbce458 100644 --- a/tools/src/test/java/com/nedap/archie/adl14/ADL14TerminologySupportTest.java +++ b/tools/src/test/java/com/nedap/archie/adl14/ADL14TerminologySupportTest.java @@ -15,7 +15,7 @@ public class ADL14TerminologySupportTest { @Test public void terminologyBindingsConverted() throws IOException { - ADL14ConversionConfiguration conversionConfiguration = ConversionConfigForTest.getConfig(); + ADL14ConversionConfiguration conversionConfiguration = OpenEHRADL14ConversionConfiguration.getConfig(); ADL14Converter converter = new ADL14Converter(BuiltinReferenceModels.getMetaModels(), conversionConfiguration); String createdAtCode = null; //apply the first conversion and store the log. It has created an at code to bind to [openehr::124], used in a DV_QUANTITY.property diff --git a/tools/src/test/java/com/nedap/archie/adl14/ArchetypeSlotConversionTest.java b/tools/src/test/java/com/nedap/archie/adl14/ArchetypeSlotConversionTest.java index 597f0c980..ef890ffdf 100644 --- a/tools/src/test/java/com/nedap/archie/adl14/ArchetypeSlotConversionTest.java +++ b/tools/src/test/java/com/nedap/archie/adl14/ArchetypeSlotConversionTest.java @@ -20,7 +20,7 @@ public class ArchetypeSlotConversionTest { @Test public void testSlotConversion() throws Exception { - ADL14ConversionConfiguration conversionConfiguration = ConversionConfigForTest.getConfig(); + ADL14ConversionConfiguration conversionConfiguration = OpenEHRADL14ConversionConfiguration.getConfig(); ADL14Converter converter = new ADL14Converter(BuiltinReferenceModels.getMetaModels(), conversionConfiguration); ADL2ConversionRunLog log = null; diff --git a/tools/src/test/java/com/nedap/archie/adl14/LargeSetOfADL14sTest.java b/tools/src/test/java/com/nedap/archie/adl14/LargeSetOfADL14sTest.java index c1b0b60fc..f13aed7d8 100644 --- a/tools/src/test/java/com/nedap/archie/adl14/LargeSetOfADL14sTest.java +++ b/tools/src/test/java/com/nedap/archie/adl14/LargeSetOfADL14sTest.java @@ -41,7 +41,7 @@ public class LargeSetOfADL14sTest { @Before public void setup() throws Exception { - conversionConfiguration = ConversionConfigForTest.getConfig(); + conversionConfiguration = OpenEHRADL14ConversionConfiguration.getConfig(); } @Test diff --git a/tools/src/test/java/com/nedap/archie/adl14/PreviousLogConversionTest.java b/tools/src/test/java/com/nedap/archie/adl14/PreviousLogConversionTest.java index a2bf695fc..12bcac55d 100644 --- a/tools/src/test/java/com/nedap/archie/adl14/PreviousLogConversionTest.java +++ b/tools/src/test/java/com/nedap/archie/adl14/PreviousLogConversionTest.java @@ -21,7 +21,7 @@ public class PreviousLogConversionTest { @Test public void applyConsistentConversion() throws Exception { - ADL14ConversionConfiguration conversionConfiguration = ConversionConfigForTest.getConfig(); + ADL14ConversionConfiguration conversionConfiguration = OpenEHRADL14ConversionConfiguration.getConfig(); ADL14Converter converter = new ADL14Converter(BuiltinReferenceModels.getMetaModels(), conversionConfiguration); ADL2ConversionRunLog log = null; @@ -51,7 +51,7 @@ public void applyConsistentConversion() throws Exception { @Test public void testValueSet() throws Exception { - ADL14ConversionConfiguration conversionConfiguration = ConversionConfigForTest.getConfig(); + ADL14ConversionConfiguration conversionConfiguration = OpenEHRADL14ConversionConfiguration.getConfig(); ADL14Converter converter = new ADL14Converter(BuiltinReferenceModels.getMetaModels(), conversionConfiguration); ADL2ConversionRunLog log = null; @@ -88,7 +88,7 @@ public void testValueSet() throws Exception { @Test public void unusedValuesAreRemoved() throws Exception { - ADL14ConversionConfiguration conversionConfiguration = ConversionConfigForTest.getConfig(); + ADL14ConversionConfiguration conversionConfiguration = OpenEHRADL14ConversionConfiguration.getConfig(); ADL14Converter converter = new ADL14Converter(BuiltinReferenceModels.getMetaModels(), conversionConfiguration); ADL2ConversionRunLog log = null; String createdAtCode = null;