diff --git a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContext.java b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContext.java index 2e4f6d0f3d..9a1c075ea1 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContext.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContext.java @@ -22,6 +22,7 @@ import org.jclouds.blobstore.attr.ConsistencyModel; import org.jclouds.blobstore.internal.BlobStoreContextImpl; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.rest.RestContext; +import org.jclouds.rest.Utils; import com.google.inject.ImplementedBy; @@ -105,6 +106,13 @@ public interface BlobStoreContext { */ RestContext getProviderSpecificContext(); + Utils getUtils(); + + /** + * @see #getUtils + */ + Utils utils(); + /** * closes threads and resources related to this connection. * diff --git a/blobstore/src/main/java/org/jclouds/blobstore/internal/BlobStoreContextImpl.java b/blobstore/src/main/java/org/jclouds/blobstore/internal/BlobStoreContextImpl.java index eb4f65beab..23260d2a83 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/internal/BlobStoreContextImpl.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/internal/BlobStoreContextImpl.java @@ -31,6 +31,7 @@ import org.jclouds.blobstore.InputStreamMap; import org.jclouds.blobstore.attr.ConsistencyModel; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.rest.RestContext; +import org.jclouds.rest.Utils; /** * @author Adrian Cole @@ -43,19 +44,23 @@ public class BlobStoreContextImpl implements BlobStoreContext { private final BlobStore blobStore; private final RestContext providerSpecificContext; private final ConsistencyModel consistencyModel; + private final Utils utils; @SuppressWarnings("unchecked") @Inject - public BlobStoreContextImpl(BlobMap.Factory blobMapFactory, ConsistencyModel consistencyModel, - InputStreamMap.Factory inputStreamMapFactory, AsyncBlobStore ablobStore, - BlobStore blobStore, RestContext providerSpecificContext) { - // unravel guice and avoid passing in a million type args - this.providerSpecificContext = checkNotNull(providerSpecificContext, "providerSpecificContext"); + public BlobStoreContextImpl(BlobMap.Factory blobMapFactory, Utils utils, + ConsistencyModel consistencyModel, InputStreamMap.Factory inputStreamMapFactory, + AsyncBlobStore ablobStore, BlobStore blobStore, RestContext providerSpecificContext) { + // unravel guice and avoid passing in a million type args by not injecting generic types for + // rest context + this.providerSpecificContext = checkNotNull(providerSpecificContext, + "providerSpecificContext"); this.consistencyModel = checkNotNull(consistencyModel, "consistencyModel"); this.blobMapFactory = checkNotNull(blobMapFactory, "blobMapFactory"); this.inputStreamMapFactory = checkNotNull(inputStreamMapFactory, "inputStreamMapFactory"); this.ablobStore = checkNotNull(ablobStore, "ablobStore"); this.blobStore = checkNotNull(blobStore, "blobStore"); + this.utils = utils; } @Override @@ -103,4 +108,14 @@ public class BlobStoreContextImpl implements BlobStoreContext { public void close() { providerSpecificContext.close(); } + + @Override + public Utils getUtils() { + return utils(); + } + + @Override + public Utils utils() { + return utils; + } } diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java index d4b41a1012..52bca65ebb 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java @@ -43,5 +43,12 @@ public interface ComputeServiceContext { RestContext getProviderSpecificContext(); + Utils getUtils(); + + /** + * @see #getUtils + */ + Utils utils(); + void close(); } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/Utils.java b/compute/src/main/java/org/jclouds/compute/Utils.java new file mode 100644 index 0000000000..7477e4f167 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/Utils.java @@ -0,0 +1,35 @@ +/** + * + * Copyright (C) 2009 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ +package org.jclouds.compute; + +import org.jclouds.compute.internal.UtilsImpl; +import org.jclouds.ssh.SshClient; + +import com.google.inject.ImplementedBy; + +/** + * + * @author Adrian Cole + */ +@ImplementedBy(UtilsImpl.class) +public interface Utils extends org.jclouds.rest.Utils { + SshClient.Factory getSshClientFactory(); + + SshClient.Factory sshFactory(); +} diff --git a/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java b/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java index 9bb87b5b14..4242ba5116 100644 --- a/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java +++ b/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java @@ -28,6 +28,7 @@ import javax.inject.Singleton; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.LoadBalancerService; +import org.jclouds.compute.Utils; import org.jclouds.rest.RestContext; /** @@ -38,11 +39,13 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { private final ComputeService computeService; private final LoadBalancerService loadBalancerService; private final RestContext providerSpecificContext; + private final Utils utils; @SuppressWarnings("unchecked") @Inject - public ComputeServiceContextImpl(ComputeService computeService, + public ComputeServiceContextImpl(ComputeService computeService, Utils utils, @Nullable LoadBalancerService loadBalancerService, RestContext providerSpecificContext) { + this.utils = utils; this.providerSpecificContext = providerSpecificContext; this.computeService = checkNotNull(computeService, "computeService"); this.loadBalancerService = loadBalancerService; @@ -67,4 +70,14 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { public LoadBalancerService getLoadBalancerService() { return loadBalancerService; } + + @Override + public Utils getUtils() { + return utils(); + } + + @Override + public Utils utils() { + return utils; + } } diff --git a/compute/src/main/java/org/jclouds/compute/internal/UtilsImpl.java b/compute/src/main/java/org/jclouds/compute/internal/UtilsImpl.java new file mode 100644 index 0000000000..1621ace75d --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/internal/UtilsImpl.java @@ -0,0 +1,67 @@ +/** + * + * Copyright (C) 2009 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ +package org.jclouds.compute.internal; + +import java.util.concurrent.ExecutorService; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.Utils; +import org.jclouds.date.DateService; +import org.jclouds.encryption.EncryptionService; +import org.jclouds.logging.Logger.LoggerFactory; +import org.jclouds.rest.HttpAsyncClient; +import org.jclouds.rest.HttpClient; +import org.jclouds.ssh.SshClient; +import org.jclouds.ssh.SshClient.Factory; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class UtilsImpl extends org.jclouds.rest.internal.UtilsImpl implements Utils { + + private final Factory sshFactory; + + @Inject + UtilsImpl(HttpClient simpleClient, HttpAsyncClient simpleAsyncClient, + EncryptionService encryption, DateService date, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService userThreads, + @Named(Constants.PROPERTY_IO_WORKER_THREADS) ExecutorService ioThreads, + LoggerFactory loggerFactory, SshClient.Factory sshFactory) { + super(simpleClient, simpleAsyncClient, encryption, date, userThreads, ioThreads, + loggerFactory); + this.sshFactory = sshFactory; + } + + @Override + public Factory getSshClientFactory() { + return sshFactory; + } + + @Override + public Factory sshFactory() { + return sshFactory; + } + +} diff --git a/core/src/main/java/org/jclouds/rest/RestContext.java b/core/src/main/java/org/jclouds/rest/RestContext.java index 7cd6003dcf..be6299f31d 100755 --- a/core/src/main/java/org/jclouds/rest/RestContext.java +++ b/core/src/main/java/org/jclouds/rest/RestContext.java @@ -53,10 +53,6 @@ public interface RestContext { */ S getApi(); - HttpAsyncClient asyncHttp(); - - HttpClient http(); - URI getEndpoint(); String getIdentity(); @@ -65,6 +61,13 @@ public interface RestContext { String getApiVersion(); + Utils getUtils(); + + /** + * @see #getUtils + */ + Utils utils(); + /** * Closes all connections to Cloud Files. */ diff --git a/core/src/main/java/org/jclouds/rest/Utils.java b/core/src/main/java/org/jclouds/rest/Utils.java new file mode 100644 index 0000000000..6bd6922f19 --- /dev/null +++ b/core/src/main/java/org/jclouds/rest/Utils.java @@ -0,0 +1,87 @@ +/** + * + * Copyright (C) 2009 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ +package org.jclouds.rest; + +import java.util.concurrent.ExecutorService; + +import org.jclouds.date.DateService; +import org.jclouds.encryption.EncryptionService; +import org.jclouds.logging.Logger.LoggerFactory; +import org.jclouds.rest.internal.UtilsImpl; + +import com.google.inject.ImplementedBy; + +/** + * + * + * @author Adrian Cole + * + */ +@ImplementedBy(UtilsImpl.class) +public interface Utils { + + HttpAsyncClient getHttpAsyncClient(); + + /** + * #see #getHttpAsyncClient + */ + HttpAsyncClient asyncHttp(); + + HttpClient getHttpClient(); + + /** + * #see #getHttpClient + */ + HttpClient http(); + + EncryptionService getEncryptionService(); + + /** + * #see #getEncryptionService + */ + EncryptionService encryption(); + + DateService getDateService(); + + /** + * #see #getDateService + */ + DateService date(); + + ExecutorService getUserExecutor(); + + /** + * #see #getUserExecutor + */ + ExecutorService userExecutor(); + + ExecutorService getIoExecutor(); + + /** + * #see #getIoExecutor + */ + ExecutorService ioExecutor(); + + LoggerFactory getLoggerFactory(); + + /** + * #see #getLoggerFactory + */ + LoggerFactory loggerFactory(); +} diff --git a/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java b/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java index df6c355602..637cfa3032 100644 --- a/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java +++ b/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java @@ -26,12 +26,11 @@ import javax.inject.Inject; import org.jclouds.lifecycle.Closer; import org.jclouds.logging.Logger; -import org.jclouds.rest.HttpAsyncClient; -import org.jclouds.rest.HttpClient; import org.jclouds.rest.RestContext; import org.jclouds.rest.annotations.ApiVersion; import org.jclouds.rest.annotations.Identity; import org.jclouds.rest.annotations.Provider; +import org.jclouds.rest.Utils; import com.google.inject.Injector; import com.google.inject.Key; @@ -51,18 +50,15 @@ public class RestContextImpl implements RestContext { private final Closer closer; private final URI endpoint; private final String identity; - private final HttpClient simpleClient; - private final HttpAsyncClient simpleAsyncClient; private final String provider; private final String apiVersion; + private final Utils utils; @Inject - RestContextImpl(Closer closer, HttpClient simpleClient, HttpAsyncClient simpleAsyncClient, - Injector injector, TypeLiteral syncApi, TypeLiteral asyncApi, - @Provider URI endpoint, @Provider String provider, @Identity String identity, - @ApiVersion String apiVersion) { - this.simpleClient = simpleClient; - this.simpleAsyncClient = simpleAsyncClient; + RestContextImpl(Closer closer, Utils utils, Injector injector, TypeLiteral syncApi, + TypeLiteral asyncApi, @Provider URI endpoint, @Provider String provider, + @Identity String identity, @ApiVersion String apiVersion) { + this.utils = utils; this.asyncApi = injector.getInstance(Key.get(asyncApi)); this.syncApi = injector.getInstance(Key.get(syncApi)); this.closer = closer; @@ -107,13 +103,13 @@ public class RestContextImpl implements RestContext { } @Override - public HttpAsyncClient asyncHttp() { - return this.simpleAsyncClient; + public Utils getUtils() { + return utils(); } @Override - public HttpClient http() { - return this.simpleClient; + public Utils utils() { + return utils; } @Override diff --git a/core/src/main/java/org/jclouds/rest/internal/UtilsImpl.java b/core/src/main/java/org/jclouds/rest/internal/UtilsImpl.java new file mode 100644 index 0000000000..0dfb1b93e5 --- /dev/null +++ b/core/src/main/java/org/jclouds/rest/internal/UtilsImpl.java @@ -0,0 +1,135 @@ +/** + * + * Copyright (C) 2009 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ +package org.jclouds.rest.internal; + +import java.util.concurrent.ExecutorService; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.jclouds.Constants; +import org.jclouds.date.DateService; +import org.jclouds.encryption.EncryptionService; +import org.jclouds.logging.Logger.LoggerFactory; +import org.jclouds.rest.HttpAsyncClient; +import org.jclouds.rest.HttpClient; +import org.jclouds.rest.Utils; + +import com.google.inject.Singleton; + +/** + * @author Adrian Cole + */ +@Singleton +public class UtilsImpl implements Utils { + + private final HttpClient simpleClient; + private final HttpAsyncClient simpleAsyncClient; + private final EncryptionService encryption; + private final DateService date; + private final ExecutorService userExecutor; + private final ExecutorService ioExecutor; + private final LoggerFactory loggerFactory; + + @Inject + protected UtilsImpl(HttpClient simpleClient, HttpAsyncClient simpleAsyncClient, + EncryptionService encryption, DateService date, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService userThreads, + @Named(Constants.PROPERTY_IO_WORKER_THREADS) ExecutorService ioThreads, + LoggerFactory loggerFactory) { + this.simpleClient = simpleClient; + this.simpleAsyncClient = simpleAsyncClient; + this.encryption = encryption; + this.date = date; + this.userExecutor = userThreads; + this.ioExecutor = ioThreads; + this.loggerFactory = loggerFactory; + } + + @Override + public HttpAsyncClient asyncHttp() { + return simpleAsyncClient; + } + + @Override + public DateService date() { + return date; + } + + @Override + public EncryptionService encryption() { + return encryption; + } + + @Override + public DateService getDateService() { + return date; + } + + @Override + public EncryptionService getEncryptionService() { + return encryption; + } + + @Override + public HttpAsyncClient getHttpAsyncClient() { + return simpleAsyncClient; + } + + @Override + public HttpClient getHttpClient() { + return simpleClient; + } + + @Override + public HttpClient http() { + return simpleClient; + } + + @Override + public ExecutorService getIoExecutor() { + return ioExecutor; + } + + @Override + public ExecutorService getUserExecutor() { + return userExecutor; + } + + @Override + public ExecutorService ioExecutor() { + return ioExecutor; + } + + @Override + public ExecutorService userExecutor() { + return userExecutor; + } + + @Override + public LoggerFactory getLoggerFactory() { + return loggerFactory; + } + + @Override + public LoggerFactory loggerFactory() { + return loggerFactory; + } + +} diff --git a/core/src/test/java/org/jclouds/http/BaseHttpCommandExecutorServiceIntegrationTest.java b/core/src/test/java/org/jclouds/http/BaseHttpCommandExecutorServiceIntegrationTest.java index d2d3cb82b1..7a39d70ffc 100644 --- a/core/src/test/java/org/jclouds/http/BaseHttpCommandExecutorServiceIntegrationTest.java +++ b/core/src/test/java/org/jclouds/http/BaseHttpCommandExecutorServiceIntegrationTest.java @@ -109,7 +109,7 @@ public abstract class BaseHttpCommandExecutorServiceIntegrationTest extends public void testGetBigFile() throws MalformedURLException, ExecutionException, InterruptedException, TimeoutException { assertEquals(encryptionService.toBase64String(encryptionService - .md5(context.http().get( + .md5(context.utils().http().get( URI.create(String.format("http://localhost:%d/%s", testPort, "101constitutions"))))), md5); }