2222import org .hl7 .fhir .r5 .model .Library ;
2323import org .hl7 .fhir .r5 .model .Measure ;
2424import org .hl7 .fhir .r5 .model .MetadataResource ;
25+ import org .hl7 .fhir .r5 .model .Parameters ;
2526import org .hl7 .fhir .r5 .model .Period ;
2627import org .hl7 .fhir .r5 .model .Reference ;
2728import org .hl7 .fhir .r5 .model .RelatedArtifact .RelatedArtifactType ;
2829import org .hl7 .fhir .r5 .model .ResourceType ;
2930import org .hl7 .fhir .r5 .model .StringType ;
31+ import org .hl7 .fhir .r5 .model .UriType ;
3032import org .hl7 .fhir .r5 .model .ValueSet ;
3133import org .opencds .cqf .fhir .cr .visitor .r5 .CRMIReleaseExperimentalBehavior .CRMIReleaseExperimentalBehaviorCodes ;
3234import org .opencds .cqf .fhir .cr .visitor .r5 .CRMIReleaseVersionBehavior .CRMIReleaseVersionBehaviorCodes ;
3335import org .opencds .cqf .fhir .utility .Constants ;
3436import org .opencds .cqf .fhir .utility .PackageHelper ;
3537import org .opencds .cqf .fhir .utility .SearchHelper ;
38+ import org .opencds .cqf .fhir .utility .adapter .IEndpointAdapter ;
3639import org .opencds .cqf .fhir .utility .adapter .IKnowledgeArtifactAdapter ;
3740import org .slf4j .Logger ;
3841
@@ -150,7 +153,8 @@ public static List<BundleEntryComponent> findArtifactCommentsToUpdate(
150153 return returnEntries ;
151154 }
152155
153- public static void extractDirectReferenceCodes (IKnowledgeArtifactAdapter rootAdapter , Measure measure ) {
156+ public static void extractDirectReferenceCodes (
157+ IKnowledgeArtifactAdapter rootAdapter , Measure measure , IEndpointAdapter endpointAdapter ) {
154158 Optional <Extension > effectiveDataRequirementsExt = measure .getExtension ().stream ()
155159 .filter (ext -> ext .getUrl ().equals (Constants .CQFM_EFFECTIVE_DATA_REQUIREMENTS )
156160 || ext .getUrl ().equals (Constants .CRMI_EFFECTIVE_DATA_REQUIREMENTS ))
@@ -173,9 +177,34 @@ public static void extractDirectReferenceCodes(IKnowledgeArtifactAdapter rootAda
173177 || ext .getUrl ().equals (Constants .CQF_DIRECT_REFERENCE_EXTENSION ))
174178 .toList ();
175179
180+ var expansionParams = rootAdapter .getExpansionParameters ().map (p -> ((Parameters ) p ));
181+ List <UriType > systemVersions = new ArrayList <>();
182+ if (expansionParams .isPresent ()) {
183+ systemVersions = expansionParams .get ().getParameter ().stream ()
184+ .filter (param -> param .getName ().equals (Constants .SYSTEM_VERSION ))
185+ .map (sysVerParam -> (UriType ) sysVerParam .getValue ())
186+ .toList ();
187+ }
188+
176189 for (var proposedExt : proposedExtensions ) {
177190 boolean shouldAddExtension = true ;
178191 Coding proposedCoding = (Coding ) proposedExt .getValue ();
192+
193+ if (proposedCoding .getVersion () == null && !systemVersions .isEmpty ()) {
194+ for (var sysVer : systemVersions ) {
195+ var idParts = ((UriType ) sysVer ).getValue ().split ("\\ |" );
196+ if (idParts [0 ].equals (proposedCoding .getSystem ())) {
197+ proposedCoding .setVersion (idParts [1 ]);
198+ break ;
199+ }
200+ }
201+ }
202+
203+ // version can still be null after trying to set via expansionParams
204+ if (proposedCoding .getVersion () == null && endpointAdapter != null ) {
205+ // use TxServer to set version
206+ }
207+
179208 for (var existingExt : existingRootAdapterExtensions ) {
180209 Coding existingCoding = (Coding ) existingExt .getValue ();
181210 boolean systemMatches = proposedCoding .getSystem ().equals (existingCoding .getSystem ());
0 commit comments