Merge pull request #1131 from jclouds/cleanup

cleaning unused or only used once code
This commit is contained in:
Adrian Cole 2013-01-01 01:20:21 -08:00
commit 4f5c93c988
73 changed files with 427 additions and 1629 deletions

View File

@ -23,10 +23,10 @@ import static com.google.common.io.ByteStreams.readBytes;
import static org.jclouds.Constants.LOGGER_SIGNATURE; import static org.jclouds.Constants.LOGGER_SIGNATURE;
import static org.jclouds.crypto.Macs.asByteProcessor; import static org.jclouds.crypto.Macs.asByteProcessor;
import static org.jclouds.util.Patterns.NEWLINE_PATTERN; import static org.jclouds.util.Patterns.NEWLINE_PATTERN;
import static org.jclouds.util.Patterns.TWO_SPACE_PATTERN;
import static org.jclouds.util.Strings2.toInputStream; import static org.jclouds.util.Strings2.toInputStream;
import java.util.Set; import java.util.Set;
import java.util.regex.Pattern;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.inject.Inject; import javax.inject.Inject;
@ -140,6 +140,8 @@ public class SignRequest implements HttpRequestFilter {
private void appendMethod(HttpRequest request, StringBuilder toSign) { private void appendMethod(HttpRequest request, StringBuilder toSign) {
toSign.append(request.getMethod()).append("\n"); toSign.append(request.getMethod()).append("\n");
} }
private static final Pattern TWO_SPACE_PATTERN = Pattern.compile(" ");
private void appendCanonicalizedHeaders(HttpRequest request, StringBuilder toSign) { private void appendCanonicalizedHeaders(HttpRequest request, StringBuilder toSign) {
// TreeSet == Sort the headers alphabetically. // TreeSet == Sort the headers alphabetically.

View File

@ -18,9 +18,8 @@
*/ */
package org.jclouds.cloudfiles.config; package org.jclouds.cloudfiles.config;
import static org.jclouds.util.Suppliers2.valueForKey;
import java.net.URI; import java.net.URI;
import java.util.Map;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -36,6 +35,7 @@ import org.jclouds.openstack.swift.Storage;
import org.jclouds.openstack.swift.config.SwiftRestClientModule; import org.jclouds.openstack.swift.config.SwiftRestClientModule;
import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.ConfiguresRestClient;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken; import com.google.common.reflect.TypeToken;
@ -77,6 +77,28 @@ public class CloudFilesRestClientModule extends SwiftRestClientModule<CloudFiles
return valueForKey(factory.createForApiTypeAndVersion("cloudFiles", null), return valueForKey(factory.createForApiTypeAndVersion("cloudFiles", null),
defaultRegion.createForApiType("cloudFiles")); defaultRegion.createForApiType("cloudFiles"));
} }
}
/**
* Supplies a value that corresponds to a particular key in a map, or null, if not found
*/
@VisibleForTesting
static <K, V> Supplier<V> valueForKey(final Supplier<Map<K, Supplier<V>>> input, final Supplier<K> key) {
return new Supplier<V>() {
@Override
public V get() {
K keyToFind = key.get();
Supplier<V> value = input.get().get(keyToFind);
return value != null ? value.get() : null;
}
@Override
public String toString() {
return "withKey()";
}
};
} }
} }

View File

@ -16,29 +16,33 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
package org.jclouds.util; package org.jclouds.cloudfiles.config;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.util.Map;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList; import com.google.common.base.Supplier;
import com.google.common.collect.Ordering; import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap;
/** public class CloudFilesRestClientModuleTest {
* @author Adrian Cole
*/
@Test(groups = "unit")
public class Lists2Test {
public void testMultiMax() { @Test
Iterable<String> values = ImmutableList.of("1", "2", "2", "3", "3"); public void testWithKey() {
assertEquals(Lists2.multiMax(Ordering.natural(), values), ImmutableList.of("3", "3")); assertEquals(
CloudFilesRestClientModule.<String, String> valueForKey(
Suppliers.<Map<String, Supplier<String>>> ofInstance(ImmutableMap.of("foo",
Suppliers.ofInstance("bar"))), Suppliers.ofInstance("foo")).get(), "bar");
} }
public void testMultiMax1() { @Test
Iterable<String> values = ImmutableList.of("1", "2", "2", "3"); public void testWithKeyUnmatchedIsNull() {
assertEquals(Lists2.multiMax(Ordering.natural(), values), ImmutableList.of("3")); assertEquals(
CloudFilesRestClientModule.<String, String> valueForKey(
Suppliers.<Map<String, Supplier<String>>> ofInstance(ImmutableMap.of("boo",
Suppliers.ofInstance("bar"))), Suppliers.ofInstance("foo")).get(), null);
} }
} }

View File

@ -20,7 +20,6 @@ package org.jclouds.cloudsigma.compute;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.filter;
import static org.jclouds.concurrent.FutureIterables.transformParallel; import static org.jclouds.concurrent.FutureIterables.transformParallel;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -43,6 +42,7 @@ import org.jclouds.cloudsigma.domain.ServerInfo;
import org.jclouds.cloudsigma.options.CloneDriveOptions; import org.jclouds.cloudsigma.options.CloneDriveOptions;
import org.jclouds.cloudsigma.reference.CloudSigmaConstants; import org.jclouds.cloudsigma.reference.CloudSigmaConstants;
import org.jclouds.cloudsigma.util.Servers; import org.jclouds.cloudsigma.util.Servers;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.HardwareBuilder;
@ -55,13 +55,13 @@ import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder; import com.google.common.collect.ImmutableSet.Builder;
@ -170,7 +170,7 @@ public class CloudSigmaComputeServiceAdapter implements
*/ */
@Override @Override
public Iterable<DriveInfo> listImages() { public Iterable<DriveInfo> listImages() {
Iterable<? extends DriveInfo> drives = transformParallel(client.listStandardDrives(), return FluentIterable.from(transformParallel(client.listStandardDrives(),
new Function<String, Future<? extends DriveInfo>>() { new Function<String, Future<? extends DriveInfo>>() {
@Override @Override
@ -189,8 +189,7 @@ public class CloudSigmaComputeServiceAdapter implements
public String toString() { public String toString() {
return "seedDriveCache()"; return "seedDriveCache()";
} }
}, executor, null, logger, "drives"); }, executor, null, logger, "drives")).filter(PREINSTALLED_DISK);
return Iterables2.concreteCopy(filter(drives, PREINSTALLED_DISK));
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@ -18,7 +18,10 @@
*/ */
package org.jclouds.cloudsigma.functions; package org.jclouds.cloudsigma.functions;
import static org.jclouds.util.Maps2.renameKey; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Predicates.equalTo;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Maps.filterKeys;
import java.util.Map; import java.util.Map;
@ -27,7 +30,10 @@ import javax.inject.Singleton;
import org.jclouds.cloudsigma.domain.DriveData; import org.jclouds.cloudsigma.domain.DriveData;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
/** /**
* *
@ -46,4 +52,32 @@ public class DriveDataToMap implements Function<DriveData, Map<String, String>>
public Map<String, String> apply(DriveData from) { public Map<String, String> apply(DriveData from) {
return renameKey(baseDriveToMap.apply(from), "use", "use"); return renameKey(baseDriveToMap.apply(from), "use", "use");
} }
/**
* If the supplied map contains the key {@code k1}, its value will be assigned to the key {@code
* k2}. Note that this doesn't modify the input map.
*
* @param <V>
* type of value the map holds
* @param in
* the map you wish to make a copy of
* @param k1
* old key
* @param k2
* new key
* @return copy of the map with the value of the key re-routed, or the original, if it {@code k1}
* wasn't present.
*/
@VisibleForTesting
static <V> Map<String, V> renameKey(Map<String, V> in, String k1, String k2) {
if (checkNotNull(in, "input map").containsKey(checkNotNull(k1, "old key"))) {
Builder<String, V> builder = ImmutableMap.builder();
builder.putAll(filterKeys(in, not(equalTo(k1))));
V tags = in.get(k1);
builder.put(checkNotNull(k2, "new key"), tags);
in = builder.build();
}
return in;
}
} }

View File

@ -21,6 +21,7 @@ package org.jclouds.cloudsigma.functions;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.io.IOException; import java.io.IOException;
import java.util.Map;
import org.jclouds.cloudsigma.domain.ClaimType; import org.jclouds.cloudsigma.domain.ClaimType;
import org.jclouds.cloudsigma.domain.DriveData; import org.jclouds.cloudsigma.domain.DriveData;
@ -36,6 +37,16 @@ import com.google.inject.Guice;
*/ */
@Test(groups = { "unit" }) @Test(groups = { "unit" })
public class DriveDataToMapTest { public class DriveDataToMapTest {
public void testRenameKeyWhenNotFound() {
Map<String, String> nothing = ImmutableMap.of();
assertEquals(DriveDataToMap.renameKey(nothing, "foo", "bar"), nothing);
}
public void testRenameKeyWhenFound() {
Map<String, String> nothing = ImmutableMap.of("foo", "bar");
assertEquals(DriveDataToMap.renameKey(nothing, "foo", "bar"), ImmutableMap.of("bar", "bar"));
}
private static final DriveDataToMap BASEDRIVE_TO_MAP = Guice.createInjector().getInstance(DriveDataToMap.class); private static final DriveDataToMap BASEDRIVE_TO_MAP = Guice.createInjector().getInstance(DriveDataToMap.class);

View File

@ -1,6 +1,5 @@
package org.jclouds.ec2.xml; package org.jclouds.ec2.xml;
import static org.jclouds.util.SaxUtils.currentOrNegative;
import static org.jclouds.util.SaxUtils.currentOrNull; import static org.jclouds.util.SaxUtils.currentOrNull;
import static org.jclouds.util.SaxUtils.equalsOrSuffix; import static org.jclouds.util.SaxUtils.equalsOrSuffix;
@ -64,6 +63,10 @@ public class IpPermissionHandler extends ParseSax.HandlerForGeneratedRequestWith
currentText = new StringBuilder(); currentText = new StringBuilder();
} }
private static String currentOrNegative(StringBuilder currentText) {
String returnVal = currentText.toString().trim();
return returnVal.equals("") ? "-1" : returnVal;
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */

View File

@ -21,7 +21,6 @@ package org.jclouds.elasticstack.compute;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Predicates.notNull; import static com.google.common.base.Predicates.notNull;
import static com.google.common.collect.Iterables.filter;
import static org.jclouds.concurrent.FutureIterables.transformParallel; import static org.jclouds.concurrent.FutureIterables.transformParallel;
import static org.jclouds.elasticstack.util.Servers.small; import static org.jclouds.elasticstack.util.Servers.small;
@ -35,6 +34,7 @@ import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.HardwareBuilder;
@ -57,12 +57,12 @@ import org.jclouds.elasticstack.domain.ServerStatus;
import org.jclouds.elasticstack.domain.WellKnownImage; import org.jclouds.elasticstack.domain.WellKnownImage;
import org.jclouds.elasticstack.reference.ElasticStackConstants; import org.jclouds.elasticstack.reference.ElasticStackConstants;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder; import com.google.common.collect.ImmutableSet.Builder;
@ -163,7 +163,7 @@ public class ElasticStackComputeServiceAdapter implements
*/ */
@Override @Override
public Iterable<DriveInfo> listImages() { public Iterable<DriveInfo> listImages() {
Iterable<? extends DriveInfo> drives = transformParallel(preinstalledImages.keySet(), return FluentIterable.from(transformParallel(preinstalledImages.keySet(),
new Function<String, Future<? extends DriveInfo>>() { new Function<String, Future<? extends DriveInfo>>() {
@Override @Override
@ -183,8 +183,7 @@ public class ElasticStackComputeServiceAdapter implements
return "seedDriveCache()"; return "seedDriveCache()";
} }
}, executor, null, logger, "drives"); }, executor, null, logger, "drives")).filter(notNull());
return Iterables2.concreteCopy(filter(drives, notNull()));
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@ -73,13 +73,13 @@ import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ZoneSecurityGroupNameAn
import org.jclouds.openstack.nova.v2_0.predicates.FindSecurityGroupWithNameAndReturnTrue; import org.jclouds.openstack.nova.v2_0.predicates.FindSecurityGroupWithNameAndReturnTrue;
import org.jclouds.predicates.PredicateWithResult; import org.jclouds.predicates.PredicateWithResult;
import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.RetryablePredicate;
import org.jclouds.util.Suppliers2;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
@ -201,7 +201,7 @@ public class NovaComputeServiceContextModule extends
@Singleton @Singleton
protected Supplier<Map<String, Location>> createLocationIndexedById( protected Supplier<Map<String, Location>> createLocationIndexedById(
@Memoized Supplier<Set<? extends Location>> locations) { @Memoized Supplier<Set<? extends Location>> locations) {
return Suppliers2.compose(new Function<Set<? extends Location>, Map<String, Location>>() { return Suppliers.compose(new Function<Set<? extends Location>, Map<String, Location>>() {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override

View File

@ -30,7 +30,6 @@ import org.jclouds.http.HttpRequest;
import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.jclouds.s3.Bucket; import org.jclouds.s3.Bucket;
import org.jclouds.s3.S3Client; import org.jclouds.s3.S3Client;
import org.jclouds.util.Patterns;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
@ -41,7 +40,9 @@ import com.google.common.base.Predicate;
*/ */
public class S3Utils { public class S3Utils {
public static final Pattern BUCKET_NAME_PATTERN = Pattern.compile("^[a-z0-9][-_.a-z0-9]+"); private static final Pattern BUCKET_NAME_PATTERN = Pattern.compile("^[a-z0-9][-_.a-z0-9]+");
private static final Pattern IP_PATTERN = Pattern.compile("b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).)"
+ "{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b");
// TODO add validatorparam so that this is actually used // TODO add validatorparam so that this is actually used
public static String validateBucketName(String bucketName) { public static String validateBucketName(String bucketName) {
@ -51,7 +52,7 @@ public class S3Utils {
"bucketName name must start with a number or letter and can only contain lowercase letters, numbers, periods (.), underscores (_), and dashes (-)"); "bucketName name must start with a number or letter and can only contain lowercase letters, numbers, periods (.), underscores (_), and dashes (-)");
checkArgument(bucketName.length() > 2 && bucketName.length() < 256, checkArgument(bucketName.length() > 2 && bucketName.length() < 256,
"bucketName name must be between 3 and 255 characters long"); "bucketName name must be between 3 and 255 characters long");
checkArgument(!Patterns.IP_PATTERN.matcher(bucketName).matches(), checkArgument(!IP_PATTERN.matcher(bucketName).matches(),
"bucketName name cannot be ip address style"); "bucketName name cannot be ip address style");
return bucketName; return bucketName;
} }

View File

@ -31,7 +31,6 @@ import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.functions.IdentityFunction; import org.jclouds.functions.IdentityFunction;
import org.jclouds.util.Suppliers2;
import org.jclouds.vcloud.compute.functions.HardwareForVApp; import org.jclouds.vcloud.compute.functions.HardwareForVApp;
import org.jclouds.vcloud.compute.functions.HardwareForVAppTemplate; import org.jclouds.vcloud.compute.functions.HardwareForVAppTemplate;
import org.jclouds.vcloud.compute.functions.ImageForVAppTemplate; import org.jclouds.vcloud.compute.functions.ImageForVAppTemplate;
@ -52,6 +51,7 @@ import org.jclouds.vcloud.functions.VAppTemplatesInOrg;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Provides; import com.google.inject.Provides;
@ -143,7 +143,7 @@ public class VCloudComputeServiceDependenciesModule extends AbstractModule {
@Singleton @Singleton
public Supplier<NetworkConfig> networkConfig(@Network Supplier<ReferenceType> network, public Supplier<NetworkConfig> networkConfig(@Network Supplier<ReferenceType> network,
final FenceMode defaultFenceMode) { final FenceMode defaultFenceMode) {
return Suppliers2.compose(new Function<ReferenceType, NetworkConfig>() { return Suppliers.compose(new Function<ReferenceType, NetworkConfig>() {
@Override @Override
public NetworkConfig apply(ReferenceType input) { public NetworkConfig apply(ReferenceType input) {

View File

@ -26,7 +26,6 @@ import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.config.ValueOfConfigurationKeyOrNull; import org.jclouds.config.ValueOfConfigurationKeyOrNull;
import org.jclouds.util.Suppliers2;
import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.ReferenceType;
import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.VCloudSession;
import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.endpoints.Org;
@ -35,6 +34,7 @@ import org.jclouds.vcloud.suppliers.OnlyReferenceTypeFirstWithNameMatchingConfig
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
/** /**
* *
@ -57,7 +57,7 @@ public class DefaultOrgForUser implements Function<String, Supplier<ReferenceTyp
@Override @Override
public Supplier<ReferenceType> apply(final String user) { public Supplier<ReferenceType> apply(final String user) {
return Suppliers2.compose(new Function<VCloudSession, ReferenceType>() { return Suppliers.compose(new Function<VCloudSession, ReferenceType>() {
@Override @Override
public ReferenceType apply(VCloudSession session) { public ReferenceType apply(VCloudSession session) {

View File

@ -73,7 +73,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultTasksList(DefaultTasksListForOrg defaultTasksListURIForOrg, protected Supplier<ReferenceType> provideDefaultTasksList(DefaultTasksListForOrg defaultTasksListURIForOrg,
@org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(defaultTasksListURIForOrg, defaultOrg); return Suppliers.compose(defaultTasksListURIForOrg, defaultOrg);
} }
@Provides @Provides
@ -81,7 +81,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultCatalog(DefaultCatalogForOrg defaultCatalogURIForOrg, protected Supplier<ReferenceType> provideDefaultCatalog(DefaultCatalogForOrg defaultCatalogURIForOrg,
@org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(defaultCatalogURIForOrg, defaultOrg); return Suppliers.compose(defaultCatalogURIForOrg, defaultOrg);
} }
@Provides @Provides
@ -147,7 +147,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultVDC(DefaultVDCForOrg defaultVDCURIForOrg, protected Supplier<ReferenceType> provideDefaultVDC(DefaultVDCForOrg defaultVDCURIForOrg,
@org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(defaultVDCURIForOrg, defaultOrg); return Suppliers.compose(defaultVDCURIForOrg, defaultOrg);
} }
@Provides @Provides
@ -162,7 +162,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultNetwork(DefaultNetworkForVDC defaultNetworkURIForVDC, protected Supplier<ReferenceType> provideDefaultNetwork(DefaultNetworkForVDC defaultNetworkURIForVDC,
@org.jclouds.vcloud.endpoints.VDC Supplier<ReferenceType> defaultVDC) { @org.jclouds.vcloud.endpoints.VDC Supplier<ReferenceType> defaultVDC) {
return Suppliers2.compose(defaultNetworkURIForVDC, defaultVDC); return Suppliers.compose(defaultNetworkURIForVDC, defaultVDC);
} }
@Provides @Provides

View File

@ -26,9 +26,9 @@ import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.getLast; import static com.google.common.collect.Iterables.getLast;
import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Maps.transformValues; import static com.google.common.collect.Maps.transformValues;
import static com.google.common.collect.Maps.uniqueIndex;
import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
import static org.jclouds.rest.config.BinderUtils.bindClientAndAsyncClient; import static org.jclouds.rest.config.BinderUtils.bindClientAndAsyncClient;
import static org.jclouds.util.Maps2.uniqueIndex;
import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_FENCEMODE; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_FENCEMODE;
import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED;
@ -58,7 +58,6 @@ import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.annotations.ApiVersion; import org.jclouds.rest.annotations.ApiVersion;
import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.config.RestClientModule;
import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
import org.jclouds.util.Suppliers2;
import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudAsyncClient;
import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.VCloudClient;
import org.jclouds.vcloud.VCloudToken; import org.jclouds.vcloud.VCloudToken;
@ -95,11 +94,11 @@ import org.jclouds.vcloud.features.VmClient;
import org.jclouds.vcloud.functions.CatalogItemsInCatalog; import org.jclouds.vcloud.functions.CatalogItemsInCatalog;
import org.jclouds.vcloud.functions.CatalogItemsInOrg; import org.jclouds.vcloud.functions.CatalogItemsInOrg;
import org.jclouds.vcloud.functions.CatalogsInOrg; import org.jclouds.vcloud.functions.CatalogsInOrg;
import org.jclouds.vcloud.functions.VDCsInOrg;
import org.jclouds.vcloud.functions.DefaultNetworkNameInTemplate; import org.jclouds.vcloud.functions.DefaultNetworkNameInTemplate;
import org.jclouds.vcloud.functions.OrgsForLocations; import org.jclouds.vcloud.functions.OrgsForLocations;
import org.jclouds.vcloud.functions.OrgsForNames; import org.jclouds.vcloud.functions.OrgsForNames;
import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems;
import org.jclouds.vcloud.functions.VDCsInOrg;
import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse; import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse;
import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; import org.jclouds.vcloud.internal.VCloudLoginAsyncClient;
import org.jclouds.vcloud.internal.VCloudLoginClient; import org.jclouds.vcloud.internal.VCloudLoginClient;
@ -114,6 +113,7 @@ import com.google.common.base.Function;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
@ -224,7 +224,7 @@ public class VCloudRestClientModule extends RestClientModule<VCloudClient, VClou
@Singleton @Singleton
@org.jclouds.vcloud.endpoints.VDC @org.jclouds.vcloud.endpoints.VDC
protected Supplier<Map<String, String>> provideVDCtoORG(Supplier<Map<String, Org>> orgNameToOrgSupplier) { protected Supplier<Map<String, String>> provideVDCtoORG(Supplier<Map<String, Org>> orgNameToOrgSupplier) {
return Suppliers2.compose(new Function<Map<String, Org>, Map<String, String>>() { return Suppliers.compose(new Function<Map<String, Org>, Map<String, String>>() {
@Override @Override
public Map<String, String> apply(Map<String, Org> arg0) { public Map<String, String> apply(Map<String, Org> arg0) {
@ -252,7 +252,7 @@ public class VCloudRestClientModule extends RestClientModule<VCloudClient, VClou
@Singleton @Singleton
@OrgList @OrgList
protected Supplier<URI> provideOrgListURI(Supplier<VCloudSession> sessionSupplier) { protected Supplier<URI> provideOrgListURI(Supplier<VCloudSession> sessionSupplier) {
return Suppliers2.compose(new Function<VCloudSession, URI>() { return Suppliers.compose(new Function<VCloudSession, URI>() {
@Override @Override
public URI apply(VCloudSession arg0) { public URI apply(VCloudSession arg0) {
@ -304,18 +304,15 @@ public class VCloudRestClientModule extends RestClientModule<VCloudClient, VClou
@Override @Override
public Map<String, Map<String, Catalog>> get() { public Map<String, Map<String, Catalog>> get() {
return transformValues( return transformValues(transformValues(orgSupplier.get(), allCatalogsInOrg),
transformValues(orgSupplier.get(), allCatalogsInOrg), new Function<Iterable<? extends Catalog>, Map<String, Catalog>>() {
new Function<Iterable<? extends Catalog>,
Map<String, Catalog>>() {
@Override @Override
public Map<String, Catalog> apply( public Map<String, Catalog> apply(Iterable<? extends Catalog> from) {
Iterable<? extends Catalog> from) { return ImmutableMap.copyOf(uniqueIndex(from, name));
return uniqueIndex(from, name); }
}
}); });
} }
} }
@ -323,7 +320,7 @@ public class VCloudRestClientModule extends RestClientModule<VCloudClient, VClou
@Provides @Provides
@Singleton @Singleton
Supplier<String> provideVCloudToken(Supplier<VCloudSession> cache) { Supplier<String> provideVCloudToken(Supplier<VCloudSession> cache) {
return Suppliers2.compose(new Function<VCloudSession, String>() { return Suppliers.compose(new Function<VCloudSession, String>() {
@Override @Override
public String apply(VCloudSession input) { public String apply(VCloudSession input) {
@ -432,7 +429,7 @@ public class VCloudRestClientModule extends RestClientModule<VCloudClient, VClou
@Singleton @Singleton
protected Supplier<Org> provideOrg(final Supplier<Map<String, Org>> orgSupplier, protected Supplier<Org> provideOrg(final Supplier<Map<String, Org>> orgSupplier,
@org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(new Function<ReferenceType, Org>() { return Suppliers.compose(new Function<ReferenceType, Org>() {
@Override @Override
public Org apply(ReferenceType input) { public Org apply(ReferenceType input) {

View File

@ -31,7 +31,6 @@ import javax.inject.Singleton;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudAsyncClient;
import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.VCloudMediaType;
import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.Catalog;
@ -60,23 +59,17 @@ public class CatalogItemsInCatalog implements Function<Catalog, Iterable<Catalog
@Override @Override
public Iterable<CatalogItem> apply(Catalog from) { public Iterable<CatalogItem> apply(Catalog from) {
return transformParallel(filter(from.values(), new Predicate<ReferenceType>() {
Iterable<? extends CatalogItem> catalogItems = transformParallel(filter(from.values(), new Predicate<ReferenceType>() {
@Override @Override
public boolean apply(ReferenceType input) { public boolean apply(ReferenceType input) {
return input.getType().equals(VCloudMediaType.CATALOGITEM_XML); return input.getType().equals(VCloudMediaType.CATALOGITEM_XML);
} }
}), new Function<ReferenceType, Future<? extends CatalogItem>>() { }), new Function<ReferenceType, Future<? extends CatalogItem>>() {
@Override @Override
public Future<CatalogItem> apply(ReferenceType from) { public Future<CatalogItem> apply(ReferenceType from) {
return aclient.getCatalogClient().getCatalogItem(from.getHref()); return aclient.getCatalogClient().getCatalogItem(from.getHref());
} }
}, executor, null, logger, "catalogItems in " + from.getHref()); }, executor, null, logger, "catalogItems in " + from.getHref());
return Iterables2.concreteCopy(catalogItems);
} }
} }

View File

@ -30,7 +30,6 @@ import javax.inject.Singleton;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudAsyncClient;
import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.Catalog;
import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Org;
@ -57,14 +56,11 @@ public class CatalogsInOrg implements Function<Org, Iterable<Catalog>> {
@Override @Override
public Iterable<Catalog> apply(final Org org) { public Iterable<Catalog> apply(final Org org) {
Iterable<? extends Catalog> catalogs = transformParallel(org.getCatalogs().values(), return transformParallel(org.getCatalogs().values(), new Function<ReferenceType, Future<? extends Catalog>>() {
new Function<ReferenceType, Future<? extends Catalog>>() { @Override
@Override public Future<Catalog> apply(ReferenceType from) {
public Future<Catalog> apply(ReferenceType from) { return aclient.getCatalogClient().getCatalog(from.getHref());
return aclient.getCatalogClient().getCatalog(from.getHref()); }
} }, executor, null, logger, "catalogs in " + org.getName());
}, executor, null, logger, "catalogs in " + org.getName());
return Iterables2.concreteCopy(catalogs);
} }
} }

View File

@ -30,7 +30,6 @@ import javax.inject.Singleton;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudAsyncClient;
import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Org;
import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.ReferenceType;
@ -57,16 +56,12 @@ public class NetworksInOrg implements Function<Org, Iterable<OrgNetwork>> {
@Override @Override
public Iterable<OrgNetwork> apply(final Org org) { public Iterable<OrgNetwork> apply(final Org org) {
return transformParallel(org.getNetworks().values(), new Function<ReferenceType, Future<? extends OrgNetwork>>() {
Iterable<OrgNetwork> networkItems = transformParallel(org.getNetworks().values(), @Override
new Function<ReferenceType, Future<? extends OrgNetwork>>() { public Future<? extends OrgNetwork> apply(ReferenceType from) {
@Override return aclient.getNetworkClient().getNetwork(from.getHref());
public Future<? extends OrgNetwork> apply(ReferenceType from) { }
return aclient.getNetworkClient().getNetwork(from.getHref()); }, executor, null, logger, "OrgNetworks in org " + org.getName());
}
}, executor, null, logger, "OrgNetworks in org " + org.getName());
return Iterables2.concreteCopy(networkItems);
} }
} }

View File

@ -18,8 +18,6 @@
*/ */
package org.jclouds.vcloud.functions; package org.jclouds.vcloud.functions;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
import static org.jclouds.concurrent.FutureIterables.transformParallel; import static org.jclouds.concurrent.FutureIterables.transformParallel;
import java.net.URI; import java.net.URI;
@ -35,13 +33,12 @@ import org.jclouds.Constants;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudAsyncClient;
import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Org;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Sets; import com.google.common.collect.FluentIterable;
/** /**
* @author Adrian Cole * @author Adrian Cole
@ -65,29 +62,23 @@ public class OrgsForLocations implements Function<Iterable<Location>, Iterable<O
*/ */
@Override @Override
public Iterable<Org> apply(Iterable<Location> from) { public Iterable<Org> apply(Iterable<Location> from) {
FluentIterable<URI> uris = FluentIterable.from(from).filter(new Predicate<Location>() {
return Iterables2.concreteCopy(transformParallel(Sets.newLinkedHashSet(transform(filter(from, new Predicate<Location>() {
@Override @Override
public boolean apply(Location input) { public boolean apply(Location input) {
return input.getScope() == LocationScope.ZONE; return input.getScope() == LocationScope.ZONE;
} }
}).transform(new Function<Location, URI>() {
}), new Function<Location, URI>() {
@Override @Override
public URI apply(Location from) { public URI apply(Location from) {
return URI.create(from.getParent().getId()); return URI.create(from.getParent().getId());
} }
});
})), new Function<URI, Future<? extends Org>>() { return transformParallel(uris, new Function<URI, Future<? extends Org>>() {
@Override @Override
public Future<Org> apply(URI from) { public Future<Org> apply(URI from) {
return aclient.getOrgClient().getOrg(from); return aclient.getOrgClient().getOrg(from);
} }
}, executor, null, logger, "organizations for uris");
}, executor, null, logger, "organizations for uris"));
} }
} }

View File

@ -30,7 +30,6 @@ import javax.inject.Singleton;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudAsyncClient;
import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Org;

View File

@ -25,7 +25,6 @@ import static com.google.common.collect.Iterables.filter;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.util.Iterables2;
import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.CatalogItem;
import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Org;
import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.Status;
@ -54,17 +53,14 @@ public class VAppTemplatesInOrg implements Function<Org, Iterable<VAppTemplate>>
@Override @Override
public Iterable<VAppTemplate> apply(Org from) { public Iterable<VAppTemplate> apply(Org from) {
Iterable<CatalogItem> catalogs = allCatalogItemsInOrg.apply(from); Iterable<CatalogItem> catalogs = allCatalogItemsInOrg.apply(from);
Iterable<VAppTemplate> vAppTemplates = Iterables2.concreteCopy(vAppTemplatesForCatalogItems.apply(catalogs)); Iterable<VAppTemplate> vAppTemplates = vAppTemplatesForCatalogItems.apply(catalogs);
return filter(vAppTemplates, and(notNull(), new Predicate<VAppTemplate>(){ return filter(vAppTemplates, and(notNull(), new Predicate<VAppTemplate>(){
//TODO: test this
@Override @Override
public boolean apply(VAppTemplate input) { public boolean apply(VAppTemplate input) {
if (input == null) if (input == null)
return false; return false;
return ImmutableSet.of(Status.RESOLVED, Status.OFF).contains(input.getStatus()); return ImmutableSet.of(Status.RESOLVED, Status.OFF).contains(input.getStatus());
} }
})); }));
} }

View File

@ -30,7 +30,6 @@ import javax.inject.Singleton;
import org.jclouds.Constants; import org.jclouds.Constants;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Iterables2;
import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudAsyncClient;
import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Org;
import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.ReferenceType;
@ -57,16 +56,13 @@ public class VDCsInOrg implements Function<Org, Iterable<VDC>> {
@Override @Override
public Iterable<VDC> apply(final Org org) { public Iterable<VDC> apply(final Org org) {
return transformParallel(org.getVDCs().values(), new Function<ReferenceType, Future<? extends VDC>>() {
@Override
public Future<? extends VDC> apply(ReferenceType from) {
return aclient.getVDCClient().getVDC(from.getHref());
}
Iterable<VDC> catalogItems = transformParallel(org.getVDCs().values(), }, executor, null, logger, "vdcs in org " + org.getName());
new Function<ReferenceType, Future<? extends VDC>>() {
@Override
public Future<? extends VDC> apply(ReferenceType from) {
return aclient.getVDCClient().getVDC(from.getHref());
}
}, executor, null, logger, "vdcs in org " + org.getName());
return Iterables2.concreteCopy(catalogItems);
} }
} }

View File

@ -20,29 +20,19 @@ package org.jclouds.blobstore.util;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.jclouds.blobstore.AsyncBlobStore; import org.jclouds.blobstore.AsyncBlobStore;
import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.KeyNotFoundException;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.blobstore.domain.MutableBlobMetadata; import org.jclouds.blobstore.domain.MutableBlobMetadata;
import org.jclouds.blobstore.domain.StorageMetadata;
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl; import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
import org.jclouds.blobstore.functions.BlobName; import org.jclouds.blobstore.functions.BlobName;
import org.jclouds.functions.ExceptionToValueOrPropagate;
import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter; import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.HttpUtils;
import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.jclouds.util.Strings2;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.reflect.TypeToken; import com.google.common.reflect.TypeToken;
@ -62,50 +52,6 @@ public class BlobStoreUtils {
.headers(returnVal.getHeaders()).payload(returnVal.getPayload()).build(); .headers(returnVal.getHeaders()).payload(returnVal.getPayload()).build();
} }
public static final ExceptionToValueOrPropagate<KeyNotFoundException, ?> keyNotFoundToNullOrPropagate = new ExceptionToValueOrPropagate<KeyNotFoundException, Object>(
KeyNotFoundException.class, null);
public static final ExceptionToValueOrPropagate<ContainerNotFoundException, ?> containerNotFoundToNullOrPropagate = new ExceptionToValueOrPropagate<ContainerNotFoundException, Object>(
ContainerNotFoundException.class, null);
@SuppressWarnings("unchecked")
public static <T> T keyNotFoundToNullOrPropagate(Exception e) {
return (T) keyNotFoundToNullOrPropagate.apply(e);
}
@SuppressWarnings("unchecked")
public static <T> T containerNotFoundToNullOrPropagate(Exception e) {
return (T) containerNotFoundToNullOrPropagate.apply(e);
}
public static Blob newBlob(BlobStore blobStore, StorageMetadata blobMeta) {
Blob blob = checkNotNull(blobStore, "blobStore").blobBuilder(checkNotNull(blobMeta, "blobMeta").getName())
.userMetadata(blobMeta.getUserMetadata()).build();
if (blobMeta instanceof BlobMetadata) {
HttpUtils.copy(((BlobMetadata) blobMeta).getContentMetadata(), blob.getMetadata().getContentMetadata());
}
blob.getMetadata().setETag(blobMeta.getETag());
blob.getMetadata().setId(blobMeta.getProviderId());
blob.getMetadata().setLastModified(blobMeta.getLastModified());
blob.getMetadata().setLocation(blobMeta.getLocation());
blob.getMetadata().setUri(blobMeta.getUri());
return blob;
}
public static String parseContainerFromPath(String path) {
String container = checkNotNull(path, "path");
if (path.indexOf('/') != -1)
container = path.substring(0, path.indexOf('/'));
return container;
}
public static String parsePrefixFromPath(String path) {
String prefix = null;
if (checkNotNull(path, "path").indexOf('/') != -1)
prefix = path.substring(path.indexOf('/') + 1);
return "".equals(prefix) ? null : prefix;
}
public static String parseDirectoryFromPath(String path) { public static String parseDirectoryFromPath(String path) {
return checkNotNull(path, "path").substring(0, path.lastIndexOf('/')); return checkNotNull(path, "path").substring(0, path.lastIndexOf('/'));
} }
@ -131,19 +77,6 @@ public class BlobStoreUtils {
return objectKey; return objectKey;
} }
public static String getContentAsStringOrNullAndClose(Blob blob) throws IOException {
checkNotNull(blob, "blob");
checkNotNull(blob.getPayload(), "blob.payload");
if (blob.getPayload().getInput() == null)
return null;
Object o = blob.getPayload().getInput();
if (o instanceof InputStream) {
return Strings2.toStringAndClose((InputStream) o);
} else {
throw new IllegalArgumentException("Object type not supported: " + o.getClass().getName());
}
}
private static final BlobName blobName = new BlobName(); private static final BlobName blobName = new BlobName();
public static ListenableFuture<Void> createParentIfNeededAsync(AsyncBlobStore asyncBlobStore, String container, public static ListenableFuture<Void> createParentIfNeededAsync(AsyncBlobStore asyncBlobStore, String container,

View File

@ -25,7 +25,6 @@ import static org.jclouds.blobstore.options.GetOptions.Builder.ifETagMatches;
import static org.jclouds.blobstore.options.GetOptions.Builder.ifModifiedSince; import static org.jclouds.blobstore.options.GetOptions.Builder.ifModifiedSince;
import static org.jclouds.blobstore.options.GetOptions.Builder.ifUnmodifiedSince; import static org.jclouds.blobstore.options.GetOptions.Builder.ifUnmodifiedSince;
import static org.jclouds.blobstore.options.GetOptions.Builder.range; import static org.jclouds.blobstore.options.GetOptions.Builder.range;
import static org.jclouds.blobstore.util.BlobStoreUtils.getContentAsStringOrNullAndClose;
import static org.jclouds.concurrent.FutureIterables.awaitCompletion; import static org.jclouds.concurrent.FutureIterables.awaitCompletion;
import static org.jclouds.io.ByteSources.asByteSource; import static org.jclouds.io.ByteSources.asByteSource;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;

View File

@ -21,7 +21,6 @@ package org.jclouds.blobstore.integration.internal;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.inDirectory; import static org.jclouds.blobstore.options.ListContainerOptions.Builder.inDirectory;
import static org.jclouds.blobstore.options.ListContainerOptions.Builder.maxResults; import static org.jclouds.blobstore.options.ListContainerOptions.Builder.maxResults;
import static org.jclouds.blobstore.util.BlobStoreUtils.getContentAsStringOrNullAndClose;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.io.IOException; import java.io.IOException;

View File

@ -18,11 +18,12 @@
*/ */
package org.jclouds.blobstore.integration.internal; package org.jclouds.blobstore.integration.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Throwables.propagateIfPossible; import static com.google.common.base.Throwables.propagateIfPossible;
import static org.jclouds.blobstore.util.BlobStoreUtils.getContentAsStringOrNullAndClose;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
@ -48,6 +49,7 @@ import org.jclouds.blobstore.domain.StorageType;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import org.jclouds.util.Strings2;
import org.testng.ITestContext; import org.testng.ITestContext;
import org.testng.annotations.AfterClass; import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeClass;
@ -64,6 +66,7 @@ import com.google.common.reflect.TypeToken;
import com.google.inject.Module; import com.google.inject.Module;
public class BaseBlobStoreIntegrationTest extends BaseViewLiveTest<BlobStoreContext> { public class BaseBlobStoreIntegrationTest extends BaseViewLiveTest<BlobStoreContext> {
protected static final String LOCAL_ENCODING = System.getProperty("file.encoding"); 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 XML_STRING_FORMAT = "<apples><apple name=\"%s\"></apple> </apples>";
protected static final String TEST_STRING = String.format(XML_STRING_FORMAT, "apple"); protected static final String TEST_STRING = String.format(XML_STRING_FORMAT, "apple");
@ -501,6 +504,18 @@ public class BaseBlobStoreIntegrationTest extends BaseViewLiveTest<BlobStoreCont
return newScratchContainer; return newScratchContainer;
} }
public static String getContentAsStringOrNullAndClose(Blob blob) throws IOException {
checkNotNull(blob, "blob");
checkNotNull(blob.getPayload(), "blob.payload");
if (blob.getPayload().getInput() == null)
return null;
Object o = blob.getPayload().getInput();
if (o instanceof InputStream) {
return Strings2.toStringAndClose((InputStream) o);
} else {
throw new IllegalArgumentException("Object type not supported: " + o.getClass().getName());
}
}
protected Module createHttpModule() { protected Module createHttpModule() {
return new JavaUrlHttpCommandExecutorServiceModule(); return new JavaUrlHttpCommandExecutorServiceModule();
} }

View File

@ -24,8 +24,6 @@ import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify; import static org.easymock.EasyMock.verify;
import static org.jclouds.blobstore.util.BlobStoreUtils.createParentIfNeededAsync; import static org.jclouds.blobstore.util.BlobStoreUtils.createParentIfNeededAsync;
import static org.jclouds.blobstore.util.BlobStoreUtils.getNameFor; import static org.jclouds.blobstore.util.BlobStoreUtils.getNameFor;
import static org.jclouds.blobstore.util.BlobStoreUtils.parseContainerFromPath;
import static org.jclouds.blobstore.util.BlobStoreUtils.parsePrefixFromPath;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.net.URI; import java.net.URI;
@ -149,22 +147,4 @@ public class BlobStoreUtilsTest {
assertEquals(getNameFor(request), "four"); assertEquals(getNameFor(request), "four");
} }
public void testGetContainer() {
String container = parseContainerFromPath("foo");
assertEquals(container, "foo");
container = parseContainerFromPath("foo/");
assertEquals(container, "foo");
container = parseContainerFromPath("foo/bar");
assertEquals(container, "foo");
}
public void testGetPrefix() {
String prefix = parsePrefixFromPath("foo");
assertEquals(prefix, null);
prefix = parsePrefixFromPath("foo/");
assertEquals(prefix, null);
prefix = parsePrefixFromPath("foo/bar");
assertEquals(prefix, "bar");
}
} }

View File

@ -25,11 +25,10 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.jclouds.util.Multimaps2;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
/** /**
@ -91,10 +90,36 @@ public class Auth implements Comparable<Auth> {
public Auth(Token token, Multimap<String, Endpoint> serviceCatalog) { public Auth(Token token, Multimap<String, Endpoint> serviceCatalog) {
this.token = checkNotNull(token, "token"); this.token = checkNotNull(token, "token");
this.serviceCatalog = Multimaps2.toOldSchool(ImmutableMultimap.copyOf(checkNotNull(serviceCatalog, this.serviceCatalog = toOldSchool(ImmutableMultimap.copyOf(checkNotNull(serviceCatalog, "serviceCatalog")));
"serviceCatalog")));
} }
/**
* The traditional way to represent a graph in Java is Map<V, Set<V>>, which is awkward in a number of ways. Guava's
* Multimap framework makes it easy to handle a mapping from keys to multiple values.
* <p/>
* Until we write or discover a gson Multimap deserializer, we may be stuck with this.
*
* TODO: ask on stackoverflow and/or jesse wilson
*/
@Deprecated
private static <K, V> Map<K, Set<V>> toOldSchool(Multimap<K, V> in) {
ImmutableMap.Builder<K, Set<V>> out = ImmutableMap.builder();
for (K type : in.keySet())
out.put(type, ImmutableSet.copyOf(in.get(type)));
return out.build();
}
/**
* @see #toOldSchool
*/
@Deprecated
private static <K, V> ImmutableMultimap<K, V> fromOldSchool(Map<K, Set<V>> in) {
ImmutableMultimap.Builder<K, V> out = ImmutableMultimap.builder();
for (K type : in.keySet())
out.putAll(type, ImmutableSet.copyOf(in.get(type)));
return out.build();
}
/** /**
* TODO * TODO
*/ */
@ -106,7 +131,7 @@ public class Auth implements Comparable<Auth> {
* TODO * TODO
*/ */
public Multimap<String, Endpoint> getServiceCatalog() { public Multimap<String, Endpoint> getServiceCatalog() {
return Multimaps2.fromOldSchool(serviceCatalog); return fromOldSchool(serviceCatalog);
} }
@Override @Override

View File

@ -30,11 +30,11 @@ import org.jclouds.trmk.vcloud_0_8.domain.ReferenceType;
import org.jclouds.trmk.vcloud_0_8.domain.VCloudSession; import org.jclouds.trmk.vcloud_0_8.domain.VCloudSession;
import org.jclouds.trmk.vcloud_0_8.endpoints.Org; import org.jclouds.trmk.vcloud_0_8.endpoints.Org;
import org.jclouds.trmk.vcloud_0_8.suppliers.OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault; import org.jclouds.trmk.vcloud_0_8.suppliers.OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault;
import org.jclouds.util.Suppliers2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
/** /**
* *
@ -57,7 +57,7 @@ public class DefaultOrgForUser implements Function<String, Supplier<ReferenceTyp
@Override @Override
public Supplier<ReferenceType> apply(final String user) { public Supplier<ReferenceType> apply(final String user) {
return Suppliers2.compose(new Function<VCloudSession, ReferenceType>() { return Suppliers.compose(new Function<VCloudSession, ReferenceType>() {
@Override @Override
public ReferenceType apply(VCloudSession session) { public ReferenceType apply(VCloudSession session) {

View File

@ -70,7 +70,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultTasksList(DefaultTasksListForOrg defaultTasksListURIForOrg, protected Supplier<ReferenceType> provideDefaultTasksList(DefaultTasksListForOrg defaultTasksListURIForOrg,
@org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(defaultTasksListURIForOrg, defaultOrg); return Suppliers.compose(defaultTasksListURIForOrg, defaultOrg);
} }
@Provides @Provides
@ -85,7 +85,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultCatalog(DefaultCatalogForOrg defaultCatalogURIForOrg, protected Supplier<ReferenceType> provideDefaultCatalog(DefaultCatalogForOrg defaultCatalogURIForOrg,
@org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(defaultCatalogURIForOrg, defaultOrg); return Suppliers.compose(defaultCatalogURIForOrg, defaultOrg);
} }
@Provides @Provides
@ -122,7 +122,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultVDC(DefaultVDCForOrg defaultVDCURIForOrg, protected Supplier<ReferenceType> provideDefaultVDC(DefaultVDCForOrg defaultVDCURIForOrg,
@org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(defaultVDCURIForOrg, defaultOrg); return Suppliers.compose(defaultVDCURIForOrg, defaultOrg);
} }
@Provides @Provides
@ -137,7 +137,7 @@ public class DefaultVCloudReferencesModule extends AbstractModule {
@Singleton @Singleton
protected Supplier<ReferenceType> provideDefaultNetwork(DefaultNetworkForVDC defaultNetworkURIForVDC, protected Supplier<ReferenceType> provideDefaultNetwork(DefaultNetworkForVDC defaultNetworkURIForVDC,
@org.jclouds.trmk.vcloud_0_8.endpoints.VDC Supplier<ReferenceType> defaultVDC) { @org.jclouds.trmk.vcloud_0_8.endpoints.VDC Supplier<ReferenceType> defaultVDC) {
return Suppliers2.compose(defaultNetworkURIForVDC, defaultVDC); return Suppliers.compose(defaultNetworkURIForVDC, defaultVDC);
} }
@Provides @Provides

View File

@ -82,12 +82,12 @@ import org.jclouds.trmk.vcloud_0_8.location.DefaultVDC;
import org.jclouds.trmk.vcloud_0_8.location.OrgAndVDCToLocationSupplier; import org.jclouds.trmk.vcloud_0_8.location.OrgAndVDCToLocationSupplier;
import org.jclouds.trmk.vcloud_0_8.predicates.TaskSuccess; import org.jclouds.trmk.vcloud_0_8.predicates.TaskSuccess;
import org.jclouds.util.Strings2; import org.jclouds.util.Strings2;
import org.jclouds.util.Suppliers2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
@ -143,7 +143,7 @@ public class TerremarkVCloudRestClientModule<S, A> extends RestClientModule<S, A
@org.jclouds.trmk.vcloud_0_8.endpoints.VDC @org.jclouds.trmk.vcloud_0_8.endpoints.VDC
protected Supplier<Map<String, String>> provideVDCtoORG( protected Supplier<Map<String, String>> provideVDCtoORG(
Supplier<Map<String, ? extends org.jclouds.trmk.vcloud_0_8.domain.Org>> orgNameToOrgSupplier) { Supplier<Map<String, ? extends org.jclouds.trmk.vcloud_0_8.domain.Org>> orgNameToOrgSupplier) {
return Suppliers2.compose( return Suppliers.compose(
new Function<Map<String, ? extends org.jclouds.trmk.vcloud_0_8.domain.Org>, Map<String, String>>() { new Function<Map<String, ? extends org.jclouds.trmk.vcloud_0_8.domain.Org>, Map<String, String>>() {
@Override @Override
@ -173,7 +173,7 @@ public class TerremarkVCloudRestClientModule<S, A> extends RestClientModule<S, A
@Singleton @Singleton
@OrgList @OrgList
protected Supplier<URI> provideOrgListURI(Supplier<VCloudSession> sessionSupplier) { protected Supplier<URI> provideOrgListURI(Supplier<VCloudSession> sessionSupplier) {
return Suppliers2.compose(new Function<VCloudSession, URI>() { return Suppliers.compose(new Function<VCloudSession, URI>() {
@Override @Override
public URI apply(VCloudSession arg0) { public URI apply(VCloudSession arg0) {
@ -352,7 +352,7 @@ public class TerremarkVCloudRestClientModule<S, A> extends RestClientModule<S, A
protected Supplier<org.jclouds.trmk.vcloud_0_8.domain.Org> provideOrg( protected Supplier<org.jclouds.trmk.vcloud_0_8.domain.Org> provideOrg(
final Supplier<Map<String, ? extends org.jclouds.trmk.vcloud_0_8.domain.Org>> orgSupplier, final Supplier<Map<String, ? extends org.jclouds.trmk.vcloud_0_8.domain.Org>> orgSupplier,
@org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) { @org.jclouds.trmk.vcloud_0_8.endpoints.Org Supplier<ReferenceType> defaultOrg) {
return Suppliers2.compose(new Function<ReferenceType, org.jclouds.trmk.vcloud_0_8.domain.Org>() { return Suppliers.compose(new Function<ReferenceType, org.jclouds.trmk.vcloud_0_8.domain.Org>() {
@Override @Override
public org.jclouds.trmk.vcloud_0_8.domain.Org apply(ReferenceType input) { public org.jclouds.trmk.vcloud_0_8.domain.Org apply(ReferenceType input) {

View File

@ -62,11 +62,11 @@ import org.jclouds.rest.AuthorizationException;
import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshClient;
import org.jclouds.util.Suppliers2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
@ -213,7 +213,7 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule {
@Provides @Provides
@Singleton @Singleton
protected Supplier<Map<String, ? extends Image>> provideImageMap(@Memoized Supplier<Set<? extends Image>> images) { protected Supplier<Map<String, ? extends Image>> provideImageMap(@Memoized Supplier<Set<? extends Image>> images) {
return Suppliers2.compose(new Function<Set<? extends Image>, Map<String, ? extends Image>>() { return Suppliers.compose(new Function<Set<? extends Image>, Map<String, ? extends Image>>() {
@Override @Override
public Map<String, ? extends Image> apply(Set<? extends Image> from) { public Map<String, ? extends Image> apply(Set<? extends Image> from) {
@ -263,7 +263,7 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule {
@Provides @Provides
@Singleton @Singleton
protected Supplier<Map<String, ? extends Hardware>> provideSizeMap(@Memoized Supplier<Set<? extends Hardware>> sizes) { protected Supplier<Map<String, ? extends Hardware>> provideSizeMap(@Memoized Supplier<Set<? extends Hardware>> sizes) {
return Suppliers2.compose(new Function<Set<? extends Hardware>, Map<String, ? extends Hardware>>() { return Suppliers.compose(new Function<Set<? extends Hardware>, Map<String, ? extends Hardware>>() {
@Override @Override
public Map<String, ? extends Hardware> apply(Set<? extends Hardware> from) { public Map<String, ? extends Hardware> apply(Set<? extends Hardware> from) {

View File

@ -32,6 +32,8 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
import static org.jclouds.compute.util.ComputeServiceUtils.getCoresAndSpeed; import static org.jclouds.compute.util.ComputeServiceUtils.getCoresAndSpeed;
import static org.jclouds.compute.util.ComputeServiceUtils.getSpace; import static org.jclouds.compute.util.ComputeServiceUtils.getSpace;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Set; import java.util.Set;
@ -55,7 +57,6 @@ import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Lists2;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function; import com.google.common.base.Function;
@ -800,7 +801,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
Iterable<? extends Image> matchingImages = filter(supportedImages, imagePredicate); Iterable<? extends Image> matchingImages = filter(supportedImages, imagePredicate);
if (logger.isTraceEnabled()) if (logger.isTraceEnabled())
logger.trace("<< matched images(%s)", transform(matchingImages, imageToId)); logger.trace("<< matched images(%s)", transform(matchingImages, imageToId));
List<? extends Image> maxImages = Lists2.multiMax(DEFAULT_IMAGE_ORDERING, matchingImages); List<? extends Image> maxImages = multiMax(DEFAULT_IMAGE_ORDERING, matchingImages);
if (logger.isTraceEnabled()) if (logger.isTraceEnabled())
logger.trace("<< best images(%s)", transform(maxImages, imageToId)); logger.trace("<< best images(%s)", transform(maxImages, imageToId));
return maxImages.get(maxImages.size() - 1); return maxImages.get(maxImages.size() - 1);
@ -811,7 +812,28 @@ public class TemplateBuilderImpl implements TemplateBuilder {
return null; return null;
} }
} }
/**
* Like Ordering, but handle the case where there are multiple valid maximums
*/
@SuppressWarnings("unchecked")
@VisibleForTesting
static <T, E extends T> List<E> multiMax(Comparator<T> ordering, Iterable<E> iterable) {
Iterator<E> iterator = iterable.iterator();
List<E> maxes = newArrayList(iterator.next());
E maxSoFar = maxes.get(0);
while (iterator.hasNext()) {
E current = iterator.next();
int comparison = ordering.compare(maxSoFar, current);
if (comparison == 0) {
maxes.add(current);
} else if (comparison < 0) {
maxes = newArrayList(current);
maxSoFar = current;
}
}
return maxes;
}
protected Set<? extends Image> getImages() { protected Set<? extends Image> getImages() {
return images.get(); return images.get();
} }

View File

@ -33,6 +33,7 @@ import javax.inject.Provider;
import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.HardwareBuilder;
import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.Image.Status;
import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.OsFamily;
@ -40,7 +41,6 @@ import org.jclouds.compute.domain.Processor;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.Image.Status;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.compute.predicates.ImagePredicates;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
@ -52,6 +52,7 @@ import com.google.common.base.Supplier;
import com.google.common.base.Suppliers; import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Ordering;
/** /**
* *
@ -59,6 +60,17 @@ import com.google.common.collect.ImmutableSet;
*/ */
@Test(groups = "unit", singleThreaded = true, testName = "TemplateBuilderImplTest") @Test(groups = "unit", singleThreaded = true, testName = "TemplateBuilderImplTest")
public class TemplateBuilderImplTest { public class TemplateBuilderImplTest {
public void testMultiMax() {
Iterable<String> values = ImmutableList.of("1", "2", "2", "3", "3");
assertEquals(TemplateBuilderImpl.multiMax(Ordering.natural(), values), ImmutableList.of("3", "3"));
}
public void testMultiMax1() {
Iterable<String> values = ImmutableList.of("1", "2", "2", "3");
assertEquals(TemplateBuilderImpl.multiMax(Ordering.natural(), values), ImmutableList.of("3"));
}
protected Location provider = new LocationBuilder().scope(LocationScope.PROVIDER).id("aws-ec2").description("aws-ec2").build(); protected Location provider = new LocationBuilder().scope(LocationScope.PROVIDER).id("aws-ec2").description("aws-ec2").build();
protected Location region = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1") protected Location region = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1")

View File

@ -25,12 +25,13 @@ import static com.google.common.primitives.Ints.asList;
import static com.google.common.util.concurrent.Futures.immediateFuture; import static com.google.common.util.concurrent.Futures.immediateFuture;
import static org.jclouds.http.HttpUtils.contains404; import static org.jclouds.http.HttpUtils.contains404;
import static org.jclouds.http.HttpUtils.returnValueOnCodeOrNull; import static org.jclouds.http.HttpUtils.returnValueOnCodeOrNull;
import static org.jclouds.util.Throwables2.containsResourceNotFoundException; import static org.jclouds.util.Throwables2.getFirstThrowableOfType;
import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.IterableWithMarker;
import org.jclouds.collect.IterableWithMarkers; import org.jclouds.collect.IterableWithMarkers;
import org.jclouds.collect.PagedIterable; import org.jclouds.collect.PagedIterable;
import org.jclouds.collect.PagedIterables; import org.jclouds.collect.PagedIterables;
import org.jclouds.rest.ResourceNotFoundException;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.collect.FluentIterable; import com.google.common.collect.FluentIterable;
@ -157,4 +158,8 @@ public final class Fallbacks {
throw propagate(t); throw propagate(t);
} }
private static boolean containsResourceNotFoundException(Throwable from) {
return getFirstThrowableOfType(from, ResourceNotFoundException.class) != null;
}
} }

View File

@ -20,7 +20,7 @@ package org.jclouds.domain;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.util.Patterns; import java.util.regex.Pattern;
/** /**
* *
@ -30,7 +30,11 @@ import org.jclouds.util.Patterns;
* @see <a href="http://code.google.com/p/google-gson/issues/detail?id=326"/> * @see <a href="http://code.google.com/p/google-gson/issues/detail?id=326"/>
*/ */
public class JsonBall implements Comparable<String>, CharSequence { public class JsonBall implements Comparable<String>, CharSequence {
public static final Pattern JSON_STRING_PATTERN = Pattern.compile("^[^\"\\{\\[].*[^\\{\\[\"]$");
public static final Pattern JSON_NUMBER_PATTERN = Pattern.compile("^[0-9]*\\.?[0-9]*$");
public static final Pattern JSON_BOOLEAN_PATTERN = Pattern.compile("^(true|false)$");
private final String value; private final String value;
@Override @Override
@ -82,10 +86,10 @@ public class JsonBall implements Comparable<String>, CharSequence {
public JsonBall(String value) { public JsonBall(String value) {
this.value = quoteStringIfNotNumberOrBoolean(checkNotNull(value, "value")); this.value = quoteStringIfNotNumberOrBoolean(checkNotNull(value, "value"));
} }
static String quoteStringIfNotNumberOrBoolean(String in) { static String quoteStringIfNotNumberOrBoolean(String in) {
if (Patterns.JSON_STRING_PATTERN.matcher(in).find() && !Patterns.JSON_NUMBER_PATTERN.matcher(in).find() if (JSON_STRING_PATTERN.matcher(in).find() && !JSON_NUMBER_PATTERN.matcher(in).find()
&& !Patterns.JSON_BOOLEAN_PATTERN.matcher(in).find()) { && !JSON_BOOLEAN_PATTERN.matcher(in).find()) {
return "\"" + in + "\""; return "\"" + in + "\"";
} }
return in; return in;

View File

@ -18,8 +18,8 @@
*/ */
package org.jclouds.domain; package org.jclouds.domain;
import org.jclouds.crypto.Pems;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import org.jclouds.util.CredentialUtils;
import com.google.common.base.Optional; import com.google.common.base.Optional;
@ -27,7 +27,12 @@ import com.google.common.base.Optional;
* @author Adrian Cole * @author Adrian Cole
*/ */
public class LoginCredentials extends Credentials { public class LoginCredentials extends Credentials {
public static boolean isPrivateKeyCredential(String credential) {
return credential != null
&& (credential.startsWith(Pems.PRIVATE_PKCS1_MARKER) || credential.startsWith(Pems.PRIVATE_PKCS8_MARKER));
}
public static LoginCredentials fromCredentials(Credentials creds) { public static LoginCredentials fromCredentials(Credentials creds) {
if (creds == null) if (creds == null)
return null; return null;
@ -48,7 +53,7 @@ public class LoginCredentials extends Credentials {
public static Builder builder() { public static Builder builder() {
return new Builder(); return new Builder();
} }
public static class Builder extends Credentials.Builder<LoginCredentials> { public static class Builder extends Credentials.Builder<LoginCredentials> {
private boolean authenticateSudo; private boolean authenticateSudo;
private Optional<String> password; private Optional<String> password;
@ -87,7 +92,7 @@ public class LoginCredentials extends Credentials {
} }
public Builder credential(String credential) { public Builder credential(String credential) {
if (CredentialUtils.isPrivateKeyCredential(credential)) if (isPrivateKeyCredential(credential))
return noPassword().privateKey(credential); return noPassword().privateKey(credential);
else if (credential != null) else if (credential != null)
return password(credential).noPrivateKey(); return password(credential).noPrivateKey();
@ -119,7 +124,7 @@ public class LoginCredentials extends Credentials {
} }
public LoginCredentials(String username, @Nullable Optional<String> password, @Nullable Optional<String> privateKey, boolean authenticateSudo) { public LoginCredentials(String username, @Nullable Optional<String> password, @Nullable Optional<String> privateKey, boolean authenticateSudo) {
super(username, privateKey != null && privateKey.isPresent() && CredentialUtils.isPrivateKeyCredential(privateKey.get()) super(username, privateKey != null && privateKey.isPresent() && isPrivateKeyCredential(privateKey.get())
? privateKey.get() ? privateKey.get()
: (password != null && password.isPresent() ? password.get() : null)); : (password != null && password.isPresent() ? password.get() : null));
this.authenticateSudo = authenticateSudo; this.authenticateSudo = authenticateSudo;

View File

@ -1,55 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.functions;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.List;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Function;
import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
/**
*
* @author Adrian Cole
*/
public class ExceptionToValueOrPropagate<E extends Exception, T> implements Function<Exception, T> {
private final Class<E> matchingClass;
private final T value;
public ExceptionToValueOrPropagate(Class<E> matchingClass, @Nullable T value) {
this.matchingClass = checkNotNull(matchingClass, "matchingClass");
this.value = value;
}
@Override
public T apply(Exception from) {
checkNotNull(from, "exception");
List<Throwable> throwables = Throwables.getCausalChain(from);
Iterable<E> matchingThrowables = Iterables.filter(throwables, matchingClass);
if (Iterables.size(matchingThrowables) >= 1)
return value;
throw Throwables.propagate(from);
}
}

View File

@ -1,48 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.functions;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.common.base.Function;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
public class JoinOnK2<K, K2, V> implements Function<Map<K, Supplier<Set<K2>>>, Map<K2, Supplier<V>>> {
private final Supplier<Map<K2, Supplier<V>>> regionToEndpointSupplier;
public JoinOnK2(Supplier<Map<K2, Supplier<V>>> regionToEndpointSupplier) {
this.regionToEndpointSupplier = regionToEndpointSupplier;
}
@Override
public Map<K2, Supplier<V>> apply(Map<K, Supplier<Set<K2>>> regionToZones) {
Map<K2, Supplier<V>> regionToEndpoint = regionToEndpointSupplier.get();
Builder<K2, Supplier<V>> builder = ImmutableMap.builder();
for (Entry<K, Supplier<Set<K2>>> entry : regionToZones.entrySet()) {
for (K2 zone : entry.getValue().get()) {
builder.put(zone, regionToEndpoint.get(entry.getKey()));
}
}
return builder.build();
}
}

View File

@ -1,77 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.http.functions;
import static org.jclouds.http.HttpUtils.releasePayload;
import javax.annotation.Resource;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.logging.Logger;
import org.jclouds.rest.InvocationContext;
import com.google.common.base.Function;
/**
* @author Adrian Cole
*/
public class ParseContentMD5FromHeaders implements Function<HttpResponse, byte[]>,
InvocationContext<ParseContentMD5FromHeaders> {
public static class NoContentMD5Exception extends RuntimeException {
private final HttpRequest request;
private final HttpResponse response;
public NoContentMD5Exception(HttpRequest request, HttpResponse response) {
super(String.format("no MD5 returned from request: %s; response %s", request, response));
this.request = request;
this.response = response;
}
public HttpRequest getRequest() {
return request;
}
public HttpResponse getResponse() {
return response;
}
}
@Resource
protected Logger logger = Logger.NULL;
private HttpRequest request;
public byte[] apply(HttpResponse from) {
releasePayload(from);
if (from.getPayload() != null) {
return from.getPayload().getContentMetadata().getContentMD5();
}
throw new NoContentMD5Exception(request, from);
}
@Override
public ParseContentMD5FromHeaders setContext(HttpRequest request) {
this.request = request;
return this;
}
}

View File

@ -1,53 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.http.pool;
/**
* Properties used in pooling http engines
*
* @author Adrian Cole
*/
public interface PoolConstants {
/**
* Integer property. default (12)
* <p/>
* Limits the amount of connections per host.
*/
public static final String PROPERTY_POOL_MAX_CONNECTIONS = "jclouds.pool.max_connections";
/**
* Integer property. default (12)
* <p/>
* Amount of threads servicing the I/O of http connections
*/
public static final String PROPERTY_POOL_IO_WORKER_THREADS = "jclouds.http.pool.io_worker_threads";
/**
* Integer property. default (2)
* <p/>
* Maximum amount of http session failures before a pool is disabled.
*/
public static final String PROPERTY_POOL_MAX_SESSION_FAILURES = "jclouds.http.pool.max_session_failures";
/**
* Integer property. default (75)
* <p/>
* Maximum amount of times to re-use an http connection. Services like Amazon S3 throw errors if
* connections are reused too many times.
*/
public static final String PROPERTY_POOL_MAX_CONNECTION_REUSE = "jclouds.http.pool.max_connection_reuse";
}

View File

@ -52,12 +52,12 @@ import org.jclouds.location.suppliers.ZoneIdsSupplier;
import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.AuthorizationException;
import org.jclouds.rest.functions.ImplicitOptionalConverter; import org.jclouds.rest.functions.ImplicitOptionalConverter;
import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
import org.jclouds.util.Suppliers2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Provides; import com.google.inject.Provides;
@ -120,7 +120,7 @@ public class LocationModule extends AbstractModule {
protected Supplier<Set<String>> regionIdsSupplier(AtomicReference<AuthorizationException> authException, protected Supplier<Set<String>> regionIdsSupplier(AtomicReference<AuthorizationException> authException,
@Named(PROPERTY_SESSION_INTERVAL) long seconds, RegionIdFilter filter, RegionIdsSupplier uncached) { @Named(PROPERTY_SESSION_INTERVAL) long seconds, RegionIdFilter filter, RegionIdsSupplier uncached) {
return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException,
Suppliers2.compose(new FilterStrings(filter), uncached), seconds, TimeUnit.SECONDS); Suppliers.compose(new FilterStrings(filter), uncached), seconds, TimeUnit.SECONDS);
} }
@Provides @Provides
@ -130,7 +130,7 @@ public class LocationModule extends AbstractModule {
AtomicReference<AuthorizationException> authException, @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException, @Named(PROPERTY_SESSION_INTERVAL) long seconds,
ZoneIdFilter filter, ZoneIdsSupplier uncached) { ZoneIdFilter filter, ZoneIdsSupplier uncached) {
return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException,
Suppliers2.compose(new FilterStrings(filter), uncached), seconds, TimeUnit.SECONDS); Suppliers.compose(new FilterStrings(filter), uncached), seconds, TimeUnit.SECONDS);
} }
static class FilterStrings implements Function<Set<String>, Set<String>>{ static class FilterStrings implements Function<Set<String>, Set<String>>{

View File

@ -18,10 +18,13 @@
*/ */
package org.jclouds.rest.config; package org.jclouds.rest.config;
import static com.google.common.base.Preconditions.checkState;
import static org.jclouds.rest.config.BinderUtils.bindClientAndAsyncClient;
import java.lang.reflect.TypeVariable;
import java.util.Map; import java.util.Map;
import static org.jclouds.rest.config.BinderUtils.*;
import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.util.TypeTokens2;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken; import com.google.common.reflect.TypeToken;
@ -41,14 +44,22 @@ public class RestClientModule<S, A> extends RestModule {
*/ */
protected RestClientModule(Map<Class<?>, Class<?>> sync2Async) { protected RestClientModule(Map<Class<?>, Class<?>> sync2Async) {
super(sync2Async); super(sync2Async);
this.syncClientType = TypeTokens2.checkBound(new TypeToken<S>(getClass()) { this.syncClientType = checkBound(new TypeToken<S>(getClass()) {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
}); });
this.asyncClientType = TypeTokens2.checkBound(new TypeToken<A>(getClass()) { this.asyncClientType = checkBound(new TypeToken<A>(getClass()) {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
}); });
} }
/**
* @throws IllegalStateException if the type is an instanceof {@link TypeVariable}
*/
private static <T> TypeToken<T> checkBound(TypeToken<T> type) throws IllegalStateException {
checkState(!(type.getType() instanceof TypeVariable<?>),
"unbound type variable: %s, use ctor that explicitly assigns this", type);
return type;
}
/** /**
* @see #RestClientModule(Map) * @see #RestClientModule(Map)
*/ */
@ -68,8 +79,8 @@ public class RestClientModule<S, A> extends RestModule {
*/ */
public RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType, Map<Class<?>, Class<?>> sync2Async) { public RestClientModule(TypeToken<S> syncClientType, TypeToken<A> asyncClientType, Map<Class<?>, Class<?>> sync2Async) {
super(sync2Async); super(sync2Async);
this.syncClientType = TypeTokens2.checkBound(syncClientType); this.syncClientType = checkBound(syncClientType);
this.asyncClientType = TypeTokens2.checkBound(asyncClientType); this.asyncClientType = checkBound(asyncClientType);
} }
@Override @Override

View File

@ -48,7 +48,6 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static javax.ws.rs.core.MediaType.APPLICATION_XML; import static javax.ws.rs.core.MediaType.APPLICATION_XML;
import static org.jclouds.http.Uris.uriBuilder; import static org.jclouds.http.Uris.uriBuilder;
import static org.jclouds.io.Payloads.newPayload; import static org.jclouds.io.Payloads.newPayload;
import static org.jclouds.util.Maps2.convertUnsafe;
import static org.jclouds.util.Strings2.replaceTokens; import static org.jclouds.util.Strings2.replaceTokens;
import java.io.InputStream; import java.io.InputStream;
@ -59,6 +58,7 @@ import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.lang.reflect.WildcardType; import java.lang.reflect.WildcardType;
import java.net.URI; import java.net.URI;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
@ -150,11 +150,13 @@ import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder; import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.common.primitives.Chars; import com.google.common.primitives.Chars;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
@ -527,7 +529,15 @@ public abstract class RestAnnotationProcessor {
utils.checkRequestHasRequiredProperties(request); utils.checkRequestHasRequiredProperties(request);
return request; return request;
} }
private static <K, V> Map<K, V> convertUnsafe(Multimap<K, V> in) {
LinkedHashMap<K, V> out = Maps.newLinkedHashMap();
for (Entry<K, V> entry : in.entries()) {
out.put(entry.getKey(), entry.getValue());
}
return ImmutableMap.copyOf(out);
}
protected org.jclouds.rest.internal.GeneratedHttpRequest.Builder requestBuilder() { protected org.jclouds.rest.internal.GeneratedHttpRequest.Builder requestBuilder() {
return GeneratedHttpRequest.builder(); return GeneratedHttpRequest.builder();
} }

View File

@ -28,27 +28,6 @@ public class ClassLoadingUtils {
//Utility Class //Utility Class
} }
/**
* Loads a class using the class loader.
* 1. The class loader of the context class is being used.
* 2. The thread context class loader is being used.
* If both approaches fail, returns null.
*
* @param contextClass The name of a context class to use.
* @param className The name of the class to load
* @return The class or null if no class loader could load the class.
*/
public static Class<?> loadClass(Class<?> contextClass, String className) {
Class<?> clazz = null;
if (contextClass.getClassLoader() != null) {
clazz = silentLoadClass(className, contextClass.getClassLoader());
}
if (clazz == null && Thread.currentThread().getContextClassLoader() != null) {
clazz = silentLoadClass(className, Thread.currentThread().getContextClassLoader());
}
return clazz;
}
/** /**
* Returns the url of a resource. * Returns the url of a resource.
* 1. The context class is being used. * 1. The context class is being used.
@ -69,24 +48,4 @@ public class ClassLoadingUtils {
} }
return url; return url;
} }
/**
* Loads a {@link Class} from the specified {@link ClassLoader} without throwing {@ClassNotFoundException}.
*
* @param className
* @param classLoader
* @return
*/
private static Class<?> silentLoadClass(String className, ClassLoader classLoader) {
Class<?> clazz = null;
if (classLoader != null && className != null) {
try {
clazz = classLoader.loadClass(className);
} catch (ClassNotFoundException e) {
//Ignore and proceed to the next class loader.
}
}
return clazz;
}
} }

View File

@ -1,45 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import com.google.common.base.Function;
/**
* For wrapping covariant functions for passing to non-covariant methods
*
* @author danikov
*/
public class ConcreteFunction<F,T> implements Function<F, T> {
private final Function<? super F, ? extends T> delegate;
public static <F,T> ConcreteFunction<F,T> wrap(Function<? super F, ? extends T> delegate) {
return new ConcreteFunction<F, T>(delegate);
}
public ConcreteFunction(Function<? super F, ? extends T> delegate) {
this.delegate = delegate;
}
@Override
public T apply(F input) {
return delegate.apply(input);
}
}

View File

@ -1,60 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.crypto.Pems;
import org.jclouds.domain.Credentials;
import org.jclouds.javax.annotation.Nullable;
/**
*
*
* @author Adrian Cole
*/
public class CredentialUtils {
public static Credentials overrideCredentialsIfSupplied(Credentials defaultCredentials,
@Nullable Credentials overridingCredentials) {
if (overridingCredentials == null)
return defaultCredentials;
String identity = overridingCredentials.identity != null ? overridingCredentials.identity : checkNotNull(
defaultCredentials, "defaultCredentials").identity;
String credential = overridingCredentials.credential != null ? overridingCredentials.credential : checkNotNull(
defaultCredentials, "defaultCredentials").credential;
return new Credentials(identity, credential);
}
public static boolean isPrivateKeyCredential(Credentials credentials) {
return credentials != null && isPrivateKeyCredential(credentials.credential);
}
public static boolean isPrivateKeyCredential(String credential) {
return credential != null
&& (credential.startsWith(Pems.PRIVATE_PKCS1_MARKER) || credential.startsWith(Pems.PRIVATE_PKCS8_MARKER));
}
public static boolean isPrivateKeyEncrypted(byte[] privateKey) {
return new String(privateKey).contains("Proc-Type: 4,ENCRYPTED");
}
}

View File

@ -1,128 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import com.google.common.collect.Lists;
/**
* {@link InputStream} implementation that allows chaining of various streams for seamless
* sequential reading
*
* @author Adrian Cole
* @author Tomas Varaneckas <tomas.varaneckas@gmail.com>
*/
public class InputStreamChain extends InputStream {
/**
* Input stream chain
*/
private final LinkedList<InputStream> streams = Lists.newLinkedList();
/**
* Currently active stream
*/
private InputStream current;
public InputStreamChain(InputStream... inputStreams) {
for (InputStream stream : inputStreams) {
addInputStream(stream);
}
}
/**
* Adds input stream to the end of chain
*
* @param stream
* InputStream to add to chain
* @return instance of self (for fluent calls)
*/
public InputStreamChain addInputStream(final InputStream stream) {
streams.addLast(stream);
if (current == null) {
current = streams.removeFirst();
}
return this;
}
/**
* Adds a String to the end of chain
*
* @param value
* String to add to the chain
* @return instance of self (for fluent calls)
*/
public InputStreamChain addAsInputStream(final String value) {
return addInputStream(Strings2.toInputStream(value));
}
@Override
public int read() throws IOException {
int bit = current.read();
if (bit == -1 && streams.size() > 0) {
try {
current.close();
} catch (final IOException e) {
// replace this with a call to logging facility
e.printStackTrace();
}
current = streams.removeFirst();
bit = read();
}
return bit;
}
@Override
public int available() throws IOException {
int available = current.available();
for (InputStream stream : streams) {
available += stream.available();
}
return available;
}
@Override
public void close() throws IOException {
current.close();
}
@Override
public boolean markSupported() {
return current.markSupported();
}
@Override
public synchronized void mark(int i) {
current.mark(i);
}
@Override
public synchronized void reset() throws IOException {
current.reset();
}
@Override
public long skip(long l) throws IOException {
return current.skip(l);
}
}

View File

@ -1,41 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import com.google.common.collect.ImmutableSet;
/**
* General utilities used in jclouds code for {@link Iterable Iterables}.
*
* @author danikov
*/
public class Iterables2 {
/**
* Copies the contents of a wildcarded {@link Iterable} into a concrete {@link Iterable} of the left bound
*
* @param unboundedValues wildcarded source {@link Iterable}
* @return concrete-typed copy of the source
*/
public static <T> Iterable<T> concreteCopy(Iterable<? extends T> unboundedValues) {
// Please do not attempt to sort, as this is wasteful
return ImmutableSet.copyOf(unboundedValues);
}
}

View File

@ -1,55 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import static com.google.common.collect.Lists.newArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
/**
*
* @author Adrian Cole
*/
public class Lists2 {
/**
* Like Ordering, but handle the case where there are multiple valid maximums
*/
@SuppressWarnings("unchecked")
public static <T, E extends T> List<E> multiMax(Comparator<T> ordering, Iterable<E> iterable) {
Iterator<E> iterator = iterable.iterator();
List<E> maxes = newArrayList(iterator.next());
E maxSoFar = maxes.get(0);
while (iterator.hasNext()) {
E current = iterator.next();
int comparison = ordering.compare(maxSoFar, current);
if (comparison == 0) {
maxes.add(current);
} else if (comparison < 0) {
maxes = newArrayList(current);
maxSoFar = current;
}
}
return maxes;
}
}

View File

@ -19,21 +19,13 @@
package org.jclouds.util; package org.jclouds.util;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Predicates.equalTo;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Maps.filterKeys;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
/** /**
* General utilities used in jclouds code for {@link Map Maps}. * General utilities used in jclouds code for {@link Map Maps}.
@ -41,53 +33,6 @@ import com.google.common.collect.Multimap;
* @author Adrian Cole * @author Adrian Cole
*/ */
public class Maps2 { public class Maps2 {
public static <K> Function<Map<K, ?>, Set<K>> keySetFunction() {
return new Function<Map<K, ?>, Set<K>>() {
@Override
public Set<K> apply(Map<K, ?> arg0) {
return arg0.keySet();
}
public String toString() {
return "keySet()";
}
};
}
public static <K, V> Map<K, V> convertUnsafe(Multimap<K, V> in) {
LinkedHashMap<K, V> out = Maps.newLinkedHashMap();
for (Entry<K, V> entry : in.entries()) {
out.put(entry.getKey(), entry.getValue());
}
return ImmutableMap.copyOf(out);
}
/**
* If the supplied map contains the key {@code k1}, its value will be assigned to the key {@code
* k2}. Note that this doesn't modify the input map.
*
* @param <V>
* type of value the map holds
* @param in
* the map you wish to make a copy of
* @param k1
* old key
* @param k2
* new key
* @return copy of the map with the value of the key re-routed, or the original, if it {@code k1}
* wasn't present.
*/
public static <V> Map<String, V> renameKey(Map<String, V> in, String k1, String k2) {
if (checkNotNull(in, "input map").containsKey(checkNotNull(k1, "old key"))) {
Builder<String, V> builder = ImmutableMap.builder();
builder.putAll(filterKeys(in, not(equalTo(k1))));
V tags = in.get(k1);
builder.put(checkNotNull(k2, "new key"), tags);
in = builder.build();
}
return in;
}
/** /**
* change the keys but keep the values in-tact. * change the keys but keep the values in-tact.
@ -112,57 +57,4 @@ public class Maps2 {
returnVal.put(fn.apply(entry.getKey()), entry.getValue()); returnVal.put(fn.apply(entry.getKey()), entry.getValue());
return returnVal.build(); return returnVal.build();
} }
public static <K, V> Supplier<Map<K, V>> composeMapSupplier(Iterable<Supplier<Map<K, V>>> suppliers) {
return new ListMapSupplier<K, V>(suppliers);
}
static class ListMapSupplier<K, V> implements Supplier<Map<K, V>> {
private final Iterable<Supplier<Map<K, V>>> suppliers;
ListMapSupplier(Iterable<Supplier<Map<K, V>>> suppliers) {
this.suppliers = checkNotNull(suppliers, "suppliers");
}
@Override
public Map<K, V> get() {
Map<K, V> toReturn = Maps.newLinkedHashMap();
for (Supplier<Map<K, V>> supplier : suppliers) {
toReturn.putAll(supplier.get());
}
return toReturn;
}
}
/**
* Constructs a map with the given keys where values are generated by the given function.
* Supports duplicate and {@code null} values, but {@code null} keys are <em>not</em> allowed.
*
* @param <K> the type of the keys
* @param <V> the type of the values
* @param keys the keys to be included in the map. Keys must be non-<code>null</code>
* @param valueFunction the function that produces values for the keys
* @return a map containing the keys from the given set with values which are generated from
* the keys
* @see Maps#uniqueIndex(Iterable, Function)
*/
public static <K, V> Map<K, V> fromKeys(Set<K> keys, Function<? super K, V> valueFunction) {
Map<K, V> result = Maps.newHashMapWithExpectedSize(keys.size());
for (K key : keys) {
result.put(checkNotNull(key), valueFunction.apply(key));
}
return result;
}
/**
* Covariant compatible version
*
* @see {@link Maps#uniqueIndex(Iterable, Function)}
*/
public static <K, V> ImmutableMap<K, V> uniqueIndex(
Iterable<? extends V> values, Function<? super V, ? extends K> keyFunction) {
return ImmutableMap.copyOf(Maps.uniqueIndex(values, keyFunction));
}
} }

View File

@ -1,72 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import static com.google.common.base.Splitter.on;
import static com.google.common.collect.Iterables.concat;
import static com.google.common.collect.Iterables.transform;
import java.util.Properties;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
/**
*
*
* @author Adrian Cole
*/
public class Modules2 {
public static Iterable<Module> modulesFromCommaDelimitedString(String moduleClasses) {
Iterable<Module> modules = ImmutableSet.of();
if (moduleClasses != null) {
Iterable<String> transformer = ImmutableList.copyOf(on(',').split(moduleClasses));
modules = transform(transformer, new Function<String, Module>() {
@Override
public Module apply(String from) {
try {
return (Module) ClassLoadingUtils.loadClass(Modules2.class, from).newInstance();
} catch (InstantiationException e) {
throw new RuntimeException("error instantiating " + from, e);
} catch (IllegalAccessException e) {
throw new RuntimeException("error instantiating " + from, e);
}
}
});
}
return modules;
}
public static Iterable<Module> modulesForProviderInProperties(String providerName, Properties props) {
return concat(modulesFromProperty(props, "jclouds.modules"),
modulesFromProperty(props, providerName + ".modules"));
}
public static Iterable<Module> modulesFromProperty(Properties props, String property) {
return modulesFromCommaDelimitedString(props.getProperty(property, null));
}
}

View File

@ -20,16 +20,13 @@ package org.jclouds.util;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableMultimap.Builder; import com.google.common.collect.ImmutableMultimap.Builder;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps; import com.google.common.collect.Multimaps;
@ -39,34 +36,6 @@ import com.google.common.collect.Multimaps;
*/ */
public class Multimaps2 { public class Multimaps2 {
/**
* The traditional way to represent a graph in Java is Map<V, Set<V>>, which is awkward in a
* number of ways. Guava's Multimap framework makes it easy to handle a mapping from keys to
* multiple values.
* <p/>
* Until we write or discover a gson Multimap deserializer, we may be stuck with this.
*
* TODO: ask on stackoverflow and/or jesse wilson
*/
@Deprecated
public static <K, V> Map<K, Set<V>> toOldSchool(Multimap<K, V> in) {
ImmutableMap.Builder<K, Set<V>> out = ImmutableMap.builder();
for (K type : in.keySet())
out.put(type, ImmutableSet.copyOf(in.get(type)));
return out.build();
}
/**
* @see #toOldSchool
*/
@Deprecated
public static <K, V> ImmutableMultimap<K, V> fromOldSchool(Map<K, Set<V>> in) {
Builder<K, V> out = ImmutableMultimap.builder();
for (K type : in.keySet())
out.putAll(type, ImmutableSet.copyOf(in.get(type)));
return out.build();
}
public static <K, V> Multimap<K, V> replaceValue(Multimap<K, V> fromMultimap, final K key, final V value) { public static <K, V> Multimap<K, V> replaceValue(Multimap<K, V> fromMultimap, final K key, final V value) {
checkNotNull(fromMultimap, "input multimap"); checkNotNull(fromMultimap, "input multimap");
checkNotNull(key, "key"); checkNotNull(key, "key");

View File

@ -1,38 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import java.util.Set;
import com.google.common.collect.ImmutableSet;
/**
*
* @author Adrian Cole
*/
public class NullSafeCollections {
public static <T> Set<T> nullSafeSet(T in) {
if (in == null) {
return ImmutableSet.<T> of();
}
return ImmutableSet.<T> of(in);
}
}

View File

@ -18,9 +18,6 @@
*/ */
package org.jclouds.util; package org.jclouds.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.concurrent.ExecutionException;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
@ -32,52 +29,8 @@ import com.google.common.cache.LoadingCache;
* @author Adrian Cole * @author Adrian Cole
*/ */
public class Patterns { public class Patterns {
public static final Pattern TOKEN_PATTERN = Pattern.compile("\\{(.+?)\\}");
public static final Pattern TWO_SPACE_PATTERN = Pattern.compile(" ");
public static final Pattern URL_ENCODED_PATTERN = Pattern.compile(".*%[a-fA-F0-9][a-fA-F0-9].*");
public static final Pattern URI_PATTERN = Pattern.compile("([a-z0-9]+)://([^:]*):(.*)@(.*)");
public static final Pattern PATTERN_THAT_BREAKS_URI = Pattern.compile("[a-z0-9]+://.*/.*@.*");
public static final Pattern JSON_STRING_PATTERN = Pattern.compile("^[^\"\\{\\[].*[^\\{\\[\"]$");
public static final Pattern JSON_NUMBER_PATTERN = Pattern.compile("^[0-9]*\\.?[0-9]*$");
public static final Pattern JSON_BOOLEAN_PATTERN = Pattern.compile("^(true|false)$");
public static final Pattern PLUS_PATTERN = Pattern.compile("\\+");
public static final Pattern STAR_PATTERN = Pattern.compile("\\*");
public static final Pattern _7E_PATTERN = Pattern.compile("%7E");
public static final Pattern NEWLINE_PATTERN = Pattern.compile("\r?\n"); public static final Pattern NEWLINE_PATTERN = Pattern.compile("\r?\n");
public static final Pattern SLASH_PATTERN = Pattern.compile("[/]");
public static final Pattern IP_PATTERN = Pattern.compile("b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).)"
+ "{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b");
public static final Pattern LEADING_SLASHES = Pattern.compile("^[/]+");
public static final Pattern TRAILING_SLASHES = Pattern.compile("[/]*$");
public static final Pattern REST_CONTEXT_BUILDER = Pattern.compile("(.*ContextBuilder)<([^,]+), ?([^>]+)>");
public static final LoadingCache<Character, String> CHAR_TO_ENCODED = CacheBuilder.newBuilder()
.<Character, String> build(new CacheLoader<Character, String>() {
@Override
public String load(Character plain) throws ExecutionException {
try {
return URLEncoder.encode(plain + "", "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new ExecutionException("Bad encoding on input: " + plain, e);
}
}
});
public static final LoadingCache<Character, Pattern> CHAR_TO_ENCODED_PATTERN = CacheBuilder.newBuilder()
.<Character, Pattern> build(new CacheLoader<Character, Pattern>() {
@Override
public Pattern load(Character plain) throws ExecutionException {
return Pattern.compile(CHAR_TO_ENCODED.get(plain));
}
});
public static final LoadingCache<Character, Pattern> CHAR_TO_PATTERN = CacheBuilder.newBuilder()
.<Character, Pattern> build(new CacheLoader<Character, Pattern>() {
@Override
public Pattern load(Character plain) {
return Pattern.compile(plain + "");
}
});
public static final LoadingCache<String, Pattern> TOKEN_TO_PATTERN = CacheBuilder.newBuilder() public static final LoadingCache<String, Pattern> TOKEN_TO_PATTERN = CacheBuilder.newBuilder()
.<String, Pattern> build(new CacheLoader<String, Pattern>() { .<String, Pattern> build(new CacheLoader<String, Pattern>() {

View File

@ -28,15 +28,6 @@ import static com.google.common.base.Preconditions.checkArgument;
*/ */
public class Preconditions2 { public class Preconditions2 {
/**
* Will throw an exception if the argument is null or empty.
*
* @param nullableString
* string to verify. Can be null or empty.
*/
public static void checkNotEmpty(String nullableString) {
Preconditions2.checkNotEmpty(nullableString, "Argument can't be null or empty");
}
/** /**
* Will throw an exception if the argument is null or empty. Accepts a custom error message. * Will throw an exception if the argument is null or empty. Accepts a custom error message.
@ -50,5 +41,4 @@ public class Preconditions2 {
checkArgument(nullableString != null && nullableString.length() > 0, message); checkArgument(nullableString != null && nullableString.length() > 0, message);
} }
} }

View File

@ -35,19 +35,4 @@ public class Predicates2 {
} }
}; };
} }
/** Returns a predicate that evaluates to true if the String being tested ends with a prefix. */
public static Predicate<String> endsWith(final String suffix) {
return new Predicate<String>() {
@Override
public boolean apply(final String input) {
return input.endsWith(suffix);
}
@Override
public String toString() {
return "endsWith(" + suffix + ")";
}
};
}
} }

View File

@ -51,8 +51,4 @@ public class SaxUtils {
return returnVal.equals("") ? null : returnVal; return returnVal.equals("") ? null : returnVal;
} }
public static String currentOrNegative(StringBuilder currentText) {
String returnVal = currentText.toString().trim();
return returnVal.equals("") ? "-1" : returnVal;
}
} }

View File

@ -21,10 +21,7 @@ package org.jclouds.util;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.io.ByteStreams.toByteArray; import static com.google.common.io.ByteStreams.toByteArray;
import static com.google.common.io.Closeables.closeQuietly; import static com.google.common.io.Closeables.closeQuietly;
import static org.jclouds.util.Patterns.CHAR_TO_ENCODED;
import static org.jclouds.util.Patterns.CHAR_TO_PATTERN;
import static org.jclouds.util.Patterns.TOKEN_TO_PATTERN; import static org.jclouds.util.Patterns.TOKEN_TO_PATTERN;
import static org.jclouds.util.Patterns.URL_ENCODED_PATTERN;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
@ -41,6 +38,9 @@ import java.util.regex.Pattern;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.common.io.CharStreams; import com.google.common.io.CharStreams;
import com.google.common.io.InputSupplier; import com.google.common.io.InputSupplier;
@ -77,6 +77,21 @@ public class Strings2 {
throw new IllegalStateException("error creating pattern: " + in, e); throw new IllegalStateException("error creating pattern: " + in, e);
} }
} }
private static final LoadingCache<Character, String> CHAR_TO_ENCODED = CacheBuilder.newBuilder()
.<Character, String> build(new CacheLoader<Character, String>() {
@Override
public String load(Character plain) throws ExecutionException {
try {
return URLEncoder.encode(plain + "", "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new ExecutionException("Bad encoding on input: " + plain, e);
}
}
});
private static final Pattern URL_ENCODED_PATTERN = Pattern.compile(".*%[a-fA-F0-9][a-fA-F0-9].*");
public static boolean isUrlEncoded(String in) { public static boolean isUrlEncoded(String in) {
return URL_ENCODED_PATTERN.matcher(in).matches(); return URL_ENCODED_PATTERN.matcher(in).matches();
} }
@ -106,13 +121,6 @@ public class Strings2 {
return returnVal; return returnVal;
} }
public static String replaceAll(String input, char ifMatch, Pattern pattern, String replacement) {
if (input.indexOf(ifMatch) != -1) {
input = pattern.matcher(input).replaceAll(replacement);
}
return input;
}
public static String replaceAll(String input, char match, String replacement) { public static String replaceAll(String input, char match, String replacement) {
if (input.indexOf(match) != -1) { if (input.indexOf(match) != -1) {
try { try {
@ -124,6 +132,14 @@ public class Strings2 {
return input; return input;
} }
private static final LoadingCache<Character, Pattern> CHAR_TO_PATTERN = CacheBuilder.newBuilder()
.<Character, Pattern> build(new CacheLoader<Character, Pattern>() {
@Override
public Pattern load(Character plain) {
return Pattern.compile(plain + "");
}
});
public static String toString(InputSupplier<? extends InputStream> supplier) public static String toString(InputSupplier<? extends InputStream> supplier)
throws IOException { throws IOException {
return CharStreams.toString(CharStreams.newReaderSupplier(supplier, return CharStreams.toString(CharStreams.newReaderSupplier(supplier,
@ -157,7 +173,7 @@ public class Strings2 {
* token/value pairs * token/value pairs
*/ */
public static String replaceTokens(String input, Map<String, String> replacements) { public static String replaceTokens(String input, Map<String, String> replacements) {
Matcher matcher = Patterns.TOKEN_PATTERN.matcher(input); Matcher matcher = TOKEN_PATTERN.matcher(input);
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
int i = 0; int i = 0;
while (matcher.find()) { while (matcher.find()) {
@ -172,6 +188,8 @@ public class Strings2 {
builder.append(input.substring(i, input.length())); builder.append(input.substring(i, input.length()));
return builder.toString(); return builder.toString();
} }
private static final Pattern TOKEN_PATTERN = Pattern.compile("\\{(.+?)\\}");
public static String replaceTokens(String input, Multimap<String, ?> tokenValues) { public static String replaceTokens(String input, Multimap<String, ?> tokenValues) {
for (Entry<String, ?> tokenValue : tokenValues.entries()) { for (Entry<String, ?> tokenValue : tokenValues.entries()) {

View File

@ -18,21 +18,15 @@
*/ */
package org.jclouds.util; package org.jclouds.util;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map; import java.util.Map;
import com.google.common.annotations.Beta; import com.google.common.annotations.Beta;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers; import com.google.common.base.Suppliers;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.io.OutputSupplier;
/** /**
* *
@ -40,26 +34,6 @@ import com.google.common.io.OutputSupplier;
*/ */
public class Suppliers2 { public class Suppliers2 {
/**
* Supplies a value that corresponds to a particular key in a map, or null, if not found
*/
public static <K, V> Supplier<V> valueForKey(final Supplier<Map<K, Supplier<V>>> input, final Supplier<K> key) {
return new Supplier<V>() {
@Override
public V get() {
K keyToFind = key.get();
Supplier<V> value = input.get().get(keyToFind);
return value != null ? value.get() : null;
}
@Override
public String toString() {
return "withKey()";
}
};
}
public static <K, V> Supplier<V> getLastValueInMap(final Supplier<Map<K, Supplier<V>>> input) { public static <K, V> Supplier<V> getLastValueInMap(final Supplier<Map<K, Supplier<V>>> input) {
return new Supplier<V>() { return new Supplier<V>() {
@Override @Override
@ -90,19 +64,6 @@ public class Suppliers2 {
}; };
} }
/**
* converts an {@link OutputStream} to an {@link OutputSupplier}
*
*/
public static OutputSupplier<OutputStream> newOutputStreamSupplier(final OutputStream output) {
checkNotNull(output, "output");
return new OutputSupplier<OutputStream>() {
public OutputStream getOutput() throws IOException {
return output;
}
};
}
/** /**
* returns the value of the first supplier, or the value of the fallback, if the unlessNull is * returns the value of the first supplier, or the value of the fallback, if the unlessNull is
* null. * null.
@ -153,33 +114,4 @@ public class Suppliers2 {
}; };
} }
// only here until guava compose gives a toString!
// http://code.google.com/p/guava-libraries/issues/detail?id=1052
public static <F, T> Supplier<T> compose(Function<? super F, T> function, Supplier<F> supplier) {
Preconditions.checkNotNull(function);
Preconditions.checkNotNull(supplier);
return new SupplierComposition<F, T>(function, supplier);
}
private static class SupplierComposition<F, T> implements Supplier<T> {
final Function<? super F, T> function;
final Supplier<F> supplier;
SupplierComposition(Function<? super F, T> function, Supplier<F> supplier) {
this.function = function;
this.supplier = supplier;
}
@Override
public T get() {
return function.apply(supplier.get());
}
@Override
public String toString() {
return Objects.toStringHelper(this).add("function", function).add("supplier", supplier).toString();
}
}
} }

View File

@ -31,6 +31,7 @@ import org.jclouds.rest.AuthorizationException;
import org.jclouds.rest.InsufficientResourcesException; import org.jclouds.rest.InsufficientResourcesException;
import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.ResourceNotFoundException;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.inject.CreationException; import com.google.inject.CreationException;
@ -58,10 +59,6 @@ public class Throwables2 {
}; };
} }
public static boolean containsResourceNotFoundException(Throwable from) {
return getFirstThrowableOfType(from, ResourceNotFoundException.class) != null;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T extends Throwable> T getFirstThrowableOfType(Throwable from, Class<T> clazz) { public static <T extends Throwable> T getFirstThrowableOfType(Throwable from, Class<T> clazz) {
if (from instanceof ProvisionException) if (from instanceof ProvisionException)
@ -77,7 +74,8 @@ public class Throwables2 {
} }
} }
public static <T extends Throwable> T getFirstThrowableOfType(TransformParallelException e, Class<T> clazz) { @VisibleForTesting
static <T extends Throwable> T getFirstThrowableOfType(TransformParallelException e, Class<T> clazz) {
for (Exception exception : e.getFromToException().values()) { for (Exception exception : e.getFromToException().values()) {
T cause = getFirstThrowableOfType(exception, clazz); T cause = getFirstThrowableOfType(exception, clazz);
if (cause != null) if (cause != null)
@ -86,7 +84,8 @@ public class Throwables2 {
return null; return null;
} }
public static <T extends Throwable> T getFirstThrowableOfType(ProvisionException e, Class<T> clazz) { @VisibleForTesting
static <T extends Throwable> T getFirstThrowableOfType(ProvisionException e, Class<T> clazz) {
for (Message message : e.getErrorMessages()) { for (Message message : e.getErrorMessages()) {
if (message.getCause() != null) { if (message.getCause() != null) {
T cause = getFirstThrowableOfType(message.getCause(), clazz); T cause = getFirstThrowableOfType(message.getCause(), clazz);
@ -102,7 +101,8 @@ public class Throwables2 {
return null; return null;
} }
public static <T extends Throwable> T getFirstThrowableOfType(CreationException e, Class<T> clazz) { @VisibleForTesting
static <T extends Throwable> T getFirstThrowableOfType(CreationException e, Class<T> clazz) {
for (Message message : e.getErrorMessages()) { for (Message message : e.getErrorMessages()) {
if (message.getCause() != null) { if (message.getCause() != null) {
T cause = getFirstThrowableOfType(message.getCause(), clazz); T cause = getFirstThrowableOfType(message.getCause(), clazz);

View File

@ -1,40 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import static com.google.common.base.Preconditions.checkState;
import java.lang.reflect.TypeVariable;
import com.google.common.reflect.TypeToken;
/**
*
* @author Adrian Cole
*/
public class TypeTokens2 {
/**
* @throws IllegalStateException if the type is an instanceof {@link TypeVariable}
*/
public static <T> TypeToken<T> checkBound(TypeToken<T> type) throws IllegalStateException {
checkState(!(type.getType() instanceof TypeVariable<?>),
"unbound type variable: %s, use ctor that explicitly assigns this", type);
return type;
}
}

View File

@ -22,6 +22,7 @@ import static org.testng.Assert.assertEquals;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ParseJson; import org.jclouds.http.functions.ParseJson;
@ -41,6 +42,52 @@ import com.google.inject.TypeLiteral;
*/ */
@Test(groups = "unit") @Test(groups = "unit")
public class JsonBallTest { public class JsonBallTest {
public void testJSON_STRING_PATTERN1() {
Matcher matcher = JsonBall.JSON_STRING_PATTERN.matcher("hello");
assert (matcher.find());
}
public void testJSON_STRING_PATTERN2() {
Matcher matcher = JsonBall.JSON_STRING_PATTERN.matcher("hello world!");
assert (matcher.find());
}
public void testJSON_STRING_PATTERN3() {
Matcher matcher = JsonBall.JSON_STRING_PATTERN.matcher("\"hello world!\"");
assert (!matcher.find());
}
public void testJSON_STRING_PATTERN4() {
Matcher matcher = JsonBall.JSON_STRING_PATTERN.matcher("[hello world!]");
assert (!matcher.find());
}
public void testJSON_STRING_PATTERN5() {
Matcher matcher = JsonBall.JSON_STRING_PATTERN.matcher("{hello world!}");
assert (!matcher.find());
}
public void testJSON_NUMBER_PATTERN1() {
Matcher matcher = JsonBall.JSON_NUMBER_PATTERN.matcher("1");
assert (matcher.find());
}
public void testJSON_NUMBER_PATTERN2() {
Matcher matcher = JsonBall.JSON_NUMBER_PATTERN.matcher("1.1");
assert (matcher.find());
}
public void testJSON_NUMBER_PATTERN3() {
Matcher matcher = JsonBall.JSON_NUMBER_PATTERN.matcher("\"1.1\"");
assert (!matcher.find());
}
public void testJSON_NUMBER_PATTERN4() {
Matcher matcher = JsonBall.JSON_NUMBER_PATTERN.matcher("\"1\"");
assert (!matcher.find());
}
private ParseJson<Map<String, JsonBall>> handler; private ParseJson<Map<String, JsonBall>> handler;
private Json mapper; private Json mapper;

View File

@ -17,14 +17,15 @@
* under the License. * under the License.
*/ */
package org.jclouds.json.internal; package org.jclouds.json.internal;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.domain.JsonBall.JSON_BOOLEAN_PATTERN;
import static org.jclouds.domain.JsonBall.JSON_NUMBER_PATTERN;
import static org.jclouds.domain.JsonBall.JSON_STRING_PATTERN;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Map; import java.util.Map;
import org.jclouds.util.Patterns;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Objects; import com.google.common.base.Objects;
@ -80,8 +81,8 @@ public class NullHackJsonLiteralAdapterTest {
} }
static String quoteStringIfNotNumberOrBoolean(String in) { static String quoteStringIfNotNumberOrBoolean(String in) {
if (Patterns.JSON_STRING_PATTERN.matcher(in).find() && !Patterns.JSON_NUMBER_PATTERN.matcher(in).find() if (JSON_STRING_PATTERN.matcher(in).find() && !JSON_NUMBER_PATTERN.matcher(in).find()
&& !Patterns.JSON_BOOLEAN_PATTERN.matcher(in).find()) { && !JSON_BOOLEAN_PATTERN.matcher(in).find()) {
return "\"" + in + "\""; return "\"" + in + "\"";
} }
return in; return in;

View File

@ -1,60 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import static org.testng.Assert.assertEquals;
import org.jclouds.domain.Credentials;
import org.testng.annotations.Test;
/**
* @author Adrian Cole
*/
@Test(groups = "unit")
public class CredentialUtilsTest {
public void testOverridingCredentialsWhenOverridingIsNull() {
Credentials defaultCredentials = new Credentials("foo", "bar");
Credentials overridingCredentials = null;
assertEquals(CredentialUtils.overrideCredentialsIfSupplied(defaultCredentials, overridingCredentials),
defaultCredentials);
}
public void testOverridingCredentialsWhenOverridingLoginIsNull() {
Credentials defaultCredentials = new Credentials("foo", "bar");
Credentials overridingCredentials = new Credentials(null, "baz");
assertEquals(CredentialUtils.overrideCredentialsIfSupplied(defaultCredentials, overridingCredentials),
new Credentials("foo", "baz"));
}
public void testOverridingCredentialsWhenOverridingCredentialIsNull() {
Credentials defaultCredentials = new Credentials("foo", "bar");
Credentials overridingCredentials = new Credentials("fooble", null);
assertEquals(CredentialUtils.overrideCredentialsIfSupplied(defaultCredentials, overridingCredentials),
new Credentials("fooble", "bar"));
}
public void testOverridingCredentialsWhenOverridingCredentialsAreNull() {
Credentials defaultCredentials = new Credentials("foo", "bar");
Credentials overridingCredentials = new Credentials(null, null);
assertEquals(CredentialUtils.overrideCredentialsIfSupplied(defaultCredentials, overridingCredentials),
new Credentials("foo", "bar"));
}
}

View File

@ -18,11 +18,7 @@
*/ */
package org.jclouds.util; package org.jclouds.util;
import static com.google.common.base.Functions.constant;
import static com.google.common.base.Functions.identity;
import static com.google.common.collect.Sets.newHashSet;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Map; import java.util.Map;
@ -30,24 +26,12 @@ import org.testng.annotations.Test;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/** /**
* @author Adrian Cole * @author Adrian Cole
*/ */
@Test(groups = "unit") @Test(groups = "unit")
public class Maps2Test { public class Maps2Test {
public void testRenameKeyWhenNotFound() {
Map<String, String> nothing = ImmutableMap.of();
assertEquals(Maps2.renameKey(nothing, "foo", "bar"), nothing);
}
public void testRenameKeyWhenFound() {
Map<String, String> nothing = ImmutableMap.of("foo", "bar");
assertEquals(Maps2.renameKey(nothing, "foo", "bar"), ImmutableMap.of("bar", "bar"));
}
public void testTransformKeys() { public void testTransformKeys() {
Map<String, String> map = ImmutableMap.of("prefix:foo", "bar"); Map<String, String> map = ImmutableMap.of("prefix:foo", "bar");
@ -60,45 +44,4 @@ public class Maps2Test {
}), ImmutableMap.of("foo", "bar")); }), ImmutableMap.of("foo", "bar"));
} }
public void testFromKeysEmptyKeys() {
assertTrue(Maps2.fromKeys(ImmutableSet.of(), identity()).isEmpty(),
"Expected returned map to be empty");
}
@Test(expectedExceptions = { NullPointerException.class })
public void testFromKeysNullKey() {
Maps2.fromKeys(newHashSet((Object) null), constant("const"));
}
public void testFromKeys() {
// ImmutableMap doesn't support null values
Map<String, String> expected = Maps.newHashMap();
expected.put("foo", "foo");
expected.put("bar", "foo");
expected.put("baz", null);
assertEquals(Maps2.fromKeys(ImmutableSet.of("foo", "bar", "baz"),
new Function<String, String>() {
@Override
public String apply(String input) {
return (input.equals("baz") ? null : "foo");
}
}), expected);
}
@Test
public void testCovariantUniqueIndex() {
Iterable<Integer> values = Lists.newArrayList(1, 2, 3, 4, 5);
Map<Number, Number> map = Maps2.<Number, Number>uniqueIndex(values, new Function<Object, Double>() {
@Override
public Double apply(Object input) {
return (Integer)input + 0.1;
}
});
assertEquals(map.get(1.1), 1);
}
} }

View File

@ -1,96 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.util;
import static org.testng.Assert.assertEquals;
import java.util.regex.Matcher;
import org.testng.annotations.Test;
/**
* @author Adrian Cole
*/
@Test(groups = "unit")
public class PatternsTest {
public void testJSON_STRING_PATTERN1() {
Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("hello");
assert (matcher.find());
}
public void testJSON_STRING_PATTERN2() {
Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("hello world!");
assert (matcher.find());
}
public void testJSON_STRING_PATTERN3() {
Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("\"hello world!\"");
assert (!matcher.find());
}
public void testJSON_STRING_PATTERN4() {
Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("[hello world!]");
assert (!matcher.find());
}
public void testJSON_STRING_PATTERN5() {
Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("{hello world!}");
assert (!matcher.find());
}
public void testJSON_NUMBER_PATTERN1() {
Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("1");
assert (matcher.find());
}
public void testJSON_NUMBER_PATTERN2() {
Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("1.1");
assert (matcher.find());
}
public void testJSON_NUMBER_PATTERN3() {
Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("\"1.1\"");
assert (!matcher.find());
}
public void testJSON_NUMBER_PATTERN4() {
Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("\"1\"");
assert (!matcher.find());
}
public void testREST_CONTEXT_BUILDER() {
Matcher matcher = Patterns.REST_CONTEXT_BUILDER
.matcher("org.jclouds.rest.ContextBuilder<java.lang.String,java.lang.Integer>");
assert (matcher.find());
assertEquals(matcher.group(1), "org.jclouds.rest.ContextBuilder");
assertEquals(matcher.group(2), "java.lang.String");
assertEquals(matcher.group(3), "java.lang.Integer");
}
public void testREST_CONTEXT_BUILDERwithSpace() {
Matcher matcher = Patterns.REST_CONTEXT_BUILDER
.matcher("org.jclouds.rest.ContextBuilder<java.lang.String, java.lang.Integer>");
assert (matcher.find());
assertEquals(matcher.group(1), "org.jclouds.rest.ContextBuilder");
assertEquals(matcher.group(2), "java.lang.String");
assertEquals(matcher.group(3), "java.lang.Integer");
}
}

View File

@ -31,22 +31,6 @@ import com.google.common.collect.ImmutableMap;
public class Suppliers2Test { public class Suppliers2Test {
@Test
public void testWithKey() {
assertEquals(
Suppliers2.<String, String> valueForKey(
Suppliers.<Map<String, Supplier<String>>> ofInstance(ImmutableMap.of("foo",
Suppliers.ofInstance("bar"))), Suppliers.ofInstance("foo")).get(), "bar");
}
@Test
public void testWithKeyUnmatchedIsNull() {
assertEquals(
Suppliers2.<String, String> valueForKey(
Suppliers.<Map<String, Supplier<String>>> ofInstance(ImmutableMap.of("boo",
Suppliers.ofInstance("bar"))), Suppliers.ofInstance("foo")).get(), null);
}
@Test @Test
public void testGetLastValueInMap() { public void testGetLastValueInMap() {
assertEquals( assertEquals(

View File

@ -19,12 +19,10 @@
package org.jclouds.ssh.jsch; package org.jclouds.ssh.jsch;
import static com.google.common.base.Objects.equal; import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkArgument;
import java.util.Arrays;
import org.jclouds.domain.LoginCredentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.ssh.jsch.JschSshClient.Connection; import org.jclouds.ssh.jsch.JschSshClient.Connection;
import org.jclouds.util.CredentialUtils;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.net.HostAndPort; import com.google.common.net.HostAndPort;
@ -120,13 +118,10 @@ public class SessionConnection implements Connection<Session> {
if (loginCredentials.getPrivateKey() == null) { if (loginCredentials.getPrivateKey() == null) {
session.setPassword(loginCredentials.getPassword()); session.setPassword(loginCredentials.getPassword());
} else { } else {
checkArgument(!loginCredentials.getPrivateKey().contains("Proc-Type: 4,ENCRYPTED"),
"JschSshClientModule does not support private keys that require a passphrase");
byte[] privateKey = loginCredentials.getPrivateKey().getBytes(); byte[] privateKey = loginCredentials.getPrivateKey().getBytes();
if (CredentialUtils.isPrivateKeyEncrypted(privateKey)) { jsch.addIdentity(loginCredentials.getUser(), privateKey, null, emptyPassPhrase);
throw new IllegalArgumentException(
"JschSshClientModule does not support private keys that require a passphrase");
}
jsch.addIdentity(loginCredentials.getUser(), Arrays.copyOf(privateKey, privateKey.length), null,
emptyPassPhrase);
} }
java.util.Properties config = new java.util.Properties(); java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no"); config.put("StrictHostKeyChecking", "no");

View File

@ -68,10 +68,10 @@ import org.jclouds.rest.RestContext;
import org.jclouds.rest.Utils; import org.jclouds.rest.Utils;
import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.config.RestClientModule;
import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
import org.jclouds.util.Suppliers2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.inject.Provides; import com.google.inject.Provides;
@ -147,7 +147,7 @@ public class AbiquoRestClientModule extends RestClientModule<AbiquoApi, AbiquoAs
public Supplier<Map<Integer, Datacenter>> getAvailableRegionsIndexedById( public Supplier<Map<Integer, Datacenter>> getAvailableRegionsIndexedById(
final AtomicReference<AuthorizationException> authException, final AtomicReference<AuthorizationException> authException,
@Named(PROPERTY_SESSION_INTERVAL) final long seconds, @Memoized final Supplier<Enterprise> currentEnterprise) { @Named(PROPERTY_SESSION_INTERVAL) final long seconds, @Memoized final Supplier<Enterprise> currentEnterprise) {
Supplier<Map<Integer, Datacenter>> availableRegionsMapSupplier = Suppliers2.compose( Supplier<Map<Integer, Datacenter>> availableRegionsMapSupplier = Suppliers.compose(
new Function<List<Datacenter>, Map<Integer, Datacenter>>() { new Function<List<Datacenter>, Map<Integer, Datacenter>>() {
@Override @Override
public Map<Integer, Datacenter> apply(final List<Datacenter> datacenters) { public Map<Integer, Datacenter> apply(final List<Datacenter> datacenters) {

View File

@ -54,16 +54,16 @@ import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.DatacenterAndNam
import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.DatasetInDatacenter; import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.DatasetInDatacenter;
import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.MachineInDatacenter; import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.MachineInDatacenter;
import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.PackageInDatacenter; import org.jclouds.joyent.cloudapi.v6_5.domain.datacenterscoped.PackageInDatacenter;
import org.jclouds.util.Iterables2;
import org.jclouds.util.Suppliers2;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.inject.Injector; import com.google.inject.Injector;
@ -134,11 +134,11 @@ public class JoyentCloudComputeServiceContextModule extends
@Singleton @Singleton
protected Supplier<Map<String, Location>> createLocationIndexedById( protected Supplier<Map<String, Location>> createLocationIndexedById(
@Memoized Supplier<Set<? extends Location>> locations) { @Memoized Supplier<Set<? extends Location>> locations) {
return Suppliers2.compose(new Function<Set<? extends Location>, Map<String, Location>>() { return Suppliers.compose(new Function<Set<? extends Location>, Map<String, Location>>() {
@Override @Override
public Map<String, Location> apply(Set<? extends Location> arg0) { public Map<String, Location> apply(Set<? extends Location> arg0) {
return Maps.uniqueIndex(Iterables2.concreteCopy(arg0), new Function<Location, String>() { return Maps.uniqueIndex(ImmutableSet.<Location> copyOf(arg0), new Function<Location, String>() {
@Override @Override
public String apply(Location arg0) { public String apply(Location arg0) {

View File

@ -45,30 +45,30 @@ import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.annotations.Identity; import org.jclouds.rest.annotations.Identity;
import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.config.RestClientModule;
import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
import org.jclouds.savvis.vpdc.VPDCAsyncApi;
import org.jclouds.savvis.vpdc.VPDCApi; import org.jclouds.savvis.vpdc.VPDCApi;
import org.jclouds.savvis.vpdc.VPDCAsyncApi;
import org.jclouds.savvis.vpdc.domain.internal.VCloudSession; import org.jclouds.savvis.vpdc.domain.internal.VCloudSession;
import org.jclouds.savvis.vpdc.features.BrowsingAsyncApi;
import org.jclouds.savvis.vpdc.features.BrowsingApi; import org.jclouds.savvis.vpdc.features.BrowsingApi;
import org.jclouds.savvis.vpdc.features.FirewallAsyncApi; import org.jclouds.savvis.vpdc.features.BrowsingAsyncApi;
import org.jclouds.savvis.vpdc.features.FirewallApi; import org.jclouds.savvis.vpdc.features.FirewallApi;
import org.jclouds.savvis.vpdc.features.ServiceManagementAsyncApi; import org.jclouds.savvis.vpdc.features.FirewallAsyncApi;
import org.jclouds.savvis.vpdc.features.ServiceManagementApi; import org.jclouds.savvis.vpdc.features.ServiceManagementApi;
import org.jclouds.savvis.vpdc.features.VMAsyncApi; import org.jclouds.savvis.vpdc.features.ServiceManagementAsyncApi;
import org.jclouds.savvis.vpdc.features.VMApi; import org.jclouds.savvis.vpdc.features.VMApi;
import org.jclouds.savvis.vpdc.features.VMAsyncApi;
import org.jclouds.savvis.vpdc.handlers.VPDCErrorHandler; import org.jclouds.savvis.vpdc.handlers.VPDCErrorHandler;
import org.jclouds.savvis.vpdc.internal.LoginAsyncApi;
import org.jclouds.savvis.vpdc.internal.LoginApi; import org.jclouds.savvis.vpdc.internal.LoginApi;
import org.jclouds.savvis.vpdc.internal.LoginAsyncApi;
import org.jclouds.savvis.vpdc.internal.VCloudToken; import org.jclouds.savvis.vpdc.internal.VCloudToken;
import org.jclouds.savvis.vpdc.location.FirstNetwork; import org.jclouds.savvis.vpdc.location.FirstNetwork;
import org.jclouds.savvis.vpdc.predicates.TaskSuccess; import org.jclouds.savvis.vpdc.predicates.TaskSuccess;
import org.jclouds.util.Strings2; import org.jclouds.util.Strings2;
import org.jclouds.util.Suppliers2;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.inject.Injector; import com.google.inject.Injector;
@ -93,7 +93,7 @@ public class VPDCRestClientModule extends RestClientModule<VPDCApi, VPDCAsyncApi
@Provides @Provides
@Singleton @Singleton
protected Supplier<String> provideVCloudToken(Supplier<VCloudSession> cache) { protected Supplier<String> provideVCloudToken(Supplier<VCloudSession> cache) {
return Suppliers2.compose(new Function<VCloudSession, String>() { return Suppliers.compose(new Function<VCloudSession, String>() {
@Override @Override
public String apply(VCloudSession input) { public String apply(VCloudSession input) {
@ -108,7 +108,7 @@ public class VPDCRestClientModule extends RestClientModule<VPDCApi, VPDCAsyncApi
@Singleton @Singleton
protected Supplier<Set<org.jclouds.savvis.vpdc.domain.Resource>> provideOrgs(Supplier<VCloudSession> cache, protected Supplier<Set<org.jclouds.savvis.vpdc.domain.Resource>> provideOrgs(Supplier<VCloudSession> cache,
@Identity final String user) { @Identity final String user) {
return Suppliers2.compose(new Function<VCloudSession, Set<org.jclouds.savvis.vpdc.domain.Resource>>() { return Suppliers.compose(new Function<VCloudSession, Set<org.jclouds.savvis.vpdc.domain.Resource>>() {
@Override @Override
public Set<org.jclouds.savvis.vpdc.domain.Resource> apply(VCloudSession input) { public Set<org.jclouds.savvis.vpdc.domain.Resource> apply(VCloudSession input) {
@ -124,7 +124,7 @@ public class VPDCRestClientModule extends RestClientModule<VPDCApi, VPDCAsyncApi
@Singleton @Singleton
protected Supplier<String> provideDefaultOrgId( protected Supplier<String> provideDefaultOrgId(
@org.jclouds.savvis.vpdc.internal.Org Supplier<Set<org.jclouds.savvis.vpdc.domain.Resource>> orgs) { @org.jclouds.savvis.vpdc.internal.Org Supplier<Set<org.jclouds.savvis.vpdc.domain.Resource>> orgs) {
return Suppliers2.compose(new Function<Set<org.jclouds.savvis.vpdc.domain.Resource>, String>() { return Suppliers.compose(new Function<Set<org.jclouds.savvis.vpdc.domain.Resource>, String>() {
@Override @Override
public String apply(Set<org.jclouds.savvis.vpdc.domain.Resource> input) { public String apply(Set<org.jclouds.savvis.vpdc.domain.Resource> input) {

View File

@ -38,7 +38,6 @@ import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContext;
import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.config.RestClientModule;
import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.rest.internal.RestContextImpl;
import org.jclouds.util.Suppliers2;
import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi; import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi; import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi;
import org.jclouds.vcloud.director.v1_5.annotations.Login; import org.jclouds.vcloud.director.v1_5.annotations.Login;
@ -94,6 +93,7 @@ import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@ -172,7 +172,7 @@ public class VCloudDirectorRestClientModule extends RestClientModule<VCloudDirec
@Login @Login
protected Supplier<URI> loginUrl(@Provider Supplier<URI> provider) { protected Supplier<URI> loginUrl(@Provider Supplier<URI> provider) {
// TODO: technically, we should implement version api, but this will work // TODO: technically, we should implement version api, but this will work
return Suppliers2.compose(new Function<URI, URI>() { return Suppliers.compose(new Function<URI, URI>() {
@Override @Override
public URI apply(URI arg0) { public URI apply(URI arg0) {
@ -184,7 +184,7 @@ public class VCloudDirectorRestClientModule extends RestClientModule<VCloudDirec
@Provides @Provides
protected Supplier<Session> currentSession(Supplier<SessionWithToken> in) { protected Supplier<Session> currentSession(Supplier<SessionWithToken> in) {
return Suppliers2.compose(new Function<SessionWithToken, Session>() { return Suppliers.compose(new Function<SessionWithToken, Session>() {
@Override @Override
public Session apply(SessionWithToken arg0) { public Session apply(SessionWithToken arg0) {
@ -199,7 +199,7 @@ public class VCloudDirectorRestClientModule extends RestClientModule<VCloudDirec
@Singleton @Singleton
@org.jclouds.vcloud.director.v1_5.annotations.Session @org.jclouds.vcloud.director.v1_5.annotations.Session
protected Supplier<String> sessionToken(Supplier<SessionWithToken> in) { protected Supplier<String> sessionToken(Supplier<SessionWithToken> in) {
return Suppliers2.compose(new Function<SessionWithToken, String>() { return Suppliers.compose(new Function<SessionWithToken, String>() {
@Override @Override
public String apply(SessionWithToken arg0) { public String apply(SessionWithToken arg0) {

View File

@ -1,56 +0,0 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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.azureblob;
import java.net.URI;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import org.jclouds.azure.storage.filters.SharedKeyLiteAuthentication;
import org.jclouds.azure.storage.reference.AzureStorageHeaders;
import org.jclouds.blobstore.BlobStoreFallbacks.ThrowKeyNotFoundOn404;
import org.jclouds.http.functions.ParseContentMD5FromHeaders;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.Headers;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
/**
* Helper functions needed to to derive BlobStore values
* <p/>
*
* @see <a href="http://msdn.microsoft.com/en-us/library/dd135733.aspx" />
* @author Adrian Cole
*/
@RequestFilters(SharedKeyLiteAuthentication.class)
@Headers(keys = AzureStorageHeaders.VERSION, values = "2009-07-17")
public interface AzureBlobUtil {
@GET
@Headers(keys = "Range", values = "bytes=0-0")
// should use HEAD, this is a hack per http://code.google.com/p/jclouds/issues/detail?id=92
@ResponseParser(ParseContentMD5FromHeaders.class)
@Fallback(ThrowKeyNotFoundOn404.class)
@Path("{key}")
byte[] getMD5(@EndpointParam URI container, @PathParam("key") String key);
}