Add support for ignoring WIP and Private changes

Change-Id: I5b909346c65dbbeb68eed899e244cf8e8ede4f17
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/BackendModule.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/BackendModule.java
index c233d2b..fc98943 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/BackendModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/BackendModule.java
@@ -20,7 +20,9 @@
 import com.google.gerrit.extensions.annotations.Exports;
 import com.google.gerrit.extensions.config.CapabilityDefinition;
 import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.events.PrivateStateChangedListener;
 import com.google.gerrit.extensions.events.RevisionCreatedListener;
+import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.restapi.RestApiModule;
 import com.google.gerrit.server.change.ReviewerSuggestion;
@@ -59,6 +61,8 @@
           });
     } else {
       DynamicSet.bind(binder(), RevisionCreatedListener.class).to(Reviewers.class);
+      DynamicSet.bind(binder(), WorkInProgressStateChangedListener.class).to(Reviewers.class);
+      DynamicSet.bind(binder(), PrivateStateChangedListener.class).to(Reviewers.class);
     }
 
     factory(AddReviewersByConfiguration.Factory.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/Reviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/Reviewers.java
index 430a588..faa5088 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/Reviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/Reviewers.java
@@ -23,8 +23,10 @@
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.events.ChangeEvent;
+import com.google.gerrit.extensions.events.PrivateStateChangedListener;
 import com.google.gerrit.extensions.events.RevisionCreatedListener;
-import com.google.gerrit.extensions.events.RevisionEvent;
+import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
 import com.google.gerrit.index.query.QueryParseException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Change;
@@ -45,7 +47,11 @@
 import org.slf4j.LoggerFactory;
 
 @Singleton
-class Reviewers implements RevisionCreatedListener, ReviewerSuggestion {
+class Reviewers
+    implements RevisionCreatedListener,
+        PrivateStateChangedListener,
+        WorkInProgressStateChangedListener,
+        ReviewerSuggestion {
   private static final Logger log = LoggerFactory.getLogger(Reviewers.class);
 
   private final ReviewersResolver resolver;
@@ -80,6 +86,16 @@
   }
 
   @Override
+  public void onWorkInProgressStateChanged(WorkInProgressStateChangedListener.Event event) {
+    onEvent(event);
+  }
+
+  @Override
+  public void onPrivateStateChanged(PrivateStateChangedListener.Event event) {
+    onEvent(event);
+  }
+
+  @Override
   public Set<SuggestedReviewer> suggestReviewers(
       Project.NameKey projectName,
       @Nullable Change.Id changeId,
@@ -118,8 +134,14 @@
     return config.forProject(projectName).getReviewerFilterSections();
   }
 
-  private void onEvent(RevisionEvent event) {
+  private void onEvent(ChangeEvent event) {
     ChangeInfo c = event.getChange();
+    if (config.ignoreWip() && (c.workInProgress != null && c.workInProgress)) {
+      return;
+    }
+    if (config.ignorePrivate() && (c.isPrivate != null && c.isPrivate)) {
+      return;
+    }
     Project.NameKey projectName = new Project.NameKey(c.project);
 
     List<ReviewerFilterSection> sections = getSections(projectName);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfig.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfig.java
index 8b33070..b3e2ed2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/server/ReviewersConfig.java
@@ -44,12 +44,16 @@
   static final String KEY_REVIEWER = "reviewer";
   private static final String KEY_ENABLE_REST = "enableREST";
   private static final String KEY_SUGGEST_ONLY = "suggestOnly";
+  private static final String KEY_IGNORE_WIP = "ignoreWip";
+  private static final String KEY_IGNORE_PRIVATE = "ignorePrivate";
 
   private final PluginConfigFactory cfgFactory;
   private final String pluginName;
 
   private final boolean enableREST;
   private final boolean suggestOnly;
+  private final boolean ignoreWip;
+  private final boolean ignorePrivate;
 
   @Inject
   ReviewersConfig(PluginConfigFactory cfgFactory, @PluginName String pluginName) {
@@ -58,6 +62,8 @@
     Config cfg = cfgFactory.getGlobalPluginConfig(pluginName);
     this.enableREST = cfg.getBoolean(pluginName, null, KEY_ENABLE_REST, true);
     this.suggestOnly = cfg.getBoolean(pluginName, null, KEY_SUGGEST_ONLY, false);
+    this.ignoreWip = cfg.getBoolean(pluginName, null, KEY_IGNORE_WIP, true);
+    this.ignorePrivate = cfg.getBoolean(pluginName, null, KEY_IGNORE_PRIVATE, true);
   }
 
   public ForProject forProject(Project.NameKey projectName) {
@@ -79,6 +85,14 @@
     return suggestOnly;
   }
 
+  public boolean ignoreWip() {
+    return ignoreWip;
+  }
+
+  public boolean ignorePrivate() {
+    return ignorePrivate;
+  }
+
   static class ForProject extends VersionedMetaData {
     private Config cfg;
 
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 2c3627a..9180b16 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -8,6 +8,8 @@
   [reviewers]
     enableREST = true
     suggestOnly = false
+    ignoreWip = false
+    ignorePrivate = false
 ```
 
 reviewers.enableREST
@@ -21,6 +23,16 @@
 	the suggestions with a weight of 1. To force the suggestions higher in the
 	list, set a higher value (like 1000) in `addReviewer.@PLUGIN@-reviewer-suggestion.weight`
 	in `gerrit.config`.
+
+reviewers.ingoreWip
+:	Ignore changes in WIP state. When set to true changes in WIP state are not
+	considered when adding reviewers. Defaults to true. To enable adding
+	reviewers on changes in WIP state set this value to false.
+
+revewers.ignorePrivate
+:	Ignore changes in private state. When set to true changes in private state
+	are not considered when adding reviewers. Defaults to true. To enable
+	adding reviewers on changes in Private state set this value to false.
 Per project configuration of the @PLUGIN@ plugin is done in the
 `reviewers.config` file of the project. Missing values are inherited
 from the parent projects. This means a global default configuration can