Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package org.opencds.cqf.tooling.casereporting.tes;

import org.opencds.cqf.tooling.utilities.IOUtils;

import java.util.Set;
import org.opencds.cqf.tooling.utilities.IOUtils;

public class TESPackageGenerateParameters {
public String version; // -version (-v)
public String releaseLabel; // -releaselabel (-rl)
public String outputPath; // -outputpath (-op)
public String outputFileName; // -outputfilename (-ofn)
public String pathToInputBundle; // -pathtoinputbundle (-ptib)
public String pathToConditionGrouperWorkbook; // -pathToConditionGrouperWorkbook (-ptcgw)
public String pathToGroupersWorkbook; // -pathToGroupersWorkbook (-ptgw)
public String pathToConditionCodeValueSet; // -pathToConditionCodeValueSet (-ptccvs)
public Set<IOUtils.Encoding> outputFileEncodings; // -encoding (-e)
public boolean writeConditionGroupers; // -writeconditiongroupers (-wcg)
public boolean writeReportingSpecificationGroupers; // -writereportingspecificationgroupers (-wrsg)
public boolean writeAdditionalContextGroupers; // -writeadditionalcontextgroupers (-wacg)
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,43 @@ private CaseReporting() {}
public static final String MANIFESTCANONICALTAIL = "tes-content-library";
public static final String MANIFESTURL = CANONICALBASE + "/" + MANIFESTCANONICALTAIL;
public static final String VSMUSAGECONTEXTTYPESYSTEMURL = "http://aphl.org/fhir/vsm/CodeSystem/usage-context-type";
public static final String USAGECONTEXTTYPESYSTEMURL = "http://terminology.hl7.org/CodeSystem/usage-context-type";
public static final String USPHUSAGECONTEXTURL = "http://hl7.org/fhir/us/ecr/CodeSystem/us-ph-usage-context";
public static final String SEARCHPARAMSYSTEMLIBRARYDEPENDSON = "http://hl7.org/fhir/Library#relatedArtifact.dependsOn";
public static final String SEARCHPARAMSYSTEMLIBRARYCONTEXTTYPEVALUE = "http://hl7.org/fhir/ValueSet#useContext.context-type-value";
public static final String SEARCHPARAMUSECONTEXTVALUEGROUPERTYPECONDITIONGROUPER = "grouper-type$http://aphl.org/fhir/vsm/CodeSystem/usage-context-type|condition-grouper";
public static final String SEARCHPARAMSYSTEMLIBRARYDEPENDSON =
"http://hl7.org/fhir/Library#relatedArtifact.dependsOn";
public static final String SEARCHPARAMSYSTEMLIBRARYCONTEXTTYPEVALUE =
"http://hl7.org/fhir/ValueSet#useContext.context-type-value";
public static final String SEARCHPARAMUSECONTEXTVALUEGROUPERTYPECONDITIONGROUPER =
"grouper-type$http://aphl.org/fhir/vsm/CodeSystem/usage-context-type|condition-grouper";

// Condition Groupers Sheet Layout
public static final int CONDITIONGROUPINGSSHEETINDEX = 1;
public static final int CONDITIONGROUPINGIDENTIFIERINDEX = 1;
public static final int CONDITIONGROUPINGGENERATEDNAMEINDEX = 2;
public static final int CONDITIONGROUPINGTITLEINDEX = 3;
public static final int REPORTINGSPECIFICATIONTITLEINDEX = 4;
public static final int REPORTINGSPECIFICATIONCONDITIONCODEINDEX = 5;
public static final int REPORTINGSPECIFICATIONCONDITIONDESCRIPTIONINDEX = 6;
public static final int CONDITIONGROUPINGURLCOLINDEX = 1;
public static final int CONDITIONGROUPINGTITLECOLINDEX = 3;
public static final int REPORTINGSPECIFICATIONTITLECOLINDEX = 4;
public static final int REPORTINGSPECIFICATIONCONDITIONCODECOLINDEX = 5;
public static final int REPORTINGSPECIFICATIONCONDITIONDESCRIPTIONCOLINDEX = 6;

// Additional Context Groupers Sheet Layout
// public static final int ADDITIONALCONTEXTGROUPERSHEETINDEX = 2;
// public static final int ADDITIONALCONTEXTGROUPERTARGETCONDITIONGROUPERURLCOLINDEX = 0;
// public static final int ADDITIONALCONTEXTGROUPERTARGETCONDITIONGROUPERTITLECOLINDEX = 1;
// public static final int ADDITIONALCONTEXTGROUPERURLCOLINDEX = 2;
// public static final int ADDITIONALCONTEXTGROUPERTITLECOLINDEX = 3;
// public static final int ADDITIONALCONTEXTGROUPERVALUESETTITLEINDEX = 4;
// public static final int ADDITIONALCONTEXTGROUPERVALUESETURLINDEX = 5;
// public static final int ADDITIONALCONTEXTGROUPERVALUESETSYSTEMINDEX = 6;

// Additional Context Groupers Codes Sheet Layout
public static final int ADDITIONALCONTEXTGROUPERSHEETINDEX = 2;
public static final int ADDITIONALCONTEXTGROUPERTARGETCONDITIONGROUPERURLCOLINDEX = 0;
public static final int ADDITIONALCONTEXTGROUPERTARGETCONDITIONGROUPERTITLECOLINDEX = 1;
public static final int ADDITIONALCONTEXTGROUPERGENERATEDURLCOLINDEX = 2;
public static final int ADDITIONALCONTEXTGROUPERGENERATEDTITLECOLINDEX = 3;
public static final int ADDITIONALCONTEXTGROUPERTITLECOLINDEX = 4;
public static final int ADDITIONALCONTEXTGROUPERCODECOLINDEX = 5;
public static final int ADDITIONALCONTEXTGROUPERCODEDISPLAYCOLINDEX = 6;
public static final int ADDITIONALCONTEXTGROUPERCODESYSTEMURLCOLINDEX = 7;
}
public static final int ADDITIONALCONTEXTGROUPERVALUESETURLCOLINDEX = 5;
public static final int ADDITIONALCONTEXTGROUPERVALUESETTITLECOLINDEX = 6;
public static final int ADDITIONALCONTEXTGROUPERVALUESETSYSTEMURLCOLINDEX = 7;
public static final int ADDITIONALCONTEXTGROUPERCODECOLINDEX = 8;
public static final int ADDITIONALCONTEXTGROUPERCODEDISPLAYCOLINDEX = 9;
public static final int ADDITIONALCONTEXTGROUPERCODESYSTEMURLCOLINDEX = 10;
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
package org.opencds.cqf.tooling.terminology;

import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.parser.IParser;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.parser.IParser;
import org.opencds.cqf.tooling.utilities.IOUtils;

public class SpreadsheetHelper {
Expand All @@ -29,19 +25,17 @@ public static Workbook getWorkbook(String pathToSpreadsheet) {

private static String cleanseString(String rawValue) {
StringBuilder newString = new StringBuilder(rawValue.length());
for (int offset = 0; offset < rawValue.length();)
{
for (int offset = 0; offset < rawValue.length(); ) {
int codePoint = rawValue.codePointAt(offset);
offset += Character.charCount(codePoint);

// Replace invisible control characters and unused code points
switch (Character.getType(codePoint))
{
case Character.CONTROL: // \p{Cc}
case Character.FORMAT: // \p{Cf}
switch (Character.getType(codePoint)) {
case Character.CONTROL: // \p{Cc}
case Character.FORMAT: // \p{Cf}
case Character.PRIVATE_USE: // \p{Co}
case Character.SURROGATE: // \p{Cs}
case Character.UNASSIGNED: // \p{Cn}
case Character.SURROGATE: // \p{Cs}
case Character.UNASSIGNED: // \p{Cn}
newString.append('?');
break;
default:
Expand All @@ -54,20 +48,18 @@ private static String cleanseString(String rawValue) {

private static String cleanseStringNoReplacement(String rawValue) {
StringBuilder newString = new StringBuilder(rawValue.length());
for (int offset = 0; offset < rawValue.length();)
{
for (int offset = 0; offset < rawValue.length(); ) {
int codePoint = rawValue.codePointAt(offset);
offset += Character.charCount(codePoint);

// Replace invisible control characters and unused code points
switch (Character.getType(codePoint))
{
case Character.CONTROL: // \p{Cc}
case Character.FORMAT: // \p{Cf}
switch (Character.getType(codePoint)) {
case Character.CONTROL: // \p{Cc}
case Character.FORMAT: // \p{Cf}
case Character.PRIVATE_USE: // \p{Co}
case Character.SURROGATE: // \p{Cs}
case Character.UNASSIGNED: // \p{Cn}
//just skip it
case Character.SURROGATE: // \p{Cs}
case Character.UNASSIGNED: // \p{Cn}
// just skip it
break;
default:
newString.append(Character.toChars(codePoint));
Expand All @@ -83,12 +75,11 @@ public static String protectedString(String rawValue, boolean replace) {
return result;
}
result = result.trim();
if(replace) {
if (replace) {
result = result.replaceAll("\\p{Cntrl}", "?");
result = result.replaceAll("\\p{C}", "?");
result = SpreadsheetHelper.cleanseString(result);
}
else{
} else {
result = result.replaceAll("\\p{Cntrl}", "");
result = result.replaceAll("\\p{C}", "");
result = SpreadsheetHelper.cleanseStringNoReplacement(result);
Expand All @@ -97,6 +88,7 @@ public static String protectedString(String rawValue, boolean replace) {
}

private static DataFormatter dataFormatter;

public static DataFormatter getDataFormatter() {
if (dataFormatter == null) {
dataFormatter = new DataFormatter();
Expand Down Expand Up @@ -137,7 +129,25 @@ public static String getCellAsString(Row row, int cellIndex) {
return null;
}

//name.matches('[A-Z]([A-Za-z0-9_]){0,254}')
public static String getCellAsStringEmptyForNull(Cell cell, FormulaEvaluator evaluator) {
if (cell == null) return "";

DataFormatter formatter = SpreadsheetHelper.getDataFormatter();
String raw = (evaluator == null) ? formatter.formatCellValue(cell) : formatter.formatCellValue(cell, evaluator);

// Normalize NBSP/newlines and trim to empty
if (raw == null) return "";
return raw.replace("\n", " ").replace('\u00A0', ' ').trim();
}

public static String getCellAsStringEmptyForNull(Row row, int cellIndex, FormulaEvaluator evaluator) {
if (row == null || cellIndex < 0) return "";
// create a blank cell if missing so we never return null
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
return getCellAsStringEmptyForNull(cell, evaluator);
}

// name.matches('[A-Z]([A-Za-z0-9_]){0,254}')
public static String getFHIRName(String value) {
String name = value.replaceAll("[^A-Za-z0-9_]", "");
while (name.length() > 0 && !Character.isAlphabetic(name.charAt(0))) {
Expand All @@ -151,18 +161,23 @@ public static String getFHIRName(String value) {
public static void resolveValueSet(org.hl7.fhir.dstu3.model.ValueSet vs, Map<Integer, ValueSet> codesBySystem) {
vs.setCompose(new org.hl7.fhir.dstu3.model.ValueSet.ValueSetComposeComponent());
for (Map.Entry<Integer, org.opencds.cqf.tooling.terminology.ValueSet> entry : codesBySystem.entrySet()) {
org.hl7.fhir.dstu3.model.ValueSet.ConceptSetComponent component = new org.hl7.fhir.dstu3.model.ValueSet.ConceptSetComponent();
component.setSystem(entry.getValue().getSystem()).setVersion(entry.getValue().getVersion()).setConcept(entry.getValue().getCodes());
org.hl7.fhir.dstu3.model.ValueSet.ConceptSetComponent component =
new org.hl7.fhir.dstu3.model.ValueSet.ConceptSetComponent();
component
.setSystem(entry.getValue().getSystem())
.setVersion(entry.getValue().getVersion())
.setConcept(entry.getValue().getCodes());
vs.setCompose(vs.getCompose().addInclude(component));
}
}

public static void writeValueSetToFile(org.hl7.fhir.dstu3.model.ValueSet vs, String encoding, String outputPath) {
String fileName = vs.getTitle() != null ? vs.getTitle().replaceAll("\\s", "").concat("." + encoding) : "valueset".concat("." + encoding);
IParser parser =
encoding == null
? FhirContext.forDstu3Cached().newJsonParser()
: encoding.toLowerCase().startsWith("j")
String fileName = vs.getTitle() != null
? vs.getTitle().replaceAll("\\s", "").concat("." + encoding)
: "valueset".concat("." + encoding);
IParser parser = encoding == null
? FhirContext.forDstu3Cached().newJsonParser()
: encoding.toLowerCase().startsWith("j")
? FhirContext.forDstu3Cached().newJsonParser()
: FhirContext.forDstu3Cached().newXmlParser();
try (FileOutputStream writer = new FileOutputStream(IOUtils.concatFilePath(outputPath, fileName))) {
Expand Down
Loading
Loading