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/03/31 22:15:42 UTC

[1/2] jclouds git commit: Add ReadOnlyBlobStore

Repository: jclouds
Updated Branches:
  refs/heads/master f57ccadce -> e7940d52f


Add ReadOnlyBlobStore

This prohibits mutating operations.


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e7940d52
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e7940d52
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e7940d52

Branch: refs/heads/master
Commit: e7940d52f97215dd4b842ee89c3c463f2aa8a297
Parents: 9d9acd1
Author: Andrew Gaul <ga...@apache.org>
Authored: Mon Mar 23 23:57:30 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Tue Mar 31 13:13:19 2015 -0700

----------------------------------------------------------------------
 .../blobstore/util/ReadOnlyBlobStore.java       | 124 +++++++++++++++++++
 .../blobstore/util/BlobStoreUtilsTest.java      |  28 +++++
 2 files changed, 152 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/e7940d52/blobstore/src/main/java/org/jclouds/blobstore/util/ReadOnlyBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/util/ReadOnlyBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/util/ReadOnlyBlobStore.java
new file mode 100644
index 0000000..dfb4a02
--- /dev/null
+++ b/blobstore/src/main/java/org/jclouds/blobstore/util/ReadOnlyBlobStore.java
@@ -0,0 +1,124 @@
+/*
+ * 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.blobstore.util;
+
+import org.jclouds.blobstore.BlobStore;
+import org.jclouds.blobstore.BlobStoreContext;
+import org.jclouds.blobstore.domain.Blob;
+import org.jclouds.blobstore.domain.BlobAccess;
+import org.jclouds.blobstore.domain.BlobBuilder;
+import org.jclouds.blobstore.domain.ContainerAccess;
+import org.jclouds.blobstore.options.CreateContainerOptions;
+import org.jclouds.blobstore.options.ListContainerOptions;
+import org.jclouds.blobstore.options.PutOptions;
+import org.jclouds.domain.Location;
+
+public final class ReadOnlyBlobStore extends ForwardingBlobStore {
+   public static BlobStore newReadOnlyBlobStore(BlobStore blobStore) {
+      return new ReadOnlyBlobStore(blobStore);
+   }
+
+   private ReadOnlyBlobStore(BlobStore blobStore) {
+      super(blobStore);
+   }
+
+   @Override
+   public BlobStoreContext getContext() {
+      return delegate().getContext();
+   }
+
+   @Override
+   public BlobBuilder blobBuilder(String name) {
+      return delegate().blobBuilder(name);
+   }
+
+   @Override
+   public boolean createContainerInLocation(Location location,
+         String container) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public boolean createContainerInLocation(Location location,
+         String container, CreateContainerOptions createContainerOptions) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void setContainerAccess(String container, ContainerAccess
+         containerAccess) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void clearContainer(String container) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void clearContainer(String container, ListContainerOptions options) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void deleteContainer(String container) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public boolean deleteContainerIfEmpty(String container) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void createDirectory(String container, String directory) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void deleteDirectory(String container, String directory) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public String putBlob(String containerName, Blob blob) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public String putBlob(String containerName, Blob blob,
+         PutOptions putOptions) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void removeBlob(String container, String name) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void removeBlobs(String container, Iterable<String> iterable) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+
+   @Override
+   public void setBlobAccess(String container, String name,
+         BlobAccess access) {
+      throw new UnsupportedOperationException("Read-only BlobStore");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/e7940d52/blobstore/src/test/java/org/jclouds/blobstore/util/BlobStoreUtilsTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/util/BlobStoreUtilsTest.java b/blobstore/src/test/java/org/jclouds/blobstore/util/BlobStoreUtilsTest.java
index 30b399b..7aad142 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/util/BlobStoreUtilsTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/util/BlobStoreUtilsTest.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.blobstore.util;
 
+import static org.assertj.core.api.Fail.failBecauseExceptionWasNotThrown;
 import static org.jclouds.blobstore.util.BlobStoreUtils.getNameFor;
 import static org.jclouds.reflect.Reflection2.method;
 import static org.testng.Assert.assertEquals;
@@ -30,6 +31,11 @@ import org.testng.annotations.Test;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 
+import org.jclouds.ContextBuilder;
+import org.jclouds.blobstore.BlobStore;
+import org.jclouds.blobstore.BlobStoreContext;
+import org.jclouds.blobstore.domain.Blob;
+
 @Test(groups = "unit")
 public class BlobStoreUtilsTest {
 
@@ -47,6 +53,28 @@ public class BlobStoreUtilsTest {
       assertEquals(getNameFor(request), "four");
    }
 
+   public void testReadOnlyBlobStore() {
+      BlobStoreContext context = ContextBuilder.newBuilder("transient").build(BlobStoreContext.class);
+      try {
+         BlobStore rwBlobStore = context.getBlobStore();
+         BlobStore roBlobStore = ReadOnlyBlobStore.newReadOnlyBlobStore(rwBlobStore);
+         String containerName = "name";
+         rwBlobStore.createContainerInLocation(null, containerName);
+         Blob blob = rwBlobStore.blobBuilder("blob")
+               .payload(new byte[0])
+               .build();
+         rwBlobStore.putBlob(containerName, blob);
+         try {
+            roBlobStore.putBlob(containerName, blob);
+            failBecauseExceptionWasNotThrown(UnsupportedOperationException.class);
+         } catch (UnsupportedOperationException uoe) {
+            // expected
+         }
+      } finally {
+         context.close();
+      }
+   }
+
    GeneratedHttpRequest requestForEndpointAndArgs(String endpoint, List<Object> args) {
       try {
          Invocation invocation = Invocation.create(method(String.class, "toString"), args);


[2/2] jclouds git commit: Add ForwardingBlobStore

Posted by ga...@apache.org.
Add ForwardingBlobStore

Useful for implementing various facades: encryption, read-only, etc.


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/9d9acd15
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/9d9acd15
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/9d9acd15

Branch: refs/heads/master
Commit: 9d9acd15591435e8ef6181c49211827ec6ca664c
Parents: f57ccad
Author: Andrew Gaul <ga...@apache.org>
Authored: Mon Mar 23 23:57:17 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Tue Mar 31 13:13:19 2015 -0700

----------------------------------------------------------------------
 .../blobstore/util/ForwardingBlobStore.java     | 210 +++++++++++++++++++
 1 file changed, 210 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/9d9acd15/blobstore/src/main/java/org/jclouds/blobstore/util/ForwardingBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/util/ForwardingBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/util/ForwardingBlobStore.java
new file mode 100644
index 0000000..55860ec
--- /dev/null
+++ b/blobstore/src/main/java/org/jclouds/blobstore/util/ForwardingBlobStore.java
@@ -0,0 +1,210 @@
+/*
+ * 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.blobstore.util;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Set;
+
+import com.google.common.collect.ForwardingObject;
+
+import org.jclouds.blobstore.BlobStore;
+import org.jclouds.blobstore.BlobStoreContext;
+import org.jclouds.blobstore.domain.Blob;
+import org.jclouds.blobstore.domain.BlobAccess;
+import org.jclouds.blobstore.domain.BlobBuilder;
+import org.jclouds.blobstore.domain.BlobMetadata;
+import org.jclouds.blobstore.domain.ContainerAccess;
+import org.jclouds.blobstore.domain.PageSet;
+import org.jclouds.blobstore.domain.StorageMetadata;
+import org.jclouds.blobstore.options.CreateContainerOptions;
+import org.jclouds.blobstore.options.GetOptions;
+import org.jclouds.blobstore.options.ListContainerOptions;
+import org.jclouds.blobstore.options.PutOptions;
+import org.jclouds.domain.Location;
+
+public abstract class ForwardingBlobStore extends ForwardingObject
+      implements BlobStore {
+   private final BlobStore blobStore;
+
+   public ForwardingBlobStore(BlobStore blobStore) {
+      this.blobStore = checkNotNull(blobStore);
+   }
+
+   protected BlobStore delegate() {
+      return blobStore;
+   }
+
+   @Override
+   public BlobStoreContext getContext() {
+      return delegate().getContext();
+   }
+
+   @Override
+   public BlobBuilder blobBuilder(String name) {
+      return delegate().blobBuilder(name);
+   }
+
+   @Override
+   public Set<? extends Location> listAssignableLocations() {
+      return delegate().listAssignableLocations();
+   }
+
+   @Override
+   public PageSet<? extends StorageMetadata> list() {
+      return delegate().list();
+   }
+
+   @Override
+   public boolean containerExists(String container) {
+      return delegate().containerExists(container);
+   }
+
+   @Override
+   public boolean createContainerInLocation(Location location,
+         String container) {
+      return delegate().createContainerInLocation(location, container);
+   }
+
+   @Override
+   public boolean createContainerInLocation(Location location,
+         String container, CreateContainerOptions createContainerOptions) {
+      return delegate().createContainerInLocation(location, container,
+            createContainerOptions);
+   }
+
+   @Override
+   public ContainerAccess getContainerAccess(String container) {
+      return delegate().getContainerAccess(container);
+   }
+
+   @Override
+   public void setContainerAccess(String container, ContainerAccess
+         containerAccess) {
+      delegate().setContainerAccess(container, containerAccess);
+   }
+
+   @Override
+   public PageSet<? extends StorageMetadata> list(String container) {
+      return delegate().list(container);
+   }
+
+   @Override
+   public PageSet<? extends StorageMetadata> list(String container,
+         ListContainerOptions options) {
+      return delegate().list(container, options);
+   }
+
+   @Override
+   public void clearContainer(String container) {
+      delegate().clearContainer(container);
+   }
+
+   @Override
+   public void clearContainer(String container, ListContainerOptions options) {
+      delegate().clearContainer(container, options);
+   }
+
+   @Override
+   public void deleteContainer(String container) {
+      delegate().deleteContainer(container);
+   }
+
+   @Override
+   public boolean deleteContainerIfEmpty(String container) {
+      return delegate().deleteContainerIfEmpty(container);
+   }
+
+   @Override
+   public boolean directoryExists(String container, String directory) {
+      return delegate().directoryExists(container, directory);
+   }
+
+   @Override
+   public void createDirectory(String container, String directory) {
+      delegate().createDirectory(container, directory);
+   }
+
+   @Override
+   public void deleteDirectory(String container, String directory) {
+      delegate().deleteDirectory(container, directory);
+   }
+
+   @Override
+   public boolean blobExists(String container, String name) {
+      return delegate().blobExists(container, name);
+   }
+
+   @Override
+   public String putBlob(String containerName, Blob blob) {
+      return delegate().putBlob(containerName, blob);
+   }
+
+   @Override
+   public String putBlob(String containerName, Blob blob,
+         PutOptions putOptions) {
+      return delegate().putBlob(containerName, blob, putOptions);
+   }
+
+   @Override
+   public BlobMetadata blobMetadata(String container, String name) {
+      return delegate().blobMetadata(container, name);
+   }
+
+   @Override
+   public Blob getBlob(String containerName, String blobName) {
+      return delegate().getBlob(containerName, blobName);
+   }
+
+   @Override
+   public Blob getBlob(String containerName, String blobName,
+         GetOptions getOptions) {
+      return delegate().getBlob(containerName, blobName, getOptions);
+   }
+
+   @Override
+   public void removeBlob(String container, String name) {
+      delegate().removeBlob(container, name);
+   }
+
+   @Override
+   public void removeBlobs(String container, Iterable<String> iterable) {
+      delegate().removeBlobs(container, iterable);
+   }
+
+   @Override
+   public BlobAccess getBlobAccess(String container, String name) {
+      return delegate().getBlobAccess(container, name);
+   }
+
+   @Override
+   public void setBlobAccess(String container, String name,
+         BlobAccess access) {
+      delegate().setBlobAccess(container, name, access);
+   }
+
+   @Override
+   public long countBlobs(String container) {
+      return delegate().countBlobs(container);
+   }
+
+   @Override
+   public long countBlobs(String container, ListContainerOptions options) {
+      return delegate().countBlobs(container, options);
+   }
+}