mirror of
https://github.com/hapifhir/hapi-fhir.git
synced 2025-02-17 02:15:22 +00:00
Ensure temp file ends with "." and then suffix. (#5894)
This commit is contained in:
parent
b7cdc751e7
commit
929583e2e3
@ -19,6 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
package ca.uhn.fhir.cli;
|
package ca.uhn.fhir.cli;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.i18n.Msg;
|
import ca.uhn.fhir.i18n.Msg;
|
||||||
import ca.uhn.fhir.jpa.model.util.JpaConstants;
|
import ca.uhn.fhir.jpa.model.util.JpaConstants;
|
||||||
import ca.uhn.fhir.jpa.provider.TerminologyUploaderProvider;
|
import ca.uhn.fhir.jpa.provider.TerminologyUploaderProvider;
|
||||||
@ -31,6 +32,7 @@ import ca.uhn.fhir.system.HapiSystemProperties;
|
|||||||
import ca.uhn.fhir.util.AttachmentUtil;
|
import ca.uhn.fhir.util.AttachmentUtil;
|
||||||
import ca.uhn.fhir.util.FileUtil;
|
import ca.uhn.fhir.util.FileUtil;
|
||||||
import ca.uhn.fhir.util.ParametersUtil;
|
import ca.uhn.fhir.util.ParametersUtil;
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import org.apache.commons.cli.CommandLine;
|
import org.apache.commons.cli.CommandLine;
|
||||||
import org.apache.commons.cli.Options;
|
import org.apache.commons.cli.Options;
|
||||||
@ -265,7 +267,7 @@ public class UploadTerminologyCommand extends BaseRequestGeneratingCommand {
|
|||||||
"Response:\n{}", myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(response));
|
"Response:\n{}", myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(response));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addFileToRequestBundle(IBaseParameters theInputParameters, String theFileName, byte[] theBytes) {
|
protected void addFileToRequestBundle(IBaseParameters theInputParameters, String theFileName, byte[] theBytes) {
|
||||||
|
|
||||||
byte[] bytes = theBytes;
|
byte[] bytes = theBytes;
|
||||||
String fileName = theFileName;
|
String fileName = theFileName;
|
||||||
@ -277,7 +279,7 @@ public class UploadTerminologyCommand extends BaseRequestGeneratingCommand {
|
|||||||
FileUtil.formatFileSize(ourTransferSizeLimit));
|
FileUtil.formatFileSize(ourTransferSizeLimit));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
File tempFile = File.createTempFile("hapi-fhir-cli", suffix);
|
File tempFile = File.createTempFile("hapi-fhir-cli", "." + suffix);
|
||||||
tempFile.deleteOnExit();
|
tempFile.deleteOnExit();
|
||||||
try (OutputStream fileOutputStream = new FileOutputStream(tempFile, false)) {
|
try (OutputStream fileOutputStream = new FileOutputStream(tempFile, false)) {
|
||||||
fileOutputStream.write(bytes);
|
fileOutputStream.write(bytes);
|
||||||
@ -363,4 +365,9 @@ public class UploadTerminologyCommand extends BaseRequestGeneratingCommand {
|
|||||||
}
|
}
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setFhirContext(FhirContext theFhirContext) {
|
||||||
|
myFhirCtx = theFhirContext;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,10 @@ import org.hl7.fhir.common.hapi.validation.support.CommonCodeSystemsTerminologyS
|
|||||||
import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport;
|
import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport;
|
||||||
import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain;
|
import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain;
|
||||||
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
|
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseParameters;
|
||||||
|
import org.hl7.fhir.r4.model.Attachment;
|
||||||
|
import org.hl7.fhir.r4.model.Parameters;
|
||||||
|
import org.hl7.fhir.r4.model.Type;
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -43,6 +47,7 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
@ -54,6 +59,8 @@ import static org.hamcrest.Matchers.greaterThan;
|
|||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.matchesPattern;
|
import static org.hamcrest.Matchers.matchesPattern;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyList;
|
import static org.mockito.ArgumentMatchers.anyList;
|
||||||
@ -479,6 +486,86 @@ public class UploadTerminologyCommandTest {
|
|||||||
uploadICD10UsingCompressedFile(theFhirVersion, theIncludeTls);
|
uploadICD10UsingCompressedFile(theFhirVersion, theIncludeTls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@MethodSource("paramsProvider")
|
||||||
|
@SuppressWarnings("unused") // Both params for @BeforeEach
|
||||||
|
void testZipFileInParameters(String theFhirVersion, boolean theIncludeTls) {
|
||||||
|
final IBaseParameters inputParameters = switch (myCtx.getVersion().getVersion()) {
|
||||||
|
case DSTU2, DSTU2_HL7ORG, DSTU2_1 -> new org.hl7.fhir.dstu2.model.Parameters();
|
||||||
|
case DSTU3 -> new org.hl7.fhir.dstu3.model.Parameters();
|
||||||
|
case R4 -> new Parameters();
|
||||||
|
case R4B -> new org.hl7.fhir.r4b.model.Parameters();
|
||||||
|
case R5 -> new org.hl7.fhir.r5.model.Parameters();
|
||||||
|
};
|
||||||
|
|
||||||
|
final UploadTerminologyCommand uploadTerminologyCommand = new UploadTerminologyCommand();
|
||||||
|
uploadTerminologyCommand.setFhirContext(myCtx);
|
||||||
|
uploadTerminologyCommand.setTransferSizeBytes(1);
|
||||||
|
|
||||||
|
uploadTerminologyCommand.addFileToRequestBundle(inputParameters, "something.zip", new byte[] {1,2});
|
||||||
|
|
||||||
|
final String actualAttachmentUrl = getAttachmentUrl(inputParameters, myCtx);
|
||||||
|
assertTrue(actualAttachmentUrl.endsWith(".zip"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getAttachmentUrl(IBaseParameters theInputParameters, FhirContext theCtx) {
|
||||||
|
switch (theCtx.getVersion().getVersion()) {
|
||||||
|
case DSTU2:
|
||||||
|
case DSTU2_HL7ORG:
|
||||||
|
case DSTU2_1: {
|
||||||
|
assertInstanceOf(org.hl7.fhir.dstu2.model.Parameters.class, theInputParameters);
|
||||||
|
final org.hl7.fhir.dstu2.model.Parameters dstu2Parameters = (org.hl7.fhir.dstu2.model.Parameters) theInputParameters;
|
||||||
|
final List<org.hl7.fhir.dstu2.model.Parameters.ParametersParameterComponent> dstu2ParametersList = dstu2Parameters.getParameter();
|
||||||
|
final Optional<org.hl7.fhir.dstu2.model.Parameters.ParametersParameterComponent> optDstu2FileParam = dstu2ParametersList.stream().filter(param -> TerminologyUploaderProvider.PARAM_FILE.equals(param.getName())).findFirst();
|
||||||
|
assertTrue(optDstu2FileParam.isPresent());
|
||||||
|
final org.hl7.fhir.dstu2.model.Type dstu2Value = optDstu2FileParam.get().getValue();
|
||||||
|
assertInstanceOf(org.hl7.fhir.dstu2.model.Attachment.class, dstu2Value);
|
||||||
|
final org.hl7.fhir.dstu2.model.Attachment dstu2Attachment = (org.hl7.fhir.dstu2.model.Attachment) dstu2Value;
|
||||||
|
return dstu2Attachment.getUrl();
|
||||||
|
}
|
||||||
|
case DSTU3: {
|
||||||
|
assertInstanceOf(org.hl7.fhir.dstu3.model.Parameters.class, theInputParameters);
|
||||||
|
final org.hl7.fhir.dstu3.model.Parameters dstu3Parameters = (org.hl7.fhir.dstu3.model.Parameters) theInputParameters;
|
||||||
|
final List<org.hl7.fhir.dstu3.model.Parameters.ParametersParameterComponent> dstu3ParametersList = dstu3Parameters.getParameter();
|
||||||
|
final Optional<org.hl7.fhir.dstu3.model.Parameters.ParametersParameterComponent> optDstu3FileParam = dstu3ParametersList.stream().filter(param -> TerminologyUploaderProvider.PARAM_FILE.equals(param.getName())).findFirst();
|
||||||
|
assertTrue(optDstu3FileParam.isPresent());
|
||||||
|
final org.hl7.fhir.dstu3.model.Type dstu3Value = optDstu3FileParam.get().getValue();
|
||||||
|
assertInstanceOf(org.hl7.fhir.dstu3.model.Attachment.class, dstu3Value);
|
||||||
|
final org.hl7.fhir.dstu3.model.Attachment dstu3Attachment = (org.hl7.fhir.dstu3.model.Attachment) dstu3Value;
|
||||||
|
return dstu3Attachment.getUrl();
|
||||||
|
}
|
||||||
|
case R4: {
|
||||||
|
assertInstanceOf(Parameters.class, theInputParameters);
|
||||||
|
final Parameters r4Parameters = (Parameters) theInputParameters;
|
||||||
|
final Parameters.ParametersParameterComponent r4Parameter = r4Parameters.getParameter(TerminologyUploaderProvider.PARAM_FILE);
|
||||||
|
final Type r4Value = r4Parameter.getValue();
|
||||||
|
assertInstanceOf(Attachment.class, r4Value);
|
||||||
|
final Attachment r4Attachment = (Attachment) r4Value;
|
||||||
|
return r4Attachment.getUrl();
|
||||||
|
}
|
||||||
|
case R4B: {
|
||||||
|
assertInstanceOf(org.hl7.fhir.r4b.model.Parameters.class, theInputParameters);
|
||||||
|
final org.hl7.fhir.r4b.model.Parameters r4bParameters = (org.hl7.fhir.r4b.model.Parameters) theInputParameters;
|
||||||
|
final org.hl7.fhir.r4b.model.Parameters.ParametersParameterComponent r4bParameter = r4bParameters.getParameter(TerminologyUploaderProvider.PARAM_FILE);
|
||||||
|
final org.hl7.fhir.r4b.model.DataType value = r4bParameter.getValue();
|
||||||
|
assertInstanceOf(org.hl7.fhir.r4b.model.Attachment.class, value);
|
||||||
|
final org.hl7.fhir.r4b.model.Attachment r4bAttachment = (org.hl7.fhir.r4b.model.Attachment) value;
|
||||||
|
return r4bAttachment.getUrl();
|
||||||
|
}
|
||||||
|
case R5: {
|
||||||
|
assertInstanceOf(org.hl7.fhir.r5.model.Parameters.class, theInputParameters);
|
||||||
|
final org.hl7.fhir.r5.model.Parameters r4Parameters = (org.hl7.fhir.r5.model.Parameters) theInputParameters;
|
||||||
|
final org.hl7.fhir.r5.model.Parameters.ParametersParameterComponent parameter = r4Parameters.getParameter(TerminologyUploaderProvider.PARAM_FILE);
|
||||||
|
final org.hl7.fhir.r5.model.DataType value = parameter.getValue();
|
||||||
|
assertInstanceOf(org.hl7.fhir.r5.model.Attachment.class, value);
|
||||||
|
final org.hl7.fhir.r5.model.Attachment attachment = (org.hl7.fhir.r5.model.Attachment) value;
|
||||||
|
return attachment.getUrl();
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException("Unknown FHIR version: " + theCtx.getVersion().getVersion());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void uploadICD10UsingCompressedFile(String theFhirVersion, boolean theIncludeTls) throws IOException {
|
private void uploadICD10UsingCompressedFile(String theFhirVersion, boolean theIncludeTls) throws IOException {
|
||||||
if (FHIR_VERSION_DSTU3.equals(theFhirVersion)) {
|
if (FHIR_VERSION_DSTU3.equals(theFhirVersion)) {
|
||||||
when(myTermLoaderSvc.loadIcd10cm(anyList(), any())).thenReturn(new UploadStatistics(100, new org.hl7.fhir.dstu3.model.IdType("CodeSystem/101")));
|
when(myTermLoaderSvc.loadIcd10cm(anyList(), any())).thenReturn(new UploadStatistics(100, new org.hl7.fhir.dstu3.model.IdType("CodeSystem/101")));
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
type: fix
|
||||||
|
issue: 5893
|
||||||
|
title: "Previously, hapi-fhir-cli: upload-terminology failed with a HAPI-0862 error when uploading LOINC.
|
||||||
|
This has been fixed."
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user