Allow setting BlobAccess in LocalBlobStore.putBlob

This addresses a race condition with filesystem users.
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 90876df..1c438df 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
@@ -522,6 +522,11 @@
 
    @Override
    public String putBlob(final String containerName, final Blob blob) throws IOException {
+      return putBlob(containerName, blob, BlobAccess.PRIVATE);
+   }
+
+   @Override
+   public String putBlob(final String containerName, final Blob blob, BlobAccess access) throws IOException {
       String blobKey = blob.getMetadata().getName();
       Payload payload = blob.getPayload();
       filesystemContainerNameValidator.validate(containerName);
@@ -579,7 +584,7 @@
             }
          }
 
-         setBlobAccess(containerName, tmpBlobName, BlobAccess.PRIVATE);
+         setBlobAccess(containerName, tmpBlobName, access);
 
          if (!tmpFile.renameTo(outputFile)) {
             throw new IOException("Could not rename file " + tmpFile + " to " + outputFile);
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
index 1a0ebd8..3a1ef50 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
@@ -114,14 +114,18 @@
      */
     Blob getBlob(String containerName, String blobName);
 
+    @Deprecated
+    String putBlob(String containerName, Blob blob) throws IOException;
+
     /**
      * Write a {@link Blob} into a file
      * @param container
      * @param blob
+     * @param access
      * @return etag of blob
      * @throws IOException
      */
-    String putBlob(String containerName, Blob blob) throws IOException;
+    String putBlob(String containerName, Blob blob, BlobAccess access) throws IOException;
 
     /**
      * Remove blob named by the given key
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
index 66e1583..9780926 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
@@ -165,6 +165,11 @@
 
    @Override
    public String putBlob(final String containerName, final Blob blob) throws IOException {
+      return putBlob(containerName, blob, BlobAccess.PRIVATE);
+   }
+
+   @Override
+   public String putBlob(final String containerName, final Blob blob, BlobAccess access) throws IOException {
       byte[] payload;
       HashCode actualHashCode;
       HashingInputStream input = new HashingInputStream(Hashing.md5(), blob.getPayload().openStream());
@@ -190,7 +195,7 @@
       Map<String, Blob> map = containerToBlobs.get(containerName);
       String blobName = newBlob.getMetadata().getName();
       map.put(blobName, newBlob);
-      containerToBlobAccess.get(containerName).put(blobName, BlobAccess.PRIVATE);
+      containerToBlobAccess.get(containerName).put(blobName, access);
       return base16().lowerCase().encode(actualHashCode.asBytes());
    }
 
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 20f5fc2..6921827 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
@@ -789,8 +789,7 @@
       }
 
       try {
-         String eTag = storageStrategy.putBlob(containerName, blob);
-         setBlobAccess(containerName, blobKey, options.getBlobAccess());
+         String eTag = storageStrategy.putBlob(containerName, blob, options.getBlobAccess());
          return eTag;
       } catch (IOException e) {
          String message = e.getMessage();