public MutableObjectMetadata apply(BlobMetadata from) { if (from == null) return null; MutableObjectMetadata to = new MutableObjectMetadataImpl(); HttpUtils.copy(from.getContentMetadata(), to.getContentMetadata()); to.setUri(from.getUri()); to.setETag(from.getETag()); to.setKey(from.getName()); to.setBucket(bucket); to.setLastModified(from.getLastModified()); if (from.getUserMetadata() != null) { for (Entry<String, String> entry : from.getUserMetadata().entrySet()) to.getUserMetadata().put(entry.getKey().toLowerCase(), entry.getValue()); } return to; }
/** parses the http response headers to create a new {@link MutableObjectMetadata} object. */ public MutableObjectMetadata apply(HttpResponse from) { BlobMetadata base = blobMetadataParser.apply(from); MutableObjectMetadata to = blobToObjectMetadata.apply(base); addETagTo(from, to); if (to.getContentMetadata().getContentMD5() == null && to.getETag() != null) { Matcher md5Matcher = MD5_FROM_ETAG.matcher(to.getETag()); if (md5Matcher.find()) { byte[] md5 = base16().lowerCase().decode(md5Matcher.group(1)); // it is possible others will look at the http payload directly if (from.getPayload() != null) from.getPayload().getContentMetadata().setContentMD5(md5); to.getContentMetadata().setContentMD5(md5); } } // amz has an etag, but matches syntax for usermetadata to.getUserMetadata().remove("object-etag"); to.setCacheControl(from.getFirstHeaderOrNull(HttpHeaders.CACHE_CONTROL)); return to; }
@SuppressWarnings("unchecked") @Override public <R extends HttpRequest> R bindToRequest(R request, Object input) { checkArgument(checkNotNull(input, "input") instanceof S3Object, "this binder is only valid for S3Object!, not %s", input); checkNotNull(request, "request"); S3Object s3Object = S3Object.class.cast(input); checkArgument(s3Object.getMetadata().getKey() != null, "s3Object.getMetadata().getKey() must be set!"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() != null, "contentLength must be set, streaming not supported"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() <= 5l * 1024 * 1024 * 1024, "maximum size for put object is 5GB"); request = metadataPrefixer.bindToRequest(request, s3Object.getMetadata().getUserMetadata()); if (s3Object.getMetadata().getCacheControl() != null) { request = (R) request.toBuilder() .replaceHeader(HttpHeaders.CACHE_CONTROL, s3Object.getMetadata().getCacheControl()).build(); } return request; } }
@Test public void testPassWithMinimumDetailsAndPayload5GB() { S3Object object = injector.getInstance(S3Object.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(5368709120l); object.setPayload(payload); object.getMetadata().setKey("foo"); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindS3ObjectMetadataToRequest binder = injector.getInstance(BindS3ObjectMetadataToRequest.class); assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint( URI.create("http://localhost")).build()); }
protected String addBlobToContainer(String sourceContainer, String key) { S3Object sourceObject = getApi().newS3Object(); sourceObject.getMetadata().setKey(key); sourceObject.getMetadata().getContentMetadata().setContentType("text/xml"); sourceObject.setPayload(TEST_STRING); return getApi().putObject(sourceContainer, sourceObject); }
public void testMetadataWithCacheControlAndContentDisposition() throws Exception { String key = "hello"; S3Object object = getApi().newS3Object(); object.getMetadata().setKey(key); object.setPayload(TEST_STRING); object.getMetadata().setCacheControl("no-cache"); object.getMetadata().getContentMetadata().setContentDisposition("attachment; filename=hello.txt"); String containerName = getContainerName(); try { getApi().putObject(containerName, object); S3Object newObject = validateObject(containerName, key); assertCacheControl(newObject, "no-cache"); assertEquals(newObject.getMetadata().getContentMetadata().getContentDisposition(), "attachment; filename=hello.txt"); } finally { returnContainer(containerName); } }
@Test public void testExtendedPropertiesBind() { S3Object object = injector.getInstance(S3Object.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(5368709120l); object.setPayload(payload); object.getMetadata().setKey("foo"); object.getMetadata().setCacheControl("no-cache"); object.getMetadata().setUserMetadata(ImmutableMap.of("foo", "bar")); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindS3ObjectMetadataToRequest binder = injector.getInstance(BindS3ObjectMetadataToRequest.class); assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint( URI.create("http://localhost")).headers( ImmutableMultimap.of("Cache-Control", "no-cache", "x-amz-meta-foo", "bar")).build()); }
@SuppressWarnings("unchecked") @Override public <R extends HttpRequest> R bindToRequest(R request, Object input) { checkArgument(checkNotNull(input, "input") instanceof S3Object, "this binder is only valid for S3Object!, not %s", input); checkNotNull(request, "request"); S3Object s3Object = S3Object.class.cast(input); checkArgument(s3Object.getMetadata().getKey() != null, "s3Object.getMetadata().getKey() must be set!"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() != null, "contentLength must be set, streaming not supported"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() <= 5L * 1024 * 1024 * 1024, "maximum size for put object is 5GB"); StorageClass storageClass = s3Object.getMetadata().getStorageClass(); if (storageClass != StorageClass.STANDARD) { request = (R) request.toBuilder() .replaceHeader("x-amz-storage-class", storageClass.toString()) .build(); } request = metadataPrefixer.bindToRequest(request, s3Object.getMetadata().getUserMetadata()); return request; } }
@SuppressWarnings("unchecked") @Override public <R extends HttpRequest> R bindToRequest(R request, Object input) { checkArgument(checkNotNull(input, "input") instanceof S3Object, "this binder is only valid for S3Object!, not %s", input); checkNotNull(request, "request"); S3Object s3Object = S3Object.class.cast(input); checkArgument(s3Object.getMetadata().getKey() != null, "s3Object.getMetadata().getKey() must be set!"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() != null, "contentLength must be set, streaming not supported"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() <= 5L * 1024 * 1024 * 1024, "maximum size for put object is 5GB"); request = metadataPrefixer.bindToRequest(request, s3Object.getMetadata().getUserMetadata()); return request; } }
@Test public void testExtendedPropertiesBind() { S3Object object = injector.getInstance(S3Object.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(5368709120L); object.setPayload(payload); object.getMetadata().setKey("foo"); object.getMetadata().setUserMetadata(ImmutableMap.of("foo", "bar")); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindS3ObjectMetadataToRequest binder = injector.getInstance(BindS3ObjectMetadataToRequest.class); assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint( URI.create("http://localhost")).headers( ImmutableMultimap.of("x-amz-meta-foo", "bar")).build()); }
private HttpRequest putObject() throws NoSuchMethodException { S3Object object = blobToS3Object.apply(BindBlobToMultipartFormTest.TEST_BLOB); object.getMetadata().getUserMetadata().put("Adrian", "foo"); return processor.createRequest(method(S3AsyncClient.class, "putObject", String.class, S3Object.class, PutObjectOptions[].class), ImmutableList.<Object> of("bucket", object)); }
protected void assertContentEncoding(S3Object newObject, String string) { assert (newObject.getPayload().getContentMetadata().getContentEncoding().indexOf(string) != -1) : newObject .getPayload().getContentMetadata().getContentEncoding(); assert (newObject.getMetadata().getContentMetadata().getContentEncoding().indexOf(string) != -1) : newObject .getMetadata().getContentMetadata().getContentEncoding(); }
@Override public void setPayload(Payload data) { super.setPayload(data); metadata.setContentMetadata(data.getContentMetadata()); }
protected void assertCacheControl(S3Object newObject, String string) { assert (newObject.getMetadata().getCacheControl().indexOf(string) != -1) : newObject.getMetadata() .getCacheControl(); }
@Test public void testPassWithMinimumDetailsAndPayload5GB() { S3Object object = injector.getInstance(S3Object.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(5368709120L); object.setPayload(payload); object.getMetadata().setKey("foo"); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindS3ObjectMetadataToRequest binder = injector.getInstance(BindS3ObjectMetadataToRequest.class); assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint( URI.create("http://localhost")).build()); }
protected String addBlobToContainer(String sourceContainer, String key) { S3Object sourceObject = getApi().newS3Object(); sourceObject.getMetadata().setKey(key); sourceObject.getMetadata().getContentMetadata().setContentType("text/xml"); sourceObject.setPayload(TEST_STRING); return getApi().putObject(sourceContainer, sourceObject); }
public void testMetadataWithCacheControlAndContentDisposition() throws Exception { String key = "hello"; S3Object object = getApi().newS3Object(); object.getMetadata().setKey(key); object.setPayload(TEST_STRING); object.getMetadata().setCacheControl("no-cache"); object.getMetadata().getContentMetadata().setContentDisposition("attachment; filename=hello.txt"); String containerName = getContainerName(); try { getApi().putObject(containerName, object); S3Object newObject = validateObject(containerName, key); assertCacheControl(newObject, "no-cache"); assertEquals(newObject.getMetadata().getContentMetadata().getContentDisposition(), "attachment; filename=hello.txt"); } finally { returnContainer(containerName); } }
@SuppressWarnings("unchecked") @Override public <R extends HttpRequest> R bindToRequest(R request, Object input) { checkArgument(checkNotNull(input, "input") instanceof S3Object, "this binder is only valid for S3Object!, not %s", input); checkNotNull(request, "request"); S3Object s3Object = S3Object.class.cast(input); checkArgument(s3Object.getMetadata().getKey() != null, "s3Object.getMetadata().getKey() must be set!"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() != null, "contentLength must be set, streaming not supported"); checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() <= 5L * 1024 * 1024 * 1024, "maximum size for put object is 5GB"); StorageClass storageClass = s3Object.getMetadata().getStorageClass(); if (storageClass != StorageClass.STANDARD) { request = (R) request.toBuilder() .replaceHeader("x-amz-storage-class", storageClass.toString()) .build(); } request = metadataPrefixer.bindToRequest(request, s3Object.getMetadata().getUserMetadata()); return request; } }