Repository: jclouds
Updated Branches:
  refs/heads/master 0f6ab3944 -> 40f31786c


http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java
 
b/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java
index 868e726..8b5a954 100644
--- 
a/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java
+++ 
b/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java
@@ -21,22 +21,26 @@ import static 
com.google.common.util.concurrent.Atomics.newReference;
 import static org.testng.Assert.assertEquals;
 
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.jclouds.rest.AuthorizationException;
 import 
org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.SetAndThrowAuthorizationExceptionSupplierBackedLoader;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
 import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.common.util.concurrent.Uninterruptibles;
 
 @Test(groups = "unit", testName = 
"MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest")
 public class MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest {
    @Test
    public void testLoaderNormal() {
       AtomicReference<AuthorizationException> authException = newReference();
-      assertEquals(new 
SetAndThrowAuthorizationExceptionSupplierBackedLoader<String>(ofInstance("foo"),
-            authException).load("KEY").get(), "foo");
+      assertEquals(new 
SetAndThrowAuthorizationExceptionSupplierBackedLoader<String>(ofInstance("foo"),
 authException, new 
ValueLoadedCallback.NoOpCallback<String>()).load("KEY").get(), "foo");
       assertEquals(authException.get(), null);
    }
 
@@ -48,7 +52,7 @@ public class 
MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest {
             public String get() {
                throw new AuthorizationException();
             }
-         }, authException).load("KEY");
+         }, authException, new 
ValueLoadedCallback.NoOpCallback<String>()).load("KEY");
       } finally {
          assertEquals(authException.get().getClass(), 
AuthorizationException.class);
       }
@@ -62,7 +66,7 @@ public class 
MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest {
             public String get() {
                throw new RuntimeException(new ExecutionException(new 
AuthorizationException()));
             }
-         }, authException).load("KEY");
+         }, authException, new 
ValueLoadedCallback.NoOpCallback<String>()).load("KEY");
       } finally {
          assertEquals(authException.get().getClass(), 
AuthorizationException.class);
       }
@@ -76,7 +80,7 @@ public class 
MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest {
             public String get() {
                throw new UncheckedExecutionException(new 
AuthorizationException());
             }
-         }, authException).load("KEY");
+         }, authException, new 
ValueLoadedCallback.NoOpCallback<String>()).load("KEY");
       } finally {
          assertEquals(authException.get().getClass(), 
AuthorizationException.class);
       }
@@ -90,9 +94,43 @@ public class 
MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest {
             public String get() {
                throw new RuntimeException(new IllegalArgumentException("foo"));
             }
-         }, authException).load("KEY");
+         }, authException, new 
ValueLoadedCallback.NoOpCallback<String>()).load("KEY");
       } finally {
          assertEquals(authException.get().getClass(), RuntimeException.class);
       }
    }
+
+   @Test
+   public void testLoaderNotifiesAfterReloading() {
+      AtomicReference<AuthorizationException> authException = newReference();
+      ValueLoadedEventHandler handler = new ValueLoadedEventHandler();
+
+      Supplier<String> supplier = 
MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException,
+            Suppliers.<String> ofInstance("foo"), 3, TimeUnit.SECONDS, 
handler);
+
+      // The supplier loads the value initially and returns the cached values
+      assertEquals(handler.count.get(), 0);
+      supplier.get();
+      assertEquals(handler.count.get(), 1);
+      supplier.get();
+      assertEquals(handler.count.get(), 1);
+      
+      // Once expired, it reloads the values, notified the event, and updated 
the cache
+      Uninterruptibles.sleepUninterruptibly(4, TimeUnit.SECONDS);
+      supplier.get();
+      assertEquals(handler.count.get(), 2);
+      supplier.get();
+      assertEquals(handler.count.get(), 2);
+      supplier.get();
+      assertEquals(handler.count.get(), 2);
+   }
+
+   static class ValueLoadedEventHandler implements ValueLoadedCallback<String>{
+      AtomicInteger count = new AtomicInteger(0);
+
+      @Override
+      public void valueLoaded(Optional<String> value) {
+         count.incrementAndGet();
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
index 160c37f..aca7141 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
@@ -27,8 +27,6 @@ import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.compute.strategy.GetImageStrategy;
-import org.jclouds.compute.suppliers.ImageCacheSupplier;
 import org.jclouds.domain.Location;
 import org.jclouds.ec2.compute.domain.RegionAndName;
 import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl;
@@ -40,11 +38,11 @@ public class AWSEC2TemplateBuilderImpl extends 
EC2TemplateBuilderImpl {
 
    @Inject
    protected AWSEC2TemplateBuilderImpl(@Memoized Supplier<Set<? extends 
Location>> locations,
-         ImageCacheSupplier images, @Memoized Supplier<Set<? extends 
Hardware>> sizes,
+         @Memoized Supplier<Set<? extends Image>> images, @Memoized 
Supplier<Set<? extends Hardware>> sizes,
          Supplier<Location> defaultLocation, @Named("DEFAULT") 
Provider<TemplateOptions> optionsProvider,
-         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, 
GetImageStrategy getImageStrategy,
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider,
          Supplier<LoadingCache<RegionAndName, ? extends Image>> imageMap) {
-      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider, getImageStrategy, imageMap);
+      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider, imageMap);
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java
index 4d3d6c9..e1a184f 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java
@@ -16,14 +16,11 @@
  */
 package org.jclouds.aws.ec2.compute.config;
 
-import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
-
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicReference;
 
-import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.jclouds.aws.ec2.compute.AWSEC2TemplateBuilderImpl;
@@ -38,8 +35,6 @@ import 
org.jclouds.aws.ec2.compute.strategy.CreateKeyPairPlacementAndSecurityGro
 import org.jclouds.aws.ec2.compute.suppliers.AWSEC2HardwareSupplier;
 import org.jclouds.compute.config.BaseComputeServiceContextModule;
 import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.extensions.ImageExtension;
-import org.jclouds.compute.extensions.SecurityGroupExtension;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.ec2.compute.config.EC2BindComputeStrategiesByClass;
 import org.jclouds.ec2.compute.domain.RegionAndName;
@@ -59,7 +54,6 @@ import 
org.jclouds.ec2.compute.suppliers.RegionAndNameToImageSupplier;
 import org.jclouds.rest.AuthorizationException;
 import org.jclouds.rest.suppliers.SetAndThrowAuthorizationExceptionSupplier;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.base.Throwables;
@@ -107,9 +101,8 @@ public class AWSEC2ComputeServiceContextModule extends 
BaseComputeServiceContext
    // duplicates EC2ComputeServiceContextModule; but that's easiest thing to 
do with guice; could extract to common util
    // TODO: have a another look at this (Adrian)
    @Override
-   protected Supplier<Set<? extends Image>> supplyNonParsingImageCache(
-            AtomicReference<AuthorizationException> authException, 
@Named(PROPERTY_SESSION_INTERVAL) long seconds,
-            final Supplier<Set<? extends Image>> imageSupplier, Injector 
injector) {
+   protected Supplier<Set<? extends Image>> supplyNonParsingImages(final 
Supplier<Set<? extends Image>> imageSupplier,
+         Injector injector) {
       final Supplier<LoadingCache<RegionAndName, ? extends Image>> cache = 
injector.getInstance(Key
                .get(new TypeLiteral<Supplier<LoadingCache<RegionAndName, ? 
extends Image>>>() {
                }));
@@ -170,14 +163,4 @@ public class AWSEC2ComputeServiceContextModule extends 
BaseComputeServiceContext
    protected TemplateOptions provideTemplateOptions(Injector injector, 
TemplateOptions options) {
       return 
options.as(EC2TemplateOptions.class).userData("#cloud-config\nrepo_upgrade: 
none\n".getBytes());
    }
-
-   @Override
-   protected Optional<ImageExtension> provideImageExtension(Injector i) {
-      return Optional.of(i.getInstance(ImageExtension.class));
-   }
-
-   @Override
-   protected Optional<SecurityGroupExtension> 
provideSecurityGroupExtension(Injector i) {
-      return Optional.of(i.getInstance(SecurityGroupExtension.class));
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java
 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java
index ef0d539..2f6b962 100644
--- 
a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java
+++ 
b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java
@@ -21,7 +21,8 @@ import static com.google.common.collect.Iterables.transform;
 import org.jclouds.aws.ec2.AWSEC2Api;
 import org.jclouds.aws.util.AWSUtils;
 import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.extensions.internal.BaseImageExtensionLiveTest;
+import org.jclouds.compute.extensions.ImageExtension;
+import org.jclouds.ec2.compute.extensions.EC2ImageExtensionLiveTest;
 import org.jclouds.ec2.compute.functions.EC2ImageParser;
 import org.jclouds.ec2.options.DescribeImagesOptions;
 import org.jclouds.sshj.config.SshjSshClientModule;
@@ -33,7 +34,7 @@ import com.google.inject.Module;
  * Live test for aws-ec2 {@link ImageExtension} implementation
  */
 @Test(groups = "live", singleThreaded = true, testName = 
"AWSEC2ImageExtensionLiveTest")
-public class AWSEC2ImageExtensionLiveTest extends BaseImageExtensionLiveTest {
+public class AWSEC2ImageExtensionLiveTest extends EC2ImageExtensionLiveTest {
 
    public AWSEC2ImageExtensionLiveTest() {
       provider = "aws-ec2";

http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
----------------------------------------------------------------------
diff --git 
a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
 
b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
index 4951b05..baaec3f 100644
--- 
a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
+++ 
b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
@@ -25,26 +25,14 @@ import static 
org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperti
 import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
 import static org.jclouds.util.Predicates2.retry;
 
-import javax.inject.Named;
-import javax.inject.Singleton;
 import java.net.URI;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMap;
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.Memoized;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.ComputeServiceAdapter;
@@ -53,8 +41,6 @@ import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.OperatingSystem;
 import org.jclouds.compute.domain.OsFamily;
-import org.jclouds.compute.extensions.ImageExtension;
-import org.jclouds.compute.extensions.SecurityGroupExtension;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.domain.Location;
 import org.jclouds.domain.LoginCredentials;
@@ -80,6 +66,19 @@ import org.jclouds.googlecomputeengine.domain.Operation;
 import org.jclouds.location.suppliers.ImplicitLocationSupplier;
 import org.jclouds.location.suppliers.implicit.FirstZone;
 
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.Injector;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+
 public final class GoogleComputeEngineServiceContextModule
       extends ComputeServiceAdapterContextModule<Instance, MachineType, Image, 
Location> {
 
@@ -197,15 +196,6 @@ public final class GoogleComputeEngineServiceContextModule
       return CacheBuilder.newBuilder().build(in);
    }
 
-
-   @Override protected Optional<ImageExtension> provideImageExtension(Injector 
i) {
-      return Optional.absent();
-   }
-
-   @Override protected Optional<SecurityGroupExtension> 
provideSecurityGroupExtension(Injector i) {
-      return Optional.absent();
-   }
-
    private static final Map<Instance.Status, NodeMetadata.Status> 
toPortableNodeStatus =
          ImmutableMap.<Instance.Status, NodeMetadata.Status>builder()
                      .put(Instance.Status.PROVISIONING, 
NodeMetadata.Status.PENDING)

Reply via email to