Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -399,8 +399,7 @@ private static void fixArchetypeSlotExpression(Expression expression) {
Expression rightOperand = binary.getRightOperand();
if (rightOperand instanceof Constraint) {
Constraint<?> constraint = (Constraint<?>) rightOperand;
if (constraint.getItem() != null && constraint.getItem().getConstraint() != null && !constraint.getItem().getConstraint().isEmpty() &&
constraint.getItem() instanceof CString) {
if (constraint.getItem() != null && constraint.getItem() instanceof CString && constraint.getItem().getConstraint() != null && !((CString) constraint.getItem()).getConstraint().isEmpty()) {
CString cString = (CString) constraint.getItem();
if (cString.getConstraint() == null || cString.getConstraint().isEmpty()) {
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.nedap.archie.adl14;

import com.google.common.collect.Lists;
import com.nedap.archie.adl14.log.CreatedCode;
import com.nedap.archie.adl14.log.ReasonForCodeCreation;
import com.nedap.archie.aom.*;
import com.nedap.archie.aom.primitives.CTerminologyCode;
import com.nedap.archie.aom.primitives.CTerminologyCodeADL14;
import com.nedap.archie.aom.terminology.ArchetypeTerm;
import com.nedap.archie.aom.terminology.ValueSet;
import com.nedap.archie.aom.utils.AOMUtils;
Expand Down Expand Up @@ -39,27 +39,31 @@ public void convert() {
}

private void convert(CObject cObject) {

if (cObject instanceof CTerminologyCode) {
convertCTerminologyCode((CTerminologyCode) cObject);
if (cObject instanceof CTerminologyCodeADL14) {
CTerminologyCodeADL14 cTerminologyCode = (CTerminologyCodeADL14) cObject;
convertCTerminologyCode(cTerminologyCode);
replaceInParent(cTerminologyCode, toAdl2(cTerminologyCode));
}
for(CAttribute attribute:cObject.getAttributes()) {
convert(attribute);
for (CAttribute attribute : cObject.getAttributes()) {
for (CObject child : attribute.getChildren()) {
convert(child);
}
}
if(cObject instanceof CComplexObject) {
for (CAttributeTuple tuple : ((CComplexObject) cObject).getAttributeTuples()) {
//tuples have not been properly converted to CAttributes in this parsed model, so we can ignore them above
Set<Integer> tupleTermCodeIndices = getCTerminologyCodeIndices(tuple);
for (Integer index : tupleTermCodeIndices) {
List<CPrimitiveObject<?, ?>> termCodes = tuple.getTuples().stream().map(p -> p.getMember(index)).collect(Collectors.toList());
Set<String> atCodes = new LinkedHashSet<>();
for (CPrimitiveObject<?, ?> cPrimitiveObject : termCodes) {
CTerminologyCode cTerminologyCode = (CTerminologyCode) cPrimitiveObject;
convertCTerminologyCode(cTerminologyCode);
if(cTerminologyCode.getConstraint().size() == 1) {
String constraint = cTerminologyCode.getConstraint().get(0);
if(AOMUtils.isValueCode(constraint)) {
atCodes.add(constraint);
for (CPrimitiveTuple primitiveTuple : tuple.getTuples()) {
CPrimitiveObject<?, ?> member = primitiveTuple.getMember(index);
if (member instanceof CTerminologyCodeADL14) {
CTerminologyCodeADL14 cTerminologyCode = (CTerminologyCodeADL14) member;
convertCTerminologyCode(cTerminologyCode);
CTerminologyCode replacement = toAdl2(cTerminologyCode);
primitiveTuple.getMembers().set(index, replacement);
if (replacement.getConstraint() != null && AOMUtils.isValueCode(replacement.getConstraint())) {
atCodes.add(replacement.getConstraint());
}
}
}
Expand All @@ -71,12 +75,19 @@ private void convert(CObject cObject) {
}
}

private void replaceInParent(CObject original, CObject replacement) {
CAttribute parent = original.getParent();
int index = parent.getChildren().indexOf(original);
parent.getChildren().set(index, replacement);
replacement.setParent(parent);
}

private Set<Integer> getCTerminologyCodeIndices(CAttributeTuple tuple) {
Set<Integer> result = new LinkedHashSet<>();
for (CPrimitiveTuple primitiveTuple : tuple.getTuples()) {
int i = 0;
for (CPrimitiveObject<?, ?> cPrimitiveObject : primitiveTuple.getMembers()) {
if(cPrimitiveObject instanceof CTerminologyCode) {
if(cPrimitiveObject instanceof CTerminologyCodeADL14) {
result.add(i);
}
i++;
Expand All @@ -85,13 +96,7 @@ private Set<Integer> getCTerminologyCodeIndices(CAttributeTuple tuple) {
return result;
}

private void convert(CAttribute attribute) {
for(CObject object:attribute.getChildren()) {
convert(object);
}
}

private void convertCTerminologyCode(CTerminologyCode cTerminologyCode) {
private void convertCTerminologyCode(CTerminologyCodeADL14 cTerminologyCode) {
if(cTerminologyCode.getConstraint() != null && !cTerminologyCode.getConstraint().isEmpty()) {
String firstConstraint = cTerminologyCode.getConstraint().get(0);
TerminologyCode termCode = TerminologyCode.createFromString(firstConstraint);
Expand All @@ -102,7 +107,7 @@ private void convertCTerminologyCode(CTerminologyCode cTerminologyCode) {
//do not create a value set, just convert the code
String newCode = converter.convertValueCode(firstConstraint);
converter.addConvertedCode(firstConstraint, newCode);
cTerminologyCode.setConstraint(Lists.newArrayList(newCode));
cTerminologyCode.setConstraint(new ArrayList<>(Collections.singletonList(newCode)));
} else {
Set<String> localCodes = new LinkedHashSet<>();
for(String code:cTerminologyCode.getConstraint()) {
Expand All @@ -112,7 +117,7 @@ private void convertCTerminologyCode(CTerminologyCode cTerminologyCode) {
}

ValueSet valueSet = findOrCreateValueSet(cTerminologyCode.getArchetype(), localCodes, cTerminologyCode);
cTerminologyCode.setConstraint(Lists.newArrayList(valueSet.getId()));
cTerminologyCode.setConstraint(new ArrayList<>(Collections.singletonList(valueSet.getId())));
}
} else if (isLocalCode && AOMUtils.isValueSetCode(termCode.getCodeString())) {
List<String> newConstraint = new ArrayList<>();
Expand All @@ -133,7 +138,7 @@ private void convertCTerminologyCode(CTerminologyCode cTerminologyCode) {

//TODO: check if this is a converted or old term binding - old is unusual, but could be possible!
String termBinding = findOrAddTermBindingAndCode(termCode, uri, termBindingsMap);
cTerminologyCode.setConstraint(Lists.newArrayList(termBinding));
cTerminologyCode.setConstraint(new ArrayList<>(Collections.singletonList(termBinding)));
} catch (URISyntaxException e) {
//TODO
logger.error("error converting term", e);
Expand Down Expand Up @@ -165,7 +170,7 @@ private void convertCTerminologyCode(CTerminologyCode cTerminologyCode) {
}
}
ValueSet valueSet = findOrCreateValueSet(cTerminologyCode.getArchetype(), new LinkedHashSet<>(atCodes), cTerminologyCode);
cTerminologyCode.setConstraint(Lists.newArrayList(valueSet.getId()));
cTerminologyCode.setConstraint(new ArrayList<>(Collections.singletonList(valueSet.getId())));

}
}
Expand All @@ -191,6 +196,34 @@ private void convertCTerminologyCode(CTerminologyCode cTerminologyCode) {
}
}

/**
* Build an ADL 2 {@link CTerminologyCode} from a converted {@link CTerminologyCodeADL14}.
* Copies all relevant CObject/CPrimitiveObject fields and collapses the single-element
* post-conversion constraint list into a single String.
*
* <p>Package-private for unit testing — see ADL14TermConstraintConverterTest.</p>
*/
static CTerminologyCode toAdl2(CTerminologyCodeADL14 source) {
CTerminologyCode result = new CTerminologyCode();
// rmTypeName is not copied: CPrimitiveObject overrides getRmTypeName() to compute it from the
// class name, ignoring the field. Setting it would be a no-op.
result.setOccurrences(source.getOccurrences());
result.setDeprecated(source.getDeprecated());
result.setSiblingOrder(source.getSiblingOrder());
result.setEnumeratedTypeConstraint(source.getEnumeratedTypeConstraint());
result.setAssumedValue(source.getAssumedValue());
result.setDefaultValue(source.getDefaultValue());
result.setConstraintStatus(source.getConstraintStatus());
// Copy the tuple back-pointer too: when this CTerminologyCodeADL14 sits inside a CPrimitiveTuple,
// its socParent links back to that tuple. The caller swaps it in via members.set(index, replacement),
// which (unlike CPrimitiveTuple.addMember) does not set socParent, so we copy it here.
result.setSocParent(source.getSocParent());
if (source.getConstraint() != null && !source.getConstraint().isEmpty()) {
result.setConstraint(source.getConstraint().get(0));
}
return result;
}

private Map<String, URI> findOrCreateTermBindings(TerminologyCode termCode) {
return archetype.getTerminology().getTermBindings().computeIfAbsent(termCode.getTerminologyId(), k -> new LinkedHashMap<>());
}
Expand Down Expand Up @@ -248,13 +281,20 @@ private ValueSet findOrCreateValueSet(Archetype archetype, Set<String> localCode
CAttribute cAttributeInParent = (CAttribute) inParent;
if(!cAttributeInParent.getChildren().isEmpty()) {
CObject cObject = cAttributeInParent.getChildren().get(0);
if(cObject instanceof CTerminologyCode) {
CTerminologyCode termCodeInParent = (CTerminologyCode) cObject;
if(cObject instanceof CTerminologyCodeADL14) {
CTerminologyCodeADL14 termCodeInParent = (CTerminologyCodeADL14) cObject;
if(termCodeInParent.getConstraint() != null && !termCodeInParent.getConstraint().isEmpty()) {
if(termCodeInParent.getConstraint().get(0).startsWith("ac")) {
idInparent = termCodeInParent.getConstraint().get(0);
String firstConstraint = termCodeInParent.getConstraint().get(0);
if(firstConstraint.startsWith("ac")) {
idInparent = firstConstraint;
}
}
} else if(cObject instanceof CTerminologyCode) {
CTerminologyCode termCodeInParent = (CTerminologyCode) cObject;
String parentConstraint = termCodeInParent.getConstraint();
if(parentConstraint != null && parentConstraint.startsWith("ac")) {
idInparent = parentConstraint;
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,9 @@ private Set<String> gatherUsedValueSets(CAttribute attribute) {
Set<String> result = new LinkedHashSet<>();
for(CObject child:attribute.getChildren()) {
if(child instanceof CTerminologyCode) {
for(String constraint:((CTerminologyCode) child).getConstraint()) {
if(constraint.startsWith("ac")) {
result.add(constraint);
}
String constraint = ((CTerminologyCode) child).getConstraint();
if(constraint != null && constraint.startsWith("ac")) {
result.add(constraint);
}
}
if(child.getRmTypeName().equalsIgnoreCase("DV_ORDINAL")) {
Expand All @@ -214,8 +213,8 @@ private Set<String> gatherUsedValueSets(CAttribute attribute) {
if(symbolIndex >= 0) {
for(CPrimitiveTuple primitiveTuple:tuple.getTuples()) {
CTerminologyCode cTermCode = (CTerminologyCode) primitiveTuple.getMember(symbolIndex);
if(cTermCode != null) {
atCodes.addAll(cTermCode.getConstraint());
if(cTermCode != null && cTermCode.getConstraint() != null) {
atCodes.add(cTermCode.getConstraint());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.nedap.archie.aom.primitives.CInteger;
import com.nedap.archie.aom.primitives.CTerminologyCode;
import com.nedap.archie.aom.primitives.CTerminologyCodeADL14;
import com.nedap.archie.base.Interval;
import com.nedap.archie.base.terminology.TerminologyCode;

import java.util.Arrays;

public class CDVOrdinalItem {

private Integer value;
Expand All @@ -30,12 +28,12 @@ public void setSymbol(TerminologyCode symbol) {
}

@JsonIgnore
public CTerminologyCode getSymbolAdl2() {
public CTerminologyCodeADL14 getSymbolAdl2() {
if(symbol == null) {
return null;
}
CTerminologyCode result = new CTerminologyCode();
result.setConstraint(Arrays.asList(symbol.toString()));
CTerminologyCodeADL14 result = new CTerminologyCodeADL14();
result.addConstraint(symbol.toString());
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import com.nedap.archie.aom.primitives.CInteger;
import com.nedap.archie.aom.primitives.CReal;
import com.nedap.archie.aom.primitives.CString;
import com.nedap.archie.aom.primitives.CTerminologyCode;
import com.nedap.archie.aom.primitives.CTerminologyCodeADL14;
import com.nedap.archie.base.Cardinality;
import com.nedap.archie.base.Interval;
import com.nedap.archie.base.MultiplicityInterval;
Expand Down Expand Up @@ -203,7 +203,7 @@ private CObject parseNonPrimitiveObject(C_non_primitive_objectContext objectCont

CPrimitiveTuple primitiveTuple = new CPrimitiveTuple();

CTerminologyCode cCode = new CTerminologyCode();
CTerminologyCodeADL14 cCode = new CTerminologyCodeADL14();

TerminologyCode code = TerminologyCode.createFromString(ordinal_termContext.c_terminology_code().getText());
cCode.addConstraint(code.getCodeString());
Expand Down Expand Up @@ -256,7 +256,7 @@ private void parseCDVOrdinal(C_non_primitive_objectContext objectContext, CCompl
if (item.getSymbol() != null) {
primitiveTuple.addMember(item.getSymbolAdl2());
} else if (hasSymbol) {
CTerminologyCode code = new CTerminologyCode();
CTerminologyCodeADL14 code = new CTerminologyCodeADL14();
primitiveTuple.addMember(code);//nothing we can do here!
}

Expand All @@ -273,7 +273,7 @@ private void parseCDVQuantity(C_non_primitive_objectContext objectContext, CComp
CDVQuantity cdvQuantity = odinParser.convert(objectContext.domainSpecificExtension().odin_text().getText(), CDVQuantity.class);
if(cdvQuantity.getProperty() != null) {
CAttribute property = new CAttribute("property");
CTerminologyCode code = new CTerminologyCode();
CTerminologyCodeADL14 code = new CTerminologyCodeADL14();
//will be converted later
code.addConstraint(cdvQuantity.getProperty().toString());
property.addChild(code);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ private void parseBooleanValues(CBoolean result, List<Boolean_valueContext> bool
}
}

public CTerminologyCode parseCTerminologyCode(Adl14Parser.C_terminology_codeContext terminologyCodeContext) {
CTerminologyCode result = new CTerminologyCode();
public CTerminologyCodeADL14 parseCTerminologyCode(Adl14Parser.C_terminology_codeContext terminologyCodeContext) {
CTerminologyCodeADL14 result = new CTerminologyCodeADL14();

boolean containsAssumedValue = !terminologyCodeContext.getTokens(Adl14Lexer.SYM_SEMICOLON).isEmpty();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,12 @@ public CTerminologyCode parseCTerminologyCode(AdlParser.C_terminology_codeContex
String assumedValueString = terminologyCodeContext.AT_CODE().getText();
assumedValue.setCodeString(assumedValueString);
result.setAssumedValue(assumedValue);
result.addConstraint(assumedValue.getTerminologyIdString());
result.setConstraint(assumedValue.getTerminologyIdString());
} else {
if(terminologyCodeContext.AC_CODE() != null) {
result.addConstraint(terminologyCodeContext.AC_CODE().getText());
result.setConstraint(terminologyCodeContext.AC_CODE().getText());
} else {
result.addConstraint(terminologyCodeContext.AT_CODE().getText());
result.setConstraint(terminologyCodeContext.AT_CODE().getText());
}
}

Expand Down
4 changes: 2 additions & 2 deletions aom/src/main/java/com/nedap/archie/aom/Archetype.java
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ public Set<String> getAllUsedCodes() {
if(cObject instanceof CTerminologyCode) {
CTerminologyCode terminologyCode = (CTerminologyCode) cObject;
result.addAll(terminologyCode.getValueSetExpanded());
if(!terminologyCode.getConstraint().isEmpty()) {
result.add(terminologyCode.getConstraint().get(0));
if(terminologyCode.getConstraint() != null) {
result.add(terminologyCode.getConstraint());
}
}
for(CAttribute attribute:cObject.getAttributes()) {
Expand Down
Loading