Skip to content

Commit 4c16ea4

Browse files
authored
Merge pull request #56 from MeasureAuthoringTool/MAT-10054
MAT-10054 composite measure export
2 parents eff3b84 + 4e94159 commit 4c16ea4

4 files changed

Lines changed: 111 additions & 4 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<modelVersion>4.0.0</modelVersion>
77
<groupId>gov.cms.madie.packaging</groupId>
88
<artifactId>packaging-utility</artifactId>
9-
<version>0.2.14-SNAPSHOT</version>
9+
<version>0.2.15-SNAPSHOT</version>
1010

1111
<name>packaging-utility</name>
1212
<description>A simple packaging-utility.</description>

src/main/java/gov/cms/madie/packaging/utils/PackagingUtility.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package gov.cms.madie.packaging.utils;
22

3+
import gov.cms.madie.models.measure.Export;
34
import gov.cms.madie.packaging.exceptions.InternalServerException;
45
import org.hl7.fhir.r4.model.Bundle;
56

7+
import java.util.List;
8+
69
public interface PackagingUtility {
710

811
byte[] getZipBundle(Object export, String exportFileName) throws InternalServerException;
912

13+
byte[] buildCompositeExport(
14+
String compositeBundle, List<Export> componentBundles, String exportFileName);
15+
1016
String getHumanReadableWithCSS(Bundle measureBundle);
1117

1218
String getHumanReadableWithCSS(String measureBundleJson);

src/main/java/gov/cms/madie/packaging/utils/qicore411/PackagingUtilityImpl.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import java.io.ByteArrayOutputStream;
44
import java.util.ArrayList;
55
import java.util.HashMap;
6+
import java.util.HashSet;
67
import java.util.List;
78
import java.util.Map;
9+
import java.util.Set;
810
import java.util.stream.Collectors;
911

1012
import org.apache.commons.lang3.StringUtils;
@@ -20,6 +22,7 @@
2022
import gov.cms.madie.packaging.utils.ZipUtility;
2123
import gov.cms.madie.packaging.utils.qicore.ResourceUtils;
2224
import lombok.extern.slf4j.Slf4j;
25+
import org.springframework.util.CollectionUtils;
2326

2427
@Slf4j
2528
public class PackagingUtilityImpl implements PackagingUtility {
@@ -54,6 +57,48 @@ public byte[] getZipBundle(Object o, String exportFileName) throws InternalServe
5457
"Calling gicore411.PackagingUtilityImpl with invalid object");
5558
}
5659

60+
@Override
61+
public byte[] buildCompositeExport(
62+
String compositeBundle, List<Export> componentExports, String exportFileName) {
63+
Bundle bundle =
64+
buildCompositeBundle(
65+
compositeBundle,
66+
componentExports.stream()
67+
.map(Export::getMeasureBundleJson)
68+
.collect(Collectors.toList()));
69+
if (bundle == null) {
70+
return null;
71+
}
72+
return getZipBundle(bundle, exportFileName, null);
73+
}
74+
75+
private Bundle buildCompositeBundle(String compositeBundle, List<String> componentBundles) {
76+
if (StringUtils.isBlank(compositeBundle)) {
77+
return null;
78+
}
79+
80+
IParser jsonParser = context.newJsonParser();
81+
Bundle bundle = (Bundle) jsonParser.parseResource(compositeBundle);
82+
if (CollectionUtils.isEmpty(componentBundles)) {
83+
return bundle;
84+
}
85+
Set<String> existingNameVersions =
86+
bundle.getEntry().stream()
87+
.map(this::getNameVersionKey)
88+
.filter(java.util.Objects::nonNull)
89+
.collect(Collectors.toCollection(HashSet::new));
90+
for (String componentBundle : componentBundles) {
91+
Bundle component = (Bundle) jsonParser.parseResource(componentBundle);
92+
for (Bundle.BundleEntryComponent entry : component.getEntry()) {
93+
String key = getNameVersionKey(entry);
94+
if (key == null || existingNameVersions.add(key)) {
95+
bundle.addEntry(entry);
96+
}
97+
}
98+
}
99+
return bundle;
100+
}
101+
57102
private byte[] getZipBundle(Bundle bundle, String exportFileName, String humanReadable)
58103
throws InternalServerException {
59104

@@ -241,4 +286,16 @@ private List<Measure> getMeasureResource(Bundle measureBundle) {
241286
.map(entry -> (Measure) entry.getResource())
242287
.toList();
243288
}
289+
290+
private String getNameVersionKey(Bundle.BundleEntryComponent entry) {
291+
if (entry.getResource() instanceof MetadataResource metadataResource) {
292+
String type = metadataResource.getResourceType().name();
293+
String name = metadataResource.getName();
294+
String version = metadataResource.getVersion();
295+
if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(version)) {
296+
return type + "|" + name + "|" + version;
297+
}
298+
}
299+
return null;
300+
}
244301
}

src/test/java/gov/cms/madie/measure/utilities/qicore411/PackagingUtilityImplTest.java

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package gov.cms.madie.measure.utilities.qicore411;
22

33
import static org.hamcrest.MatcherAssert.assertThat;
4-
import static org.junit.jupiter.api.Assertions.assertNotNull;
5-
import static org.junit.jupiter.api.Assertions.assertThrows;
6-
import static org.junit.jupiter.api.Assertions.fail;
74

85
import gov.cms.madie.packaging.utils.ResourceFileUtil;
96
import org.apache.commons.io.FilenameUtils;
@@ -18,12 +15,15 @@
1815
import gov.cms.madie.packaging.utils.qicore411.PackagingUtilityImpl;
1916

2017
import java.io.*;
18+
import java.util.ArrayList;
2119
import java.util.HashMap;
20+
import java.util.List;
2221
import java.util.Map;
2322
import java.util.zip.ZipEntry;
2423
import java.util.zip.ZipInputStream;
2524

2625
import static org.hamcrest.CoreMatchers.is;
26+
import static org.junit.jupiter.api.Assertions.*;
2727

2828
class PackagingUtilityImplTest implements ResourceFileUtil {
2929

@@ -181,4 +181,48 @@ void testGetZipBundleForMultipleTestCases() throws IOException {
181181
assertThat(zipContents.containsKey("TC1.json"), is(true));
182182
assertThat(zipContents.containsKey("TC2.json"), is(true));
183183
}
184+
185+
@Test
186+
void testBuildCompositeExportNullCompositeBundle() {
187+
PackagingUtilityImpl utility = new PackagingUtilityImpl();
188+
List<Export> componentExports = new ArrayList<>();
189+
byte[] result = utility.buildCompositeExport(null, componentExports, "composite");
190+
assertNull(result);
191+
}
192+
193+
@Test
194+
void testBuildCompositeExportBlankCompositeBundle() {
195+
PackagingUtilityImpl utility = new PackagingUtilityImpl();
196+
List<Export> componentExports = new ArrayList<>();
197+
byte[] result = utility.buildCompositeExport("", componentExports, "composite");
198+
assertNull(result);
199+
}
200+
201+
@Test
202+
void testBuildCompositeExportWithEmptyComponentExports() throws IOException {
203+
PackagingUtilityImpl utility = new PackagingUtilityImpl();
204+
List<Export> componentExports = new ArrayList<>();
205+
byte[] result = utility.buildCompositeExport(JsonBits.BUNDLE, componentExports, "composite");
206+
assertNotNull(result);
207+
208+
Map<String, String> zipContents = getZipContents(result);
209+
assertThat(zipContents.containsKey("composite.json"), is(true));
210+
assertThat(zipContents.containsKey("composite.xml"), is(true));
211+
assertThat(zipContents.containsKey("composite.html"), is(true));
212+
}
213+
214+
@Test
215+
void testBuildCompositeExportWithComponentExports() throws IOException {
216+
PackagingUtilityImpl utility = new PackagingUtilityImpl();
217+
Export componentExport = new Export();
218+
componentExport.setMeasureBundleJson(JsonBits.BUNDLE);
219+
List<Export> componentExports = List.of(componentExport);
220+
221+
byte[] result = utility.buildCompositeExport(JsonBits.BUNDLE, componentExports, "composite");
222+
assertNotNull(result);
223+
224+
Map<String, String> zipContents = getZipContents(result);
225+
assertThat(zipContents.containsKey("composite.json"), is(true));
226+
assertThat(zipContents.containsKey("composite.xml"), is(true));
227+
}
184228
}

0 commit comments

Comments
 (0)