From fb59c5cd564eeec692133b391a2b43a33ccd1c90 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 10 May 2013 13:02:35 +0200 Subject: [PATCH] improve exception handling --- .../api/IncomingCommandBuilder.java | 4 +- .../api/OutgoingCommandBuilder.java | 4 +- .../scm/repository/spi/IncomingCommand.java | 11 +++- .../scm/repository/spi/OutgoingCommand.java | 11 +++- .../scm/repository/spi/HgIncomingCommand.java | 33 ++++++++++- .../repository/spi/HgIncomingCommandTest.java | 55 ++++++++++++++++++- 6 files changed, 111 insertions(+), 7 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java index 4ded5f7079..6c9a6a9322 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java @@ -33,6 +33,7 @@ package sonia.scm.repository.api; //~--- non-JDK imports -------------------------------------------------------- +import java.io.IOException; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; @@ -41,6 +42,7 @@ import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.PermissionType; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.IncomingCommand; import sonia.scm.repository.spi.IncomingCommandRequest; import sonia.scm.security.RepositoryPermission; @@ -82,7 +84,7 @@ public final class IncomingCommandBuilder * @return incoming changesets */ public ChangesetPagingResult getIncomingChangesets( - Repository remoteRepository) + Repository remoteRepository) throws IOException, RepositoryException { Subject subject = SecurityUtils.getSubject(); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java index 9f4664543b..3c5e103cb6 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java @@ -28,6 +28,7 @@ */ package sonia.scm.repository.api; +import java.io.IOException; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import sonia.scm.cache.CacheManager; @@ -35,6 +36,7 @@ import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.PermissionType; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.OutgoingCommand; import sonia.scm.repository.spi.OutgoingCommandRequest; import sonia.scm.security.RepositoryPermission; @@ -76,7 +78,7 @@ public final class OutgoingCommandBuilder * @return outgoing changesets */ public ChangesetPagingResult getOutgoingChangesets( - Repository remoteRepository) + Repository remoteRepository) throws IOException, RepositoryException { Subject subject = SecurityUtils.getSubject(); diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java index 1b66102386..8a90696ea8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java @@ -34,6 +34,11 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.RepositoryException; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; /** * @@ -50,7 +55,11 @@ public interface IncomingCommand * @param request * * @return + * + * @throws IOException + * @throws RepositoryException */ public ChangesetPagingResult getIncomingChangesets( - IncomingCommandRequest request); + IncomingCommandRequest request) + throws IOException, RepositoryException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java index 97d155021b..6ac11de6f0 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java @@ -34,6 +34,11 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.RepositoryException; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; /** * @@ -50,7 +55,11 @@ public interface OutgoingCommand * @param request * * @return + * + * @throws IOException + * @throws RepositoryException */ public ChangesetPagingResult getOutgoingChangesets( - OutgoingCommandRequest request); + OutgoingCommandRequest request) + throws IOException, RepositoryException; } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java index 2646805928..9de03ced95 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java @@ -33,16 +33,20 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.aragost.javahg.commands.ExecutionException; + import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.javahg.HgIncomingChangesetCommand; //~--- JDK imports ------------------------------------------------------------ import java.io.File; +import java.util.Collections; import java.util.List; /** @@ -53,6 +57,11 @@ public class HgIncomingCommand extends AbstractCommand implements IncomingCommand { + /** Field description */ + private static final int NO_INCOMING_CHANGESETS = 1; + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * @@ -77,10 +86,13 @@ public class HgIncomingCommand extends AbstractCommand * @param request * * @return + * + * @throws RepositoryException */ @Override public ChangesetPagingResult getIncomingChangesets( IncomingCommandRequest request) + throws RepositoryException { File remoteRepository = handler.getDirectory(request.getRemoteRepository()); @@ -88,8 +100,25 @@ public class HgIncomingCommand extends AbstractCommand // TODO implement paging - List changesets = - on(repository).execute(remoteRepository.getAbsolutePath()); + List changesets; + + try + { + + changesets = on(repository).execute(remoteRepository.getAbsolutePath()); + + } + catch (ExecutionException ex) + { + if (ex.getCommand().getReturnCode() == NO_INCOMING_CHANGESETS) + { + changesets = Collections.EMPTY_LIST; + } + else + { + throw new RepositoryException("could not execute incoming command", ex); + } + } return new ChangesetPagingResult(changesets.size(), changesets); } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java index 1c82063bdb..c6d8c354d9 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java @@ -38,6 +38,7 @@ import com.aragost.javahg.Changeset; import org.junit.Test; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.RepositoryException; import static org.junit.Assert.*; @@ -57,9 +58,11 @@ public class HgIncomingCommandTest extends IncomingOutgoingTestBase * * * @throws IOException + * @throws RepositoryException */ @Test - public void testGetIncomingChangesets() throws IOException + public void testGetIncomingChangesets() + throws IOException, RepositoryException { writeNewFile(outgoing, outgoingDirectory, "a.txt", "Content of file a.txt"); writeNewFile(outgoing, outgoingDirectory, "b.txt", "Content of file b.txt"); @@ -84,6 +87,56 @@ public class HgIncomingCommandTest extends IncomingOutgoingTestBase assertChangesetsEqual(c2, cpr.getChangesets().get(1)); } + /** + * Method description + * + * + * @throws RepositoryException + */ + @Test + public void testGetIncomingChangesetsWithEmptyRepository() + throws RepositoryException + { + HgIncomingCommand cmd = createIncomingCommand(); + IncomingCommandRequest request = new IncomingCommandRequest(); + + request.setRemoteRepository(outgoingRepository); + + ChangesetPagingResult cpr = cmd.getIncomingChangesets(request); + + assertNotNull(cpr); + assertEquals(0, cpr.getTotal()); + } + + /** + * Method description + * + * + * @throws IOException + * @throws RepositoryException + */ + @Test(expected = RepositoryException.class) + public void testGetIncomingChangesetsWithUnrelatedRepository() + throws IOException, RepositoryException + { + writeNewFile(outgoing, outgoingDirectory, "a.txt", "Content of file a.txt"); + writeNewFile(outgoing, outgoingDirectory, "b.txt", "Content of file b.txt"); + + commit(outgoing, "added a and b"); + + writeNewFile(incoming, incomingDirectory, "c.txt", "Content of file c.txt"); + writeNewFile(incoming, incomingDirectory, "d.txt", "Content of file d.txt"); + + commit(incoming, "added c and d"); + + HgIncomingCommand cmd = createIncomingCommand(); + IncomingCommandRequest request = new IncomingCommandRequest(); + + request.setRemoteRepository(outgoingRepository); + + cmd.getIncomingChangesets(request); + } + /** * Method description *