/** * Return the timestamp when the payload was last modified * * @returns Long: The last modified date of the payload, or NULL if unknown */ @Override public Long lastModified() { try { if (blob == null) { loadBlob(); } if (blob.getMetadata().getLastModified() == null) { // Payload objects stored into the blob store may not have their // timestamp so we'll re-fetch it blob = BlobStoreClient.getClient().getBlob(BlobStoreClient.getContainerName(), blob.getMetadata().getName()); } return blob.getMetadata().getLastModified().getTime(); } catch (StorageException e) { throw new RuntimeException("Failed to get payload size", e); } }
@VisibleForTesting void parseLastModifiedOrThrowException(HttpResponse from, MutableBlobMetadata metadata) throws HttpException { String lastModified = from.getFirstHeaderOrNull(HttpHeaders.LAST_MODIFIED); if (lastModified == null) { // scaleup-storage uses the wrong case for the last modified header if ((lastModified = from.getFirstHeaderOrNull("Last-modified")) == null) throw new HttpException(HttpHeaders.LAST_MODIFIED + " header not present in response: " + from); } // Walrus if (lastModified.startsWith("20")) { metadata.setLastModified(dateParser.iso8601DateParse(lastModified.replace("+0000", "Z"))); } else { metadata.setLastModified(dateParser.rfc822DateParse(lastModified)); } if (metadata.getLastModified() == null) throw new HttpException("could not parse: " + HttpHeaders.LAST_MODIFIED + ": " + lastModified); }
@VisibleForTesting void parseLastModifiedOrThrowException(HttpResponse from, MutableBlobMetadata metadata) throws HttpException { String lastModified = from.getFirstHeaderOrNull(HttpHeaders.LAST_MODIFIED); if (lastModified == null) { // scaleup-storage uses the wrong case for the last modified header if ((lastModified = from.getFirstHeaderOrNull("Last-modified")) == null) throw new HttpException(HttpHeaders.LAST_MODIFIED + " header not present in response: " + from); } // Walrus if (lastModified.startsWith("20")) { metadata.setLastModified(dateParser.iso8601DateParse(lastModified.replace("+0000", "Z"))); } else { metadata.setLastModified(dateParser.rfc822DateParse(lastModified)); } if (metadata.getLastModified() == null) throw new HttpException("could not parse: " + HttpHeaders.LAST_MODIFIED + ": " + lastModified); }
@VisibleForTesting void parseLastModifiedOrThrowException(HttpResponse from, MutableBlobMetadata metadata) throws HttpException { String lastModified = from.getFirstHeaderOrNull(HttpHeaders.LAST_MODIFIED); if (lastModified == null) { // scaleup-storage uses the wrong case for the last modified header if ((lastModified = from.getFirstHeaderOrNull("Last-modified")) == null) throw new HttpException(HttpHeaders.LAST_MODIFIED + " header not present in response: " + from); } // Walrus if (lastModified.startsWith("20")) { metadata.setLastModified(dateParser.iso8601DateParse(lastModified.replace("+0000", "Z"))); } else { metadata.setLastModified(dateParser.rfc822DateParse(lastModified)); } if (metadata.getLastModified() == null) throw new HttpException("could not parse: " + HttpHeaders.LAST_MODIFIED + ": " + lastModified); }
@VisibleForTesting void parseLastModifiedOrThrowException(HttpResponse from, MutableBlobMetadata metadata) throws HttpException { String lastModified = from.getFirstHeaderOrNull(HttpHeaders.LAST_MODIFIED); if (lastModified == null) { // scaleup-storage uses the wrong case for the last modified header if ((lastModified = from.getFirstHeaderOrNull("Last-modified")) == null) throw new HttpException(HttpHeaders.LAST_MODIFIED + " header not present in response: " + from); } // Walrus if (lastModified.startsWith("20")) { metadata.setLastModified(dateParser.iso8601DateParse(lastModified.replace("+0000", "Z"))); } else { metadata.setLastModified(dateParser.rfc822DateParse(lastModified)); } if (metadata.getLastModified() == null) throw new HttpException("could not parse: " + HttpHeaders.LAST_MODIFIED + ": " + lastModified); }
@VisibleForTesting void parseLastModifiedOrThrowException(HttpResponse from, MutableBlobMetadata metadata) throws HttpException { String lastModified = from.getFirstHeaderOrNull(HttpHeaders.LAST_MODIFIED); if (lastModified == null) { // scaleup-storage uses the wrong case for the last modified header if ((lastModified = from.getFirstHeaderOrNull("Last-modified")) == null) throw new HttpException(HttpHeaders.LAST_MODIFIED + " header not present in response: " + from); } // Walrus if (lastModified.startsWith("20")) { metadata.setLastModified(dateParser.iso8601DateParse(lastModified.replace("+0000", "Z"))); } else { metadata.setLastModified(dateParser.rfc822DateParse(lastModified)); } if (metadata.getLastModified() == null) throw new HttpException("could not parse: " + HttpHeaders.LAST_MODIFIED + ": " + lastModified); }
@VisibleForTesting void parseLastModifiedOrThrowException(HttpResponse from, MutableBlobMetadata metadata) throws HttpException { String lastModified = from.getFirstHeaderOrNull(HttpHeaders.LAST_MODIFIED); if (lastModified == null) { // scaleup-storage uses the wrong case for the last modified header if ((lastModified = from.getFirstHeaderOrNull("Last-modified")) == null) throw new HttpException(HttpHeaders.LAST_MODIFIED + " header not present in response: " + from); } // Walrus if (lastModified.startsWith("20")) { metadata.setLastModified(dateParser.iso8601DateParse(lastModified.replace("+0000", "Z"))); } else { metadata.setLastModified(dateParser.rfc822DateParse(lastModified)); } if (metadata.getLastModified() == null) throw new HttpException("could not parse: " + HttpHeaders.LAST_MODIFIED + ": " + lastModified); }
@VisibleForTesting void parseLastModifiedOrThrowException(HttpResponse from, MutableBlobMetadata metadata) throws HttpException { String lastModified = from.getFirstHeaderOrNull(HttpHeaders.LAST_MODIFIED); if (lastModified == null) { // scaleup-storage uses the wrong case for the last modified header if ((lastModified = from.getFirstHeaderOrNull("Last-modified")) == null) throw new HttpException(HttpHeaders.LAST_MODIFIED + " header not present in response: " + from); } // Walrus if (lastModified.startsWith("20")) { metadata.setLastModified(dateParser.iso8601DateParse(lastModified.replace("+0000", "Z"))); } else { metadata.setLastModified(dateParser.rfc822DateParse(lastModified)); } if (metadata.getLastModified() == null) throw new HttpException("could not parse: " + HttpHeaders.LAST_MODIFIED + ": " + lastModified); }
private Blob createUpdatedCopyOfBlobInContainer(String containerName, Blob in, byte[] input, HashCode contentMd5) { checkNotNull(containerName, "containerName"); checkNotNull(in, "blob"); checkNotNull(input, "input"); checkNotNull(contentMd5, "contentMd5"); Payload payload = Payloads.newByteSourcePayload(ByteSource.wrap(input)); MutableContentMetadata oldMd = in.getPayload().getContentMetadata(); HttpUtils.copy(oldMd, payload.getContentMetadata()); payload.getContentMetadata().setContentMD5(contentMd5); payload.getContentMetadata().setContentLength((long) input.length); Blob blob = blobFactory.create(BlobStoreUtils.copy(in.getMetadata())); blob.setPayload(payload); blob.getMetadata().setContainer(containerName); blob.getMetadata().setLastModified(new Date()); blob.getMetadata().setSize((long) input.length); String eTag = base16().lowerCase().encode(contentMd5.asBytes()); blob.getMetadata().setETag(eTag); // Set HTTP headers to match metadata blob.getAllHeaders().replaceValues(HttpHeaders.LAST_MODIFIED, ImmutableList.of(dateService.rfc822DateFormat(blob.getMetadata().getLastModified()))); blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, ImmutableList.of(eTag)); copyPayloadHeadersToBlob(payload, blob); blob.getAllHeaders().putAll(Multimaps.forMap(blob.getMetadata().getUserMetadata())); return blob; }
private Blob createUpdatedCopyOfBlobInContainer(String containerName, Blob in, byte[] input, HashCode contentMd5) { checkNotNull(containerName, "containerName"); checkNotNull(in, "blob"); checkNotNull(input, "input"); checkNotNull(contentMd5, "contentMd5"); Payload payload = Payloads.newByteSourcePayload(ByteSource.wrap(input)); MutableContentMetadata oldMd = in.getPayload().getContentMetadata(); HttpUtils.copy(oldMd, payload.getContentMetadata()); payload.getContentMetadata().setContentMD5(contentMd5); payload.getContentMetadata().setContentLength((long) input.length); Blob blob = blobFactory.create(BlobStoreUtils.copy(in.getMetadata())); blob.setPayload(payload); blob.getMetadata().setContainer(containerName); blob.getMetadata().setLastModified(new Date()); blob.getMetadata().setSize((long) input.length); String eTag = base16().lowerCase().encode(contentMd5.asBytes()); blob.getMetadata().setETag(eTag); // Set HTTP headers to match metadata blob.getAllHeaders().replaceValues(HttpHeaders.LAST_MODIFIED, ImmutableList.of(dateService.rfc822DateFormat(blob.getMetadata().getLastModified()))); blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, ImmutableList.of(eTag)); copyPayloadHeadersToBlob(payload, blob); blob.getAllHeaders().putAll(Multimaps.forMap(blob.getMetadata().getUserMetadata())); return blob; }
private Blob createUpdatedCopyOfBlobInContainer(String containerName, Blob in, byte[] input, HashCode contentMd5) { checkNotNull(containerName, "containerName"); checkNotNull(in, "blob"); checkNotNull(input, "input"); checkNotNull(contentMd5, "contentMd5"); Payload payload = Payloads.newByteSourcePayload(ByteSource.wrap(input)); MutableContentMetadata oldMd = in.getPayload().getContentMetadata(); HttpUtils.copy(oldMd, payload.getContentMetadata()); payload.getContentMetadata().setContentMD5(contentMd5); payload.getContentMetadata().setContentLength((long) input.length); Blob blob = blobFactory.create(BlobStoreUtils.copy(in.getMetadata())); blob.setPayload(payload); blob.getMetadata().setContainer(containerName); blob.getMetadata().setLastModified(new Date()); blob.getMetadata().setSize((long) input.length); String eTag = base16().lowerCase().encode(contentMd5.asBytes()); blob.getMetadata().setETag(eTag); // Set HTTP headers to match metadata blob.getAllHeaders().replaceValues(HttpHeaders.LAST_MODIFIED, ImmutableList.of(dateService.rfc822DateFormat(blob.getMetadata().getLastModified()))); blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, ImmutableList.of(eTag)); copyPayloadHeadersToBlob(payload, blob); blob.getAllHeaders().putAll(Multimaps.forMap(blob.getMetadata().getUserMetadata())); return blob; }
private Blob createUpdatedCopyOfBlobInContainer(String containerName, Blob in, byte[] input, HashCode contentMd5) { checkNotNull(containerName, "containerName"); checkNotNull(in, "blob"); checkNotNull(input, "input"); checkNotNull(contentMd5, "contentMd5"); Payload payload = Payloads.newByteSourcePayload(ByteSource.wrap(input)); MutableContentMetadata oldMd = in.getPayload().getContentMetadata(); HttpUtils.copy(oldMd, payload.getContentMetadata()); payload.getContentMetadata().setContentMD5(contentMd5); payload.getContentMetadata().setContentLength((long) input.length); Blob blob = blobFactory.create(BlobStoreUtils.copy(in.getMetadata())); blob.setPayload(payload); blob.getMetadata().setContainer(containerName); blob.getMetadata().setLastModified(new Date()); blob.getMetadata().setSize((long) input.length); String eTag = base16().lowerCase().encode(contentMd5.asBytes()); blob.getMetadata().setETag(eTag); // Set HTTP headers to match metadata blob.getAllHeaders().replaceValues(HttpHeaders.LAST_MODIFIED, ImmutableList.of(dateService.rfc822DateFormat(blob.getMetadata().getLastModified()))); blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, ImmutableList.of(eTag)); copyPayloadHeadersToBlob(payload, blob); blob.getAllHeaders().putAll(Multimaps.forMap(blob.getMetadata().getUserMetadata())); return blob; }
@Test public void testSetLastModified() { HttpResponse from = HttpResponse.builder() .statusCode(200).message("ok") .payload("") .addHeader(HttpHeaders.LAST_MODIFIED, "Wed, 09 Sep 2009 19:50:23 GMT").build(); MutableBlobMetadata metadata = blobMetadataProvider.get(); parser.parseLastModifiedOrThrowException(from, metadata); assertEquals(metadata.getLastModified(), new SimpleDateFormatDateService() .rfc822DateParse("Wed, 09 Sep 2009 19:50:23 GMT")); }
@Test public void testSetLastModifiedIso8601() { HttpResponse from = HttpResponse.builder() .statusCode(200).message("ok") .payload("") .addHeader(HttpHeaders.LAST_MODIFIED, "2011-01-28T17:35:08.000Z").build(); MutableBlobMetadata metadata = blobMetadataProvider.get(); parser.parseLastModifiedOrThrowException(from, metadata); assertEquals(metadata.getLastModified(), new SimpleDateFormatDateService() .iso8601DateParse("2011-01-28T17:35:08.000Z")); }
@Test public void testSetLastModifiedIso8601() { HttpResponse from = HttpResponse.builder() .statusCode(200).message("ok") .payload("") .addHeader(HttpHeaders.LAST_MODIFIED, "2011-01-28T17:35:08.000Z").build(); MutableBlobMetadata metadata = blobMetadataProvider.get(); parser.parseLastModifiedOrThrowException(from, metadata); assertEquals(metadata.getLastModified(), new SimpleDateFormatDateService() .iso8601DateParse("2011-01-28T17:35:08.000Z")); }
@Test public void testSetLastModified() { HttpResponse from = HttpResponse.builder() .statusCode(200).message("ok") .payload("") .addHeader(HttpHeaders.LAST_MODIFIED, "Wed, 09 Sep 2009 19:50:23 GMT").build(); MutableBlobMetadata metadata = blobMetadataProvider.get(); parser.parseLastModifiedOrThrowException(from, metadata); assertEquals(metadata.getLastModified(), new SimpleDateFormatDateService() .rfc822DateParse("Wed, 09 Sep 2009 19:50:23 GMT")); }
ImmutableList.of(dateService.rfc822DateFormat(blob.getMetadata().getLastModified()))); blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, ImmutableList.of(eTag)); copyPayloadHeadersToBlob(payload, blob);
ImmutableList.of(dateService.rfc822DateFormat(blob.getMetadata().getLastModified()))); blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, ImmutableList.of(eTag)); copyPayloadHeadersToBlob(payload, blob);
ImmutableList.of(dateService.rfc822DateFormat(blob.getMetadata().getLastModified()))); blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, ImmutableList.of(eTag)); copyPayloadHeadersToBlob(payload, blob);
if (modifiedSince.after(object.getMetadata().getLastModified())) return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412)); if (unmodifiedSince.before(object.getMetadata().getLastModified())) return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412));