Don't parse non-existing files in files REST collections

For non-existing members REST collections are expected to throw
ResourceNotFoundException.

Change-Id: I97680b9fc17d0348aef1a5926f73c7e948737e07
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
Edwin Kempin
2016-08-22 13:17:43 +02:00
parent 0520e08cb6
commit 6213c5a984
3 changed files with 44 additions and 9 deletions

View File

@@ -14,16 +14,39 @@
package com.google.gerrit.server.project; package com.google.gerrit.server.project;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestResource; import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.TypeLiteral; import com.google.inject.TypeLiteral;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import java.io.IOException;
public class FileResource implements RestResource { public class FileResource implements RestResource {
public static final TypeLiteral<RestView<FileResource>> FILE_KIND = public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
new TypeLiteral<RestView<FileResource>>() {}; new TypeLiteral<RestView<FileResource>>() {};
public static FileResource create(GitRepositoryManager repoManager,
ProjectControl project, ObjectId rev, String path)
throws ResourceNotFoundException, IOException {
try (Repository repo =
repoManager.openRepository(project.getProject().getNameKey());
RevWalk rw = new RevWalk(repo)) {
RevTree tree = rw.parseTree(rev);
if (TreeWalk.forPath(repo, path, tree) != null) {
return new FileResource(project, rev, path);
}
}
throw new ResourceNotFoundException(IdString.fromDecoded(path));
}
private final ProjectControl project; private final ProjectControl project;
private final ObjectId rev; private final ObjectId rev;
private final String path; private final String path;

View File

@@ -19,19 +19,25 @@ import com.google.gerrit.extensions.restapi.ChildCollection;
import com.google.gerrit.extensions.restapi.IdString; import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import java.io.IOException;
@Singleton @Singleton
public class FilesCollection implements public class FilesCollection implements
ChildCollection<BranchResource, FileResource> { ChildCollection<BranchResource, FileResource> {
private final DynamicMap<RestView<FileResource>> views; private final DynamicMap<RestView<FileResource>> views;
private final GitRepositoryManager repoManager;
@Inject @Inject
FilesCollection(DynamicMap<RestView<FileResource>> views) { FilesCollection(DynamicMap<RestView<FileResource>> views,
GitRepositoryManager repoManager) {
this.views = views; this.views = views;
this.repoManager = repoManager;
} }
@Override @Override
@@ -40,11 +46,10 @@ public class FilesCollection implements
} }
@Override @Override
public FileResource parse(BranchResource parent, IdString id) { public FileResource parse(BranchResource parent, IdString id)
return new FileResource( throws ResourceNotFoundException, IOException {
parent.getControl(), return FileResource.create(repoManager, parent.getControl(),
ObjectId.fromString(parent.getRevision()), ObjectId.fromString(parent.getRevision()), id.get());
id.get());
} }
@Override @Override

View File

@@ -19,17 +19,23 @@ import com.google.gerrit.extensions.restapi.ChildCollection;
import com.google.gerrit.extensions.restapi.IdString; import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.io.IOException;
@Singleton @Singleton
public class FilesInCommitCollection implements public class FilesInCommitCollection implements
ChildCollection<CommitResource, FileResource> { ChildCollection<CommitResource, FileResource> {
private final DynamicMap<RestView<FileResource>> views; private final DynamicMap<RestView<FileResource>> views;
private final GitRepositoryManager repoManager;
@Inject @Inject
FilesInCommitCollection(DynamicMap<RestView<FileResource>> views) { FilesInCommitCollection(DynamicMap<RestView<FileResource>> views,
GitRepositoryManager repoManager) {
this.views = views; this.views = views;
this.repoManager = repoManager;
} }
@Override @Override
@@ -39,8 +45,9 @@ public class FilesInCommitCollection implements
@Override @Override
public FileResource parse(CommitResource parent, IdString id) public FileResource parse(CommitResource parent, IdString id)
throws ResourceNotFoundException { throws ResourceNotFoundException, IOException {
return new FileResource(parent.getProject(), parent.getCommit(), id.get()); return FileResource.create(repoManager, parent.getProject(),
parent.getCommit(), id.get());
} }
@Override @Override