Postpone retrieval of HttpSession

Obtain HttpSession when processor returns non-empty content.

Change-Id: I7104839adb4b4e898dc688631277274123bfaf7b
Signed-off-by: Jacek Centkowski <jcentkowski@collab.net>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
index f645dea..51d00ae 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
@@ -27,6 +27,7 @@
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.gerrit.server.events.ProjectEvent;
+import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
 import com.googlesource.gerrit.plugins.webhooks.HttpResponseHandler.HttpResult;
@@ -40,20 +41,27 @@
   }
 
   private final ScheduledThreadPoolExecutor executor;
-  private final HttpSession session;
+  private final Supplier<HttpSession> session;
   private final RemoteConfig remote;
   private final Supplier<Optional<EventProcessor.Request>> processor;
   private int execCnt;
 
   @AssistedInject
   public PostTask(@WebHooksExecutor ScheduledThreadPoolExecutor executor,
-      HttpSession session,
+      final Provider<HttpSession> session,
       final EventProcessor processor,
       @Assisted final ProjectEvent event,
       @Assisted final RemoteConfig remote) {
     this.executor = executor;
-    this.session = session;
     this.remote = remote;
+    // postpone creation of HttpSession so that it is obtained only when processor
+    // returns non-empty content
+    this.session = Suppliers.memoize(new Supplier<HttpSession>() {
+      @Override
+      public HttpSession get() {
+        return session.get();
+      }
+    });
     this.processor = Suppliers.memoize(new Supplier<Optional<EventProcessor.Request>>() {
       @Override
       public Optional<EventProcessor.Request> get() {
@@ -80,7 +88,7 @@
       }
 
       execCnt++;
-      HttpResult result = session.post(remote, content.get());
+      HttpResult result = session.get().post(remote, content.get());
       if (!result.successful && execCnt < remote.getMaxTries()) {
         logRetry(result.message);
         reschedule();
diff --git a/src/test/java/com/googlesource/gerrit/plugins/webhooks/PostTaskTest.java b/src/test/java/com/googlesource/gerrit/plugins/webhooks/PostTaskTest.java
index 8692ab7..72dd96d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/webhooks/PostTaskTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/webhooks/PostTaskTest.java
@@ -22,6 +22,7 @@
 
 import com.google.common.base.Optional;
 import com.google.gerrit.server.events.ProjectCreatedEvent;
+import com.google.inject.util.Providers;
 import java.io.IOException;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -75,7 +76,7 @@
     when(remote.getMaxTries()).thenReturn(MAX_TRIES);
     when(remote.getUrl()).thenReturn(WEBHOOK_URL);
     when(processor.process(eq(projectCreated), eq(remote))).thenReturn(Optional.of(content));
-    task = new PostTask(executor, session, processor, projectCreated, remote);
+    task = new PostTask(executor, Providers.of(session), processor, projectCreated, remote);
   }
 
   @Test