Add handling of DraftPublishedEvent

Change-Id: I7d5d74f1d64d32a654f77375f90f42077ad055fb
diff --git a/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractor.java b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractor.java
index fe69773..77ef563 100644
--- a/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractor.java
+++ b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractor.java
@@ -26,6 +26,7 @@
 import com.google.gerrit.server.events.ChangeMergedEvent;
 import com.google.gerrit.server.events.ChangeRestoredEvent;
 import com.google.gerrit.server.events.CommentAddedEvent;
+import com.google.gerrit.server.events.DraftPublishedEvent;
 import com.google.gerrit.server.events.PatchSetCreatedEvent;
 import com.google.gerrit.server.events.RefUpdatedEvent;
 import com.google.inject.Inject;
@@ -104,6 +105,18 @@
         event.patchSet.revision, patchSetId);
   }
 
+  private Map<String,Set<String>> extractFrom(DraftPublishedEvent event,
+      Set<Property> common) {
+    common.add(propertyFactory.create("event-type", event.type));
+    common.addAll(propertyAttributeExtractor.extractFrom(event.change));
+    common.addAll(propertyAttributeExtractor.extractFrom(event.patchSet));
+    common.addAll(propertyAttributeExtractor.extractFrom(event.uploader, "uploader"));
+    PatchSet.Id patchSetId = newPatchSetId(event.change.number,
+        event.patchSet.number);
+    return issueExtractor.getIssueIds(event.change.project,
+        event.patchSet.revision, patchSetId);
+  }
+
   private Map<String,Set<String>> extractFrom(RefUpdatedEvent event,
       Set<Property> common) {
     common.add(propertyFactory.create("event-type", event.type));
@@ -199,6 +212,8 @@
       associations = extractFrom((ChangeRestoredEvent) event, common);
     } else if (event instanceof CommentAddedEvent) {
       associations = extractFrom((CommentAddedEvent) event, common);
+    } else if (event instanceof DraftPublishedEvent) {
+      associations = extractFrom((DraftPublishedEvent) event, common);
     } else if (event instanceof PatchSetCreatedEvent) {
       associations = extractFrom((PatchSetCreatedEvent) event, common);
     } else if (event instanceof RefUpdatedEvent) {
diff --git a/hooks-its/src/main/resources/Documentation/config.md b/hooks-its/src/main/resources/Documentation/config.md
index 2745d9c..2593171 100644
--- a/hooks-its/src/main/resources/Documentation/config.md
+++ b/hooks-its/src/main/resources/Documentation/config.md
@@ -168,6 +168,7 @@
 * <<event-properties-ChangeMergedEvent,ChangeMergedEvent>>
 * <<event-properties-ChangeRestoredEvent,ChangeRestoredEvent>>
 * <<event-properties-CommentAddedEvent,CommentAddedEvent>>
+* <<event-properties-DraftPublishedEvent,DraftPublishedEvent>>
 * <<event-properties-PatchSetCreatedEvent,PatchSetCreatedEvent>>
 * <<event-properties-RefUpdatedEvent,RefUpdatedEvent>>
 * <<event-properties-change,Common properties for events on a change>>
@@ -270,6 +271,19 @@
 added for, and it's most recent <<event-properties-patch-set,patch
 set>>.
 
+[[event-properties-DraftPublishedEvent]]
+DraftPublishedEvent
+^^^^^^^^^^^^^^^^^^^
+
+'event'::
+  +com.google.gerrit.server.events.DraftPublishedEvent+
+'event-type'::
+  +draft-published+
+
+In addition to the above properties, the event also provides
+properties for the uploaded <<event-properties-patch-set,patch set>>,
+and the <<event-properties-change,change>> it belongs to.
+
 [[event-properties-PatchSetCreatedEvent]]
 PatchSetCreatedEvent
 ^^^^^^^^^^^^^^^^^^^
diff --git a/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractorTest.java b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractorTest.java
index 421038d..dda4173 100644
--- a/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractorTest.java
+++ b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/PropertyExtractorTest.java
@@ -33,6 +33,7 @@
 import com.google.gerrit.server.events.ChangeMergedEvent;
 import com.google.gerrit.server.events.ChangeRestoredEvent;
 import com.google.gerrit.server.events.CommentAddedEvent;
+import com.google.gerrit.server.events.DraftPublishedEvent;
 import com.google.gerrit.server.events.PatchSetCreatedEvent;
 import com.google.gerrit.server.events.RefUpdatedEvent;
 import com.google.inject.Guice;
@@ -276,6 +277,41 @@
     eventHelper(event, "CommentAddedEvent", "comment-added", common, true);
   }
 
+  public void testDraftPublishedEvent() {
+    DraftPublishedEvent event = new DraftPublishedEvent();
+
+    ChangeAttribute changeAttribute = createMock(ChangeAttribute.class);
+    event.change = changeAttribute;
+    Property propertyChange = createMock(Property.class);
+    expect(propertyAttributeExtractor.extractFrom(changeAttribute))
+        .andReturn(Sets.newHashSet(propertyChange));
+
+    AccountAttribute accountAttribute = createMock(AccountAttribute.class);
+    event.uploader = accountAttribute;
+    Property propertySubmitter = createMock(Property.class);
+    expect(propertyAttributeExtractor.extractFrom(accountAttribute,
+        "uploader")).andReturn(Sets.newHashSet(propertySubmitter));
+
+    PatchSetAttribute patchSetAttribute = createMock(PatchSetAttribute.class);
+    event.patchSet = patchSetAttribute;
+    Property propertyPatchSet = createMock(Property.class);
+    expect(propertyAttributeExtractor.extractFrom(patchSetAttribute))
+        .andReturn(Sets.newHashSet(propertyPatchSet));
+
+    changeAttribute.project = "testProject";
+    changeAttribute.number = "176";
+    patchSetAttribute.revision = "testRevision";
+    patchSetAttribute.number = "3";
+
+    Set<Property> common = Sets.newHashSet();
+    common.add(propertyChange);
+    common.add(propertySubmitter);
+    common.add(propertyPatchSet);
+
+    eventHelper(event, "DraftPublishedEvent", "draft-published", common,
+        true);
+  }
+
   public void testPatchSetCreatedEvent() {
     PatchSetCreatedEvent event = new PatchSetCreatedEvent();