mirror of
https://github.com/hapifhir/hapi-fhir.git
synced 2025-02-08 14:05:02 +00:00
failing Test
This commit is contained in:
parent
6f683e0990
commit
0f58641030
@ -7,6 +7,7 @@ import ca.uhn.fhir.jpa.binary.api.StoredDetails;
|
|||||||
import ca.uhn.fhir.rest.server.exceptions.PayloadTooLargeException;
|
import ca.uhn.fhir.rest.server.exceptions.PayloadTooLargeException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
||||||
|
import ca.uhn.fhir.system.HapiSystemProperties;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.hl7.fhir.r4.model.IdType;
|
import org.hl7.fhir.r4.model.IdType;
|
||||||
@ -46,6 +47,29 @@ public class FilesystemBinaryStorageSvcImplTest {
|
|||||||
FileUtils.deleteDirectory(myPath);
|
FileUtils.deleteDirectory(myPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStoreAndRetrievePostMigration() throws IOException {
|
||||||
|
HapiSystemProperties.enableUnitTestMode();
|
||||||
|
IIdType id = new IdType("Patient/123");
|
||||||
|
String contentType = "image/png";
|
||||||
|
StoredDetails outcome = mySvc.storeBinaryContent(id, null, contentType, new ByteArrayInputStream(SOME_BYTES), new ServletRequestDetails());
|
||||||
|
|
||||||
|
ourLog.info("Got id: {}", outcome);
|
||||||
|
|
||||||
|
StoredDetails details = mySvc.fetchBinaryContentDetails(id, outcome.getBinaryContentId());
|
||||||
|
assertEquals(16L, details.getBytes());
|
||||||
|
assertEquals(outcome.getBinaryContentId(), details.getBinaryContentId());
|
||||||
|
assertEquals("image/png", details.getContentType());
|
||||||
|
assertEquals("dc7197cfab936698bef7818975c185a9b88b71a0a0a2493deea487706ddf20cb", details.getHash());
|
||||||
|
assertNotNull(details.getPublished());
|
||||||
|
|
||||||
|
ByteArrayOutputStream capture = new ByteArrayOutputStream();
|
||||||
|
mySvc.writeBinaryContent(id, outcome.getBinaryContentId(), capture);
|
||||||
|
|
||||||
|
assertArrayEquals(SOME_BYTES, capture.toByteArray());
|
||||||
|
assertArrayEquals(SOME_BYTES, mySvc.fetchBinaryContent(id, outcome.getBinaryContentId()));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStoreAndRetrieve() throws IOException {
|
public void testStoreAndRetrieve() throws IOException {
|
||||||
IIdType id = new IdType("Patient/123");
|
IIdType id = new IdType("Patient/123");
|
||||||
|
@ -0,0 +1,145 @@
|
|||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR Storage api
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2024 Smile CDR, Inc.
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
package ca.uhn.fhir.jpa.binary.api;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.model.api.IModelJson;
|
||||||
|
import ca.uhn.fhir.rest.server.util.JsonDateDeserializer;
|
||||||
|
import ca.uhn.fhir.rest.server.util.JsonDateSerializer;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.google.common.hash.HashFunction;
|
||||||
|
import com.google.common.hash.Hashing;
|
||||||
|
import com.google.common.hash.HashingInputStream;
|
||||||
|
import jakarta.annotation.Nonnull;
|
||||||
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class OldStoredDetails implements IModelJson {
|
||||||
|
|
||||||
|
@JsonProperty("blobId")
|
||||||
|
private String myBinaryContentId;
|
||||||
|
|
||||||
|
@JsonProperty("bytes")
|
||||||
|
private long myBytes;
|
||||||
|
|
||||||
|
@JsonProperty("contentType")
|
||||||
|
private String myContentType;
|
||||||
|
|
||||||
|
@JsonProperty("hash")
|
||||||
|
private String myHash;
|
||||||
|
|
||||||
|
@JsonProperty("published")
|
||||||
|
@JsonSerialize(using = JsonDateSerializer.class)
|
||||||
|
@JsonDeserialize(using = JsonDateDeserializer.class)
|
||||||
|
private Date myPublished;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public OldStoredDetails() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public OldStoredDetails(
|
||||||
|
@Nonnull String theBinaryContentId,
|
||||||
|
long theBytes,
|
||||||
|
@Nonnull String theContentType,
|
||||||
|
HashingInputStream theIs,
|
||||||
|
Date thePublished) {
|
||||||
|
myBinaryContentId = theBinaryContentId;
|
||||||
|
myBytes = theBytes;
|
||||||
|
myContentType = theContentType;
|
||||||
|
myHash = theIs.hash().toString();
|
||||||
|
myPublished = thePublished;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return new ToStringBuilder(this)
|
||||||
|
.append("binaryContentId", myBinaryContentId)
|
||||||
|
.append("bytes", myBytes)
|
||||||
|
.append("contentType", myContentType)
|
||||||
|
.append("hash", myHash)
|
||||||
|
.append("published", myPublished)
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHash() {
|
||||||
|
return myHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OldStoredDetails setHash(String theHash) {
|
||||||
|
myHash = theHash;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getPublished() {
|
||||||
|
return myPublished;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OldStoredDetails setPublished(Date thePublished) {
|
||||||
|
myPublished = thePublished;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public String getContentType() {
|
||||||
|
return myContentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OldStoredDetails setContentType(String theContentType) {
|
||||||
|
myContentType = theContentType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public String getBinaryContentId() {
|
||||||
|
return myBinaryContentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OldStoredDetails setBinaryContentId(String theBinaryContentId) {
|
||||||
|
myBinaryContentId = theBinaryContentId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getBytes() {
|
||||||
|
return myBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OldStoredDetails setBytes(long theBytes) {
|
||||||
|
myBytes = theBytes;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StoredDetails toDetails() {
|
||||||
|
HashFunction hash = Hashing.sha256();
|
||||||
|
StoredDetails storedDetails = new StoredDetails(myBinaryContentId, myBytes, myContentType, new HashingInputStream(hash,new ByteArrayInputStream("whatever".getBytes())), myPublished);
|
||||||
|
storedDetails.setHash(myHash);
|
||||||
|
return storedDetails;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -21,10 +21,12 @@ package ca.uhn.fhir.jpa.binstore;
|
|||||||
|
|
||||||
import ca.uhn.fhir.context.ConfigurationException;
|
import ca.uhn.fhir.context.ConfigurationException;
|
||||||
import ca.uhn.fhir.i18n.Msg;
|
import ca.uhn.fhir.i18n.Msg;
|
||||||
|
import ca.uhn.fhir.jpa.binary.api.OldStoredDetails;
|
||||||
import ca.uhn.fhir.jpa.binary.api.StoredDetails;
|
import ca.uhn.fhir.jpa.binary.api.StoredDetails;
|
||||||
import ca.uhn.fhir.jpa.binary.svc.BaseBinaryStorageSvcImpl;
|
import ca.uhn.fhir.jpa.binary.svc.BaseBinaryStorageSvcImpl;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import ca.uhn.fhir.system.HapiSystemProperties;
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||||
@ -109,12 +111,23 @@ public class FilesystemBinaryStorageSvcImpl extends BaseBinaryStorageSvcImpl {
|
|||||||
|
|
||||||
// Write descriptor file
|
// Write descriptor file
|
||||||
long count = countingInputStream.getByteCount();
|
long count = countingInputStream.getByteCount();
|
||||||
StoredDetails details = new StoredDetails(id, count, theContentType, hashingInputStream, new Date());
|
StoredDetails details = null;
|
||||||
|
if (HapiSystemProperties.isUnitTestModeEnabled()) {
|
||||||
|
OldStoredDetails oldDetails = new OldStoredDetails(id, count, theContentType, hashingInputStream, new Date());
|
||||||
|
File descriptorFilename = getDescriptorFilename(storagePath, theResourceId, id);
|
||||||
|
ourLog.info("Writing to file: {}", descriptorFilename.getAbsolutePath());
|
||||||
|
try (FileWriter writer = new FileWriter(descriptorFilename)) {
|
||||||
|
myJsonSerializer.writeValue(writer, oldDetails);
|
||||||
|
}
|
||||||
|
details = oldDetails.toDetails();
|
||||||
|
} else {
|
||||||
|
details = new StoredDetails(id, count, theContentType, hashingInputStream, new Date());
|
||||||
File descriptorFilename = getDescriptorFilename(storagePath, theResourceId, id);
|
File descriptorFilename = getDescriptorFilename(storagePath, theResourceId, id);
|
||||||
ourLog.info("Writing to file: {}", descriptorFilename.getAbsolutePath());
|
ourLog.info("Writing to file: {}", descriptorFilename.getAbsolutePath());
|
||||||
try (FileWriter writer = new FileWriter(descriptorFilename)) {
|
try (FileWriter writer = new FileWriter(descriptorFilename)) {
|
||||||
myJsonSerializer.writeValue(writer, details);
|
myJsonSerializer.writeValue(writer, details);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ourLog.info(
|
ourLog.info(
|
||||||
"Stored binary blob with {} bytes and ContentType {} for resource {}",
|
"Stored binary blob with {} bytes and ContentType {} for resource {}",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user