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/01 02:30:34 UTC

[1/4] jclouds git commit: JCLOUDS-660: Transient portable container ACLs

Repository: jclouds
Updated Branches:
  refs/heads/1.9.x 9c92487c2 -> e25a44eab


JCLOUDS-660: Transient portable container ACLs


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

Branch: refs/heads/1.9.x
Commit: 1bd9c46600df82b70f484a30c0678677fb98129a
Parents: 9c92487
Author: Andrew Gaul <ga...@apache.org>
Authored: Thu Mar 12 18:28:51 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Tue Mar 31 17:24:30 2015 -0700

----------------------------------------------------------------------
 .../jclouds/blobstore/LocalStorageStrategy.java  |  8 +++++++-
 .../blobstore/TransientStorageStrategy.java      | 19 ++++++++++++++++++-
 .../jclouds/blobstore/config/LocalBlobStore.java | 10 ++++------
 .../TransientContainerIntegrationTest.java       |  6 ------
 4 files changed, 29 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/1bd9c466/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
index 1cf8bac..5808267 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
@@ -19,7 +19,9 @@ package org.jclouds.blobstore;
 import java.io.IOException;
 
 import org.jclouds.blobstore.domain.Blob;
+import org.jclouds.blobstore.domain.ContainerAccess;
 import org.jclouds.blobstore.domain.StorageMetadata;
+import org.jclouds.blobstore.options.CreateContainerOptions;
 import org.jclouds.blobstore.options.ListContainerOptions;
 import org.jclouds.domain.Location;
 
@@ -47,7 +49,11 @@ public interface LocalStorageStrategy {
      * @param container
      * @return
      */
-    boolean createContainerInLocation(String container, Location location);
+    boolean createContainerInLocation(String container, Location location, CreateContainerOptions options);
+
+    ContainerAccess getContainerAccess(String container);
+
+    void setContainerAccess(String container, ContainerAccess access);
 
     /**
      * Deletes a container and all its content

http://git-wip-us.apache.org/repos/asf/jclouds/blob/1bd9c466/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
index 98d8130..3c144ef 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
@@ -30,10 +30,12 @@ import javax.inject.Inject;
 
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.Blob.Factory;
+import org.jclouds.blobstore.domain.ContainerAccess;
 import org.jclouds.blobstore.domain.MutableStorageMetadata;
 import org.jclouds.blobstore.domain.StorageMetadata;
 import org.jclouds.blobstore.domain.StorageType;
 import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
+import org.jclouds.blobstore.options.CreateContainerOptions;
 import org.jclouds.blobstore.options.ListContainerOptions;
 import org.jclouds.blobstore.util.BlobStoreUtils;
 import org.jclouds.date.DateService;
@@ -58,6 +60,7 @@ import com.google.common.net.HttpHeaders;
 public class TransientStorageStrategy implements LocalStorageStrategy {
    private final ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs = new ConcurrentHashMap<String, ConcurrentMap<String, Blob>>();
    private final ConcurrentMap<String, StorageMetadata> containerMetadata = new ConcurrentHashMap<String, StorageMetadata>();
+   private final ConcurrentMap<String, ContainerAccess> containerAccessMap = new ConcurrentHashMap<String, ContainerAccess>();
    private final Supplier<Location> defaultLocation;
    private final DateService dateService;
    private final Factory blobFactory;
@@ -83,7 +86,7 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
    }
 
    @Override
-   public boolean createContainerInLocation(final String containerName, final Location location) {
+   public boolean createContainerInLocation(String containerName, Location location, CreateContainerOptions options) {
       ConcurrentMap<String, Blob> origValue = containerToBlobs.putIfAbsent(
             containerName, new ConcurrentHashMap<String, Blob>());
       if (origValue != null) {
@@ -96,10 +99,24 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
       metadata.setLocation(location);
       metadata.setCreationDate(new Date());
       containerMetadata.put(containerName, metadata);
+
+      containerAccessMap.put(containerName, options.isPublicRead()
+            ? ContainerAccess.PUBLIC_READ : ContainerAccess.PRIVATE);
       return true;
    }
 
    @Override
+   public ContainerAccess getContainerAccess(String container) {
+      ContainerAccess access = containerAccessMap.get(container);
+      return access == null ? ContainerAccess.PRIVATE : access;
+   }
+
+   @Override
+   public void setContainerAccess(String container, ContainerAccess access) {
+      containerAccessMap.put(container, access);
+   }
+
+   @Override
    public void deleteContainer(final String containerName) {
       containerToBlobs.remove(containerName);
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/1bd9c466/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
index e779bb9..aa102e1 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
@@ -391,17 +391,17 @@ public final class LocalBlobStore implements BlobStore {
 
    @Override
    public boolean createContainerInLocation(Location location, String name) {
-      return storageStrategy.createContainerInLocation(name, location);
+      return storageStrategy.createContainerInLocation(name, location, CreateContainerOptions.NONE);
    }
 
    @Override
    public ContainerAccess getContainerAccess(String container) {
-      throw new UnsupportedOperationException("not implemented");
+      return storageStrategy.getContainerAccess(container);
    }
 
    @Override
    public void setContainerAccess(String container, ContainerAccess access) {
-      throw new UnsupportedOperationException("not implemented");
+      storageStrategy.setContainerAccess(container, access);
    }
 
    private Blob loadBlob(final String container, final String key) {
@@ -624,8 +624,6 @@ public final class LocalBlobStore implements BlobStore {
 
    @Override
    public boolean createContainerInLocation(Location location, String container, CreateContainerOptions options) {
-      if (options.isPublicRead())
-         throw new UnsupportedOperationException("publicRead");
-      return createContainerInLocation(location, container);
+      return storageStrategy.createContainerInLocation(container, location, options);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/1bd9c466/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientContainerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientContainerIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientContainerIntegrationTest.java
index 7bbf8c3..bbca99d 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientContainerIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientContainerIntegrationTest.java
@@ -32,7 +32,6 @@ import org.jclouds.blobstore.domain.StorageMetadata;
 import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
 import org.jclouds.domain.Location;
 import org.testng.annotations.Test;
-import org.testng.SkipException;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -81,9 +80,4 @@ public class TransientContainerIntegrationTest extends BaseContainerIntegrationT
       created = blobStore.createContainerInLocation(location, container);
       assertFalse(created);
    }
-
-   @Override
-   public void testSetContainerAccess() throws Exception {
-      throw new SkipException("Intentionally not implemented for the transient provider");
-   }
 }


[4/4] jclouds git commit: JCLOUDS-732: Filesystem portable object ACLs

Posted by ga...@apache.org.
JCLOUDS-732: Filesystem portable object ACLs


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

Branch: refs/heads/1.9.x
Commit: e25a44eab916a554f17be39d733242ca59d56583
Parents: eda06d0
Author: Andrew Gaul <ga...@apache.org>
Authored: Tue Mar 31 15:24:29 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Tue Mar 31 17:24:34 2015 -0700

----------------------------------------------------------------------
 .../internal/FilesystemStorageStrategyImpl.java | 32 ++++++++++++++++++++
 .../FilesystemBlobIntegrationTest.java          |  6 ----
 2 files changed, 32 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/e25a44ea/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index 53b26e7..6c57918 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -45,6 +45,7 @@ import javax.inject.Provider;
 
 import org.jclouds.blobstore.LocalStorageStrategy;
 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.domain.MutableStorageMetadata;
@@ -431,6 +432,7 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
                logger.debug("xattrs not supported on %s", outputPath);
             }
          }
+         setBlobAccess(containerName, blobKey, BlobAccess.PRIVATE);
          return base16().lowerCase().encode(actualHashCode.asBytes());
       } catch (IOException ex) {
          if (outputFile != null) {
@@ -477,6 +479,36 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
    }
 
    @Override
+   public BlobAccess getBlobAccess(String containerName, String blobName) {
+      Path path = new File(buildPathStartingFromBaseDir(containerName, blobName)).toPath();
+      Set<PosixFilePermission> permissions;
+      try {
+         permissions = getPosixFilePermissions(path);
+      } catch (IOException ioe) {
+         throw Throwables.propagate(ioe);
+      }
+      return permissions.contains(PosixFilePermission.OTHERS_READ)
+            ? BlobAccess.PUBLIC_READ : BlobAccess.PRIVATE;
+   }
+
+   @Override
+   public void setBlobAccess(String container, String name, BlobAccess access) {
+      Path path = new File(buildPathStartingFromBaseDir(container, name)).toPath();
+      Set<PosixFilePermission> permissions;
+      try {
+         permissions = getPosixFilePermissions(path);
+         if (access == BlobAccess.PRIVATE) {
+            permissions.remove(PosixFilePermission.OTHERS_READ);
+         } else if (access == BlobAccess.PUBLIC_READ) {
+            permissions.add(PosixFilePermission.OTHERS_READ);
+         }
+         setPosixFilePermissions(path, permissions);
+      } catch (IOException ioe) {
+         throw Throwables.propagate(ioe);
+      }
+   }
+
+   @Override
    public Location getLocation(final String containerName) {
       return null;
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/e25a44ea/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java
index 417a4d9..0452389 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java
@@ -27,7 +27,6 @@ import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
 import org.jclouds.filesystem.reference.FilesystemConstants;
 import org.jclouds.filesystem.utils.TestUtils;
 import org.testng.annotations.Test;
-import org.testng.SkipException;
 
 @Test(groups = { "integration" }, singleThreaded = true,  testName = "blobstore.FilesystemBlobIntegrationTest")
 public class FilesystemBlobIntegrationTest extends BaseBlobIntegrationTest {
@@ -86,9 +85,4 @@ public class FilesystemBlobIntegrationTest extends BaseBlobIntegrationTest {
          super.checkUserMetadata(userMetadata1, userMetadata2);
       }
    }
-
-   @Override
-   public void testSetBlobAccess() throws Exception {
-      throw new SkipException("Intentionally not implemented for the transient provider");
-   }
 }


[2/4] jclouds git commit: JCLOUDS-660: Filesystem portable container ACLs

Posted by ga...@apache.org.
JCLOUDS-660: Filesystem portable container ACLs


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

Branch: refs/heads/1.9.x
Commit: e829690e7ef43e481ff733feaff5c66e0213d86e
Parents: 1bd9c46
Author: Andrew Gaul <ga...@apache.org>
Authored: Thu Mar 12 18:46:22 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Tue Mar 31 17:24:31 2015 -0700

----------------------------------------------------------------------
 .../internal/FilesystemStorageStrategyImpl.java | 45 ++++++++++++++++++--
 .../FilesystemContainerIntegrationTest.java     |  6 ---
 2 files changed, 42 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/e829690e/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index 325b22c..53b26e7 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -17,7 +17,9 @@
 package org.jclouds.filesystem.strategy.internal;
 
 import static java.nio.file.Files.getFileAttributeView;
+import static java.nio.file.Files.getPosixFilePermissions;
 import static java.nio.file.Files.readAttributes;
+import static java.nio.file.Files.setPosixFilePermissions;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Strings.isNullOrEmpty;
@@ -29,6 +31,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Path;
 import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.PosixFilePermission;
 import java.nio.file.attribute.UserDefinedFileAttributeView;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
@@ -43,10 +46,12 @@ import javax.inject.Provider;
 import org.jclouds.blobstore.LocalStorageStrategy;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.BlobBuilder;
+import org.jclouds.blobstore.domain.ContainerAccess;
 import org.jclouds.blobstore.domain.MutableStorageMetadata;
 import org.jclouds.blobstore.domain.StorageMetadata;
 import org.jclouds.blobstore.domain.StorageType;
 import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
+import org.jclouds.blobstore.options.CreateContainerOptions;
 import org.jclouds.blobstore.options.ListContainerOptions;
 import org.jclouds.blobstore.reference.BlobStoreConstants;
 import org.jclouds.domain.Location;
@@ -136,11 +141,45 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
    }
 
    @Override
-   public boolean createContainerInLocation(String container, Location location) {
+   public boolean createContainerInLocation(String container, Location location, CreateContainerOptions options) {
       // TODO: implement location
       logger.debug("Creating container %s", container);
       filesystemContainerNameValidator.validate(container);
-      return createDirectoryWithResult(container, null);
+      boolean created = createDirectoryWithResult(container, null);
+      if (created) {
+         setContainerAccess(container, options.isPublicRead() ? ContainerAccess.PUBLIC_READ : ContainerAccess.PRIVATE);
+      }
+      return created;
+   }
+
+   @Override
+   public ContainerAccess getContainerAccess(String container) {
+      Path path = new File(buildPathStartingFromBaseDir(container)).toPath();
+      Set<PosixFilePermission> permissions;
+      try {
+         permissions = getPosixFilePermissions(path);
+      } catch (IOException ioe) {
+         throw Throwables.propagate(ioe);
+      }
+      return permissions.contains(PosixFilePermission.OTHERS_READ)
+            ? ContainerAccess.PUBLIC_READ : ContainerAccess.PRIVATE;
+   }
+
+   @Override
+   public void setContainerAccess(String container, ContainerAccess access) {
+      Path path = new File(buildPathStartingFromBaseDir(container)).toPath();
+      Set<PosixFilePermission> permissions;
+      try {
+         permissions = getPosixFilePermissions(path);
+         if (access == ContainerAccess.PRIVATE) {
+            permissions.remove(PosixFilePermission.OTHERS_READ);
+         } else if (access == ContainerAccess.PUBLIC_READ) {
+            permissions.add(PosixFilePermission.OTHERS_READ);
+         }
+         setPosixFilePermissions(path, permissions);
+      } catch (IOException ioe) {
+         throw Throwables.propagate(ioe);
+      }
    }
 
    @Override
@@ -449,7 +488,7 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
 
    public boolean createContainer(String container) {
       filesystemContainerNameValidator.validate(container);
-      return createContainerInLocation(container, null);
+      return createContainerInLocation(container, null, CreateContainerOptions.NONE);
    }
 
    public Blob newBlob(@ParamValidators({ FilesystemBlobKeyValidator.class }) String name) {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/e829690e/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
index 005052f..4b6cd03 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
@@ -36,7 +36,6 @@ import org.jclouds.filesystem.reference.FilesystemConstants;
 import org.jclouds.filesystem.utils.TestUtils;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
-import org.testng.SkipException;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
@@ -167,9 +166,4 @@ public class FilesystemContainerIntegrationTest extends BaseContainerIntegration
       return TestUtils.isWindowsOs() ? TestUtils.NO_INVOCATIONS
             : TestUtils.SINGLE_NO_ARG_INVOCATION;
    }
-
-   @Override
-   public void testSetContainerAccess() throws Exception {
-      throw new SkipException("Intentionally not implemented for the transient provider");
-   }
 }


[3/4] jclouds git commit: JCLOUDS-732: Transient portable object ACLs

Posted by ga...@apache.org.
JCLOUDS-732: Transient portable object ACLs


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

Branch: refs/heads/1.9.x
Commit: eda06d04546ab690ecb8aaf1cf87f4c5e454fb55
Parents: e829690
Author: Andrew Gaul <ga...@apache.org>
Authored: Tue Mar 31 15:26:20 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Tue Mar 31 17:24:32 2015 -0700

----------------------------------------------------------------------
 .../jclouds/blobstore/LocalStorageStrategy.java |  5 ++++
 .../blobstore/TransientStorageStrategy.java     | 30 +++++++++++++++++++-
 .../blobstore/config/LocalBlobStore.java        |  4 +--
 .../TransientBlobIntegrationTest.java           |  6 ----
 4 files changed, 36 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/eda06d04/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
index 5808267..6067608 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
@@ -19,6 +19,7 @@ package org.jclouds.blobstore;
 import java.io.IOException;
 
 import org.jclouds.blobstore.domain.Blob;
+import org.jclouds.blobstore.domain.BlobAccess;
 import org.jclouds.blobstore.domain.ContainerAccess;
 import org.jclouds.blobstore.domain.StorageMetadata;
 import org.jclouds.blobstore.options.CreateContainerOptions;
@@ -128,6 +129,10 @@ public interface LocalStorageStrategy {
      */
     void removeBlob(String container, String key);
 
+    BlobAccess getBlobAccess(String container, String key);
+
+    void setBlobAccess(String container, String key, BlobAccess access);
+
     /**
      * @param containerName name of container
      * @return Location of container or null

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eda06d04/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
index 3c144ef..ca8515e 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
@@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentMap;
 import javax.inject.Inject;
 
 import org.jclouds.blobstore.domain.Blob;
+import org.jclouds.blobstore.domain.BlobAccess;
 import org.jclouds.blobstore.domain.Blob.Factory;
 import org.jclouds.blobstore.domain.ContainerAccess;
 import org.jclouds.blobstore.domain.MutableStorageMetadata;
@@ -59,6 +60,7 @@ import com.google.common.net.HttpHeaders;
 
 public class TransientStorageStrategy implements LocalStorageStrategy {
    private final ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs = new ConcurrentHashMap<String, ConcurrentMap<String, Blob>>();
+   private final ConcurrentMap<String, ConcurrentMap<String, BlobAccess>> containerToBlobAccess = new ConcurrentHashMap<String, ConcurrentMap<String, BlobAccess>>();
    private final ConcurrentMap<String, StorageMetadata> containerMetadata = new ConcurrentHashMap<String, StorageMetadata>();
    private final ConcurrentMap<String, ContainerAccess> containerAccessMap = new ConcurrentHashMap<String, ContainerAccess>();
    private final Supplier<Location> defaultLocation;
@@ -92,6 +94,7 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
       if (origValue != null) {
          return false;
       }
+      containerToBlobAccess.putIfAbsent(containerName, new ConcurrentHashMap<String, BlobAccess>());
 
       MutableStorageMetadata metadata = new MutableStorageMetadataImpl();
       metadata.setName(containerName);
@@ -119,6 +122,7 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
    @Override
    public void deleteContainer(final String containerName) {
       containerToBlobs.remove(containerName);
+      containerToBlobAccess.remove(containerToBlobAccess);
    }
 
    @Override
@@ -173,7 +177,9 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
 
       Blob newBlob = createUpdatedCopyOfBlobInContainer(containerName, blob, payload, actualHashCode);
       Map<String, Blob> map = containerToBlobs.get(containerName);
-      map.put(newBlob.getMetadata().getName(), newBlob);
+      String blobName = newBlob.getMetadata().getName();
+      map.put(blobName, newBlob);
+      containerToBlobAccess.get(containerName).put(blobName, BlobAccess.PRIVATE);
       return base16().lowerCase().encode(actualHashCode.asBytes());
    }
 
@@ -185,6 +191,28 @@ public class TransientStorageStrategy implements LocalStorageStrategy {
    }
 
    @Override
+   public BlobAccess getBlobAccess(String containerName, String blobName) {
+      Map<String, BlobAccess> map = containerToBlobAccess.get(containerName);
+      if (map == null) {
+         throw new ContainerNotFoundException(containerName, "in getBlobAccess");
+      }
+      BlobAccess access = map.get(blobName);
+      if (access == null) {
+         throw new KeyNotFoundException(containerName, blobName, "in getBlobAccess");
+      }
+      return access;
+   }
+
+   @Override
+   public void setBlobAccess(String containerName, String blobName, BlobAccess access) {
+      Map<String, BlobAccess> map = containerToBlobAccess.get(containerName);
+      if (map == null) {
+         throw new ContainerNotFoundException(containerName, "in setBlobAccess");
+      }
+      map.put(blobName, access);
+   }
+
+   @Override
    public Location getLocation(final String containerName) {
       return containerMetadata.get(containerName).getLocation();
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eda06d04/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
index aa102e1..36e883d 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
@@ -347,12 +347,12 @@ public final class LocalBlobStore implements BlobStore {
 
    @Override
    public BlobAccess getBlobAccess(String container, String name) {
-      throw new UnsupportedOperationException("not implemented");
+      return storageStrategy.getBlobAccess(container, name);
    }
 
    @Override
    public void setBlobAccess(String container, String name, BlobAccess access) {
-      throw new UnsupportedOperationException("not implemented");
+      storageStrategy.setBlobAccess(container, name, access);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eda06d04/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java
index fff50ff..eeaaf96 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java
@@ -18,16 +18,10 @@ package org.jclouds.blobstore.integration;
 
 import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
 import org.testng.annotations.Test;
-import org.testng.SkipException;
 
 @Test(groups = { "integration" })
 public class TransientBlobIntegrationTest extends BaseBlobIntegrationTest {
    public TransientBlobIntegrationTest() {
       provider = "transient";
    }
-
-   @Override
-   public void testSetBlobAccess() throws Exception {
-      throw new SkipException("Intentionally not implemented for the transient provider");
-   }
 }