Fix comparison with change edit in preview diff screen

In the preview diff screens it is now possible to select change edits
for comparison with other patch sets or the base.

So far the change edit was not retrieved and handling of it was
erroneous.

Change-Id: I5da56b742d7e221851fdd88e062c2921c3febcf9
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeApi.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeApi.java
index 44d1d49..4f30993 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeApi.java
@@ -17,6 +17,8 @@
 import com.google.gerrit.plugin.client.rpc.RestApi;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
+import com.googlesource.gerrit.plugins.xdocs.client.ChangeInfo.EditInfo;
+
 import java.util.EnumSet;
 
 public class ChangeApi {
@@ -39,11 +41,23 @@
     return change(id).view(action);
   }
 
-  public static RestApi change(String id) {
+  private static RestApi change(String id) {
+    return new RestApi("/changes/").id(id);
+  }
+
+  private static RestApi change(int id) {
     return new RestApi("/changes/").id(id);
   }
 
   public static void addOptions(RestApi call, EnumSet<ListChangesOption> s) {
     call.addParameterRaw("O", Integer.toHexString(ListChangesOption.toBits(s)));
   }
+
+  public static void edit(int id, AsyncCallback<EditInfo> cb) {
+    edit(id).get(cb);
+  }
+
+  private static RestApi edit(int id) {
+    return change(id).view("edit");
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
index d02913e..3583461 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/ChangeInfo.java
@@ -32,10 +32,24 @@
   }
 
   public static class RevisionInfo extends JavaScriptObject {
+    public static RevisionInfo fromEdit(EditInfo edit) {
+      RevisionInfo revisionInfo = createObject().cast();
+      revisionInfo.takeFromEdit(edit);
+      return revisionInfo;
+    }
+
+    private final native void takeFromEdit(EditInfo edit) /*-{
+      this._number = 0;
+      this.name = edit.name;
+      this.commit = edit.commit;
+      this.edit_base = edit.base_revision;
+    }-*/;
+
     public final native int _number() /*-{ return this._number; }-*/;
     public final native String name() /*-{ return this.name; }-*/;
     public final native String ref() /*-{ return this.ref; }-*/;
     public final native boolean is_edit() /*-{ return this._number == 0; }-*/;
+    public final native CommitInfo commit() /*-{ return this.commit; }-*/;
     public final native String edit_base() /*-{ return this.edit_base; }-*/;
 
     public static int findEditParent(JsArray<RevisionInfo> list) {
@@ -75,4 +89,11 @@
     protected RevisionInfo () {
     }
   }
+
+  public static class EditInfo extends JavaScriptObject {
+    public final native String name() /*-{ return this.name; }-*/;
+
+    protected EditInfo() {
+    }
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocDiffScreen.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocDiffScreen.java
index 8f308cb..96555d3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocDiffScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/client/XDocDiffScreen.java
@@ -29,6 +29,7 @@
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
 
+import com.googlesource.gerrit.plugins.xdocs.client.ChangeInfo.EditInfo;
 import com.googlesource.gerrit.plugins.xdocs.client.ChangeInfo.RevisionInfo;
 
 import java.util.List;
@@ -53,6 +54,28 @@
 
       @Override
       public void onSuccess(final ChangeInfo change) {
+        change.revisions().copyKeysIntoChildren("name");
+        if (Plugin.get().isSignedIn()) {
+          ChangeApi.edit(change._number(), new AsyncCallback<EditInfo>() {
+            @Override
+            public void onSuccess(EditInfo edit) {
+              if (edit != null) {
+                change.revisions().put(edit.name(), RevisionInfo.fromEdit(edit));
+              }
+              initRevisionsAndShow(change);
+            }
+
+            @Override
+            public void onFailure(Throwable caught) {
+              // never invoked
+            }
+          });
+        } else {
+          initRevisionsAndShow(change);
+        }
+      }
+
+      private void initRevisionsAndShow(final ChangeInfo change) {
         parseRevisions(change, patchSet);
         if (revisionA == null) {
           ProjectApi.getCommitInfo(change.project(), change.current_revision(),
@@ -125,6 +148,9 @@
 
   private static String getRevision(ChangeInfo change, int patchSet) {
     for (RevisionInfo rev : Natives.asList(change.revisions().values())) {
+      if (rev.is_edit()) {
+        return rev.commit().commit();
+      }
       if (rev._number() == patchSet) {
         return rev.ref();
       }