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 45c42a0..54e9249 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
@@ -17,6 +17,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;
@@ -36,7 +37,7 @@
   }
 
   private final ScheduledExecutorService executor;
-  private final HttpSession session;
+  private final Supplier<HttpSession> session;
   private final RemoteConfig remote;
   private final Supplier<Optional<EventProcessor.Request>> processor;
   private int execCnt;
@@ -44,13 +45,15 @@
   @AssistedInject
   public PostTask(
       @WebHooksExecutor ScheduledExecutorService executor,
-      HttpSession session,
+      Provider<HttpSession> session,
       EventProcessor processor,
       @Assisted ProjectEvent event,
       @Assisted 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(() -> session.get());
     this.processor = Suppliers.memoize(() -> processor.process(event, remote));
   }
 
@@ -72,7 +75,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 e602177..4529409 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/webhooks/PostTaskTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/webhooks/PostTaskTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.Mockito.when;
 
 import com.google.gerrit.server.events.ProjectCreatedEvent;
+import com.google.inject.util.Providers;
 import com.googlesource.gerrit.plugins.webhooks.HttpResponseHandler.HttpResult;
 import java.io.IOException;
 import java.util.Optional;
@@ -66,7 +67,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