mirror of https://github.com/apache/jclouds.git
Issue 130, Issue 73: separated out provider context from abstraction. accessible via getProviderSpecificContext
git-svn-id: http://jclouds.googlecode.com/svn/trunk@2684 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
fd5147e09f
commit
9b39988ad7
|
@ -21,8 +21,6 @@ package org.jclouds.atmosonline.saas.blobstore;
|
|||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStoragePropertiesBuilder;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
|
@ -43,21 +41,19 @@ import com.google.inject.Module;
|
|||
* @see AtmosBlobStoreContext
|
||||
*/
|
||||
public class AtmosBlobStoreContextFactory {
|
||||
public static BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> createContext(
|
||||
Properties properties, Module... modules) {
|
||||
public static BlobStoreContext createContext(Properties properties, Module... modules) {
|
||||
return new AtmosBlobStoreContextBuilder(new AtmosStoragePropertiesBuilder(properties).build())
|
||||
.withModules(modules).buildContext();
|
||||
.withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> createContext(
|
||||
String uid, String key, Module... modules) {
|
||||
public static BlobStoreContext createContext(String uid, String key, Module... modules) {
|
||||
return new AtmosBlobStoreContextBuilder(new AtmosStoragePropertiesBuilder(uid, key).build())
|
||||
.withModules(modules).buildContext();
|
||||
.withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> createContext(
|
||||
URI endpoint, String uid, String key, Module... modules) {
|
||||
public static BlobStoreContext createContext(URI endpoint, String uid, String key,
|
||||
Module... modules) {
|
||||
return new AtmosBlobStoreContextBuilder(new AtmosStoragePropertiesBuilder(uid, key)
|
||||
.withEndpoint(endpoint).build()).withModules(modules).buildContext();
|
||||
.withEndpoint(endpoint).build()).withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,34 +18,28 @@
|
|||
*/
|
||||
package org.jclouds.atmosonline.saas.blobstore.config;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorage;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.atmosonline.saas.blobstore.AtmosAsyncBlobStore;
|
||||
import org.jclouds.atmosonline.saas.blobstore.AtmosBlobStore;
|
||||
import org.jclouds.atmosonline.saas.blobstore.strategy.FindMD5InUserMetadata;
|
||||
import org.jclouds.atmosonline.saas.blobstore.strategy.RecursiveRemove;
|
||||
import org.jclouds.atmosonline.saas.config.AtmosObjectModule;
|
||||
import org.jclouds.atmosonline.saas.reference.AtmosStorageConstants;
|
||||
import org.jclouds.atmosonline.saas.config.AtmosStorageContextModule;
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobMap;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.InputStreamMap;
|
||||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.config.BlobStoreObjectModule;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.blobstore.strategy.ClearContainerStrategy;
|
||||
import org.jclouds.blobstore.strategy.ClearListStrategy;
|
||||
import org.jclouds.blobstore.strategy.ContainsValueInListStrategy;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
|
@ -53,13 +47,12 @@ import com.google.inject.Provides;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class AtmosBlobStoreContextModule extends AbstractModule {
|
||||
public class AtmosBlobStoreContextModule extends AtmosStorageContextModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
install(new BlobStoreObjectModule());
|
||||
super.configure();
|
||||
install(new BlobStoreMapModule());
|
||||
install(new AtmosObjectModule());
|
||||
bind(AsyncBlobStore.class).to(AtmosAsyncBlobStore.class).asEagerSingleton();
|
||||
bind(BlobStore.class).to(AtmosBlobStore.class).asEagerSingleton();
|
||||
bind(ContainsValueInListStrategy.class).to(FindMD5InUserMetadata.class);
|
||||
|
@ -69,13 +62,12 @@ public class AtmosBlobStoreContextModule extends AbstractModule {
|
|||
|
||||
@Provides
|
||||
@Singleton
|
||||
BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> provideContext(
|
||||
BlobMap.Factory blobMapFactory, InputStreamMap.Factory inputStreamMapFactory,
|
||||
Closer closer, AsyncBlobStore asynchBlobStore, BlobStore blobStore, AtmosStorageAsyncClient async,
|
||||
AtmosStorageClient defaultApi, @AtmosStorage URI endPoint,
|
||||
@Named(AtmosStorageConstants.PROPERTY_EMCSAAS_UID) String account) {
|
||||
BlobStoreContext provideContext(BlobMap.Factory blobMapFactory,
|
||||
InputStreamMap.Factory inputStreamMapFactory, Closer closer,
|
||||
AsyncBlobStore asynchBlobStore, BlobStore blobStore,
|
||||
RestContext<AtmosStorageAsyncClient, AtmosStorageClient> context) {
|
||||
return new BlobStoreContextImpl<AtmosStorageAsyncClient, AtmosStorageClient>(blobMapFactory,
|
||||
inputStreamMapFactory, closer, asynchBlobStore, blobStore, async, defaultApi, endPoint, account);
|
||||
inputStreamMapFactory, asynchBlobStore, blobStore, context);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStoragePropertiesBuilder;
|
||||
import org.jclouds.atmosonline.saas.blobstore.config.AtmosBlobStoreContextModule;
|
||||
import org.jclouds.atmosonline.saas.config.AtmosStorageRestClientModule;
|
||||
|
@ -42,9 +41,7 @@ import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
|||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of modules configured in AtmosStorageContextBuilder
|
||||
|
@ -69,23 +66,22 @@ public class AtmosBlobStoreContextBuilderTest {
|
|||
}
|
||||
|
||||
public void testBuildContext() {
|
||||
BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> context = newBuilder()
|
||||
.buildContext();
|
||||
BlobStoreContext context = newBuilder().buildBlobStoreContext();
|
||||
assertEquals(context.getClass(), BlobStoreContextImpl.class);
|
||||
assertEquals(context.getAsyncApi().getClass(), StubAtmosStorageAsyncClient.class);
|
||||
assertEquals(context.getProviderSpecificContext().getAsyncApi().getClass(),
|
||||
StubAtmosStorageAsyncClient.class);
|
||||
assertEquals(context.getAsyncBlobStore().getClass(), AtmosAsyncBlobStore.class);
|
||||
assertEquals(context.getAsyncApi().newObject().getClass(), AtmosObjectImpl.class);
|
||||
assertEquals(((AtmosStorageAsyncClient)context.getProviderSpecificContext().getAsyncApi()).newObject().getClass(),
|
||||
AtmosObjectImpl.class);
|
||||
assertEquals(context.getAsyncBlobStore().newBlob(null).getClass(), BlobImpl.class);
|
||||
assertEquals(context.getAccount(), "id");
|
||||
assertEquals(context.getEndPoint(), URI.create("https://localhost/azurestub"));
|
||||
assertEquals(context.getProviderSpecificContext().getAccount(), "id");
|
||||
assertEquals(context.getProviderSpecificContext().getEndPoint(), URI
|
||||
.create("https://localhost/azurestub"));
|
||||
}
|
||||
|
||||
public void testBuildInjector() {
|
||||
Injector i = newBuilder().buildInjector();
|
||||
assert i
|
||||
.getInstance(Key
|
||||
.get(new TypeLiteral<BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient>>() {
|
||||
})) != null;
|
||||
assert i.getInstance(BlobStoreContext.class) != null;
|
||||
assert i.getInstance(AtmosObject.class) != null;
|
||||
assert i.getInstance(Blob.class) != null;
|
||||
}
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.jclouds.atmosonline.saas.blobstore.config;
|
|||
import static com.google.common.util.concurrent.Executors.sameThreadExecutor;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.atmosonline.saas.blobstore.strategy.FindMD5InUserMetadata;
|
||||
import org.jclouds.atmosonline.saas.config.AtmosStorageStubClientModule;
|
||||
import org.jclouds.atmosonline.saas.reference.AtmosStorageConstants;
|
||||
|
@ -36,8 +34,6 @@ import org.testng.annotations.Test;
|
|||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
|
@ -67,10 +63,7 @@ public class AtmosBlobStoreModuleTest {
|
|||
void testContextImpl() {
|
||||
|
||||
Injector injector = createInjector();
|
||||
BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> handler = injector
|
||||
.getInstance(Key
|
||||
.get(new TypeLiteral<BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient>>() {
|
||||
}));
|
||||
BlobStoreContext handler = injector.getInstance(BlobStoreContext.class);
|
||||
assertEquals(handler.getClass(), BlobStoreContextImpl.class);
|
||||
ContainsValueInListStrategy valueList = injector
|
||||
.getInstance(ContainsValueInListStrategy.class);
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.atmosonline.saas.blobstore.integration;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,13 +25,12 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "emcsaas.AtmosStorageContainerIntegrationTest")
|
||||
public class AtmosStorageContainerIntegrationTest extends
|
||||
BaseContainerIntegrationTest<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageContainerIntegrationTest extends BaseContainerIntegrationTest {
|
||||
|
||||
@Override
|
||||
@Test(enabled = false)
|
||||
// some reason this fails on the stub.
|
||||
public void testClearWhenContentsUnderPath() throws InterruptedException {
|
||||
public void testClearWhenContentsUnderPath() throws InterruptedException {
|
||||
super.testClearWhenContentsUnderPath();
|
||||
}
|
||||
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.atmosonline.saas.blobstore.integration;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseContainerLiveTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "emcsaas.AtmosStorageContainerLiveTest")
|
||||
public class AtmosStorageContainerLiveTest extends
|
||||
BaseContainerLiveTest<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageContainerLiveTest extends BaseContainerLiveTest {
|
||||
|
||||
}
|
|
@ -21,8 +21,6 @@ package org.jclouds.atmosonline.saas.blobstore.integration;
|
|||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseInputStreamMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -30,8 +28,7 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "emcsaas.AtmosStorageInputStreamMapIntegrationTest")
|
||||
public class AtmosStorageInputStreamMapIntegrationTest extends
|
||||
BaseInputStreamMapIntegrationTest<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageInputStreamMapIntegrationTest extends BaseInputStreamMapIntegrationTest {
|
||||
|
||||
@Override
|
||||
@Test(enabled = false)
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.atmosonline.saas.blobstore.integration;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
@ -29,8 +27,7 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "emcsaas.AtmosStorageIntegrationTest")
|
||||
public class AtmosStorageIntegrationTest extends
|
||||
BaseBlobIntegrationTest<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageIntegrationTest extends BaseBlobIntegrationTest {
|
||||
|
||||
@DataProvider(name = "delete")
|
||||
// no unicode support
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.atmosonline.saas.blobstore.integration;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobLiveTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -28,7 +26,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "emcsaas.AtmosStorageLiveTest")
|
||||
public class AtmosStorageLiveTest extends
|
||||
BaseBlobLiveTest<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageLiveTest extends BaseBlobLiveTest {
|
||||
|
||||
}
|
|
@ -21,8 +21,6 @@ package org.jclouds.atmosonline.saas.blobstore.integration;
|
|||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -30,8 +28,7 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "emcsaas.AtmosStorageMapIntegrationTest")
|
||||
public class AtmosStorageMapIntegrationTest extends
|
||||
BaseBlobMapIntegrationTest<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageMapIntegrationTest extends BaseBlobMapIntegrationTest {
|
||||
|
||||
@Override
|
||||
@Test(enabled = false)
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.atmosonline.saas.blobstore.integration;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "emcsaas.AtmosStorageServiceIntegrationTest")
|
||||
public class AtmosStorageServiceIntegrationTest extends
|
||||
BaseServiceIntegrationTest<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageServiceIntegrationTest extends BaseServiceIntegrationTest {
|
||||
|
||||
}
|
|
@ -21,8 +21,6 @@ package org.jclouds.atmosonline.saas.blobstore.integration;
|
|||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
||||
import org.jclouds.atmosonline.saas.blobstore.AtmosBlobStoreContextFactory;
|
||||
import org.jclouds.atmosonline.saas.config.AtmosStorageStubClientModule;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
|
@ -37,21 +35,17 @@ import com.google.inject.Module;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class AtmosStorageTestInitializer extends
|
||||
BaseTestInitializer<AtmosStorageAsyncClient, AtmosStorageClient> {
|
||||
public class AtmosStorageTestInitializer extends BaseTestInitializer {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> createLiveContext(
|
||||
Module configurationModule, String url, String app, String account, String key)
|
||||
throws IOException {
|
||||
return (BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient>) new BlobStoreContextFactory()
|
||||
.createContext("atmos", account, key, ImmutableSet.of(configurationModule,
|
||||
new Log4JLoggingModule()), new Properties());
|
||||
protected BlobStoreContext createLiveContext(Module configurationModule, String url, String app,
|
||||
String account, String key) throws IOException {
|
||||
return new BlobStoreContextFactory().createContext("atmos", account, key, ImmutableSet.of(
|
||||
configurationModule, new Log4JLoggingModule()), new Properties());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlobStoreContext<AtmosStorageAsyncClient, AtmosStorageClient> createStubContext() {
|
||||
protected BlobStoreContext createStubContext() {
|
||||
return AtmosBlobStoreContextFactory.createContext("user", "pass",
|
||||
new AtmosStorageStubClientModule());
|
||||
}
|
||||
|
|
|
@ -75,4 +75,5 @@ public class EC2ComputeServiceContextBuilder extends
|
|||
protected void addClientModule(List<Module> modules) {
|
||||
modules.add(new EC2RestClientModule());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.jclouds.aws.ec2.compute;
|
|||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.aws.ec2.EC2AsyncClient;
|
||||
import org.jclouds.aws.ec2.EC2Client;
|
||||
import org.jclouds.aws.ec2.EC2PropertiesBuilder;
|
||||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
|
@ -44,28 +42,28 @@ import com.google.inject.Module;
|
|||
* @see EC2ComputeServiceContext
|
||||
*/
|
||||
public class EC2ComputeServiceContextFactory {
|
||||
public static ComputeServiceContext<EC2AsyncClient, EC2Client> createContext(Properties properties,
|
||||
Module... modules) {
|
||||
public static ComputeServiceContext createContext(Properties properties, Module... modules) {
|
||||
return new EC2ComputeServiceContextBuilder(new EC2PropertiesBuilder(properties).build())
|
||||
.withModules(modules).buildContext();
|
||||
.withModules(modules).buildComputeServiceContext();
|
||||
}
|
||||
|
||||
public static ComputeServiceContext<EC2AsyncClient, EC2Client> createContext(String awsAccessKeyId,
|
||||
public static ComputeServiceContext createContext(String awsAccessKeyId,
|
||||
String awsSecretAccessKey, Module... modules) {
|
||||
return new EC2ComputeServiceContextBuilder(new EC2PropertiesBuilder(awsAccessKeyId,
|
||||
awsSecretAccessKey).build()).withModules(modules).buildContext();
|
||||
awsSecretAccessKey).build()).withModules(modules).buildComputeServiceContext();
|
||||
}
|
||||
|
||||
public static ComputeServiceContext<EC2AsyncClient, EC2Client> createContext(Properties properties,
|
||||
String awsAccessKeyId, String awsSecretAccessKey, Module... modules) {
|
||||
return new EC2ComputeServiceContextBuilder(new EC2PropertiesBuilder(properties).withCredentials(
|
||||
awsAccessKeyId, awsSecretAccessKey).build()).withModules(modules).buildContext();
|
||||
public static ComputeServiceContext createContext(Properties properties, String awsAccessKeyId,
|
||||
String awsSecretAccessKey, Module... modules) {
|
||||
return new EC2ComputeServiceContextBuilder(new EC2PropertiesBuilder(properties)
|
||||
.withCredentials(awsAccessKeyId, awsSecretAccessKey).build()).withModules(modules)
|
||||
.buildComputeServiceContext();
|
||||
}
|
||||
|
||||
public static ComputeServiceContext<EC2AsyncClient, EC2Client> createContext(URI endpoint,
|
||||
String awsAccessKeyId, String awsSecretAccessKey, Module... modules) {
|
||||
public static ComputeServiceContext createContext(URI endpoint, String awsAccessKeyId,
|
||||
String awsSecretAccessKey, Module... modules) {
|
||||
return new EC2ComputeServiceContextBuilder(new EC2PropertiesBuilder(awsAccessKeyId,
|
||||
awsSecretAccessKey).withEndpoint(endpoint).build()).withModules(modules)
|
||||
.buildContext();
|
||||
.buildComputeServiceContext();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,22 +18,17 @@
|
|||
*/
|
||||
package org.jclouds.aws.ec2.compute.config;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.aws.ec2.EC2;
|
||||
import org.jclouds.aws.ec2.EC2AsyncClient;
|
||||
import org.jclouds.aws.ec2.EC2Client;
|
||||
import org.jclouds.aws.ec2.compute.EC2ComputeService;
|
||||
import org.jclouds.aws.reference.AWSConstants;
|
||||
import org.jclouds.aws.ec2.config.EC2ContextModule;
|
||||
import org.jclouds.compute.ComputeService;
|
||||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.compute.internal.ComputeServiceContextImpl;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
|
@ -41,20 +36,19 @@ import com.google.inject.Provides;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class EC2ComputeServiceContextModule extends AbstractModule {
|
||||
public class EC2ComputeServiceContextModule extends EC2ContextModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
bind(ComputeService.class).to(EC2ComputeService.class).asEagerSingleton();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
ComputeServiceContext<EC2AsyncClient, EC2Client> provideContext(Closer closer,
|
||||
ComputeService computeService, EC2AsyncClient asynchApi, EC2Client defaultApi,
|
||||
@EC2 URI endPoint, @Named(AWSConstants.PROPERTY_AWS_ACCESSKEYID) String account) {
|
||||
return new ComputeServiceContextImpl<EC2AsyncClient, EC2Client>(closer, computeService,
|
||||
asynchApi, defaultApi, endPoint, account);
|
||||
ComputeServiceContext provideContext(ComputeService computeService,
|
||||
RestContext<EC2AsyncClient, EC2Client> context) {
|
||||
return new ComputeServiceContextImpl<EC2AsyncClient, EC2Client>(computeService, context);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,9 +26,7 @@ import javax.inject.Singleton;
|
|||
import org.jclouds.aws.ec2.EC2;
|
||||
import org.jclouds.aws.ec2.EC2AsyncClient;
|
||||
import org.jclouds.aws.ec2.EC2Client;
|
||||
import org.jclouds.aws.ec2.compute.EC2ComputeService;
|
||||
import org.jclouds.aws.reference.AWSConstants;
|
||||
import org.jclouds.compute.ComputeService;
|
||||
import org.jclouds.http.functions.config.ParserModule.CDateAdapter;
|
||||
import org.jclouds.http.functions.config.ParserModule.DateAdapter;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
|
@ -47,7 +45,6 @@ public class EC2ContextModule extends AbstractModule {
|
|||
@Override
|
||||
protected void configure() {
|
||||
bind(DateAdapter.class).to(CDateAdapter.class);
|
||||
bind(ComputeService.class).to(EC2ComputeService.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.jclouds.aws.s3.blobstore;
|
|||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.S3PropertiesBuilder;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
|
@ -43,28 +41,28 @@ import com.google.inject.Module;
|
|||
* @see S3BlobStoreContext
|
||||
*/
|
||||
public class S3BlobStoreContextFactory {
|
||||
public static BlobStoreContext<S3AsyncClient, S3Client> createContext(Properties properties,
|
||||
Module... modules) {
|
||||
public static BlobStoreContext createContext(Properties properties, Module... modules) {
|
||||
return new S3BlobStoreContextBuilder(new S3PropertiesBuilder(properties).build())
|
||||
.withModules(modules).buildContext();
|
||||
.withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext<S3AsyncClient, S3Client> createContext(String awsAccessKeyId,
|
||||
public static BlobStoreContext createContext(String awsAccessKeyId, String awsSecretAccessKey,
|
||||
Module... modules) {
|
||||
return new S3BlobStoreContextBuilder(new S3PropertiesBuilder(awsAccessKeyId,
|
||||
awsSecretAccessKey).build()).withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext createContext(Properties properties, String awsAccessKeyId,
|
||||
String awsSecretAccessKey, Module... modules) {
|
||||
return new S3BlobStoreContextBuilder(new S3PropertiesBuilder(properties).withCredentials(
|
||||
awsAccessKeyId, awsSecretAccessKey).build()).withModules(modules)
|
||||
.buildBlobStoreContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext createContext(URI endpoint, String awsAccessKeyId,
|
||||
String awsSecretAccessKey, Module... modules) {
|
||||
return new S3BlobStoreContextBuilder(new S3PropertiesBuilder(awsAccessKeyId,
|
||||
awsSecretAccessKey).build()).withModules(modules).buildContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext<S3AsyncClient, S3Client> createContext(Properties properties,
|
||||
String awsAccessKeyId, String awsSecretAccessKey, Module... modules) {
|
||||
return new S3BlobStoreContextBuilder(new S3PropertiesBuilder(properties).withCredentials(
|
||||
awsAccessKeyId, awsSecretAccessKey).build()).withModules(modules).buildContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext<S3AsyncClient, S3Client> createContext(URI endpoint,
|
||||
String awsAccessKeyId, String awsSecretAccessKey, Module... modules) {
|
||||
return new S3BlobStoreContextBuilder(new S3PropertiesBuilder(awsAccessKeyId,
|
||||
awsSecretAccessKey).withEndpoint(endpoint).build()).withModules(modules)
|
||||
.buildContext();
|
||||
.buildBlobStoreContext();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,29 +18,23 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.config;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.aws.reference.AWSConstants;
|
||||
import org.jclouds.aws.s3.S3;
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.blobstore.S3AsyncBlobStore;
|
||||
import org.jclouds.aws.s3.blobstore.S3BlobStore;
|
||||
import org.jclouds.aws.s3.config.S3ObjectModule;
|
||||
import org.jclouds.aws.s3.config.S3ContextModule;
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobMap;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.InputStreamMap;
|
||||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.config.BlobStoreObjectModule;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
|
@ -48,27 +42,24 @@ import com.google.inject.Provides;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class S3BlobStoreContextModule extends AbstractModule {
|
||||
public class S3BlobStoreContextModule extends S3ContextModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
install(new BlobStoreObjectModule());
|
||||
super.configure();
|
||||
install(new BlobStoreMapModule());
|
||||
install(new S3ObjectModule());
|
||||
bind(AsyncBlobStore.class).to(S3AsyncBlobStore.class).asEagerSingleton();
|
||||
bind(BlobStore.class).to(S3BlobStore.class).asEagerSingleton();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
BlobStoreContext<S3AsyncClient, S3Client> provideContext(BlobMap.Factory blobMapFactory,
|
||||
BlobStoreContext provideContext(BlobMap.Factory blobMapFactory,
|
||||
InputStreamMap.Factory inputStreamMapFactory, Closer closer,
|
||||
AsyncBlobStore asyncBlobstore, BlobStore blobStore, S3AsyncClient asynchApi,
|
||||
S3Client defaultApi, @S3 URI endPoint,
|
||||
@Named(AWSConstants.PROPERTY_AWS_ACCESSKEYID) String account) {
|
||||
AsyncBlobStore asynchBlobStore, BlobStore blobStore,
|
||||
RestContext<S3AsyncClient, S3Client> context) {
|
||||
return new BlobStoreContextImpl<S3AsyncClient, S3Client>(blobMapFactory,
|
||||
inputStreamMapFactory, closer, asyncBlobstore, blobStore, asynchApi, defaultApi,
|
||||
endPoint, account);
|
||||
inputStreamMapFactory, asynchBlobStore, blobStore, context);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ public class EC2ComputeServiceLiveTest {
|
|||
|
||||
private RetryablePredicate<InetSocketAddress> socketTester;
|
||||
private CreateNodeResponse node;
|
||||
private ComputeServiceContext<?, ?> context;
|
||||
private ComputeServiceContext context;
|
||||
|
||||
@BeforeGroups(groups = { "live" })
|
||||
public void setupClient() throws InterruptedException, ExecutionException, TimeoutException,
|
||||
|
|
|
@ -61,14 +61,17 @@ import com.google.common.collect.Maps;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "s3.S3ClientLiveTest")
|
||||
public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest {
|
||||
public S3Client getApi() {
|
||||
return (S3Client) context.getProviderSpecificContext().getApi();
|
||||
}
|
||||
|
||||
/**
|
||||
* this method overrides containerName to ensure it isn't found
|
||||
*/
|
||||
@Test(groups = { "integration", "live" })
|
||||
public void deleteContainerIfEmptyNotFound() throws Exception {
|
||||
assert context.getApi().deleteBucketIfEmpty("dbienf");
|
||||
assert getApi().deleteBucketIfEmpty("dbienf");
|
||||
}
|
||||
|
||||
@Test(groups = { "integration", "live" })
|
||||
|
@ -76,7 +79,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
String containerName = getContainerName();
|
||||
try {
|
||||
addBlobToContainer(containerName, "test");
|
||||
assert !context.getApi().deleteBucketIfEmpty(containerName);
|
||||
assert !getApi().deleteBucketIfEmpty(containerName);
|
||||
} finally {
|
||||
returnContainer(containerName);
|
||||
}
|
||||
|
@ -86,10 +89,10 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
String containerName = getContainerName();
|
||||
try {
|
||||
String key = "hello";
|
||||
S3Object object = context.getApi().newS3Object();
|
||||
S3Object object = getApi().newS3Object();
|
||||
object.getMetadata().setKey(key);
|
||||
object.setPayload(TEST_STRING);
|
||||
context.getApi().putObject(containerName, object,
|
||||
getApi().putObject(containerName, object,
|
||||
|
||||
withAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||
|
||||
|
@ -108,7 +111,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
addBlobToContainer(containerName, sourceKey);
|
||||
validateContent(containerName, sourceKey);
|
||||
|
||||
context.getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
destinationKey, overrideAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||
|
||||
validateContent(destinationContainer, destinationKey);
|
||||
|
@ -131,17 +134,17 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
final String publicReadWriteObjectKey = "public-read-write-acl";
|
||||
final String containerName = getContainerName();
|
||||
try {
|
||||
S3Object object = context.getApi().newS3Object();
|
||||
S3Object object = getApi().newS3Object();
|
||||
object.getMetadata().setKey(publicReadWriteObjectKey);
|
||||
object.setPayload("");
|
||||
// Public Read-Write object
|
||||
context.getApi().putObject(containerName, object,
|
||||
getApi().putObject(containerName, object,
|
||||
new PutObjectOptions().withAcl(CannedAccessPolicy.PUBLIC_READ_WRITE));
|
||||
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
AccessControlList acl = context.getApi().getObjectACL(containerName,
|
||||
AccessControlList acl = getApi().getObjectACL(containerName,
|
||||
publicReadWriteObjectKey);
|
||||
assertEquals(acl.getGrants().size(), 3);
|
||||
assertEquals(acl.getPermissions(GroupGranteeURI.ALL_USERS).size(), 2);
|
||||
|
@ -172,7 +175,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
|
||||
// Private object
|
||||
addBlobToContainer(containerName, objectKey);
|
||||
AccessControlList acl = context.getApi().getObjectACL(containerName, objectKey);
|
||||
AccessControlList acl = getApi().getObjectACL(containerName, objectKey);
|
||||
String ownerId = acl.getOwner().getId();
|
||||
|
||||
assertEquals(acl.getGrants().size(), 1);
|
||||
|
@ -180,10 +183,10 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
|
||||
addGrantsToACL(acl);
|
||||
assertEquals(acl.getGrants().size(), 4);
|
||||
assertTrue(context.getApi().putObjectACL(containerName, objectKey, acl));
|
||||
assertTrue(getApi().putObjectACL(containerName, objectKey, acl));
|
||||
|
||||
// Confirm that the updated ACL has stuck.
|
||||
acl = context.getApi().getObjectACL(containerName, objectKey);
|
||||
acl = getApi().getObjectACL(containerName, objectKey);
|
||||
checkGrants(acl);
|
||||
|
||||
/*
|
||||
|
@ -197,10 +200,10 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ));
|
||||
|
||||
// Update the object's ACL settings
|
||||
assertTrue(context.getApi().putObjectACL(containerName, objectKey, acl));
|
||||
assertTrue(getApi().putObjectACL(containerName, objectKey, acl));
|
||||
|
||||
// Confirm that the updated ACL has stuck
|
||||
acl = context.getApi().getObjectACL(containerName, objectKey);
|
||||
acl = getApi().getObjectACL(containerName, objectKey);
|
||||
assertEquals(acl.getGrants().size(), 1);
|
||||
assertEquals(acl.getPermissions(ownerId).size(), 0);
|
||||
assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl.toString());
|
||||
|
@ -217,7 +220,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
try {
|
||||
// Private object
|
||||
addBlobToContainer(containerName, privateObjectKey);
|
||||
AccessControlList acl = context.getApi().getObjectACL(containerName, privateObjectKey);
|
||||
AccessControlList acl = getApi().getObjectACL(containerName, privateObjectKey);
|
||||
|
||||
assertEquals(acl.getGrants().size(), 1);
|
||||
assertTrue(acl.getOwner() != null);
|
||||
|
@ -234,16 +237,16 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
final String publicReadObjectKey = "public-read-acl";
|
||||
final String containerName = getContainerName();
|
||||
try {
|
||||
S3Object object = context.getApi().newS3Object();
|
||||
S3Object object = getApi().newS3Object();
|
||||
object.getMetadata().setKey(publicReadObjectKey);
|
||||
object.setPayload("");
|
||||
context.getApi().putObject(containerName, object,
|
||||
getApi().putObject(containerName, object,
|
||||
new PutObjectOptions().withAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
AccessControlList acl = context.getApi().getObjectACL(containerName,
|
||||
AccessControlList acl = getApi().getObjectACL(containerName,
|
||||
publicReadObjectKey);
|
||||
|
||||
assertEquals(acl.getGrants().size(), 2);
|
||||
|
@ -265,17 +268,17 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
}
|
||||
|
||||
protected String addBlobToContainer(String sourceContainer, String key) {
|
||||
S3Object sourceObject = context.getApi().newS3Object();
|
||||
S3Object sourceObject = getApi().newS3Object();
|
||||
sourceObject.getMetadata().setKey(key);
|
||||
sourceObject.getMetadata().setContentType("text/xml");
|
||||
sourceObject.setPayload(TEST_STRING);
|
||||
return context.getApi().putObject(sourceContainer, sourceObject);
|
||||
return getApi().putObject(sourceContainer, sourceObject);
|
||||
}
|
||||
|
||||
protected S3Object validateObject(String sourceContainer, String key)
|
||||
throws InterruptedException, ExecutionException, TimeoutException, IOException {
|
||||
assertConsistencyAwareContainerSize(sourceContainer, 1);
|
||||
S3Object newObject = context.getApi().getObject(sourceContainer, key);
|
||||
S3Object newObject = getApi().getObject(sourceContainer, key);
|
||||
assert newObject != null;
|
||||
assertEquals(Utils.toStringAndClose(newObject.getContent()), TEST_STRING);
|
||||
return newObject;
|
||||
|
@ -284,14 +287,14 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
public void testMetadataWithCacheControlAndContentDisposition() throws Exception {
|
||||
String key = "hello";
|
||||
|
||||
S3Object object = context.getApi().newS3Object();
|
||||
S3Object object = getApi().newS3Object();
|
||||
object.getMetadata().setKey(key);
|
||||
object.setPayload(TEST_STRING);
|
||||
object.getMetadata().setCacheControl("no-cache");
|
||||
object.getMetadata().setContentDisposition("attachment; filename=hello.txt");
|
||||
String containerName = getContainerName();
|
||||
try {
|
||||
context.getApi().putObject(containerName, object);
|
||||
getApi().putObject(containerName, object);
|
||||
|
||||
S3Object newObject = validateObject(containerName, key);
|
||||
|
||||
|
@ -307,13 +310,13 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
public void testMetadataContentEncoding() throws Exception {
|
||||
String key = "hello";
|
||||
|
||||
S3Object object = context.getApi().newS3Object();
|
||||
S3Object object = getApi().newS3Object();
|
||||
object.getMetadata().setKey(key);
|
||||
object.setPayload(TEST_STRING);
|
||||
object.getMetadata().setContentEncoding("x-compress");
|
||||
String containerName = getContainerName();
|
||||
try {
|
||||
context.getApi().putObject(containerName, object);
|
||||
getApi().putObject(containerName, object);
|
||||
S3Object newObject = validateObject(containerName, key);
|
||||
|
||||
assertEquals(newObject.getMetadata().getContentEncoding(), "x-compress");
|
||||
|
@ -329,7 +332,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
try {
|
||||
addToContainerAndValidate(containerName, sourceKey);
|
||||
|
||||
context.getApi()
|
||||
getApi()
|
||||
.copyObject(containerName, sourceKey, destinationContainer, destinationKey);
|
||||
|
||||
validateContent(destinationContainer, destinationKey);
|
||||
|
@ -357,12 +360,12 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
addToContainerAndValidate(containerName, sourceKey + "mod");
|
||||
Date after = new Date(System.currentTimeMillis() + 1000);
|
||||
|
||||
context.getApi().copyObject(containerName, sourceKey + "mod", destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey + "mod", destinationContainer,
|
||||
destinationKey, ifSourceModifiedSince(before));
|
||||
validateContent(destinationContainer, destinationKey);
|
||||
|
||||
try {
|
||||
context.getApi().copyObject(containerName, sourceKey + "mod", destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey + "mod", destinationContainer,
|
||||
destinationKey, ifSourceModifiedSince(after));
|
||||
} catch (HttpResponseException ex) {
|
||||
assertEquals(ex.getResponse().getStatusCode(), 412);
|
||||
|
@ -384,12 +387,12 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
addToContainerAndValidate(containerName, sourceKey + "un");
|
||||
Date after = new Date(System.currentTimeMillis() + 1000);
|
||||
|
||||
context.getApi().copyObject(containerName, sourceKey + "un", destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey + "un", destinationContainer,
|
||||
destinationKey, ifSourceUnmodifiedSince(after));
|
||||
validateContent(destinationContainer, destinationKey);
|
||||
|
||||
try {
|
||||
context.getApi().copyObject(containerName, sourceKey + "un", destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey + "un", destinationContainer,
|
||||
destinationKey, ifSourceModifiedSince(before));
|
||||
} catch (HttpResponseException ex) {
|
||||
assertEquals(ex.getResponse().getStatusCode(), 412);
|
||||
|
@ -407,12 +410,12 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
try {
|
||||
String goodETag = addToContainerAndValidate(containerName, sourceKey);
|
||||
|
||||
context.getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
destinationKey, ifSourceETagMatches(goodETag));
|
||||
validateContent(destinationContainer, destinationKey);
|
||||
|
||||
try {
|
||||
context.getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
destinationKey, ifSourceETagMatches("setsds"));
|
||||
} catch (HttpResponseException ex) {
|
||||
assertEquals(ex.getResponse().getStatusCode(), 412);
|
||||
|
@ -430,12 +433,12 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
try {
|
||||
String goodETag = addToContainerAndValidate(containerName, sourceKey);
|
||||
|
||||
context.getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
destinationKey, ifSourceETagDoesntMatch("asfasdf"));
|
||||
validateContent(destinationContainer, destinationKey);
|
||||
|
||||
try {
|
||||
context.getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
destinationKey, ifSourceETagDoesntMatch(goodETag));
|
||||
} catch (HttpResponseException ex) {
|
||||
assertEquals(ex.getResponse().getStatusCode(), 412);
|
||||
|
@ -457,12 +460,12 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient
|
|||
Map<String, String> metadata = Maps.newHashMap();
|
||||
metadata.put("adrian", "cole");
|
||||
|
||||
context.getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
getApi().copyObject(containerName, sourceKey, destinationContainer,
|
||||
destinationKey, overrideMetadataWith(metadata));
|
||||
|
||||
validateContent(destinationContainer, destinationKey);
|
||||
|
||||
ObjectMetadata objectMeta = context.getApi().headObject(destinationContainer,
|
||||
ObjectMetadata objectMeta = getApi().headObject(destinationContainer,
|
||||
destinationKey);
|
||||
|
||||
assertEquals(objectMeta.getUserMetadata(), metadata);
|
||||
|
|
|
@ -28,7 +28,6 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.S3PropertiesBuilder;
|
||||
import org.jclouds.aws.s3.blobstore.config.S3BlobStoreContextModule;
|
||||
import org.jclouds.aws.s3.config.S3RestClientModule;
|
||||
|
@ -43,9 +42,7 @@ import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
|||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of modules configured in S3ContextBuilder
|
||||
|
@ -65,23 +62,24 @@ public class S3BlobStoreContextBuilderTest {
|
|||
}
|
||||
|
||||
public void testBuildContext() {
|
||||
BlobStoreContext<S3AsyncClient, S3Client> context = new S3BlobStoreContextBuilder(
|
||||
new S3PropertiesBuilder("id", "secret").build()).withModules(
|
||||
new S3StubClientModule()).buildContext();
|
||||
BlobStoreContext context = new S3BlobStoreContextBuilder(new S3PropertiesBuilder("id",
|
||||
"secret").build()).withModules(new S3StubClientModule()).buildBlobStoreContext();
|
||||
assertEquals(context.getClass(), BlobStoreContextImpl.class);
|
||||
assertEquals(context.getAsyncApi().getClass(), StubS3AsyncClient.class);
|
||||
assertEquals(context.getProviderSpecificContext().getAsyncApi().getClass(),
|
||||
StubS3AsyncClient.class);
|
||||
assertEquals(context.getAsyncBlobStore().getClass(), S3AsyncBlobStore.class);
|
||||
assertEquals(context.getAsyncApi().newS3Object().getClass(), S3ObjectImpl.class);
|
||||
assertEquals(((S3AsyncClient) context.getProviderSpecificContext().getAsyncApi())
|
||||
.newS3Object().getClass(), S3ObjectImpl.class);
|
||||
assertEquals(context.getAsyncBlobStore().newBlob(null).getClass(), BlobImpl.class);
|
||||
assertEquals(context.getAccount(), "id");
|
||||
assertEquals(context.getEndPoint(), URI.create("https://localhost/s3stub"));
|
||||
assertEquals(context.getProviderSpecificContext().getAccount(), "id");
|
||||
assertEquals(context.getProviderSpecificContext().getEndPoint(), URI
|
||||
.create("https://localhost/s3stub"));
|
||||
}
|
||||
|
||||
public void testBuildInjector() {
|
||||
Injector i = new S3BlobStoreContextBuilder(new S3PropertiesBuilder("id", "secret").build())
|
||||
.withModules(new S3StubClientModule()).buildInjector();
|
||||
assert i.getInstance(Key.get(new TypeLiteral<BlobStoreContext<S3AsyncClient, S3Client>>() {
|
||||
})) != null;
|
||||
assert i.getInstance(BlobStoreContext.class) != null;
|
||||
assert i.getInstance(S3Object.class) != null;
|
||||
assert i.getInstance(Blob.class) != null;
|
||||
}
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.jclouds.aws.s3.blobstore.config;
|
|||
import static com.google.common.util.concurrent.Executors.sameThreadExecutor;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.config.S3StubClientModule;
|
||||
import org.jclouds.aws.s3.reference.S3Constants;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
|
@ -34,8 +32,6 @@ import org.testng.annotations.Test;
|
|||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
|
@ -61,9 +57,7 @@ public class S3BlobStoreModuleTest {
|
|||
|
||||
@Test
|
||||
void testContextImpl() {
|
||||
BlobStoreContext<S3AsyncClient, S3Client> context = createInjector().getInstance(
|
||||
Key.get(new TypeLiteral<BlobStoreContext<S3AsyncClient, S3Client>>() {
|
||||
}));
|
||||
BlobStoreContext context = createInjector().getInstance(BlobStoreContext.class);
|
||||
assertEquals(context.getClass(), BlobStoreContextImpl.class);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.integration;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -29,6 +27,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "s3.S3BlobIntegrationTest")
|
||||
public class S3BlobIntegrationTest extends BaseBlobIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class S3BlobIntegrationTest extends BaseBlobIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.integration;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobLiveTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -29,6 +27,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "s3.S3BlobLiveTest")
|
||||
public class S3BlobLiveTest extends BaseBlobLiveTest<S3AsyncClient, S3Client> {
|
||||
public class S3BlobLiveTest extends BaseBlobLiveTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.integration;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,6 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "s3.S3BlobMapIntegrationTest")
|
||||
public class S3BlobMapIntegrationTest extends BaseBlobMapIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class S3BlobMapIntegrationTest extends BaseBlobMapIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.integration;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -28,7 +26,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "s3.S3ContainerIntegrationTest")
|
||||
public class S3ContainerIntegrationTest extends
|
||||
BaseContainerIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class S3ContainerIntegrationTest extends BaseContainerIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.integration;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.integration.internal.BaseContainerLiveTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -28,6 +26,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "s3.S3ContainerLiveTest")
|
||||
public class S3ContainerLiveTest extends BaseContainerLiveTest<S3AsyncClient, S3Client> {
|
||||
public class S3ContainerLiveTest extends BaseContainerLiveTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.integration;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.integration.internal.BaseInputStreamMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "s3.S3InputStreamMapIntegrationTest")
|
||||
public class S3InputStreamMapIntegrationTest extends
|
||||
BaseInputStreamMapIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class S3InputStreamMapIntegrationTest extends BaseInputStreamMapIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.blobstore.integration;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,6 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "s3.S3ServiceIntegrationTest")
|
||||
public class S3ServiceIntegrationTest extends BaseServiceIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class S3ServiceIntegrationTest extends BaseServiceIntegrationTest {
|
||||
|
||||
}
|
|
@ -21,8 +21,6 @@ package org.jclouds.aws.s3.blobstore.integration;
|
|||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
||||
import org.jclouds.aws.s3.config.S3StubClientModule;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
|
@ -38,20 +36,18 @@ import com.google.inject.Module;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class S3TestInitializer extends BaseTestInitializer<S3AsyncClient, S3Client> {
|
||||
public class S3TestInitializer extends BaseTestInitializer {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected BlobStoreContext<S3AsyncClient, S3Client> createLiveContext(
|
||||
Module configurationModule, String url, String app, String account, String key) throws IOException {
|
||||
protected BlobStoreContext createLiveContext(Module configurationModule, String url, String app,
|
||||
String account, String key) throws IOException {
|
||||
BaseBlobStoreIntegrationTest.SANITY_CHECK_RETURNED_BUCKET_NAME = true;
|
||||
return (BlobStoreContext<S3AsyncClient, S3Client>) new BlobStoreContextFactory()
|
||||
.createContext("s3", account, key, ImmutableSet.of(configurationModule,
|
||||
new Log4JLoggingModule()), new Properties());
|
||||
return new BlobStoreContextFactory().createContext("s3", account, key, ImmutableSet.of(
|
||||
configurationModule, new Log4JLoggingModule()), new Properties());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlobStoreContext<S3AsyncClient, S3Client> createStubContext() {
|
||||
protected BlobStoreContext createStubContext() {
|
||||
return S3BlobStoreContextFactory.createContext("user", "pass", new S3StubClientModule());
|
||||
}
|
||||
|
||||
|
|
|
@ -55,4 +55,5 @@ public class S3StubClientModule extends AbstractModule {
|
|||
SecurityException, NoSuchMethodException {
|
||||
return SyncProxy.create(S3Client.class, client);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -36,7 +36,6 @@ import java.util.concurrent.ExecutionException;
|
|||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.jclouds.aws.domain.Region;
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||
|
@ -64,14 +63,17 @@ import com.google.common.collect.ImmutableSet;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "s3.S3ClientLiveTest")
|
||||
public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class BucketsLiveTest extends BaseBlobStoreIntegrationTest {
|
||||
public S3Client getApi() {
|
||||
return (S3Client) context.getProviderSpecificContext().getApi();
|
||||
}
|
||||
|
||||
/**
|
||||
* this method overrides bucketName to ensure it isn't found
|
||||
*/
|
||||
@Test(groups = { "integration", "live" })
|
||||
public void deleteBucketIfEmptyNotFound() throws Exception {
|
||||
assert context.getApi().deleteBucketIfEmpty("dbienf");
|
||||
assert getApi().deleteBucketIfEmpty("dbienf");
|
||||
}
|
||||
|
||||
@Test(groups = { "integration", "live" })
|
||||
|
@ -79,7 +81,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
String bucketName = getContainerName();
|
||||
try {
|
||||
addBlobToContainer(bucketName, "test");
|
||||
assert !context.getApi().deleteBucketIfEmpty(bucketName);
|
||||
assert !getApi().deleteBucketIfEmpty(bucketName);
|
||||
} finally {
|
||||
returnContainer(bucketName);
|
||||
}
|
||||
|
@ -89,7 +91,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
TimeoutException, IOException {
|
||||
String bucketName = getContainerName();
|
||||
try {
|
||||
AccessControlList acl = context.getApi().getBucketACL(bucketName);
|
||||
AccessControlList acl = getApi().getBucketACL(bucketName);
|
||||
assertEquals(acl.getGrants().size(), 1);
|
||||
assertTrue(acl.getOwner() != null);
|
||||
String ownerId = acl.getOwner().getId();
|
||||
|
@ -105,17 +107,17 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
String bucketName = getContainerName();
|
||||
try {
|
||||
// Confirm the bucket is private
|
||||
AccessControlList acl = context.getApi().getBucketACL(bucketName);
|
||||
AccessControlList acl = getApi().getBucketACL(bucketName);
|
||||
String ownerId = acl.getOwner().getId();
|
||||
assertEquals(acl.getGrants().size(), 1);
|
||||
assertTrue(acl.hasPermission(ownerId, Permission.FULL_CONTROL));
|
||||
|
||||
addGrantsToACL(acl);
|
||||
assertEquals(acl.getGrants().size(), 4);
|
||||
assertTrue(context.getApi().putBucketACL(bucketName, acl));
|
||||
assertTrue(getApi().putBucketACL(bucketName, acl));
|
||||
|
||||
// Confirm that the updated ACL has stuck.
|
||||
acl = context.getApi().getBucketACL(bucketName);
|
||||
acl = getApi().getBucketACL(bucketName);
|
||||
checkGrants(acl);
|
||||
} finally {
|
||||
destroyContainer(bucketName);
|
||||
|
@ -147,9 +149,9 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
public void testPublicReadAccessPolicy() throws Exception {
|
||||
String bucketName = getScratchContainerName();
|
||||
try {
|
||||
context.getApi().putBucketInRegion(Region.DEFAULT, bucketName,
|
||||
getApi().putBucketInRegion(Region.DEFAULT, bucketName,
|
||||
withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||
AccessControlList acl = context.getApi().getBucketACL(bucketName);
|
||||
AccessControlList acl = getApi().getBucketACL(bucketName);
|
||||
assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl.toString());
|
||||
// TODO: I believe that the following should work based on the above acl assertion passing.
|
||||
// However, it fails on 403
|
||||
|
@ -175,7 +177,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
public void testDefaultBucketLocation() throws Exception {
|
||||
String bucketName = getContainerName();
|
||||
try {
|
||||
assertEquals(Region.US_STANDARD, context.getApi().getBucketLocation(bucketName));
|
||||
assertEquals(Region.US_STANDARD, getApi().getBucketLocation(bucketName));
|
||||
} finally {
|
||||
returnContainer(bucketName);
|
||||
}
|
||||
|
@ -184,23 +186,23 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
public void testBucketPayer() throws Exception {
|
||||
final String bucketName = getContainerName();
|
||||
try {
|
||||
assertEquals(Payer.BUCKET_OWNER, context.getApi().getBucketPayer(bucketName));
|
||||
context.getApi().setBucketPayer(bucketName, Payer.REQUESTER);
|
||||
assertEquals(Payer.BUCKET_OWNER, getApi().getBucketPayer(bucketName));
|
||||
getApi().setBucketPayer(bucketName, Payer.REQUESTER);
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
assertEquals(Payer.REQUESTER, context.getApi().getBucketPayer(bucketName));
|
||||
assertEquals(Payer.REQUESTER, getApi().getBucketPayer(bucketName));
|
||||
|
||||
} catch (Exception e) {
|
||||
Throwables.propagateIfPossible(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
context.getApi().setBucketPayer(bucketName, Payer.BUCKET_OWNER);
|
||||
getApi().setBucketPayer(bucketName, Payer.BUCKET_OWNER);
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
assertEquals(Payer.BUCKET_OWNER, context.getApi().getBucketPayer(bucketName));
|
||||
assertEquals(Payer.BUCKET_OWNER, getApi().getBucketPayer(bucketName));
|
||||
} catch (Exception e) {
|
||||
Throwables.propagateIfPossible(e);
|
||||
}
|
||||
|
@ -215,19 +217,19 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
final String bucketName = getContainerName();
|
||||
final String targetBucket = getContainerName();
|
||||
try {
|
||||
assertNull(context.getApi().getBucketLogging(bucketName));
|
||||
assertNull(getApi().getBucketLogging(bucketName));
|
||||
|
||||
setupAclForBucketLoggingTarget(targetBucket);
|
||||
final BucketLogging logging = new BucketLogging(targetBucket, "access_log-", ImmutableSet
|
||||
.<Grant> of(new Grant(new EmailAddressGrantee(StubS3AsyncClient.TEST_ACL_EMAIL),
|
||||
Permission.FULL_CONTROL)));
|
||||
|
||||
context.getApi().enableBucketLogging(bucketName, logging);
|
||||
getApi().enableBucketLogging(bucketName, logging);
|
||||
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
BucketLogging newLogging = context.getApi().getBucketLogging(bucketName);
|
||||
BucketLogging newLogging = getApi().getBucketLogging(bucketName);
|
||||
AccessControlList acl = new AccessControlList();
|
||||
for (Grant grant : newLogging.getTargetGrants()) { // TODO: add permission
|
||||
// checking features to
|
||||
|
@ -245,11 +247,11 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
}
|
||||
}
|
||||
});
|
||||
context.getApi().disableBucketLogging(bucketName);
|
||||
getApi().disableBucketLogging(bucketName);
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
assertNull(context.getApi().getBucketLogging(bucketName));
|
||||
assertNull(getApi().getBucketLogging(bucketName));
|
||||
} catch (Exception e) {
|
||||
Throwables.propagateIfPossible(e);
|
||||
}
|
||||
|
@ -263,10 +265,10 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
|
||||
private void setupAclForBucketLoggingTarget(final String targetBucket) {
|
||||
// http://docs.amazonwebservices.com/AmazonS3/latest/LoggingHowTo.html
|
||||
AccessControlList acl = context.getApi().getBucketACL(targetBucket);
|
||||
AccessControlList acl = getApi().getBucketACL(targetBucket);
|
||||
acl.addPermission(GroupGranteeURI.LOG_DELIVERY, Permission.WRITE);
|
||||
acl.addPermission(GroupGranteeURI.LOG_DELIVERY, Permission.READ_ACP);
|
||||
assertTrue(context.getApi().putBucketACL(targetBucket, acl));
|
||||
assertTrue(getApi().putBucketACL(targetBucket, acl));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -275,12 +277,12 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
public void testEu() throws Exception {
|
||||
final String bucketName = getScratchContainerName();
|
||||
try {
|
||||
context.getApi().putBucketInRegion(Region.EU_WEST_1, bucketName + "eu",
|
||||
getApi().putBucketInRegion(Region.EU_WEST_1, bucketName + "eu",
|
||||
withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
AccessControlList acl = context.getApi().getBucketACL(bucketName + "eu");
|
||||
AccessControlList acl = getApi().getBucketACL(bucketName + "eu");
|
||||
assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl
|
||||
.toString());
|
||||
} catch (Exception e) {
|
||||
|
@ -288,7 +290,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
}
|
||||
}
|
||||
});
|
||||
assertEquals(Region.EU_WEST_1, context.getApi().getBucketLocation(bucketName + "eu"));
|
||||
assertEquals(Region.EU_WEST_1, getApi().getBucketLocation(bucketName + "eu"));
|
||||
// TODO: I believe that the following should work based on the above acl assertion passing.
|
||||
// However, it fails on 403
|
||||
// URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName));
|
||||
|
@ -304,12 +306,12 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
public void testNorthernCalifornia() throws Exception {
|
||||
final String bucketName = getScratchContainerName();
|
||||
try {
|
||||
context.getApi().putBucketInRegion(Region.EU_WEST_1, bucketName + "cali",
|
||||
getApi().putBucketInRegion(Region.EU_WEST_1, bucketName + "cali",
|
||||
withBucketAcl(CannedAccessPolicy.PUBLIC_READ));
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
AccessControlList acl = context.getApi().getBucketACL(bucketName + "cali");
|
||||
AccessControlList acl = getApi().getBucketACL(bucketName + "cali");
|
||||
assertTrue(acl.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ), acl
|
||||
.toString());
|
||||
} catch (Exception e) {
|
||||
|
@ -317,7 +319,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
}
|
||||
}
|
||||
});
|
||||
assertEquals(Region.EU_WEST_1, context.getApi().getBucketLocation(bucketName + "cali"));
|
||||
assertEquals(Region.EU_WEST_1, getApi().getBucketLocation(bucketName + "cali"));
|
||||
// TODO: I believe that the following should work based on the above acl assertion passing.
|
||||
// However, it fails on 403
|
||||
// URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName));
|
||||
|
@ -330,7 +332,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
void bucketExists() throws Exception {
|
||||
String bucketName = getContainerName();
|
||||
try {
|
||||
SortedSet<BucketMetadata> list = context.getApi().listOwnedBuckets();
|
||||
SortedSet<BucketMetadata> list = getApi().listOwnedBuckets();
|
||||
BucketMetadata firstBucket = list.first();
|
||||
BucketMetadata toMatch = new BucketMetadata(bucketName, new Date(), firstBucket.getOwner());
|
||||
assert list.contains(toMatch);
|
||||
|
@ -341,10 +343,10 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
|
||||
protected void addAlphabetUnderRoot(String bucketName) {
|
||||
for (char letter = 'a'; letter <= 'z'; letter++) {
|
||||
S3Object blob = context.getApi().newS3Object();
|
||||
S3Object blob = getApi().newS3Object();
|
||||
blob.getMetadata().setKey(letter + "");
|
||||
blob.setPayload(letter + "content");
|
||||
context.getApi().putObject(bucketName, blob);
|
||||
getApi().putObject(bucketName, blob);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -353,7 +355,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
String bucketName = getContainerName();
|
||||
try {
|
||||
addAlphabetUnderRoot(bucketName);
|
||||
ListBucketResponse bucket = context.getApi().listBucket(bucketName, afterMarker("y"));
|
||||
ListBucketResponse bucket = getApi().listBucket(bucketName, afterMarker("y"));
|
||||
assertEquals(bucket.getMarker(), "y");
|
||||
assert !bucket.isTruncated();
|
||||
assertEquals(bucket.size(), 1);
|
||||
|
@ -369,7 +371,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
String prefix = "apps";
|
||||
addTenObjectsUnderPrefix(bucketName, prefix);
|
||||
add15UnderRoot(bucketName);
|
||||
ListBucketResponse bucket = context.getApi().listBucket(bucketName, delimiter("/"));
|
||||
ListBucketResponse bucket = getApi().listBucket(bucketName, delimiter("/"));
|
||||
assertEquals(bucket.getDelimiter(), "/");
|
||||
assert !bucket.isTruncated();
|
||||
assertEquals(bucket.size(), 15);
|
||||
|
@ -388,7 +390,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
addTenObjectsUnderPrefix(bucketName, prefix);
|
||||
add15UnderRoot(bucketName);
|
||||
|
||||
ListBucketResponse bucket = context.getApi().listBucket(bucketName, withPrefix("apps/"));
|
||||
ListBucketResponse bucket = getApi().listBucket(bucketName, withPrefix("apps/"));
|
||||
assert !bucket.isTruncated();
|
||||
assertEquals(bucket.size(), 10);
|
||||
assertEquals(bucket.getPrefix(), "apps/");
|
||||
|
@ -403,7 +405,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
String bucketName = getContainerName();
|
||||
try {
|
||||
addAlphabetUnderRoot(bucketName);
|
||||
ListBucketResponse bucket = context.getApi().listBucket(bucketName, maxResults(5));
|
||||
ListBucketResponse bucket = getApi().listBucket(bucketName, maxResults(5));
|
||||
assertEquals(bucket.getMaxKeys(), 5);
|
||||
assert bucket.isTruncated();
|
||||
assertEquals(bucket.size(), 5);
|
||||
|
@ -414,19 +416,19 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
|||
|
||||
protected void add15UnderRoot(String bucketName) {
|
||||
for (int i = 0; i < 15; i++) {
|
||||
S3Object blob = context.getApi().newS3Object();
|
||||
S3Object blob = getApi().newS3Object();
|
||||
blob.getMetadata().setKey(i + "");
|
||||
blob.setPayload(i + "content");
|
||||
context.getApi().putObject(bucketName, blob);
|
||||
getApi().putObject(bucketName, blob);
|
||||
}
|
||||
}
|
||||
|
||||
protected void addTenObjectsUnderPrefix(String bucketName, String prefix) {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
S3Object blob = context.getApi().newS3Object();
|
||||
S3Object blob = getApi().newS3Object();
|
||||
blob.getMetadata().setKey(prefix + "/" + i);
|
||||
blob.setPayload(i + "content");
|
||||
context.getApi().putObject(bucketName, blob);
|
||||
getApi().putObject(bucketName, blob);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -18,13 +18,20 @@
|
|||
*/
|
||||
package org.jclouds.aws.s3.samples;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.aws.domain.Region;
|
||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.BlobStoreContextFactory;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
||||
/**
|
||||
* This the Main class of an Application that demonstrates the use of the blobstore.
|
||||
|
@ -39,8 +46,7 @@ public class MainApp {
|
|||
public static int PARAMETERS = 3;
|
||||
public static String INVALID_SYNTAX = "Invalid number of parameters. Syntax is: \"accesskeyid\" \"secretkey\" \"bucketName\" ";
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void main(String[] args) {
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
if (args.length < PARAMETERS)
|
||||
throw new IllegalArgumentException(INVALID_SYNTAX);
|
||||
|
@ -51,7 +57,8 @@ public class MainApp {
|
|||
String containerName = args[2];
|
||||
|
||||
// Init
|
||||
BlobStoreContext context = S3BlobStoreContextFactory.createContext(accesskeyid, secretkey);
|
||||
BlobStoreContext context = new BlobStoreContextFactory().createContext("s3", accesskeyid,
|
||||
secretkey);
|
||||
|
||||
try {
|
||||
|
||||
|
@ -59,6 +66,7 @@ public class MainApp {
|
|||
BlobStore blobStore = context.getBlobStore();
|
||||
blobStore.createContainerInLocation(Region.DEFAULT.toString(), containerName);
|
||||
|
||||
// Add Blob
|
||||
Blob blob = blobStore.newBlob("test");
|
||||
blob.setPayload("testdata");
|
||||
blobStore.putBlob(containerName, blob);
|
||||
|
@ -67,11 +75,18 @@ public class MainApp {
|
|||
for (StorageMetadata resourceMd : blobStore.list()) {
|
||||
if (resourceMd.getType() == StorageType.CONTAINER
|
||||
|| resourceMd.getType() == StorageType.FOLDER) {
|
||||
System.out.printf(" %s: %s entries%n", resourceMd.getName(), context
|
||||
.createInputStreamMap(resourceMd.getName()).size());
|
||||
// Use Map API
|
||||
Map<String, InputStream> containerMap = context.createInputStreamMap(resourceMd
|
||||
.getName());
|
||||
System.out.printf(" %s: %s entries%n", resourceMd.getName(), containerMap.size());
|
||||
}
|
||||
}
|
||||
|
||||
// Use Provider API
|
||||
RestContext<S3AsyncClient, S3Client> providerContext = context
|
||||
.getProviderSpecificContext();
|
||||
providerContext.getApi().getBucketLogging(containerName);
|
||||
|
||||
} finally {
|
||||
// Close connecton
|
||||
context.close();
|
||||
|
|
|
@ -48,14 +48,14 @@ import com.google.common.collect.Sets;
|
|||
public class GetAllContainersController extends HttpServlet {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Map<String, BlobStoreContext<?,?>> contexts;
|
||||
private Map<String, BlobStoreContext> contexts;
|
||||
private final BlobStoreContextToContainerResult blobStoreContextToContainerResult;
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
public GetAllContainersController(Map<String, BlobStoreContext<?,?>> contexts,
|
||||
public GetAllContainersController(Map<String, BlobStoreContext> contexts,
|
||||
BlobStoreContextToContainerResult blobStoreContextToContainerResult) {
|
||||
this.contexts = contexts;
|
||||
this.blobStoreContextToContainerResult = blobStoreContextToContainerResult;
|
||||
|
|
|
@ -50,15 +50,15 @@ import com.google.inject.servlet.ServletModule;
|
|||
*/
|
||||
public class GuiceServletConfig extends GuiceServletContextListener {
|
||||
|
||||
private Map<String, BlobStoreContext<?, ?>> contexts;
|
||||
private Map<String, BlobStoreContext> contexts;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent servletContextEvent) {
|
||||
Properties props = loadJCloudsProperties(servletContextEvent);
|
||||
ImmutableList<String> list = ImmutableList.<String> of(checkNotNull(
|
||||
props.getProperty(BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTBUILDERS),
|
||||
BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTBUILDERS).split(","));
|
||||
props.getProperty(BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTS),
|
||||
BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTS).split(","));
|
||||
contexts = Maps.newHashMap();
|
||||
for (String className : list) {
|
||||
try {
|
||||
|
@ -68,7 +68,7 @@ public class GuiceServletConfig extends GuiceServletContextListener {
|
|||
Constructor<BlobStoreContextBuilder<?, ?>> constructor = builderClass
|
||||
.getConstructor(Properties.class);
|
||||
contexts.put(name, constructor.newInstance(props).withModules(
|
||||
new GoogleAppEngineConfigurationModule()).buildContext());
|
||||
new GoogleAppEngineConfigurationModule()).buildBlobStoreContext());
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ public class GuiceServletConfig extends GuiceServletContextListener {
|
|||
return Guice.createInjector(new ServletModule() {
|
||||
@Override
|
||||
protected void configureServlets() {
|
||||
bind(new TypeLiteral<Map<String, BlobStoreContext<?, ?>>>() {
|
||||
bind(new TypeLiteral<Map<String, BlobStoreContext>>() {
|
||||
}).toInstance(GuiceServletConfig.this.contexts);
|
||||
serve("*.blobstore").with(GetAllContainersController.class);
|
||||
requestInjection(this);
|
||||
|
@ -107,7 +107,7 @@ public class GuiceServletConfig extends GuiceServletContextListener {
|
|||
|
||||
@Override
|
||||
public void contextDestroyed(ServletContextEvent servletContextEvent) {
|
||||
for (BlobStoreContext<?, ?> context : contexts.values()) {
|
||||
for (BlobStoreContext context : contexts.values()) {
|
||||
context.close();
|
||||
}
|
||||
super.contextDestroyed(servletContextEvent);
|
||||
|
|
|
@ -40,10 +40,10 @@ import com.google.common.collect.Sets;
|
|||
public class BlobStoreContextToContainerResult implements Function<String, ContainerResult> {
|
||||
private final class BuildContainerResult implements Function<StorageMetadata, ContainerResult> {
|
||||
private final String host;
|
||||
private final BlobStoreContext<?, ?> context;
|
||||
private final BlobStoreContext context;
|
||||
private final String contextName;
|
||||
|
||||
private BuildContainerResult(String host, BlobStoreContext<?, ?> context, String contextName) {
|
||||
private BuildContainerResult(String host, BlobStoreContext context, String contextName) {
|
||||
this.host = host;
|
||||
this.context = context;
|
||||
this.contextName = contextName;
|
||||
|
@ -68,14 +68,14 @@ public class BlobStoreContextToContainerResult implements Function<String, Conta
|
|||
}
|
||||
|
||||
@Inject
|
||||
private Map<String, BlobStoreContext<?, ?>> contexts;
|
||||
private Map<String, BlobStoreContext> contexts;
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
public ContainerResult apply(final String contextName) {
|
||||
final BlobStoreContext<?, ?> context = contexts.get(contextName);
|
||||
final String host = context.getEndPoint().getHost();
|
||||
final BlobStoreContext context = contexts.get(contextName);
|
||||
final String host = context.getProviderSpecificContext().getEndPoint().getHost();
|
||||
try {
|
||||
StorageMetadata md = Iterables.getLast(Sets.newTreeSet(Iterables.filter(context
|
||||
.getBlobStore().list(), new Predicate<StorageMetadata>() {
|
||||
|
|
|
@ -23,7 +23,7 @@ import static org.jclouds.aws.reference.AWSConstants.PROPERTY_AWS_ACCESSKEYID;
|
|||
import static org.jclouds.aws.reference.AWSConstants.PROPERTY_AWS_SECRETACCESSKEY;
|
||||
import static org.jclouds.azure.storage.reference.AzureStorageConstants.PROPERTY_AZURESTORAGE_ACCOUNT;
|
||||
import static org.jclouds.azure.storage.reference.AzureStorageConstants.PROPERTY_AZURESTORAGE_KEY;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTBUILDERS;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTS;
|
||||
import static org.jclouds.rackspace.reference.RackspaceConstants.PROPERTY_RACKSPACE_KEY;
|
||||
import static org.jclouds.rackspace.reference.RackspaceConstants.PROPERTY_RACKSPACE_USER;
|
||||
|
||||
|
@ -62,7 +62,7 @@ public class GoogleAppEngineLiveTest {
|
|||
url = new URL(String.format("http://%s:%s", address, port));
|
||||
Properties props = new Properties();
|
||||
|
||||
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS, String.format("%s,%s,%s",
|
||||
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTS, String.format("%s,%s,%s",
|
||||
S3BlobStoreContextBuilder.class.getName(), CloudFilesBlobStoreContextBuilder.class
|
||||
.getName(), AzureBlobStoreContextBuilder.class.getName()));
|
||||
|
||||
|
|
|
@ -29,15 +29,15 @@ import java.util.SortedSet;
|
|||
import org.jclouds.aws.domain.Region;
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.S3ContextFactory;
|
||||
import org.jclouds.aws.s3.blobstore.S3AsyncBlobStore;
|
||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextFactory;
|
||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||
import org.jclouds.aws.s3.options.CopyObjectOptions;
|
||||
import org.jclouds.aws.s3.options.ListBucketOptions;
|
||||
import org.jclouds.aws.s3.options.PutObjectOptions;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.RestContext;
|
||||
import org.jets3t.service.S3ObjectsChunk;
|
||||
import org.jets3t.service.S3Service;
|
||||
import org.jets3t.service.S3ServiceException;
|
||||
|
@ -60,7 +60,7 @@ public class JCloudsS3Service extends S3Service {
|
|||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final BlobStoreContext<S3AsyncClient, S3Client> context;
|
||||
private final RestContext<S3AsyncClient, S3Client> context;
|
||||
private final S3Client connection;
|
||||
|
||||
/**
|
||||
|
@ -76,8 +76,8 @@ public class JCloudsS3Service extends S3Service {
|
|||
protected JCloudsS3Service(AWSCredentials awsCredentials, Module... modules)
|
||||
throws S3ServiceException {
|
||||
super(awsCredentials);
|
||||
context = S3BlobStoreContextFactory.createContext(awsCredentials.getAccessKey(),
|
||||
awsCredentials.getSecretKey(), modules);
|
||||
context = S3ContextFactory.createContext(awsCredentials.getAccessKey(), awsCredentials
|
||||
.getSecretKey(), modules);
|
||||
connection = context.getApi();
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,6 @@ import java.util.concurrent.TimeoutException;
|
|||
|
||||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||
import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI;
|
||||
|
@ -72,10 +71,14 @@ import com.google.common.collect.Iterables;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "jets3t.JCloudsS3ServiceIntegrationTest")
|
||||
public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest {
|
||||
AWSCredentials credentials;
|
||||
S3Service service;
|
||||
|
||||
public S3Client getApi() {
|
||||
return (S3Client) context.getProviderSpecificContext().getApi();
|
||||
}
|
||||
|
||||
/**
|
||||
* overridden only to get access to the amazon credentials used for jets3t initialization.
|
||||
*
|
||||
|
@ -102,7 +105,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
try {
|
||||
S3Bucket bucket = service.createBucket(new S3Bucket(bucketName));
|
||||
assertEquals(bucket.getName(), bucketName);
|
||||
assertTrue(context.getApi().bucketExists(bucketName));
|
||||
assertTrue(getApi().bucketExists(bucketName));
|
||||
} finally {
|
||||
returnContainer(bucketName);
|
||||
}
|
||||
|
@ -115,7 +118,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
service.deleteBucket(bucketName);
|
||||
assertConsistencyAware(new Runnable() {
|
||||
public void run() {
|
||||
assertFalse(context.getApi().bucketExists(bucketName));
|
||||
assertFalse(getApi().bucketExists(bucketName));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -200,7 +203,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
// Ensure there is at least 1 bucket in S3 account to list and compare.
|
||||
S3Bucket[] jsBuckets = service.listAllBuckets();
|
||||
|
||||
SortedSet<org.jclouds.aws.s3.domain.BucketMetadata> jcBuckets = context.getApi()
|
||||
SortedSet<org.jclouds.aws.s3.domain.BucketMetadata> jcBuckets = getApi()
|
||||
.listOwnedBuckets();
|
||||
|
||||
assert jsBuckets.length == jcBuckets.size();
|
||||
|
@ -352,7 +355,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
// Upload empty object
|
||||
requestObject = new S3Object(objectKey);
|
||||
jsResultObject = service.putObject(new S3Bucket(bucketName), requestObject);
|
||||
jcObject = context.getApi().getObject(bucketName, objectKey);
|
||||
jcObject = getApi().getObject(bucketName, objectKey);
|
||||
// TODO null keys from s3object! assertEquals(jcObject.getKey(), objectKey);
|
||||
assertEquals(jcObject.getMetadata().getSize(), new Long(0));
|
||||
assertEquals(jcObject.getMetadata().getContentType(), MediaType.APPLICATION_OCTET_STREAM);
|
||||
|
@ -363,7 +366,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
// Upload unicode-named object
|
||||
requestObject = new S3Object("₪n₪₪₪d₪-object");
|
||||
jsResultObject = service.putObject(new S3Bucket(bucketName), requestObject);
|
||||
jcObject = context.getApi().getObject(bucketName, requestObject.getKey());
|
||||
jcObject = getApi().getObject(bucketName, requestObject.getKey());
|
||||
// TODO null keys from s3object! assertEquals(jcObject.getKey(), requestObject.getKey());
|
||||
assertEquals(jcObject.getMetadata().getSize(), new Long(0));
|
||||
assertEquals(jcObject.getMetadata().getContentType(), MediaType.APPLICATION_OCTET_STREAM);
|
||||
|
@ -375,7 +378,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
String data = "This is my ₪n₪₪₪d₪ data";
|
||||
requestObject = new S3Object(objectKey, data);
|
||||
jsResultObject = service.putObject(new S3Bucket(bucketName), requestObject);
|
||||
jcObject = context.getApi().getObject(bucketName, objectKey);
|
||||
jcObject = getApi().getObject(bucketName, objectKey);
|
||||
assertEquals(jcObject.getMetadata().getSize(), new Long(data.getBytes("UTF-8").length));
|
||||
assertTrue(jcObject.getMetadata().getContentType().startsWith("text/plain"));
|
||||
assertEquals(jsResultObject.getContentLength(), data.getBytes("UTF-8").length);
|
||||
|
@ -385,7 +388,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
requestObject = new S3Object(objectKey);
|
||||
requestObject.addMetadata("x-amz-meta-" + "my-metadata-1", "value-1");
|
||||
jsResultObject = service.putObject(new S3Bucket(bucketName), requestObject);
|
||||
jcObject = context.getApi().getObject(bucketName, objectKey);
|
||||
jcObject = getApi().getObject(bucketName, objectKey);
|
||||
assertEquals(jcObject.getMetadata().getUserMetadata().get("my-metadata-1"), "value-1");
|
||||
assertEquals(jsResultObject.getMetadata("x-amz-meta-" + "my-metadata-1"), "value-1");
|
||||
|
||||
|
@ -393,8 +396,8 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
requestObject = new S3Object(objectKey);
|
||||
requestObject.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
|
||||
jsResultObject = service.putObject(new S3Bucket(bucketName), requestObject);
|
||||
org.jclouds.aws.s3.domain.AccessControlList jcACL = context.getApi().getObjectACL(
|
||||
bucketName, objectKey);
|
||||
org.jclouds.aws.s3.domain.AccessControlList jcACL = getApi().getObjectACL(bucketName,
|
||||
objectKey);
|
||||
assertTrue(jcACL.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ));
|
||||
assertTrue(jcACL.hasPermission(jcACL.getOwner().getId(), Permission.FULL_CONTROL));
|
||||
assertEquals(jcACL.getGrants().size(), 2);
|
||||
|
@ -409,7 +412,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
data = "Here is some d₪t₪ for you";
|
||||
requestObject.setDataInputStream(new ByteArrayInputStream(data.getBytes("UTF-8")));
|
||||
jsResultObject = service.putObject(new S3Bucket(bucketName), requestObject);
|
||||
jcObject = context.getApi().getObject(bucketName, objectKey);
|
||||
jcObject = getApi().getObject(bucketName, objectKey);
|
||||
assertTrue(jsResultObject.verifyData(data.getBytes("UTF-8")));
|
||||
assertEquals(jsResultObject.getETag(), jcObject.getMetadata().getETag().replaceAll("\"",
|
||||
""));
|
||||
|
@ -444,15 +447,15 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
destinationObject = new S3Object(destinationObjectKey);
|
||||
copyResult = service.copyObject(bucketName, sourceObjectKey, bucketName,
|
||||
destinationObject, false);
|
||||
jcDestinationObject = context.getApi().getObject(bucketName, destinationObject.getKey());
|
||||
jcDestinationObject = getApi().getObject(bucketName, destinationObject.getKey());
|
||||
// TODO null keys from s3object! assertEquals(jcDestinationObject.getKey(),
|
||||
// destinationObjectKey);
|
||||
assertEquals(jcDestinationObject.getMetadata().getUserMetadata().get(metadataName),
|
||||
sourceMetadataValue);
|
||||
assertEquals(copyResult.get("ETag"), jcDestinationObject.getMetadata().getETag());
|
||||
// Test destination ACL is unchanged (ie private)
|
||||
org.jclouds.aws.s3.domain.AccessControlList jcACL = context.getApi().getObjectACL(
|
||||
bucketName, destinationObject.getKey());
|
||||
org.jclouds.aws.s3.domain.AccessControlList jcACL = getApi().getObjectACL(bucketName,
|
||||
destinationObject.getKey());
|
||||
assertEquals(jcACL.getGrants().size(), 1);
|
||||
assertTrue(jcACL.hasPermission(jcACL.getOwner().getId(), Permission.FULL_CONTROL));
|
||||
|
||||
|
@ -461,11 +464,11 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
destinationObject.addMetadata("x-amz-meta-" + metadataName, destinationMetadataValue);
|
||||
copyResult = service.copyObject(bucketName, sourceObjectKey, bucketName,
|
||||
destinationObject, true);
|
||||
jcDestinationObject = context.getApi().getObject(bucketName, destinationObject.getKey());
|
||||
jcDestinationObject = getApi().getObject(bucketName, destinationObject.getKey());
|
||||
assertEquals(jcDestinationObject.getMetadata().getUserMetadata().get(metadataName),
|
||||
destinationMetadataValue);
|
||||
// Test destination ACL is unchanged (ie private)
|
||||
jcACL = context.getApi().getObjectACL(bucketName, destinationObject.getKey());
|
||||
jcACL = getApi().getObjectACL(bucketName, destinationObject.getKey());
|
||||
assertEquals(jcACL.getGrants().size(), 1);
|
||||
assertTrue(jcACL.hasPermission(jcACL.getOwner().getId(), Permission.FULL_CONTROL));
|
||||
|
||||
|
@ -475,7 +478,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
copyResult = service.copyObject(bucketName, sourceObjectKey, bucketName,
|
||||
destinationObject, false);
|
||||
// Test destination ACL is changed (ie public-read)
|
||||
jcACL = context.getApi().getObjectACL(bucketName, destinationObject.getKey());
|
||||
jcACL = getApi().getObjectACL(bucketName, destinationObject.getKey());
|
||||
assertEquals(jcACL.getGrants().size(), 2);
|
||||
assertTrue(jcACL.hasPermission(jcACL.getOwner().getId(), Permission.FULL_CONTROL));
|
||||
assertTrue(jcACL.hasPermission(GroupGranteeURI.ALL_USERS, Permission.READ));
|
||||
|
@ -654,7 +657,7 @@ public class JCloudsS3ServiceLiveTest extends BaseBlobStoreIntegrationTest<S3Asy
|
|||
multiService.putObjects(bucket, objects);
|
||||
|
||||
assertEquals(countOfUploadCompletions[0], OBJECT_COUNT);
|
||||
ListBucketResponse theBucket = context.getApi().listBucket(bucketName);
|
||||
ListBucketResponse theBucket = getApi().listBucket(bucketName);
|
||||
assertEquals(theBucket.size(), OBJECT_COUNT);
|
||||
|
||||
} finally {
|
||||
|
|
|
@ -41,7 +41,7 @@ public abstract class BaseJCloudsPerformanceLiveTest extends BasePerformanceLive
|
|||
// object.setContentType("application/octetstream");
|
||||
// //object.setPayload("this is a test");
|
||||
// object.setPayload(test);
|
||||
// return context.getApi()Provider.getObject(s3Bucket,
|
||||
// return getApi()Provider.getObject(s3Bucket,
|
||||
// object.getKey()).get(120,TimeUnit.SECONDS) !=
|
||||
// S3Object.NOT_FOUND;
|
||||
|
||||
|
@ -53,7 +53,7 @@ public abstract class BaseJCloudsPerformanceLiveTest extends BasePerformanceLive
|
|||
S3Object object = newObject(key);
|
||||
object.getMetadata().setContentType(contentType);
|
||||
object.setPayload(data);
|
||||
return context.getApi().putObject(bucket, object) != null;
|
||||
return getApi().putObject(bucket, object) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -62,11 +62,11 @@ public abstract class BaseJCloudsPerformanceLiveTest extends BasePerformanceLive
|
|||
S3Object object = newObject(key);
|
||||
object.getMetadata().setContentType(contentType);
|
||||
object.setPayload(data);
|
||||
return context.getApi().putObject(bucket, object) != null;
|
||||
return getApi().putObject(bucket, object) != null;
|
||||
}
|
||||
|
||||
private S3Object newObject(String key) {
|
||||
S3Object object = context.getApi().newS3Object();
|
||||
S3Object object = getApi().newS3Object();
|
||||
object.getMetadata().setKey(key);
|
||||
return object;
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ public abstract class BaseJCloudsPerformanceLiveTest extends BasePerformanceLive
|
|||
object.getMetadata().setContentType(contentType);
|
||||
object.setPayload(data);
|
||||
object.setContentLength(new Long(data.available()));
|
||||
return context.getApi().putObject(bucket, object) != null;
|
||||
return getApi().putObject(bucket, object) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -87,6 +87,6 @@ public abstract class BaseJCloudsPerformanceLiveTest extends BasePerformanceLive
|
|||
S3Object object = newObject(key);
|
||||
object.getMetadata().setContentType(contentType);
|
||||
object.setPayload(data);
|
||||
return context.getApi().putObject(bucket, object) != null;
|
||||
return getApi().putObject(bucket, object) != null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,8 +44,7 @@ import org.testng.annotations.Test;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public abstract class BasePerformanceLiveTest extends
|
||||
BaseBlobStoreIntegrationTest<S3AsyncClient, S3Client> {
|
||||
public abstract class BasePerformanceLiveTest extends BaseBlobStoreIntegrationTest {
|
||||
static {
|
||||
containerCount = 1;
|
||||
}
|
||||
|
@ -77,6 +76,10 @@ public abstract class BasePerformanceLiveTest extends
|
|||
}
|
||||
}
|
||||
|
||||
public S3Client getApi() {
|
||||
return (S3Client) context.getProviderSpecificContext().getApi();
|
||||
}
|
||||
|
||||
/**
|
||||
* using scratch containerName as we are changing location
|
||||
*
|
||||
|
@ -87,7 +90,7 @@ public abstract class BasePerformanceLiveTest extends
|
|||
protected String createScratchContainerInEU() throws InterruptedException, ExecutionException,
|
||||
TimeoutException {
|
||||
String containerName = getScratchContainerName();
|
||||
context.getApi().putBucketInRegion(Region.EU_WEST_1, containerName);
|
||||
getApi().putBucketInRegion(Region.EU_WEST_1, containerName);
|
||||
return containerName;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.jclouds.azure.storage.blob.blobstore;
|
|||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobPropertiesBuilder;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||
|
@ -43,21 +41,19 @@ import com.google.inject.Module;
|
|||
* @see AzureBlobStoreContext
|
||||
*/
|
||||
public class AzureBlobStoreContextFactory {
|
||||
public static BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> createContext(
|
||||
Properties properties, Module... modules) {
|
||||
public static BlobStoreContext createContext(Properties properties, Module... modules) {
|
||||
return new AzureBlobStoreContextBuilder(new AzureBlobPropertiesBuilder(properties).build())
|
||||
.withModules(modules).buildContext();
|
||||
.withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> createContext(String user,
|
||||
String encodedKey, Module... modules) {
|
||||
public static BlobStoreContext createContext(String user, String encodedKey, Module... modules) {
|
||||
return new AzureBlobStoreContextBuilder(new AzureBlobPropertiesBuilder(user, encodedKey)
|
||||
.build()).withModules(modules).buildContext();
|
||||
.build()).withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
|
||||
public static BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> createContext(
|
||||
URI endpoint, String user, String encodedKey, Module... modules) {
|
||||
public static BlobStoreContext createContext(URI endpoint, String user, String encodedKey,
|
||||
Module... modules) {
|
||||
return new AzureBlobStoreContextBuilder(new AzureBlobPropertiesBuilder(user, encodedKey)
|
||||
.withEndpoint(endpoint).build()).withModules(modules).buildContext();
|
||||
.withEndpoint(endpoint).build()).withModules(modules).buildBlobStoreContext();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,31 +18,25 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.blob.blobstore.config;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.azure.storage.AzureBlob;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.azure.storage.blob.blobstore.AzureAsyncBlobStore;
|
||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStore;
|
||||
import org.jclouds.azure.storage.blob.blobstore.strategy.FindMD5InBlobProperties;
|
||||
import org.jclouds.azure.storage.blob.config.AzureBlobModule;
|
||||
import org.jclouds.azure.storage.reference.AzureStorageConstants;
|
||||
import org.jclouds.azure.storage.blob.config.AzureBlobContextModule;
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobMap;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.InputStreamMap;
|
||||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.config.BlobStoreObjectModule;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.blobstore.strategy.ContainsValueInListStrategy;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
|
@ -50,13 +44,12 @@ import com.google.inject.Provides;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class AzureBlobStoreContextModule extends AbstractModule {
|
||||
public class AzureBlobStoreContextModule extends AzureBlobContextModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
install(new BlobStoreObjectModule());
|
||||
super.configure();
|
||||
install(new BlobStoreMapModule());
|
||||
install(new AzureBlobModule());
|
||||
bind(AsyncBlobStore.class).to(AzureAsyncBlobStore.class).asEagerSingleton();
|
||||
bind(BlobStore.class).to(AzureBlobStore.class).asEagerSingleton();
|
||||
bind(ContainsValueInListStrategy.class).to(FindMD5InBlobProperties.class);
|
||||
|
@ -64,14 +57,12 @@ public class AzureBlobStoreContextModule extends AbstractModule {
|
|||
|
||||
@Provides
|
||||
@Singleton
|
||||
BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> provideContext(
|
||||
BlobMap.Factory blobMapFactory, InputStreamMap.Factory inputStreamMapFactory,
|
||||
Closer closer, AsyncBlobStore asyncBlobStore, BlobStore blobStore,
|
||||
AzureBlobAsyncClient asyncApi, AzureBlobClient defaultApi, @AzureBlob URI endPoint,
|
||||
@Named(AzureStorageConstants.PROPERTY_AZURESTORAGE_ACCOUNT) String account) {
|
||||
BlobStoreContext provideContext(BlobMap.Factory blobMapFactory,
|
||||
InputStreamMap.Factory inputStreamMapFactory, Closer closer,
|
||||
AsyncBlobStore asynchBlobStore, BlobStore blobStore,
|
||||
RestContext<AzureBlobAsyncClient, AzureBlobClient> context) {
|
||||
return new BlobStoreContextImpl<AzureBlobAsyncClient, AzureBlobClient>(blobMapFactory,
|
||||
inputStreamMapFactory, closer, asyncBlobStore, blobStore, asyncApi, defaultApi,
|
||||
endPoint, account);
|
||||
inputStreamMapFactory, asynchBlobStore, blobStore, context);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobPropertiesBuilder;
|
||||
import org.jclouds.azure.storage.blob.blobstore.config.AzureBlobStoreContextModule;
|
||||
import org.jclouds.azure.storage.blob.config.AzureBlobRestClientModule;
|
||||
|
@ -42,9 +41,7 @@ import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
|||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of modules configured in AzureBlobContextBuilder
|
||||
|
@ -69,21 +66,22 @@ public class AzureBlobStoreContextBuilderTest {
|
|||
}
|
||||
|
||||
public void testBuildContext() {
|
||||
BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> context = newBuilder().buildContext();
|
||||
BlobStoreContext context = newBuilder().buildBlobStoreContext();
|
||||
assertEquals(context.getClass(), BlobStoreContextImpl.class);
|
||||
assertEquals(context.getAsyncApi().getClass(), StubAzureBlobAsyncClient.class);
|
||||
assertEquals(context.getProviderSpecificContext().getAsyncApi().getClass(),
|
||||
StubAzureBlobAsyncClient.class);
|
||||
assertEquals(context.getAsyncBlobStore().getClass(), AzureAsyncBlobStore.class);
|
||||
assertEquals(context.getAsyncApi().newBlob().getClass(), AzureBlobImpl.class);
|
||||
assertEquals(((AzureBlobAsyncClient) context.getProviderSpecificContext().getAsyncApi())
|
||||
.newBlob().getClass(), AzureBlobImpl.class);
|
||||
assertEquals(context.getAsyncBlobStore().newBlob(null).getClass(), BlobImpl.class);
|
||||
assertEquals(context.getAccount(), "id");
|
||||
assertEquals(context.getEndPoint(), URI.create("https://localhost/azurestub"));
|
||||
assertEquals(context.getProviderSpecificContext().getAccount(), "id");
|
||||
assertEquals(context.getProviderSpecificContext().getEndPoint(), URI
|
||||
.create("https://localhost/azurestub"));
|
||||
}
|
||||
|
||||
public void testBuildInjector() {
|
||||
Injector i = newBuilder().buildInjector();
|
||||
assert i.getInstance(Key
|
||||
.get(new TypeLiteral<BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient>>() {
|
||||
})) != null;
|
||||
assert i.getInstance(BlobStoreContext.class) != null;
|
||||
assert i.getInstance(AzureBlob.class) != null;
|
||||
assert i.getInstance(Blob.class) != null;
|
||||
}
|
||||
|
|
|
@ -21,8 +21,6 @@ package org.jclouds.azure.storage.blob.blobstore.config;
|
|||
import static com.google.common.util.concurrent.Executors.sameThreadExecutor;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.azure.storage.blob.blobstore.strategy.FindMD5InBlobProperties;
|
||||
import org.jclouds.azure.storage.blob.config.AzureBlobStubClientModule;
|
||||
import org.jclouds.azure.storage.blob.reference.AzureBlobConstants;
|
||||
|
@ -37,8 +35,6 @@ import org.testng.annotations.Test;
|
|||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
|
@ -70,14 +66,11 @@ public class AzureBlobStoreModuleTest {
|
|||
void testContextImpl() {
|
||||
|
||||
Injector injector = createInjector();
|
||||
BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> handler = injector.getInstance(Key
|
||||
.get(new TypeLiteral<BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient>>() {
|
||||
}));
|
||||
BlobStoreContext handler = injector.getInstance(BlobStoreContext.class);
|
||||
assertEquals(handler.getClass(), BlobStoreContextImpl.class);
|
||||
ContainsValueInListStrategy valueList = injector
|
||||
.getInstance(ContainsValueInListStrategy.class);
|
||||
|
||||
assertEquals(valueList.getClass(), FindMD5InBlobProperties.class);
|
||||
}
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.blob.blobstore.integration;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -28,7 +26,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "azureblob.AzureBlobContainerIntegrationTest")
|
||||
public class AzureBlobContainerIntegrationTest extends
|
||||
BaseContainerIntegrationTest<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobContainerIntegrationTest extends BaseContainerIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.blob.blobstore.integration;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseContainerLiveTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "azureblob.AzureBlobContainerLiveTest")
|
||||
public class AzureBlobContainerLiveTest extends
|
||||
BaseContainerLiveTest<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobContainerLiveTest extends BaseContainerLiveTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.blob.blobstore.integration;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseInputStreamMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "azureblob.AzureBlobInputStreamMapIntegrationTest")
|
||||
public class AzureBlobInputStreamMapIntegrationTest extends
|
||||
BaseInputStreamMapIntegrationTest<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobInputStreamMapIntegrationTest extends BaseInputStreamMapIntegrationTest {
|
||||
|
||||
}
|
|
@ -20,8 +20,6 @@ package org.jclouds.azure.storage.blob.blobstore.integration;
|
|||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -30,8 +28,7 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "azureblob.AzureBlobIntegrationTest")
|
||||
public class AzureBlobIntegrationTest extends
|
||||
BaseBlobIntegrationTest<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobIntegrationTest extends BaseBlobIntegrationTest {
|
||||
|
||||
@Override
|
||||
public void testGetIfMatch() throws InterruptedException, UnsupportedEncodingException {
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.blob.blobstore.integration;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobLiveTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -28,6 +26,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "azureblob.AzureBlobLiveTest")
|
||||
public class AzureBlobLiveTest extends BaseBlobLiveTest<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobLiveTest extends BaseBlobLiveTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.blob.blobstore.integration;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "azureblob.AzureBlobMapIntegrationTest")
|
||||
public class AzureBlobMapIntegrationTest extends
|
||||
BaseBlobMapIntegrationTest<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobMapIntegrationTest extends BaseBlobMapIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.azure.storage.blob.blobstore.integration;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "azureblob.AzureBlobServiceIntegrationTest")
|
||||
public class AzureBlobServiceIntegrationTest extends
|
||||
BaseServiceIntegrationTest<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobServiceIntegrationTest extends BaseServiceIntegrationTest {
|
||||
|
||||
}
|
|
@ -21,8 +21,6 @@ package org.jclouds.azure.storage.blob.blobstore.integration;
|
|||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobClient;
|
||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStoreContextFactory;
|
||||
import org.jclouds.azure.storage.blob.config.AzureBlobStubClientModule;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
|
@ -37,21 +35,18 @@ import com.google.inject.Module;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class AzureBlobTestInitializer extends
|
||||
BaseTestInitializer<AzureBlobAsyncClient, AzureBlobClient> {
|
||||
public class AzureBlobTestInitializer extends BaseTestInitializer {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> createLiveContext(
|
||||
Module configurationModule, String url, String app, String account, String key)
|
||||
throws IOException {
|
||||
return (BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient>) new BlobStoreContextFactory()
|
||||
.createContext("azureblob", account, key, ImmutableSet.of(configurationModule,
|
||||
new Log4JLoggingModule()), new Properties());
|
||||
protected BlobStoreContext createLiveContext(Module configurationModule, String url, String app,
|
||||
String account, String key) throws IOException {
|
||||
return (BlobStoreContext) new BlobStoreContextFactory().createContext("azureblob", account,
|
||||
key, ImmutableSet.of(configurationModule, new Log4JLoggingModule()),
|
||||
new Properties());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlobStoreContext<AzureBlobAsyncClient, AzureBlobClient> createStubContext() {
|
||||
protected BlobStoreContext createStubContext() {
|
||||
return AzureBlobStoreContextFactory.createContext("user", "pass",
|
||||
new AzureBlobStubClientModule());
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ import com.google.inject.ImplementedBy;
|
|||
*
|
||||
*/
|
||||
@ImplementedBy(BlobStoreContextImpl.class)
|
||||
public interface BlobStoreContext<A, S> extends RestContext<A, S> {
|
||||
public interface BlobStoreContext {
|
||||
|
||||
/**
|
||||
* Creates a <code>Map<String,InputStream></code> view of the specified container.
|
||||
|
@ -53,4 +53,8 @@ public interface BlobStoreContext<A, S> extends RestContext<A, S> {
|
|||
BlobStore getBlobStore();
|
||||
|
||||
ConsistencyModels getConsistencyModel();
|
||||
|
||||
<A, S> RestContext<A, S> getProviderSpecificContext();
|
||||
|
||||
void close();
|
||||
}
|
|
@ -21,6 +21,7 @@ package org.jclouds.blobstore;
|
|||
import java.util.Properties;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.rest.RestContextBuilder;
|
||||
|
||||
import com.google.inject.Key;
|
||||
|
@ -52,11 +53,10 @@ public abstract class BlobStoreContextBuilder<A, S> extends RestContextBuilder<A
|
|||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public BlobStoreContext<A, S> buildContext() {
|
||||
return (BlobStoreContext<A, S>) this.buildInjector().getInstance(
|
||||
Key.get(Types.newParameterizedType(BlobStoreContext.class,
|
||||
asyncClientType.getType(), syncClientType.getType())));
|
||||
public BlobStoreContext buildBlobStoreContext() {
|
||||
// need the generic type information
|
||||
return (BlobStoreContext) buildInjector().getInstance(
|
||||
Key.get(Types.newParameterizedType(BlobStoreContextImpl.class, asyncClientType
|
||||
.getType(), syncClientType.getType())));
|
||||
}
|
||||
}
|
|
@ -31,7 +31,7 @@ import org.jclouds.rest.RestContextFactory;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
public class BlobStoreContextFactory extends
|
||||
RestContextFactory<BlobStoreContext<?, ?>, BlobStoreContextBuilder<?, ?>> {
|
||||
RestContextFactory<BlobStoreContext, BlobStoreContextBuilder<?, ?>> {
|
||||
|
||||
/**
|
||||
* Initializes with the default properties built-in to jclouds. This is typically stored in the
|
||||
|
@ -53,4 +53,9 @@ public class BlobStoreContextFactory extends
|
|||
public BlobStoreContextFactory(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlobStoreContext build(BlobStoreContextBuilder<?, ?> contextBuilder) {
|
||||
return contextBuilder.buildBlobStoreContext();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ package org.jclouds.blobstore.internal;
|
|||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.net.URI;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobMap;
|
||||
|
@ -31,33 +31,35 @@ import org.jclouds.blobstore.attr.ConsistencyModel;
|
|||
import org.jclouds.blobstore.attr.ConsistencyModels;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.util.BlobStoreUtils;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.internal.RestContextImpl;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BlobStoreContextImpl<A, S> extends RestContextImpl<A, S> implements
|
||||
BlobStoreContext<A, S> {
|
||||
public class BlobStoreContextImpl<X, Y> implements BlobStoreContext {
|
||||
private final BlobMap.Factory blobMapFactory;
|
||||
private final InputStreamMap.Factory inputStreamMapFactory;
|
||||
private final AsyncBlobStore ablobStore;
|
||||
private final BlobStore blobStore;
|
||||
private final ConsistencyModels consistencyModel;
|
||||
private final RestContext<X, Y> providerSpecificContext;
|
||||
|
||||
@Inject
|
||||
public BlobStoreContextImpl(BlobMap.Factory blobMapFactory,
|
||||
InputStreamMap.Factory inputStreamMapFactory, Closer closer, AsyncBlobStore ablobStore,
|
||||
BlobStore blobStore, A asyncApi, S syncApi, URI endPoint, String account) {
|
||||
super(closer, asyncApi, syncApi, endPoint, account);
|
||||
InputStreamMap.Factory inputStreamMapFactory, AsyncBlobStore ablobStore,
|
||||
BlobStore blobStore, RestContext<X, Y> providerSpecificContext) {
|
||||
this.providerSpecificContext = providerSpecificContext;
|
||||
Class<?> type;
|
||||
if (asyncApi.getClass().isAnnotationPresent(ConsistencyModel.class)) {
|
||||
type = asyncApi.getClass();
|
||||
} else if (asyncApi.getClass().getInterfaces().length > 0
|
||||
&& asyncApi.getClass().getInterfaces()[0]
|
||||
if (providerSpecificContext.getAsyncApi().getClass().isAnnotationPresent(
|
||||
ConsistencyModel.class)) {
|
||||
type = providerSpecificContext.getAsyncApi().getClass();
|
||||
} else if (providerSpecificContext.getAsyncApi().getClass().getInterfaces().length > 0
|
||||
&& providerSpecificContext.getAsyncApi().getClass().getInterfaces()[0]
|
||||
.isAnnotationPresent(ConsistencyModel.class)) {
|
||||
type = asyncApi.getClass().getInterfaces()[0];
|
||||
type = providerSpecificContext.getAsyncApi().getClass().getInterfaces()[0];
|
||||
} else {
|
||||
throw new IllegalStateException("@ConsistencyModel needed on " + asyncApi.getClass());
|
||||
throw new IllegalStateException("@ConsistencyModel needed on "
|
||||
+ providerSpecificContext.getAsyncApi().getClass());
|
||||
}
|
||||
this.consistencyModel = type.getAnnotation(ConsistencyModel.class).value();
|
||||
this.blobMapFactory = checkNotNull(blobMapFactory, "blobMapFactory");
|
||||
|
@ -98,4 +100,15 @@ public class BlobStoreContextImpl<A, S> extends RestContextImpl<A, S> implements
|
|||
public ConsistencyModels getConsistencyModel() {
|
||||
return consistencyModel;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <A, S> RestContext<A, S> getProviderSpecificContext() {
|
||||
return (RestContext<A, S>) providerSpecificContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
providerSpecificContext.close();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,10 +48,10 @@ public interface BlobStoreConstants {
|
|||
public static final String PROPERTY_BLOBSTORE_DIRECTORY_SUFFIX = "jclouds.blobstore.directorysuffix";
|
||||
|
||||
/**
|
||||
* comma-separated, fully qualified class names of implementations of BlobStoreContextBuilder
|
||||
* comma-separated hints from {@code blobstore.properties}
|
||||
*
|
||||
*/
|
||||
public static final String PROPERTY_BLOBSTORE_CONTEXTBUILDERS = "jclouds.blobstore.contextbuilders";
|
||||
public static final String PROPERTY_BLOBSTORE_CONTEXTS = "jclouds.blobstore.contexts";
|
||||
|
||||
/**
|
||||
* longest time a single synchronous operation can take before throwing an exception.
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.blobstore.integration;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -29,6 +27,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration" }, testName = "blobstore.StubBlobIntegrationTest")
|
||||
public class StubBlobIntegrationTest extends BaseBlobIntegrationTest<AsyncBlobStore, BlobStore> {
|
||||
public class StubBlobIntegrationTest extends BaseBlobIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.blobstore.integration;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -28,7 +26,6 @@ import org.testng.annotations.Test;
|
|||
*/
|
||||
|
||||
@Test(groups = { "integration", "live" }, testName = "blobstore.StubBlobMapIntegrationTest")
|
||||
public class StubBlobMapIntegrationTest extends
|
||||
BaseBlobMapIntegrationTest<AsyncBlobStore, BlobStore> {
|
||||
public class StubBlobMapIntegrationTest extends BaseBlobMapIntegrationTest {
|
||||
|
||||
}
|
|
@ -26,19 +26,17 @@ import java.util.concurrent.TimeUnit;
|
|||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobMap;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.BlobStoreContextBuilder;
|
||||
import org.jclouds.blobstore.InputStreamMap;
|
||||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.config.BlobStoreObjectModule;
|
||||
import org.jclouds.blobstore.integration.config.StubBlobStoreModule;
|
||||
import org.jclouds.blobstore.integration.internal.StubAsyncBlobStore;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.concurrent.internal.SyncProxy;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.RestContext;
|
||||
import org.jclouds.rest.internal.RestContextImpl;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Module;
|
||||
|
@ -91,12 +89,10 @@ public class StubBlobStoreContextBuilder extends BlobStoreContextBuilder<AsyncBl
|
|||
@SuppressWarnings("unused")
|
||||
@Provides
|
||||
@Singleton
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> provideContext(BlobMap.Factory blobMapFactory,
|
||||
InputStreamMap.Factory inputStreamMapFactory, Closer closer,
|
||||
AsyncBlobStore asynch, BlobStore synch) {
|
||||
return new BlobStoreContextImpl<AsyncBlobStore, BlobStore>(blobMapFactory,
|
||||
inputStreamMapFactory, closer, asynch, synch, asynch, synch, URI
|
||||
.create("http://localhost/blobstub"), "foo");
|
||||
RestContext<AsyncBlobStore, BlobStore> provideContext(Closer closer,
|
||||
final AsyncBlobStore async, final BlobStore sync) {
|
||||
return new RestContextImpl<AsyncBlobStore, BlobStore>(closer, async, sync, URI
|
||||
.create("http://localhost/blobstub"), "foo");
|
||||
}
|
||||
|
||||
});
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.blobstore.integration;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -28,7 +26,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "blobstore.StubContainerIntegrationTest")
|
||||
public class StubContainerIntegrationTest extends
|
||||
BaseContainerIntegrationTest<AsyncBlobStore, BlobStore> {
|
||||
public class StubContainerIntegrationTest extends BaseContainerIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.blobstore.integration;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.integration.internal.BaseInputStreamMapIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "blobstore.StubInputStreamMapIntegrationTest")
|
||||
public class StubInputStreamMapIntegrationTest extends
|
||||
BaseInputStreamMapIntegrationTest<AsyncBlobStore, BlobStore> {
|
||||
public class StubInputStreamMapIntegrationTest extends BaseInputStreamMapIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.blobstore.integration;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
|
@ -27,7 +25,6 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "integration", "live" }, testName = "blobstore.StubServiceIntegrationTest")
|
||||
public class StubServiceIntegrationTest extends
|
||||
BaseServiceIntegrationTest<AsyncBlobStore, BlobStore> {
|
||||
public class StubServiceIntegrationTest extends BaseServiceIntegrationTest {
|
||||
|
||||
}
|
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
package org.jclouds.blobstore.integration;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.integration.internal.BaseTestInitializer;
|
||||
|
||||
|
@ -29,17 +27,17 @@ import com.google.inject.Module;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class StubTestInitializer extends BaseTestInitializer<AsyncBlobStore, BlobStore> {
|
||||
public class StubTestInitializer extends BaseTestInitializer {
|
||||
|
||||
@Override
|
||||
protected BlobStoreContext<AsyncBlobStore, BlobStore> createLiveContext(
|
||||
Module configurationModule, String url, String app, String account, String key) {
|
||||
protected BlobStoreContext createLiveContext(Module configurationModule, String url, String app,
|
||||
String account, String key) {
|
||||
return createStubContext();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlobStoreContext<AsyncBlobStore, BlobStore> createStubContext() {
|
||||
return new StubBlobStoreContextBuilder().buildContext();
|
||||
protected BlobStoreContext createStubContext() {
|
||||
return new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
}
|
||||
|
||||
}
|
|
@ -49,7 +49,7 @@ import org.testng.annotations.Test;
|
|||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BaseBlobIntegrationTest<A, S> extends BaseBlobStoreIntegrationTest<A, S> {
|
||||
public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
|
||||
|
||||
@Test(groups = { "integration", "live" })
|
||||
public void testGetIfModifiedSince() throws InterruptedException {
|
||||
|
|
|
@ -39,7 +39,7 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = { "live" }, testName = "blobstore.BlobLiveTest")
|
||||
public class BaseBlobLiveTest<A, S> extends BaseBlobStoreIntegrationTest<A, S> {
|
||||
public class BaseBlobLiveTest extends BaseBlobStoreIntegrationTest {
|
||||
|
||||
private static final String sysHttpStreamUrl = System
|
||||
.getProperty("jclouds.blobstore.httpstream.url");
|
||||
|
|
|
@ -42,7 +42,7 @@ import org.testng.annotations.Test;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BaseBlobMapIntegrationTest<A, S> extends BaseMapIntegrationTest<A, S, Blob> {
|
||||
public class BaseBlobMapIntegrationTest extends BaseMapIntegrationTest<Blob> {
|
||||
|
||||
@Override
|
||||
@Test(groups = { "integration", "live" })
|
||||
|
@ -220,7 +220,6 @@ public class BaseBlobMapIntegrationTest<A, S> extends BaseMapIntegrationTest<A,
|
|||
map.putAll(newMap);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected Map<String, Blob> createMap(BlobStoreContext context, String bucket) {
|
||||
return context.createBlobMap(bucket);
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ import com.google.common.collect.Iterables;
|
|||
import com.google.common.collect.Sets;
|
||||
import com.google.inject.Module;
|
||||
|
||||
public class BaseBlobStoreIntegrationTest<A, S> {
|
||||
public class BaseBlobStoreIntegrationTest {
|
||||
protected static final String LOCAL_ENCODING = System.getProperty("file.encoding");
|
||||
protected static final String XML_STRING_FORMAT = "<apples><apple name=\"%s\"></apple> </apples>";
|
||||
protected static final String TEST_STRING = String.format(XML_STRING_FORMAT, "apple");
|
||||
|
@ -73,7 +73,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
public static long INCONSISTENCY_WINDOW = 5000;
|
||||
protected static volatile AtomicInteger containerIndex = new AtomicInteger(0);
|
||||
|
||||
protected volatile BlobStoreContext<A, S> context;
|
||||
protected volatile BlobStoreContext context;
|
||||
protected static volatile int containerCount = 10;
|
||||
public static final String CONTAINER_PREFIX = System.getProperty("user.name") + "-blobstore";
|
||||
/**
|
||||
|
@ -91,14 +91,14 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private BlobStoreContext<A, S> getCloudResources(ITestContext testContext)
|
||||
private BlobStoreContext getCloudResources(ITestContext testContext)
|
||||
throws ClassNotFoundException, InstantiationException, IllegalAccessException,
|
||||
Exception {
|
||||
String initializerClass = checkNotNull(System.getProperty("jclouds.test.initializer"),
|
||||
"jclouds.test.initializer");
|
||||
Class<BaseTestInitializer<A, S>> clazz = (Class<BaseTestInitializer<A, S>>) Class
|
||||
Class<BaseTestInitializer> clazz = (Class<BaseTestInitializer>) Class
|
||||
.forName(initializerClass);
|
||||
BaseTestInitializer<A, S> initializer = clazz.newInstance();
|
||||
BaseTestInitializer initializer = clazz.newInstance();
|
||||
return initializer.init(createHttpModule(), testContext);
|
||||
}
|
||||
|
||||
|
@ -125,7 +125,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
|
||||
private static volatile boolean initialized = false;
|
||||
|
||||
protected void createContainersSharedByAllThreads(BlobStoreContext<A, S> context,
|
||||
protected void createContainersSharedByAllThreads(BlobStoreContext context,
|
||||
ITestContext testContext) throws Exception {
|
||||
while (!initialized) {
|
||||
synchronized (BaseBlobStoreIntegrationTest.class) {
|
||||
|
@ -157,7 +157,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
}
|
||||
}
|
||||
|
||||
private static void deleteContainerOrWarnIfUnable(BlobStoreContext<?, ?> context,
|
||||
private static void deleteContainerOrWarnIfUnable(BlobStoreContext context,
|
||||
String containerName) {
|
||||
try {
|
||||
deleteContainer(context, containerName);
|
||||
|
@ -173,7 +173,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
/**
|
||||
* Tries to delete all containers, runs up to two times
|
||||
*/
|
||||
protected static void deleteEverything(final BlobStoreContext<?, ?> context) throws Exception {
|
||||
protected static void deleteEverything(final BlobStoreContext context) throws Exception {
|
||||
try {
|
||||
for (int i = 0; i < 2; i++) {
|
||||
Iterable<? extends StorageMetadata> testContainers = Iterables.filter(context
|
||||
|
@ -211,7 +211,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
* Due to eventual consistency, container commands may not return correctly immediately. Hence,
|
||||
* we will try up to the inconsistency window to see if the assertion completes.
|
||||
*/
|
||||
protected static void assertConsistencyAware(BlobStoreContext<?, ?> context, Runnable assertion)
|
||||
protected static void assertConsistencyAware(BlobStoreContext context, Runnable assertion)
|
||||
throws InterruptedException {
|
||||
if (context.getConsistencyModel() == ConsistencyModels.STRICT) {
|
||||
assertion.run();
|
||||
|
@ -237,7 +237,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
assertConsistencyAware(context, assertion);
|
||||
}
|
||||
|
||||
protected static void createContainerAndEnsureEmpty(BlobStoreContext<?, ?> context,
|
||||
protected static void createContainerAndEnsureEmpty(BlobStoreContext context,
|
||||
final String containerName) throws InterruptedException {
|
||||
context.getBlobStore().createContainerInLocation("default", containerName);
|
||||
if (context.getConsistencyModel() == ConsistencyModels.EVENTUAL)
|
||||
|
@ -384,7 +384,7 @@ public class BaseBlobStoreIntegrationTest<A, S> {
|
|||
return new JavaUrlHttpCommandExecutorServiceModule();
|
||||
}
|
||||
|
||||
protected static void deleteContainer(final BlobStoreContext<?, ?> context, final String name)
|
||||
protected static void deleteContainer(final BlobStoreContext context, final String name)
|
||||
throws InterruptedException {
|
||||
if (context.getBlobStore().containerExists(name)) {
|
||||
System.err.printf("*** deleting container %s...%n", name);
|
||||
|
|
|
@ -39,7 +39,7 @@ import com.google.common.base.Throwables;
|
|||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BaseContainerIntegrationTest<A, S> extends BaseBlobStoreIntegrationTest<A, S> {
|
||||
public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest {
|
||||
|
||||
@Test(groups = { "integration", "live" })
|
||||
public void containerDoesntExist() {
|
||||
|
|
|
@ -22,6 +22,6 @@ package org.jclouds.blobstore.integration.internal;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BaseContainerLiveTest<A, S> extends BaseBlobStoreIntegrationTest<A, S> {
|
||||
public class BaseContainerLiveTest extends BaseBlobStoreIntegrationTest {
|
||||
|
||||
}
|
|
@ -41,8 +41,7 @@ import org.testng.annotations.Test;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BaseInputStreamMapIntegrationTest<A, S> extends
|
||||
BaseMapIntegrationTest<A, S, InputStream> {
|
||||
public class BaseInputStreamMapIntegrationTest extends BaseMapIntegrationTest<InputStream> {
|
||||
|
||||
@Override
|
||||
@Test(groups = { "integration", "live" })
|
||||
|
@ -191,7 +190,7 @@ public class BaseInputStreamMapIntegrationTest<A, S> extends
|
|||
}
|
||||
|
||||
@Test(groups = { "integration", "live" })
|
||||
public void testPutAllFiles() throws InterruptedException{
|
||||
public void testPutAllFiles() throws InterruptedException {
|
||||
String bucketName = getContainerName();
|
||||
try {
|
||||
Map<String, InputStream> map = createMap(context, bucketName);
|
||||
|
@ -236,8 +235,7 @@ public class BaseInputStreamMapIntegrationTest<A, S> extends
|
|||
}
|
||||
|
||||
void getOneReturnsAppleAndOldValueIsNull(Map<String, InputStream> map, InputStream old)
|
||||
throws IOException, InterruptedException
|
||||
{
|
||||
throws IOException, InterruptedException {
|
||||
assert old == null;
|
||||
assertEquals(Utils.toStringAndClose(map.get("one")), String
|
||||
.format(XML_STRING_FORMAT, "apple"));
|
||||
|
@ -245,7 +243,7 @@ public class BaseInputStreamMapIntegrationTest<A, S> extends
|
|||
}
|
||||
|
||||
void getOneReturnsBearAndOldValueIsApple(Map<String, InputStream> map, InputStream oldValue)
|
||||
throws IOException, InterruptedException{
|
||||
throws IOException, InterruptedException {
|
||||
assertEquals(Utils.toStringAndClose(map.get("one")), String.format(XML_STRING_FORMAT, "bear"));
|
||||
assertEquals(Utils.toStringAndClose(oldValue), String.format(XML_STRING_FORMAT, "apple"));
|
||||
assertConsistencyAwareMapSize(map, 1);
|
||||
|
@ -302,7 +300,7 @@ public class BaseInputStreamMapIntegrationTest<A, S> extends
|
|||
((InputStreamMap) map).putString(key, value);
|
||||
}
|
||||
|
||||
protected Map<String, InputStream> createMap(BlobStoreContext<?, ?> context, String bucket) {
|
||||
protected Map<String, InputStream> createMap(BlobStoreContext context, String bucket) {
|
||||
InputStreamMap map = context.createInputStreamMap(bucket);
|
||||
return (Map<String, InputStream>) map;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ import com.google.common.collect.ImmutableSet;
|
|||
import com.google.common.collect.Maps;
|
||||
import com.google.common.io.Files;
|
||||
|
||||
public abstract class BaseMapIntegrationTest<A, S, V> extends BaseBlobStoreIntegrationTest<A, S> {
|
||||
public abstract class BaseMapIntegrationTest<V> extends BaseBlobStoreIntegrationTest {
|
||||
|
||||
public abstract void testPutAll() throws InterruptedException, ExecutionException,
|
||||
TimeoutException;
|
||||
|
@ -94,7 +94,7 @@ public abstract class BaseMapIntegrationTest<A, S, V> extends BaseBlobStoreInteg
|
|||
}
|
||||
}
|
||||
|
||||
protected abstract Map<String, V> createMap(BlobStoreContext<?, ?> context, String bucket);
|
||||
protected abstract Map<String, V> createMap(BlobStoreContext context, String bucket);
|
||||
|
||||
@Test(groups = { "integration", "live" })
|
||||
public void testClear() throws InterruptedException, ExecutionException, TimeoutException {
|
||||
|
|
|
@ -28,7 +28,7 @@ import org.testng.annotations.Test;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BaseServiceIntegrationTest<A, S> extends BaseBlobStoreIntegrationTest<A, S> {
|
||||
public class BaseServiceIntegrationTest extends BaseBlobStoreIntegrationTest {
|
||||
|
||||
@Test(groups = { "integration", "live" })
|
||||
void containerDoesntExist() {
|
||||
|
|
|
@ -25,9 +25,9 @@ import org.testng.ITestContext;
|
|||
|
||||
import com.google.inject.Module;
|
||||
|
||||
public abstract class BaseTestInitializer<A, S> {
|
||||
public abstract class BaseTestInitializer {
|
||||
|
||||
public BlobStoreContext<A, S> init(Module configurationModule, ITestContext testContext)
|
||||
public BlobStoreContext init(Module configurationModule, ITestContext testContext)
|
||||
throws Exception {
|
||||
String endpoint = System.getProperty("jclouds.test.endpoint");
|
||||
String app = System.getProperty("jclouds.test.app");
|
||||
|
@ -48,8 +48,8 @@ public abstract class BaseTestInitializer<A, S> {
|
|||
}
|
||||
}
|
||||
|
||||
protected abstract BlobStoreContext<A, S> createStubContext();
|
||||
protected abstract BlobStoreContext createStubContext();
|
||||
|
||||
protected abstract BlobStoreContext<A, S> createLiveContext(Module configurationModule,
|
||||
String url, String app, String account, String key) throws IOException;
|
||||
protected abstract BlobStoreContext createLiveContext(Module configurationModule, String url,
|
||||
String app, String account, String key) throws IOException;
|
||||
}
|
|
@ -22,8 +22,6 @@ import static org.testng.Assert.assertEquals;
|
|||
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder;
|
||||
|
@ -42,13 +40,13 @@ import com.google.inject.util.Types;
|
|||
@Test(groups = { "unit" }, testName = "blobstore.BaseBlobMapTest")
|
||||
public class BaseBlobMapTest {
|
||||
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> context;
|
||||
BlobStoreContext context;
|
||||
|
||||
InputStreamMapImpl map;
|
||||
|
||||
@BeforeClass
|
||||
void addDefaultObjectsSoThatTestsWillPass() {
|
||||
context = new StubBlobStoreContextBuilder().buildContext();
|
||||
context = new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
map = (InputStreamMapImpl) context.createInputStreamMap("test");
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,11 @@ import com.google.inject.ImplementedBy;
|
|||
*
|
||||
*/
|
||||
@ImplementedBy(ComputeServiceContextImpl.class)
|
||||
public interface ComputeServiceContext<A, S> extends RestContext<A, S> {
|
||||
public interface ComputeServiceContext {
|
||||
|
||||
ComputeService getComputeService();
|
||||
|
||||
<A, S> RestContext<A, S> getProviderSpecificContext();
|
||||
|
||||
void close();
|
||||
}
|
|
@ -21,6 +21,7 @@ package org.jclouds.compute;
|
|||
import java.util.Properties;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import org.jclouds.compute.internal.ComputeServiceContextImpl;
|
||||
import org.jclouds.rest.RestContextBuilder;
|
||||
|
||||
import com.google.inject.Key;
|
||||
|
@ -46,17 +47,16 @@ public abstract class ComputeServiceContextBuilder<A, S> extends RestContextBuil
|
|||
this(asyncClientType, syncClientType, new Properties());
|
||||
}
|
||||
|
||||
public ComputeServiceContextBuilder(TypeLiteral<A> asyncClientType, TypeLiteral<S> syncClientType,
|
||||
Properties properties) {
|
||||
public ComputeServiceContextBuilder(TypeLiteral<A> asyncClientType,
|
||||
TypeLiteral<S> syncClientType, Properties properties) {
|
||||
super(asyncClientType, syncClientType, properties);
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public ComputeServiceContext<A, S> buildContext() {
|
||||
return (ComputeServiceContext<A, S>) this.buildInjector().getInstance(
|
||||
Key.get(Types.newParameterizedType(ComputeServiceContext.class,
|
||||
asyncClientType.getType(), syncClientType.getType())));
|
||||
public ComputeServiceContext buildComputeServiceContext() {
|
||||
// need the generic type information
|
||||
return (ComputeServiceContext) buildInjector().getInstance(
|
||||
Key.get(Types.newParameterizedType(ComputeServiceContextImpl.class, asyncClientType
|
||||
.getType(), syncClientType.getType())));
|
||||
}
|
||||
}
|
|
@ -31,7 +31,7 @@ import org.jclouds.rest.RestContextFactory;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
public class ComputeServiceContextFactory extends
|
||||
RestContextFactory<ComputeServiceContext<?, ?>, ComputeServiceContextBuilder<?, ?>> {
|
||||
RestContextFactory<ComputeServiceContext, ComputeServiceContextBuilder<?, ?>> {
|
||||
|
||||
/**
|
||||
* Initializes with the default properties built-in to jclouds. This is typically stored in the
|
||||
|
@ -53,4 +53,9 @@ public class ComputeServiceContextFactory extends
|
|||
public ComputeServiceContextFactory(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ComputeServiceContext build(ComputeServiceContextBuilder<?, ?> contextBuilder) {
|
||||
return contextBuilder.buildComputeServiceContext();
|
||||
}
|
||||
}
|
|
@ -2,28 +2,38 @@ package org.jclouds.compute.internal;
|
|||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.net.URI;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.compute.ComputeService;
|
||||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.internal.RestContextImpl;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class ComputeServiceContextImpl<A, S> extends RestContextImpl<A, S> implements
|
||||
ComputeServiceContext<A, S> {
|
||||
public class ComputeServiceContextImpl<X, Y> implements ComputeServiceContext {
|
||||
private final ComputeService computeService;
|
||||
private final RestContext<X, Y> providerSpecificContext;
|
||||
|
||||
public ComputeServiceContextImpl(Closer closer, ComputeService computeService, A asyncApi,
|
||||
S syncApi, URI endPoint, String account) {
|
||||
super(closer, asyncApi, syncApi, endPoint, account);
|
||||
@Inject
|
||||
public ComputeServiceContextImpl(ComputeService computeService,
|
||||
RestContext<X, Y> providerSpecificContext) {
|
||||
this.computeService = checkNotNull(computeService, "computeService");
|
||||
this.providerSpecificContext = providerSpecificContext;
|
||||
}
|
||||
|
||||
public ComputeService getComputeService() {
|
||||
return computeService;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <A, S> RestContext<A, S> getProviderSpecificContext() {
|
||||
return (RestContext<A, S>) providerSpecificContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
providerSpecificContext.close();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,10 @@ package org.jclouds.rest;
|
|||
|
||||
import java.net.URI;
|
||||
|
||||
import org.jclouds.rest.internal.RestContextImpl;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
* Represents an authenticated context to the cloud.
|
||||
|
@ -32,6 +35,7 @@ import com.google.common.util.concurrent.ListenableFuture;
|
|||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(RestContextImpl.class)
|
||||
public interface RestContext<A, S> {
|
||||
|
||||
/**
|
||||
|
|
|
@ -24,6 +24,7 @@ import java.io.IOException;
|
|||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.domain.Credentials;
|
||||
|
@ -39,7 +40,7 @@ import com.google.inject.Module;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class RestContextFactory<T extends RestContext<?, ?>, B extends RestContextBuilder<?, ?>> {
|
||||
public abstract class RestContextFactory<T, B extends RestContextBuilder<?, ?>> {
|
||||
private final static Properties NO_PROPERTIES = new Properties();
|
||||
private final Properties properties;
|
||||
|
||||
|
@ -115,23 +116,31 @@ public class RestContextFactory<T extends RestContext<?, ?>, B extends RestConte
|
|||
return createContext(hint, account, key, ImmutableSet.<Module> of(), NO_PROPERTIES);
|
||||
}
|
||||
|
||||
public T createContext(String hint, Properties overrides) {
|
||||
return createContext(hint, null, null, ImmutableSet.<Module> of(), overrides);
|
||||
}
|
||||
|
||||
public T createContext(String hint, Iterable<? extends Module> modules, Properties overrides) {
|
||||
return createContext(hint, null, null, modules, overrides);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* FIXME Comment this // ImmutableSet.<Module>of(new ExecutorServiceModule(myexecutor))
|
||||
*
|
||||
* @param hint
|
||||
* @param account
|
||||
* nullable, if credentials are present in the overrides
|
||||
* @param key
|
||||
* nullable, if credentials are present in the overrides
|
||||
* @param modules
|
||||
* @param overrides
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public T createContext(String hint, String account, String key,
|
||||
public T createContext(String hint, @Nullable String account, @Nullable String key,
|
||||
Iterable<? extends Module> modules, Properties overrides) {
|
||||
checkNotNull(hint, "hint");
|
||||
checkNotNull(account, "account");
|
||||
checkNotNull(key, "key");
|
||||
checkNotNull(modules, "modules");
|
||||
checkNotNull(overrides, "overrides");
|
||||
String propertiesBuilderKey = String.format("%s.propertiesbuilder", hint);
|
||||
|
@ -147,12 +156,17 @@ public class RestContextFactory<T extends RestContext<?, ?>, B extends RestConte
|
|||
.forName(propertiesBuilderClassName);
|
||||
Class<B> contextBuilderClass = (Class<B>) Class.forName(contextBuilderClassName);
|
||||
HttpPropertiesBuilder builder = propertiesBuilderClass.getConstructor(Properties.class)
|
||||
.newInstance(overrides).withCredentials(account, key);
|
||||
return (T) contextBuilderClass.getConstructor(Properties.class).newInstance(
|
||||
builder.build()).withModules(Iterables.toArray(modules, Module.class))
|
||||
.buildContext();
|
||||
.newInstance(overrides);
|
||||
if (key != null)
|
||||
builder.withCredentials(account, key);
|
||||
|
||||
B contextBuilder = (B) contextBuilderClass.getConstructor(Properties.class).newInstance(
|
||||
builder.build()).withModules(Iterables.toArray(modules, Module.class));
|
||||
return build(contextBuilder);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("error instantiating " + contextBuilderClassName, e);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract T build(B contextBuilder);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.io.IOException;
|
|||
import java.net.URI;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.logging.Logger;
|
||||
|
@ -40,6 +41,7 @@ public class RestContextImpl<A, S> implements RestContext<A, S> {
|
|||
private final URI endPoint;
|
||||
private final String account;
|
||||
|
||||
@Inject
|
||||
public RestContextImpl(Closer closer, A asyncApi, S syncApi, URI endPoint, String account) {
|
||||
this.asyncApi = asyncApi;
|
||||
this.syncApi = syncApi;
|
||||
|
|
|
@ -20,14 +20,14 @@ package org.jclouds.demo.tweetstore.config;
|
|||
|
||||
import static com.google.appengine.api.labs.taskqueue.TaskOptions.Builder.url;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTBUILDERS;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTS;
|
||||
import static org.jclouds.demo.tweetstore.reference.TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
|
@ -36,7 +36,7 @@ import javax.servlet.ServletConfig;
|
|||
import javax.servlet.ServletException;
|
||||
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.BlobStoreContextBuilder;
|
||||
import org.jclouds.blobstore.BlobStoreContextFactory;
|
||||
import org.jclouds.demo.tweetstore.controller.AddTweetsController;
|
||||
import org.jclouds.demo.tweetstore.controller.StoreTweetsController;
|
||||
import org.jclouds.demo.tweetstore.functions.ServiceToStoredTweetStatuses;
|
||||
|
@ -55,9 +55,11 @@ import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
|
|||
import com.google.appengine.api.labs.taskqueue.Queue;
|
||||
import com.google.appengine.api.labs.taskqueue.QueueFactory;
|
||||
import com.google.appengine.api.labs.taskqueue.TaskOptions.Method;
|
||||
import com.google.appengine.repackaged.com.google.common.collect.ImmutableList;
|
||||
import com.google.appengine.repackaged.com.google.common.base.Splitter;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.io.Closeables;
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
* Creates servlets (using resources from the {@link SpringAppConfig}) and mappings.
|
||||
|
@ -67,141 +69,131 @@ import com.google.common.io.Closeables;
|
|||
*/
|
||||
@Configuration
|
||||
public class SpringServletConfig extends LoggingConfig implements ServletConfigAware {
|
||||
private ServletConfig servletConfig;
|
||||
|
||||
private Map<String, BlobStoreContext<?, ?>> providerTypeToBlobStoreMap;
|
||||
private TwitterClient twitterClient;
|
||||
private String container;
|
||||
private ServletConfig servletConfig;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@PostConstruct
|
||||
public void initialize() {
|
||||
Properties props = loadJCloudsProperties();
|
||||
logger.trace("About to initialize members.");
|
||||
|
||||
// shared across all blobstores and used to retrieve tweets
|
||||
twitterClient = TwitterContextFactory.createContext(props,
|
||||
new GoogleAppEngineConfigurationModule()).getApi();
|
||||
private Map<String, BlobStoreContext> providerTypeToBlobStoreMap;
|
||||
private TwitterClient twitterClient;
|
||||
private String container;
|
||||
|
||||
// common namespace for storing tweets
|
||||
container = checkNotNull(props.getProperty(PROPERTY_TWEETSTORE_CONTAINER),
|
||||
PROPERTY_TWEETSTORE_CONTAINER);
|
||||
ImmutableList<String> contextBuilderClassNames = ImmutableList.<String>of(
|
||||
checkNotNull(props.getProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS),
|
||||
PROPERTY_BLOBSTORE_CONTEXTBUILDERS)
|
||||
.split(","));
|
||||
@PostConstruct
|
||||
public void initialize() throws IOException {
|
||||
Properties props = loadJCloudsProperties();
|
||||
logger.trace("About to initialize members.");
|
||||
|
||||
// instantiate and store references to all blobstores by provider name
|
||||
providerTypeToBlobStoreMap = Maps.newHashMap();
|
||||
for (String className : contextBuilderClassNames) {
|
||||
Class<BlobStoreContextBuilder<?, ?>> builderClass;
|
||||
Constructor<BlobStoreContextBuilder<?, ?>> constructor;
|
||||
String name;
|
||||
BlobStoreContext<?, ?> context;
|
||||
try {
|
||||
builderClass = (Class<BlobStoreContextBuilder<?, ?>>) Class.forName(className);
|
||||
name = builderClass.getSimpleName().replaceAll("BlobStoreContextBuilder", "");
|
||||
constructor = builderClass.getConstructor(Properties.class);
|
||||
context = constructor.newInstance(props)
|
||||
.withModules(new GoogleAppEngineConfigurationModule())
|
||||
.buildContext();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("error instantiating " + className, e);
|
||||
}
|
||||
providerTypeToBlobStoreMap.put(name, context);
|
||||
}
|
||||
Module googleModule = new GoogleAppEngineConfigurationModule();
|
||||
Set<Module> modules = ImmutableSet.<Module> of(googleModule);
|
||||
// shared across all blobstores and used to retrieve tweets
|
||||
twitterClient = TwitterContextFactory.createContext(props, googleModule).getApi();
|
||||
|
||||
// get a queue for submitting store tweet requests
|
||||
Queue queue = QueueFactory.getQueue("twitter");
|
||||
// submit a job to store tweets for each configured blobstore
|
||||
for (String name : providerTypeToBlobStoreMap.keySet()) {
|
||||
queue.add(url("/store/do").header("context", name).method(Method.GET));
|
||||
}
|
||||
logger.trace("Members initialized. TwitterClient: '%s', container: '%s', provider types: '%s'",
|
||||
twitterClient, container, providerTypeToBlobStoreMap.keySet());
|
||||
}
|
||||
|
||||
private Properties loadJCloudsProperties() {
|
||||
logger.trace("About to read properties from '%s'", "/WEB-INF/jclouds.properties");
|
||||
Properties props = new Properties();
|
||||
InputStream input = servletConfig.getServletContext()
|
||||
.getResourceAsStream("/WEB-INF/jclouds.properties");
|
||||
try {
|
||||
props.load(input);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
Closeables.closeQuietly(input);
|
||||
}
|
||||
logger.trace("Properties successfully read.");
|
||||
return props;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public StoreTweetsController storeTweetsController() {
|
||||
StoreTweetsController controller = new StoreTweetsController(providerTypeToBlobStoreMap,
|
||||
container, twitterClient);
|
||||
injectServletConfig(controller);
|
||||
return controller;
|
||||
}
|
||||
// common namespace for storing tweets
|
||||
container = checkNotNull(props.getProperty(PROPERTY_TWEETSTORE_CONTAINER),
|
||||
PROPERTY_TWEETSTORE_CONTAINER);
|
||||
BlobStoreContextFactory blobStoreContextFactory = new BlobStoreContextFactory();
|
||||
// instantiate and store references to all blobstores by provider name
|
||||
providerTypeToBlobStoreMap = Maps.newHashMap();
|
||||
for (String hint : Splitter.on(',').split(
|
||||
checkNotNull(props.getProperty(PROPERTY_BLOBSTORE_CONTEXTS),
|
||||
PROPERTY_BLOBSTORE_CONTEXTS))) {
|
||||
providerTypeToBlobStoreMap.put(hint, blobStoreContextFactory.createContext(hint, modules,
|
||||
props));
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AddTweetsController addTweetsController() {
|
||||
AddTweetsController controller = new AddTweetsController(providerTypeToBlobStoreMap,
|
||||
serviceToStoredTweetStatuses());
|
||||
injectServletConfig(controller);
|
||||
return controller;
|
||||
}
|
||||
|
||||
private void injectServletConfig(Servlet servlet) {
|
||||
logger.trace("About to inject servlet config '%s'", servletConfig);
|
||||
try {
|
||||
servlet.init(checkNotNull(servletConfig));
|
||||
} catch (ServletException exception) {
|
||||
throw new BeanCreationException("Unable to instantiate " + servlet, exception);
|
||||
}
|
||||
logger.trace("Successfully injected servlet config.");
|
||||
}
|
||||
// get a queue for submitting store tweet requests
|
||||
Queue queue = QueueFactory.getQueue("twitter");
|
||||
// submit a job to store tweets for each configured blobstore
|
||||
for (String name : providerTypeToBlobStoreMap.keySet()) {
|
||||
queue.add(url("/store/do").header("context", name).method(Method.GET));
|
||||
}
|
||||
logger.trace(
|
||||
"Members initialized. TwitterClient: '%s', container: '%s', provider types: '%s'",
|
||||
twitterClient, container, providerTypeToBlobStoreMap.keySet());
|
||||
}
|
||||
|
||||
@Bean
|
||||
ServiceToStoredTweetStatuses serviceToStoredTweetStatuses() {
|
||||
return new ServiceToStoredTweetStatuses(providerTypeToBlobStoreMap, container);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public HandlerMapping handlerMapping() {
|
||||
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
|
||||
Map<String, Object> urlMap = Maps.newHashMapWithExpectedSize(2);
|
||||
urlMap.put("/store/*", storeTweetsController());
|
||||
urlMap.put("/tweets/*", addTweetsController());
|
||||
mapping.setUrlMap(urlMap);
|
||||
/*
|
||||
* "/store" and "/tweets" are part of the servlet mapping and thus stripped
|
||||
* by the mapping if using default settings.
|
||||
*/
|
||||
mapping.setAlwaysUseFullPath(true);
|
||||
return mapping;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public HandlerAdapter servletHandlerAdapter() {
|
||||
return new SimpleServletHandlerAdapter();
|
||||
}
|
||||
|
||||
@PreDestroy
|
||||
public void destroy() throws Exception {
|
||||
logger.trace("About to close contexts.");
|
||||
for (BlobStoreContext<?, ?> context : providerTypeToBlobStoreMap.values()) {
|
||||
context.close();
|
||||
}
|
||||
logger.trace("Contexts closed.");
|
||||
}
|
||||
private Properties loadJCloudsProperties() {
|
||||
logger.trace("About to read properties from '%s'", "/WEB-INF/jclouds.properties");
|
||||
Properties props = new Properties();
|
||||
InputStream input = servletConfig.getServletContext().getResourceAsStream(
|
||||
"/WEB-INF/jclouds.properties");
|
||||
try {
|
||||
props.load(input);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
Closeables.closeQuietly(input);
|
||||
}
|
||||
logger.trace("Properties successfully read.");
|
||||
return props;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.web.context.ServletConfigAware#setServletConfig(javax.servlet.ServletConfig)
|
||||
*/
|
||||
@Override
|
||||
public void setServletConfig(ServletConfig servletConfig) {
|
||||
this.servletConfig = servletConfig;
|
||||
}
|
||||
@Bean
|
||||
public StoreTweetsController storeTweetsController() {
|
||||
StoreTweetsController controller = new StoreTweetsController(providerTypeToBlobStoreMap,
|
||||
container, twitterClient);
|
||||
injectServletConfig(controller);
|
||||
return controller;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AddTweetsController addTweetsController() {
|
||||
AddTweetsController controller = new AddTweetsController(providerTypeToBlobStoreMap,
|
||||
serviceToStoredTweetStatuses());
|
||||
injectServletConfig(controller);
|
||||
return controller;
|
||||
}
|
||||
|
||||
private void injectServletConfig(Servlet servlet) {
|
||||
logger.trace("About to inject servlet config '%s'", servletConfig);
|
||||
try {
|
||||
servlet.init(checkNotNull(servletConfig));
|
||||
} catch (ServletException exception) {
|
||||
throw new BeanCreationException("Unable to instantiate " + servlet, exception);
|
||||
}
|
||||
logger.trace("Successfully injected servlet config.");
|
||||
}
|
||||
|
||||
@Bean
|
||||
ServiceToStoredTweetStatuses serviceToStoredTweetStatuses() {
|
||||
return new ServiceToStoredTweetStatuses(providerTypeToBlobStoreMap, container);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public HandlerMapping handlerMapping() {
|
||||
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
|
||||
Map<String, Object> urlMap = Maps.newHashMapWithExpectedSize(2);
|
||||
urlMap.put("/store/*", storeTweetsController());
|
||||
urlMap.put("/tweets/*", addTweetsController());
|
||||
mapping.setUrlMap(urlMap);
|
||||
/*
|
||||
* "/store" and "/tweets" are part of the servlet mapping and thus stripped by the mapping if
|
||||
* using default settings.
|
||||
*/
|
||||
mapping.setAlwaysUseFullPath(true);
|
||||
return mapping;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public HandlerAdapter servletHandlerAdapter() {
|
||||
return new SimpleServletHandlerAdapter();
|
||||
}
|
||||
|
||||
@PreDestroy
|
||||
public void destroy() throws Exception {
|
||||
logger.trace("About to close contexts.");
|
||||
for (BlobStoreContext context : providerTypeToBlobStoreMap.values()) {
|
||||
context.close();
|
||||
}
|
||||
logger.trace("Contexts closed.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.springframework.web.context.ServletConfigAware#setServletConfig(javax.servlet.ServletConfig
|
||||
* )
|
||||
*/
|
||||
@Override
|
||||
public void setServletConfig(ServletConfig servletConfig) {
|
||||
this.servletConfig = servletConfig;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,14 +54,14 @@ public class AddTweetsController extends HttpServlet implements
|
|||
|
||||
/** The serialVersionUID */
|
||||
private static final long serialVersionUID = 3888348023150822683L;
|
||||
private final Map<String, BlobStoreContext<?, ?>> contexts;
|
||||
private final Map<String, BlobStoreContext> contexts;
|
||||
private final ServiceToStoredTweetStatuses blobStoreContextToContainerResult;
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
public AddTweetsController(Map<String, BlobStoreContext<?, ?>> contexts,
|
||||
public AddTweetsController(Map<String, BlobStoreContext> contexts,
|
||||
ServiceToStoredTweetStatuses blobStoreContextToContainerResult) {
|
||||
this.contexts = contexts;
|
||||
this.blobStoreContextToContainerResult = blobStoreContextToContainerResult;
|
||||
|
|
|
@ -74,7 +74,7 @@ public class StoreTweetsController extends HttpServlet {
|
|||
/** The serialVersionUID */
|
||||
private static final long serialVersionUID = 7215420527854203714L;
|
||||
|
||||
private final Map<String, BlobStoreContext<?, ?>> contexts;
|
||||
private final Map<String, BlobStoreContext> contexts;
|
||||
private final TwitterClient client;
|
||||
private final String container;
|
||||
|
||||
|
@ -83,7 +83,7 @@ public class StoreTweetsController extends HttpServlet {
|
|||
|
||||
@Inject
|
||||
public StoreTweetsController(
|
||||
Map<String, BlobStoreContext<?, ?>> contexts,
|
||||
Map<String, BlobStoreContext> contexts,
|
||||
@Named(TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER) final String container,
|
||||
TwitterClient client) {
|
||||
this.container = container;
|
||||
|
@ -93,7 +93,7 @@ public class StoreTweetsController extends HttpServlet {
|
|||
|
||||
@VisibleForTesting
|
||||
void addMyTweets(String contextName, SortedSet<Status> allAboutMe) {
|
||||
BlobStoreContext<?, ?> context = checkNotNull(contexts.get(contextName),
|
||||
BlobStoreContext context = checkNotNull(contexts.get(contextName),
|
||||
"no context for " + contextName + " in " + contexts.keySet());
|
||||
BlobMap map = context.createBlobMap(container);
|
||||
for (Status status : allAboutMe) {
|
||||
|
|
|
@ -39,11 +39,11 @@ import com.google.common.collect.Iterables;
|
|||
@Singleton
|
||||
public class ServiceToStoredTweetStatuses implements Function<String, Iterable<StoredTweetStatus>> {
|
||||
|
||||
private final Map<String, BlobStoreContext<?,?>> contexts;
|
||||
private final Map<String, BlobStoreContext> contexts;
|
||||
private final String container;
|
||||
|
||||
@Inject
|
||||
public ServiceToStoredTweetStatuses(Map<String, BlobStoreContext<?,?>> contexts,
|
||||
public ServiceToStoredTweetStatuses(Map<String, BlobStoreContext> contexts,
|
||||
@Named(TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER) String container) {
|
||||
this.contexts = contexts;
|
||||
this.container = container;
|
||||
|
@ -53,8 +53,8 @@ public class ServiceToStoredTweetStatuses implements Function<String, Iterable<S
|
|||
protected Logger logger = Logger.NULL;
|
||||
|
||||
public Iterable<StoredTweetStatus> apply(String service) {
|
||||
BlobStoreContext<?, ?> context = contexts.get(service);
|
||||
String host = context.getEndPoint().getHost();
|
||||
BlobStoreContext context = contexts.get(service);
|
||||
String host = context.getProviderSpecificContext().getEndPoint().getHost();
|
||||
try {
|
||||
BlobMap blobMap = context.createBlobMap(container);
|
||||
Set<String> blobs = blobMap.keySet();
|
||||
|
|
|
@ -25,8 +25,6 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder;
|
||||
|
@ -47,12 +45,11 @@ import com.google.common.collect.ImmutableSet;
|
|||
@Test(groups = "unit", testName = "tweetstore.AddTweetsControllerTest")
|
||||
public class AddTweetsControllerTest {
|
||||
|
||||
Map<String, BlobStoreContext<?, ?>> createServices(String container)
|
||||
throws InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> services = Maps.newHashMap();
|
||||
Map<String, BlobStoreContext> createServices(String container) throws InterruptedException,
|
||||
ExecutionException {
|
||||
Map<String, BlobStoreContext> services = Maps.newHashMap();
|
||||
for (String name : new String[] { "1", "2" }) {
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||
.buildContext();
|
||||
BlobStoreContext context = new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||
|
@ -65,7 +62,7 @@ public class AddTweetsControllerTest {
|
|||
|
||||
public void testStoreTweets() throws IOException, InterruptedException, ExecutionException {
|
||||
String container = "container";
|
||||
Map<String, BlobStoreContext<?, ?>> contexts = createServices(container);
|
||||
Map<String, BlobStoreContext> contexts = createServices(container);
|
||||
|
||||
ServiceToStoredTweetStatuses function = new ServiceToStoredTweetStatuses(contexts, container);
|
||||
AddTweetsController controller = new AddTweetsController(contexts, function);
|
||||
|
|
|
@ -54,19 +54,18 @@ public class StoreTweetsControllerTest {
|
|||
return createMock(TwitterClient.class);
|
||||
}
|
||||
|
||||
Map<String, BlobStoreContext<?, ?>> createBlobStores() throws InterruptedException,
|
||||
ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> contexts = ImmutableMap
|
||||
.<String, BlobStoreContext<?, ?>> of("test1", new StubBlobStoreContextBuilder()
|
||||
.buildContext(), "test2", new StubBlobStoreContextBuilder().buildContext());
|
||||
for (BlobStoreContext<?, ?> blobstore : contexts.values()) {
|
||||
Map<String, BlobStoreContext> createBlobStores() throws InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext> contexts = ImmutableMap.<String, BlobStoreContext> of("test1",
|
||||
new StubBlobStoreContextBuilder().buildBlobStoreContext(), "test2",
|
||||
new StubBlobStoreContextBuilder().buildBlobStoreContext());
|
||||
for (BlobStoreContext blobstore : contexts.values()) {
|
||||
blobstore.getAsyncBlobStore().createContainerInLocation(null, "favo").get();
|
||||
}
|
||||
return contexts;
|
||||
}
|
||||
|
||||
public void testStoreTweets() throws IOException, InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> stores = createBlobStores();
|
||||
Map<String, BlobStoreContext> stores = createBlobStores();
|
||||
StoreTweetsController function = new StoreTweetsController(stores, "favo",
|
||||
createTwitterClient());
|
||||
|
||||
|
@ -91,7 +90,7 @@ public class StoreTweetsControllerTest {
|
|||
function.addMyTweets("test1", allAboutMe);
|
||||
function.addMyTweets("test2", allAboutMe);
|
||||
|
||||
for (Entry<String, BlobStoreContext<?, ?>> entry : stores.entrySet()) {
|
||||
for (Entry<String, BlobStoreContext> entry : stores.entrySet()) {
|
||||
BlobMap map = entry.getValue().createBlobMap("favo");
|
||||
Blob frankBlob = map.get("1");
|
||||
assertEquals(frankBlob.getMetadata().getName(), "1");
|
||||
|
|
|
@ -23,9 +23,7 @@ import static org.testng.Assert.assertEquals;
|
|||
import java.io.IOException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobMap;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder;
|
||||
|
@ -42,8 +40,7 @@ import org.testng.annotations.Test;
|
|||
public class KeyToStoredTweetStatusTest {
|
||||
|
||||
BlobMap createMap() throws InterruptedException, ExecutionException {
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||
.buildContext();
|
||||
BlobStoreContext context = new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
context.getBlobStore().createContainerInLocation(null, "test1");
|
||||
return context.createBlobMap("test1");
|
||||
}
|
||||
|
|
|
@ -24,8 +24,6 @@ import java.io.IOException;
|
|||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder;
|
||||
|
@ -44,12 +42,11 @@ import com.google.common.collect.Iterables;
|
|||
@Test(groups = "unit", testName = "tweetstore.ServiceToStoredTweetStatuses")
|
||||
public class ServiceToStoredTweetStatusesTest {
|
||||
|
||||
Map<String, BlobStoreContext<?, ?>> createServices(String container)
|
||||
throws InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> services = Maps.newHashMap();
|
||||
Map<String, BlobStoreContext> createServices(String container) throws InterruptedException,
|
||||
ExecutionException {
|
||||
Map<String, BlobStoreContext> services = Maps.newHashMap();
|
||||
for (String name : new String[] { "1", "2" }) {
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||
.buildContext();
|
||||
BlobStoreContext context = new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||
|
@ -62,7 +59,7 @@ public class ServiceToStoredTweetStatusesTest {
|
|||
|
||||
public void testStoreTweets() throws IOException, InterruptedException, ExecutionException {
|
||||
String container = "container";
|
||||
Map<String, BlobStoreContext<?, ?>> contexts = createServices(container);
|
||||
Map<String, BlobStoreContext> contexts = createServices(container);
|
||||
|
||||
ServiceToStoredTweetStatuses function = new ServiceToStoredTweetStatuses(contexts, container);
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ import static org.jclouds.aws.reference.AWSConstants.PROPERTY_AWS_ACCESSKEYID;
|
|||
import static org.jclouds.aws.reference.AWSConstants.PROPERTY_AWS_SECRETACCESSKEY;
|
||||
import static org.jclouds.azure.storage.reference.AzureStorageConstants.PROPERTY_AZURESTORAGE_ACCOUNT;
|
||||
import static org.jclouds.azure.storage.reference.AzureStorageConstants.PROPERTY_AZURESTORAGE_KEY;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTBUILDERS;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTS;
|
||||
import static org.jclouds.demo.tweetstore.reference.TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER;
|
||||
import static org.jclouds.rackspace.reference.RackspaceConstants.PROPERTY_RACKSPACE_KEY;
|
||||
import static org.jclouds.rackspace.reference.RackspaceConstants.PROPERTY_RACKSPACE_USER;
|
||||
|
@ -39,13 +39,10 @@ import java.util.concurrent.ExecutionException;
|
|||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.jclouds.aws.s3.S3PropertiesBuilder;
|
||||
import org.jclouds.aws.s3.blobstore.S3BlobStoreContextBuilder;
|
||||
import org.jclouds.azure.storage.blob.AzureBlobPropertiesBuilder;
|
||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStoreContextBuilder;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.BlobStoreContextFactory;
|
||||
import org.jclouds.rackspace.cloudfiles.CloudFilesPropertiesBuilder;
|
||||
import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobStoreContextBuilder;
|
||||
import org.jclouds.twitter.TwitterPropertiesBuilder;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
|
@ -66,7 +63,7 @@ public class TweetStoreLiveTest {
|
|||
|
||||
GoogleDevServer server;
|
||||
private URL url;
|
||||
private Iterable<BlobStoreContext<? extends Object, ? extends Object>> contexts;
|
||||
private Iterable<BlobStoreContext> contexts;
|
||||
private String container;
|
||||
|
||||
@BeforeTest
|
||||
|
@ -77,11 +74,9 @@ public class TweetStoreLiveTest {
|
|||
Properties props = new Properties();
|
||||
props.setProperty(PROPERTY_TWEETSTORE_CONTAINER, checkNotNull(System
|
||||
.getProperty(PROPERTY_TWEETSTORE_CONTAINER), PROPERTY_TWEETSTORE_CONTAINER));
|
||||
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS,
|
||||
|
||||
// WATCH THIS.. when adding a new context, you must update the string
|
||||
String.format("%s,%s,%s", S3BlobStoreContextBuilder.class.getName(),
|
||||
CloudFilesBlobStoreContextBuilder.class.getName(),
|
||||
AzureBlobStoreContextBuilder.class.getName()));
|
||||
props.setProperty(PROPERTY_BLOBSTORE_CONTEXTS, "cloudfiles,s3");
|
||||
|
||||
props = new TwitterPropertiesBuilder(props).withCredentials(
|
||||
checkNotNull(System.getProperty(PROPERTY_TWITTER_USER), PROPERTY_TWITTER_USER),
|
||||
|
@ -112,23 +107,25 @@ public class TweetStoreLiveTest {
|
|||
TimeoutException, IOException {
|
||||
container = checkNotNull(System.getProperty(PROPERTY_TWEETSTORE_CONTAINER));
|
||||
BlobStoreContextFactory factory = new BlobStoreContextFactory();
|
||||
BlobStoreContext<?, ?> s3Context = factory.createContext("s3", checkNotNull(System
|
||||
BlobStoreContext s3Context = factory.createContext("s3", checkNotNull(System
|
||||
.getProperty(PROPERTY_AWS_ACCESSKEYID), PROPERTY_AWS_ACCESSKEYID), System
|
||||
.getProperty(PROPERTY_AWS_SECRETACCESSKEY, PROPERTY_AWS_SECRETACCESSKEY));
|
||||
|
||||
BlobStoreContext<?, ?> cfContext = factory.createContext("cloudfiles", checkNotNull(System
|
||||
BlobStoreContext cfContext = factory.createContext("cloudfiles", checkNotNull(System
|
||||
.getProperty(PROPERTY_RACKSPACE_USER), PROPERTY_RACKSPACE_USER), System.getProperty(
|
||||
PROPERTY_RACKSPACE_KEY, PROPERTY_RACKSPACE_KEY));
|
||||
|
||||
BlobStoreContext<?, ?> azContext = factory.createContext("azureblob", checkNotNull(System
|
||||
.getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT), System
|
||||
.getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY));
|
||||
// BlobStoreContext azContext = factory.createContext("azureblob", checkNotNull(System
|
||||
// .getProperty(PROPERTY_AZURESTORAGE_ACCOUNT), PROPERTY_AZURESTORAGE_ACCOUNT), System
|
||||
// .getProperty(PROPERTY_AZURESTORAGE_KEY, PROPERTY_AZURESTORAGE_KEY));
|
||||
|
||||
this.contexts = ImmutableList.of(s3Context, cfContext, azContext);
|
||||
// this.contexts = ImmutableList.of(s3Context, cfContext, azContext);
|
||||
this.contexts = ImmutableList.of(s3Context, cfContext);
|
||||
boolean deleted = false;
|
||||
for (BlobStoreContext<?, ?> context : contexts) {
|
||||
for (BlobStoreContext context : contexts) {
|
||||
if (context.getBlobStore().containerExists(container)) {
|
||||
System.err.printf("deleting container %s at %s%n", container, context.getEndPoint());
|
||||
System.err.printf("deleting container %s at %s%n", container, context
|
||||
.getProviderSpecificContext().getEndPoint());
|
||||
context.getBlobStore().deleteContainer(container);
|
||||
deleted = true;
|
||||
}
|
||||
|
@ -137,8 +134,9 @@ public class TweetStoreLiveTest {
|
|||
System.err.println("sleeping 60 seconds to allow containers to clear");
|
||||
Thread.sleep(60000);
|
||||
}
|
||||
for (BlobStoreContext<?, ?> context : contexts) {
|
||||
System.err.printf("creating container %s at %s%n", container, context.getEndPoint());
|
||||
for (BlobStoreContext context : contexts) {
|
||||
System.err.printf("creating container %s at %s%n", container, context
|
||||
.getProviderSpecificContext().getEndPoint());
|
||||
context.getBlobStore().createContainerInLocation(null, container);
|
||||
}
|
||||
if (deleted) {
|
||||
|
@ -162,8 +160,8 @@ public class TweetStoreLiveTest {
|
|||
@Test(dependsOnMethods = "shouldFail")
|
||||
public void testPrimeContainers() throws IOException, InterruptedException {
|
||||
URL gurl = new URL(url, "/store/do");
|
||||
|
||||
for (String context : new String[] { "S3", "Azure", "CloudFiles" }) {
|
||||
// WATCH THIS, you need to add a context each time
|
||||
for (String context : new String[] { "cloudfiles", "s3" }) {
|
||||
System.out.println("storing at context: " + context);
|
||||
HttpURLConnection connection = (HttpURLConnection) gurl.openConnection();
|
||||
connection.addRequestProperty("X-AppEngine-QueueName", "twitter");
|
||||
|
@ -176,8 +174,9 @@ public class TweetStoreLiveTest {
|
|||
|
||||
System.err.println("sleeping 20 seconds to allow for eventual consistency delay");
|
||||
Thread.sleep(20000);
|
||||
for (BlobStoreContext<?, ?> context : contexts) {
|
||||
assert context.createInputStreamMap(container).size() > 0 : context.getEndPoint();
|
||||
for (BlobStoreContext context : contexts) {
|
||||
assert context.createInputStreamMap(container).size() > 0 : context
|
||||
.getProviderSpecificContext().getEndPoint();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,19 +20,19 @@ package org.jclouds.demo.tweetstore.config;
|
|||
|
||||
import static com.google.appengine.api.labs.taskqueue.TaskOptions.Builder.url;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTBUILDERS;
|
||||
import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_BLOBSTORE_CONTEXTS;
|
||||
import static org.jclouds.demo.tweetstore.reference.TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.BlobStoreContextBuilder;
|
||||
import org.jclouds.blobstore.BlobStoreContextFactory;
|
||||
import org.jclouds.demo.tweetstore.controller.AddTweetsController;
|
||||
import org.jclouds.demo.tweetstore.controller.StoreTweetsController;
|
||||
import org.jclouds.gae.config.GoogleAppEngineConfigurationModule;
|
||||
|
@ -42,11 +42,14 @@ import org.jclouds.twitter.TwitterContextFactory;
|
|||
import com.google.appengine.api.labs.taskqueue.Queue;
|
||||
import com.google.appengine.api.labs.taskqueue.QueueFactory;
|
||||
import com.google.appengine.api.labs.taskqueue.TaskOptions.Method;
|
||||
import com.google.appengine.repackaged.com.google.common.collect.ImmutableList;
|
||||
import com.google.appengine.repackaged.com.google.common.base.Splitter;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.io.Closeables;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.servlet.GuiceServletContextListener;
|
||||
import com.google.inject.servlet.ServletModule;
|
||||
|
@ -59,44 +62,38 @@ import com.google.inject.util.Jsr330;
|
|||
*/
|
||||
public class GuiceServletConfig extends GuiceServletContextListener {
|
||||
|
||||
private Map<String, BlobStoreContext<?, ?>> providerTypeToBlobStoreMap;
|
||||
private Map<String, BlobStoreContext> providerTypeToBlobStoreMap;
|
||||
private TwitterClient twitterClient;
|
||||
private String container;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent servletContextEvent) {
|
||||
|
||||
BlobStoreContextFactory blobStoreContextFactory = null;
|
||||
try {
|
||||
blobStoreContextFactory = new BlobStoreContextFactory();
|
||||
} catch (IOException e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
|
||||
Properties props = loadJCloudsProperties(servletContextEvent);
|
||||
|
||||
Module googleModule = new GoogleAppEngineConfigurationModule();
|
||||
Set<Module> modules = ImmutableSet.<Module> of(googleModule);
|
||||
// shared across all blobstores and used to retrieve tweets
|
||||
twitterClient = TwitterContextFactory.createContext(props,
|
||||
new GoogleAppEngineConfigurationModule()).getApi();
|
||||
twitterClient = TwitterContextFactory.createContext(props, googleModule).getApi();
|
||||
|
||||
// common namespace for storing tweets.
|
||||
// common namespace for storing tweets
|
||||
container = checkNotNull(props.getProperty(PROPERTY_TWEETSTORE_CONTAINER),
|
||||
PROPERTY_TWEETSTORE_CONTAINER);
|
||||
ImmutableList<String> contextBuilderClassNames = ImmutableList.<String> of(checkNotNull(
|
||||
props.getProperty(PROPERTY_BLOBSTORE_CONTEXTBUILDERS),
|
||||
PROPERTY_BLOBSTORE_CONTEXTBUILDERS).split(","));
|
||||
|
||||
// instantiate and store references to all blobstores by provider name
|
||||
providerTypeToBlobStoreMap = Maps.newHashMap();
|
||||
for (String className : contextBuilderClassNames) {
|
||||
Class<BlobStoreContextBuilder<?, ?>> builderClass;
|
||||
Constructor<BlobStoreContextBuilder<?, ?>> constructor;
|
||||
String name;
|
||||
BlobStoreContext<?, ?> context;
|
||||
try {
|
||||
builderClass = (Class<BlobStoreContextBuilder<?, ?>>) Class.forName(className);
|
||||
name = builderClass.getSimpleName().replaceAll("BlobStoreContextBuilder", "");
|
||||
constructor = builderClass.getConstructor(Properties.class);
|
||||
context = constructor.newInstance(props).withModules(
|
||||
new GoogleAppEngineConfigurationModule()).buildContext();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("error instantiating " + className, e);
|
||||
}
|
||||
providerTypeToBlobStoreMap.put(name, context);
|
||||
for (String hint : Splitter.on(',').split(
|
||||
checkNotNull(props.getProperty(PROPERTY_BLOBSTORE_CONTEXTS),
|
||||
PROPERTY_BLOBSTORE_CONTEXTS))) {
|
||||
providerTypeToBlobStoreMap.put(hint, blobStoreContextFactory.createContext(hint, modules,
|
||||
props));
|
||||
}
|
||||
|
||||
// get a queue for submitting store tweet requests
|
||||
|
@ -128,8 +125,8 @@ public class GuiceServletConfig extends GuiceServletContextListener {
|
|||
return Guice.createInjector(new ServletModule() {
|
||||
@Override
|
||||
protected void configureServlets() {
|
||||
bind(new TypeLiteral<Map<String, BlobStoreContext<?, ?>>>() {})
|
||||
.toInstance(providerTypeToBlobStoreMap);
|
||||
bind(new TypeLiteral<Map<String, BlobStoreContext>>() {
|
||||
}).toInstance(providerTypeToBlobStoreMap);
|
||||
bind(TwitterClient.class).toInstance(twitterClient);
|
||||
bindConstant().annotatedWith(Jsr330.named(PROPERTY_TWEETSTORE_CONTAINER)).to(container);
|
||||
serve("/store/*").with(StoreTweetsController.class);
|
||||
|
@ -140,7 +137,7 @@ public class GuiceServletConfig extends GuiceServletContextListener {
|
|||
|
||||
@Override
|
||||
public void contextDestroyed(ServletContextEvent servletContextEvent) {
|
||||
for (BlobStoreContext<?, ?> context : providerTypeToBlobStoreMap.values()) {
|
||||
for (BlobStoreContext context : providerTypeToBlobStoreMap.values()) {
|
||||
context.close();
|
||||
}
|
||||
super.contextDestroyed(servletContextEvent);
|
||||
|
|
|
@ -54,14 +54,14 @@ public class AddTweetsController extends HttpServlet implements
|
|||
|
||||
/** The serialVersionUID */
|
||||
private static final long serialVersionUID = 3888348023150822683L;
|
||||
private final Map<String, BlobStoreContext<?, ?>> contexts;
|
||||
private final Map<String, BlobStoreContext> contexts;
|
||||
private final ServiceToStoredTweetStatuses blobStoreContextToContainerResult;
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
@Inject
|
||||
AddTweetsController(Map<String, BlobStoreContext<?, ?>> contexts,
|
||||
AddTweetsController(Map<String, BlobStoreContext> contexts,
|
||||
ServiceToStoredTweetStatuses blobStoreContextToContainerResult) {
|
||||
this.contexts = contexts;
|
||||
this.blobStoreContextToContainerResult = blobStoreContextToContainerResult;
|
||||
|
|
|
@ -73,7 +73,7 @@ public class StoreTweetsController extends HttpServlet {
|
|||
/** The serialVersionUID */
|
||||
private static final long serialVersionUID = 7215420527854203714L;
|
||||
|
||||
private final Map<String, BlobStoreContext<?, ?>> contexts;
|
||||
private final Map<String, BlobStoreContext> contexts;
|
||||
private final TwitterClient client;
|
||||
private final String container;
|
||||
|
||||
|
@ -82,7 +82,7 @@ public class StoreTweetsController extends HttpServlet {
|
|||
|
||||
@Inject
|
||||
@VisibleForTesting
|
||||
StoreTweetsController(Map<String, BlobStoreContext<?, ?>> contexts,
|
||||
StoreTweetsController(Map<String, BlobStoreContext> contexts,
|
||||
@Named(TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER) final String container,
|
||||
TwitterClient client) {
|
||||
this.container = container;
|
||||
|
@ -92,7 +92,7 @@ public class StoreTweetsController extends HttpServlet {
|
|||
|
||||
@VisibleForTesting
|
||||
void addMyTweets(String contextName, SortedSet<Status> allAboutMe) {
|
||||
BlobStoreContext<?, ?> context = checkNotNull(contexts.get(contextName), "no context for "
|
||||
BlobStoreContext context = checkNotNull(contexts.get(contextName), "no context for "
|
||||
+ contextName + " in " + contexts.keySet());
|
||||
BlobMap map = context.createBlobMap(container);
|
||||
for (Status status : allAboutMe) {
|
||||
|
|
|
@ -39,11 +39,11 @@ import com.google.common.collect.Iterables;
|
|||
@Singleton
|
||||
public class ServiceToStoredTweetStatuses implements Function<String, Iterable<StoredTweetStatus>> {
|
||||
|
||||
private final Map<String, BlobStoreContext<?,?>> contexts;
|
||||
private final Map<String, BlobStoreContext> contexts;
|
||||
private final String container;
|
||||
|
||||
@Inject
|
||||
public ServiceToStoredTweetStatuses(Map<String, BlobStoreContext<?,?>> contexts,
|
||||
public ServiceToStoredTweetStatuses(Map<String, BlobStoreContext> contexts,
|
||||
@Named(TweetStoreConstants.PROPERTY_TWEETSTORE_CONTAINER) String container) {
|
||||
this.contexts = contexts;
|
||||
this.container = container;
|
||||
|
@ -53,8 +53,8 @@ public class ServiceToStoredTweetStatuses implements Function<String, Iterable<S
|
|||
protected Logger logger = Logger.NULL;
|
||||
|
||||
public Iterable<StoredTweetStatus> apply(String service) {
|
||||
BlobStoreContext<?, ?> context = contexts.get(service);
|
||||
String host = context.getEndPoint().getHost();
|
||||
BlobStoreContext context = contexts.get(service);
|
||||
String host = context.getProviderSpecificContext().getEndPoint().getHost();
|
||||
try {
|
||||
BlobMap blobMap = context.createBlobMap(container);
|
||||
Set<String> blobs = blobMap.keySet();
|
||||
|
|
|
@ -25,8 +25,6 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder;
|
||||
|
@ -47,12 +45,11 @@ import com.google.common.collect.ImmutableSet;
|
|||
@Test(groups = "unit", testName = "tweetstore.AddTweetsControllerTest")
|
||||
public class AddTweetsControllerTest {
|
||||
|
||||
Map<String, BlobStoreContext<?, ?>> createServices(String container)
|
||||
throws InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> services = Maps.newHashMap();
|
||||
Map<String, BlobStoreContext> createServices(String container) throws InterruptedException,
|
||||
ExecutionException {
|
||||
Map<String, BlobStoreContext> services = Maps.newHashMap();
|
||||
for (String name : new String[] { "1", "2" }) {
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||
.buildContext();
|
||||
BlobStoreContext context = new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||
|
@ -65,7 +62,7 @@ public class AddTweetsControllerTest {
|
|||
|
||||
public void testStoreTweets() throws IOException, InterruptedException, ExecutionException {
|
||||
String container = "container";
|
||||
Map<String, BlobStoreContext<?, ?>> contexts = createServices(container);
|
||||
Map<String, BlobStoreContext> contexts = createServices(container);
|
||||
|
||||
ServiceToStoredTweetStatuses function = new ServiceToStoredTweetStatuses(contexts, container);
|
||||
AddTweetsController controller = new AddTweetsController(contexts, function);
|
||||
|
|
|
@ -54,19 +54,18 @@ public class StoreTweetsControllerTest {
|
|||
return createMock(TwitterClient.class);
|
||||
}
|
||||
|
||||
Map<String, BlobStoreContext<?, ?>> createBlobStores() throws InterruptedException,
|
||||
ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> contexts = ImmutableMap
|
||||
.<String, BlobStoreContext<?, ?>> of("test1", new StubBlobStoreContextBuilder()
|
||||
.buildContext(), "test2", new StubBlobStoreContextBuilder().buildContext());
|
||||
for (BlobStoreContext<?, ?> blobstore : contexts.values()) {
|
||||
Map<String, BlobStoreContext> createBlobStores() throws InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext> contexts = ImmutableMap.<String, BlobStoreContext> of("test1",
|
||||
new StubBlobStoreContextBuilder().buildBlobStoreContext(), "test2",
|
||||
new StubBlobStoreContextBuilder().buildBlobStoreContext());
|
||||
for (BlobStoreContext blobstore : contexts.values()) {
|
||||
blobstore.getAsyncBlobStore().createContainerInLocation(null, "favo").get();
|
||||
}
|
||||
return contexts;
|
||||
}
|
||||
|
||||
public void testStoreTweets() throws IOException, InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> stores = createBlobStores();
|
||||
Map<String, BlobStoreContext> stores = createBlobStores();
|
||||
StoreTweetsController function = new StoreTweetsController(stores, "favo",
|
||||
createTwitterClient());
|
||||
|
||||
|
@ -91,7 +90,7 @@ public class StoreTweetsControllerTest {
|
|||
function.addMyTweets("test1", allAboutMe);
|
||||
function.addMyTweets("test2", allAboutMe);
|
||||
|
||||
for (Entry<String, BlobStoreContext<?, ?>> entry : stores.entrySet()) {
|
||||
for (Entry<String, BlobStoreContext> entry : stores.entrySet()) {
|
||||
BlobMap map = entry.getValue().createBlobMap("favo");
|
||||
Blob frankBlob = map.get("1");
|
||||
assertEquals(frankBlob.getMetadata().getName(), "1");
|
||||
|
|
|
@ -23,9 +23,7 @@ import static org.testng.Assert.assertEquals;
|
|||
import java.io.IOException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobMap;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder;
|
||||
|
@ -42,8 +40,7 @@ import org.testng.annotations.Test;
|
|||
public class KeyToStoredTweetStatusTest {
|
||||
|
||||
BlobMap createMap() throws InterruptedException, ExecutionException {
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||
.buildContext();
|
||||
BlobStoreContext context = new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
context.getBlobStore().createContainerInLocation(null, "test1");
|
||||
return context.createBlobMap("test1");
|
||||
}
|
||||
|
|
|
@ -24,8 +24,6 @@ import java.io.IOException;
|
|||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.StubBlobStoreContextBuilder;
|
||||
|
@ -44,12 +42,11 @@ import com.google.common.collect.Iterables;
|
|||
@Test(groups = "unit", testName = "tweetstore.ServiceToStoredTweetStatuses")
|
||||
public class ServiceToStoredTweetStatusesTest {
|
||||
|
||||
Map<String, BlobStoreContext<?, ?>> createServices(String container)
|
||||
throws InterruptedException, ExecutionException {
|
||||
Map<String, BlobStoreContext<?, ?>> services = Maps.newHashMap();
|
||||
Map<String, BlobStoreContext> createServices(String container) throws InterruptedException,
|
||||
ExecutionException {
|
||||
Map<String, BlobStoreContext> services = Maps.newHashMap();
|
||||
for (String name : new String[] { "1", "2" }) {
|
||||
BlobStoreContext<AsyncBlobStore, BlobStore> context = new StubBlobStoreContextBuilder()
|
||||
.buildContext();
|
||||
BlobStoreContext context = new StubBlobStoreContextBuilder().buildBlobStoreContext();
|
||||
context.getAsyncBlobStore().createContainerInLocation(null, container).get();
|
||||
Blob blob = context.getAsyncBlobStore().newBlob("1");
|
||||
blob.getMetadata().getUserMetadata().put(TweetStoreConstants.SENDER_NAME, "frank");
|
||||
|
@ -62,7 +59,7 @@ public class ServiceToStoredTweetStatusesTest {
|
|||
|
||||
public void testStoreTweets() throws IOException, InterruptedException, ExecutionException {
|
||||
String container = "container";
|
||||
Map<String, BlobStoreContext<?, ?>> contexts = createServices(container);
|
||||
Map<String, BlobStoreContext> contexts = createServices(container);
|
||||
|
||||
ServiceToStoredTweetStatuses function = new ServiceToStoredTweetStatuses(contexts, container);
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue