Migrate this plugin to use maniphest.edit conduit

maniphest.update is deprecated and can be removed at anytime.

Our downstream task https://phabricator.wikimedia.org/T159041

Change-Id: I843f521e8fe601d5c7b8fb654feec3e98f4c5a51
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
index 7d4a3c8..5d171de 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
@@ -61,7 +61,7 @@
       throws IOException {
     int task_id = Integer.parseInt(bugId);
     try {
-      conduit.maniphestUpdate(task_id, comment);
+      conduit.maniphestEdit(task_id, comment);
     } catch (ConduitException e) {
       throw new IOException("Could not update message for task " + task_id, e);
     }
@@ -122,7 +122,7 @@
                 projectPhids.add(jsonElement.getAsString());
               }
 
-              conduit.maniphestUpdate(taskId, projectPhids);
+              conduit.maniphestEdit(taskId, projectPhids);
             } catch (ConduitException e) {
               throw new IOException("Error on conduit", e);
             }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
index fa49281..d2d4ae2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
@@ -21,7 +21,7 @@
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitConnect;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitPing;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestInfo;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestUpdate;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestEdit;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectInfo;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.QueryResult;
 
@@ -31,14 +31,15 @@
 import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
 import javax.xml.bind.DatatypeConverter;
 
-
 /**
  * Bindings for Phabricator's Conduit API
  * <p/>
@@ -174,35 +175,47 @@
   }
 
   /**
-   * Runs the API's 'maniphest.update' method
+   * Runs the API's 'maniphest.edit' method
    */
-  public ManiphestUpdate maniphestUpdate(int taskId, String comment) throws ConduitException {
-    return maniphestUpdate(taskId, comment, null);
+  public ManiphestEdit maniphestEdit(int taskId, String comment) throws ConduitException {
+    return maniphestEdit(taskId, comment, null);
   }
 
   /**
-   * Runs the API's 'maniphest.update' method
+   * Runs the API's 'maniphest.edit' method
    */
-  public ManiphestUpdate maniphestUpdate(int taskId, Iterable<String> projects) throws ConduitException {
-    return maniphestUpdate(taskId, null, projects);
+  public ManiphestEdit maniphestEdit(int taskId, Iterable<String> projects) throws ConduitException {
+    return maniphestEdit(taskId, null, projects);
   }
 
   /**
-   * Runs the API's 'maniphest.update' method
+   * Runs the API's 'maniphest.edit' method
    */
-  public ManiphestUpdate maniphestUpdate(int taskId, String comment, Iterable<String> projects) throws ConduitException {
-    Map<String, Object> params = new HashMap<>();
+  public ManiphestEdit maniphestEdit(int taskId, String comment, Iterable<String> projects) throws ConduitException {
+    HashMap<String, Object> params = new HashMap<>();
     fillInSession(params);
-    params.put("id", taskId);
+    List<Object> list = new ArrayList<>();
+    HashMap<String, Object> params2 = new HashMap<>();
     if (comment != null) {
-      params.put("comments", comment);
-    }
-    if (projects != null) {
-      params.put("projectPHIDs", projects);
+      String comments = "comment";
+      params2.put("type", comments);
+      params2.put("value", comment);
     }
 
-    JsonElement callResult = conduitConnection.call("maniphest.update", params);
-    ManiphestUpdate result = gson.fromJson(callResult, ManiphestUpdate.class);
+    if (projects != null) {
+      String project = "projects.add";
+      params2.put("type", project);
+      params2.put("value", projects);
+    }
+
+    if (!params2.isEmpty()) {
+      list.add(params2);
+      params.put("transactions", list);
+    }
+    params.put("objectIdentifier", taskId);
+
+    JsonElement callResult = conduitConnection.call("maniphest.edit", params);
+    ManiphestEdit result = gson.fromJson(callResult, ManiphestEdit.class);
     return result;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestUpdate.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestEdit.java
similarity index 93%
rename from src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestUpdate.java
rename to src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestEdit.java
index 055e8db..8323f4e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestUpdate.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestEdit.java
@@ -14,7 +14,7 @@
 package com.googlesource.gerrit.plugins.its.phabricator.conduit.results;
 
 /**
- * Models the result for a call to maniphest.update
+ * Models the result for a call to maniphest.edit
  * <p/>
  * JSON looks like:
  * <pre>
@@ -46,6 +46,6 @@
  * }
  * </pre>
  */
-public class ManiphestUpdate extends Task {
+public class ManiphestEdit extends Task {
 
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java
index f6e72b6..0392314 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/Task.java
@@ -68,6 +68,8 @@
   private String dateCreated;
   private String dateModified;
   private JsonElement dependsOnTaskPHIDs;
+  private JsonElement objectIdentifier;
+  private JsonElement transactions;
 
   public int getId() {
     return id;
@@ -144,4 +146,12 @@
   public JsonElement getDependsOnTaskPHIDs() {
     return dependsOnTaskPHIDs;
   }
+
+  public JsonElement getObjectIdentifier() {
+    return objectIdentifier;
+  }
+
+  public JsonElement getTransactions() {
+    return transactions;
+  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
index 58ea0b8..b4936e4 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
@@ -35,7 +35,7 @@
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitConnect;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitPing;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestInfo;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestUpdate;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestEdit;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectInfo;
 
 @RunWith(PowerMockRunner.class)
@@ -245,7 +245,7 @@
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdatePassComment() throws Exception {
+  public void testManiphestEditPassComment() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -272,7 +272,7 @@
 
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
-    ManiphestUpdate maniphestUpdate = conduit.maniphestUpdate(42, "foo");
+    ManiphestEdit maniphestEdit = conduit.maniphestEdit(42, "foo");
 
     Map<String, Object> paramsConnect = paramsCaptureConnect.getValue();
     assertEquals("Usernames do not match", USERNAME, paramsConnect.get("user"));
@@ -280,12 +280,12 @@
     Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
     assertEquals("Task id is not set", 42, paramsRelevant.get("id"));
 
-    assertEquals("ManiphestInfo's id does not match", 42, maniphestUpdate.getId());
+    assertEquals("ManiphestInfo's id does not match", 42, maniphestEdit.getId());
 
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdatePassProjects() throws Exception {
+  public void testManiphestEditPassProjects() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -304,7 +304,7 @@
 
     Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
 
-    expect(connection.call(eq("maniphest.update"), capture(paramsCaptureRelevant)))
+    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant)))
     .andReturn(retRelevant)
     .once();
 
@@ -312,7 +312,7 @@
 
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
-    ManiphestUpdate maniphestUpdate = conduit.maniphestUpdate(42,
+    ManiphestEdit maniphestEdit = conduit.maniphestEdit(42,
         Arrays.asList("foo", "bar"));
 
     Map<String, Object> paramsConnect = paramsCaptureConnect.getValue();
@@ -323,12 +323,12 @@
     assertEquals("Task projects are not set", Arrays.asList("foo", "bar"),
         paramsRelevant.get("projectPHIDs"));
 
-    assertEquals("ManiphestUpdate's id does not match", 42, maniphestUpdate.getId());
+    assertEquals("ManiphestEdit's id does not match", 42, maniphestEdit.getId());
 
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdatePassCommentAndProjects() throws Exception {
+  public void testManiphestEditPassCommentAndProjects() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -347,7 +347,7 @@
 
     Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
 
-    expect(connection.call(eq("maniphest.update"), capture(paramsCaptureRelevant)))
+    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant)))
     .andReturn(retRelevant)
     .once();
 
@@ -355,7 +355,7 @@
 
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
-    ManiphestUpdate maniphestUpdate = conduit.maniphestUpdate(42, "baz",
+    ManiphestEdit maniphestEdit = conduit.maniphestEdit(42, "baz",
         Arrays.asList("foo", "bar"));
 
     Map<String, Object> paramsConnect = paramsCaptureConnect.getValue();
@@ -367,13 +367,13 @@
     assertEquals("Task projects are not set", Arrays.asList("foo", "bar"),
         paramsRelevant.get("projectPHIDs"));
 
-    assertEquals("ManiphestUpdate's id does not match", 42, maniphestUpdate.getId());
+    assertEquals("ManiphestUpdate's id does not match", 42, maniphestEdit.getId());
 
     assertLogMessageContains("Trying to start new session");
   }
 
 
-  public void testManiphestUpdateFailConnect() throws Exception {
+  public void testManiphestEditFailConnect() throws Exception {
     mockConnection();
 
     ConduitException conduitException = new ConduitException();
@@ -389,7 +389,7 @@
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
     try {
-      conduit.maniphestUpdate(42, "foo");
+      conduit.maniphestEdit(42, "foo");
       fail("no exception got thrown");
     } catch (ConduitException e) {
       assertSame(conduitException, e);
@@ -401,7 +401,7 @@
     assertLogMessageContains("Trying to start new session");
   }
 
-  public void testManiphestUpdateFailRelevant() throws Exception {
+  public void testManiphestEditFailRelevant() throws Exception {
     mockConnection();
 
     resetToStrict(connection);
@@ -419,7 +419,7 @@
 
     Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
 
-    expect(connection.call(eq("maniphest.update"), capture(paramsCaptureRelevant)))
+    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant)))
       .andThrow(conduitException)
       .once();
 
@@ -428,7 +428,7 @@
     Conduit conduit = new Conduit(URL, USERNAME, CERTIFICATE);
 
     try {
-      conduit.maniphestUpdate(42, "foo");
+      conduit.maniphestEdit(42, "foo");
       fail("no exception got thrown");
     } catch (ConduitException e) {
       assertSame(conduitException, e);