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