EMMA Coverage Report (generated Mon Oct 17 05:41:20 EDT 2011)
[all classes][org.jclouds.s3.blobstore]

COVERAGE SUMMARY FOR SOURCE FILE [S3BlobStore.java]

nameclass, %method, %block, %line, %
S3BlobStore.java0%   (0/3)0%   (0/21)0%   (0/326)0%   (0/50)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class S3BlobStore0%   (0/1)0%   (0/17)0%   (0/288)0%   (0/47)
S3BlobStore (BlobStoreContext, BlobUtils, Supplier, Supplier, S3Client, Bucke... 0%   (0/1)0%   (0/67)0%   (0/12)
access$000 (S3BlobStore): BucketToResourceMetadata 0%   (0/1)0%   (0/3)0%   (0/1)
access$100 (S3BlobStore): S3Client 0%   (0/1)0%   (0/3)0%   (0/1)
blobExists (String, String): boolean 0%   (0/1)0%   (0/6)0%   (0/1)
blobMetadata (String, String): BlobMetadata 0%   (0/1)0%   (0/9)0%   (0/1)
clearAndDeleteContainer (String): void 0%   (0/1)0%   (0/36)0%   (0/6)
containerExists (String): boolean 0%   (0/1)0%   (0/5)0%   (0/1)
createContainerInLocation (Location, String): boolean 0%   (0/1)0%   (0/6)0%   (0/1)
createContainerInLocation (Location, String, CreateContainerOptions): boolean 0%   (0/1)0%   (0/33)0%   (0/5)
deleteAndVerifyContainerGone (String): boolean 0%   (0/1)0%   (0/5)0%   (0/1)
deleteContainer (String): void 0%   (0/1)0%   (0/4)0%   (0/2)
getBlob (String, String, GetOptions): Blob 0%   (0/1)0%   (0/20)0%   (0/2)
list (): PageSet 0%   (0/1)0%   (0/9)0%   (0/1)
list (String, ListContainerOptions): PageSet 0%   (0/1)0%   (0/33)0%   (0/3)
putBlob (String, Blob): String 0%   (0/1)0%   (0/38)0%   (0/7)
putBlob (String, Blob, PutOptions): String 0%   (0/1)0%   (0/5)0%   (0/1)
removeBlob (String, String): void 0%   (0/1)0%   (0/6)0%   (0/2)
     
class S3BlobStore$10%   (0/1)0%   (0/2)0%   (0/16)0%   (0/2)
S3BlobStore$1 (S3BlobStore): void 0%   (0/1)0%   (0/6)0%   (0/1)
apply (Set): PageSet 0%   (0/1)0%   (0/10)0%   (0/1)
     
class S3BlobStore$20%   (0/1)0%   (0/2)0%   (0/22)0%   (0/3)
S3BlobStore$2 (S3BlobStore, String): void 0%   (0/1)0%   (0/9)0%   (0/1)
get (): Boolean 0%   (0/1)0%   (0/13)0%   (0/2)

1/**
2 * Licensed to jclouds, Inc. (jclouds) under one or more
3 * contributor license agreements.  See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership.  jclouds licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License.  You may obtain a copy of the License at
9 *
10 *   http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied.  See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19package org.jclouds.s3.blobstore;
20 
21import static com.google.common.base.Preconditions.checkNotNull;
22 
23import java.util.Map;
24import java.util.Set;
25 
26import javax.inject.Inject;
27import javax.inject.Provider;
28import javax.inject.Singleton;
29 
30import org.jclouds.blobstore.BlobStoreContext;
31import org.jclouds.blobstore.domain.Blob;
32import org.jclouds.blobstore.domain.BlobMetadata;
33import org.jclouds.blobstore.domain.PageSet;
34import org.jclouds.blobstore.domain.StorageMetadata;
35import org.jclouds.blobstore.domain.internal.PageSetImpl;
36import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
37import org.jclouds.blobstore.internal.BaseBlobStore;
38import org.jclouds.blobstore.options.CreateContainerOptions;
39import org.jclouds.blobstore.options.ListContainerOptions;
40import org.jclouds.blobstore.options.PutOptions;
41import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
42import org.jclouds.blobstore.util.BlobUtils;
43import org.jclouds.collect.Memoized;
44import org.jclouds.domain.Location;
45import org.jclouds.http.options.GetOptions;
46import org.jclouds.s3.S3Client;
47import org.jclouds.s3.blobstore.functions.BlobToObject;
48import org.jclouds.s3.blobstore.functions.BucketToResourceList;
49import org.jclouds.s3.blobstore.functions.BucketToResourceMetadata;
50import org.jclouds.s3.blobstore.functions.ContainerToBucketListOptions;
51import org.jclouds.s3.blobstore.functions.ObjectToBlob;
52import org.jclouds.s3.blobstore.functions.ObjectToBlobMetadata;
53import org.jclouds.s3.domain.AccessControlList;
54import org.jclouds.s3.domain.AccessControlList.GroupGranteeURI;
55import org.jclouds.s3.domain.AccessControlList.Permission;
56import org.jclouds.s3.domain.BucketMetadata;
57import org.jclouds.s3.domain.CannedAccessPolicy;
58import org.jclouds.s3.options.ListBucketOptions;
59import org.jclouds.s3.options.PutBucketOptions;
60import org.jclouds.s3.options.PutObjectOptions;
61import org.jclouds.s3.util.S3Utils;
62import org.jclouds.util.Assertions;
63 
64import com.google.common.base.Function;
65import com.google.common.base.Supplier;
66import com.google.common.collect.Iterables;
67 
68/**
69 * 
70 * @author Adrian Cole
71 */
72@Singleton
73public class S3BlobStore extends BaseBlobStore {
74   private final S3Client sync;
75   private final BucketToResourceMetadata bucket2ResourceMd;
76   private final ContainerToBucketListOptions container2BucketListOptions;
77   private final BucketToResourceList bucket2ResourceList;
78   private final ObjectToBlob object2Blob;
79   private final BlobToObject blob2Object;
80   private final ObjectToBlobMetadata object2BlobMd;
81   private final BlobToHttpGetOptions blob2ObjectGetOptions;
82   private final Provider<FetchBlobMetadata> fetchBlobMetadataProvider;
83   private final Map<String, AccessControlList> bucketAcls;
84 
85   @Inject
86   protected S3BlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier<Location> defaultLocation,
87         @Memoized Supplier<Set<? extends Location>> locations, S3Client sync,
88         BucketToResourceMetadata bucket2ResourceMd, ContainerToBucketListOptions container2BucketListOptions,
89         BucketToResourceList bucket2ResourceList, ObjectToBlob object2Blob,
90         BlobToHttpGetOptions blob2ObjectGetOptions, BlobToObject blob2Object, ObjectToBlobMetadata object2BlobMd,
91         Provider<FetchBlobMetadata> fetchBlobMetadataProvider, Map<String, AccessControlList> bucketAcls) {
92      super(context, blobUtils, defaultLocation, locations);
93      this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions");
94      this.sync = checkNotNull(sync, "sync");
95      this.bucket2ResourceMd = checkNotNull(bucket2ResourceMd, "bucket2ResourceMd");
96      this.container2BucketListOptions = checkNotNull(container2BucketListOptions, "container2BucketListOptions");
97      this.bucket2ResourceList = checkNotNull(bucket2ResourceList, "bucket2ResourceList");
98      this.object2Blob = checkNotNull(object2Blob, "object2Blob");
99      this.blob2Object = checkNotNull(blob2Object, "blob2Object");
100      this.object2BlobMd = checkNotNull(object2BlobMd, "object2BlobMd");
101      this.fetchBlobMetadataProvider = checkNotNull(fetchBlobMetadataProvider, "fetchBlobMetadataProvider");
102      this.bucketAcls = checkNotNull(bucketAcls, "bucketAcls");
103   }
104 
105   /**
106    * This implementation invokes {@link S3Client#listOwnedBuckets}
107    */
108   @Override
109   public PageSet<? extends StorageMetadata> list() {
110      return new Function<Set<BucketMetadata>, org.jclouds.blobstore.domain.PageSet<? extends StorageMetadata>>() {
111         public org.jclouds.blobstore.domain.PageSet<? extends StorageMetadata> apply(Set<BucketMetadata> from) {
112            return new PageSetImpl<StorageMetadata>(Iterables.transform(from, bucket2ResourceMd), null);
113         }
114      }.apply(sync.listOwnedBuckets());
115   }
116 
117   /**
118    * This implementation invokes {@link S3Client#bucketExists}
119    * 
120    * @param container
121    *           bucket name
122    */
123   @Override
124   public boolean containerExists(String container) {
125      return sync.bucketExists(container);
126   }
127 
128   /**
129    * This implementation invokes {@link S3Client#putBucketInRegion}
130    * 
131    * @param location
132    *           corresponds to a Region
133    * @param container
134    *           bucket name
135    */
136   @Override
137   public boolean createContainerInLocation(Location location, String container) {
138      return createContainerInLocation(location, container, CreateContainerOptions.NONE);
139   }
140 
141   /**
142    * This implementation invokes {@link S3Client#listBucket}
143    * 
144    * @param container
145    *           bucket name
146    */
147   @Override
148   public PageSet<? extends StorageMetadata> list(String container, ListContainerOptions options) {
149      ListBucketOptions httpOptions = container2BucketListOptions.apply(options);
150      PageSet<? extends StorageMetadata> list = bucket2ResourceList.apply(sync.listBucket(container, httpOptions));
151      return options.isDetailed() ? fetchBlobMetadataProvider.get().setContainerName(container).apply(list) : list;
152   }
153 
154   /**
155    * This implementation invokes {@link #deleteAndEnsurePathGone}
156    * 
157    * @param container
158    *           bucket name
159    */
160   @Override
161   public void deleteContainer(String container) {
162      clearAndDeleteContainer(container);
163   }
164 
165   /**
166    * This implementation invokes {@link #clearContainer} then {@link S3Client#deleteBucketIfEmpty}
167    * until it is true.
168    */
169   public void clearAndDeleteContainer(final String container) {
170      try {
171         if (!Assertions.eventuallyTrue(new Supplier<Boolean>() {
172            public Boolean get() {
173               clearContainer(container);
174               return sync.deleteBucketIfEmpty(container);
175            }
176         }, 30000)) {
177            throw new IllegalStateException(container + " still exists after deleting!");
178         }
179      } catch (InterruptedException e) {
180         new IllegalStateException(container + " interrupted during deletion!", e);
181      }
182   }
183 
184   /**
185    * This implementation invokes {@link S3Client#objectExists}
186    * 
187    * @param container
188    *           bucket name
189    * @param key
190    *           object key
191    */
192   @Override
193   public boolean blobExists(String container, String key) {
194      return sync.objectExists(container, key);
195   }
196 
197   /**
198    * This implementation invokes {@link S3Client#headObject}
199    * 
200    * @param container
201    *           bucket name
202    * @param key
203    *           object key
204    */
205   @Override
206   public BlobMetadata blobMetadata(String container, String key) {
207      return object2BlobMd.apply(sync.headObject(container, key));
208   }
209 
210   /**
211    * This implementation invokes {@link S3Client#getObject}
212    * 
213    * @param container
214    *           bucket name
215    * @param key
216    *           object key
217    */
218   @Override
219   public Blob getBlob(String container, String key, org.jclouds.blobstore.options.GetOptions optionsList) {
220      GetOptions httpOptions = blob2ObjectGetOptions.apply(optionsList);
221      return object2Blob.apply(sync.getObject(container, key, httpOptions));
222   }
223 
224   /**
225    * This implementation invokes {@link S3Client#putObject}
226    * 
227    * @param container
228    *           bucket name
229    * @param blob
230    *           object
231    */
232   @Override
233   public String putBlob(String container, Blob blob) {
234      PutObjectOptions options = new PutObjectOptions();
235      try {
236         AccessControlList acl = bucketAcls.get(container);
237         if (acl != null && acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ))
238            options.withAcl(CannedAccessPolicy.PUBLIC_READ);
239      } catch (NullPointerException e) {
240         // MapMaker
241      }
242      return sync.putObject(container, blob2Object.apply(blob), options);
243   }
244 
245   /**
246    * This implementation invokes {@link S3Client#putObject}
247    * 
248    * @param container
249    *           bucket name
250    * @param blob
251    *           object
252    */
253   @Override
254   public String putBlob(String container, Blob blob, PutOptions options) {
255      // TODO implement options
256      return putBlob(container, blob);
257   }
258 
259   /**
260    * This implementation invokes {@link S3Client#deleteObject}
261    * 
262    * @param container
263    *           bucket name
264    * @param key
265    *           object key
266    */
267   @Override
268   public void removeBlob(String container, String key) {
269      sync.deleteObject(container, key);
270   }
271 
272   /**
273    * This implementation invokes {@link S3Utils#deleteAndVerifyContainerGone}
274    */
275   protected boolean deleteAndVerifyContainerGone(final String container) {
276      return S3Utils.deleteAndVerifyContainerGone(sync, container);
277   }
278 
279   @Override
280   public boolean createContainerInLocation(Location location, String container, CreateContainerOptions options) {
281      PutBucketOptions putBucketOptions = new PutBucketOptions();
282      if (options.isPublicRead())
283         putBucketOptions.withBucketAcl(CannedAccessPolicy.PUBLIC_READ);
284      location = location != null ? location : defaultLocation.get();
285      return sync.putBucketInRegion(location.getId(), container, putBucketOptions);
286   }
287}

[all classes][org.jclouds.s3.blobstore]
EMMA 2.0.5312 (C) Vladimir Roubtsov