Migrate from maniphest.info to maniphest.search conduit API endpoint

Change-Id: I341469d50a741511c5eb20a521e934b84ef69e9d
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 62c2f78..82264bc 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
@@ -17,13 +17,16 @@
 import com.google.common.collect.Sets;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.its.base.its.ItsFacade;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.Conduit;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.ConduitErrorException;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.ConduitException;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestInfo;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestSearch;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestResults;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectInfo;
 import java.io.IOException;
 import java.net.URL;
@@ -39,6 +42,7 @@
   private static final String GERRIT_CONFIG_TOKEN = "token";
 
   private final Conduit conduit;
+  private final Gson gson;
 
   @Inject
   public PhabricatorItsFacade(@PluginName String pluginName, @GerritServerConfig Config cfg) {
@@ -46,6 +50,7 @@
     String token = cfg.getString(pluginName, null, GERRIT_CONFIG_TOKEN);
 
     this.conduit = new Conduit(url, token);
+    this.gson = new Gson();
   }
 
   @Override
@@ -72,7 +77,7 @@
     int task_id = Integer.parseInt(bugId);
     try {
       try {
-        conduit.maniphestInfo(task_id);
+        conduit.maniphestSearch(task_id);
         ret = true;
       } catch (ConduitErrorException e) {
         // An ERR_BAD_TASK just means that the task does not exist.
@@ -131,9 +136,14 @@
 
       Set<String> projectPhids = Sets.newHashSet(projectPhid);
 
-      ManiphestInfo taskInfo = conduit.maniphestInfo(taskId);
-      for (JsonElement jsonElement : taskInfo.getProjectPHIDs().getAsJsonArray()) {
-        projectPhids.add(jsonElement.getAsString());
+      ManiphestResults taskSearch = conduit.maniphestSearch(taskId);
+      JsonArray maniphestResultEntryValue = taskSearch.getData().getAsJsonArray();
+
+      for (JsonElement jsonElement : maniphestResultEntryValue) {
+        ManiphestSearch maniphestResultManiphestSearch = gson.fromJson(jsonElement, ManiphestSearch.class);
+        for (JsonElement jsonElement2 : maniphestResultManiphestSearch.getAttachments().getProjects().getProjectPHIDs().getAsJsonArray()) {
+          projectPhids.add(jsonElement2.getAsString());
+        }
       }
 
       conduit.maniphestEdit(taskId, projectPhids, actions);
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 fa834fe..15e227d 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
@@ -19,7 +19,8 @@
 import com.google.gson.JsonObject;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitPing;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestEdit;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestInfo;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestSearch;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestResults;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectInfo;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.QueryResult;
 import java.util.ArrayList;
@@ -77,13 +78,26 @@
     return result;
   }
 
-  /** Runs the API's 'maniphest.Info' method */
-  public ManiphestInfo maniphestInfo(int taskId) throws ConduitException {
-    Map<String, Object> params = new HashMap<>();
-    params.put("task_id", taskId);
+  /**
+   * Runs the API's 'maniphest.search' method
+   */
+  public ManiphestResults maniphestSearch(int taskId) throws ConduitException {
+    HashMap<String, Object> params = new HashMap<>();
+    HashMap<String, Object> params2 = new HashMap<>();
+    HashMap<String, Object> params3 = new HashMap<>();
 
-    JsonElement callResult = conduitConnection.call("maniphest.info", params, token);
-    ManiphestInfo result = gson.fromJson(callResult, ManiphestInfo.class);
+    List<Object> list = new ArrayList<>();
+    list.add(taskId);
+
+    params2.put("ids", list);
+
+    params.put("constraints", params2);
+
+    params3.put("projects", true);
+    params.put("attachments", params3);
+
+    JsonElement callResult = conduitConnection.call("maniphest.search", params, token);
+    ManiphestResults result = gson.fromJson(callResult, ManiphestResults.class);
     return result;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestInfo.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestInfo.java
deleted file mode 100644
index 7358c79..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2014 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package com.googlesource.gerrit.plugins.its.phabricator.conduit.results;
-
-/**
- * Models the result for a call to maniphest.info
- *
- * <p>JSON looks like:
- *
- * <pre>
- * {
- *   "id":"48",
- *   "phid":"PHID-TASK-pemd324eosnymq3tdkyo",
- *   "authorPHID":"PHID-USER-na3one2sht11aone",
- *   "ownerPHID":null,
- *   "ccPHIDs":[
- *     "PHID-USER-h4n62fq2kt2v3a2qjyqh"
- *   ],
- *   "status":"open",
- *   "statusName":"Open",
- *   "isClosed":false,
- *   "priority": "Needs Triage",
- *   "priorityColor":"violet",
- *   "title":"QChris test task",
- *   "description":"",
- *   "projectPHIDs":[],
- *   "uri":"https://phab-01.wmflabs.org/T47",
- *   "auxiliary":{
- *     "std:maniphest:security_topic":"default",
- *     "isdc:sprint:storypoints":null
- *   },
- *   "objectName":"T47",
- *   "dateCreated":"1413484594",
- *   "dateModified":1413549869,
- *   "dependsOnTaskPHIDs":[]
- * }
- * </pre>
- */
-public class ManiphestInfo extends Task {}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestResults.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestResults.java
new file mode 100644
index 0000000..8a28795
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestResults.java
@@ -0,0 +1,48 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.its.phabricator.conduit.results;
+
+import com.google.gson.JsonElement;
+
+/**
+ * Models the result for API methods
+ *
+ * <p>JSON looks like:
+ *
+ * <pre>
+ * {
+ *   "data": [
+ *     { ... }
+ *   ],
+ *   "maps": {},
+ *   "query": {
+ *     "queryKey": null
+ *   },
+ *   "cursor": {
+ *     "limit": 100,
+ *     "after": null,
+ *     "before": null,
+ *     "order": null
+ *   }
+ * }
+ * </pre>
+ */
+public class ManiphestResults {
+  private JsonElement data;
+
+  public JsonElement getData() {
+    return data;
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestSearch.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestSearch.java
new file mode 100644
index 0000000..1f98709
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/results/ManiphestSearch.java
@@ -0,0 +1,102 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.its.phabricator.conduit.results;
+
+import com.google.gson.JsonElement;
+
+/**
+ * Models the result for a call to maniphest.search
+ *
+ * <p>JSON looks like:
+ *
+ * <pre>
+ * {
+ *   "id": 1,
+ *   "type": "TASK",
+ *   "phid": "PHID-TASK-qu55xzt7g5gusqkdiv5r",
+ *   "fields": {
+ *     "name": "First task",
+ *     "description": {
+ *       "raw": "Test"
+ *     },
+ *     "authorPHID": "PHID-USER-aruq7lrst6el3od2jpgm",
+ *     "ownerPHID": null,
+ *     "status": {
+ *       "value": "open",
+ *       "name": "Open",
+ *       "color": null
+ *     },
+ *     "priority": {
+ *       "value": 100,
+ *       "subpriority": 0,
+ *       "name": "Unbreak Now!",
+ *       "color": "pink"
+ *     },
+ *     "points": null,
+ *     "subtype": "default",
+ *     "closerPHID": null,
+ *     "dateClosed": null,
+ *     "spacePHID": null,
+ *     "dateCreated": 1530558541,
+ *     "dateModified": 1538054886,
+ *     "policy": {
+ *       "view": "public",
+ *       "interact": "public",
+ *       "edit": "users"
+ *     },
+ *   },
+ *   "attachments": {
+ *     "projects": {
+ *       "projectPHIDs": [
+ *         "PHID-PROJ-ro6wrekgi7u3fwzz5p6a"
+ *       ]
+ *     }
+ *   }
+ * }
+ * </pre>
+ */
+public class ManiphestSearch {
+  private int id;
+  private JsonElement fields;
+  private Attachments attachments;
+
+  public int getId() {
+    return id;
+  }
+
+  public JsonElement getFields() {
+    return fields;
+  }
+
+  public Attachments getAttachments() {
+    return attachments;
+  }
+
+  public class Attachments {
+    private Projects projects;
+
+    public Projects getProjects() {
+      return projects;
+    }
+  }
+
+  public class Projects {
+    private JsonElement projectPHIDs;
+
+    public JsonElement getProjectPHIDs() {
+      return projectPHIDs;
+    }
+  }
+}