You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ga...@apache.org on 2015/04/09 08:21:43 UTC
[13/16] jclouds git commit: JCLOUDS-651: Azure copy object content
metadata
JCLOUDS-651: Azure copy object content metadata
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/7c275bde
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/7c275bde
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/7c275bde
Branch: refs/heads/1.9.x
Commit: 7c275bdeddfa066a8a2c8b2646ae99cca91bf89c
Parents: 0647ba8
Author: Andrew Gaul <ga...@apache.org>
Authored: Mon Apr 6 22:06:14 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Wed Apr 8 23:13:54 2015 -0700
----------------------------------------------------------------------
.../org/jclouds/azureblob/AzureBlobClient.java | 12 ++++
.../BindAzureContentMetadataToRequest.java | 59 ++++++++++++++++++++
.../azureblob/blobstore/AzureBlobStore.java | 33 +++++++++--
3 files changed, 98 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/7c275bde/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
index ed7c5f8..d34ae26 100644
--- a/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
+++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobClient.java
@@ -46,6 +46,8 @@ import org.jclouds.azure.storage.reference.AzureStorageHeaders;
import org.jclouds.azureblob.binders.BindAzureBlobMetadataToRequest;
import org.jclouds.azureblob.binders.BindAzureBlobMetadataToMultipartRequest;
import org.jclouds.azureblob.binders.BindAzureBlocksToRequest;
+import org.jclouds.azureblob.binders.BindAzureContentMetadataToRequest;
+import org.jclouds.azureblob.binders.BindAzureCopyOptionsToRequest;
import org.jclouds.azureblob.binders.BindPublicAccessToRequest;
import org.jclouds.azureblob.domain.AzureBlob;
import org.jclouds.azureblob.domain.BlobProperties;
@@ -69,6 +71,7 @@ import org.jclouds.azureblob.xml.ContainerNameEnumerationResultsHandler;
import org.jclouds.blobstore.binders.BindMapToHeadersWithPrefix;
import org.jclouds.http.functions.ParseETagHeader;
import org.jclouds.http.options.GetOptions;
+import org.jclouds.io.ContentMetadata;
import org.jclouds.io.Payload;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
@@ -412,6 +415,15 @@ public interface AzureBlobClient extends Closeable {
@PathParam("container") @ParamValidators(ContainerNameValidator.class) String container,
@PathParam("name") String name);
+ @Named("SetBlobProperties")
+ @PUT
+ @Path("{container}/{name}")
+ @QueryParams(keys = { "comp" }, values = { "metadata" })
+ @ResponseParser(ParseETagHeader.class)
+ String setBlobProperties(
+ @PathParam("container") @ParamValidators(ContainerNameValidator.class) String container,
+ @PathParam("name") String name,
+ @BinderParam(BindAzureContentMetadataToRequest.class) ContentMetadata contentMetadata);
@Named("SetBlobMetadata")
@PUT
http://git-wip-us.apache.org/repos/asf/jclouds/blob/7c275bde/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java
new file mode 100644
index 0000000..2bf496d
--- /dev/null
+++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/binders/BindAzureContentMetadataToRequest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azureblob.binders;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.io.ContentMetadata;
+import org.jclouds.rest.Binder;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Multimaps;
+
+@Singleton
+public class BindAzureContentMetadataToRequest implements Binder {
+
+ public BindAzureContentMetadataToRequest() {
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+ checkArgument(checkNotNull(input, "input") instanceof ContentMetadata,
+ "this binder is only valid for ContentMetadata");
+ checkNotNull(request, "request");
+ ContentMetadata contentMetadata = (ContentMetadata) input;
+
+ ImmutableMap.Builder<String, String> headers = ImmutableMap.builder();
+
+ String contentType = contentMetadata.getContentType();
+ if (contentType != null) {
+ headers.put("x-ms-blob-type", contentType);
+ }
+
+ String contentDisposition = contentMetadata.getContentDisposition();
+ if (contentDisposition != null) {
+ headers.put("x-ms-blob-content-disposition", contentDisposition);
+ }
+
+ return (R) request.toBuilder().replaceHeaders(Multimaps.forMap(headers.build())).build();
+ }
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/7c275bde/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java
----------------------------------------------------------------------
diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java
index ccd31b5..7e8b0e9 100644
--- a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java
+++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java
@@ -60,11 +60,13 @@ import org.jclouds.blobstore.util.BlobUtils;
import org.jclouds.collect.Memoized;
import org.jclouds.domain.Location;
import org.jclouds.http.options.GetOptions;
+import org.jclouds.io.ContentMetadata;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
+import org.jclouds.io.ContentMetadataBuilder;
import org.jclouds.io.Payload;
@Singleton
@@ -233,13 +235,32 @@ public class AzureBlobStore extends BaseBlobStore {
URI source = context.getSigner().signGetBlob(fromContainer, fromName).getEndpoint();
sync.copyBlob(source, toContainer, toName, azureOptions.build());
- String eTag = sync.getBlobProperties(toContainer, toName).getETag();
+ ContentMetadataBuilder builder = ContentMetadataBuilder.create();
- // TODO: Azure does not allow updating system metadata during copy - call SetBlobProperties (not yet implemented)
- // TODO: content disposition
- // TODO: content encoding
- // TODO: content language
- // TODO: content type
+ String eTag = null;
+
+ Optional<ContentMetadata> contentMetadata = options.getContentMetadata();
+ if (contentMetadata.isPresent()) {
+ String contentDisposition = contentMetadata.get().getContentDisposition();
+ if (contentDisposition != null) {
+ builder.contentDisposition(contentDisposition);
+ }
+
+ String contentType = contentMetadata.get().getContentType();
+ if (contentType != null) {
+ builder.contentType(contentType);
+ }
+
+ eTag = sync.setBlobProperties(toContainer, toName, builder.build());
+ }
+
+ if (userMetadata.isPresent()) {
+ eTag = sync.setBlobMetadata(toContainer, toName, userMetadata.get());
+ }
+
+ if (eTag == null) {
+ eTag = sync.getBlobProperties(toContainer, toName).getETag();
+ }
return eTag;
}