build with 2.13

Updated the visibility checking to be more generic and able to handle more cases.

Change-Id: I988541cf36857f7e26cbbb417fe21ab5c1a6f7a2
diff --git a/pom.xml b/pom.xml
index 8892823..3f559e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
   <artifactId>events</artifactId>
   <name>events</name>
   <packaging>jar</packaging>
-  <version>2.12</version>
+  <version>2.13</version>
 
   <properties>
     <Gerrit-ApiType>plugin</Gerrit-ApiType>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/events/BranchHelper.java b/src/main/java/com/googlesource/gerrit/plugins/events/BranchHelper.java
index 6ad01e9..c03be80 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/events/BranchHelper.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/events/BranchHelper.java
@@ -21,6 +21,7 @@
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectState;
 import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import com.google.inject.Inject;
 
 public class BranchHelper {
@@ -47,52 +48,83 @@
   }
 
   public static Branch.NameKey getBranch(JsonElement event) {
-    // Known events of this type:
-    //  CommentAddedEvent, ChangeMergedEvent, ChangeAbandonedEvent,
-    //  ChangeRestoredEvent, DraftPublishedEvent, MergeFailedEvent,
-    //  PatchSetCreatedEvent, ReviewerAddedEvent:
-    JsonElement projectParent = event.getAsJsonObject().get("change");
-    if (projectParent == null) {
-      // Known events of this type: RefUpdatedEvent
-      projectParent = event.getAsJsonObject().get("refUpdate");
-    }
-    if (projectParent == null) {
+    Branch.NameKey b = null;
+    if (event != null) {
+      JsonObject obj = event.getAsJsonObject();
       // Known events of this type:
       //  CommitReceivedEvent, RefReplicationDoneEvent, RefReplicatedEvent
-      projectParent = event;
-    }
-
-    if (projectParent != null) {
-      JsonElement project = projectParent.getAsJsonObject().get("project");
-      if (project != null) {
+      b = getBranch(obj);
+      if (b == null) {
         // Known events of this type:
         //  CommentAddedEvent, ChangeMergedEvent, ChangeAbandonedEvent,
         //  ChangeRestoredEvent, DraftPublishedEvent, MergeFailedEvent,
         //  PatchSetCreatedEvent, ReviewerAddedEvent:
-        JsonElement branch = projectParent.getAsJsonObject().get("branch");
-        if (branch == null) {
-          // Known events of this type: RefUpdatedEvent, CommitReceivedEvent
-          branch = projectParent.getAsJsonObject().get("refName");
+        b = getBranch(obj.get("change"));
+        if (b == null) {
+          // Known events of this type: RefUpdatedEvent
+          b = getBranch(obj.get("refUpdate"));
         }
-        if (branch == null) {
-          // Known events of this type:
-          //  RefReplicationDoneEvent, RefReplicatedEvent
-          branch = projectParent.getAsJsonObject().get("ref");
-        }
+      }
+    }
+    return b;
+  }
 
-        if (branch != null) {
-          return getBranch(project, branch);
+  protected static Branch.NameKey getBranch(JsonObject projectParent) {
+    Project.NameKey project = getProject(projectParent);
+    if (project != null) {
+      // Known events of this type:
+      //  CommentAddedEvent, ChangeMergedEvent, ChangeAbandonedEvent,
+      //  ChangeRestoredEvent, DraftPublishedEvent, MergeFailedEvent,
+      //  PatchSetCreatedEvent, ReviewerAddedEvent:
+      JsonElement branch = projectParent.get("branch");
+      if (branch == null) {
+        // Known events of this type: RefUpdatedEvent, CommitReceivedEvent
+        branch = projectParent.get("refName");
+      }
+      if (branch == null) {
+        // Known events of this type:
+        //  RefReplicationDoneEvent, RefReplicatedEvent
+        branch = projectParent.get("ref");
+      }
+
+      if (branch != null) {
+        String name = asString(branch);
+        if (name != null) {
+          return new Branch.NameKey(project, name);
         }
       }
     }
     return null;
   }
 
-  protected static Branch.NameKey getBranch(JsonElement project, JsonElement branch) {
-    return getBranch(project.getAsString(), branch.getAsString());
+  public static Project.NameKey getProject(JsonObject projectParent) {
+    if (projectParent != null) {
+      JsonElement project = projectParent.get("project");
+      if (project != null) {
+        String name = asString(project);
+        if (name == null) {
+          try {
+            projectParent = project.getAsJsonObject();
+            project = projectParent.get("name");
+            name = asString(project);
+          } catch (RuntimeException e) {
+          }
+        }
+        if (name != null) {
+          return new Project.NameKey(name);
+        }
+      }
+    }
+    return null;
   }
 
-  protected static Branch.NameKey getBranch(String project, String branch) {
-    return new Branch.NameKey(new Project.NameKey(project), (branch.startsWith("refs/") ? "" : "refs/heads/") + branch);
+  protected static String asString(JsonElement el) {
+    if (el != null) {
+      try {
+        return el.getAsString();
+      } catch (RuntimeException e) {
+      }
+    }
+    return null;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/events/CoreListener.java b/src/main/java/com/googlesource/gerrit/plugins/events/CoreListener.java
index 52a7916..004b48d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/events/CoreListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/events/CoreListener.java
@@ -14,10 +14,16 @@
 
 package com.googlesource.gerrit.plugins.events;
 
+import com.google.common.base.Supplier;
 import com.google.gerrit.common.EventListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.ProjectNameKeySerializer;
+import com.google.gerrit.server.events.RefUpdatedEvent;
+import com.google.gerrit.server.events.SupplierSerializer;
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import java.io.IOException;
@@ -28,7 +34,11 @@
 public class CoreListener implements EventListener {
   private static Logger log = LoggerFactory.getLogger(CoreListener.class);
 
-  protected static final Gson gson = new Gson();
+  protected static final Gson gson =
+      new GsonBuilder()
+          .registerTypeAdapter(Supplier.class, new SupplierSerializer())
+          .registerTypeAdapter(Project.NameKey.class, new ProjectNameKeySerializer())
+          .create();
   protected final DynamicSet<StreamEventListener> listeners;
   protected final EventStore store;
 
diff --git a/test/test_events_plugin.sh b/test/test_events_plugin.sh
index 75b2d34..cc0ded4 100755
--- a/test/test_events_plugin.sh
+++ b/test/test_events_plugin.sh
@@ -201,9 +201,10 @@
 # ------------------------- Individual Event Tests ---------------------------
 GROUP=visible-events
 type=patchset-created
-capture_events
+capture_events 2
 ch1=$(create_change --draft "$REF_BRANCH" "$FILE_A") || exit
-result_type "$GROUP" "$type"
+result_type "$GROUP $type" "ref-updated"
+result_type "$GROUP" "$type" 2
 
 type=draft-published
 capture_events
@@ -228,8 +229,8 @@
 type=change-merged
 capture_events 2
 submit "$ch1,1"
-result_type "$GROUP" "$type"
-result_type "$GROUP" "ref-updated" 2
+result_type "$GROUP $type" "ref-updated"
+result_type "$GROUP" "$type" 2
 
 # reviewer-added needs to be tested via Rest-API