Issue 462: corrected semantics of BlobMap when using inDirectory and added BlobBuilder

This commit is contained in:
Adrian Cole 2011-02-13 22:32:31 +01:00
parent 5df062ba47
commit 20c23e7962
39 changed files with 2498 additions and 2182 deletions

View File

@ -36,7 +36,7 @@ import com.google.common.base.Function;
*/ */
@Singleton @Singleton
public class ObjectToBlob implements Function<AtmosObject, Blob> { public class ObjectToBlob implements Function<AtmosObject, Blob> {
private final Blob.Factory blobFactory; private final Factory blobFactory;
private final ObjectToBlobMetadata object2BlobMd; private final ObjectToBlobMetadata object2BlobMd;
@Inject @Inject

View File

@ -129,10 +129,10 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore {
@Inject @Inject
protected FilesystemAsyncBlobStore(BlobStoreContext context, DateService dateService, Crypto crypto, protected FilesystemAsyncBlobStore(BlobStoreContext context, DateService dateService, Crypto crypto,
HttpGetOptionsListToGetOptions httpGetOptionsConverter, HttpGetOptionsListToGetOptions httpGetOptionsConverter, IfDirectoryReturnNameStrategy ifDirectoryReturnName,
IfDirectoryReturnNameStrategy ifDirectoryReturnName, Blob.Factory blobFactory, BlobUtils blobUtils, Factory blobFactory, BlobUtils blobUtils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service,
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier<Location> defaultLocation, Supplier<Location> defaultLocation, @Memoized Supplier<Set<? extends Location>> locations,
@Memoized Supplier<Set<? extends Location>> locations, FilesystemStorageStrategy storageStrategy) { FilesystemStorageStrategy storageStrategy) {
super(context, blobUtils, service, defaultLocation, locations); super(context, blobUtils, service, defaultLocation, locations);
// super(context, blobUtils, service, null, null); // super(context, blobUtils, service, null, null);
this.blobFactory = blobFactory; this.blobFactory = blobFactory;
@ -225,8 +225,8 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore {
contents = newTreeSet(filter(contents, new DelimiterFilter(prefix != null ? prefix : null, delimiter))); contents = newTreeSet(filter(contents, new DelimiterFilter(prefix != null ? prefix : null, delimiter)));
Iterables.<StorageMetadata> addAll(contents, transform(commonPrefixes, Iterables.<StorageMetadata> addAll(contents,
new Function<String, StorageMetadata>() { transform(commonPrefixes, new Function<String, StorageMetadata>() {
public StorageMetadata apply(String o) { public StorageMetadata apply(String o) {
MutableStorageMetadata md = new MutableStorageMetadataImpl(); MutableStorageMetadata md = new MutableStorageMetadataImpl();
md.setType(StorageType.RELATIVE_PATH); md.setType(StorageType.RELATIVE_PATH);

View File

@ -19,33 +19,37 @@
package org.jclouds.filesystem.strategy.internal; package org.jclouds.filesystem.strategy.internal;
import org.jclouds.rest.annotations.ParamValidators; import static com.google.common.base.Preconditions.checkNotNull;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.annotation.Resource;
import javax.inject.Provider;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.filesystem.predicates.validators.FilesystemBlobKeyValidator; import org.jclouds.filesystem.predicates.validators.FilesystemBlobKeyValidator;
import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator; import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator;
import java.io.OutputStream;
import java.util.Set;
import java.util.HashSet;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.io.Payload;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.FileFilter;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import java.util.Iterator;
import com.google.common.base.Throwables;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import java.io.File;
import javax.annotation.Resource;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import org.jclouds.filesystem.reference.FilesystemConstants; import org.jclouds.filesystem.reference.FilesystemConstants;
import org.jclouds.filesystem.strategy.FilesystemStorageStrategy; import org.jclouds.filesystem.strategy.FilesystemStorageStrategy;
import org.jclouds.io.Payload;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.rest.annotations.ParamValidators;
import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Throwables;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/** /**
* *
@ -60,21 +64,20 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
@Resource @Resource
protected Logger logger = Logger.NULL; protected Logger logger = Logger.NULL;
protected final Blob.Factory blobFactory; protected final Provider<BlobBuilder> blobBuilders;
protected final String baseDirectory; protected final String baseDirectory;
protected final FilesystemContainerNameValidator filesystemContainerNameValidator; protected final FilesystemContainerNameValidator filesystemContainerNameValidator;
protected final FilesystemBlobKeyValidator filesystemBlobKeyValidator; protected final FilesystemBlobKeyValidator filesystemBlobKeyValidator;
@Inject @Inject
protected FilesystemStorageStrategyImpl( protected FilesystemStorageStrategyImpl(Provider<BlobBuilder> blobBuilders,
Blob.Factory blobFactory,
@Named(FilesystemConstants.PROPERTY_BASEDIR) String baseDir, @Named(FilesystemConstants.PROPERTY_BASEDIR) String baseDir,
FilesystemContainerNameValidator filesystemContainerNameValidator, FilesystemContainerNameValidator filesystemContainerNameValidator,
FilesystemBlobKeyValidator filesystemBlobKeyValidator) { FilesystemBlobKeyValidator filesystemBlobKeyValidator) {
this.blobFactory = checkNotNull(blobFactory, "filesystem storage strategy blobfactory"); this.blobBuilders = checkNotNull(blobBuilders, "filesystem storage strategy blobBuilders");
this.baseDirectory = checkNotNull(baseDir, "filesystem storage strategy base directory"); this.baseDirectory = checkNotNull(baseDir, "filesystem storage strategy base directory");
this.filesystemContainerNameValidator = checkNotNull(filesystemContainerNameValidator, "filesystem container name validator"); this.filesystemContainerNameValidator = checkNotNull(filesystemContainerNameValidator,
"filesystem container name validator");
this.filesystemBlobKeyValidator = checkNotNull(filesystemBlobKeyValidator, "filesystem blob key validator"); this.filesystemBlobKeyValidator = checkNotNull(filesystemBlobKeyValidator, "filesystem blob key validator");
} }
@ -98,16 +101,15 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
return createDirectoryWithResult(container, null); return createDirectoryWithResult(container, null);
} }
@Override @Override
public void deleteContainer(String container) { public void deleteContainer(String container) {
filesystemContainerNameValidator.validate(container); filesystemContainerNameValidator.validate(container);
deleteDirectory(container, null); deleteDirectory(container, null);
} }
/** /**
* Empty the directory of its content (files and subdirectories) * Empty the directory of its content (files and subdirectories)
*
* @param container * @param container
*/ */
@Override @Override
@ -135,13 +137,10 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
} }
@Override @Override
public Blob newBlob(@ParamValidators({ FilesystemBlobKeyValidator.class }) String name) { public Blob newBlob(@ParamValidators({ FilesystemBlobKeyValidator.class }) String name) {
filesystemBlobKeyValidator.validate(name); filesystemBlobKeyValidator.validate(name);
Blob blob = blobFactory.create(null); return blobBuilders.get().name(name).build();
blob.getMetadata().setName(name);
return blob;
} }
@Override @Override
@ -158,9 +157,9 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
removeDirectoriesTreeOfBlobKey(container, blobKey); removeDirectoriesTreeOfBlobKey(container, blobKey);
} }
/** /**
* Return an iterator that reports all the containers under base path * Return an iterator that reports all the containers under base path
*
* @return * @return
*/ */
@Override @Override
@ -168,8 +167,7 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
Iterable<String> containers = new Iterable<String>() { Iterable<String> containers = new Iterable<String>() {
@Override @Override
public Iterator<String> iterator() { public Iterator<String> iterator() {
return new FileIterator( return new FileIterator(buildPathStartingFromBaseDir(), DirectoryFileFilter.INSTANCE);
buildPathStartingFromBaseDir(), DirectoryFileFilter.INSTANCE);
} }
}; };
@ -178,6 +176,7 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
/** /**
* Returns a {@link File} object that links to the blob * Returns a {@link File} object that links to the blob
*
* @param container * @param container
* @param blobKey * @param blobKey
* @return * @return
@ -191,9 +190,9 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
return blobFile; return blobFile;
} }
/** /**
* Write a {@link Blob} {@link Payload} into a file * Write a {@link Blob} {@link Payload} into a file
*
* @param container * @param container
* @param blobKey * @param blobKey
* @param payload * @param payload
@ -241,9 +240,9 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
} }
/** /**
* Returns all the blobs key inside a container * Returns all the blobs key inside a container
*
* @param container * @param container
* @return * @return
* @throws IOException * @throws IOException
@ -294,16 +293,12 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
} }
@Override @Override
public long countBlobs(String container, ListContainerOptions options) { public long countBlobs(String container, ListContainerOptions options) {
// TODO // TODO
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
// ---------------------------------------------------------- Private methods // ---------------------------------------------------------- Private methods
private boolean buildPathAndChecksIfFileExists(String... tokens) { private boolean buildPathAndChecksIfFileExists(String... tokens) {
@ -314,11 +309,11 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
/** /**
* Check if the file system resource whose name is obtained applying buildPath * Check if the file system resource whose name is obtained applying buildPath on the input path
* on the input path tokens is a directory, otherwise a RuntimeException is thrown * tokens is a directory, otherwise a RuntimeException is thrown
* *
* @param tokens the tokens that make up the name of the resource on the * @param tokens
* file system * the tokens that make up the name of the resource on the file system
*/ */
private boolean buildPathAndChecksIfDirectoryExists(String... tokens) { private boolean buildPathAndChecksIfDirectoryExists(String... tokens) {
String path = buildPathStartingFromBaseDir(tokens); String path = buildPathStartingFromBaseDir(tokens);
@ -327,11 +322,12 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
return exists; return exists;
} }
/** /**
* Facility method used to concatenate path tokens normalizing separators * Facility method used to concatenate path tokens normalizing separators
* @param pathTokens all the string in the proper order that must be concatenated *
* in order to obtain the filename * @param pathTokens
* all the string in the proper order that must be concatenated in order to obtain the
* filename
* @return the resulting string * @return the resulting string
*/ */
protected String buildPathStartingFromBaseDir(String... pathTokens) { protected String buildPathStartingFromBaseDir(String... pathTokens) {
@ -349,8 +345,9 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
/** /**
* Substitutes all the file separator occurrences in the path with a file * Substitutes all the file separator occurrences in the path with a file separator for the
* separator for the current operative system * current operative system
*
* @param pathToBeNormalized * @param pathToBeNormalized
* @return * @return
*/ */
@ -364,37 +361,43 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
/** /**
* Remove leading and trailing {@link File.separator} character from the * Remove leading and trailing {@link File.separator} character from the string.
* string. *
* @param pathToBeCleaned * @param pathToBeCleaned
* @param remove only trailing separator char from path * @param remove
* only trailing separator char from path
* @return * @return
*/ */
private String removeFileSeparatorFromBorders(String pathToBeCleaned, boolean onlyTrailing) { private String removeFileSeparatorFromBorders(String pathToBeCleaned, boolean onlyTrailing) {
if (null == pathToBeCleaned || pathToBeCleaned.equals("")) return pathToBeCleaned; if (null == pathToBeCleaned || pathToBeCleaned.equals(""))
return pathToBeCleaned;
int beginIndex = 0; int beginIndex = 0;
int endIndex = pathToBeCleaned.length(); int endIndex = pathToBeCleaned.length();
// search for separator chars // search for separator chars
if (!onlyTrailing) { if (!onlyTrailing) {
if (pathToBeCleaned.substring(0, 1).equals(File.separator)) beginIndex = 1; if (pathToBeCleaned.substring(0, 1).equals(File.separator))
beginIndex = 1;
} }
if (pathToBeCleaned.substring(pathToBeCleaned.length() - 1).equals(File.separator)) endIndex--; if (pathToBeCleaned.substring(pathToBeCleaned.length() - 1).equals(File.separator))
endIndex--;
return pathToBeCleaned.substring(beginIndex, endIndex); return pathToBeCleaned.substring(beginIndex, endIndex);
} }
/** /**
* Removes recursively the directory structure of a complex blob key, only * Removes recursively the directory structure of a complex blob key, only if the directory is
* if the directory is empty * empty
*
* @param container * @param container
* @param normalizedKey * @param normalizedKey
*/ */
private void removeDirectoriesTreeOfBlobKey(String container, String blobKey) { private void removeDirectoriesTreeOfBlobKey(String container, String blobKey) {
String normalizedBlobKey = normalize(blobKey); String normalizedBlobKey = normalize(blobKey);
// exists is no path is present in the blobkey // exists is no path is present in the blobkey
if (!normalizedBlobKey.contains(File.separator)) return; if (!normalizedBlobKey.contains(File.separator))
return;
File file = new File(normalizedBlobKey); File file = new File(normalizedBlobKey);
// TODO // TODO
@ -414,7 +417,6 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
} }
private File openFolder(String folderName) throws IOException { private File openFolder(String folderName) throws IOException {
String baseFolderName = buildPathStartingFromBaseDir(folderName); String baseFolderName = buildPathStartingFromBaseDir(folderName);
File folder = new File(baseFolderName); File folder = new File(baseFolderName);
@ -426,7 +428,6 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
return folder; return folder;
} }
private class FileIterator implements Iterator<String> { private class FileIterator implements Iterator<String> {
int currentFileIndex = 0; int currentFileIndex = 0;
File[] children = new File[0]; File[] children = new File[0];
@ -460,7 +461,6 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
} }
private void populateBlobKeysInContainer(File directory, Set<String> blobNames) { private void populateBlobKeysInContainer(File directory, Set<String> blobNames) {
File[] children = directory.listFiles(); File[] children = directory.listFiles();
for (File child : children) { for (File child : children) {
@ -472,9 +472,9 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
} }
} }
/** /**
* Creates a directory and returns the result * Creates a directory and returns the result
*
* @param container * @param container
* @param directory * @param directory
* @return true if the directory was created, otherwise false * @return true if the directory was created, otherwise false
@ -498,13 +498,15 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
/** /**
* Copy from an InputStream to an OutputStream. * Copy from an InputStream to an OutputStream.
* *
* @param input The InputStream * @param input
* @param output The OutputStream * The InputStream
* @param output
* The OutputStream
* @return the number of bytes copied * @return the number of bytes copied
* @throws IOException if an error occurs * @throws IOException
* if an error occurs
*/ */
private long copy(InputStream input, OutputStream output) private long copy(InputStream input, OutputStream output) throws IOException {
throws IOException {
byte[] buffer = new byte[COPY_BUFFER_SIZE]; byte[] buffer = new byte[COPY_BUFFER_SIZE];
long count = 0; long count = 0;
while (true) { while (true) {
@ -520,5 +522,4 @@ public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy
return count; return count;
} }
} }

View File

@ -19,14 +19,18 @@
package org.jclouds.filesystem.util.internal; package org.jclouds.filesystem.util.internal;
import com.google.inject.Inject; import static com.google.common.base.Preconditions.checkNotNull;
import javax.inject.Provider;
import org.jclouds.blobstore.AsyncBlobStore; import org.jclouds.blobstore.AsyncBlobStore;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.blobstore.util.BlobUtils; import org.jclouds.blobstore.util.BlobUtils;
import org.jclouds.filesystem.strategy.FilesystemStorageStrategy; import org.jclouds.filesystem.strategy.FilesystemStorageStrategy;
import static com.google.common.base.Preconditions.checkNotNull; import com.google.inject.Inject;
/** /**
* Implements the {@link BlobUtils} interfaced and act as a bridge to * Implements the {@link BlobUtils} interfaced and act as a bridge to
@ -37,18 +41,22 @@ import static com.google.common.base.Preconditions.checkNotNull;
public class FileSystemBlobUtilsImpl implements BlobUtils { public class FileSystemBlobUtilsImpl implements BlobUtils {
protected final FilesystemStorageStrategy storageStrategy; protected final FilesystemStorageStrategy storageStrategy;
protected final Provider<BlobBuilder> blobBuilders;
@Inject @Inject
public FileSystemBlobUtilsImpl( public FileSystemBlobUtilsImpl(FilesystemStorageStrategy storageStrategy, Provider<BlobBuilder> blobBuilders) {
FilesystemStorageStrategy storageStrategy) {
this.storageStrategy = checkNotNull(storageStrategy, "Filesystem Storage Strategy"); this.storageStrategy = checkNotNull(storageStrategy, "Filesystem Storage Strategy");
this.blobBuilders = checkNotNull(blobBuilders, "Filesystem blobBuilders");
} }
@Override @Override
public Blob newBlob(String name) { public Blob newBlob(String name) {
return storageStrategy.newBlob(name); return blobBuilder().name(name).build();
}
@Override
public BlobBuilder blobBuilder() {
return blobBuilders.get();
} }
@Override @Override

View File

@ -57,7 +57,6 @@ import org.testng.annotations.Test;
import com.google.inject.CreationException; import com.google.inject.CreationException;
/** /**
* Test class for {@link FilesystemAsyncBlobStore} class * Test class for {@link FilesystemAsyncBlobStore} class
* *
@ -68,17 +67,13 @@ public class FilesystemAsyncBlobStoreTest {
private static final String CONTAINER_NAME = "fun-blobstore-test"; private static final String CONTAINER_NAME = "fun-blobstore-test";
private static final String TARGET_CONTAINER_NAME = TestUtils.TARGET_BASE_DIR + CONTAINER_NAME; private static final String TARGET_CONTAINER_NAME = TestUtils.TARGET_BASE_DIR + CONTAINER_NAME;
private static final String LOGGING_CONFIG_KEY private static final String LOGGING_CONFIG_KEY = "java.util.logging.config.file";
= "java.util.logging.config.file"; private static final String LOGGING_CONFIG_VALUE = "src/main/resources/logging.properties";
private static final String LOGGING_CONFIG_VALUE
= "src/main/resources/logging.properties";
private static final String PROVIDER = "filesystem"; private static final String PROVIDER = "filesystem";
static { static {
System.setProperty(LOGGING_CONFIG_KEY, System.setProperty(LOGGING_CONFIG_KEY, LOGGING_CONFIG_VALUE);
LOGGING_CONFIG_VALUE);
} }
@ -91,15 +86,13 @@ public class FilesystemAsyncBlobStoreTest {
// create context for filesystem container // create context for filesystem container
Properties prop = new Properties(); Properties prop = new Properties();
prop.setProperty(FilesystemConstants.PROPERTY_BASEDIR, TestUtils.TARGET_BASE_DIR); prop.setProperty(FilesystemConstants.PROPERTY_BASEDIR, TestUtils.TARGET_BASE_DIR);
context = (BlobStoreContext) new BlobStoreContextFactory().createContext( context = (BlobStoreContext) new BlobStoreContextFactory().createContext(PROVIDER, prop);
PROVIDER, prop);
// create a container in the default location // create a container in the default location
blobStore = context.getBlobStore(); blobStore = context.getBlobStore();
resourcesToBeDeleted.add(new File(TestUtils.TARGET_BASE_DIR)); resourcesToBeDeleted.add(new File(TestUtils.TARGET_BASE_DIR));
} }
@AfterMethod @AfterMethod
protected void tearDown() { protected void tearDown() {
context.close(); context.close();
@ -117,7 +110,6 @@ public class FilesystemAsyncBlobStoreTest {
} }
} }
/** /**
* Checks if context parameters are managed in the correct way * Checks if context parameters are managed in the correct way
* *
@ -126,8 +118,7 @@ public class FilesystemAsyncBlobStoreTest {
// no base directory declared in properties // no base directory declared in properties
try { try {
Properties props = new Properties(); Properties props = new Properties();
new BlobStoreContextFactory().createContext( new BlobStoreContextFactory().createContext(PROVIDER, props);
PROVIDER, props);
fail("No error if base directory is not specified"); fail("No error if base directory is not specified");
} catch (CreationException e) { } catch (CreationException e) {
} }
@ -136,8 +127,7 @@ public class FilesystemAsyncBlobStoreTest {
try { try {
Properties props = new Properties(); Properties props = new Properties();
props.setProperty(FilesystemConstants.PROPERTY_BASEDIR, null); props.setProperty(FilesystemConstants.PROPERTY_BASEDIR, null);
new BlobStoreContextFactory().createContext( new BlobStoreContextFactory().createContext(PROVIDER, props);
PROVIDER, props);
fail("No error if base directory is null in the option"); fail("No error if base directory is null in the option");
} catch (NullPointerException e) { } catch (NullPointerException e) {
} }
@ -181,30 +171,22 @@ public class FilesystemAsyncBlobStoreTest {
assertTrue(containersRetrieved.isEmpty(), "List operation returns a not empty set of container"); assertTrue(containersRetrieved.isEmpty(), "List operation returns a not empty set of container");
} }
/** /**
* Test of list method, of class FilesystemAsyncBlobStore. * Test of list method, of class FilesystemAsyncBlobStore.
*/ */
public void testList_NoOptionSingleContainer() public void testList_NoOptionSingleContainer() throws IOException {
throws IOException {
blobStore.createContainerInLocation(null, CONTAINER_NAME); blobStore.createContainerInLocation(null, CONTAINER_NAME);
// Testing list for an empty container // Testing list for an empty container
checkForContainerContent(CONTAINER_NAME, null); checkForContainerContent(CONTAINER_NAME, null);
// creates blobs in first container // creates blobs in first container
Set<String> blobsExpected = TestUtils.createBlobsInContainer( Set<String> blobsExpected = TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] {
CONTAINER_NAME, "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg", "4rrr.jpg",
new String[] { "rrr" + File.separator + "sss" + File.separator + "788.jpg", "xdc" + File.separator + "wert.kpg" });
"bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg",
"4rrr.jpg",
"rrr" + File.separator + "sss" + File.separator + "788.jpg",
"xdc" + File.separator + "wert.kpg" }
);
checkForContainerContent(CONTAINER_NAME, blobsExpected); checkForContainerContent(CONTAINER_NAME, blobsExpected);
} }
public void testList_NotExistingContainer() { public void testList_NotExistingContainer() {
// Testing list for a not existing container // Testing list for a not existing container
try { try {
@ -233,25 +215,17 @@ public class FilesystemAsyncBlobStoreTest {
// creates blobs in first container // creates blobs in first container
Set<String> blobNamesCreatedInContainer1 = TestUtils.createBlobsInContainer( Set<String> blobNamesCreatedInContainer1 = TestUtils.createBlobsInContainer(CONTAINER_NAME,
CONTAINER_NAME, new String[] { "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg",
new String[] { TestUtils.createRandomBlobKey(), "rrr" + File.separator + "sss" + File.separator + "788.jpg",
"bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg", "xdc" + File.separator + "wert.kpg" });
TestUtils.createRandomBlobKey(),
"rrr" + File.separator + "sss" + File.separator + "788.jpg",
"xdc" + File.separator + "wert.kpg"}
);
// creates blobs in second container // creates blobs in second container
blobStore.createContainerInLocation(null, CONTAINER_NAME2); blobStore.createContainerInLocation(null, CONTAINER_NAME2);
Set<String> blobNamesCreatedInContainer2 = TestUtils.createBlobsInContainer( Set<String> blobNamesCreatedInContainer2 = TestUtils.createBlobsInContainer(CONTAINER_NAME2, new String[] {
CONTAINER_NAME2, "asd" + File.separator + "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator
new String[] { + "1234.jpg", TestUtils.createRandomBlobKey(),
"asd" + File.separator + "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg", "rrr" + File.separator + "sss" + File.separator + "788.jpg", "xdc" + File.separator + "wert.kpg" });
TestUtils.createRandomBlobKey(),
"rrr" + File.separator + "sss" + File.separator + "788.jpg",
"xdc" + File.separator + "wert.kpg" }
);
// test blobs in first container // test blobs in first container
checkForContainerContent(CONTAINER_NAME, blobNamesCreatedInContainer1); checkForContainerContent(CONTAINER_NAME, blobNamesCreatedInContainer1);
@ -259,22 +233,15 @@ public class FilesystemAsyncBlobStoreTest {
checkForContainerContent(CONTAINER_NAME2, blobNamesCreatedInContainer2); checkForContainerContent(CONTAINER_NAME2, blobNamesCreatedInContainer2);
} }
public void testList_Subdirectory() throws IOException {
public void testList_Subdirectory()
throws IOException {
blobStore.createContainerInLocation(null, CONTAINER_NAME); blobStore.createContainerInLocation(null, CONTAINER_NAME);
// Testing list for an empty container // Testing list for an empty container
checkForContainerContent(CONTAINER_NAME, null); checkForContainerContent(CONTAINER_NAME, null);
// creates blobs in first container // creates blobs in first container
Set<String> blobsExpected = TestUtils.createBlobsInContainer( Set<String> blobsExpected = TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] {
CONTAINER_NAME, "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg", "4rrr.jpg",
new String[] { "rrr" + File.separator + "sss" + File.separator + "788.jpg", "rrr" + File.separator + "wert.kpg" });
"bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg",
"4rrr.jpg",
"rrr" + File.separator + "sss" + File.separator + "788.jpg",
"rrr" + File.separator + "wert.kpg" }
);
// remove not expected values // remove not expected values
blobsExpected.remove("bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg"); blobsExpected.remove("bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg");
@ -284,17 +251,15 @@ public class FilesystemAsyncBlobStoreTest {
} }
/** /**
* TODO * TODO Should throws an exception?
* Should throws an exception?
*/ */
public void testClearContainer_NotExistingContainer() { public void testClearContainer_NotExistingContainer() {
blobStore.clearContainer(CONTAINER_NAME); blobStore.clearContainer(CONTAINER_NAME);
} }
/** /**
* Integration test, because clearContainer is not redefined in * Integration test, because clearContainer is not redefined in {@link FilesystemAsyncBlobStore}
* {@link FilesystemAsyncBlobStore} class * class
*/ */
public void testClearContainer_NoOptions() throws IOException { public void testClearContainer_NoOptions() throws IOException {
final String CONTAINER_NAME2 = "containerToClear"; final String CONTAINER_NAME2 = "containerToClear";
@ -304,25 +269,17 @@ public class FilesystemAsyncBlobStoreTest {
blobStore.createContainerInLocation(null, CONTAINER_NAME2); blobStore.createContainerInLocation(null, CONTAINER_NAME2);
// creates blobs in first container // creates blobs in first container
Set<String> blobNamesCreatedInContainer1 = TestUtils.createBlobsInContainer( Set<String> blobNamesCreatedInContainer1 = TestUtils.createBlobsInContainer(CONTAINER_NAME,
CONTAINER_NAME, new String[] { "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg",
new String[] { TestUtils.createRandomBlobKey(), "rrr" + File.separator + "sss" + File.separator + "788.jpg",
"bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg", "xdc" + File.separator + "wert.kpg" });
TestUtils.createRandomBlobKey(),
"rrr" + File.separator + "sss" + File.separator + "788.jpg",
"xdc" + File.separator + "wert.kpg"}
);
// creates blobs in second container // creates blobs in second container
blobStore.createContainerInLocation(null, CONTAINER_NAME2); blobStore.createContainerInLocation(null, CONTAINER_NAME2);
Set<String> blobNamesCreatedInContainer2 = TestUtils.createBlobsInContainer( Set<String> blobNamesCreatedInContainer2 = TestUtils.createBlobsInContainer(CONTAINER_NAME2, new String[] {
CONTAINER_NAME2, "asd" + File.separator + "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator
new String[] { + "1234.jpg", TestUtils.createRandomBlobKey(),
"asd" + File.separator + "bbb" + File.separator + "ccc" + File.separator + "ddd" + File.separator + "1234.jpg", "rrr" + File.separator + "sss" + File.separator + "788.jpg", "xdc" + File.separator + "wert.kpg" });
TestUtils.createRandomBlobKey(),
"rrr" + File.separator + "sss" + File.separator + "788.jpg",
"xdc" + File.separator + "wert.kpg" }
);
// test blobs in containers // test blobs in containers
checkForContainerContent(CONTAINER_NAME, blobNamesCreatedInContainer1); checkForContainerContent(CONTAINER_NAME, blobNamesCreatedInContainer1);
@ -337,10 +294,9 @@ public class FilesystemAsyncBlobStoreTest {
checkForContainerContent(CONTAINER_NAME2, null); checkForContainerContent(CONTAINER_NAME2, null);
} }
/** /**
* Integration test, because countBlobs is not redefined in * Integration test, because countBlobs is not redefined in {@link FilesystemAsyncBlobStore}
* {@link FilesystemAsyncBlobStore} class * class
*/ */
public void testCountBlobs_NotExistingContainer() { public void testCountBlobs_NotExistingContainer() {
try { try {
@ -351,8 +307,8 @@ public class FilesystemAsyncBlobStoreTest {
} }
/** /**
* Integration test, because countBlobs is not redefined in * Integration test, because countBlobs is not redefined in {@link FilesystemAsyncBlobStore}
* {@link FilesystemAsyncBlobStore} class * class
*/ */
public void testCountBlobs_NoOptionsEmptyContainer() { public void testCountBlobs_NoOptionsEmptyContainer() {
blobStore.createContainerInLocation(null, CONTAINER_NAME); blobStore.createContainerInLocation(null, CONTAINER_NAME);
@ -364,8 +320,8 @@ public class FilesystemAsyncBlobStoreTest {
} }
/** /**
* Integration test, because countBlobs is not redefined in * Integration test, because countBlobs is not redefined in {@link FilesystemAsyncBlobStore}
* {@link FilesystemAsyncBlobStore} class * class
*/ */
public void testCountBlobs_NoOptions() { public void testCountBlobs_NoOptions() {
blobStore.createContainerInLocation(null, CONTAINER_NAME); blobStore.createContainerInLocation(null, CONTAINER_NAME);
@ -376,7 +332,6 @@ public class FilesystemAsyncBlobStoreTest {
} }
} }
public void testRemoveBlob_SimpleBlobKey() throws IOException { public void testRemoveBlob_SimpleBlobKey() throws IOException {
final String BLOB_KEY = TestUtils.createRandomBlobKey(null, ".txt"); final String BLOB_KEY = TestUtils.createRandomBlobKey(null, ".txt");
boolean result; boolean result;
@ -388,10 +343,7 @@ public class FilesystemAsyncBlobStoreTest {
assertFalse(result, "Blob exists"); assertFalse(result, "Blob exists");
// create the blob // create the blob
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] { BLOB_KEY });
CONTAINER_NAME,
new String[] { BLOB_KEY }
);
result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY); result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
assertTrue(result, "Blob exists"); assertTrue(result, "Blob exists");
@ -402,7 +354,6 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.fileExists(TARGET_CONTAINER_NAME + File.separator + BLOB_KEY, false); TestUtils.fileExists(TARGET_CONTAINER_NAME + File.separator + BLOB_KEY, false);
} }
public void testRemoveBlob_TwoSimpleBlobKeys() throws IOException { public void testRemoveBlob_TwoSimpleBlobKeys() throws IOException {
final String BLOB_KEY1 = TestUtils.createRandomBlobKey(null, null); final String BLOB_KEY1 = TestUtils.createRandomBlobKey(null, null);
final String BLOB_KEY2 = TestUtils.createRandomBlobKey(null, null); final String BLOB_KEY2 = TestUtils.createRandomBlobKey(null, null);
@ -416,10 +367,7 @@ public class FilesystemAsyncBlobStoreTest {
assertFalse(result, "Blob2 exists"); assertFalse(result, "Blob2 exists");
// create the blob // create the blob
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] { BLOB_KEY1, BLOB_KEY2 });
CONTAINER_NAME,
new String[] { BLOB_KEY1, BLOB_KEY2 }
);
result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1); result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
assertTrue(result, "Blob " + BLOB_KEY1 + " doesn't exist"); assertTrue(result, "Blob " + BLOB_KEY1 + " doesn't exist");
result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2); result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
@ -440,7 +388,6 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.fileExists(TARGET_CONTAINER_NAME + File.separator + BLOB_KEY2, false); TestUtils.fileExists(TARGET_CONTAINER_NAME + File.separator + BLOB_KEY2, false);
} }
/** /**
* Test of removeBlob method, with only one blob with a complex path as key * Test of removeBlob method, with only one blob with a complex path as key
*/ */
@ -455,10 +402,7 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.fileExists(TARGET_CONTAINER_NAME + File.separator + BLOB_KEY, false); TestUtils.fileExists(TARGET_CONTAINER_NAME + File.separator + BLOB_KEY, false);
// create the blob // create the blob
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] { BLOB_KEY });
CONTAINER_NAME,
new String[] { BLOB_KEY }
);
result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY); result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
assertTrue(result, "Blob doesn't exist"); assertTrue(result, "Blob doesn't exist");
@ -472,11 +416,9 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.directoryExists(TARGET_CONTAINER_NAME + "/aa", false); TestUtils.directoryExists(TARGET_CONTAINER_NAME + "/aa", false);
} }
/** /**
* Test of removeBlob method, with two blobs with a complex path as key and * Test of removeBlob method, with two blobs with a complex path as key and when first blob is
* when first blob is removed, not all of its key's path is removed, because * removed, not all of its key's path is removed, because it is shared with the second blob's key
* it is shared with the second blob's key
*/ */
public void testRemoveBlob_TwoComplexBlobKeys() throws IOException { public void testRemoveBlob_TwoComplexBlobKeys() throws IOException {
final String BLOB_KEY1 = TestUtils.createRandomBlobKey("aa/bb/cc/dd/", null); final String BLOB_KEY1 = TestUtils.createRandomBlobKey("aa/bb/cc/dd/", null);
@ -492,10 +434,7 @@ public class FilesystemAsyncBlobStoreTest {
assertFalse(result, "Blob2 exists"); assertFalse(result, "Blob2 exists");
// create the blobs // create the blobs
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] { BLOB_KEY1, BLOB_KEY2 });
CONTAINER_NAME,
new String[] { BLOB_KEY1, BLOB_KEY2 }
);
result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1); result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
assertTrue(result, "Blob " + BLOB_KEY1 + " doesn't exist"); assertTrue(result, "Blob " + BLOB_KEY1 + " doesn't exist");
result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2); result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
@ -521,7 +460,6 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.directoryExists(TARGET_CONTAINER_NAME + "/aa", false); TestUtils.directoryExists(TARGET_CONTAINER_NAME + "/aa", false);
} }
/** /**
* Test of containerExists method, of class FilesystemAsyncBlobStore. * Test of containerExists method, of class FilesystemAsyncBlobStore.
*/ */
@ -538,7 +476,6 @@ public class FilesystemAsyncBlobStoreTest {
assertTrue(result, "Container doesn't exist"); assertTrue(result, "Container doesn't exist");
} }
/** /**
* Test of createContainerInLocation method, of class FilesystemAsyncBlobStore. * Test of createContainerInLocation method, of class FilesystemAsyncBlobStore.
*/ */
@ -568,11 +505,9 @@ public class FilesystemAsyncBlobStoreTest {
FileUtils.forceDelete(new File(TARGET_CONTAINER_NAME2)); FileUtils.forceDelete(new File(TARGET_CONTAINER_NAME2));
} }
/** /**
* Test of putBlob method, of class FilesystemAsyncBlobStore. * Test of putBlob method, of class FilesystemAsyncBlobStore. with a simple filename - no path in
* with a simple filename - no path in the filename, eg * the filename, eg filename.jpg
* filename.jpg
*/ */
public void testPutBlobSimpleName() { public void testPutBlobSimpleName() {
blobStore.createContainerInLocation(null, CONTAINER_NAME); blobStore.createContainerInLocation(null, CONTAINER_NAME);
@ -581,8 +516,7 @@ public class FilesystemAsyncBlobStoreTest {
} }
/** /**
* Test of putBlob method with a complex key, with path in the filename, eg * Test of putBlob method with a complex key, with path in the filename, eg picture/filename.jpg
* picture/filename.jpg
*/ */
public void testPutBlobComplexName1() { public void testPutBlobComplexName1() {
blobStore.createContainerInLocation(null, CONTAINER_NAME); blobStore.createContainerInLocation(null, CONTAINER_NAME);
@ -593,8 +527,7 @@ public class FilesystemAsyncBlobStoreTest {
} }
/** /**
* Test of putBlob method with a complex key, with path in the filename, eg * Test of putBlob method with a complex key, with path in the filename, eg picture/filename.jpg
* picture/filename.jpg
*/ */
public void testPutBlobComplexName2() { public void testPutBlobComplexName2() {
blobStore.createContainerInLocation(null, CONTAINER_NAME); blobStore.createContainerInLocation(null, CONTAINER_NAME);
@ -603,7 +536,6 @@ public class FilesystemAsyncBlobStoreTest {
putBlobAndCheckIt(TestUtils.createRandomBlobKey("putBlob-", ".jpg")); putBlobAndCheckIt(TestUtils.createRandomBlobKey("putBlob-", ".jpg"));
} }
/** /**
* Test of blobExists method, of class FilesystemAsyncBlobStore. * Test of blobExists method, of class FilesystemAsyncBlobStore.
*/ */
@ -635,7 +567,6 @@ public class FilesystemAsyncBlobStoreTest {
assertTrue(result, "Blob doesn't exist"); assertTrue(result, "Blob doesn't exist");
} }
public void testGetBlob_NotExistingContainer() { public void testGetBlob_NotExistingContainer() {
try { try {
blobStore.getBlob(CONTAINER_NAME, TestUtils.createRandomBlobKey(), null); blobStore.getBlob(CONTAINER_NAME, TestUtils.createRandomBlobKey(), null);
@ -659,9 +590,7 @@ public class FilesystemAsyncBlobStoreTest {
assertNull(resultBlob, "Blob exists"); assertNull(resultBlob, "Blob exists");
// create blob // create blob
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] { blobKey });
CONTAINER_NAME,
new String[]{blobKey});
resultBlob = blobStore.getBlob(CONTAINER_NAME, blobKey, options); resultBlob = blobStore.getBlob(CONTAINER_NAME, blobKey, options);
@ -677,14 +606,10 @@ public class FilesystemAsyncBlobStoreTest {
assertEquals(blobKey, metadata.getName(), "Wrong blob metadata"); assertEquals(blobKey, metadata.getName(), "Wrong blob metadata");
} }
public void testBlobMetadata_withDefaultMetadata() throws IOException { public void testBlobMetadata_withDefaultMetadata() throws IOException {
String BLOB_KEY = TestUtils.createRandomBlobKey(null, null); String BLOB_KEY = TestUtils.createRandomBlobKey(null, null);
// create the blob // create the blob
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] { BLOB_KEY });
CONTAINER_NAME,
new String[]{ BLOB_KEY }
);
BlobMetadata metadata = blobStore.blobMetadata(CONTAINER_NAME, BLOB_KEY); BlobMetadata metadata = blobStore.blobMetadata(CONTAINER_NAME, BLOB_KEY);
assertNotNull(metadata, "Metadata null"); assertNotNull(metadata, "Metadata null");
@ -705,7 +630,6 @@ public class FilesystemAsyncBlobStoreTest {
// assertEquals(metadata.getETag(), "105cf4e6c052d65352dabd20028ff102", "Wrong blob ETag"); // assertEquals(metadata.getETag(), "105cf4e6c052d65352dabd20028ff102", "Wrong blob ETag");
} }
public void testDeleteContainer_NotExistingContainer() { public void testDeleteContainer_NotExistingContainer() {
try { try {
blobStore.deleteContainer(CONTAINER_NAME); blobStore.deleteContainer(CONTAINER_NAME);
@ -729,7 +653,6 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.directoryExists(TARGET_CONTAINER_NAME, false); TestUtils.directoryExists(TARGET_CONTAINER_NAME, false);
} }
public void testDeleteContainer() throws IOException { public void testDeleteContainer() throws IOException {
boolean result; boolean result;
String CONTAINER_NAME2 = "container-to-delete"; String CONTAINER_NAME2 = "container-to-delete";
@ -745,21 +668,15 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.directoryExists(TARGET_CONTAINER_NAME2, true); TestUtils.directoryExists(TARGET_CONTAINER_NAME2, true);
// create blobs inside container // create blobs inside container
TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] {
TestUtils.createRandomBlobKey("testutils-", null), TestUtils.createRandomBlobKey("testutils-", null),
TestUtils.createRandomBlobKey("ab123s" + File.separator + "testutils-", null), });
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(
CONTAINER_NAME, CONTAINER_NAME,
new String[]{ new String[] { TestUtils.createRandomBlobKey("testutils-", null),
TestUtils.createRandomBlobKey("testutils-", null),
TestUtils.createRandomBlobKey("testutils-", null),
TestUtils.createRandomBlobKey("ab123s" + File.separator + "testutils-", null),
});
TestUtils.createBlobsInContainer(
CONTAINER_NAME,
new String[]{
TestUtils.createRandomBlobKey("testutils-", null),
TestUtils.createRandomBlobKey("testutils-", null), TestUtils.createRandomBlobKey("testutils-", null),
TestUtils.createRandomBlobKey("asda123s" + File.separator + "testutils-", null), TestUtils.createRandomBlobKey("asda123s" + File.separator + "testutils-", null),
TestUtils.createRandomBlobKey("123-_3s" + File.separator + "testutils-", null), TestUtils.createRandomBlobKey("123-_3s" + File.separator + "testutils-", null), });
});
// delete first container // delete first container
blobStore.deleteContainer(CONTAINER_NAME); blobStore.deleteContainer(CONTAINER_NAME);
@ -776,16 +693,17 @@ public class FilesystemAsyncBlobStoreTest {
TestUtils.directoryExists(TARGET_CONTAINER_NAME2, false); TestUtils.directoryExists(TARGET_CONTAINER_NAME2, false);
} }
public void testInvalidContainerName() { public void testInvalidContainerName() {
try { try {
blobStore.createContainerInLocation(null, "file/system"); blobStore.createContainerInLocation(null, "file/system");
fail("Wrong container name not recognized"); fail("Wrong container name not recognized");
} catch (IllegalArgumentException e) {} } catch (IllegalArgumentException e) {
}
try { try {
blobStore.containerExists("file/system"); blobStore.containerExists("file/system");
fail("Wrong container name not recognized"); fail("Wrong container name not recognized");
} catch (IllegalArgumentException e) {} } catch (IllegalArgumentException e) {
}
} }
// public void testInvalidBlobKey() { // public void testInvalidBlobKey() {
@ -800,26 +718,22 @@ public class FilesystemAsyncBlobStoreTest {
// } catch (IllegalArgumentException e) {} // } catch (IllegalArgumentException e) {}
// } // }
// ---------------------------------------------------------- Private Methods // ---------------------------------------------------------- Private Methods
/** /**
* Creates a {@link Blob} object filled with data from a file * Creates a {@link Blob} object filled with data from a file
*
* @param keyName * @param keyName
* @param fileContent * @param fileContent
* @return * @return
*/ */
private Blob createBlob(String keyName, File filePayload) { private Blob createBlob(String keyName, File filePayload) {
Blob blob = blobStore.newBlob(keyName); return blobStore.blobBuilder(keyName).payload(filePayload).build();
blob.setPayload(filePayload);
return blob;
} }
/** /**
* Tests if container contains only the expected blobs * Tests if container contains only the expected blobs
*
* @param containerName * @param containerName
* @param expectedBlobKeys * @param expectedBlobKeys
*/ */
@ -829,7 +743,8 @@ public class FilesystemAsyncBlobStoreTest {
private void checkForContainerContent(final String containerName, String inDirectory, Set<String> expectedBlobKeys) { private void checkForContainerContent(final String containerName, String inDirectory, Set<String> expectedBlobKeys) {
ListContainerOptions options = ListContainerOptions.Builder.recursive(); ListContainerOptions options = ListContainerOptions.Builder.recursive();
if (null != inDirectory && !"".equals(inDirectory)) options.inDirectory(inDirectory); if (null != inDirectory && !"".equals(inDirectory))
options.inDirectory(inDirectory);
PageSet<? extends StorageMetadata> blobsRetrieved = blobStore.list(containerName, options); PageSet<? extends StorageMetadata> blobsRetrieved = blobStore.list(containerName, options);
@ -844,14 +759,16 @@ public class FilesystemAsyncBlobStoreTest {
for (String value : expectedBlobKeys) { for (String value : expectedBlobKeys) {
expectedBlobKeysCopy.add(value); expectedBlobKeysCopy.add(value);
} }
assertEquals(blobsRetrieved.size(), expectedBlobKeysCopy.size(), "Wrong blob number retrieved in the containter [" + containerName + "]"); assertEquals(blobsRetrieved.size(), expectedBlobKeysCopy.size(),
"Wrong blob number retrieved in the containter [" + containerName + "]");
for (StorageMetadata data : blobsRetrieved) { for (StorageMetadata data : blobsRetrieved) {
String blobName = data.getName(); String blobName = data.getName();
if (!expectedBlobKeysCopy.remove(blobName)) { if (!expectedBlobKeysCopy.remove(blobName)) {
fail("List for container [" + containerName + "] contains unexpected value [" + blobName + "]"); fail("List for container [" + containerName + "] contains unexpected value [" + blobName + "]");
} }
} }
assertTrue(expectedBlobKeysCopy.isEmpty(), "List operation for container [" + containerName + "] doesn't return all values."); assertTrue(expectedBlobKeysCopy.isEmpty(), "List operation for container [" + containerName
+ "] doesn't return all values.");
} }
/** /**

View File

@ -31,6 +31,7 @@ import org.jclouds.blobstore.domain.StorageMetadata;
import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest; import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
/** /**
@ -45,19 +46,16 @@ public class FilesystemContainerIntegrationTest extends BaseContainerIntegration
String key = "hello"; String key = "hello";
Blob object = context.getBlobStore().newBlob(key);
object.setPayload(TEST_STRING);
object.getMetadata().getContentMetadata().setContentType(MediaType.TEXT_PLAIN);
// NOTE all metadata in jclouds comes out as lowercase, in an effort to normalize the // NOTE all metadata in jclouds comes out as lowercase, in an effort to normalize the
// providers. // providers.
object.getMetadata().getUserMetadata().put("Adrian", "powderpuff"); Blob object = context.getBlobStore().blobBuilder(key).userMetadata(ImmutableMap.of("Adrian", "powderpuff"))
.payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN).build();
String containerName = getContainerName(); String containerName = getContainerName();
try { try {
addBlobToContainer(containerName, object); addBlobToContainer(containerName, object);
validateContent(containerName, key); validateContent(containerName, key);
PageSet<? extends StorageMetadata> container = context.getBlobStore().list(containerName, PageSet<? extends StorageMetadata> container = context.getBlobStore().list(containerName, maxResults(1));
maxResults(1));
BlobMetadata metadata = (BlobMetadata) Iterables.getOnlyElement(container); BlobMetadata metadata = (BlobMetadata) Iterables.getOnlyElement(container);
// transient container should be lenient and not return metadata on undetailed listing. // transient container should be lenient and not return metadata on undetailed listing.

View File

@ -19,12 +19,12 @@
package org.jclouds.filesystem.strategy.internal; package org.jclouds.filesystem.strategy.internal;
import java.util.List; import static org.testng.Assert.assertEquals;
import java.util.Set; import static org.testng.Assert.assertFalse;
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl; import static org.testng.Assert.assertNotNull;
import org.jclouds.blobstore.domain.internal.BlobImpl; import static org.testng.Assert.assertTrue;
import org.jclouds.blobstore.domain.MutableBlobMetadata; import static org.testng.Assert.fail;
import org.jclouds.blobstore.domain.Blob;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
@ -32,15 +32,23 @@ import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.inject.Provider;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.internal.BlobBuilderImpl;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.filesystem.predicates.validators.internal.FilesystemContainerNameValidatorImpl;
import org.jclouds.filesystem.predicates.validators.internal.FilesystemBlobKeyValidatorImpl; import org.jclouds.filesystem.predicates.validators.internal.FilesystemBlobKeyValidatorImpl;
import org.jclouds.filesystem.predicates.validators.internal.FilesystemContainerNameValidatorImpl;
import org.jclouds.filesystem.strategy.FilesystemStorageStrategy; import org.jclouds.filesystem.strategy.FilesystemStorageStrategy;
import org.jclouds.filesystem.utils.TestUtils; import org.jclouds.filesystem.utils.TestUtils;
import org.jclouds.io.payloads.FilePayload; import org.jclouds.io.payloads.FilePayload;
import org.testng.annotations.*; import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import static org.testng.Assert.*; import org.testng.annotations.Test;
/** /**
* Test class for {@link FilesystemStorageStrategyImpl } class * Test class for {@link FilesystemStorageStrategyImpl } class
@ -58,34 +66,28 @@ public class FilesystemStorageStrategyImplTest {
private static final String FS = File.separator; private static final String FS = File.separator;
static { static {
System.setProperty(LOGGING_CONFIG_KEY, System.setProperty(LOGGING_CONFIG_KEY, LOGGING_CONFIG_VALUE);
LOGGING_CONFIG_VALUE);
} }
private FilesystemStorageStrategy storageStrategy; private FilesystemStorageStrategy storageStrategy;
@BeforeMethod @BeforeMethod
protected void setUp() throws Exception { protected void setUp() throws Exception {
storageStrategy = new FilesystemStorageStrategyImpl( storageStrategy = new FilesystemStorageStrategyImpl(new Provider<BlobBuilder>() {
new Blob.Factory() {
@Override @Override
public Blob create(MutableBlobMetadata metadata) { public BlobBuilder get() {
return new BlobImpl(metadata != null ? metadata : new MutableBlobMetadataImpl()); return new BlobBuilderImpl();
}
},
TestUtils.TARGET_BASE_DIR,
new FilesystemContainerNameValidatorImpl(),
new FilesystemBlobKeyValidatorImpl());
TestUtils.cleanDirectoryContent(TestUtils.TARGET_BASE_DIR);
} }
}, TestUtils.TARGET_BASE_DIR, new FilesystemContainerNameValidatorImpl(), new FilesystemBlobKeyValidatorImpl());
TestUtils.cleanDirectoryContent(TestUtils.TARGET_BASE_DIR);
}
@AfterMethod @AfterMethod
protected void tearDown() throws IOException { protected void tearDown() throws IOException {
TestUtils.cleanDirectoryContent(TestUtils.TARGET_BASE_DIR); TestUtils.cleanDirectoryContent(TestUtils.TARGET_BASE_DIR);
} }
public void testCreateDirectory() { public void testCreateDirectory() {
storageStrategy.createDirectory(CONTAINER_NAME, null); storageStrategy.createDirectory(CONTAINER_NAME, null);
TestUtils.directoryExists(TARGET_CONTAINER_NAME, true); TestUtils.directoryExists(TARGET_CONTAINER_NAME, true);
@ -116,7 +118,6 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testCreateContainer() { public void testCreateContainer() {
boolean result; boolean result;
@ -136,16 +137,12 @@ public class FilesystemStorageStrategyImplTest {
assertFalse(result, "Container not created"); assertFalse(result, "Container not created");
} }
public void testDeleteDirectory() throws IOException { public void testDeleteDirectory() throws IOException {
TestUtils.createContainerAsDirectory(CONTAINER_NAME); TestUtils.createContainerAsDirectory(CONTAINER_NAME);
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(
CONTAINER_NAME, CONTAINER_NAME,
new String[]{ new String[] { TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev3" + FS, ".txt"),
TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev3" + FS, ".txt"), TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev4" + FS, ".jpg") });
TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev4" + FS, ".jpg")
}
);
// delete directory in different ways // delete directory in different ways
storageStrategy.deleteDirectory(CONTAINER_NAME, "lev1" + FS + "lev2" + FS + "lev4"); storageStrategy.deleteDirectory(CONTAINER_NAME, "lev1" + FS + "lev2" + FS + "lev4");
@ -163,11 +160,8 @@ public class FilesystemStorageStrategyImplTest {
// delete the directory and all the files inside // delete the directory and all the files inside
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(
CONTAINER_NAME, CONTAINER_NAME,
new String[]{ new String[] { TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev3" + FS, ".txt"),
TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev3" + FS, ".txt"), TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev4" + FS, ".jpg") });
TestUtils.createRandomBlobKey("lev1" + FS + "lev2" + FS + "lev4" + FS, ".jpg")
}
);
storageStrategy.deleteDirectory(CONTAINER_NAME, null); storageStrategy.deleteDirectory(CONTAINER_NAME, null);
TestUtils.directoryExists(TARGET_CONTAINER_NAME, false); TestUtils.directoryExists(TARGET_CONTAINER_NAME, false);
} }
@ -180,7 +174,6 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testDirectoryExists() throws IOException { public void testDirectoryExists() throws IOException {
final String SUBDIRECTORY_NAME = "ad" + FS + "sda" + FS + "asd"; final String SUBDIRECTORY_NAME = "ad" + FS + "sda" + FS + "asd";
boolean result; boolean result;
@ -196,7 +189,6 @@ public class FilesystemStorageStrategyImplTest {
result = storageStrategy.directoryExists(CONTAINER_NAME + FS, null); result = storageStrategy.directoryExists(CONTAINER_NAME + FS, null);
assertTrue(result, "Directory doesn't exist"); assertTrue(result, "Directory doesn't exist");
result = storageStrategy.directoryExists(CONTAINER_NAME, SUBDIRECTORY_NAME); result = storageStrategy.directoryExists(CONTAINER_NAME, SUBDIRECTORY_NAME);
assertFalse(result, "Directory exist"); assertFalse(result, "Directory exist");
@ -214,15 +206,12 @@ public class FilesystemStorageStrategyImplTest {
} }
public void testClearContainer() throws IOException { public void testClearContainer() throws IOException {
storageStrategy.createContainer(CONTAINER_NAME); storageStrategy.createContainer(CONTAINER_NAME);
Set<String> blobs = TestUtils.createBlobsInContainer( Set<String> blobs = TestUtils.createBlobsInContainer(
CONTAINER_NAME, CONTAINER_NAME,
new String[]{ new String[] { TestUtils.createRandomBlobKey("clean_container-", ".jpg"),
TestUtils.createRandomBlobKey("clean_container-", ".jpg"), TestUtils.createRandomBlobKey("bf" + FS + "sd" + FS + "as" + FS + "clean_container-", ".jpg") });
TestUtils.createRandomBlobKey("bf" + FS + "sd" + FS + "as" + FS + "clean_container-", ".jpg")}
);
// test if file exits // test if file exits
for (String blob : blobs) { for (String blob : blobs) {
TestUtils.fileExists(TARGET_CONTAINER_NAME + FS + blob, true); TestUtils.fileExists(TARGET_CONTAINER_NAME + FS + blob, true);
@ -238,7 +227,6 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testClearContainer_NotExistingContainer() throws IOException { public void testClearContainer_NotExistingContainer() throws IOException {
// test if container still exits // test if container still exits
TestUtils.directoryExists(TARGET_CONTAINER_NAME, false); TestUtils.directoryExists(TARGET_CONTAINER_NAME, false);
@ -248,15 +236,12 @@ public class FilesystemStorageStrategyImplTest {
TestUtils.directoryExists(TARGET_CONTAINER_NAME, false); TestUtils.directoryExists(TARGET_CONTAINER_NAME, false);
} }
public void testClearContainerAndThenDeleteContainer() throws IOException { public void testClearContainerAndThenDeleteContainer() throws IOException {
storageStrategy.createContainer(CONTAINER_NAME); storageStrategy.createContainer(CONTAINER_NAME);
Set<String> blobs = TestUtils.createBlobsInContainer( Set<String> blobs = TestUtils.createBlobsInContainer(
CONTAINER_NAME, CONTAINER_NAME,
new String[]{ new String[] { TestUtils.createRandomBlobKey("clean_container-", ".jpg"),
TestUtils.createRandomBlobKey("clean_container-", ".jpg"), TestUtils.createRandomBlobKey("bf" + FS + "sd" + FS + "as" + FS + "clean_container-", ".jpg") });
TestUtils.createRandomBlobKey("bf" + FS + "sd" + FS + "as" + FS + "clean_container-", ".jpg")}
);
// test if file exits // test if file exits
for (String blob : blobs) { for (String blob : blobs) {
TestUtils.fileExists(TARGET_CONTAINER_NAME + FS + blob, true); TestUtils.fileExists(TARGET_CONTAINER_NAME + FS + blob, true);
@ -278,19 +263,16 @@ public class FilesystemStorageStrategyImplTest {
assertFalse(storageStrategy.containerExists(CONTAINER_NAME), "Container still exists"); assertFalse(storageStrategy.containerExists(CONTAINER_NAME), "Container still exists");
} }
public void testDeleteContainer() throws IOException { public void testDeleteContainer() throws IOException {
final String BLOB_KEY1 = "blobName.jpg"; final String BLOB_KEY1 = "blobName.jpg";
final String BLOB_KEY2 = "aa" + FS + "bb" + FS + "cc" + FS + "dd" + FS + "ee" + FS + "ff" + FS + "23" + FS + "blobName.jpg"; final String BLOB_KEY2 = "aa" + FS + "bb" + FS + "cc" + FS + "dd" + FS + "ee" + FS + "ff" + FS + "23" + FS
+ "blobName.jpg";
boolean result; boolean result;
result = storageStrategy.createContainer(CONTAINER_NAME); result = storageStrategy.createContainer(CONTAINER_NAME);
// put data inside the container // put data inside the container
TestUtils.createBlobsInContainer( TestUtils.createBlobsInContainer(CONTAINER_NAME, new String[] { BLOB_KEY1, BLOB_KEY2 });
CONTAINER_NAME,
new String[] {BLOB_KEY1, BLOB_KEY2}
);
storageStrategy.deleteContainer(CONTAINER_NAME); storageStrategy.deleteContainer(CONTAINER_NAME);
assertTrue(result, "Cannot delete container"); assertTrue(result, "Cannot delete container");
@ -315,7 +297,6 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testGetAllContainerNames() { public void testGetAllContainerNames() {
Iterable<String> resultList; Iterable<String> resultList;
@ -341,7 +322,6 @@ public class FilesystemStorageStrategyImplTest {
assertTrue(containers.contains(CONTAINER_NAME + "3"), "Containers doesn't exist"); assertTrue(containers.contains(CONTAINER_NAME + "3"), "Containers doesn't exist");
} }
public void testContainerExists() { public void testContainerExists() {
boolean result; boolean result;
@ -353,7 +333,6 @@ public class FilesystemStorageStrategyImplTest {
assertTrue(result, "Container exists"); assertTrue(result, "Container exists");
} }
public void testNewBlob() { public void testNewBlob() {
String blobKey; String blobKey;
Blob newBlob; Blob newBlob;
@ -373,7 +352,6 @@ public class FilesystemStorageStrategyImplTest {
assertEquals(newBlob.getMetadata().getName(), blobKey, "Created blob name is different"); assertEquals(newBlob.getMetadata().getName(), blobKey, "Created blob name is different");
} }
public void testWritePayloadOnFile() throws IOException { public void testWritePayloadOnFile() throws IOException {
String blobKey; String blobKey;
File sourceFile; File sourceFile;
@ -400,7 +378,6 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testGetFileForBlobKey() { public void testGetFileForBlobKey() {
String blobKey; String blobKey;
File fileForPayload; File fileForPayload;
@ -416,23 +393,18 @@ public class FilesystemStorageStrategyImplTest {
assertEquals(fileForPayload.getAbsolutePath(), fullPath + blobKey, "Wrong file path"); assertEquals(fileForPayload.getAbsolutePath(), fullPath + blobKey, "Wrong file path");
} }
public void testGetFileForBlobKey_AbsolutePath() throws IOException {
public void testGetFileForBlobKey_AbsolutePath()
throws IOException {
String absoluteBasePath = (new File(getAbsoluteDirectory(), "basedir")).getAbsolutePath() + FS; String absoluteBasePath = (new File(getAbsoluteDirectory(), "basedir")).getAbsolutePath() + FS;
String absoluteContainerPath = absoluteBasePath + CONTAINER_NAME + FS; String absoluteContainerPath = absoluteBasePath + CONTAINER_NAME + FS;
// create storageStrategy with an absolute path // create storageStrategy with an absolute path
FilesystemStorageStrategy storageStrategyAbsolute = new FilesystemStorageStrategyImpl( FilesystemStorageStrategy storageStrategyAbsolute = new FilesystemStorageStrategyImpl(
new Blob.Factory() { new Provider<BlobBuilder>() {
@Override @Override
public Blob create(MutableBlobMetadata metadata) { public BlobBuilder get() {
return new BlobImpl(metadata != null ? metadata : new MutableBlobMetadataImpl()); return new BlobBuilderImpl();
} }
}, }, absoluteBasePath, new FilesystemContainerNameValidatorImpl(), new FilesystemBlobKeyValidatorImpl());
absoluteBasePath,
new FilesystemContainerNameValidatorImpl(),
new FilesystemBlobKeyValidatorImpl());
TestUtils.cleanDirectoryContent(absoluteContainerPath); TestUtils.cleanDirectoryContent(absoluteContainerPath);
String blobKey; String blobKey;
@ -448,13 +420,10 @@ public class FilesystemStorageStrategyImplTest {
assertEquals(fileForPayload.getAbsolutePath(), absoluteContainerPath + blobKey, "Wrong file path"); assertEquals(fileForPayload.getAbsolutePath(), absoluteContainerPath + blobKey, "Wrong file path");
} }
public void testBlobExists() throws IOException { public void testBlobExists() throws IOException {
String[] sourceBlobKeys = new String[]{ String[] sourceBlobKeys = new String[] { TestUtils.createRandomBlobKey("blobExists-", ".jpg"),
TestUtils.createRandomBlobKey("blobExists-", ".jpg"), TestUtils.createRandomBlobKey("blobExists-", ".jpg"),
TestUtils.createRandomBlobKey("blobExists-", ".jpg"), TestUtils.createRandomBlobKey("afasd" + FS + "asdma" + FS + "blobExists-", ".jpg") };
TestUtils.createRandomBlobKey("afasd" + FS + "asdma" + FS + "blobExists-", ".jpg")
};
for (String blobKey : sourceBlobKeys) { for (String blobKey : sourceBlobKeys) {
assertFalse(storageStrategy.blobExists(CONTAINER_NAME, blobKey), "Blob " + blobKey + " exists"); assertFalse(storageStrategy.blobExists(CONTAINER_NAME, blobKey), "Blob " + blobKey + " exists");
@ -465,17 +434,14 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testRemoveBlob() throws IOException { public void testRemoveBlob() throws IOException {
storageStrategy.createContainer(CONTAINER_NAME); storageStrategy.createContainer(CONTAINER_NAME);
Set<String> blobKeys = TestUtils.createBlobsInContainer( Set<String> blobKeys = TestUtils.createBlobsInContainer(
CONTAINER_NAME, CONTAINER_NAME,
new String[]{ new String[] { TestUtils.createRandomBlobKey("removeBlob-", ".jpg"),
TestUtils.createRandomBlobKey("removeBlob-", ".jpg"),
TestUtils.createRandomBlobKey("removeBlob-", ".jpg"), TestUtils.createRandomBlobKey("removeBlob-", ".jpg"),
TestUtils.createRandomBlobKey("346" + FS + "g3sx2" + FS + "removeBlob-", ".jpg"), TestUtils.createRandomBlobKey("346" + FS + "g3sx2" + FS + "removeBlob-", ".jpg"),
TestUtils.createRandomBlobKey("346" + FS + "g3sx2" + FS + "removeBlob-", ".jpg") TestUtils.createRandomBlobKey("346" + FS + "g3sx2" + FS + "removeBlob-", ".jpg") });
});
Set<String> remainingBlobKeys = new HashSet<String>(); Set<String> remainingBlobKeys = new HashSet<String>();
for (String key : blobKeys) { for (String key : blobKeys) {
@ -502,7 +468,6 @@ public class FilesystemStorageStrategyImplTest {
storageStrategy.removeBlob(CONTAINER_NAME, "sdfsdfsdfasd"); storageStrategy.removeBlob(CONTAINER_NAME, "sdfsdfsdfasd");
} }
public void testGetBlobKeysInsideContainer() throws IOException { public void testGetBlobKeysInsideContainer() throws IOException {
Iterable<String> resultList; Iterable<String> resultList;
@ -515,12 +480,10 @@ public class FilesystemStorageStrategyImplTest {
storageStrategy.createContainer(CONTAINER_NAME); storageStrategy.createContainer(CONTAINER_NAME);
Set<String> createBlobKeys = TestUtils.createBlobsInContainer( Set<String> createBlobKeys = TestUtils.createBlobsInContainer(
CONTAINER_NAME, CONTAINER_NAME,
new String[]{ new String[] { TestUtils.createRandomBlobKey("GetBlobKeys-", ".jpg"),
TestUtils.createRandomBlobKey("GetBlobKeys-", ".jpg"),
TestUtils.createRandomBlobKey("GetBlobKeys-", ".jpg"), TestUtils.createRandomBlobKey("GetBlobKeys-", ".jpg"),
TestUtils.createRandomBlobKey("563" + FS + "g3sx2" + FS + "removeBlob-", ".jpg"), TestUtils.createRandomBlobKey("563" + FS + "g3sx2" + FS + "removeBlob-", ".jpg"),
TestUtils.createRandomBlobKey("563" + FS + "g3sx2" + FS + "removeBlob-", ".jpg") TestUtils.createRandomBlobKey("563" + FS + "g3sx2" + FS + "removeBlob-", ".jpg") });
});
storageStrategy.getBlobKeysInsideContainer(CONTAINER_NAME); storageStrategy.getBlobKeysInsideContainer(CONTAINER_NAME);
List<String> retrievedBlobKeys = new ArrayList<String>(); List<String> retrievedBlobKeys = new ArrayList<String>();
@ -535,7 +498,6 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testCountsBlob() { public void testCountsBlob() {
try { try {
storageStrategy.countBlobs(CONTAINER_NAME, ListContainerOptions.NONE); storageStrategy.countBlobs(CONTAINER_NAME, ListContainerOptions.NONE);
@ -544,26 +506,27 @@ public class FilesystemStorageStrategyImplTest {
} }
} }
public void testInvalidBlobKey() { public void testInvalidBlobKey() {
try { try {
storageStrategy.newBlob(FS + "test.jpg"); storageStrategy.newBlob(FS + "test.jpg");
fail("Wrong blob key not recognized"); fail("Wrong blob key not recognized");
} catch (IllegalArgumentException e) {} } catch (IllegalArgumentException e) {
}
} }
public void testInvalidContainerName() { public void testInvalidContainerName() {
try { try {
storageStrategy.createContainer("file" + FS + "system"); storageStrategy.createContainer("file" + FS + "system");
fail("Wrong container name not recognized"); fail("Wrong container name not recognized");
} catch (IllegalArgumentException e) {} } catch (IllegalArgumentException e) {
}
} }
// ---------------------------------------------------------- Private methods // ---------------------------------------------------------- Private methods
/** /**
* Calculates an absolute directory path that depends on operative system * Calculates an absolute directory path that depends on operative system
*
* @return * @return
*/ */
private String getAbsoluteDirectory() throws IOException { private String getAbsoluteDirectory() throws IOException {
@ -573,5 +536,4 @@ public class FilesystemStorageStrategyImplTest {
return tempAbsolutePath; return tempAbsolutePath;
} }
} }

View File

@ -35,7 +35,7 @@ import com.google.common.base.Function;
*/ */
@Singleton @Singleton
public class ObjectToBlob implements Function<S3Object, Blob> { public class ObjectToBlob implements Function<S3Object, Blob> {
private final Blob.Factory blobFactory; private final Factory blobFactory;
private final ObjectToBlobMetadata object2BlobMd; private final ObjectToBlobMetadata object2BlobMd;
@Inject @Inject

View File

@ -35,7 +35,7 @@ import com.google.common.base.Function;
*/ */
@Singleton @Singleton
public class ObjectToBlob implements Function<SwiftObject, Blob> { public class ObjectToBlob implements Function<SwiftObject, Blob> {
private final Blob.Factory blobFactory; private final Factory blobFactory;
private final ObjectToBlobMetadata object2BlobMd; private final ObjectToBlobMetadata object2BlobMd;
@Inject @Inject

View File

@ -24,6 +24,7 @@ import java.util.Set;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.PageSet;
import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageMetadata;
@ -47,8 +48,14 @@ public interface AsyncBlobStore {
/** /**
* @see BlobStore#newBlob * @see BlobStore#newBlob
*/ */
@Deprecated
Blob newBlob(String name); Blob newBlob(String name);
/**
* @see BlobStore#blobBuilder
*/
BlobBuilder blobBuilder(String name);
/** /**
* @see BlobStore#listAssignableLocations * @see BlobStore#listAssignableLocations
*/ */

View File

@ -20,6 +20,7 @@
package org.jclouds.blobstore; package org.jclouds.blobstore;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.internal.BlobMapImpl; import org.jclouds.blobstore.internal.BlobMapImpl;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
@ -34,9 +35,19 @@ import com.google.inject.ImplementedBy;
*/ */
@ImplementedBy(BlobMapImpl.class) @ImplementedBy(BlobMapImpl.class)
public interface BlobMap extends ListableMap<String, Blob> { public interface BlobMap extends ListableMap<String, Blob> {
/**
* @see #blobBuilder
* @param name
*/
@Deprecated
Blob newBlob(String name); Blob newBlob(String name);
/**
*
* @return builder for creating new {@link Blob}s
*/
BlobBuilder blobBuilder();
public static interface Factory { public static interface Factory {
BlobMap create(String containerName, ListContainerOptions options); BlobMap create(String containerName, ListContainerOptions options);
} }

View File

@ -24,6 +24,7 @@ import java.util.Set;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.PageSet;
import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageMetadata;
@ -47,9 +48,17 @@ public interface BlobStore {
/** /**
* creates a new blob with the specified name. * creates a new blob with the specified name.
* @see #blobBuilder
*/ */
@Deprecated
Blob newBlob(String name); Blob newBlob(String name);
/**
*
* @return builder for creating new {@link Blob}s
*/
BlobBuilder blobBuilder(String name);
/** /**
* The get locations command returns all the valid locations for containers. A location has a * The get locations command returns all the valid locations for containers. A location has a
* scope, which is typically region or zone. A region is a general area, like eu-west, where a * scope, which is typically region or zone. A region is a general area, like eu-west, where a

View File

@ -19,6 +19,7 @@
package org.jclouds.blobstore; package org.jclouds.blobstore;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Throwables.getCausalChain; import static com.google.common.base.Throwables.getCausalChain;
@ -125,7 +126,7 @@ public class TransientAsyncBlobStore extends BaseAsyncBlobStore {
protected TransientAsyncBlobStore(BlobStoreContext context, DateService dateService, Crypto crypto, protected TransientAsyncBlobStore(BlobStoreContext context, DateService dateService, Crypto crypto,
ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs, ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs,
ConcurrentMap<String, Location> containerToLocation, HttpGetOptionsListToGetOptions httpGetOptionsConverter, ConcurrentMap<String, Location> containerToLocation, HttpGetOptionsListToGetOptions httpGetOptionsConverter,
IfDirectoryReturnNameStrategy ifDirectoryReturnName, Blob.Factory blobFactory, BlobUtils blobUtils, IfDirectoryReturnNameStrategy ifDirectoryReturnName, Factory blobFactory, BlobUtils blobUtils,
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier<Location> defaultLocation, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier<Location> defaultLocation,
@Memoized Supplier<Set<? extends Location>> locations) { @Memoized Supplier<Set<? extends Location>> locations) {
super(context, blobUtils, service, defaultLocation, locations); super(context, blobUtils, service, defaultLocation, locations);
@ -487,6 +488,8 @@ public class TransientAsyncBlobStore extends BaseAsyncBlobStore {
*/ */
@Override @Override
public ListenableFuture<String> putBlob(String containerName, Blob in) { public ListenableFuture<String> putBlob(String containerName, Blob in) {
checkArgument(containerName != null, "containerName must be set");
checkArgument(in != null, "blob must be set");
ConcurrentMap<String, Blob> container = getContainerToBlobs().get(containerName); ConcurrentMap<String, Blob> container = getContainerToBlobs().get(containerName);
if (container == null) { if (container == null) {
new IllegalStateException("containerName not found: " + containerName); new IllegalStateException("containerName not found: " + containerName);
@ -513,6 +516,8 @@ public class TransientAsyncBlobStore extends BaseAsyncBlobStore {
} }
protected Blob createUpdatedCopyOfBlob(Blob in) { protected Blob createUpdatedCopyOfBlob(Blob in) {
checkNotNull(in, "blob");
checkNotNull(in.getPayload(), "blob.payload");
ByteArrayPayload payload = (in.getPayload() instanceof ByteArrayPayload) ? ByteArrayPayload.class.cast(in ByteArrayPayload payload = (in.getPayload() instanceof ByteArrayPayload) ? ByteArrayPayload.class.cast(in
.getPayload()) : null; .getPayload()) : null;
if (payload == null) if (payload == null)

View File

@ -20,11 +20,12 @@
package org.jclouds.blobstore.config; package org.jclouds.blobstore.config;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider;
import org.jclouds.blobstore.BlobMap; import org.jclouds.blobstore.BlobMap;
import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.InputStreamMap; import org.jclouds.blobstore.InputStreamMap;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.internal.BlobMapImpl; import org.jclouds.blobstore.internal.BlobMapImpl;
import org.jclouds.blobstore.internal.InputStreamMapImpl; import org.jclouds.blobstore.internal.InputStreamMapImpl;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
@ -65,10 +66,12 @@ public class BlobStoreMapModule extends AbstractModule {
PutBlobsStrategy putBlobsStrategy; PutBlobsStrategy putBlobsStrategy;
@Inject @Inject
ListContainerAndRecurseThroughFolders listStrategy; ListContainerAndRecurseThroughFolders listStrategy;
@Inject
Provider<BlobBuilder> blobBuilders;
public BlobMap create(String containerName, ListContainerOptions options) { public BlobMap create(String containerName, ListContainerOptions options) {
return new BlobMapImpl(connection, getAllBlobs, containsValueStrategy, putBlobsStrategy, return new BlobMapImpl(connection, getAllBlobs, containsValueStrategy, putBlobsStrategy, listStrategy,
listStrategy, containerName, options); containerName, options, blobBuilders);
} }
} }
@ -77,7 +80,7 @@ public class BlobStoreMapModule extends AbstractModule {
@Inject @Inject
BlobStore connection; BlobStore connection;
@Inject @Inject
Blob.Factory blobFactory; Provider<BlobBuilder> blobBuilders;
@Inject @Inject
GetBlobsInListStrategy getAllBlobs; GetBlobsInListStrategy getAllBlobs;
@Inject @Inject
@ -90,9 +93,8 @@ public class BlobStoreMapModule extends AbstractModule {
ListContainerAndRecurseThroughFolders listStrategy; ListContainerAndRecurseThroughFolders listStrategy;
public InputStreamMap create(String containerName, ListContainerOptions options) { public InputStreamMap create(String containerName, ListContainerOptions options) {
return new InputStreamMapImpl(connection, blobFactory, getAllBlobs, listStrategy, return new InputStreamMapImpl(connection, blobBuilders, getAllBlobs, listStrategy, containsValueStrategy,
containsValueStrategy, putBlobsStrategy, containerName, options, putBlobsStrategy, containerName, options, crypto);
crypto);
} }
} }

View File

@ -0,0 +1,123 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.domain;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import org.jclouds.blobstore.domain.internal.BlobBuilderImpl;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import com.google.inject.ImplementedBy;
/**
*
* In case the name was confusing, this indeed builds a Blob.
*
* @author Adrian Cole
*/
@ImplementedBy(BlobBuilderImpl.class)
public interface BlobBuilder {
/**
* @param name
* The name of the {@link Blob}. Typically refers to an http path.
*/
BlobBuilder name(String name);
/**
* @param type
* overrides default type of {@link StorageType#BLOB}
*/
BlobBuilder type(StorageType type);
/**
* @param userMetadata
* User defined metadata associated with this {@link Blob}.
*
*/
BlobBuilder userMetadata(Map<String, String> userMetadata);
/**
*
* @param payload
* payload you wish to construct the {@link Blob} with.
*/
PayloadBlobBuilder payload(Payload payload);
/**
*
* @param payload
* payload you wish to construct the {@link Blob} with.
*/
PayloadBlobBuilder payload(InputStream payload);
/**
*
* @param payload
* payload you wish to construct the {@link Blob} with.
*/
PayloadBlobBuilder payload(byte[] payload);
/**
*
* @param payload
* payload you wish to construct the {@link Blob} with.
*/
PayloadBlobBuilder payload(String payload);
/**
*
* @param payload
* payload you wish to construct the {@link Blob} with.
*/
PayloadBlobBuilder payload(File payload);
/**
* This makes a blob from the currently configured parameters.
*
* @return a new blob from the current parameters
*/
Blob build();
public interface PayloadBlobBuilder extends BlobBuilder {
PayloadBlobBuilder contentLength(long contentLength);
PayloadBlobBuilder contentMD5(byte[] md5);
PayloadBlobBuilder contentType(String contentType);
PayloadBlobBuilder contentDisposition(String contentDisposition);
PayloadBlobBuilder contentLanguage(String contentLanguage);
PayloadBlobBuilder contentEncoding(String contentEncoding);
/**
*
* @see Payloads#calculateMD5
*/
PayloadBlobBuilder calculateMD5() throws IOException;
}
}

View File

@ -0,0 +1,229 @@
/**
*
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed 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.domain.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.io.Payloads.newPayload;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import javax.annotation.Nullable;
import javax.inject.Inject;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.crypto.Crypto;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import com.google.common.base.Throwables;
import com.google.common.collect.Maps;
/**
* @author Adrian Cole
*/
public class BlobBuilderImpl implements BlobBuilder {
private Payload payload;
private String name;
private Map<String, String> userMetadata = Maps.newLinkedHashMap();
private StorageType type = StorageType.BLOB;
@Inject
private Crypto crypto;
@Override
public BlobBuilder name(String name) {
this.name = name;
return this;
}
@Override
public BlobBuilder type(StorageType type) {
this.type = type;
return this;
}
@Override
public BlobBuilder userMetadata(Map<String, String> userMetadata) {
this.userMetadata = Maps.newLinkedHashMap(checkNotNull(userMetadata, "userMetadata"));
return this;
}
@Override
public PayloadBlobBuilder payload(Payload payload) {
this.payload = payload;
return new PayloadBlobBuilderImpl(this, payload, crypto);
}
/**
* {@inheritDoc}
*/
@Override
public PayloadBlobBuilder payload(InputStream data) {
return payload(newPayload(checkNotNull(data, "data")));
}
/**
* {@inheritDoc}
*/
@Override
public PayloadBlobBuilder payload(byte[] data) {
return payload(newPayload(checkNotNull(data, "data")));
}
/**
* {@inheritDoc}
*/
@Override
public PayloadBlobBuilder payload(String data) {
return payload(newPayload(checkNotNull(data, "data")));
}
/**
* {@inheritDoc}
*/
@Override
public PayloadBlobBuilder payload(File data) {
return payload(newPayload(checkNotNull(data, "data")));
}
@Override
public Blob build() {
Blob blob = new BlobImpl(new MutableBlobMetadataImpl());
if (name != null)
blob.getMetadata().setName(name);
if (payload != null)
blob.setPayload(payload);
blob.getMetadata().setUserMetadata(userMetadata);
blob.getMetadata().setType(type);
return blob;
}
public class PayloadBlobBuilderImpl implements PayloadBlobBuilder {
private final BlobBuilder builder;
private final Payload payload;
private MessageDigest digest;
public PayloadBlobBuilderImpl(BlobBuilder builder, Payload payload, @Nullable Crypto crypto) {
this.builder = checkNotNull(builder, "builder");
this.payload = checkNotNull(payload, "payload");
try {
this.digest = crypto != null ? crypto.md5() : MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
Throwables.propagate(e);
this.digest = null;
}
}
@Override
public BlobBuilder name(String name) {
return builder.name(name);
}
@Override
public BlobBuilder type(StorageType type) {
return builder.type(type);
}
@Override
public BlobBuilder userMetadata(Map<String, String> userMetadata) {
return builder.userMetadata(userMetadata);
}
@Override
public PayloadBlobBuilder payload(Payload payload) {
return builder.payload(payload);
}
@Override
public PayloadBlobBuilder calculateMD5() throws IOException {
return builder.payload(Payloads.calculateMD5(payload, digest));
}
@Override
public PayloadBlobBuilder payload(InputStream payload) {
return builder.payload(payload);
}
@Override
public PayloadBlobBuilder payload(byte[] payload) {
return builder.payload(payload);
}
@Override
public PayloadBlobBuilder payload(String payload) {
return builder.payload(payload);
}
@Override
public PayloadBlobBuilder payload(File payload) {
return builder.payload(payload);
}
@Override
public Blob build() {
return builder.build();
}
@Override
public PayloadBlobBuilder contentLength(long contentLength) {
payload.getContentMetadata().setContentLength(contentLength);
return this;
}
@Override
public PayloadBlobBuilder contentMD5(byte[] md5) {
payload.getContentMetadata().setContentMD5(md5);
return this;
}
@Override
public PayloadBlobBuilder contentType(String contentType) {
payload.getContentMetadata().setContentType(contentType);
return this;
}
@Override
public PayloadBlobBuilder contentDisposition(String contentDisposition) {
payload.getContentMetadata().setContentDisposition(contentDisposition);
return this;
}
@Override
public PayloadBlobBuilder contentLanguage(String contentLanguage) {
payload.getContentMetadata().setContentLanguage(contentLanguage);
return this;
}
@Override
public PayloadBlobBuilder contentEncoding(String contentEncoding) {
payload.getContentMetadata().setContentEncoding(contentEncoding);
return this;
}
}
}

View File

@ -34,6 +34,7 @@ import org.jclouds.blobstore.AsyncBlobStore;
import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.ContainerNotFoundException; import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.PageSet;
import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageMetadata;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
@ -83,6 +84,14 @@ public abstract class BaseAsyncBlobStore implements AsyncBlobStore {
return blobUtils.newBlob(name); return blobUtils.newBlob(name);
} }
/**
* invokes {@link BlobUtilsImpl#blobBuilder }
*/
@Override
public BlobBuilder blobBuilder(String name) {
return blobUtils.blobBuilder().name(name);
}
/** /**
* This implementation invokes * This implementation invokes
* {@link #list(String,org.jclouds.blobstore.options.ListContainerOptions)} * {@link #list(String,org.jclouds.blobstore.options.ListContainerOptions)}

View File

@ -19,12 +19,16 @@
package org.jclouds.blobstore.internal; package org.jclouds.blobstore.internal;
import static com.google.common.base.Functions.identity;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.transform;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.inject.Inject;
import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.ListableMap; import org.jclouds.blobstore.ListableMap;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
@ -39,9 +43,7 @@ import org.jclouds.blobstore.strategy.PutBlobsStrategy;
import org.jclouds.blobstore.strategy.internal.ListContainerAndRecurseThroughFolders; import org.jclouds.blobstore.strategy.internal.ListContainerAndRecurseThroughFolders;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.Iterables; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.inject.Inject;
/** /**
* Implements core Map functionality with a {@link BlobStore} * Implements core Map functionality with a {@link BlobStore}
@ -88,17 +90,10 @@ public abstract class BaseBlobMap<V> implements ListableMap<String, V> {
} }
} }
static class PassThrough<T> implements Function<T, T> {
public T apply(T from) {
return from;
}
}
@Inject @Inject
public BaseBlobMap(BlobStore blobstore, GetBlobsInListStrategy getAllBlobs, public BaseBlobMap(BlobStore blobstore, GetBlobsInListStrategy getAllBlobs,
ContainsValueInListStrategy containsValueStrategy, PutBlobsStrategy putBlobsStrategy, ContainsValueInListStrategy containsValueStrategy, PutBlobsStrategy putBlobsStrategy,
ListContainerAndRecurseThroughFolders listStrategy, String containerName, ListContainerAndRecurseThroughFolders listStrategy, String containerName, ListContainerOptions options) {
ListContainerOptions options) {
this.blobstore = checkNotNull(blobstore, "blobstore"); this.blobstore = checkNotNull(blobstore, "blobstore");
this.containerName = checkNotNull(containerName, "container"); this.containerName = checkNotNull(containerName, "container");
checkArgument(containerName.indexOf('/') == -1, checkArgument(containerName.indexOf('/') == -1,
@ -107,7 +102,7 @@ public abstract class BaseBlobMap<V> implements ListableMap<String, V> {
: new ImmutableListContainerOptions(options); : new ImmutableListContainerOptions(options);
String dir = options.getDir(); String dir = options.getDir();
if (dir == null) { if (dir == null) {
prefixer = new PassThrough<String>(); prefixer = identity();
pathStripper = prefixer; pathStripper = prefixer;
} else { } else {
prefixer = new PrefixKey(dir, "/"); prefixer = new PrefixKey(dir, "/");
@ -122,8 +117,7 @@ public abstract class BaseBlobMap<V> implements ListableMap<String, V> {
@Override @Override
public Set<java.util.Map.Entry<String, V>> entrySet() { public Set<java.util.Map.Entry<String, V>> entrySet() {
return Sets.newHashSet(Iterables.transform(list(), return ImmutableSet.copyOf(transform(list(), new Function<BlobMetadata, Map.Entry<String, V>>() {
new Function<BlobMetadata, Map.Entry<String, V>>() {
@Override @Override
public java.util.Map.Entry<String, V> apply(BlobMetadata from) { public java.util.Map.Entry<String, V> apply(BlobMetadata from) {
return new Entry(pathStripper.apply(from.getName())); return new Entry(pathStripper.apply(from.getName()));
@ -187,7 +181,7 @@ public abstract class BaseBlobMap<V> implements ListableMap<String, V> {
@Override @Override
public Set<String> keySet() { public Set<String> keySet() {
return Sets.newHashSet(Iterables.transform(list(), new Function<BlobMetadata, String>() { return ImmutableSet.copyOf(transform(list(), new Function<BlobMetadata, String>() {
@Override @Override
public String apply(BlobMetadata from) { public String apply(BlobMetadata from) {
return from.getName(); return from.getName();
@ -197,7 +191,7 @@ public abstract class BaseBlobMap<V> implements ListableMap<String, V> {
@Override @Override
public boolean containsKey(Object key) { public boolean containsKey(Object key) {
String realKey = prefixer.apply(key.toString()); String realKey = prefixer.apply(checkNotNull(key, "key").toString());
return blobstore.blobExists(containerName, realKey); return blobstore.blobExists(containerName, realKey);
} }
@ -207,8 +201,7 @@ public abstract class BaseBlobMap<V> implements ListableMap<String, V> {
} }
public Iterable<? extends BlobMetadata> list() { public Iterable<? extends BlobMetadata> list() {
return Iterables.transform(listStrategy.execute(containerName, options), return transform(listStrategy.execute(containerName, options), new Function<BlobMetadata, BlobMetadata>() {
new Function<BlobMetadata, BlobMetadata>() {
public BlobMetadata apply(BlobMetadata from) { public BlobMetadata apply(BlobMetadata from) {
MutableBlobMetadata md = new MutableBlobMetadataImpl(from); MutableBlobMetadata md = new MutableBlobMetadataImpl(from);
if (options.getDir() != null) if (options.getDir() != null)
@ -221,7 +214,7 @@ public abstract class BaseBlobMap<V> implements ListableMap<String, V> {
@Override @Override
public String toString() { public String toString() {
return "BaseBlobMap [containerName=" + containerName + ", options=" + options + "]"; return "[containerName=" + containerName + ", options=" + options + "]";
} }
} }

View File

@ -30,6 +30,7 @@ import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.ContainerNotFoundException; import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.PageSet;
import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageMetadata;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
@ -74,6 +75,14 @@ public abstract class BaseBlobStore implements BlobStore {
return blobUtils.newBlob(name); return blobUtils.newBlob(name);
} }
/**
* invokes {@link BlobUtilsImpl#blobBuilder }
*/
@Override
public BlobBuilder blobBuilder(String name) {
return blobUtils.blobBuilder().name(name);
}
/** /**
* This implementation invokes * This implementation invokes
* {@link #list(String,org.jclouds.blobstore.options.ListContainerOptions)} * {@link #list(String,org.jclouds.blobstore.options.ListContainerOptions)}

View File

@ -19,22 +19,28 @@
package org.jclouds.blobstore.internal; package org.jclouds.blobstore.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.transform;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider;
import org.jclouds.blobstore.BlobMap; import org.jclouds.blobstore.BlobMap;
import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.KeyNotFoundException; import org.jclouds.blobstore.KeyNotFoundException;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.blobstore.strategy.ContainsValueInListStrategy; import org.jclouds.blobstore.strategy.ContainsValueInListStrategy;
import org.jclouds.blobstore.strategy.GetBlobsInListStrategy; import org.jclouds.blobstore.strategy.GetBlobsInListStrategy;
import org.jclouds.blobstore.strategy.PutBlobsStrategy; import org.jclouds.blobstore.strategy.PutBlobsStrategy;
import org.jclouds.blobstore.strategy.internal.ListContainerAndRecurseThroughFolders; import org.jclouds.blobstore.strategy.internal.ListContainerAndRecurseThroughFolders;
import com.google.common.collect.Sets; import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
/** /**
* Map representation of a live connection to a Blob Service. * Map representation of a live connection to a Blob Service.
@ -45,36 +51,59 @@ import com.google.common.collect.Sets;
* @author Adrian Cole * @author Adrian Cole
*/ */
public class BlobMapImpl extends BaseBlobMap<Blob> implements BlobMap { public class BlobMapImpl extends BaseBlobMap<Blob> implements BlobMap {
public static class CorrectBlobName implements Function<java.util.Map.Entry<? extends String, ? extends Blob>, Blob> {
private final Function<String, String> prefixer;
public CorrectBlobName(Function<String, String> prefixer) {
this.prefixer = checkNotNull(prefixer, "prefixer");
}
@Override
public Blob apply(java.util.Map.Entry<? extends String, ? extends Blob> arg0) {
return apply(arg0.getKey(), arg0.getValue());
}
public Blob apply(String key, Blob blob) {
blob.getMetadata().setName(prefixer.apply(key));
return blob;
}
}
private final CorrectBlobName correctBlobName;
private final Provider<BlobBuilder> blobBuilders;
@Inject @Inject
public BlobMapImpl(BlobStore blobstore, GetBlobsInListStrategy getAllBlobs, public BlobMapImpl(BlobStore blobstore, GetBlobsInListStrategy getAllBlobs,
ContainsValueInListStrategy containsValueStrategy, PutBlobsStrategy putBlobsStrategy, ContainsValueInListStrategy containsValueStrategy, PutBlobsStrategy putBlobsStrategy,
ListContainerAndRecurseThroughFolders listStrategy, String containerName, ListContainerOptions options) { ListContainerAndRecurseThroughFolders listStrategy, String containerName, ListContainerOptions options,
Provider<BlobBuilder> blobBuilders) {
super(blobstore, getAllBlobs, containsValueStrategy, putBlobsStrategy, listStrategy, containerName, options); super(blobstore, getAllBlobs, containsValueStrategy, putBlobsStrategy, listStrategy, containerName, options);
this.correctBlobName = new CorrectBlobName(prefixer);
this.blobBuilders = checkNotNull(blobBuilders, "blobBuilders");
} }
@Override @Override
public Blob get(Object key) { public Blob get(Object key) {
String realKey = prefixer.apply(key.toString()); String realKey = prefixer.apply(checkNotNull(key, "key").toString());
Blob blob = blobstore.getBlob(containerName, realKey); Blob blob = blobstore.getBlob(containerName, realKey);
return blob != null ? stripPrefix(blob) : null; return blob != null ? stripPrefix(blob) : null;
} }
@Override @Override
public Blob put(String key, Blob value) { public Blob put(String key, Blob value) {
Blob returnVal = getLastValue(key); Blob returnVal = getLastValue(checkNotNull(key, "key"));
blobstore.putBlob(containerName, value); blobstore.putBlob(containerName, correctBlobName.apply(key, value));
return returnVal; return returnVal;
} }
@Override @Override
public void putAll(Map<? extends String, ? extends Blob> map) { public void putAll(Map<? extends String, ? extends Blob> map) {
putBlobsStrategy.execute(containerName, map.values()); putBlobsStrategy.execute(containerName, transform(checkNotNull(map, "map").entrySet(), correctBlobName));
} }
@Override @Override
public Blob remove(Object key) { public Blob remove(Object key) {
Blob old = getLastValue(key); Blob old = getLastValue(checkNotNull(key, "key"));
String realKey = prefixer.apply(key.toString()); String realKey = prefixer.apply(key.toString());
blobstore.removeBlob(containerName, realKey); blobstore.removeBlob(containerName, realKey);
return old; return old;
@ -83,7 +112,7 @@ public class BlobMapImpl extends BaseBlobMap<Blob> implements BlobMap {
private Blob getLastValue(Object key) { private Blob getLastValue(Object key) {
Blob old; Blob old;
try { try {
old = get(key); old = get(checkNotNull(key, "key"));
} catch (KeyNotFoundException e) { } catch (KeyNotFoundException e) {
old = null; old = null;
} }
@ -92,12 +121,16 @@ public class BlobMapImpl extends BaseBlobMap<Blob> implements BlobMap {
@Override @Override
public Collection<Blob> values() { public Collection<Blob> values() {
return Sets.newLinkedHashSet(getAllBlobs.execute(containerName, options)); return ImmutableSet.copyOf(getAllBlobs.execute(containerName, options));
} }
@Override @Override
public Blob newBlob(String name) { public Blob newBlob(String name) {
return blobstore.newBlob(name); return blobBuilder().name(name).build();
} }
@Override
public BlobBuilder blobBuilder() {
return blobBuilders.get();
}
} }

View File

@ -30,11 +30,13 @@ import java.util.Collection;
import java.util.Map; import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider;
import org.jclouds.blobstore.BlobMap; import org.jclouds.blobstore.BlobMap;
import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.InputStreamMap; import org.jclouds.blobstore.InputStreamMap;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.blobstore.strategy.ContainsValueInListStrategy; import org.jclouds.blobstore.strategy.ContainsValueInListStrategy;
import org.jclouds.blobstore.strategy.GetBlobsInListStrategy; import org.jclouds.blobstore.strategy.GetBlobsInListStrategy;
@ -66,12 +68,11 @@ public class InputStreamMapImpl extends BaseBlobMap<InputStream> implements Inpu
protected final Crypto crypto; protected final Crypto crypto;
@Inject @Inject
public InputStreamMapImpl(BlobStore connection, Blob.Factory blobFactory, public InputStreamMapImpl(BlobStore connection, Provider<BlobBuilder> blobBuilders,
GetBlobsInListStrategy getAllBlobs, ListContainerAndRecurseThroughFolders listStrategy, GetBlobsInListStrategy getAllBlobs, ListContainerAndRecurseThroughFolders listStrategy,
ContainsValueInListStrategy containsValueStrategy, PutBlobsStrategy putBlobsStrategy, ContainsValueInListStrategy containsValueStrategy, PutBlobsStrategy putBlobsStrategy, String containerName,
String containerName, ListContainerOptions options, Crypto crypto) { ListContainerOptions options, Crypto crypto) {
super(connection, getAllBlobs, containsValueStrategy, putBlobsStrategy, listStrategy, super(connection, getAllBlobs, containsValueStrategy, putBlobsStrategy, listStrategy, containerName, options);
containerName, options);
this.crypto = crypto; this.crypto = crypto;
} }
@ -96,8 +97,7 @@ public class InputStreamMapImpl extends BaseBlobMap<InputStream> implements Inpu
@Override @Override
public Collection<InputStream> values() { public Collection<InputStream> values() {
return newArrayList(transform(getAllBlobs.execute(containerName, options), return newArrayList(transform(getAllBlobs.execute(containerName, options), new Function<Blob, InputStream>() {
new Function<Blob, InputStream>() {
public InputStream apply(Blob from) { public InputStream apply(Blob from) {
return getInputStreamOrNull(from); return getInputStreamOrNull(from);
} }
@ -132,8 +132,8 @@ public class InputStreamMapImpl extends BaseBlobMap<InputStream> implements Inpu
*/ */
@VisibleForTesting @VisibleForTesting
void putAllInternal(Map<? extends String, ? extends Object> map) { void putAllInternal(Map<? extends String, ? extends Object> map) {
putBlobsStrategy.execute(containerName, transform(map.entrySet(), putBlobsStrategy.execute(containerName,
new Function<Map.Entry<? extends String, ? extends Object>, Blob>() { transform(map.entrySet(), new Function<Map.Entry<? extends String, ? extends Object>, Blob>() {
@Override @Override
public Blob apply(Map.Entry<? extends String, ? extends Object> from) { public Blob apply(Map.Entry<? extends String, ? extends Object> from) {
String name = from.getKey(); String name = from.getKey();
@ -146,8 +146,7 @@ public class InputStreamMapImpl extends BaseBlobMap<InputStream> implements Inpu
@VisibleForTesting @VisibleForTesting
Blob newBlobWithMD5(String name, Object value) { Blob newBlobWithMD5(String name, Object value) {
Blob blob = blobstore.newBlob(prefixer.apply(name)); Blob blob = blobstore.blobBuilder(prefixer.apply(name)).payload(newPayload(value)).build();
blob.setPayload(newPayload(value));
try { try {
Payloads.calculateMD5(blob, crypto.md5()); Payloads.calculateMD5(blob, crypto.md5());
} catch (IOException e) { } catch (IOException e) {

View File

@ -19,15 +19,15 @@
package org.jclouds.blobstore.strategy.internal; package org.jclouds.blobstore.strategy.internal;
import static org.jclouds.io.Payloads.newByteArrayPayload;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.StorageType; import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.blobstore.reference.BlobStoreConstants; import org.jclouds.blobstore.reference.BlobStoreConstants;
import org.jclouds.blobstore.strategy.MkdirStrategy; import org.jclouds.blobstore.strategy.MkdirStrategy;
import org.jclouds.io.Payloads;
import com.google.inject.Inject; import com.google.inject.Inject;
@ -44,18 +44,17 @@ public class MarkerFileMkdirStrategy implements MkdirStrategy {
@Inject(optional = true) @Inject(optional = true)
@Named(BlobStoreConstants.PROPERTY_BLOBSTORE_DIRECTORY_SUFFIX) @Named(BlobStoreConstants.PROPERTY_BLOBSTORE_DIRECTORY_SUFFIX)
protected String directorySuffix = ""; protected String directorySuffix = "";
private final BlobStore connection; private final BlobStore blobStore;
@Inject @Inject
MarkerFileMkdirStrategy(BlobStore connection) { MarkerFileMkdirStrategy(BlobStore blobStore) {
this.connection = connection; this.blobStore = blobStore;
} }
public void execute(String containerName, String directory) { public void execute(String containerName, String directory) {
Blob blob = connection.newBlob(directory + directorySuffix); blobStore.putBlob(
blob.setPayload(Payloads.newByteArrayPayload(new byte[] {})); containerName,
blob.getPayload().getContentMetadata().setContentType("application/directory"); blobStore.blobBuilder(directory + directorySuffix).type(StorageType.RELATIVE_PATH)
blob.getMetadata().setType(StorageType.RELATIVE_PATH); .payload(newByteArrayPayload(new byte[] {})).contentType("application/directory").build());
connection.putBlob(containerName, blob);
} }
} }

View File

@ -68,7 +68,7 @@ public class PutBlobsStrategyImpl implements PutBlobsStrategy {
@Override @Override
public void execute(String containerName, Iterable<? extends Blob> blobs) { public void execute(String containerName, Iterable<? extends Blob> blobs) {
Map<Blob, Future<?>> responses = Maps.newHashMap(); Map<Blob, Future<?>> responses = Maps.newLinkedHashMap();
for (Blob blob : blobs) { for (Blob blob : blobs) {
responses.put(blob, ablobstore.putBlob(containerName, blob)); responses.put(blob, ablobstore.putBlob(containerName, blob));
} }

View File

@ -80,7 +80,8 @@ public class BlobStoreUtils {
} }
public static Blob newBlob(BlobStore blobStore, StorageMetadata blobMeta) { public static Blob newBlob(BlobStore blobStore, StorageMetadata blobMeta) {
Blob blob = checkNotNull(blobStore, "blobStore").newBlob(checkNotNull(blobMeta, "blobMeta").getName()); Blob blob = checkNotNull(blobStore, "blobStore").blobBuilder(checkNotNull(blobMeta, "blobMeta").getName())
.userMetadata(blobMeta.getUserMetadata()).build();
if (blobMeta instanceof BlobMetadata) { if (blobMeta instanceof BlobMetadata) {
HttpUtils.copy(((BlobMetadata) blobMeta).getContentMetadata(), blob.getMetadata().getContentMetadata()); HttpUtils.copy(((BlobMetadata) blobMeta).getContentMetadata(), blob.getMetadata().getContentMetadata());
} }
@ -89,7 +90,6 @@ public class BlobStoreUtils {
blob.getMetadata().setLastModified(blobMeta.getLastModified()); blob.getMetadata().setLastModified(blobMeta.getLastModified());
blob.getMetadata().setLocation(blobMeta.getLocation()); blob.getMetadata().setLocation(blobMeta.getLocation());
blob.getMetadata().setUri(blobMeta.getUri()); blob.getMetadata().setUri(blobMeta.getUri());
blob.getMetadata().setUserMetadata(blobMeta.getUserMetadata());
return blob; return blob;
} }

View File

@ -20,6 +20,7 @@
package org.jclouds.blobstore.util; package org.jclouds.blobstore.util;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.blobstore.util.internal.BlobUtilsImpl; import org.jclouds.blobstore.util.internal.BlobUtilsImpl;
@ -31,6 +32,7 @@ import com.google.inject.ImplementedBy;
*/ */
@ImplementedBy(BlobUtilsImpl.class) @ImplementedBy(BlobUtilsImpl.class)
public interface BlobUtils { public interface BlobUtils {
BlobBuilder blobBuilder();
Blob newBlob(String name); Blob newBlob(String name);

View File

@ -22,9 +22,11 @@ package org.jclouds.blobstore.util.internal;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.blobstore.strategy.ClearListStrategy; import org.jclouds.blobstore.strategy.ClearListStrategy;
import org.jclouds.blobstore.strategy.CountListStrategy; import org.jclouds.blobstore.strategy.CountListStrategy;
@ -41,7 +43,7 @@ import org.jclouds.blobstore.util.BlobUtils;
@Singleton @Singleton
public class BlobUtilsImpl implements BlobUtils { public class BlobUtilsImpl implements BlobUtils {
protected final Blob.Factory blobFactory; protected final Provider<BlobBuilder> blobBuilders;
protected final ClearListStrategy clearContainerStrategy; protected final ClearListStrategy clearContainerStrategy;
protected final GetDirectoryStrategy getDirectoryStrategy; protected final GetDirectoryStrategy getDirectoryStrategy;
protected final MkdirStrategy mkdirStrategy; protected final MkdirStrategy mkdirStrategy;
@ -49,10 +51,10 @@ public class BlobUtilsImpl implements BlobUtils {
protected final CountListStrategy countBlobsStrategy; protected final CountListStrategy countBlobsStrategy;
@Inject @Inject
protected BlobUtilsImpl(Blob.Factory blobFactory, ClearListStrategy clearContainerStrategy, protected BlobUtilsImpl(Provider<BlobBuilder> blobBuilders, ClearListStrategy clearContainerStrategy,
GetDirectoryStrategy getDirectoryStrategy, MkdirStrategy mkdirStrategy, GetDirectoryStrategy getDirectoryStrategy, MkdirStrategy mkdirStrategy, CountListStrategy countBlobsStrategy,
CountListStrategy countBlobsStrategy, DeleteDirectoryStrategy rmDirStrategy) { DeleteDirectoryStrategy rmDirStrategy) {
this.blobFactory = checkNotNull(blobFactory, "blobFactory"); this.blobBuilders = checkNotNull(blobBuilders, "blobBuilders");
this.clearContainerStrategy = checkNotNull(clearContainerStrategy, "clearContainerStrategy"); this.clearContainerStrategy = checkNotNull(clearContainerStrategy, "clearContainerStrategy");
this.getDirectoryStrategy = checkNotNull(getDirectoryStrategy, "getDirectoryStrategy"); this.getDirectoryStrategy = checkNotNull(getDirectoryStrategy, "getDirectoryStrategy");
this.mkdirStrategy = checkNotNull(mkdirStrategy, "mkdirStrategy"); this.mkdirStrategy = checkNotNull(mkdirStrategy, "mkdirStrategy");
@ -60,10 +62,14 @@ public class BlobUtilsImpl implements BlobUtils {
this.countBlobsStrategy = checkNotNull(countBlobsStrategy, "countBlobsStrategy"); this.countBlobsStrategy = checkNotNull(countBlobsStrategy, "countBlobsStrategy");
} }
@Override
public Blob newBlob(String name) { public Blob newBlob(String name) {
Blob blob = blobFactory.create(null); return blobBuilder().name(name).build();
blob.getMetadata().setName(name); }
return blob;
@Override
public BlobBuilder blobBuilder() {
return blobBuilders.get();
} }
public boolean directoryExists(String containerName, String directory) { public boolean directoryExists(String containerName, String directory) {

View File

@ -19,6 +19,7 @@
package org.jclouds.blobstore.integration; package org.jclouds.blobstore.integration;
import static com.google.common.collect.Iterables.getOnlyElement;
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.maxResults; import static org.jclouds.blobstore.options.ListContainerOptions.Builder.maxResults;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
@ -31,7 +32,7 @@ import org.jclouds.blobstore.domain.StorageMetadata;
import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest; import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.Iterables; import com.google.common.collect.ImmutableMap;
/** /**
* @author James Murty * @author James Murty
@ -44,22 +45,19 @@ public class TransientContainerIntegrationTest extends BaseContainerIntegrationT
public void testNotWithDetails() throws InterruptedException { public void testNotWithDetails() throws InterruptedException {
String key = "hello"; String key = "hello";
Blob object = context.getBlobStore().newBlob(key);
object.setPayload(TEST_STRING);
object.getMetadata().getContentMetadata().setContentType(MediaType.TEXT_PLAIN);
// NOTE all metadata in jclouds comes out as lowercase, in an effort to normalize the // NOTE all metadata in jclouds comes out as lowercase, in an effort to normalize the
// providers. // providers.
object.getMetadata().getUserMetadata().put("Adrian", "powderpuff"); Blob blob = context.getBlobStore().blobBuilder("hello").userMetadata(ImmutableMap.of("Adrian", "powderpuff"))
.payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN).build();
String containerName = getContainerName(); String containerName = getContainerName();
try { try {
addBlobToContainer(containerName, object); addBlobToContainer(containerName, blob);
validateContent(containerName, key); validateContent(containerName, key);
PageSet<? extends StorageMetadata> container = context.getBlobStore().list(containerName, PageSet<? extends StorageMetadata> container = context.getBlobStore().list(containerName, maxResults(1));
maxResults(1));
BlobMetadata metadata = (BlobMetadata) Iterables.getOnlyElement(container); BlobMetadata metadata = (BlobMetadata) getOnlyElement(container);
// transient container should be lenient and not return metadata on undetailed listing. // transient container should be lenient and not return metadata on undetailed listing.
assertEquals(metadata.getUserMetadata().size(), 0); assertEquals(metadata.getUserMetadata().size(), 0);

View File

@ -49,6 +49,7 @@ import javax.ws.rs.core.MediaType;
import org.jclouds.blobstore.ContainerNotFoundException; import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder.PayloadBlobBuilder;
import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.PageSet;
import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageMetadata;
@ -73,6 +74,7 @@ import org.testng.annotations.Test;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.io.ByteStreams; import com.google.common.io.ByteStreams;
@ -120,8 +122,8 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
Map<Integer, Future<?>> responses = Maps.newHashMap(); Map<Integer, Future<?>> responses = Maps.newHashMap();
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
responses.put(i, Futures.compose(context.getAsyncBlobStore().getBlob(containerName, key), responses.put(i,
new Function<Blob, Void>() { Futures.compose(context.getAsyncBlobStore().getBlob(containerName, key), new Function<Blob, Void>() {
@Override @Override
public Void apply(Blob from) { public Void apply(Blob from) {
@ -147,13 +149,11 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
} }
private void uploadConstitution(String containerName, String key, String contentDisposition) throws IOException { private void uploadConstitution(String containerName, String key, String contentDisposition) throws IOException {
Blob sourceObject = context.getBlobStore().newBlob(key); context.getBlobStore().putBlob(
sourceObject.setPayload(oneHundredOneConstitutions.getInput()); containerName,
sourceObject.getMetadata().getContentMetadata().setContentType("text/plain"); context.getBlobStore().blobBuilder(key).payload(oneHundredOneConstitutions.getInput())
sourceObject.getMetadata().getContentMetadata().setContentMD5(oneHundredOneConstitutionsMD5); .contentType("text/plain").contentMD5(oneHundredOneConstitutionsMD5)
sourceObject.getMetadata().getContentMetadata().setContentLength(oneHundredOneConstitutionsLength); .contentLength(oneHundredOneConstitutionsLength).contentDisposition(contentDisposition).build());
sourceObject.getMetadata().getContentMetadata().setContentDisposition(contentDisposition);
context.getBlobStore().putBlob(containerName, sourceObject);
} }
@Test(groups = { "integration", "live" }) @Test(groups = { "integration", "live" })
@ -364,8 +364,8 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
@DataProvider(name = "delete") @DataProvider(name = "delete")
public Object[][] createData() { public Object[][] createData() {
return new Object[][] { { "normal" }, { "sp ace" }, { "qu?stion" }, { "unic₪de" }, { "path/foo" }, { "colon:" }, return new Object[][] { { "normal" }, { "sp ace" }, { "qu?stion" }, { "unic₪de" }, { "path/foo" },
{ "asteri*k" }, { "quote\"" }, { "{great<r}" }, { "lesst>en" }, { "p|pe" } }; { "colon:" }, { "asteri*k" }, { "quote\"" }, { "{great<r}" }, { "lesst>en" }, { "p|pe" } };
} }
@Test(groups = { "integration", "live" }, dataProvider = "delete") @Test(groups = { "integration", "live" }, dataProvider = "delete")
@ -390,9 +390,11 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
} }
}); });
assertEquals(Iterables.size(listing), 0, String.format( assertEquals(
"deleting %s, we still have %s blobs left in container %s, using encoding %s", key, Iterables Iterables.size(listing),
.size(listing), containerName, LOCAL_ENCODING)); 0,
String.format("deleting %s, we still have %s blobs left in container %s, using encoding %s", key,
Iterables.size(listing), containerName, LOCAL_ENCODING));
} }
@Test(groups = { "integration", "live" }) @Test(groups = { "integration", "live" })
@ -419,14 +421,13 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
@Test(groups = { "integration", "live" }, dataProvider = "putTests") @Test(groups = { "integration", "live" }, dataProvider = "putTests")
public void testPutObject(String key, String type, Object content, Object realObject) throws InterruptedException, public void testPutObject(String key, String type, Object content, Object realObject) throws InterruptedException,
IOException { IOException {
Blob blob = context.getBlobStore().newBlob(key); PayloadBlobBuilder blobBuilder = context.getBlobStore().blobBuilder(key).payload(Payloads.newPayload(content))
blob.setPayload(Payloads.newPayload(content)); .contentType(type);
blob.getMetadata().getContentMetadata().setContentType(type); addContentMetadata(blobBuilder);
addContentMetadata(blob);
if (content instanceof InputStream) { if (content instanceof InputStream) {
Payloads.calculateMD5(blob, context.utils().crypto().md5()); blobBuilder.calculateMD5();
} }
Blob blob = blobBuilder.build();
String containerName = getContainerName(); String containerName = getContainerName();
try { try {
assertNotNull(context.getBlobStore().putBlob(containerName, blob)); assertNotNull(context.getBlobStore().putBlob(containerName, blob));
@ -444,14 +445,15 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
@Test(groups = { "integration", "live" }) @Test(groups = { "integration", "live" })
public void testPutObjectStream() throws InterruptedException, IOException, ExecutionException { public void testPutObjectStream() throws InterruptedException, IOException, ExecutionException {
Blob blob = context.getBlobStore().newBlob("streaming"); PayloadBlobBuilder blobBuilder = context.getBlobStore().blobBuilder("streaming").payload(new StreamingPayload(new WriteTo() {
blob.setPayload(new StreamingPayload(new WriteTo() {
@Override @Override
public void writeTo(OutputStream outstream) throws IOException { public void writeTo(OutputStream outstream) throws IOException {
outstream.write("foo".getBytes()); outstream.write("foo".getBytes());
} }
})); }));
addContentMetadata(blob); addContentMetadata(blobBuilder);
Blob blob = blobBuilder.build();
String containerName = getContainerName(); String containerName = getContainerName();
try { try {
@ -476,11 +478,11 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
checkContentLanguage(blob, "en"); checkContentLanguage(blob, "en");
} }
private void addContentMetadata(Blob blob) { private void addContentMetadata(PayloadBlobBuilder blobBuilder) {
blob.getMetadata().getContentMetadata().setContentType("text/csv"); blobBuilder.contentType("text/csv");
blob.getMetadata().getContentMetadata().setContentDisposition("attachment; filename=photo.jpg"); blobBuilder.contentDisposition("attachment; filename=photo.jpg");
blob.getMetadata().getContentMetadata().setContentEncoding("gzip"); blobBuilder.contentEncoding("gzip");
blob.getMetadata().getContentMetadata().setContentLanguage("en"); blobBuilder.contentLanguage("en");
} }
protected void checkContentType(Blob blob, String contentType) { protected void checkContentType(Blob blob, String contentType) {
@ -526,15 +528,11 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
@Test(groups = { "integration", "live" }) @Test(groups = { "integration", "live" })
public void testMetadata() throws InterruptedException, IOException { public void testMetadata() throws InterruptedException, IOException {
String key = "hello"; String key = "hello";
Blob blob = context.getBlobStore().newBlob(key);
blob.setPayload(TEST_STRING);
blob.getMetadata().getContentMetadata().setContentType(MediaType.TEXT_PLAIN);
// NOTE all metadata in jclouds comes out as lowercase, in an effort to // NOTE all metadata in jclouds comes out as lowercase, in an effort to
// normalize the // normalize the
// providers. // providers.
blob.getMetadata().getUserMetadata().put("Adrian", "powderpuff"); Blob blob = context.getBlobStore().blobBuilder(key).userMetadata(ImmutableMap.of("Adrian", "powderpuff"))
Payloads.calculateMD5(blob, context.utils().crypto().md5()); .payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN).calculateMD5().build();
String containerName = getContainerName(); String containerName = getContainerName();
try { try {
assertNull(context.getBlobStore().blobMetadata(containerName, "powderpuff")); assertNull(context.getBlobStore().blobMetadata(containerName, "powderpuff"));

View File

@ -61,10 +61,7 @@ public class BaseBlobLiveTest extends BaseBlobStoreIntegrationTest {
long length = connection.getContentLength(); long length = connection.getContentLength();
InputStream input = connection.getInputStream(); InputStream input = connection.getInputStream();
Blob blob = context.getBlobStore().newBlob(name); Blob blob = context.getBlobStore().blobBuilder(name).payload(input).contentLength(length).contentMD5(md5).build();
blob.setPayload(input);
blob.getPayload().getContentMetadata().setContentLength(length);
blob.getPayload().getContentMetadata().setContentMD5(md5);
String container = getContainerName(); String container = getContainerName();
try { try {
context.getBlobStore().putBlob(container, blob); context.getBlobStore().putBlob(container, blob);

View File

@ -20,17 +20,16 @@
package org.jclouds.blobstore.integration.internal; package org.jclouds.blobstore.integration.internal;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.inDirectory;
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.maxResults; import static org.jclouds.blobstore.options.ListContainerOptions.Builder.maxResults;
import static org.jclouds.blobstore.util.BlobStoreUtils.getContentAsStringOrNullAndClose; import static org.jclouds.blobstore.util.BlobStoreUtils.getContentAsStringOrNullAndClose;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@ -42,7 +41,12 @@ import org.jclouds.io.Payloads;
import org.jclouds.util.Strings2; import org.jclouds.util.Strings2;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Function;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
/** /**
@ -52,19 +56,32 @@ import com.google.common.collect.Sets;
*/ */
public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<Blob> { public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<Blob> {
private static class StringToBlob implements Function<String, Blob> {
private final BlobMap map;
private StringToBlob(BlobMap map) {
this.map = map;
}
@Override
public Blob apply(String arg0) {
return map.blobBuilder().payload(arg0).build();
}
}
@Override @Override
@Test(groups = { "integration", "live" }) @Test(groups = { "integration", "live" })
public void testValues() throws IOException, InterruptedException { public void testValues() throws IOException, InterruptedException {
String bucketName = getContainerName(); String bucketName = getContainerName();
try { try {
Map<String, Blob> map = createMap(context, bucketName); BlobMap map = createMap(context, bucketName);
putFiveStrings(map); putFiveStrings(map);
putFiveStringsUnderPath(map); putFiveStringsUnderPath(map);
Collection<Blob> blobs = map.values(); Collection<Blob> blobs = map.values();
assertConsistencyAwareMapSize(map, 5); assertConsistencyAwareMapSize(map, 5);
Set<String> blobsAsString = new HashSet<String>(); Set<String> blobsAsString = Sets.newLinkedHashSet();
for (Blob blob : blobs) { for (Blob blob : blobs) {
blobsAsString.add(getContentAsStringOrNullAndClose(blob)); blobsAsString.add(getContentAsStringOrNullAndClose(blob));
} }
@ -110,7 +127,7 @@ public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<
public void testEntrySet() throws IOException, InterruptedException { public void testEntrySet() throws IOException, InterruptedException {
String bucketName = getContainerName(); String bucketName = getContainerName();
try { try {
final Map<String, Blob> map = createMap(context, bucketName); final BlobMap map = createMap(context, bucketName);
putFiveStrings(map); putFiveStrings(map);
assertConsistencyAwareMapSize(map, 5); assertConsistencyAwareMapSize(map, 5);
Set<Entry<String, Blob>> entries = map.entrySet(); Set<Entry<String, Blob>> entries = map.entrySet();
@ -145,9 +162,7 @@ public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<
try { try {
Map<String, Blob> map = createMap(context, bucketName); Map<String, Blob> map = createMap(context, bucketName);
putStringWithMD5(map, "one", "apple"); putStringWithMD5(map, "one", "apple");
Blob blob = context.getBlobStore().newBlob("one"); Blob blob = context.getBlobStore().blobBuilder("one").payload("apple").calculateMD5().build();
blob.setPayload("apple");
Payloads.calculateMD5(blob);
assertConsistencyAwareContainsValue(map, blob); assertConsistencyAwareContainsValue(map, blob);
} finally { } finally {
returnContainer(bucketName); returnContainer(bucketName);
@ -172,9 +187,8 @@ public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<
String bucketName = getContainerName(); String bucketName = getContainerName();
try { try {
Map<String, Blob> map = createMap(context, bucketName); Map<String, Blob> map = createMap(context, bucketName);
Blob blob = context.getBlobStore().newBlob("one"); Blob blob = context.getBlobStore().blobBuilder("one").payload(Strings2.toInputStream("apple")).calculateMD5()
blob.setPayload(Strings2.toInputStream("apple")); .build();
Payloads.calculateMD5(blob);
Blob old = map.put(blob.getMetadata().getName(), blob); Blob old = map.put(blob.getMetadata().getName(), blob);
getOneReturnsAppleAndOldValueIsNull(map, old); getOneReturnsAppleAndOldValueIsNull(map, old);
blob.setPayload(Strings2.toInputStream("bear")); blob.setPayload(Strings2.toInputStream("bear"));
@ -191,16 +205,16 @@ public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<
String bucketName = getContainerName(); String bucketName = getContainerName();
try { try {
Map<String, Blob> map = createMap(context, bucketName); Map<String, Blob> map = createMap(context, bucketName);
Map<String, Blob> newMap = new HashMap<String, Blob>(); ImmutableMap.Builder<String, Blob> newMap = ImmutableMap.<String, Blob> builder();
for (String key : fiveInputs.keySet()) { for (String key : fiveInputs.keySet()) {
Blob blob = context.getBlobStore().newBlob(key); newMap.put(
blob.setPayload(fiveInputs.get(key)); key,
blob.getPayload().getContentMetadata().setContentLength((long) fiveBytes.get(key).length); context.getBlobStore().blobBuilder(key).payload(fiveInputs.get(key))
newMap.put(key, blob); .contentLength((long) fiveBytes.get(key).length).build());
} }
map.putAll(newMap); map.putAll(newMap.build());
assertConsistencyAwareMapSize(map, 5); assertConsistencyAwareMapSize(map, 5);
assertConsistencyAwareKeySetEquals(map, new HashSet<String>(fiveInputs.keySet())); assertConsistencyAwareKeySetEquals(map, ImmutableSet.copyOf(fiveInputs.keySet()));
fourLeftRemovingOne(map); fourLeftRemovingOne(map);
} finally { } finally {
returnContainer(bucketName); returnContainer(bucketName);
@ -213,23 +227,21 @@ public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<
return; return;
String bucketName = getContainerName(); String bucketName = getContainerName();
try { try {
Map<String, Blob> map = createMap(context, bucketName); BlobMap map = createMap(context, bucketName);
Set<String> keySet = Sets.newHashSet(); Builder<String> keySet = ImmutableSet.<String> builder();
for (int i = 0; i < maxResultsForTestListings() + 1; i++) { for (int i = 0; i < maxResultsForTestListings() + 1; i++) {
keySet.add(i + ""); keySet.add(i + "");
} }
Map<String, Blob> newMap = new HashMap<String, Blob>(); Map<String, Blob> newMap = Maps.newLinkedHashMap();
for (String key : keySet) { for (String key : keySet.build()) {
Blob blob = context.getBlobStore().newBlob(key); newMap.put(key, map.blobBuilder().payload(key).build());
blob.setPayload(key);
newMap.put(key, blob);
} }
map.putAll(newMap); map.putAll(newMap);
newMap.clear(); newMap.clear();
assertConsistencyAwareMapSize(map, maxResultsForTestListings() + 1); assertConsistencyAwareMapSize(map, maxResultsForTestListings() + 1);
assertConsistencyAwareKeySetEquals(map, keySet); assertConsistencyAwareKeySetEquals(map, keySet.build());
map.clear(); map.clear();
assertConsistencyAwareMapSize(map, 0); assertConsistencyAwareMapSize(map, 0);
} finally { } finally {
@ -239,30 +251,15 @@ public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<
@Override @Override
protected void putStringWithMD5(Map<String, Blob> map, String key, String text) throws IOException { protected void putStringWithMD5(Map<String, Blob> map, String key, String text) throws IOException {
Blob blob = context.getBlobStore().newBlob(key); map.put(key, context.getBlobStore().blobBuilder(key).payload(text).calculateMD5().build());
blob.setPayload(text);
Payloads.calculateMD5(blob);
map.put(key, blob);
} }
protected void putFiveStrings(Map<String, Blob> map) { protected void putFiveStrings(BlobMap map) {
Map<String, Blob> newMap = new HashMap<String, Blob>(); map.putAll(Maps.transformValues(fiveStrings, new StringToBlob(map)));
for (Map.Entry<String, String> entry : fiveStrings.entrySet()) {
Blob blob = context.getBlobStore().newBlob(entry.getKey());
blob.setPayload(entry.getValue());
newMap.put(entry.getKey(), blob);
}
map.putAll(newMap);
} }
protected void putFiveStringsUnderPath(Map<String, Blob> map) { protected void putFiveStringsUnderPath(BlobMap map) {
Map<String, Blob> newMap = new HashMap<String, Blob>(); map.putAll(Maps.transformValues(fiveStringsUnderPath, new StringToBlob(map)));
for (Map.Entry<String, String> entry : fiveStringsUnderPath.entrySet()) {
Blob blob = context.getBlobStore().newBlob(entry.getKey());
blob.setPayload(entry.getValue());
newMap.put(entry.getKey(), blob);
}
map.putAll(newMap);
} }
protected int maxResultsForTestListings() { protected int maxResultsForTestListings() {
@ -276,4 +273,20 @@ public abstract class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<
protected BlobMap createMap(BlobStoreContext context, String bucket, ListContainerOptions options) { protected BlobMap createMap(BlobStoreContext context, String bucket, ListContainerOptions options) {
return context.createBlobMap(bucket, options); return context.createBlobMap(bucket, options);
} }
@Override
protected void addTenObjectsUnderPrefix(String containerName, String prefix) throws InterruptedException {
BlobMap blobMap = createMap(context, containerName, inDirectory(prefix));
for (int i = 0; i < 10; i++) {
blobMap.put(i + "", blobMap.blobBuilder().payload(i + "content").build());
}
}
@Override
protected void addTenObjectsUnderRoot(String containerName) throws InterruptedException {
BlobMap blobMap = createMap(context, containerName, ListContainerOptions.NONE);
for (int i = 0; i < 10; i++) {
blobMap.put(i + "", blobMap.blobBuilder().payload(i + "content").build());
}
}
} }

View File

@ -41,9 +41,7 @@ public class BaseBlobSignerLiveTest extends BaseBlobStoreIntegrationTest {
String name = "hello"; String name = "hello";
String text = "fooooooooooooooooooooooo"; String text = "fooooooooooooooooooooooo";
Blob blob = context.getBlobStore().newBlob(name); Blob blob = context.getBlobStore().blobBuilder(name).payload(text).contentType("text/plain").build();
blob.setPayload(text);
blob.getPayload().getContentMetadata().setContentType("text/plain");
String container = getContainerName(); String container = getContainerName();
try { try {
context.getBlobStore().putBlob(container, blob); context.getBlobStore().putBlob(container, blob);
@ -62,9 +60,7 @@ public class BaseBlobSignerLiveTest extends BaseBlobStoreIntegrationTest {
String name = "hello"; String name = "hello";
String text = "fooooooooooooooooooooooo"; String text = "fooooooooooooooooooooooo";
Blob blob = context.getBlobStore().newBlob(name); Blob blob = context.getBlobStore().blobBuilder(name).payload(text).contentType("text/plain").build();
blob.setPayload(text);
blob.getPayload().getContentMetadata().setContentType("text/plain");
String container = getContainerName(); String container = getContainerName();
try { try {
context.getBlobStore().putBlob(container, blob); context.getBlobStore().putBlob(container, blob);
@ -82,9 +78,7 @@ public class BaseBlobSignerLiveTest extends BaseBlobStoreIntegrationTest {
String name = "hello"; String name = "hello";
String text = "fooooooooooooooooooooooo"; String text = "fooooooooooooooooooooooo";
Blob blob = context.getBlobStore().newBlob(name); Blob blob = context.getBlobStore().blobBuilder(name).payload(text).contentType("text/plain").build();
blob.setPayload(text);
blob.getPayload().getContentMetadata().setContentType("text/plain");
String container = getContainerName(); String container = getContainerName();
try { try {
HttpRequest request = context.getSigner().signPutBlob(container, blob); HttpRequest request = context.getSigner().signPutBlob(container, blob);

View File

@ -244,17 +244,14 @@ public class BaseBlobStoreIntegrationTest {
} }
protected String addBlobToContainer(String sourceContainer, String key, String payload, String contentType) { protected String addBlobToContainer(String sourceContainer, String key, String payload, String contentType) {
Blob sourceObject = context.getBlobStore().newBlob(key); Blob sourceObject = context.getBlobStore().blobBuilder(key).payload(payload).contentType(contentType).build();
sourceObject.setPayload(payload);
sourceObject.getMetadata().getContentMetadata().setContentType(contentType);
return addBlobToContainer(sourceContainer, sourceObject); return addBlobToContainer(sourceContainer, sourceObject);
} }
protected void add5BlobsUnderPathAnd5UnderRootToContainer(String sourceContainer) { protected void add5BlobsUnderPathAnd5UnderRootToContainer(String sourceContainer) {
for (Entry<String, String> entry : Iterables.concat(fiveStrings.entrySet(), fiveStringsUnderPath.entrySet())) { for (Entry<String, String> entry : Iterables.concat(fiveStrings.entrySet(), fiveStringsUnderPath.entrySet())) {
Blob sourceObject = context.getBlobStore().newBlob(entry.getKey()); Blob sourceObject = context.getBlobStore().blobBuilder(entry.getKey()).payload(entry.getValue())
sourceObject.setPayload(entry.getValue()); .contentType("text/xml").build();
sourceObject.getMetadata().getContentMetadata().setContentType("text/xml");
addBlobToContainer(sourceContainer, sourceObject); addBlobToContainer(sourceContainer, sourceObject);
} }
} }

View File

@ -40,9 +40,10 @@ import org.jclouds.blobstore.domain.PageSet;
import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageMetadata;
import org.jclouds.crypto.CryptoStreams; import org.jclouds.crypto.CryptoStreams;
import org.jclouds.io.InputSuppliers; import org.jclouds.io.InputSuppliers;
import org.jclouds.io.Payloads;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
/** /**
* @author Adrian Cole * @author Adrian Cole
*/ */
@ -60,8 +61,7 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest {
try { try {
context.getBlobStore().createContainerInLocation(null, containerName); context.getBlobStore().createContainerInLocation(null, containerName);
Blob blob = context.getBlobStore().newBlob("hello"); Blob blob = context.getBlobStore().blobBuilder("hello").payload(TEST_STRING).build();
blob.setPayload(TEST_STRING);
context.getBlobStore().putBlob(containerName, blob); context.getBlobStore().putBlob(containerName, blob);
context.getBlobStore().createContainerInLocation(null, containerName); context.getBlobStore().createContainerInLocation(null, containerName);
@ -74,18 +74,13 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest {
@Test(groups = { "integration", "live" }) @Test(groups = { "integration", "live" })
public void testWithDetails() throws InterruptedException, IOException { public void testWithDetails() throws InterruptedException, IOException {
String key = "hello"; String key = "hello";
Blob object = context.getBlobStore().newBlob(key);
object.setPayload(TEST_STRING);
object.getMetadata().getContentMetadata().setContentType(MediaType.TEXT_PLAIN);
// NOTE all metadata in jclouds comes out as lowercase, in an effort to
// normalize the
// providers.
object.getMetadata().getUserMetadata().put("Adrian", "powderpuff");
Payloads.calculateMD5(object, context.utils().crypto().md5());
String containerName = getContainerName(); String containerName = getContainerName();
try { try {
addBlobToContainer(containerName, object); addBlobToContainer(containerName,
// NOTE all metadata in jclouds comes out as lowercase, in an effort to
// normalize the providers.
context.getBlobStore().blobBuilder(key).userMetadata(ImmutableMap.of("Adrian", "powderpuff"))
.payload(TEST_STRING).contentType(MediaType.TEXT_PLAIN).calculateMD5().build());
validateContent(containerName, key); validateContent(containerName, key);
PageSet<? extends StorageMetadata> container = context.getBlobStore().list(containerName, PageSet<? extends StorageMetadata> container = context.getBlobStore().list(containerName,
@ -329,9 +324,8 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest {
protected void addAlphabetUnderRoot(String containerName) throws InterruptedException { protected void addAlphabetUnderRoot(String containerName) throws InterruptedException {
for (char letter = 'a'; letter <= 'z'; letter++) { for (char letter = 'a'; letter <= 'z'; letter++) {
Blob blob = context.getBlobStore().newBlob(letter + ""); context.getBlobStore().putBlob(containerName,
blob.setPayload(letter + "content"); context.getBlobStore().blobBuilder(letter + "").payload(letter + "content").build());
context.getBlobStore().putBlob(containerName, blob);
} }
assertContainerSize(containerName, 26); assertContainerSize(containerName, 26);
@ -351,17 +345,15 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest {
protected void add15UnderRoot(String containerName) throws InterruptedException { protected void add15UnderRoot(String containerName) throws InterruptedException {
for (int i = 0; i < 15; i++) { for (int i = 0; i < 15; i++) {
Blob blob = context.getBlobStore().newBlob(i + ""); context.getBlobStore().putBlob(containerName,
blob.setPayload(i + "content"); context.getBlobStore().blobBuilder(i + "").payload(i + "content").build());
context.getBlobStore().putBlob(containerName, blob);
} }
} }
protected void addTenObjectsUnderPrefix(String containerName, String prefix) throws InterruptedException { protected void addTenObjectsUnderPrefix(String containerName, String prefix) throws InterruptedException {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
Blob blob = context.getBlobStore().newBlob(prefix + "/" + i); context.getBlobStore().putBlob(containerName,
blob.setPayload(i + "content"); context.getBlobStore().blobBuilder(prefix + "/" + i).payload(i + "content").build());
context.getBlobStore().putBlob(containerName, blob);
} }
} }
} }

View File

@ -27,11 +27,10 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.Map.Entry;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@ -61,7 +60,7 @@ public abstract class BaseInputStreamMapIntegrationTest extends BaseMapIntegrati
assertConsistencyAwareMapSize(map, 5); assertConsistencyAwareMapSize(map, 5);
Collection<InputStream> values = map.values(); Collection<InputStream> values = map.values();
assertEquals(values.size(), 5); assertEquals(values.size(), 5);
Set<String> valuesAsString = new HashSet<String>(); Set<String> valuesAsString = Sets.newLinkedHashSet();
for (InputStream stream : values) { for (InputStream stream : values) {
valuesAsString.add(Strings2.toStringAndClose(stream)); valuesAsString.add(Strings2.toStringAndClose(stream));
} }
@ -77,7 +76,7 @@ public abstract class BaseInputStreamMapIntegrationTest extends BaseMapIntegrati
String containerName = getContainerName(); String containerName = getContainerName();
try { try {
InputStreamMap map = createMap(context, containerName); InputStreamMap map = createMap(context, containerName);
Set<String> keySet = Sets.newHashSet(); Set<String> keySet = Sets.newLinkedHashSet();
for (int i = 0; i < maxResultsForTestListings() + 1; i++) { for (int i = 0; i < maxResultsForTestListings() + 1; i++) {
keySet.add(i + ""); keySet.add(i + "");
} }

View File

@ -30,15 +30,14 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.Map.Entry;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.ListableMap; import org.jclouds.blobstore.ListableMap;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.util.Strings2; import org.jclouds.util.Strings2;
import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeClass;
@ -50,6 +49,7 @@ import org.testng.annotations.Test;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
@ -138,17 +138,15 @@ public abstract class BaseMapIntegrationTest<V> extends BaseBlobStoreIntegration
protected void addTenObjectsUnderPrefix(String containerName, String prefix) throws InterruptedException { protected void addTenObjectsUnderPrefix(String containerName, String prefix) throws InterruptedException {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
Blob blob = context.getBlobStore().newBlob(prefix + "/" + i); context.getBlobStore().putBlob(containerName,
blob.setPayload(i + "content"); context.getBlobStore().blobBuilder(prefix + "/" + i).payload(i + "content").build());
context.getBlobStore().putBlob(containerName, blob);
} }
} }
protected void addTenObjectsUnderRoot(String containerName) throws InterruptedException { protected void addTenObjectsUnderRoot(String containerName) throws InterruptedException {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
Blob blob = context.getBlobStore().newBlob(i + ""); context.getBlobStore().putBlob(containerName,
blob.setPayload(i + "content"); context.getBlobStore().blobBuilder(i + "").payload(i + "content").build());
context.getBlobStore().putBlob(containerName, blob);
} }
} }
@ -165,15 +163,28 @@ public abstract class BaseMapIntegrationTest<V> extends BaseBlobStoreIntegration
context.getBlobStore().createDirectory(containerName, directory); context.getBlobStore().createDirectory(containerName, directory);
addTenObjectsUnderRoot(containerName); addTenObjectsUnderRoot(containerName);
assertEquals(rootMap.size(), 10); assertEquals(rootMap.size(), 10);
assertEquals(ImmutableSortedSet.copyOf(rootMap.keySet()),
ImmutableSortedSet.of("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"));
assertEquals(rootRecursiveMap.size(), 10); assertEquals(rootRecursiveMap.size(), 10);
assertEquals(ImmutableSortedSet.copyOf(rootRecursiveMap.keySet()),
ImmutableSortedSet.of("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"));
assertEquals(inDirectoryMap.size(), 0); assertEquals(inDirectoryMap.size(), 0);
assertEquals(inDirectoryRecursiveMap.size(), 0); assertEquals(inDirectoryRecursiveMap.size(), 0);
addTenObjectsUnderPrefix(containerName, directory); addTenObjectsUnderPrefix(containerName, directory);
assertEquals(rootMap.size(), 10); assertEquals(rootMap.size(), 10);
assertEquals(ImmutableSortedSet.copyOf(rootMap.keySet()),
ImmutableSortedSet.of("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"));
assertEquals(rootRecursiveMap.size(), 20); assertEquals(rootRecursiveMap.size(), 20);
assertEquals(ImmutableSortedSet.copyOf(rootRecursiveMap.keySet()), ImmutableSet.of("0", "1", "2", "3", "4",
"5", "6", "7", "8", "9", "apps/0", "apps/1", "apps/2", "apps/3", "apps/4", "apps/5", "apps/6", "apps/7",
"apps/8", "apps/9"));
assertEquals(inDirectoryMap.size(), 10); assertEquals(inDirectoryMap.size(), 10);
assertEquals(ImmutableSortedSet.copyOf(inDirectoryMap.keySet()),
ImmutableSortedSet.of("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"));
assertEquals(inDirectoryRecursiveMap.size(), 10); assertEquals(inDirectoryRecursiveMap.size(), 10);
assertEquals(ImmutableSortedSet.copyOf(inDirectoryRecursiveMap.keySet()),
ImmutableSortedSet.of("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"));
context.getBlobStore().createDirectory(containerName, directory + "/" + directory); context.getBlobStore().createDirectory(containerName, directory + "/" + directory);
assertEquals(rootMap.size(), 10); assertEquals(rootMap.size(), 10);

View File

@ -25,10 +25,7 @@ import java.io.IOException;
import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.BlobStoreContextFactory; import org.jclouds.blobstore.BlobStoreContextFactory;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.blobstore.strategy.internal.ConcatenateContainerLists;
import org.jclouds.blobstore.strategy.internal.ListContainerAndRecurseThroughFolders;
import org.testng.annotations.BeforeTest; import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -48,9 +45,7 @@ public class BiggerThanPageSizeTest {
public void test() throws IOException { public void test() throws IOException {
blobstore.createContainerInLocation(null, "goodies"); blobstore.createContainerInLocation(null, "goodies");
for (int i = 0; i < 1001; i++) { for (int i = 0; i < 1001; i++) {
Blob blob = blobstore.newBlob(i + ""); blobstore.putBlob("goodies", blobstore.blobBuilder(i + "").payload(i + "").build());
blob.setPayload(i + "");
blobstore.putBlob("goodies", blob);
} }
assertEquals(blobstore.countBlobs("goodies"), 1001); assertEquals(blobstore.countBlobs("goodies"), 1001);
blobstore.clearContainer("goodies"); blobstore.clearContainer("goodies");
@ -60,9 +55,7 @@ public class BiggerThanPageSizeTest {
public void testStrategies() throws IOException { public void testStrategies() throws IOException {
blobstore.createContainerInLocation(null, "poo"); blobstore.createContainerInLocation(null, "poo");
for (int i = 0; i < 1001; i++) { for (int i = 0; i < 1001; i++) {
Blob blob = blobstore.newBlob(i + ""); blobstore.putBlob("poo", blobstore.blobBuilder(i + "").payload(i + "").build());
blob.setPayload(i + "");
blobstore.putBlob("poo", blob);
} }
ListContainerAndRecurseThroughFolders lister = new ListContainerAndRecurseThroughFolders( ListContainerAndRecurseThroughFolders lister = new ListContainerAndRecurseThroughFolders(

View File

@ -48,7 +48,7 @@ public class MutableResourceMetadataImpl<T extends Enum<T>> implements MutableRe
private Map<String, String> userMetadata; private Map<String, String> userMetadata;
public MutableResourceMetadataImpl() { public MutableResourceMetadataImpl() {
userMetadata = Maps.newHashMap(); userMetadata = Maps.newLinkedHashMap();
} }
public MutableResourceMetadataImpl(ResourceMetadata<T> from) { public MutableResourceMetadataImpl(ResourceMetadata<T> from) {

View File

@ -109,14 +109,16 @@ public class Payloads {
public static Payload calculateMD5(Payload payload, MessageDigest md5) throws IOException { public static Payload calculateMD5(Payload payload, MessageDigest md5) throws IOException {
checkNotNull(payload, "payload"); checkNotNull(payload, "payload");
if (!payload.isRepeatable()) { if (!payload.isRepeatable()) {
String oldContentType = payload.getContentMetadata().getContentType(); MutableContentMetadata oldContentMetadata = payload.getContentMetadata();
Payload oldPayload = payload; Payload oldPayload = payload;
try { try {
payload = newByteArrayPayload(toByteArray(payload)); payload = newByteArrayPayload(toByteArray(payload));
} finally { } finally {
oldPayload.release(); oldPayload.release();
} }
payload.getContentMetadata().setContentType(oldContentType); oldContentMetadata.setContentLength(payload.getContentMetadata().getContentLength());
oldContentMetadata.setContentMD5(payload.getContentMetadata().getContentMD5());
payload.setContentMetadata(oldContentMetadata);
} }
payload.getContentMetadata().setContentMD5(CryptoStreams.digest(payload, md5)); payload.getContentMetadata().setContentMD5(CryptoStreams.digest(payload, md5));
return payload; return payload;

View File

@ -35,7 +35,7 @@ import com.google.common.base.Function;
*/ */
@Singleton @Singleton
public class AzureBlobToBlob implements Function<AzureBlob, Blob> { public class AzureBlobToBlob implements Function<AzureBlob, Blob> {
private final Blob.Factory blobFactory; private final Factory blobFactory;
private final BlobPropertiesToBlobMetadata blobPr2BlobMd; private final BlobPropertiesToBlobMetadata blobPr2BlobMd;
@Inject @Inject