S3StorageProvider extends StorageProviderBase { public String createHiddenSpace(String spaceId, int expirationInDays) { String bucketName = getHiddenBucketName(spaceId); try { Bucket bucket = s3Client.createBucket(bucketName); BucketLifecycleConfiguration.Rule expiresRule = new BucketLifecycleConfiguration.Rule() .withId("ExpirationRule") .withExpirationInDays(expirationInDays) .withStatus(BucketLifecycleConfiguration.ENABLED); BucketLifecycleConfiguration configuration = new BucketLifecycleConfiguration() .withRules(expiresRule); s3Client.setBucketLifecycleConfiguration(bucketName, configuration); return spaceId; } catch (AmazonClientException e) { String err = "Could not create S3 bucket with name " + bucketName + " due to error: " + e.getMessage(); throw new StorageException(err, e, RETRY); } } S3StorageProvider(String accessKey, String secretKey);  S3StorageProvider(String accessKey,
                             String secretKey,
                             Map<String, String> options);  S3StorageProvider(AmazonS3 s3Client,
                             String accessKey,
                             Map<String, String> options); @Override StorageProviderType getStorageProviderType(); Iterator<String> getSpaces(); Iterator<String> getSpaceContents(String spaceId,
                                             String prefix); List<String> getSpaceContentsChunked(String spaceId,
                                                String prefix,
                                                long maxResults,
                                                String marker); void createSpace(String spaceId); String createHiddenSpace(String spaceId, int expirationInDays); void setSpaceLifecycle(String bucketName,
                                  BucketLifecycleConfiguration config); void removeSpace(String spaceId); String addHiddenContent(String spaceId,
                                   String contentId,
                                   String contentMimeType,
                                   InputStream content); String addContent(String spaceId,
                             String contentId,
                             String contentMimeType,
                             Map<String, String> userProperties,
                             long contentSize,
                             String contentChecksum,
                             InputStream content); @Override String copyContent(String sourceSpaceId,
                              String sourceContentId,
                              String destSpaceId,
                              String destContentId); RetrievedContent getContent(String spaceId, String contentId); RetrievedContent getContent(String spaceId, String contentId, String range); void deleteContent(String spaceId, String contentId); void setContentProperties(String spaceId,
                                     String contentId,
                                     Map<String, String> contentProperties); Map<String, String> getContentProperties(String spaceId,
                                                    String contentId); @Override Map<String, String> getSpaceProperties(String spaceId); String getBucketName(String spaceId); static final String HIDDEN_SPACE_PREFIX; }
@Test public void testCreateHiddenSpace() { setupS3Client(); S3StorageProvider provider = getProvider(); String hiddenSpace = "my-hidden-space"; String bucketName = getBucketName(hiddenSpace); Capture<BucketLifecycleConfiguration> blcConfig = newCapture(); Bucket bucket = createMock(Bucket.class); expect(s3Client.createBucket(bucketName)).andReturn(bucket); s3Client.setBucketLifecycleConfiguration(eq(bucketName), capture(blcConfig)); replay(s3Client); String spaceId = provider.createHiddenSpace(hiddenSpace, 1); assertEquals("returned spaceId is not correct", hiddenSpace, spaceId); BucketLifecycleConfiguration config = blcConfig.getValue(); assertEquals("one rule is configured", 1, config.getRules().size()); BucketLifecycleConfiguration.Rule rule = config.getRules().get(0); assertEquals("rule is enabled", BucketLifecycleConfiguration.ENABLED, rule.getStatus()); assertEquals("expires = 1", 1, rule.getExpirationInDays()); }