Skip to content

Commit 401077f

Browse files
authored
Preserve existing releaseLabel when not provided in Release operation (#1007)
* Fixed issue with $release stomping existing releaseLabel
1 parent eab49fe commit 401077f

4 files changed

Lines changed: 137 additions & 3 deletions

File tree

cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/visitor/ReleaseVisitor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ public IBase visit(IKnowledgeArtifactAdapter rootAdapter, IBaseParameters operat
103103
}
104104
final var version = VisitorHelper.getStringParameter("version", operationParameters)
105105
.orElseThrow(() -> new UnprocessableEntityException("Version must be present"));
106-
final var releaseLabel = VisitorHelper.getStringParameter("releaseLabel", operationParameters)
107-
.orElse("");
106+
final var releaseLabel = VisitorHelper.getStringParameter("releaseLabel", operationParameters);
108107
final var versionBehavior = VisitorHelper.getStringParameter("versionBehavior", operationParameters);
109108
final var requireNonExperimental = VisitorHelper.getStringParameter(
110109
"requireNonExperimental", operationParameters)
@@ -118,7 +117,7 @@ public IBase visit(IKnowledgeArtifactAdapter rootAdapter, IBaseParameters operat
118117
});
119118
checkReleaseVersion(version, versionBehavior);
120119
checkReleasePreconditions(rootAdapter, rootAdapter.getApprovalDate());
121-
updateReleaseLabel(rootLibrary, releaseLabel);
120+
releaseLabel.ifPresent(label -> updateReleaseLabel(rootLibrary, label));
122121
// Determine which version should be used.
123122
final var existingVersion =
124123
rootAdapter.hasVersion() ? rootAdapter.getVersion().replace("-draft", "") : null;

cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/visitor/dstu3/ReleaseVisitorTests.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,51 @@ void release_releaseLabel_test() {
664664
assertEquals(((StringType) maybeReleaseLabel.get().getValue()).getValue(), releaseLabel);
665665
}
666666

667+
@Test
668+
void release_releaseLabel_not_provided_should_preserve_existing() {
669+
Bundle bundle = (Bundle) jsonParser.parseResource(
670+
ReleaseVisitorTests.class.getResourceAsStream("Bundle-small-approved-draft.json"));
671+
repo.transaction(bundle);
672+
673+
ReleaseVisitor releaseVisitor = new ReleaseVisitor(repo);
674+
675+
// Load and PRE-SET an existing releaseLabel on the resource
676+
Library library = repo.read(Library.class, new IdType("Library/SpecificationLibrary"))
677+
.copy();
678+
String existingLabel = "existing-release-label";
679+
680+
Extension existingExtension = new Extension();
681+
existingExtension.setUrl(IKnowledgeArtifactAdapter.RELEASE_LABEL_URL);
682+
existingExtension.setValue(new StringType(existingLabel));
683+
library.addExtension(existingExtension);
684+
685+
ILibraryAdapter libraryAdapter = new AdapterFactory().createLibrary(library);
686+
687+
// IMPORTANT: Do NOT include releaseLabel parameter
688+
Parameters params = parameters(part("version", "1.2.3"), part("versionBehavior", new CodeType("default")));
689+
690+
Bundle returnResource = (Bundle) libraryAdapter.accept(releaseVisitor, params);
691+
692+
Optional<BundleEntryComponent> maybeLib = returnResource.getEntry().stream()
693+
.filter(entry -> entry.getResponse().getLocation().contains("Library/SpecificationLibrary"))
694+
.findFirst();
695+
696+
assertTrue(maybeLib.isPresent());
697+
698+
Library releasedLibrary =
699+
repo.read(Library.class, new IdType(maybeLib.get().getResponse().getLocation()));
700+
701+
Optional<Extension> maybeReleaseLabel = releasedLibrary.getExtension().stream()
702+
.filter(ext -> ext.getUrl().equals(IKnowledgeArtifactAdapter.RELEASE_LABEL_URL))
703+
.findFirst();
704+
705+
// ASSERT: it is still there
706+
assertTrue(maybeReleaseLabel.isPresent());
707+
708+
// ASSERT: value unchanged
709+
assertEquals(existingLabel, ((StringType) maybeReleaseLabel.get().getValue()).getValue());
710+
}
711+
667712
@Test
668713
void release_version_active_test() {
669714
Bundle bundle = (Bundle) jsonParser.parseResource(

cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/visitor/r4/ReleaseVisitorTests.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,51 @@ void release_releaseLabel_test() {
687687
assertEquals(releaseLabel, ((StringType) maybeReleaseLabel.get().getValue()).getValue());
688688
}
689689

690+
@Test
691+
void release_releaseLabel_not_provided_should_preserve_existing() {
692+
Bundle bundle = (Bundle) jsonParser.parseResource(
693+
ReleaseVisitorTests.class.getResourceAsStream("Bundle-small-approved-draft.json"));
694+
repo.transaction(bundle);
695+
696+
ReleaseVisitor releaseVisitor = new ReleaseVisitor(repo);
697+
698+
// Load and PRE-SET an existing releaseLabel on the resource
699+
Library library = repo.read(Library.class, new IdType("Library/SpecificationLibrary"))
700+
.copy();
701+
String existingLabel = "existing-release-label";
702+
703+
Extension existingExtension = new Extension();
704+
existingExtension.setUrl(IKnowledgeArtifactAdapter.RELEASE_LABEL_URL);
705+
existingExtension.setValue(new StringType(existingLabel));
706+
library.addExtension(existingExtension);
707+
708+
ILibraryAdapter libraryAdapter = new AdapterFactory().createLibrary(library);
709+
710+
// IMPORTANT: Do NOT include releaseLabel parameter
711+
Parameters params = parameters(part("version", "1.2.3"), part("versionBehavior", new CodeType("default")));
712+
713+
Bundle returnResource = (Bundle) libraryAdapter.accept(releaseVisitor, params);
714+
715+
Optional<BundleEntryComponent> maybeLib = returnResource.getEntry().stream()
716+
.filter(entry -> entry.getResponse().getLocation().contains("Library/SpecificationLibrary"))
717+
.findFirst();
718+
719+
assertTrue(maybeLib.isPresent());
720+
721+
Library releasedLibrary =
722+
repo.read(Library.class, new IdType(maybeLib.get().getResponse().getLocation()));
723+
724+
Optional<Extension> maybeReleaseLabel = releasedLibrary.getExtension().stream()
725+
.filter(ext -> ext.getUrl().equals(IKnowledgeArtifactAdapter.RELEASE_LABEL_URL))
726+
.findFirst();
727+
728+
// ASSERT: it is still there
729+
assertTrue(maybeReleaseLabel.isPresent());
730+
731+
// ASSERT: value unchanged
732+
assertEquals(existingLabel, ((StringType) maybeReleaseLabel.get().getValue()).getValue());
733+
}
734+
690735
@Test
691736
void release_version_active_test() {
692737
Bundle bundle = (Bundle) jsonParser.parseResource(

cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/visitor/r5/ReleaseVisitorTests.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,51 @@ void release_releaseLabel_test() {
669669
assertEquals(((StringType) maybeReleaseLabel.get().getValue()).getValue(), releaseLabel);
670670
}
671671

672+
@Test
673+
void release_releaseLabel_not_provided_should_preserve_existing() {
674+
Bundle bundle = (Bundle) jsonParser.parseResource(
675+
ReleaseVisitorTests.class.getResourceAsStream("Bundle-small-approved-draft.json"));
676+
repo.transaction(bundle);
677+
678+
ReleaseVisitor releaseVisitor = new ReleaseVisitor(repo);
679+
680+
// Load and PRE-SET an existing releaseLabel on the resource
681+
Library library = repo.read(Library.class, new IdType("Library/SpecificationLibrary"))
682+
.copy();
683+
String existingLabel = "existing-release-label";
684+
685+
Extension existingExtension = new Extension();
686+
existingExtension.setUrl(IKnowledgeArtifactAdapter.RELEASE_LABEL_URL);
687+
existingExtension.setValue(new StringType(existingLabel));
688+
library.addExtension(existingExtension);
689+
690+
ILibraryAdapter libraryAdapter = new AdapterFactory().createLibrary(library);
691+
692+
// IMPORTANT: Do NOT include releaseLabel parameter
693+
Parameters params = parameters(part("version", "1.2.3"), part("versionBehavior", new CodeType("default")));
694+
695+
Bundle returnResource = (Bundle) libraryAdapter.accept(releaseVisitor, params);
696+
697+
Optional<BundleEntryComponent> maybeLib = returnResource.getEntry().stream()
698+
.filter(entry -> entry.getResponse().getLocation().contains("Library/SpecificationLibrary"))
699+
.findFirst();
700+
701+
assertTrue(maybeLib.isPresent());
702+
703+
Library releasedLibrary =
704+
repo.read(Library.class, new IdType(maybeLib.get().getResponse().getLocation()));
705+
706+
Optional<Extension> maybeReleaseLabel = releasedLibrary.getExtension().stream()
707+
.filter(ext -> ext.getUrl().equals(IKnowledgeArtifactAdapter.RELEASE_LABEL_URL))
708+
.findFirst();
709+
710+
// ASSERT: it is still there
711+
assertTrue(maybeReleaseLabel.isPresent());
712+
713+
// ASSERT: value unchanged
714+
assertEquals(existingLabel, ((StringType) maybeReleaseLabel.get().getValue()).getValue());
715+
}
716+
672717
@Test
673718
void release_version_active_test() {
674719
Bundle bundle = (Bundle) jsonParser.parseResource(

0 commit comments

Comments
 (0)