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