001package org.hl7.fhir.convertors.conv10_50.resources10_50;
002
003import java.util.ArrayList;
004import java.util.List;
005import java.util.Objects;
006
007import org.hl7.fhir.convertors.SourceElementComponentWrapper;
008import org.hl7.fhir.convertors.VersionConvertorConstants;
009import org.hl7.fhir.convertors.context.ConversionContext10_50;
010import org.hl7.fhir.convertors.conv10_50.VersionConvertor_10_50;
011import org.hl7.fhir.convertors.conv10_50.datatypes10_50.complextypes10_50.CodeableConcept10_50;
012import org.hl7.fhir.convertors.conv10_50.datatypes10_50.complextypes10_50.ContactPoint10_50;
013import org.hl7.fhir.convertors.conv10_50.datatypes10_50.complextypes10_50.Identifier10_50;
014import org.hl7.fhir.convertors.conv10_50.datatypes10_50.primitivetypes10_50.Boolean10_50;
015import org.hl7.fhir.convertors.conv10_50.datatypes10_50.primitivetypes10_50.Code10_50;
016import org.hl7.fhir.convertors.conv10_50.datatypes10_50.primitivetypes10_50.DateTime10_50;
017import org.hl7.fhir.convertors.conv10_50.datatypes10_50.primitivetypes10_50.String10_50;
018import org.hl7.fhir.convertors.conv10_50.datatypes10_50.primitivetypes10_50.Uri10_50;
019import org.hl7.fhir.dstu2.model.Enumerations.ConceptMapEquivalence;
020import org.hl7.fhir.exceptions.FHIRException;
021import org.hl7.fhir.r5.model.CanonicalType;
022import org.hl7.fhir.r5.model.ConceptMap;
023import org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent;
024import org.hl7.fhir.r5.model.DataType;
025import org.hl7.fhir.r5.model.Enumeration;
026import org.hl7.fhir.r5.model.Enumerations;
027import org.hl7.fhir.r5.model.Enumerations.ConceptMapRelationship;
028import org.hl7.fhir.r5.utils.ToolingExtensions;
029
030public class ConceptMap10_50 {
031
032  public static org.hl7.fhir.r5.model.ConceptMap convertConceptMap(org.hl7.fhir.dstu2.model.ConceptMap src) throws FHIRException {
033    if (src == null || src.isEmpty())
034      return null;
035    org.hl7.fhir.r5.model.ConceptMap tgt = new org.hl7.fhir.r5.model.ConceptMap();
036    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyDomainResource(src, tgt);
037    if (src.hasUrlElement())
038      tgt.setUrlElement(Uri10_50.convertUri(src.getUrlElement()));
039    if (src.hasIdentifier())
040      tgt.addIdentifier(Identifier10_50.convertIdentifier(src.getIdentifier()));
041    if (src.hasVersionElement())
042      tgt.setVersionElement(String10_50.convertString(src.getVersionElement()));
043    if (src.hasNameElement())
044      tgt.setNameElement(String10_50.convertString(src.getNameElement()));
045    if (src.hasStatus())
046      tgt.setStatusElement(Enumerations10_50.convertConformanceResourceStatus(src.getStatusElement()));
047    if (src.hasExperimental())
048      tgt.setExperimentalElement(Boolean10_50.convertBoolean(src.getExperimentalElement()));
049    if (src.hasPublisherElement())
050      tgt.setPublisherElement(String10_50.convertString(src.getPublisherElement()));
051    for (org.hl7.fhir.dstu2.model.ConceptMap.ConceptMapContactComponent t : src.getContact())
052      tgt.addContact(convertConceptMapContactComponent(t));
053    if (src.hasDate())
054      tgt.setDateElement(DateTime10_50.convertDateTime(src.getDateElement()));
055    if (src.hasDescription())
056      tgt.setDescription(src.getDescription());
057    for (org.hl7.fhir.dstu2.model.CodeableConcept t : src.getUseContext())
058      if (VersionConvertor_10_50.isJurisdiction(t))
059        tgt.addJurisdiction(CodeableConcept10_50.convertCodeableConcept(t));
060      else
061        tgt.addUseContext(CodeableConcept10_50.convertCodeableConceptToUsageContext(t));
062    if (src.hasRequirements())
063      tgt.setPurpose(src.getRequirements());
064    if (src.hasCopyright())
065      tgt.setCopyright(src.getCopyright());
066    if (src.hasSource()) {
067      org.hl7.fhir.r5.model.DataType r = ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().convertType(src.getSource());
068      tgt.setSourceScope(r instanceof org.hl7.fhir.r5.model.Reference ? new CanonicalType(((org.hl7.fhir.r5.model.Reference) r).getReference()) : r);
069    }
070    if (src.hasTarget()) {
071      DataType r = ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().convertType(src.getTarget());
072      tgt.setTargetScope(r instanceof org.hl7.fhir.r5.model.Reference ? new CanonicalType(((org.hl7.fhir.r5.model.Reference) r).getReference()) : r);
073    }
074    for (org.hl7.fhir.dstu2.model.ConceptMap.SourceElementComponent t : src.getElement()) {
075      List<SourceElementComponentWrapper<ConceptMap.SourceElementComponent>> ws = convertSourceElementComponent(t, tgt);
076      for (SourceElementComponentWrapper<ConceptMap.SourceElementComponent> w : ws)
077        getGroup(tgt, w.getSource(), w.getTarget()).addElement(w.getComp());
078    }
079    return tgt;
080  }
081
082  public static org.hl7.fhir.dstu2.model.ConceptMap convertConceptMap(org.hl7.fhir.r5.model.ConceptMap src) throws FHIRException {
083    if (src == null || src.isEmpty())
084      return null;
085    org.hl7.fhir.dstu2.model.ConceptMap tgt = new org.hl7.fhir.dstu2.model.ConceptMap();
086    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyDomainResource(src, tgt);
087    if (src.hasUrlElement())
088      tgt.setUrlElement(Uri10_50.convertUri(src.getUrlElement()));
089    if (src.hasIdentifier()) {
090      if (src.hasIdentifier())
091        tgt.setIdentifier(Identifier10_50.convertIdentifier(src.getIdentifierFirstRep()));
092    }
093    if (src.hasVersionElement())
094      tgt.setVersionElement(String10_50.convertString(src.getVersionElement()));
095    if (src.hasNameElement())
096      tgt.setNameElement(String10_50.convertString(src.getNameElement()));
097    if (src.hasStatus())
098      tgt.setStatusElement(Enumerations10_50.convertConformanceResourceStatus(src.getStatusElement()));
099    if (src.hasExperimental())
100      tgt.setExperimentalElement(Boolean10_50.convertBoolean(src.getExperimentalElement()));
101    if (src.hasPublisherElement())
102      tgt.setPublisherElement(String10_50.convertString(src.getPublisherElement()));
103    for (org.hl7.fhir.r5.model.ContactDetail t : src.getContact()) tgt.addContact(convertConceptMapContactComponent(t));
104    if (src.hasDate())
105      tgt.setDateElement(DateTime10_50.convertDateTime(src.getDateElement()));
106    if (src.hasDescription())
107      tgt.setDescription(src.getDescription());
108    for (org.hl7.fhir.r5.model.UsageContext t : src.getUseContext())
109      if (t.hasValueCodeableConcept())
110        tgt.addUseContext(CodeableConcept10_50.convertCodeableConcept(t.getValueCodeableConcept()));
111    for (org.hl7.fhir.r5.model.CodeableConcept t : src.getJurisdiction())
112      tgt.addUseContext(CodeableConcept10_50.convertCodeableConcept(t));
113    if (src.hasPurpose())
114      tgt.setRequirements(src.getPurpose());
115    if (src.hasCopyright())
116      tgt.setCopyright(src.getCopyright());
117    if (src.hasSourceScope())
118      tgt.setSource(ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().convertType(src.getSourceScope()));
119    if (src.hasTargetScope())
120      tgt.setTarget(ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().convertType(src.getTargetScope()));
121    for (org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent g : src.getGroup())
122      for (org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent t : g.getElement())
123        tgt.addElement(convertSourceElementComponent(t, g, src));
124    return tgt;
125  }
126
127  public static org.hl7.fhir.r5.model.ContactDetail convertConceptMapContactComponent(org.hl7.fhir.dstu2.model.ConceptMap.ConceptMapContactComponent src) throws FHIRException {
128    if (src == null || src.isEmpty())
129      return null;
130    org.hl7.fhir.r5.model.ContactDetail tgt = new org.hl7.fhir.r5.model.ContactDetail();
131    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyElement(src, tgt);
132    if (src.hasNameElement())
133      tgt.setNameElement(String10_50.convertString(src.getNameElement()));
134    for (org.hl7.fhir.dstu2.model.ContactPoint t : src.getTelecom())
135      tgt.addTelecom(ContactPoint10_50.convertContactPoint(t));
136    return tgt;
137  }
138
139  public static org.hl7.fhir.dstu2.model.ConceptMap.ConceptMapContactComponent convertConceptMapContactComponent(org.hl7.fhir.r5.model.ContactDetail src) throws FHIRException {
140    if (src == null || src.isEmpty())
141      return null;
142    org.hl7.fhir.dstu2.model.ConceptMap.ConceptMapContactComponent tgt = new org.hl7.fhir.dstu2.model.ConceptMap.ConceptMapContactComponent();
143    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyElement(src, tgt);
144    if (src.hasNameElement())
145      tgt.setNameElement(String10_50.convertString(src.getNameElement()));
146    for (org.hl7.fhir.r5.model.ContactPoint t : src.getTelecom())
147      tgt.addTelecom(ContactPoint10_50.convertContactPoint(t));
148    return tgt;
149  }
150
151  public static org.hl7.fhir.dstu2.model.Enumeration<ConceptMapEquivalence> convertConceptMapEquivalence(Enumeration<ConceptMapRelationship> src, org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent ccm) throws FHIRException {
152    if (src == null || src.isEmpty())
153      return null;
154    org.hl7.fhir.dstu2.model.Enumeration<ConceptMapEquivalence> tgt = new org.hl7.fhir.dstu2.model.Enumeration<ConceptMapEquivalence>(new org.hl7.fhir.dstu2.model.Enumerations.ConceptMapEquivalenceEnumFactory());
155    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyElement(src, tgt);
156    if (ccm.hasExtension(VersionConvertorConstants.EXT_OLD_CONCEPTMAP_EQUIVALENCE)) {
157      tgt.setValueAsString(ccm.getExtensionString(VersionConvertorConstants.EXT_OLD_CONCEPTMAP_EQUIVALENCE));
158    } else {
159        if (src.getValue() == null) {
160            tgt.setValue(null);
161        } else {
162            switch (src.getValue()) {
163                case EQUIVALENT:
164                    tgt.setValue(ConceptMapEquivalence.EQUIVALENT);
165                    break;
166                case SOURCEISNARROWERTHANTARGET:
167                    tgt.setValue(ConceptMapEquivalence.WIDER);
168                    break;
169                case SOURCEISBROADERTHANTARGET:
170                    tgt.setValue(ConceptMapEquivalence.NARROWER);
171                    break;
172                case NOTRELATEDTO:
173                    tgt.setValue(ConceptMapEquivalence.DISJOINT);
174                    break;
175                default:
176                    tgt.setValue(ConceptMapEquivalence.NULL);
177                    break;
178            }
179        }
180    }
181    return tgt;
182  }
183
184  public static Enumeration<ConceptMapRelationship> convertConceptMapRelationship(org.hl7.fhir.dstu2.model.Enumeration<ConceptMapEquivalence> src, org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent tgtCtxt) throws FHIRException {
185      if (src == null || src.isEmpty())
186          return null;
187      Enumeration<ConceptMapRelationship> tgt = new Enumeration<ConceptMapRelationship>(new Enumerations.ConceptMapRelationshipEnumFactory());
188      ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyElement(src, tgt);
189      ToolingExtensions.setCodeExtensionMod(tgtCtxt, VersionConvertorConstants.EXT_OLD_CONCEPTMAP_EQUIVALENCE, src.getValueAsString());
190      if (src.getValue() == null) {
191          tgt.setValue(null);
192      } else {
193          switch (src.getValue()) {
194              case EQUIVALENT:
195                  tgt.setValue(ConceptMapRelationship.EQUIVALENT);
196                  break;
197              case EQUAL:
198                  tgt.setValue(ConceptMapRelationship.EQUIVALENT);
199                  break;
200              case WIDER:
201                  tgt.setValue(ConceptMapRelationship.SOURCEISNARROWERTHANTARGET);
202                  break;
203              case SUBSUMES:
204                  tgt.setValue(ConceptMapRelationship.SOURCEISNARROWERTHANTARGET);
205                  break;
206              case NARROWER:
207                  tgt.setValue(ConceptMapRelationship.SOURCEISBROADERTHANTARGET);
208                  break;
209              case SPECIALIZES:
210                  tgt.setValue(ConceptMapRelationship.SOURCEISBROADERTHANTARGET);
211                  break;
212              case INEXACT:
213                  tgt.setValue(ConceptMapRelationship.RELATEDTO);
214                  break;
215              case UNMATCHED:
216                  tgt.setValue(ConceptMapRelationship.NULL);
217                  break;
218              case DISJOINT:
219                  tgt.setValue(ConceptMapRelationship.NOTRELATEDTO);
220                  break;
221              default:
222                  tgt.setValue(null);
223                  break;
224          }
225      }
226      return tgt;
227  }
228
229  public static org.hl7.fhir.dstu2.model.ConceptMap.OtherElementComponent convertOtherElementComponent(org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent src, org.hl7.fhir.r5.model.ConceptMap srcMap) throws FHIRException {
230    if (src == null || src.isEmpty())
231      return null;
232    org.hl7.fhir.dstu2.model.ConceptMap.OtherElementComponent tgt = new org.hl7.fhir.dstu2.model.ConceptMap.OtherElementComponent();
233    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyBackboneElement(src,tgt);
234    if (src.hasAttribute())
235      tgt.setElement(srcMap.getAttributeUri(src.getAttribute()));
236    if (src.hasValueCoding()) {
237      tgt.setCode(src.getValueCoding().getCode());
238    } else if (src.hasValue()) {
239      tgt.setCode(src.getValue().primitiveValue());
240    }
241    return tgt;
242  }
243
244  public static org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent convertOtherElementComponent(org.hl7.fhir.dstu2.model.ConceptMap.OtherElementComponent src, org.hl7.fhir.r5.model.ConceptMap tgtMap) throws FHIRException {
245    if (src == null || src.isEmpty())
246      return null;
247    org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent tgt = new org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent();
248    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyBackboneElement(src,tgt);
249    if (src.hasElementElement())
250      tgt.setAttribute(tgtMap.registerAttribute(src.getElement()));
251    tgt.setValue(String10_50.convertString(src.getCodeElement()));
252    return tgt;
253  }
254
255  public static org.hl7.fhir.dstu2.model.ConceptMap.SourceElementComponent convertSourceElementComponent(org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent src, org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent g, org.hl7.fhir.r5.model.ConceptMap srcMap) throws FHIRException {
256    if (src == null || src.isEmpty())
257      return null;
258    org.hl7.fhir.dstu2.model.ConceptMap.SourceElementComponent tgt = new org.hl7.fhir.dstu2.model.ConceptMap.SourceElementComponent();
259    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyBackboneElement(src,tgt);
260    tgt.setCodeSystem(g.getSource());
261    if (src.hasCodeElement())
262      tgt.setCodeElement(Code10_50.convertCode(src.getCodeElement()));
263    if (src.hasNoMap() && src.getNoMap() == true) {
264      tgt.addTarget(new org.hl7.fhir.dstu2.model.ConceptMap.TargetElementComponent().setEquivalence(org.hl7.fhir.dstu2.model.Enumerations.ConceptMapEquivalence.UNMATCHED));
265    } else {
266      for (org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent t : src.getTarget())
267        tgt.addTarget(convertTargetElementComponent(t, g, srcMap));
268    }
269    return tgt;
270  }
271
272  public static List<SourceElementComponentWrapper<ConceptMap.SourceElementComponent>> convertSourceElementComponent(org.hl7.fhir.dstu2.model.ConceptMap.SourceElementComponent src, org.hl7.fhir.r5.model.ConceptMap tgtMap) throws FHIRException {
273    List<SourceElementComponentWrapper<ConceptMap.SourceElementComponent>> res = new ArrayList<>();
274    if (src == null || src.isEmpty())
275      return res;
276    for (org.hl7.fhir.dstu2.model.ConceptMap.TargetElementComponent t : src.getTarget()) {
277      org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent tgt = new org.hl7.fhir.r5.model.ConceptMap.SourceElementComponent();
278      ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyBackboneElement(src,tgt);
279      tgt.setCode(src.getCode());
280      if (t.getEquivalence() == org.hl7.fhir.dstu2.model.Enumerations.ConceptMapEquivalence.UNMATCHED) {
281        tgt.setNoMap(true);
282      } else {
283        tgt.addTarget(convertTargetElementComponent(t, tgtMap));
284      }
285      res.add(new SourceElementComponentWrapper<>(tgt, src.getCodeSystem(), t.getCodeSystem()));
286    }
287    return res;
288  }
289
290  public static org.hl7.fhir.dstu2.model.ConceptMap.TargetElementComponent convertTargetElementComponent(org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent src, org.hl7.fhir.r5.model.ConceptMap.ConceptMapGroupComponent g, org.hl7.fhir.r5.model.ConceptMap srcMap) throws FHIRException {
291    if (src == null || src.isEmpty())
292      return null;
293    org.hl7.fhir.dstu2.model.ConceptMap.TargetElementComponent tgt = new org.hl7.fhir.dstu2.model.ConceptMap.TargetElementComponent();
294    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyBackboneElement(src,tgt, VersionConvertorConstants.EXT_OLD_CONCEPTMAP_EQUIVALENCE);
295    tgt.setCodeSystem(g.getTarget());
296    if (src.hasCodeElement())
297      tgt.setCodeElement(Code10_50.convertCode(src.getCodeElement()));
298    if (src.hasRelationship())
299      tgt.setEquivalenceElement(convertConceptMapEquivalence(src.getRelationshipElement(), src));
300    if (src.hasCommentElement())
301      tgt.setCommentsElement(String10_50.convertString(src.getCommentElement()));
302    for (org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent t : src.getDependsOn())
303      tgt.addDependsOn(convertOtherElementComponent(t, srcMap));
304    for (org.hl7.fhir.r5.model.ConceptMap.OtherElementComponent t : src.getProduct())
305      tgt.addProduct(convertOtherElementComponent(t, srcMap));
306    return tgt;
307  }
308
309  public static org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent convertTargetElementComponent(org.hl7.fhir.dstu2.model.ConceptMap.TargetElementComponent src, org.hl7.fhir.r5.model.ConceptMap tgtMap) throws FHIRException {
310    if (src == null || src.isEmpty())
311      return null;
312    org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent tgt = new org.hl7.fhir.r5.model.ConceptMap.TargetElementComponent();
313    ConversionContext10_50.INSTANCE.getVersionConvertor_10_50().copyBackboneElement(src,tgt);
314    if (src.hasCodeElement())
315      tgt.setCodeElement(Code10_50.convertCode(src.getCodeElement()));
316    if (src.hasEquivalence())
317      tgt.setRelationshipElement(convertConceptMapRelationship(src.getEquivalenceElement(), tgt));
318    if (src.hasCommentsElement())
319      tgt.setCommentElement(String10_50.convertString(src.getCommentsElement()));
320    for (org.hl7.fhir.dstu2.model.ConceptMap.OtherElementComponent t : src.getDependsOn())
321      tgt.addDependsOn(convertOtherElementComponent(t, tgtMap));
322    for (org.hl7.fhir.dstu2.model.ConceptMap.OtherElementComponent t : src.getProduct())
323      tgt.addProduct(convertOtherElementComponent(t, tgtMap));
324    return tgt;
325  }
326
327  static public ConceptMapGroupComponent getGroup(ConceptMap map, String srcs, String tgts) {
328    for (ConceptMapGroupComponent grp : map.getGroup()) {
329      if (Objects.equals(grp.getSource(), srcs) && Objects.equals(grp.getTarget(), tgts))
330        return grp;
331    }
332    ConceptMapGroupComponent grp = map.addGroup();
333    grp.setSource(srcs);
334    grp.setTarget(tgts);
335    return grp;
336  }
337}