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