From f191f2833d14795d15ce62fb52f9b4790ae4ca5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 2 Aug 2018 08:56:03 +0200 Subject: [PATCH] Fix handling of RepositoryIsNotArchivedException --- .../resources/AbstractManagerResource.java | 14 ---------- .../api/v2/resources/RepositoryResource.java | 19 ++++++++++++-- .../SingleResourceManagerAdapter.java | 12 +++++++++ .../resources/RepositoryRootResourceTest.java | 26 +++++++++++++++++-- 4 files changed, 53 insertions(+), 18 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java index 27ceb03a36..2ad7a64255 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java @@ -374,20 +374,6 @@ public abstract class AbstractManagerResource(manager, Repository.class); + this.adapter = new SingleResourceManagerAdapter<>(manager, Repository.class, this::handleNotArchived); this.tagRootResource = tagRootResource; this.branchRootResource = branchRootResource; this.changesetRootResource = changesetRootResource; @@ -148,6 +155,14 @@ public class RepositoryResource { return permissionRootResource.get(); } + private Optional handleNotArchived(Throwable throwable) { + if (throwable instanceof RepositoryIsNotArchivedException) { + return Optional.of(Response.status(Response.Status.PRECONDITION_FAILED).build()); + } else { + return Optional.empty(); + } + } + private Supplier> loadBy(String namespace, String name) { return () -> manager.getByNamespace(namespace, name); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java index 7f8b115dee..06195284df 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java @@ -31,8 +31,15 @@ class SingleResourceManagerAdapter extends AbstractManagerResource { + private final Function> errorHandler; + SingleResourceManagerAdapter(Manager manager, Class type) { + this(manager, type, e -> Optional.empty()); + } + + SingleResourceManagerAdapter(Manager manager, Class type, Function> errorHandler) { super(manager, type); + this.errorHandler = errorHandler; } /** @@ -70,6 +77,11 @@ class SingleResourceManagerAdapter> createGenericEntity(Collection modelObjects) { throw new UnsupportedOperationException(); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index a8616fe2ce..f0e875e650 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -15,6 +15,7 @@ import org.mockito.Mock; import sonia.scm.PageResult; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RepositoryIsNotArchivedException; import sonia.scm.repository.RepositoryManager; import sonia.scm.web.VndMediaType; @@ -27,14 +28,21 @@ import java.net.URL; import static java.util.Collections.singletonList; import static java.util.Optional.empty; import static java.util.Optional.of; -import static javax.servlet.http.HttpServletResponse.*; +import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; +import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; +import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT; +import static javax.servlet.http.HttpServletResponse.SC_OK; +import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @SubjectAware( @@ -191,6 +199,20 @@ public class RepositoryRootResourceTest { verify(repositoryManager).delete(anyObject()); } + @Test + public void shouldHandleDeleteIsNotArchivedException() throws Exception { + mockRepository("space", "repo"); + + doThrow(RepositoryIsNotArchivedException.class).when(repositoryManager).delete(anyObject()); + + MockHttpRequest request = MockHttpRequest.delete("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo"); + MockHttpResponse response = new MockHttpResponse(); + + dispatcher.invoke(request, response); + + assertEquals(SC_PRECONDITION_FAILED, response.getStatus()); + } + @Test public void shouldCreateNewRepositoryInCorrectNamespace() throws URISyntaxException, IOException, RepositoryException { when(repositoryManager.create(any())).thenAnswer(invocation -> {