public MutableBlobProperties apply(BlobMetadata from) { if (from == null) return null; MutableBlobProperties to = new MutableBlobPropertiesImpl(); HttpUtils.copy(from.getContentMetadata(), to.getContentMetadata()); to.setETag(from.getETag()); to.setName(from.getName()); to.setUrl(from.getUri()); to.setLastModified(from.getLastModified()); if (from.getUserMetadata() != null) { for (Entry<String, String> entry : from.getUserMetadata().entrySet()) to.getMetadata().put(entry.getKey().toLowerCase(), entry.getValue()); } return to; }
/** * parses the http response headers to create a new {@link MutableBlobProperties} object. */ public MutableBlobProperties apply(HttpResponse from) { BlobMetadata base = blobMetadataParser.apply(from); MutableBlobProperties to = blobToBlobProperties.apply(base); to.setContainer(container); return to; }
/** * parses the http response headers to create a new {@link MutableBlobProperties} object. */ public MutableBlobProperties apply(HttpResponse from) { BlobMetadata base = blobMetadataParser.apply(from); MutableBlobProperties to = blobToBlobProperties.apply(base); to.setContainer(container); String tier = from.getFirstHeaderOrNull("x-ms-access-tier"); if (tier != null) { to.setTier(AccessTier.fromValue(tier)); } return to; }
object.getProperties().setName("object"); object.setPayload(data); Payloads.calculateMD5(object); object.getProperties().getContentMetadata().setContentType("text/plain"); object.getProperties().getMetadata().put("mykey", "metadata-value"); byte[] md5 = object.getProperties().getContentMetadata().getContentMD5(); String newEtag = getApi().putBlob(privateContainer, object); assertEquals(base16().lowerCase().encode(md5), base16().lowerCase().encode(object.getProperties().getContentMetadata().getContentMD5())); BlobProperties metadata = getApi().getBlobProperties(privateContainer, object.getProperties().getName()); base16().lowerCase().encode(object.getProperties().getContentMetadata().getContentMD5())); assertEquals(metadata.getETag(), newEtag); assertEquals(metadata.getMetadata().entrySet().size(), 1); AzureBlob getBlob = getApi().getBlob(privateContainer, object.getProperties().getName()); assertEquals(Strings2.toString(getBlob.getPayload()), data); assertEquals(getBlob.getProperties().getContentMetadata().getContentType(), "text/plain"); assertEquals(base16().lowerCase().encode(md5), base16().lowerCase().encode(getBlob.getProperties().getContentMetadata().getContentMD5())); assertEquals(newEtag, getBlob.getProperties().getETag()); privateContainer, ListBlobsOptions.Builder .prefix(object.getProperties().getName().substring(0, object.getProperties().getName().length() - 1)) .maxResults(1).includeMetadata()); assertEquals(response.size(), 1);
@Override public String completeMultipartUpload(MultipartUpload mpu, List<MultipartPart> parts) { AzureBlob azureBlob = sync.newBlob(); // fake values to satisfy BindAzureBlobMetadataToMultipartRequest azureBlob.setPayload(new byte[0]); azureBlob.getProperties().setContainer(mpu.containerName()); azureBlob.getProperties().setName(mpu.blobName()); azureBlob.getProperties().setContentMetadata((MutableContentMetadata) mpu.blobMetadata().getContentMetadata()); azureBlob.getProperties().setMetadata(mpu.blobMetadata().getUserMetadata()); ImmutableList.Builder<String> blocks = ImmutableList.builder(); for (MultipartPart part : parts) { String blockId = BaseEncoding.base64().encode(Ints.toByteArray(part.partNumber())); blocks.add(blockId); } return sync.putBlockList(mpu.containerName(), azureBlob, blocks.build()); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testNoContentLengthIsBad() { AzureBlob blob = injector.getInstance(AzureBlob.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(null); blob.setPayload(payload); blob.getProperties().setName("foo"); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindAzureBlobMetadataToRequest binder = injector.getInstance(BindAzureBlobMetadataToRequest.class); binder.bindToRequest(request, blob); }
@Test(timeOut = 5 * 60 * 1000, dependsOnMethods = { "testCreateContainer" }) public void testCopyBlob() throws Exception { ByteSource byteSource = TestUtils.randomByteSource().slice(0, 1024); // create blob AzureBlob object = getApi().newBlob(); object.getProperties().setName("from"); object.setPayload(byteSource.read()); getApi().putBlob(privateContainer, object); // copy blob URI copySource = view.getSigner().signGetBlob(privateContainer, "from").getEndpoint(); getApi().copyBlob(copySource, privateContainer, "to", CopyBlobOptions.NONE); // ensure copied blob matches original AzureBlob getBlob = getApi().getBlob(privateContainer, "to"); assertEquals(ByteStreams2.toByteArrayAndClose(getBlob.getPayload().openStream()), byteSource.read()); assertThat(getBlob.getProperties().getMetadata().isEmpty()); }
@Test public void testExtendedPropertiesBind() { AzureBlob blob = injector.getInstance(AzureBlob.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(64 * 1024 * 1024l); blob.setPayload(payload); blob.getProperties().setName("foo"); blob.getProperties().setMetadata(ImmutableMap.of("foo", "bar")); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindAzureBlobMetadataToRequest binder = injector.getInstance(BindAzureBlobMetadataToRequest.class); assertEquals( binder.bindToRequest(request, blob), HttpRequest.builder().method("PUT").endpoint("http://localhost") .addHeader("x-ms-blob-type", "BlockBlob") .addHeader("x-ms-meta-foo", "bar").build()); }
public void testPutBlob() throws Exception { Invokable<?, ?> method = method(AzureBlobClient.class, "putBlob", String.class, AzureBlob.class); String payload = "payload"; String cacheControl = "max-age=3600"; AzureBlob object = getAzureBlobClient().newBlob(); object.setPayload(payload); object.getProperties().setName("blob"); object.getProperties().getContentMetadata().setCacheControl(cacheControl); object.getProperties().getContentMetadata().setContentLength(7L); GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("container", object)); assertRequestLineEquals(request, "PUT https://identity.blob.core.windows.net/container/blob HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Expect: 100-continue\n" + "x-ms-blob-cache-control: " + cacheControl + "\n" + "x-ms-blob-type: BlockBlob\n" + "x-ms-version: 2017-04-17\n"); assertPayloadEquals(request, payload, "application/unknown", false); assertResponseParserClassEquals(method, request, ParseETagHeader.class); assertSaxResponseParserClassEquals(method, null); assertFallbackClassEquals(method, null); }
@Override public void setPayload(Payload data) { super.setPayload(data); properties.setContentMetadata(data.getContentMetadata()); }
@SuppressWarnings("unchecked") @Override public <R extends HttpRequest> R bindToRequest(R request, Object input) { checkArgument(checkNotNull(input, "input") instanceof AzureBlob, "this binder is only valid for AzureBlobs!"); checkNotNull(request, "request"); AzureBlob blob = AzureBlob.class.cast(input); checkArgument(blob.getPayload().getContentMetadata().getContentLength() != null && blob.getPayload().getContentMetadata().getContentLength() >= 0, "size must be set"); Builder<String, String> headers = ImmutableMap.builder(); headers.put("x-ms-blob-type", blob.getProperties().getType().toString()); switch (blob.getProperties().getType()) { case PAGE_BLOB: headers.put(HttpHeaders.CONTENT_LENGTH, "0"); headers.put("x-ms-blob-content-length", blob.getPayload().getContentMetadata().getContentLength().toString()); break; case BLOCK_BLOB: checkArgument( checkNotNull(blob.getPayload().getContentMetadata().getContentLength(), "blob.getContentLength()") <= 64l * 1024 * 1024, "maximum size for put Blob is 64MB"); break; } request = (R) request.toBuilder().replaceHeaders(Multimaps.forMap(headers.build())).build(); return blobBinder.bindToRequest(request, azureBlob2Blob.apply(blob)); } }
ContentMetadata contentMetadata = blob.getProperties().getContentMetadata(); String cacheControl = contentMetadata.getCacheControl(); if (cacheControl != null) {
object.getProperties().setName("object"); object.setPayload(data); object.getProperties().getContentMetadata().setContentMD5(Hashing.md5().hashString(data, Charsets.UTF_8).asBytes()); object.getProperties().getContentMetadata().setContentType("text/plain"); object.getProperties().getMetadata().put("mykey", "metadata-value"); byte[] md5 = object.getProperties().getContentMetadata().getContentMD5(); String newEtag = getApi().putBlob(privateContainer, object); assertEquals(base16().lowerCase().encode(md5), base16().lowerCase().encode(object.getProperties().getContentMetadata().getContentMD5())); BlobProperties metadata = getApi().getBlobProperties(privateContainer, object.getProperties().getName()); assertEquals(metadata.getName(), object.getProperties().getName()); assertEquals(metadata.getContentMetadata().getContentLength(), Long.valueOf(data.length())); assertEquals(metadata.getContentMetadata().getContentType(), "text/plain"); assertEquals(base16().lowerCase().encode(metadata.getContentMetadata().getContentMD5()), base16().lowerCase().encode(object.getProperties().getContentMetadata().getContentMD5())); assertEquals(metadata.getETag(), newEtag); assertEquals(metadata.getMetadata().entrySet().size(), 1); .put("new_metadata_2", "value-2") .build(); String eTag = getApi().setBlobMetadata(privateContainer, object.getProperties().getName(), userMetadata); assertThat(eTag).isNotNull(); String eTag2 = getApi().setBlobMetadata(privateContainer, object.getProperties().getName(), userMetadata); assertThat(eTag2).isNotNull().isNotEqualTo(eTag); AzureBlob getBlob = getApi().getBlob(privateContainer, object.getProperties().getName()); assertEquals(Strings2.toStringAndClose(getBlob.getPayload().openStream()), data);
@Override public String completeMultipartUpload(MultipartUpload mpu, List<MultipartPart> parts) { AzureBlob azureBlob = sync.newBlob(); // fake values to satisfy BindAzureBlobMetadataToMultipartRequest azureBlob.setPayload(new byte[0]); azureBlob.getProperties().setContainer(mpu.containerName()); azureBlob.getProperties().setName(mpu.blobName()); azureBlob.getProperties().setContentMetadata((MutableContentMetadata) mpu.blobMetadata().getContentMetadata()); azureBlob.getProperties().setMetadata(mpu.blobMetadata().getUserMetadata()); ImmutableList.Builder<String> blocks = ImmutableList.builder(); for (MultipartPart part : parts) { String blockId = BaseEncoding.base64().encode(Ints.toByteArray(part.partNumber())); blocks.add(blockId); } return sync.putBlockList(mpu.containerName(), azureBlob, blocks.build()); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testOver64MBIsBad() { AzureBlob blob = injector.getInstance(AzureBlob.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(64 * 1024 * 1024l + 1); blob.setPayload(payload); blob.getProperties().setName("foo"); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindAzureBlobMetadataToRequest binder = injector.getInstance(BindAzureBlobMetadataToRequest.class); binder.bindToRequest(request, blob); }
@Test(timeOut = 5 * 60 * 1000, dependsOnMethods = { "testCreateContainer" }) public void testCopyBlobReplaceMetadata() throws Exception { ByteSource byteSource = TestUtils.randomByteSource().slice(0, 1024); // create blob AzureBlob object = getApi().newBlob(); object.getProperties().setName("from"); object.setPayload(byteSource.read()); getApi().putBlob(privateContainer, object); // copy blob URI copySource = view.getSigner().signGetBlob(privateContainer, "from").getEndpoint(); Map<String, String> newMetadata = ImmutableMap.of("foo", "bar"); getApi().copyBlob(copySource, privateContainer, "to", CopyBlobOptions.builder().overrideUserMetadata(newMetadata).build()); // ensure copied blob matches original AzureBlob getBlob = getApi().getBlob(privateContainer, "to"); assertEquals(ByteStreams2.toByteArrayAndClose(getBlob.getPayload().openStream()), byteSource.read()); assertThat(getBlob.getProperties().getMetadata()).isEqualTo(newMetadata); }
@Test public void testExtendedPropertiesBind() { AzureBlob blob = injector.getInstance(AzureBlob.Factory.class).create(null); Payload payload = Payloads.newStringPayload(""); payload.getContentMetadata().setContentLength(256 * 1024 * 1024L); blob.setPayload(payload); blob.getProperties().setName("foo"); blob.getProperties().setMetadata(ImmutableMap.of("foo", "bar")); HttpRequest request = HttpRequest.builder().method("PUT").endpoint("http://localhost").build(); BindAzureBlobMetadataToRequest binder = injector.getInstance(BindAzureBlobMetadataToRequest.class); assertEquals( binder.bindToRequest(request, blob), HttpRequest.builder().method("PUT").endpoint("http://localhost") .addHeader("x-ms-blob-type", "BlockBlob") .addHeader("x-ms-meta-foo", "bar").build()); }
@Override public void setPayload(Payload data) { super.setPayload(data); properties.setContentMetadata(data.getContentMetadata()); }
@SuppressWarnings("unchecked") @Override public <R extends HttpRequest> R bindToRequest(R request, Object input) { checkArgument(checkNotNull(input, "input") instanceof AzureBlob, "this binder is only valid for AzureBlobs!"); checkNotNull(request, "request"); AzureBlob blob = AzureBlob.class.cast(input); checkArgument(blob.getPayload().getContentMetadata().getContentLength() != null && blob.getPayload().getContentMetadata().getContentLength() >= 0, "size must be set"); Builder<String, String> headers = ImmutableMap.builder(); headers.put("x-ms-blob-type", blob.getProperties().getType().toString()); switch (blob.getProperties().getType()) { case PAGE_BLOB: headers.put(HttpHeaders.CONTENT_LENGTH, "0"); headers.put("x-ms-blob-content-length", blob.getPayload().getContentMetadata().getContentLength().toString()); break; case BLOCK_BLOB: checkArgument( checkNotNull(blob.getPayload().getContentMetadata().getContentLength(), "blob.getContentLength()") <= 64l * 1024 * 1024, "maximum size for put Blob is 64MB"); break; } request = (R) request.toBuilder().replaceHeaders(Multimaps.forMap(headers.build())).build(); return blobBinder.bindToRequest(request, azureBlob2Blob.apply(blob)); } }