001/*-
002 * #%L
003 * HAPI FHIR - Converter
004 * %%
005 * Copyright (C) 2014 - 2025 Smile CDR, Inc.
006 * %%
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 * You may obtain a copy of the License at
010 *
011 *      http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 * #L%
019 */
020package ca.uhn.hapi.converters.canonical;
021
022import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
023import ca.uhn.fhir.context.FhirContext;
024import ca.uhn.fhir.context.FhirVersionEnum;
025import ca.uhn.fhir.i18n.Msg;
026import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt;
027import ca.uhn.fhir.model.dstu2.composite.CodingDt;
028import ca.uhn.fhir.util.HapiExtensions;
029import jakarta.annotation.Nonnull;
030import org.apache.commons.lang3.StringUtils;
031import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_10_40;
032import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_10_50;
033import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_14_40;
034import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_14_50;
035import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_40;
036import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_30_50;
037import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_40_50;
038import org.hl7.fhir.convertors.advisors.impl.BaseAdvisor_43_50;
039import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_40;
040import org.hl7.fhir.convertors.factory.VersionConvertorFactory_10_50;
041import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_40;
042import org.hl7.fhir.convertors.factory.VersionConvertorFactory_14_50;
043import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_40;
044import org.hl7.fhir.convertors.factory.VersionConvertorFactory_30_50;
045import org.hl7.fhir.convertors.factory.VersionConvertorFactory_40_50;
046import org.hl7.fhir.convertors.factory.VersionConvertorFactory_43_50;
047import org.hl7.fhir.dstu2.model.Resource;
048import org.hl7.fhir.instance.model.api.IBase;
049import org.hl7.fhir.instance.model.api.IBaseCoding;
050import org.hl7.fhir.instance.model.api.IBaseConformance;
051import org.hl7.fhir.instance.model.api.IBaseDatatype;
052import org.hl7.fhir.instance.model.api.IBaseParameters;
053import org.hl7.fhir.instance.model.api.IBaseResource;
054import org.hl7.fhir.instance.model.api.IPrimitiveType;
055import org.hl7.fhir.r4.model.AuditEvent;
056import org.hl7.fhir.r4.model.CodeSystem;
057import org.hl7.fhir.r4.model.CodeableConcept;
058import org.hl7.fhir.r4.model.Coding;
059import org.hl7.fhir.r4.model.ConceptMap;
060import org.hl7.fhir.r4.model.Parameters;
061import org.hl7.fhir.r4.model.ValueSet;
062import org.hl7.fhir.r5.model.CapabilityStatement;
063import org.hl7.fhir.r5.model.CodeType;
064import org.hl7.fhir.r5.model.Enumerations;
065import org.hl7.fhir.r5.model.PackageInformation;
066import org.hl7.fhir.r5.model.SearchParameter;
067import org.hl7.fhir.r5.model.StructureDefinition;
068import org.hl7.fhir.r5.model.SubscriptionTopic;
069
070import java.util.Date;
071import java.util.List;
072import java.util.Objects;
073import java.util.stream.Collectors;
074
075import static org.apache.commons.lang3.StringUtils.isBlank;
076
077/**
078 * This class converts versions of various resources to/from a canonical version
079 * of the resource. The specific version that is considered canonical is arbitrary
080 * for historical reasons, generally it will be R4 or R5 but this varies by resource
081 * type.
082 * <p>
083 * This class is an internal HAPI FHIR API and can change without notice at any time.
084 * Use with caution!
085 * </p>
086 */
087public class VersionCanonicalizer {
088
089        private static final BaseAdvisor_30_50 ADVISOR_30_50 = new BaseAdvisor_30_50(false);
090        private static final BaseAdvisor_30_40 ADVISOR_30_40 = new BaseAdvisor_30_40(false);
091        private static final BaseAdvisor_10_40 ADVISOR_10_40 = new BaseAdvisor_10_40(false);
092        private static final BaseAdvisor_10_50 ADVISOR_10_50 = new BaseAdvisor_10_50(false);
093        private static final BaseAdvisor_40_50 ADVISOR_40_50 = new BaseAdvisor_40_50(false);
094        private static final BaseAdvisor_43_50 ADVISOR_43_50 = new BaseAdvisor_43_50(false);
095        private static final BaseAdvisor_14_40 ADVISOR_14_40 = new BaseAdvisor_14_40(false);
096        private static final BaseAdvisor_14_50 ADVISOR_14_50 = new BaseAdvisor_14_50(false);
097
098        private final IStrategy myStrategy;
099        private final FhirContext myContext;
100
101        public VersionCanonicalizer(FhirVersionEnum theTargetVersion) {
102                this(FhirContext.forCached(theTargetVersion));
103        }
104
105        public VersionCanonicalizer(FhirContext theTargetContext) {
106                myContext = theTargetContext;
107                FhirVersionEnum targetVersion = theTargetContext.getVersion().getVersion();
108                switch (targetVersion) {
109                        case DSTU2:
110                                myStrategy = new Dstu2Strategy(false);
111                                break;
112                        case DSTU2_HL7ORG:
113                                myStrategy = new Dstu2Strategy(true);
114                                break;
115                        case DSTU2_1:
116                                myStrategy = new Dstu21Strategy();
117                                break;
118                        case DSTU3:
119                                myStrategy = new Dstu3Strategy();
120                                break;
121                        case R4:
122                                myStrategy = new R4Strategy();
123                                break;
124                        case R4B:
125                                myStrategy = new R4BStrategy();
126                                break;
127                        case R5:
128                                myStrategy = new R5Strategy();
129                                break;
130                        default:
131                                throw new IllegalStateException(Msg.code(193) + "Can't handle version: " + targetVersion);
132                }
133        }
134
135        /**
136         * Canonical version: R5
137         */
138        public CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement) {
139                return myStrategy.capabilityStatementToCanonical(theCapabilityStatement);
140        }
141
142        /**
143         * Canonical version: R5
144         */
145        public IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theCapabilityStatement) {
146                return myStrategy.capabilityStatementFromCanonical(theCapabilityStatement);
147        }
148
149        /**
150         * Canonical version: R4
151         */
152        public CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept) {
153                if (theCodeableConcept == null) {
154                        return null;
155                }
156                return myStrategy.codeableConceptToCanonical(theCodeableConcept);
157        }
158
159        /**
160         * Canonical version: R4
161         */
162        public Coding codingToCanonical(IBaseCoding theCodingToValidate) {
163                if (theCodingToValidate == null) {
164                        return null;
165                }
166                return myStrategy.codingToCanonical(theCodingToValidate);
167        }
168
169        /**
170         * Canonical version: R4
171         */
172        public ValueSet valueSetToCanonical(IBaseResource theValueSet) {
173                if (theValueSet == null) {
174                        return null;
175                }
176                return myStrategy.valueSetToCanonical(theValueSet);
177        }
178
179        /**
180         * Canonical version: R4
181         */
182        public CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem) {
183                return myStrategy.codeSystemToCanonical(theCodeSystem);
184        }
185
186        /**
187         * Canonical version: R4
188         */
189        public IBaseResource valueSetFromCanonical(ValueSet theValueSet) {
190                return myStrategy.valueSetFromCanonical(theValueSet);
191        }
192
193        /**
194         * Canonical version: R4
195         */
196        public IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem) {
197                return myStrategy.codeSystemFromCanonical(theCodeSystem);
198        }
199
200        /**
201         * Canonical version: R4
202         */
203        public ConceptMap conceptMapToCanonical(IBaseResource theConceptMap) {
204                return myStrategy.conceptMapToCanonical(theConceptMap);
205        }
206
207        /**
208         * Canonical version: R5
209         * <p>
210         * Note that this method will look for any nonstandard resource types specified in
211         * {@literal SearchParameter.base} or {@literal SearchParameter.target} and move them into
212         * extensions with the URLs {@link HapiExtensions#EXTENSION_SEARCHPARAM_CUSTOM_BASE_RESOURCE}
213         * and {@link HapiExtensions#EXTENSION_SEARCHPARAM_CUSTOM_TARGET_RESOURCE} respectively. If any
214         * nonstandard resource types are found, all resource types in the respective list are moved into
215         * the extension (including standard types) and the source list is cleared.
216         */
217        public <T extends IBaseResource> SearchParameter searchParameterToCanonical(T theSearchParameter) {
218
219                /*
220                 * The R4 model allows custom types to be put into SearchParameter.base and
221                 * SearchParameter.target because those fields use a simple CodeType. But
222                 * in R5 it uses an Enumeration, so it's not actually possible to put custom
223                 * resource types into those fields. This means that the version converter fails
224                 * with an exception unless we remove those values from those fields before
225                 * conversion. However, we don't want to affect the state of the originally
226                 * passed in resource since that may affect other things. So, we clone
227                 * it first. This is a pain in the butt, but there doesn't seem to be any
228                 * better option.
229                 */
230                T input = myContext.newTerser().clone(theSearchParameter);
231
232                List<String> baseExtensionValues =
233                                extractNonStandardSearchParameterListAndClearSourceIfAnyArePresent(input, "base");
234                List<String> targetExtensionValues =
235                                extractNonStandardSearchParameterListAndClearSourceIfAnyArePresent(input, "target");
236
237                SearchParameter retVal = myStrategy.searchParameterToCanonical(input);
238
239                baseExtensionValues.forEach(
240                                t -> retVal.addExtension(HapiExtensions.EXTENSION_SEARCHPARAM_CUSTOM_BASE_RESOURCE, new CodeType(t)));
241                targetExtensionValues.forEach(
242                                t -> retVal.addExtension(HapiExtensions.EXTENSION_SEARCHPARAM_CUSTOM_TARGET_RESOURCE, new CodeType(t)));
243                return retVal;
244        }
245
246        public IBaseResource searchParameterFromCanonical(SearchParameter theSearchParameter) {
247                return myStrategy.searchParameterFromCanonical(theSearchParameter);
248        }
249
250        public IBaseParameters parametersFromCanonical(Parameters theParameters) {
251                return myStrategy.parametersFromCanonical(theParameters);
252        }
253
254        public StructureDefinition structureDefinitionToCanonical(IBaseResource theResource) {
255                StructureDefinition retVal = myStrategy.structureDefinitionToCanonical(theResource);
256                String packageUserData = (String) theResource.getUserData("package");
257                if (packageUserData != null) {
258                        retVal.setUserData("package", packageUserData);
259                        retVal.setSourcePackage(new PackageInformation(
260                                        packageUserData, theResource.getStructureFhirVersionEnum().getFhirVersionString(), new Date()));
261                }
262                return retVal;
263        }
264
265        public IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource) {
266                return myStrategy.structureDefinitionFromCanonical(theResource);
267        }
268
269        public IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource) {
270                return myStrategy.valueSetFromValidatorCanonical(theResource);
271        }
272
273        public org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource) {
274                return myStrategy.resourceToValidatorCanonical(theResource);
275        }
276
277        public org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource) {
278                return myStrategy.valueSetToValidatorCanonical(theResource);
279        }
280
281        public org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource) {
282                return myStrategy.codeSystemToValidatorCanonical(theResource);
283        }
284
285        public IBaseResource auditEventFromCanonical(AuditEvent theResource) {
286                return myStrategy.auditEventFromCanonical(theResource);
287        }
288
289        @Nonnull
290        private List<String> extractNonStandardSearchParameterListAndClearSourceIfAnyArePresent(
291                        IBaseResource theSearchParameter, String theChildName) {
292
293                BaseRuntimeChildDefinition child =
294                                myContext.getResourceDefinition(theSearchParameter).getChildByName(theChildName);
295                List<IBase> baseList = child.getAccessor().getValues(theSearchParameter);
296
297                List<String> baseExtensionValues = baseList.stream()
298                                .filter(Objects::nonNull)
299                                .filter(t -> t instanceof IPrimitiveType)
300                                .map(t -> (IPrimitiveType<?>) t)
301                                .map(IPrimitiveType::getValueAsString)
302                                .filter(StringUtils::isNotBlank)
303                                .collect(Collectors.toList());
304                if (baseExtensionValues.stream().allMatch(Enumerations.VersionIndependentResourceTypesAll::isValidCode)) {
305                        baseExtensionValues.clear();
306                } else {
307                        baseList.clear();
308                }
309                return baseExtensionValues;
310        }
311
312        public SubscriptionTopic subscriptionTopicToCanonical(IBaseResource theResource) {
313                return SubscriptionTopicCanonicalizer.canonicalizeTopic(myContext, theResource);
314        }
315
316        public IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap) {
317                return myStrategy.conceptMapFromCanonical(theConceptMap);
318        }
319
320        private interface IStrategy {
321
322                CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement);
323
324                Coding codingToCanonical(IBaseCoding theCoding);
325
326                CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept);
327
328                ValueSet valueSetToCanonical(IBaseResource theValueSet);
329
330                CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem);
331
332                IBaseResource valueSetFromCanonical(ValueSet theValueSet);
333
334                IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem);
335
336                ConceptMap conceptMapToCanonical(IBaseResource theConceptMap);
337
338                IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap);
339
340                SearchParameter searchParameterToCanonical(IBaseResource theSearchParameter);
341
342                IBaseParameters parametersFromCanonical(Parameters theParameters);
343
344                StructureDefinition structureDefinitionToCanonical(IBaseResource theResource);
345
346                IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource);
347
348                IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource);
349
350                org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource);
351
352                org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource);
353
354                org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource);
355
356                IBaseResource searchParameterFromCanonical(SearchParameter theResource);
357
358                IBaseResource auditEventFromCanonical(AuditEvent theResource);
359
360                IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theResource);
361        }
362
363        private static class Dstu2Strategy implements IStrategy {
364
365                private final FhirContext myDstu2Hl7OrgContext = FhirContext.forDstu2Hl7OrgCached();
366
367                private final FhirContext myDstu2Context = FhirContext.forDstu2Cached();
368                private final boolean myHl7OrgStructures;
369
370                public Dstu2Strategy(boolean theHl7OrgStructures) {
371                        myHl7OrgStructures = theHl7OrgStructures;
372                }
373
374                @Override
375                public CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement) {
376                        org.hl7.fhir.dstu2.model.Resource reencoded = reencodeToHl7Org(theCapabilityStatement);
377                        return (CapabilityStatement) VersionConvertorFactory_10_50.convertResource(reencoded, ADVISOR_10_50);
378                }
379
380                @Override
381                public Coding codingToCanonical(IBaseCoding theCoding) {
382                        CodingDt coding = (CodingDt) theCoding;
383                        Coding retVal = new Coding();
384                        retVal.setCode(coding.getCode());
385                        retVal.setSystem(coding.getSystem());
386                        retVal.setDisplay(coding.getDisplay());
387                        retVal.setVersion(coding.getVersion());
388                        if (!coding.getUserSelectedElement().isEmpty()) {
389                                retVal.setUserSelected(coding.getUserSelected());
390                        }
391
392                        return retVal;
393                }
394
395                @Override
396                public CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept) {
397                        CodeableConceptDt codeableConcept = (CodeableConceptDt) theCodeableConcept;
398
399                        CodeableConcept retVal = new CodeableConcept();
400                        retVal.setText(codeableConcept.getText());
401                        for (CodingDt next : codeableConcept.getCoding()) {
402                                retVal.addCoding(codingToCanonical(next));
403                        }
404
405                        return retVal;
406                }
407
408                @Override
409                public ValueSet valueSetToCanonical(IBaseResource theValueSet) {
410                        org.hl7.fhir.dstu2.model.Resource reencoded = reencodeToHl7Org(theValueSet);
411                        return (ValueSet) VersionConvertorFactory_10_40.convertResource(reencoded, ADVISOR_10_40);
412                }
413
414                @Override
415                public CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem) {
416                        CodeSystem retVal = new CodeSystem();
417
418                        ca.uhn.fhir.model.dstu2.resource.ValueSet input = (ca.uhn.fhir.model.dstu2.resource.ValueSet) theCodeSystem;
419                        retVal.setUrl(input.getUrl());
420
421                        for (ca.uhn.fhir.model.dstu2.resource.ValueSet.CodeSystemConcept next :
422                                        input.getCodeSystem().getConcept()) {
423                                translateAndAddConcept(next, retVal.getConcept());
424                        }
425
426                        return retVal;
427                }
428
429                private void translateAndAddConcept(
430                                ca.uhn.fhir.model.dstu2.resource.ValueSet.CodeSystemConcept theSource,
431                                List<CodeSystem.ConceptDefinitionComponent> theTarget) {
432                        CodeSystem.ConceptDefinitionComponent targetConcept = new CodeSystem.ConceptDefinitionComponent();
433                        targetConcept.setCode(theSource.getCode());
434                        targetConcept.setDisplay(theSource.getDisplay());
435
436                        for (ca.uhn.fhir.model.dstu2.resource.ValueSet.CodeSystemConceptDesignation next :
437                                        theSource.getDesignation()) {
438                                CodeSystem.ConceptDefinitionDesignationComponent targetDesignation = targetConcept.addDesignation();
439                                targetDesignation.setLanguage(next.getLanguage());
440                                targetDesignation.setValue(next.getValue());
441                                if (next.getUse() != null) {
442                                        targetDesignation.setUse(codingToCanonical(next.getUse()));
443                                }
444                        }
445
446                        for (ca.uhn.fhir.model.dstu2.resource.ValueSet.CodeSystemConcept nextChild : theSource.getConcept()) {
447                                translateAndAddConcept(nextChild, targetConcept.getConcept());
448                        }
449
450                        theTarget.add(targetConcept);
451                }
452
453                @Override
454                public IBaseResource valueSetFromCanonical(ValueSet theValueSet) {
455                        Resource valueSetDstu2Hl7Org = VersionConvertorFactory_10_40.convertResource(theValueSet, ADVISOR_10_40);
456                        return reencodeFromHl7Org(valueSetDstu2Hl7Org);
457                }
458
459                @Override
460                public IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem) {
461                        Resource codeSystemDstu2Hl7Org =
462                                        VersionConvertorFactory_10_40.convertResource(theCodeSystem, ADVISOR_10_40);
463                        return reencodeFromHl7Org(codeSystemDstu2Hl7Org);
464                }
465
466                @Override
467                public ConceptMap conceptMapToCanonical(IBaseResource theConceptMap) {
468                        org.hl7.fhir.dstu2.model.Resource reencoded = reencodeToHl7Org(theConceptMap);
469                        return (ConceptMap) VersionConvertorFactory_10_40.convertResource(reencoded, ADVISOR_10_40);
470                }
471
472                @Override
473                public IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap) {
474                        Resource codeSystemDstu2Hl7Org =
475                                        VersionConvertorFactory_10_40.convertResource(theConceptMap, ADVISOR_10_40);
476                        return reencodeFromHl7Org(codeSystemDstu2Hl7Org);
477                }
478
479                @Override
480                public SearchParameter searchParameterToCanonical(IBaseResource theSearchParameter) {
481                        org.hl7.fhir.dstu2.model.SearchParameter reencoded =
482                                        (org.hl7.fhir.dstu2.model.SearchParameter) reencodeToHl7Org(theSearchParameter);
483                        SearchParameter retVal =
484                                        (SearchParameter) VersionConvertorFactory_10_50.convertResource(reencoded, ADVISOR_10_50);
485                        if (isBlank(retVal.getExpression())) {
486                                retVal.setExpression(reencoded.getXpath());
487                        }
488                        return retVal;
489                }
490
491                @Override
492                public IBaseParameters parametersFromCanonical(Parameters theParameters) {
493                        Resource converted = VersionConvertorFactory_10_40.convertResource(theParameters, ADVISOR_10_40);
494                        return (IBaseParameters) reencodeFromHl7Org(converted);
495                }
496
497                @Override
498                public StructureDefinition structureDefinitionToCanonical(IBaseResource theResource) {
499                        org.hl7.fhir.dstu2.model.Resource reencoded = reencodeToHl7Org(theResource);
500                        return (StructureDefinition) VersionConvertorFactory_10_50.convertResource(reencoded, ADVISOR_10_50);
501                }
502
503                @Override
504                public IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource) {
505                        Resource converted = VersionConvertorFactory_10_50.convertResource(theResource, ADVISOR_10_50);
506                        return reencodeFromHl7Org(converted);
507                }
508
509                @Override
510                public IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource) {
511                        Resource converted = VersionConvertorFactory_10_50.convertResource(theResource, ADVISOR_10_50);
512                        return reencodeFromHl7Org(converted);
513                }
514
515                @Override
516                public org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource) {
517                        org.hl7.fhir.dstu2.model.Resource reencoded = reencodeToHl7Org(theResource);
518                        return VersionConvertorFactory_10_50.convertResource(reencoded, ADVISOR_10_50);
519                }
520
521                @Override
522                public org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource) {
523                        org.hl7.fhir.dstu2.model.Resource reencoded = reencodeToHl7Org(theResource);
524                        return (org.hl7.fhir.r5.model.ValueSet)
525                                        VersionConvertorFactory_10_50.convertResource(reencoded, ADVISOR_10_50);
526                }
527
528                @Override
529                public org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource) {
530                        org.hl7.fhir.dstu2.model.Resource reencoded = reencodeToHl7Org(theResource);
531                        return (org.hl7.fhir.r5.model.CodeSystem)
532                                        VersionConvertorFactory_10_50.convertResource(reencoded, ADVISOR_10_50);
533                }
534
535                @Override
536                public IBaseResource auditEventFromCanonical(AuditEvent theResource) {
537                        Resource hl7Org = VersionConvertorFactory_10_40.convertResource(theResource, ADVISOR_10_40);
538                        return reencodeFromHl7Org(hl7Org);
539                }
540
541                @Override
542                public IBaseResource searchParameterFromCanonical(SearchParameter theResource) {
543                        Resource resource = VersionConvertorFactory_10_50.convertResource(theResource, ADVISOR_10_50);
544                        return reencodeFromHl7Org(resource);
545                }
546
547                @Override
548                public IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theResource) {
549                        Resource converted = VersionConvertorFactory_10_50.convertResource(theResource, ADVISOR_10_50);
550                        return (IBaseConformance) reencodeFromHl7Org(converted);
551                }
552
553                private Resource reencodeToHl7Org(IBaseResource theInput) {
554                        if (theInput == null) {
555                                return null;
556                        }
557                        if (myHl7OrgStructures) {
558                                return (Resource) theInput;
559                        }
560                        return (Resource) myDstu2Hl7OrgContext.newJsonParser().parseResource(encodeAsString(theInput));
561                }
562
563                private IBaseResource reencodeFromHl7Org(Resource theInput) {
564                        if (theInput == null) {
565                                return null;
566                        }
567                        if (myHl7OrgStructures) {
568                                return theInput;
569                        }
570                        return myDstu2Context.newJsonParser().parseResource(encodeAsString(theInput));
571                }
572
573                private String encodeAsString(IBaseResource theResource) {
574                        FhirVersionEnum version = theResource.getStructureFhirVersionEnum();
575                        if (myDstu2Context.getVersion().getVersion().equals(version)) {
576                                return myDstu2Context.newJsonParser().encodeResourceToString(theResource);
577                        } else if (myDstu2Hl7OrgContext.getVersion().getVersion().equals(version)) {
578                                return myDstu2Hl7OrgContext.newJsonParser().encodeResourceToString(theResource);
579                        } else {
580                                throw new IllegalArgumentException(
581                                                Msg.code(2777) + "Cannot encode resource with version: %s".formatted(version));
582                        }
583                }
584        }
585
586        private static class Dstu21Strategy implements IStrategy {
587
588                @Override
589                public CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement) {
590                        return (CapabilityStatement) VersionConvertorFactory_14_50.convertResource(
591                                        (org.hl7.fhir.dstu2016may.model.Resource) theCapabilityStatement, ADVISOR_14_50);
592                }
593
594                @Override
595                public Coding codingToCanonical(IBaseCoding theCoding) {
596                        return (org.hl7.fhir.r4.model.Coding) VersionConvertorFactory_14_40.convertType(
597                                        (org.hl7.fhir.dstu2016may.model.Coding) theCoding, ADVISOR_14_40);
598                }
599
600                @Override
601                public CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept) {
602                        return (org.hl7.fhir.r4.model.CodeableConcept) VersionConvertorFactory_14_40.convertType(
603                                        (org.hl7.fhir.dstu2016may.model.CodeableConcept) theCodeableConcept, ADVISOR_14_40);
604                }
605
606                @Override
607                public ValueSet valueSetToCanonical(IBaseResource theValueSet) {
608                        return (ValueSet) VersionConvertorFactory_14_40.convertResource(
609                                        (org.hl7.fhir.dstu2016may.model.Resource) theValueSet, ADVISOR_14_40);
610                }
611
612                @Override
613                public CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem) {
614                        return (CodeSystem) VersionConvertorFactory_14_40.convertResource(
615                                        (org.hl7.fhir.dstu2016may.model.Resource) theCodeSystem, ADVISOR_14_40);
616                }
617
618                @Override
619                public IBaseResource valueSetFromCanonical(ValueSet theValueSet) {
620                        return VersionConvertorFactory_14_40.convertResource(theValueSet, ADVISOR_14_40);
621                }
622
623                @Override
624                public IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem) {
625                        return VersionConvertorFactory_14_40.convertResource(theCodeSystem, ADVISOR_14_40);
626                }
627
628                @Override
629                public ConceptMap conceptMapToCanonical(IBaseResource theConceptMap) {
630                        return (ConceptMap) VersionConvertorFactory_14_40.convertResource(
631                                        (org.hl7.fhir.dstu2016may.model.Resource) theConceptMap, ADVISOR_14_40);
632                }
633
634                @Override
635                public IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap) {
636                        return VersionConvertorFactory_14_40.convertResource(theConceptMap, ADVISOR_14_40);
637                }
638
639                @Override
640                public SearchParameter searchParameterToCanonical(IBaseResource theSearchParameter) {
641                        return (SearchParameter) VersionConvertorFactory_14_50.convertResource(
642                                        (org.hl7.fhir.dstu2016may.model.Resource) theSearchParameter, ADVISOR_14_50);
643                }
644
645                @Override
646                public IBaseParameters parametersFromCanonical(Parameters theParameters) {
647                        return (IBaseParameters) VersionConvertorFactory_14_40.convertResource(theParameters, ADVISOR_14_40);
648                }
649
650                @Override
651                public StructureDefinition structureDefinitionToCanonical(IBaseResource theResource) {
652                        return (StructureDefinition) VersionConvertorFactory_14_50.convertResource(
653                                        (org.hl7.fhir.dstu2016may.model.Resource) theResource, ADVISOR_14_50);
654                }
655
656                @Override
657                public IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource) {
658                        return VersionConvertorFactory_14_50.convertResource(theResource, ADVISOR_14_50);
659                }
660
661                @Override
662                public IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource) {
663                        return VersionConvertorFactory_14_50.convertResource(theResource, ADVISOR_14_50);
664                }
665
666                @Override
667                public org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource) {
668                        return VersionConvertorFactory_14_50.convertResource(
669                                        (org.hl7.fhir.dstu2016may.model.Resource) theResource, ADVISOR_14_50);
670                }
671
672                @Override
673                public org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource) {
674                        return (org.hl7.fhir.r5.model.ValueSet) VersionConvertorFactory_14_50.convertResource(
675                                        (org.hl7.fhir.dstu2016may.model.Resource) theResource, ADVISOR_14_50);
676                }
677
678                @Override
679                public org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource) {
680                        return (org.hl7.fhir.r5.model.CodeSystem) VersionConvertorFactory_14_50.convertResource(
681                                        (org.hl7.fhir.dstu2016may.model.Resource) theResource, ADVISOR_14_50);
682                }
683
684                @Override
685                public IBaseResource searchParameterFromCanonical(SearchParameter theResource) {
686                        return VersionConvertorFactory_14_50.convertResource(theResource, ADVISOR_14_50);
687                }
688
689                @Override
690                public IBaseResource auditEventFromCanonical(AuditEvent theResource) {
691                        return VersionConvertorFactory_14_40.convertResource(theResource, ADVISOR_14_40);
692                }
693
694                @Override
695                public IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theResource) {
696                        return (IBaseConformance) VersionConvertorFactory_14_50.convertResource(theResource, ADVISOR_14_50);
697                }
698        }
699
700        private static class Dstu3Strategy implements IStrategy {
701
702                @Override
703                public CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement) {
704                        return (CapabilityStatement) VersionConvertorFactory_30_50.convertResource(
705                                        (org.hl7.fhir.dstu3.model.Resource) theCapabilityStatement, ADVISOR_30_50);
706                }
707
708                @Override
709                public Coding codingToCanonical(IBaseCoding theCoding) {
710                        return (org.hl7.fhir.r4.model.Coding) VersionConvertorFactory_30_40.convertType(
711                                        (org.hl7.fhir.dstu3.model.Coding) theCoding, ADVISOR_30_40);
712                }
713
714                @Override
715                public CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept) {
716                        return (org.hl7.fhir.r4.model.CodeableConcept) VersionConvertorFactory_30_40.convertType(
717                                        (org.hl7.fhir.dstu3.model.CodeableConcept) theCodeableConcept, ADVISOR_30_40);
718                }
719
720                @Override
721                public ValueSet valueSetToCanonical(IBaseResource theValueSet) {
722                        return (ValueSet) VersionConvertorFactory_30_40.convertResource(
723                                        (org.hl7.fhir.dstu3.model.Resource) theValueSet, ADVISOR_30_40);
724                }
725
726                @Override
727                public CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem) {
728                        return (CodeSystem) VersionConvertorFactory_30_40.convertResource(
729                                        (org.hl7.fhir.dstu3.model.Resource) theCodeSystem, ADVISOR_30_40);
730                }
731
732                @Override
733                public IBaseResource valueSetFromCanonical(ValueSet theValueSet) {
734                        return VersionConvertorFactory_30_40.convertResource(theValueSet, ADVISOR_30_40);
735                }
736
737                @Override
738                public IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem) {
739                        return VersionConvertorFactory_30_40.convertResource(theCodeSystem, ADVISOR_30_40);
740                }
741
742                @Override
743                public ConceptMap conceptMapToCanonical(IBaseResource theConceptMap) {
744                        return (ConceptMap) VersionConvertorFactory_30_40.convertResource(
745                                        (org.hl7.fhir.dstu3.model.Resource) theConceptMap, ADVISOR_30_40);
746                }
747
748                @Override
749                public IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap) {
750                        return VersionConvertorFactory_30_40.convertResource(theConceptMap, ADVISOR_30_40);
751                }
752
753                @Override
754                public SearchParameter searchParameterToCanonical(IBaseResource theSearchParameter) {
755                        return (SearchParameter) VersionConvertorFactory_30_50.convertResource(
756                                        (org.hl7.fhir.dstu3.model.Resource) theSearchParameter, ADVISOR_30_50);
757                }
758
759                @Override
760                public IBaseParameters parametersFromCanonical(Parameters theParameters) {
761                        return (IBaseParameters) VersionConvertorFactory_30_40.convertResource(theParameters, ADVISOR_30_40);
762                }
763
764                @Override
765                public StructureDefinition structureDefinitionToCanonical(IBaseResource theResource) {
766                        return (StructureDefinition) VersionConvertorFactory_30_50.convertResource(
767                                        (org.hl7.fhir.dstu3.model.Resource) theResource, ADVISOR_30_50);
768                }
769
770                @Override
771                public IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource) {
772                        return VersionConvertorFactory_30_50.convertResource(theResource, ADVISOR_30_50);
773                }
774
775                @Override
776                public IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource) {
777                        return VersionConvertorFactory_30_50.convertResource(theResource, ADVISOR_30_50);
778                }
779
780                @Override
781                public org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource) {
782                        return VersionConvertorFactory_30_50.convertResource(
783                                        (org.hl7.fhir.dstu3.model.Resource) theResource, ADVISOR_30_50);
784                }
785
786                @Override
787                public org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource) {
788                        return (org.hl7.fhir.r5.model.ValueSet) VersionConvertorFactory_30_50.convertResource(
789                                        (org.hl7.fhir.dstu3.model.Resource) theResource, ADVISOR_30_50);
790                }
791
792                @Override
793                public org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource) {
794                        return (org.hl7.fhir.r5.model.CodeSystem) VersionConvertorFactory_30_50.convertResource(
795                                        (org.hl7.fhir.dstu3.model.Resource) theResource, ADVISOR_30_50);
796                }
797
798                @Override
799                public IBaseResource searchParameterFromCanonical(SearchParameter theResource) {
800                        return VersionConvertorFactory_30_50.convertResource(theResource, ADVISOR_30_50);
801                }
802
803                @Override
804                public IBaseResource auditEventFromCanonical(AuditEvent theResource) {
805                        return VersionConvertorFactory_30_40.convertResource(theResource, ADVISOR_30_40);
806                }
807
808                @Override
809                public IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theResource) {
810                        return (IBaseConformance) VersionConvertorFactory_30_50.convertResource(theResource, ADVISOR_30_50);
811                }
812        }
813
814        private static class R4Strategy implements IStrategy {
815                @Override
816                public CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement) {
817                        return (CapabilityStatement) VersionConvertorFactory_40_50.convertResource(
818                                        (org.hl7.fhir.r4.model.Resource) theCapabilityStatement, ADVISOR_40_50);
819                }
820
821                @Override
822                public Coding codingToCanonical(IBaseCoding theCoding) {
823                        return (Coding) theCoding;
824                }
825
826                @Override
827                public CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept) {
828                        return (CodeableConcept) theCodeableConcept;
829                }
830
831                @Override
832                public ValueSet valueSetToCanonical(IBaseResource theValueSet) {
833                        return (ValueSet) theValueSet;
834                }
835
836                @Override
837                public CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem) {
838                        return (CodeSystem) theCodeSystem;
839                }
840
841                @Override
842                public IBaseResource valueSetFromCanonical(ValueSet theValueSet) {
843                        return theValueSet;
844                }
845
846                @Override
847                public IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem) {
848                        return theCodeSystem;
849                }
850
851                @Override
852                public ConceptMap conceptMapToCanonical(IBaseResource theConceptMap) {
853                        return (ConceptMap) theConceptMap;
854                }
855
856                @Override
857                public IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap) {
858                        return theConceptMap;
859                }
860
861                @Override
862                public SearchParameter searchParameterToCanonical(IBaseResource theSearchParameter) {
863                        return (SearchParameter) VersionConvertorFactory_40_50.convertResource(
864                                        (org.hl7.fhir.r4.model.Resource) theSearchParameter, ADVISOR_40_50);
865                }
866
867                @Override
868                public IBaseParameters parametersFromCanonical(Parameters theParameters) {
869                        return theParameters;
870                }
871
872                @Override
873                public StructureDefinition structureDefinitionToCanonical(IBaseResource theResource) {
874                        return (StructureDefinition) VersionConvertorFactory_40_50.convertResource(
875                                        (org.hl7.fhir.r4.model.Resource) theResource, ADVISOR_40_50);
876                }
877
878                @Override
879                public IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource) {
880                        return VersionConvertorFactory_40_50.convertResource(theResource, ADVISOR_40_50);
881                }
882
883                @Override
884                public IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource) {
885                        return VersionConvertorFactory_40_50.convertResource(theResource, ADVISOR_40_50);
886                }
887
888                @Override
889                public org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource) {
890                        return VersionConvertorFactory_40_50.convertResource(
891                                        (org.hl7.fhir.r4.model.Resource) theResource, ADVISOR_40_50);
892                }
893
894                @Override
895                public org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource) {
896                        return (org.hl7.fhir.r5.model.ValueSet) VersionConvertorFactory_40_50.convertResource(
897                                        (org.hl7.fhir.r4.model.Resource) theResource, ADVISOR_40_50);
898                }
899
900                @Override
901                public org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource) {
902                        return (org.hl7.fhir.r5.model.CodeSystem) VersionConvertorFactory_40_50.convertResource(
903                                        (org.hl7.fhir.r4.model.Resource) theResource, ADVISOR_40_50);
904                }
905
906                @Override
907                public IBaseResource searchParameterFromCanonical(SearchParameter theResource) {
908                        return VersionConvertorFactory_40_50.convertResource(theResource, ADVISOR_40_50);
909                }
910
911                @Override
912                public IBaseResource auditEventFromCanonical(AuditEvent theResource) {
913                        return theResource;
914                }
915
916                @Override
917                public IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theResource) {
918                        return (IBaseConformance) VersionConvertorFactory_40_50.convertResource(theResource, ADVISOR_40_50);
919                }
920        }
921
922        private static class R4BStrategy implements IStrategy {
923
924                @Override
925                public CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement) {
926                        return (CapabilityStatement) VersionConvertorFactory_43_50.convertResource(
927                                        (org.hl7.fhir.r4b.model.Resource) theCapabilityStatement, ADVISOR_43_50);
928                }
929
930                @Override
931                public Coding codingToCanonical(IBaseCoding theCoding) {
932                        org.hl7.fhir.r5.model.Coding r5coding = (org.hl7.fhir.r5.model.Coding)
933                                        VersionConvertorFactory_43_50.convertType((org.hl7.fhir.r4b.model.Coding) theCoding, ADVISOR_43_50);
934                        return (org.hl7.fhir.r4.model.Coding) VersionConvertorFactory_40_50.convertType(r5coding, ADVISOR_40_50);
935                }
936
937                @Override
938                public CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept) {
939                        org.hl7.fhir.r5.model.CodeableConcept r5coding =
940                                        (org.hl7.fhir.r5.model.CodeableConcept) VersionConvertorFactory_43_50.convertType(
941                                                        (org.hl7.fhir.r4b.model.CodeableConcept) theCodeableConcept, ADVISOR_43_50);
942                        return (org.hl7.fhir.r4.model.CodeableConcept)
943                                        VersionConvertorFactory_40_50.convertType(r5coding, ADVISOR_40_50);
944                }
945
946                @Override
947                public ValueSet valueSetToCanonical(IBaseResource theValueSet) {
948                        org.hl7.fhir.r5.model.ValueSet valueSetR5 =
949                                        (org.hl7.fhir.r5.model.ValueSet) VersionConvertorFactory_43_50.convertResource(
950                                                        (org.hl7.fhir.r4b.model.Resource) theValueSet, ADVISOR_43_50);
951                        return (org.hl7.fhir.r4.model.ValueSet)
952                                        VersionConvertorFactory_40_50.convertResource(valueSetR5, ADVISOR_40_50);
953                }
954
955                @Override
956                public CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem) {
957                        org.hl7.fhir.r5.model.CodeSystem codeSystemR5 =
958                                        (org.hl7.fhir.r5.model.CodeSystem) VersionConvertorFactory_43_50.convertResource(
959                                                        (org.hl7.fhir.r4b.model.Resource) theCodeSystem, ADVISOR_43_50);
960                        return (org.hl7.fhir.r4.model.CodeSystem)
961                                        VersionConvertorFactory_40_50.convertResource(codeSystemR5, ADVISOR_40_50);
962                }
963
964                @Override
965                public IBaseResource valueSetFromCanonical(ValueSet theValueSet) {
966                        org.hl7.fhir.r5.model.ValueSet valueSetR5 = (org.hl7.fhir.r5.model.ValueSet)
967                                        VersionConvertorFactory_40_50.convertResource(theValueSet, ADVISOR_40_50);
968                        return VersionConvertorFactory_43_50.convertResource(valueSetR5, ADVISOR_43_50);
969                }
970
971                @Override
972                public IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem) {
973                        org.hl7.fhir.r5.model.CodeSystem codeSystemR5 = (org.hl7.fhir.r5.model.CodeSystem)
974                                        VersionConvertorFactory_40_50.convertResource(theCodeSystem, ADVISOR_40_50);
975                        return VersionConvertorFactory_43_50.convertResource(codeSystemR5, ADVISOR_43_50);
976                }
977
978                @Override
979                public ConceptMap conceptMapToCanonical(IBaseResource theConceptMap) {
980                        org.hl7.fhir.r5.model.ConceptMap conceptMapR5 =
981                                        (org.hl7.fhir.r5.model.ConceptMap) VersionConvertorFactory_43_50.convertResource(
982                                                        (org.hl7.fhir.r4b.model.Resource) theConceptMap, ADVISOR_43_50);
983                        return (ConceptMap) VersionConvertorFactory_40_50.convertResource(conceptMapR5, ADVISOR_40_50);
984                }
985
986                @Override
987                public IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap) {
988                        org.hl7.fhir.r5.model.ConceptMap conceptMapR5 = (org.hl7.fhir.r5.model.ConceptMap)
989                                        VersionConvertorFactory_40_50.convertResource(theConceptMap, ADVISOR_40_50);
990                        return VersionConvertorFactory_43_50.convertResource(conceptMapR5, ADVISOR_43_50);
991                }
992
993                @Override
994                public SearchParameter searchParameterToCanonical(IBaseResource theSearchParameter) {
995                        return (SearchParameter) VersionConvertorFactory_43_50.convertResource(
996                                        (org.hl7.fhir.r4b.model.Resource) theSearchParameter, ADVISOR_43_50);
997                }
998
999                @Override
1000                public IBaseParameters parametersFromCanonical(Parameters theParameters) {
1001                        org.hl7.fhir.r5.model.Parameters parametersR5 = (org.hl7.fhir.r5.model.Parameters)
1002                                        VersionConvertorFactory_40_50.convertResource(theParameters, ADVISOR_40_50);
1003                        return (IBaseParameters) VersionConvertorFactory_43_50.convertResource(parametersR5, ADVISOR_43_50);
1004                }
1005
1006                @Override
1007                public StructureDefinition structureDefinitionToCanonical(IBaseResource theResource) {
1008                        return (StructureDefinition) VersionConvertorFactory_43_50.convertResource(
1009                                        (org.hl7.fhir.r4b.model.Resource) theResource, ADVISOR_43_50);
1010                }
1011
1012                @Override
1013                public IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource) {
1014                        return VersionConvertorFactory_43_50.convertResource(theResource, ADVISOR_43_50);
1015                }
1016
1017                @Override
1018                public IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource) {
1019                        return VersionConvertorFactory_43_50.convertResource(theResource, ADVISOR_43_50);
1020                }
1021
1022                @Override
1023                public org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource) {
1024                        return VersionConvertorFactory_43_50.convertResource(
1025                                        (org.hl7.fhir.r4b.model.Resource) theResource, ADVISOR_43_50);
1026                }
1027
1028                @Override
1029                public org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource) {
1030                        return (org.hl7.fhir.r5.model.ValueSet) VersionConvertorFactory_43_50.convertResource(
1031                                        (org.hl7.fhir.r4b.model.Resource) theResource, ADVISOR_43_50);
1032                }
1033
1034                @Override
1035                public org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource) {
1036                        return (org.hl7.fhir.r5.model.CodeSystem) VersionConvertorFactory_43_50.convertResource(
1037                                        (org.hl7.fhir.r4b.model.Resource) theResource, ADVISOR_43_50);
1038                }
1039
1040                @Override
1041                public IBaseResource searchParameterFromCanonical(SearchParameter theResource) {
1042                        return VersionConvertorFactory_43_50.convertResource(theResource, ADVISOR_43_50);
1043                }
1044
1045                @Override
1046                public IBaseResource auditEventFromCanonical(AuditEvent theResource) {
1047                        org.hl7.fhir.r5.model.AuditEvent r5 = (org.hl7.fhir.r5.model.AuditEvent)
1048                                        VersionConvertorFactory_40_50.convertResource(theResource, ADVISOR_40_50);
1049                        return VersionConvertorFactory_43_50.convertResource(r5, ADVISOR_43_50);
1050                }
1051
1052                @Override
1053                public IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theResource) {
1054                        return (IBaseConformance) VersionConvertorFactory_43_50.convertResource(theResource, ADVISOR_43_50);
1055                }
1056        }
1057
1058        private static class R5Strategy implements IStrategy {
1059
1060                @Override
1061                public CapabilityStatement capabilityStatementToCanonical(IBaseResource theCapabilityStatement) {
1062                        return (CapabilityStatement) theCapabilityStatement;
1063                }
1064
1065                @Override
1066                public Coding codingToCanonical(IBaseCoding theCoding) {
1067                        return (org.hl7.fhir.r4.model.Coding)
1068                                        VersionConvertorFactory_40_50.convertType((org.hl7.fhir.r5.model.Coding) theCoding, ADVISOR_40_50);
1069                }
1070
1071                @Override
1072                public CodeableConcept codeableConceptToCanonical(IBaseDatatype theCodeableConcept) {
1073                        return (org.hl7.fhir.r4.model.CodeableConcept) VersionConvertorFactory_40_50.convertType(
1074                                        (org.hl7.fhir.r5.model.CodeableConcept) theCodeableConcept, ADVISOR_40_50);
1075                }
1076
1077                @Override
1078                public ValueSet valueSetToCanonical(IBaseResource theValueSet) {
1079                        return (ValueSet) VersionConvertorFactory_40_50.convertResource(
1080                                        (org.hl7.fhir.r5.model.ValueSet) theValueSet, ADVISOR_40_50);
1081                }
1082
1083                @Override
1084                public CodeSystem codeSystemToCanonical(IBaseResource theCodeSystem) {
1085                        return (CodeSystem) VersionConvertorFactory_40_50.convertResource(
1086                                        (org.hl7.fhir.r5.model.CodeSystem) theCodeSystem, ADVISOR_40_50);
1087                }
1088
1089                @Override
1090                public IBaseResource valueSetFromCanonical(ValueSet theValueSet) {
1091                        return VersionConvertorFactory_40_50.convertResource(theValueSet, ADVISOR_40_50);
1092                }
1093
1094                @Override
1095                public IBaseResource codeSystemFromCanonical(CodeSystem theCodeSystem) {
1096                        return VersionConvertorFactory_40_50.convertResource(theCodeSystem, ADVISOR_40_50);
1097                }
1098
1099                @Override
1100                public ConceptMap conceptMapToCanonical(IBaseResource theConceptMap) {
1101                        return (ConceptMap) VersionConvertorFactory_40_50.convertResource(
1102                                        (org.hl7.fhir.r5.model.ConceptMap) theConceptMap, ADVISOR_40_50);
1103                }
1104
1105                @Override
1106                public IBaseResource conceptMapFromCanonical(ConceptMap theConceptMap) {
1107                        return VersionConvertorFactory_40_50.convertResource(theConceptMap, ADVISOR_40_50);
1108                }
1109
1110                @Override
1111                public SearchParameter searchParameterToCanonical(IBaseResource theSearchParameter) {
1112                        return (SearchParameter) theSearchParameter;
1113                }
1114
1115                @Override
1116                public IBaseParameters parametersFromCanonical(Parameters theParameters) {
1117                        return (IBaseParameters) VersionConvertorFactory_40_50.convertResource(theParameters, ADVISOR_40_50);
1118                }
1119
1120                @Override
1121                public StructureDefinition structureDefinitionToCanonical(IBaseResource theResource) {
1122                        return (StructureDefinition) theResource;
1123                }
1124
1125                @Override
1126                public IBaseResource structureDefinitionFromCanonical(StructureDefinition theResource) {
1127                        return theResource;
1128                }
1129
1130                @Override
1131                public IBaseResource valueSetFromValidatorCanonical(org.hl7.fhir.r5.model.ValueSet theResource) {
1132                        return theResource;
1133                }
1134
1135                @Override
1136                public org.hl7.fhir.r5.model.Resource resourceToValidatorCanonical(IBaseResource theResource) {
1137                        return (org.hl7.fhir.r5.model.Resource) theResource;
1138                }
1139
1140                @Override
1141                public org.hl7.fhir.r5.model.ValueSet valueSetToValidatorCanonical(IBaseResource theResource) {
1142                        return (org.hl7.fhir.r5.model.ValueSet) theResource;
1143                }
1144
1145                @Override
1146                public org.hl7.fhir.r5.model.CodeSystem codeSystemToValidatorCanonical(IBaseResource theResource) {
1147                        return (org.hl7.fhir.r5.model.CodeSystem) theResource;
1148                }
1149
1150                @Override
1151                public IBaseResource searchParameterFromCanonical(SearchParameter theResource) {
1152                        return theResource;
1153                }
1154
1155                @Override
1156                public IBaseResource auditEventFromCanonical(AuditEvent theResource) {
1157                        return VersionConvertorFactory_40_50.convertResource(theResource, ADVISOR_40_50);
1158                }
1159
1160                @Override
1161                public IBaseConformance capabilityStatementFromCanonical(CapabilityStatement theResource) {
1162                        return theResource;
1163                }
1164        }
1165}