Fix download of change edit from diff screens

If the change edit was selected on the side-by-side diff screen the
file download failed with 'Not Found'.

Change-Id: I6f9e697c228e6978b5da451469fc403911008c5a
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
index d449fbd..dddcd67 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
@@ -14,7 +14,9 @@
 
 package com.google.gerrit.httpd.raw;
 
+import com.google.common.base.Optional;
 import com.google.gerrit.common.TimeUtil;
+import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.Url;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Patch;
@@ -22,6 +24,8 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditUtil;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.mime.FileTypeRegistry;
 import com.google.gerrit.server.project.ChangeControl;
@@ -76,19 +80,22 @@
   private final FileTypeRegistry registry;
   private final Provider<CurrentUser> userProvider;
   private final ChangeControl.GenericFactory changeControl;
+  private final ChangeEditUtil changeEditUtil;
 
   @Inject
   CatServlet(GitRepositoryManager grm,
       Provider<ReviewDb> sf,
       FileTypeRegistry ftr,
       ChangeControl.GenericFactory ccf,
-      Provider<CurrentUser> usrprv) {
+      Provider<CurrentUser> usrprv,
+      ChangeEditUtil ceu) {
     requestDb = sf;
     repoManager = grm;
     rng = new SecureRandom();
     registry = ftr;
     changeControl = ccf;
     userProvider = usrprv;
+    changeEditUtil = ceu;
   }
 
   @Override
@@ -143,17 +150,35 @@
 
     final Change.Id changeId = patchKey.getParentKey().getParentKey();
     final Project project;
-    final PatchSet patchSet;
+    final String revision;
     try {
       final ReviewDb db = requestDb.get();
       final ChangeControl control = changeControl.validateFor(changeId,
           userProvider.get());
 
       project = control.getProject();
-      patchSet = db.patchSets().get(patchKey.getParentKey());
-      if (patchSet == null) {
-        rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-        return;
+
+      if (patchKey.getParentKey().get() == 0) {
+        // change edit
+        try {
+          Optional<ChangeEdit> edit = changeEditUtil.byChange(control.getChange());
+          if (edit.isPresent()) {
+            revision = edit.get().getRevision().get();
+          } else {
+            rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+            return;
+          }
+        } catch (AuthException e) {
+          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+          return;
+        }
+      } else {
+        PatchSet patchSet = db.patchSets().get(patchKey.getParentKey());
+        if (patchSet == null) {
+          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+          return;
+        }
+        revision = patchSet.getRevision().get();
       }
     } catch (NoSuchChangeException e) {
       rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
@@ -184,7 +209,7 @@
         final RevCommit c;
         final TreeWalk tw;
 
-        c = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
+        c = rw.parseCommit(ObjectId.fromString(revision));
         if (side == 0) {
           fromCommit = c;
           suffix = "new";