Fix user lookup to take into account contextUserId.

The previous commit broke lookups of contextUserId and failed unit
tests.

Change-Id: I6ce8d5213a6797195acc19ecf4f4f2ff154f9c38
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
index 6b5769e..dad77dc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
@@ -77,7 +77,7 @@
     mdsMergeInput.changeNumber = change.getId().get();
     mdsMergeInput.patchsetNumber = rev.getPatchSet().number();
     mdsMergeInput.project = change.getProject().get();
-    mdsMergeInput.topic = dsCreator.getOrSetTopic(change.getId().get(), change.getTopic(), user.get().getAccountId());
+    mdsMergeInput.topic = dsCreator.getOrSetTopic(change.getId().get(), change.getTopic(), config.getContextUserId());
     mdsMergeInput.subject = change.getSubject();
     mdsMergeInput.obsoleteRevision = revision;
     mdsMergeInput.currentRevision = revision;
@@ -85,7 +85,7 @@
     logger.atFine().log("Multiple downstream merge input: %s", mdsMergeInput.dsBranchMap);
 
     try {
-      dsCreator.createMergesAndHandleConflicts(mdsMergeInput, user.get().getAccountId());
+      dsCreator.createMergesAndHandleConflicts(mdsMergeInput, config.getContextUserId());
     } catch (ConfigInvalidException e) {
       throw new ResourceConflictException(
           "Automerger configuration file is invalid: " + e.getMessage());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
index 4d6dd8b..5845f59 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
@@ -298,12 +298,20 @@
     return getConfig().getBoolean("global", "disableMinAutomergeVote", false);
   }
 
-  public Account.Id getContextUserId() throws ConfigInvalidException {
+  public Account.Id getContextUserId(CurrentUser currentUser) throws ConfigInvalidException {
     int contextUserId = getConfig().getInt("global", "contextUserId", -1);
     if (contextUserId > 0) {
       return Account.id(contextUserId);
     }
-    return user.get().getAccountId();
+    // Use the Guice injected user if one isn't provided.
+    if(currentUser == null)
+      return user.get().getAccountId();
+
+    return currentUser.getAccountId();
+  }
+
+  public Account.Id getContextUserId() throws ConfigInvalidException {
+    return getContextUserId(null);
   }
 
   /**
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
index 8d56664..d46f242 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
@@ -115,7 +115,14 @@
     CurrentUser user = this.user.get();
     @SuppressWarnings("unused")
     Future<?> ignored =
-        executorService.submit(() -> onChangeAbandonedImpl(change, event.getRevision()._number, user.getAccountId()));
+        executorService.submit(() -> {
+          try {
+            onChangeAbandonedImpl(change, event.getRevision()._number, config.getContextUserId(user));
+          } catch (ConfigInvalidException | UnsupportedOperationException e) {
+            logger.atSevere().withCause(e).log(
+                "Automerger plugin failed onChangeAbandoned for %s", change.id);
+          }
+        });
   }
 
   private void onChangeAbandonedImpl(ChangeInfo change, int revisionNumber, Account.Id accountId) {
@@ -141,7 +148,14 @@
     String oldTopic = event.getOldTopic();
     CurrentUser user = this.user.get();
     @SuppressWarnings("unused")
-    Future<?> ignored = executorService.submit(() -> onTopicEditedImpl(change, oldTopic, user.getAccountId()));
+    Future<?> ignored = executorService.submit(() -> {
+      try {
+        onTopicEditedImpl(change, oldTopic, config.getContextUserId(user));
+      } catch (ConfigInvalidException | UnsupportedOperationException e) {
+        logger.atSevere().withCause(e).log(
+            "Automerger plugin failed onTopicEdited for %s", change.id);
+      }
+    });
   }
 
   private void onTopicEditedImpl(ChangeInfo eventChange, String oldTopic, Account.Id accountId) {
@@ -225,7 +239,14 @@
     RevisionInfo eventRevision = deepCopy(event.getRevision());
     CurrentUser user = this.user.get();
     @SuppressWarnings("unused")
-    Future<?> ignored = executorService.submit(() -> onCommentAddedImpl(change, eventRevision, user.getAccountId()));
+    Future<?> ignored = executorService.submit(() -> {
+      try {
+        onCommentAddedImpl(change, eventRevision, config.getContextUserId(user));
+      } catch (ConfigInvalidException | UnsupportedOperationException e) {
+        logger.atSevere().withCause(e).log(
+            "Automerger plugin failed onCommentAdded for %s", change.id);
+      }
+    });
   }
 
   private void onCommentAddedImpl(ChangeInfo change, RevisionInfo eventRevision, Account.Id accountId) {
@@ -289,7 +310,14 @@
     RevisionInfo revision = deepCopy(event.getRevision());
     CurrentUser user = this.user.get();
     @SuppressWarnings("unused")
-    Future<?> ignored = executorService.submit(() -> onChangeRestoredImpl(change, revision, user.getAccountId()));
+    Future<?> ignored = executorService.submit(() -> {
+      try {
+        onChangeRestoredImpl(change, revision, config.getContextUserId(user));
+      } catch (ConfigInvalidException | UnsupportedOperationException e) {
+        logger.atSevere().withCause(e).log(
+            "Automerger plugin failed onChangeRestored for %s", change.id);
+      }
+    });
   }
 
   private void onChangeRestoredImpl(ChangeInfo change, RevisionInfo revision, Account.Id accountId) {
@@ -315,8 +343,16 @@
     ChangeInfo change = deepCopy(event.getChange());
     RevisionInfo revision = deepCopy(event.getRevision());
     CurrentUser user = this.user.get();
+
     @SuppressWarnings("unused")
-    Future<?> ignored = executorService.submit(() -> onRevisionCreatedImpl(change, revision, user.getAccountId()));
+    Future<?> ignored = executorService.submit(() -> {
+      try {
+        onRevisionCreatedImpl(change, revision, config.getContextUserId(user));
+      } catch (ConfigInvalidException | UnsupportedOperationException e) {
+        logger.atSevere().withCause(e).log(
+            "Automerger plugin failed onRevisionCreated for %s", change.id);
+      }
+    });
   }
 
   public void onRevisionCreatedImpl(ChangeInfo change, RevisionInfo revision, Account.Id accountId) {