Handle NPE more gracefully, consolidate modules in AutomergerModule

Change-Id: Ia5f9c3abf1cfbe8e1b864140f9d393f6e2b4f1a5
diff --git a/BUCK b/BUCK
index bde84db..95b0c44 100644
--- a/BUCK
+++ b/BUCK
@@ -7,8 +7,7 @@
   resources = glob(['src/main/**/*']),
   manifest_entries = [
     'Gerrit-PluginName: automerger',
-    'Gerrit-Module: com.googlesource.gerrit.plugins.automerger.Module',
-    'Gerrit-HttpModule: com.googlesource.gerrit.plugins.automerger.HttpModule',
+    'Gerrit-Module: com.googlesource.gerrit.plugins.automerger.AutomergerModule',
     'Implementation-Title: Automerger plugin',
     'Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/automerger',
   ],
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 d09a9f9..8c49cf4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
@@ -55,6 +55,10 @@
     Map<String, Boolean> branchMap = input.branchMap;
 
     Change change = rev.getChange();
+    if (branchMap == null) {
+      log.debug("Branch map is empty for change {}", change.getKey().get());
+      return Response.none();
+    }
     String revision = rev.getPatchSet().getRevision().get();
 
     MultipleDownstreamMergeInput mdsMergeInput = new MultipleDownstreamMergeInput();
@@ -66,6 +70,8 @@
     mdsMergeInput.obsoleteRevision = revision;
     mdsMergeInput.currentRevision = revision;
 
+    log.debug("Multiple downstream merge input: {}", mdsMergeInput.dsBranchMap);
+
     dsCreator.createMergesAndHandleConflicts(mdsMergeInput);
     return Response.none();
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/Module.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergerModule.java
similarity index 88%
rename from src/main/java/com/googlesource/gerrit/plugins/automerger/Module.java
rename to src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergerModule.java
index 6020eb4..cfca211 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergerModule.java
@@ -24,9 +24,11 @@
 import com.google.gerrit.extensions.events.TopicEditedListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.extensions.webui.JavaScriptPlugin;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
 import com.google.inject.AbstractModule;
 
-public class Module extends AbstractModule {
+public class AutomergerModule extends AbstractModule {
 
   @Override
   protected void configure() {
@@ -44,5 +46,6 @@
             post(REVISION_KIND, "config-downstream").to(ConfigDownstreamAction.class);
           }
         });
+    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin("automerger.js"));
   }
 }
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 8c0e4cb..e203ec3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
@@ -114,6 +114,7 @@
       applyConfig(projectSet, config.getMergeConfig(fromBranch));
       applyConfig(projectSet, config.getMergeConfig(fromBranch, toBranch));
 
+      log.debug("Project set for {} to {} is {}", fromBranch, toBranch, projectSet);
       return projectSet;
     } catch (RestApiException | IOException e) {
       log.error("Error reading manifest for {}!", fromBranch, e);
@@ -152,6 +153,9 @@
   // If manifest does not exist, return empty set.
   private Set<String> getManifestProjects(String fromBranch) throws RestApiException, IOException {
     Map fromBranchConfig = config.getMergeConfig(fromBranch);
+    if (fromBranchConfig == null) {
+      return new HashSet<>();
+    }
     Map<String, String> manifestProjectInfo = getManifestInfoFromConfig(fromBranchConfig);
     return getManifestProjectsForBranch(manifestProjectInfo, fromBranch);
   }
@@ -161,6 +165,9 @@
   private Set<String> getManifestProjects(String fromBranch, String toBranch)
       throws RestApiException, IOException {
     Map<String, Object> toBranchConfig = config.getMergeConfig(fromBranch, toBranch);
+    if (toBranchConfig == null) {
+      return new HashSet<>();
+    }
     Map<String, String> manifestProjectInfo = getManifestInfoFromConfig(toBranchConfig);
     return getManifestProjectsForBranch(manifestProjectInfo, toBranch);
   }
@@ -175,11 +182,15 @@
       ManifestReader manifestReader = new ManifestReader(branch, manifestConfig.asString());
       return manifestReader.getProjects();
     } catch (ResourceNotFoundException e) {
+      log.info("Manifest for {} not found", branch);
       return new HashSet<>();
     }
   }
 
   private void applyConfig(Set<String> projects, Map givenConfig) {
+    if (givenConfig == null) {
+      return;
+    }
     if (givenConfig.containsKey("set_projects")) {
       List<String> setProjects = (ArrayList<String>) givenConfig.get("set_projects");
       projects.clear();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/HttpModule.java
deleted file mode 100644
index 30887d9..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/HttpModule.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.googlesource.gerrit.plugins.automerger;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.webui.JavaScriptPlugin;
-import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.inject.AbstractModule;
-
-public class HttpModule extends AbstractModule {
-  @Override
-  protected void configure() {
-    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin("automerger.js"));
-  }
-}