Update reviewers on DraftPublishedEvent

It is requested by our Gerrit users that reviewers are added only
for non-draft changes. This can be partially achieved by

[filter "-status:draft"]

However, when the draft is published the reviewers is not added
automatically.

To work this around, we suggested our users to create another
patchset and then the reviewers will be added.

This change addresses this issue. It will update reviewers on
DraftPublishedEvent too.

Change-Id: I9693603846c17c78179688c0614d8fa5b88f7df1
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java
index e1be2c8..2281997 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java
@@ -33,6 +33,7 @@
 import com.google.gerrit.server.account.AccountByEmailCache;
 import com.google.gerrit.server.account.AccountResolver;
 import com.google.gerrit.server.account.GroupMembers;
+import com.google.gerrit.server.events.DraftPublishedEvent;
 import com.google.gerrit.server.events.Event;
 import com.google.gerrit.server.events.PatchSetCreatedEvent;
 import com.google.gerrit.server.git.GitRepositoryManager;
@@ -114,11 +115,22 @@
 
   @Override
   public void onEvent(Event event) {
-    if (!(event instanceof PatchSetCreatedEvent)) {
-      return;
+    if (event instanceof PatchSetCreatedEvent) {
+      PatchSetCreatedEvent e = (PatchSetCreatedEvent) event;
+      onEvent(new Project.NameKey(e.change.project),
+          Integer.parseInt(e.change.number),
+          Integer.parseInt(e.patchSet.number), e.uploader.email);
+    } else if (event instanceof DraftPublishedEvent) {
+      DraftPublishedEvent e = (DraftPublishedEvent) event;
+      onEvent(new Project.NameKey(e.change.project),
+          Integer.parseInt(e.change.number),
+          Integer.parseInt(e.patchSet.number), e.uploader.email);
     }
-    PatchSetCreatedEvent e = (PatchSetCreatedEvent) event;
-    Project.NameKey projectName = new Project.NameKey(e.change.project);
+  }
+
+  private void onEvent(Project.NameKey projectName, int changeNumber,
+      int patchSetNumber, String email) {
+
     // TODO(davido): we have to cache per project configuration
     ReviewersConfig config = configFactory.create(projectName);
     List<ReviewerFilterSection> sections = config.getReviewerFilterSections();
@@ -130,9 +142,9 @@
     try (Repository git = repoManager.openRepository(projectName);
         RevWalk rw = new RevWalk(git);
         ReviewDb reviewDb = schemaFactory.open()) {
-      Change.Id changeId = new Change.Id(Integer.parseInt(e.change.number));
+      Change.Id changeId = new Change.Id(changeNumber);
       PatchSet.Id psId =
-          new PatchSet.Id(changeId, Integer.parseInt(e.patchSet.number));
+          new PatchSet.Id(changeId, patchSetNumber);
       PatchSet ps = reviewDb.patchSets().get(psId);
       if (ps == null) {
         log.warn("Patch set " + psId.get() + " not found.");
@@ -152,7 +164,7 @@
 
       final Runnable task =
           reviewersFactory.create(change,
-              toAccounts(reviewers, projectName, e.uploader.email));
+              toAccounts(reviewers, projectName, email));
 
       workQueue.getDefaultQueue().submit(new Runnable() {
         @Override