Introduce default error object with context for not found exceptions

This commit is contained in:
René Pfeuffer
2018-10-18 13:12:16 +02:00
parent a56aeca8d2
commit b74fb814b8
61 changed files with 395 additions and 1553 deletions

View File

@@ -49,6 +49,7 @@ import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil;
import org.tmatesoft.svn.core.internal.util.SVNXMLUtil;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import sonia.scm.NotFoundException;
import sonia.scm.util.HttpUtil;
import sonia.scm.util.Util;
@@ -102,7 +103,7 @@ public final class SvnUtil
//~--- methods --------------------------------------------------------------
public static long parseRevision(String v) throws RevisionNotFoundException {
public static long parseRevision(String v, Repository repository) {
long result = -1l;
if (!Strings.isNullOrEmpty(v))
@@ -113,7 +114,7 @@ public final class SvnUtil
}
catch (NumberFormatException ex)
{
throw new RevisionNotFoundException(v);
throw NotFoundException.notFound("Revision", v).in(repository).build();
}
}
@@ -339,7 +340,7 @@ public final class SvnUtil
}
}
public static long getRevisionNumber(String revision) throws RevisionNotFoundException {
public static long getRevisionNumber(String revision, Repository repository) {
// REVIEW Bei SVN wird ohne Revision die -1 genommen, was zu einem Fehler führt
long revisionNumber = -1;
@@ -351,7 +352,7 @@ public final class SvnUtil
}
catch (NumberFormatException ex)
{
throw new RevisionNotFoundException(revision);
throw NotFoundException.notFound("Revision", revision).in(repository).build();
}
}

View File

@@ -47,7 +47,6 @@ import org.tmatesoft.svn.core.io.SVNRepository;
import sonia.scm.repository.BrowserResult;
import sonia.scm.repository.FileObject;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RevisionNotFoundException;
import sonia.scm.repository.SubRepository;
import sonia.scm.repository.SvnUtil;
import sonia.scm.util.Util;
@@ -78,9 +77,9 @@ public class SvnBrowseCommand extends AbstractSvnCommand
@Override
@SuppressWarnings("unchecked")
public BrowserResult getBrowserResult(BrowseCommandRequest request) throws RevisionNotFoundException {
public BrowserResult getBrowserResult(BrowseCommandRequest request) {
String path = request.getPath();
long revisionNumber = SvnUtil.getRevisionNumber(request.getRevision());
long revisionNumber = SvnUtil.getRevisionNumber(request.getRevision(), repository);
if (logger.isDebugEnabled()) {
logger.debug("browser repository {} in path {} at revision {}", repository.getName(), path, revisionNumber);

View File

@@ -43,10 +43,9 @@ import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.admin.SVNLookClient;
import sonia.scm.NotFoundException;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.PathNotFoundException;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RevisionNotFoundException;
import sonia.scm.repository.SvnUtil;
import java.io.ByteArrayInputStream;
@@ -79,7 +78,7 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand
//~--- get methods ----------------------------------------------------------
@Override
public void getCatResult(CatCommandRequest request, OutputStream output) throws RevisionNotFoundException, PathNotFoundException {
public void getCatResult(CatCommandRequest request, OutputStream output) {
if (logger.isDebugEnabled())
{
logger.debug("try to get content for {}", request);
@@ -96,14 +95,14 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand
else
{
long revisionNumber = SvnUtil.getRevisionNumber(revision);
long revisionNumber = SvnUtil.getRevisionNumber(revision, repository);
getCatFromRevision(request, output, revisionNumber);
}
}
@Override
public InputStream getCatResultStream(CatCommandRequest request) throws RevisionNotFoundException, PathNotFoundException {
public InputStream getCatResultStream(CatCommandRequest request) {
// There seems to be no method creating an input stream as a result, so
// we have no other possibility then to copy the content into a buffer and
// stream it from there.
@@ -112,7 +111,7 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand
return new ByteArrayInputStream(output.toByteArray());
}
private void getCatFromRevision(CatCommandRequest request, OutputStream output, long revision) throws PathNotFoundException, RevisionNotFoundException {
private void getCatFromRevision(CatCommandRequest request, OutputStream output, long revision) {
logger.debug("try to read content from revision {} and path {}", revision,
request.getPath());
@@ -129,12 +128,12 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand
}
}
private void handleSvnException(CatCommandRequest request, SVNException ex) throws PathNotFoundException, RevisionNotFoundException {
private void handleSvnException(CatCommandRequest request, SVNException ex) {
int svnErrorCode = ex.getErrorMessage().getErrorCode().getCode();
if (SVNErrorCode.FS_NOT_FOUND.getCode() == svnErrorCode) {
throw new PathNotFoundException(request.getPath());
throw NotFoundException.notFound("Path", request.getPath()).in("Revision", request.getRevision()).in(repository).build();
} else if (SVNErrorCode.FS_NO_SUCH_REVISION.getCode() == svnErrorCode) {
throw new RevisionNotFoundException(request.getRevision());
throw NotFoundException.notFound("Revision", request.getRevision()).in(repository).build();
} else {
throw new InternalRepositoryException("could not get content from revision", ex);
}

View File

@@ -48,7 +48,6 @@ import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RevisionNotFoundException;
import sonia.scm.repository.SvnUtil;
import sonia.scm.repository.api.DiffFormat;
import sonia.scm.util.Util;
@@ -76,7 +75,7 @@ public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand
}
@Override
public void getDiffResult(DiffCommandRequest request, OutputStream output) throws RevisionNotFoundException {
public void getDiffResult(DiffCommandRequest request, OutputStream output) {
if (logger.isDebugEnabled())
{
logger.debug("create diff for {}", request);
@@ -111,7 +110,7 @@ public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand
diffGenerator.setDiffDeleted(true);
diffClient.setDiffGenerator(diffGenerator);
long currentRev = SvnUtil.getRevisionNumber(request.getRevision());
long currentRev = SvnUtil.getRevisionNumber(request.getRevision(), repository);
diffClient.setGitDiffFormat(request.getFormat() == DiffFormat.GIT);

View File

@@ -47,7 +47,6 @@ import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RevisionNotFoundException;
import sonia.scm.repository.SvnUtil;
import sonia.scm.util.Util;
@@ -76,7 +75,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand
@Override
@SuppressWarnings("unchecked")
public Changeset getChangeset(String revision) throws RevisionNotFoundException {
public Changeset getChangeset(String revision) {
Changeset changeset = null;
if (logger.isDebugEnabled())
@@ -86,7 +85,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand
try
{
long revisioNumber = parseRevision(revision);
long revisioNumber = parseRevision(revision, repository);
SVNRepository repo = open();
Collection<SVNLogEntry> entries = repo.log(null, null, revisioNumber,
revisioNumber, true, true);
@@ -106,7 +105,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand
@Override
@SuppressWarnings("unchecked")
public ChangesetPagingResult getChangesets(LogCommandRequest request) throws RevisionNotFoundException {
public ChangesetPagingResult getChangesets(LogCommandRequest request) {
if (logger.isDebugEnabled())
{
logger.debug("fetch changesets for {}", request);
@@ -115,8 +114,8 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand
ChangesetPagingResult changesets = null;
int start = request.getPagingStart();
int limit = request.getPagingLimit();
long startRevision = parseRevision(request.getStartChangeset());
long endRevision = parseRevision(request.getEndChangeset());
long startRevision = parseRevision(request.getStartChangeset(), repository);
long endRevision = parseRevision(request.getEndChangeset(), repository);
String[] pathArray = null;
if (!Strings.isNullOrEmpty(request.getPath()))

View File

@@ -7,11 +7,9 @@ import org.tmatesoft.svn.core.io.SVNRepository;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Modifications;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RevisionNotFoundException;
import sonia.scm.repository.SvnUtil;
import sonia.scm.util.Util;
import java.io.IOException;
import java.util.Collection;
@Slf4j
@@ -24,11 +22,11 @@ public class SvnModificationsCommand extends AbstractSvnCommand implements Modif
@Override
@SuppressWarnings("unchecked")
public Modifications getModifications(String revision) throws IOException, RevisionNotFoundException {
public Modifications getModifications(String revision) {
Modifications modifications = null;
log.debug("get modifications {}", revision);
try {
long revisionNumber = SvnUtil.parseRevision(revision);
long revisionNumber = SvnUtil.parseRevision(revision, repository);
SVNRepository repo = open();
Collection<SVNLogEntry> entries = repo.log(null, null, revisionNumber,
revisionNumber, true, true);
@@ -42,7 +40,7 @@ public class SvnModificationsCommand extends AbstractSvnCommand implements Modif
}
@Override
public Modifications getModifications(ModificationsCommandRequest request) throws IOException, RevisionNotFoundException {
public Modifications getModifications(ModificationsCommandRequest request) {
return getModifications(request.getRevision());
}

View File

@@ -38,7 +38,6 @@ package sonia.scm.repository.spi;
import org.junit.Test;
import sonia.scm.repository.BrowserResult;
import sonia.scm.repository.FileObject;
import sonia.scm.repository.RevisionNotFoundException;
import java.io.IOException;
import java.util.List;
@@ -59,7 +58,7 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase
{
@Test
public void testBrowse() throws RevisionNotFoundException {
public void testBrowse() {
List<FileObject> foList = getRootFromTip(new BrowseCommandRequest());
FileObject a = getFileObject(foList, "a.txt");
@@ -83,7 +82,7 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase
* @throws IOException
*/
@Test
public void testBrowseSubDirectory() throws RevisionNotFoundException {
public void testBrowseSubDirectory() {
BrowseCommandRequest request = new BrowseCommandRequest();
request.setPath("c");
@@ -130,7 +129,7 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase
}
@Test
public void testDisableLastCommit() throws RevisionNotFoundException {
public void testDisableLastCommit() {
BrowseCommandRequest request = new BrowseCommandRequest();
request.setDisableLastCommit(true);
@@ -144,7 +143,7 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase
}
@Test
public void testRecursive() throws RevisionNotFoundException {
public void testRecursive() {
BrowseCommandRequest request = new BrowseCommandRequest();
request.setRecursive(true);
BrowserResult result = createCommand().getBrowserResult(request);
@@ -203,7 +202,7 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase
return a;
}
private List<FileObject> getRootFromTip(BrowseCommandRequest request) throws RevisionNotFoundException {
private List<FileObject> getRootFromTip(BrowseCommandRequest request) {
BrowserResult result = createCommand().getBrowserResult(request);
assertNotNull(result);

View File

@@ -32,9 +32,12 @@
package sonia.scm.repository.spi;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Rule;
import org.junit.Test;
import sonia.scm.repository.PathNotFoundException;
import sonia.scm.repository.RevisionNotFoundException;
import org.junit.rules.ExpectedException;
import sonia.scm.NotFoundException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -46,8 +49,11 @@ import static org.junit.Assert.assertEquals;
public class SvnCatCommandTest extends AbstractSvnCommandTestBase {
@Rule
public final ExpectedException expectedException = ExpectedException.none();
@Test
public void testCat() throws PathNotFoundException, RevisionNotFoundException {
public void testCat() {
CatCommandRequest request = new CatCommandRequest();
request.setPath("a.txt");
@@ -56,35 +62,59 @@ public class SvnCatCommandTest extends AbstractSvnCommandTestBase {
}
@Test
public void testSimpleCat() throws PathNotFoundException, RevisionNotFoundException {
public void testSimpleCat() {
CatCommandRequest request = new CatCommandRequest();
request.setPath("c/d.txt");
assertEquals("d", execute(request));
}
@Test(expected = PathNotFoundException.class)
public void testUnknownFile() throws PathNotFoundException, RevisionNotFoundException {
@Test
public void testUnknownFile() {
CatCommandRequest request = new CatCommandRequest();
request.setPath("unknown");
request.setRevision("1");
execute(request);
}
expectedException.expect(new BaseMatcher<Object>() {
@Override
public void describeTo(Description description) {
description.appendText("expected NotFoundException for path");
}
@Test(expected = RevisionNotFoundException.class)
public void testUnknownRevision() throws PathNotFoundException, RevisionNotFoundException {
CatCommandRequest request = new CatCommandRequest();
request.setPath("a.txt");
request.setRevision("42");
@Override
public boolean matches(Object item) {
return "Path".equals(((NotFoundException)item).getContext().get(0).getType());
}
});
execute(request);
}
@Test
public void testSimpleStream() throws IOException, PathNotFoundException, RevisionNotFoundException {
public void testUnknownRevision() {
CatCommandRequest request = new CatCommandRequest();
request.setPath("a.txt");
request.setRevision("42");
expectedException.expect(new BaseMatcher<Object>() {
@Override
public void describeTo(Description description) {
description.appendText("expected NotFoundException for revision");
}
@Override
public boolean matches(Object item) {
return "Revision".equals(((NotFoundException)item).getContext().get(0).getType());
}
});
execute(request);
}
@Test
public void testSimpleStream() throws IOException {
CatCommandRequest request = new CatCommandRequest();
request.setPath("a.txt");
request.setRevision("1");
@@ -98,7 +128,7 @@ public class SvnCatCommandTest extends AbstractSvnCommandTestBase {
catResultStream.close();
}
private String execute(CatCommandRequest request) throws PathNotFoundException, RevisionNotFoundException {
private String execute(CatCommandRequest request) {
String content = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();

View File

@@ -38,7 +38,6 @@ import org.junit.Test;
import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetPagingResult;
import sonia.scm.repository.Modifications;
import sonia.scm.repository.RevisionNotFoundException;
import java.io.IOException;
@@ -57,7 +56,7 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase
{
@Test
public void testGetAll() throws RevisionNotFoundException {
public void testGetAll() {
ChangesetPagingResult result =
createCommand().getChangesets(new LogCommandRequest());
@@ -67,7 +66,7 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase
}
@Test
public void testGetAllByPath() throws RevisionNotFoundException {
public void testGetAllByPath() {
LogCommandRequest request = new LogCommandRequest();
request.setPath("a.txt");
@@ -83,7 +82,7 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase
}
@Test
public void testGetAllWithLimit() throws RevisionNotFoundException {
public void testGetAllWithLimit() {
LogCommandRequest request = new LogCommandRequest();
request.setPagingLimit(2);
@@ -106,7 +105,7 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase
}
@Test
public void testGetAllWithPaging() throws RevisionNotFoundException {
public void testGetAllWithPaging() {
LogCommandRequest request = new LogCommandRequest();
request.setPagingStart(1);
@@ -130,7 +129,7 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase
}
@Test
public void testGetCommit() throws RevisionNotFoundException, IOException {
public void testGetCommit() {
Changeset c = createCommand().getChangeset("3");
assertNotNull(c);
@@ -151,7 +150,7 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase
}
@Test
public void testGetRange() throws RevisionNotFoundException {
public void testGetRange() {
LogCommandRequest request = new LogCommandRequest();
request.setStartChangeset("2");