in blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java [624:753]
public Blob getBlob(String containerName, String key, GetOptions options) {
logger.debug("Retrieving blob with key %s from container %s", key, containerName);
// If the container doesn't exist, an exception is thrown
if (!storageStrategy.containerExists(containerName)) {
logger.debug("Container %s does not exist", containerName);
throw cnfe(containerName);
}
// If the blob doesn't exist, a null object is returned
Blob blob = loadBlob(containerName, key);
if (blob == null) {
logger.debug("Item %s does not exist in container %s", key, containerName);
return null;
}
if (options != null) {
String eTag = blob.getMetadata().getETag();
if (eTag != null) {
eTag = maybeQuoteETag(eTag);
if (options.getIfMatch() != null) {
if (!eTag.equals(maybeQuoteETag(options.getIfMatch()))) {
HttpResponse response = HttpResponse.builder().statusCode(Status.PRECONDITION_FAILED.getStatusCode()).addHeader(HttpHeaders.ETAG, eTag).build();
throw new HttpResponseException(new HttpCommand(HttpRequest.builder().method("GET").endpoint("http://stub").build()), response);
}
}
if (options.getIfNoneMatch() != null) {
if (eTag.equals(maybeQuoteETag(options.getIfNoneMatch()))) {
HttpResponse response = HttpResponse.builder().statusCode(Status.NOT_MODIFIED.getStatusCode()).addHeader(HttpHeaders.ETAG, eTag).build();
throw new HttpResponseException(new HttpCommand(HttpRequest.builder().method("GET").endpoint("http://stub").build()), response);
}
}
}
if (options.getIfModifiedSince() != null) {
Date modifiedSince = options.getIfModifiedSince();
if (blob.getMetadata().getLastModified().before(modifiedSince)) {
HttpResponse.Builder response = HttpResponse.builder().statusCode(Status.NOT_MODIFIED.getStatusCode());
if (eTag != null) {
response.addHeader(HttpHeaders.ETAG, eTag);
}
throw new HttpResponseException(String.format("%1$s is before %2$s", blob
.getMetadata().getLastModified(), modifiedSince), null, response.build());
}
}
if (options.getIfUnmodifiedSince() != null) {
Date unmodifiedSince = options.getIfUnmodifiedSince();
if (blob.getMetadata().getLastModified().after(unmodifiedSince)) {
HttpResponse.Builder response = HttpResponse.builder().statusCode(Status.PRECONDITION_FAILED.getStatusCode());
if (eTag != null) {
response.addHeader(HttpHeaders.ETAG, eTag);
}
throw new HttpResponseException(String.format("%1$s is after %2$s", blob
.getMetadata().getLastModified(), unmodifiedSince), null, response.build());
}
}
blob = copyBlob(blob);
if (options.getRanges() != null && !options.getRanges().isEmpty()) {
long size = 0;
ImmutableList.Builder<ByteSource> streams = ImmutableList.builder();
// Try to convert payload to ByteSource, otherwise wrap it.
ByteSource byteSource;
Object object = blob.getPayload().getRawContent();
if (object instanceof ByteSource) {
byteSource = (ByteSource) object;
} else if (object instanceof byte[]) {
byteSource = ByteSource.wrap((byte[]) object);
} else {
// This should not happen.
try {
byteSource = ByteSource.wrap(ByteStreams2.toByteArrayAndClose(blob.getPayload().openStream()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
for (String s : options.getRanges()) {
// HTTP uses a closed interval while Java array indexing uses a
// half-open interval.
long offset = 0;
long last = blob.getPayload().getContentMetadata().getContentLength() - 1;
if (s.startsWith("-")) {
offset = last - Long.parseLong(s.substring(1)) + 1;
if (offset < 0) {
offset = 0;
}
} else if (s.endsWith("-")) {
offset = Long.parseLong(s.substring(0, s.length() - 1));
} else if (s.contains("-")) {
String[] firstLast = s.split("\\-");
offset = Long.parseLong(firstLast[0]);
last = Long.parseLong(firstLast[1]);
} else {
throw new HttpResponseException("illegal range: " + s, null, HttpResponse.builder().statusCode(416).build());
}
if (offset >= blob.getPayload().getContentMetadata().getContentLength()) {
throw new HttpResponseException("illegal range: " + s, null, HttpResponse.builder().statusCode(416).build());
}
if (last + 1 > blob.getPayload().getContentMetadata().getContentLength()) {
last = blob.getPayload().getContentMetadata().getContentLength() - 1;
}
streams.add(byteSource.slice(offset, last - offset + 1));
size += last - offset + 1;
blob.getAllHeaders().put(HttpHeaders.CONTENT_RANGE,
"bytes " + offset + "-" + last + "/" + blob.getPayload().getContentMetadata().getContentLength());
}
ContentMetadata cmd = blob.getPayload().getContentMetadata();
blob.setPayload(ByteSource.concat(streams.build()));
HttpUtils.copy(cmd, blob.getPayload().getContentMetadata());
blob.getPayload().getContentMetadata().setContentLength(size);
blob.getMetadata().setSize(size);
}
}
checkNotNull(blob.getPayload(), "payload " + blob);
// return InputStream to more closely follow real blobstore
Payload payload;
try {
InputStream is = blob.getPayload().openStream();
blob.resetPayload(/*release=*/ false);
payload = new InputStreamPayload(is);
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
payload.setContentMetadata(blob.getMetadata().getContentMetadata());
blob.setPayload(payload);
copyPayloadHeadersToBlob(blob.getPayload(), blob);
return blob;
}