@Override public String putBlob(String containerName, Blob blob, PutOptions options) { long length; try (InputStream is = blob.getPayload().openStream()) { length = ByteStreams.copy(is, ByteStreams.nullOutputStream()); } catch (IOException ioe) { throw new RuntimeException(ioe); } byte[] array = Longs.toByteArray(length); ByteSourcePayload payload = new ByteSourcePayload( ByteSource.wrap(array)); payload.setContentMetadata(blob.getPayload().getContentMetadata()); payload.getContentMetadata().setContentLength((long) array.length); payload.getContentMetadata().setContentMD5((HashCode) null); blob.setPayload(payload); return super.putBlob(containerName, blob, options); }
Blob blob = blobStore.getBlob(containerName, blobName, options); if (blob == null) { throw new S3Exception(S3ErrorCode.NO_SUCH_KEY); addMetadataToResponse(request, response, blob.getMetadata()); blob.getAllHeaders().get(HttpHeaders.CONTENT_RANGE); if (!contentRanges.isEmpty()) { response.addHeader(HttpHeaders.CONTENT_RANGE, try (InputStream is = blob.getPayload().openStream(); OutputStream os = response.getOutputStream()) { ByteStreams.copy(is, os);
private void testPut(Payload payload, HashCode hashCode, Payload expectedPayload, long length, PutOptions options) throws IOException, InterruptedException { BlobStore blobStore = view.getBlobStore(); String blobName = "multipart-upload"; Map<String, String> userMetadata = ImmutableMap.of("key1", "value1", "key2", "value2"); PayloadBlobBuilder blobBuilder = blobStore.blobBuilder(blobName) .userMetadata(userMetadata) .payload(payload) .contentLength(length); addContentMetadata(blobBuilder); if (hashCode != null) { blobBuilder.contentMD5(payload.getContentMetadata().getContentMD5AsHashCode()); String etag = blobStore.putBlob(container, blobBuilder.build(), options); assertThat(etag).isNotNull(); Blob blob = blobStore.getBlob(container, blobName); assertThat(blob.getMetadata().getContentMetadata().getContentLength()).isEqualTo(length); is = blob.getPayload().openStream(); assertThat(is).hasContentEqualTo(expectedPayload.openStream()); } finally { Closeables2.closeQuietly(is); validateMetadata(blob.getMetadata(), container, blob.getMetadata().getName()); checkContentMetadata(blob); checkUserMetadata(blob.getMetadata().getUserMetadata(), userMetadata); } finally { returnContainer(container);
@Override protected void checkContentDisposition(Blob blob, String contentDisposition) { assert blob.getPayload().getContentMetadata().getContentDisposition() == null; assert blob.getMetadata().getContentMetadata().getContentDisposition() == null; }
public Blob apply(AtmosObject from) { if (from == null) return null; Blob blob = blobFactory.create(object2BlobMd.apply(from)); blob.setPayload(checkNotNull(from.getPayload(), "payload: " + from)); HttpUtils.copy(from.getContentMetadata(), blob.getPayload().getContentMetadata()); blob.setAllHeaders(from.getAllHeaders()); return blob; } }
public void testCreateListDestroyContainer() throws IOException { context.getBlobStore().createContainerInLocation(null, testContainerName); context.getBlobStore().list(testContainerName); PageSet<? extends StorageMetadata> ps = context.getBlobStore().list(); assertHasItemNamed(ps, testContainerName); Blob b = context.getBlobStore().blobBuilder("my-blob-1").payload(Streams.newInputStreamWithContents("hello world")).build(); context.getBlobStore().putBlob(testContainerName, b); Blob b2 = context.getBlobStore().getBlob(testContainerName, "my-blob-1"); Assert.assertEquals(Streams.readFullyStringAndClose(b2.getPayload().openStream()), "hello world"); context.getBlobStore().deleteContainer(testContainerName); }
@Override public Void call() throws Exception { Payload payload = Payloads.newByteSourcePayload(expected); payload.getContentMetadata().setContentType("image/png"); Blob blob = view.getBlobStore().blobBuilder(name).payload(payload).contentLength(expected.size()).build(); view.getBlobStore().putBlob(container, blob); assertConsistencyAwareBlobExists(container, name); blob = view.getBlobStore().getBlob(container, name); byte[] actual = ByteStreams2.toByteArrayAndClose(blob.getPayload().openStream()); assertThat(actual).isEqualTo(expected.read()); view.getBlobStore().removeBlob(container, name); assertConsistencyAwareBlobDoesntExist(container, name); return null; }
@Override protected void checkContentLanguage(Blob blob, String contentLanguage) { assert blob.getPayload().getContentMetadata().getContentLanguage() == null; assert blob.getMetadata().getContentMetadata().getContentLanguage() == null; }
@Override public Blob getBlob(final String container, final String key) { BlobBuilder builder = blobBuilders.get(); builder.name(key); File file = getFileForBlobKey(container, key); try { builder.payload(file).calculateMD5(); } catch (IOException e) { logger.error("An error occurred calculating MD5 for blob %s from container ", key, container); Throwables.propagateIfPossible(e); } Blob blob = builder.build(); if (blob.getPayload().getContentMetadata().getContentMD5() != null) blob.getMetadata().setETag(base16().lowerCase().encode(blob.getPayload().getContentMetadata().getContentMD5())); return blob; }
@Test(groups = { "integration", "live" }) public void test10000PartMultipartUpload() throws Exception { BlobStore blobStore = view.getBlobStore(); String container = getContainerName(); int partSize = (int) blobStore.getMinimumMultipartPartSize(); try { String name = "blob-name"; BlobBuilder blobBuilder = blobStore.blobBuilder(name); Blob blob = blobBuilder.build(); MultipartUpload mpu = blobStore.initiateMultipartUpload(container, blob.getMetadata(), new PutOptions()); ImmutableList.Builder<MultipartPart> parts = ImmutableList.builder(); byte[] content = new byte[partSize]; for (int i = 0; i < 10 * 1000; ++i) { Payload payload = Payloads.newByteArrayPayload(content); payload.getContentMetadata().setContentLength((long) partSize); parts.add(blobStore.uploadMultipartPart(mpu, i, payload)); } blobStore.completeMultipartUpload(mpu, parts.build()); BlobMetadata newBlobMetadata = blobStore.blobMetadata(container, name); assertThat(newBlobMetadata.getSize()).isEqualTo(10 * 1000 * partSize); } finally { returnContainer(container); } }
@Override public String putBlob(final String containerName, final Blob blob) throws IOException { Blob newBlob = createUpdatedCopyOfBlobInContainer(containerName, blob); Map<String, Blob> map = containerToBlobs.get(containerName); map.put(newBlob.getMetadata().getName(), newBlob); Payloads.calculateMD5(newBlob); return base16().lowerCase().encode(newBlob.getPayload().getContentMetadata().getContentMD5()); }
@Override protected void checkContentEncoding(Blob blob, String contentEncoding) { assert blob.getPayload().getContentMetadata().getContentEncoding() == null; assert blob.getMetadata().getContentMetadata().getContentEncoding() == null; }
public AtmosObject apply(Blob from) { if (from == null) return null; AtmosObject object = blobMd2Object.apply(from.getMetadata()); object.setPayload(checkNotNull(from.getPayload(), "payload: " + from)); object.setAllHeaders(from.getAllHeaders()); return object; } }
public String call() throws Exception { Blob blob = store.getBlob(container, name); Payload payload = blob.getPayload(); InputStream is = payload.getInput(); File tempFile = new File(downloadDir, name + ".tmp"); Timer.Context downloadContext = downloadTimer.time(); try { long read = 0; long length = payload.getContentMetadata().getContentLength(); OutputStream out = new FileOutputStream(tempFile, false); byte[] buf = new byte[BUF_SIZE]; tempFile.delete(); } finally { payload.release(); downloadContext.stop();
@Override @Test(groups = { "integration", "live" }, dataProvider = "gcsPutTest") public void testPutObject(String name, String type, Object content, Object realObject) throws InterruptedException, IOException { PayloadBlobBuilder blobBuilder = view.getBlobStore().blobBuilder(name).payload(Payloads.newPayload(content)) .contentType(type); addContentMetadata(blobBuilder); Blob blob = blobBuilder.build(); blob.getPayload().setContentMetadata(blob.getMetadata().getContentMetadata()); String container = getContainerName(); try { assertNotNull(view.getBlobStore().putBlob(container, blob)); blob = view.getBlobStore().getBlob(container, blob.getMetadata().getName()); validateMetadata(blob.getMetadata(), container, name); checkContentMetadata(blob); String returnedString = getContentAsStringOrNullAndClose(blob); assertEquals(returnedString, realObject); PageSet<? extends StorageMetadata> set = view.getBlobStore().list(container); assertThat(set).isNotEmpty(); } finally { returnContainer(container); } }
public void testSignPutBlobWithGenerate() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, NoSuchMethodException, IOException { Blob blob = blobFactory.get().name(blobName).payload("foo").calculateMD5().contentType("text/plain").build(); byte[] md5 = new byte[] { -84, -67, 24, -37, 76, -62, -8, 92, -19, -17, 101, 79, -52, -60, -92, -40 }; assertEquals(blob.getPayload().getContentMetadata().getContentMD5(), md5); HttpRequest request = signer.signPutBlob(containerName, blob); assertRequestLineEquals(request, "PUT " + fullUrl + " HTTP/1.1"); assertNonPayloadHeadersEqual( request, "Authorization: Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==\nContent-Length: 3\nContent-MD5: rL0Y20zC+Fzt72VPzMSk2A==\nContent-Type: text/plain\n"); assertContentHeadersEqual(request, "text/plain", null, null, null, 3L, md5, null); assertEquals(request.getFilters().size(), 0); }
public void run() { try { Blob blob = view.getBlobStore().getBlob(containerName, blobName); Date actualExpires = blob.getPayload().getContentMetadata().getExpires(); assert expectedExpires.equals(actualExpires) : "expires=" + actualExpires + "; expected=" + expectedExpires; } catch (Exception e) { Throwables.propagateIfPossible(e); } } });
@Test public void testSignPutUrl() throws Exception { String name = "hello"; String text = "fooooooooooooooooooooooo"; Blob blob = view.getBlobStore().blobBuilder(name).payload(text).contentType("image/png").build(); String container = getContainerName(); try { HttpRequest request = view.getSigner().signPutBlob(container, blob); assertEquals(request.getFilters().size(), 0); Strings2.toStringAndClose(view.utils().http().invoke(request).getPayload().openStream()); blob = view.getBlobStore().getBlob(container, name); assertThat(blob.getMetadata().getContentMetadata().getContentType()).isEqualTo("image/png"); } finally { returnContainer(container); } }
@Test public void testSignPutBlobWithTime() throws Exception { BlobStore signPutBloblWithTime = requestsSendResponses(init()); Blob blob = signPutBloblWithTime.blobBuilder(name).payload(text).contentType("text/plain").build(); HttpRequest compare = putBlobWithTime(); compare.setPayload(blob.getPayload()); assertEquals(signPutBloblWithTime.getContext().getSigner().signPutBlob(container, blob, 3l /* seconds */), compare); }
@Test(groups = { "integration", "live" }) public void testGetRangeMultipart() throws InterruptedException, IOException { String container = getContainerName(); InputStream expect = null; InputStream actual = null; try { String name = "apples"; long length = getMinimumMultipartBlobSize(); ByteSource byteSource = TestUtils.randomByteSource().slice(0, length); Blob blob = view.getBlobStore().blobBuilder(name) .payload(byteSource) .contentLength(length) .build(); view.getBlobStore().putBlob(container, blob, new PutOptions().multipart(true)); blob = view.getBlobStore().getBlob(container, name, range(0, 5)); validateMetadata(blob.getMetadata(), container, name); expect = byteSource.slice(0, 6).openStream(); actual = blob.getPayload().openStream(); assertThat(actual).hasContentEqualTo(expect); } finally { Closeables2.closeQuietly(expect); Closeables2.closeQuietly(actual); returnContainer(container); } }