diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryIsNotArchivedException.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryIsNotArchivedException.java new file mode 100644 index 0000000000..c868163242 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryIsNotArchivedException.java @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.repository; + +/** + * + * @author Sebastian Sdorra + * + * @since 1.14 + */ +public class RepositoryIsNotArchivedException extends RepositoryException +{ + + /** Field description */ + private static final long serialVersionUID = 7728748133123987511L; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + */ + public RepositoryIsNotArchivedException() {} + + /** + * Constructs ... + * + * + * @param message + */ + public RepositoryIsNotArchivedException(String message) + { + super(message); + } + + /** + * Constructs ... + * + * + * @param cause + */ + public RepositoryIsNotArchivedException(Throwable cause) + { + super(cause); + } + + /** + * Constructs ... + * + * + * @param message + * @param cause + */ + public RepositoryIsNotArchivedException(String message, Throwable cause) + { + super(message, cause); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java index 931127d49b..d3491532cc 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java @@ -62,8 +62,10 @@ import sonia.scm.repository.RepositoryBrowser; import sonia.scm.repository.RepositoryBrowserUtil; import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryHandler; +import sonia.scm.repository.RepositoryIsNotArchivedException; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryNotFoundException; +import sonia.scm.security.ScmSecurityException; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; @@ -178,6 +180,10 @@ public class RepositoryResource * * @@ -190,7 +196,41 @@ public class RepositoryResource @Override public Response delete(@PathParam("id") String id) { - return super.delete(id); + Response response = null; + Repository repository = manager.get(id); + + if (repository != null) + { + preDelete(repository); + + try + { + manager.delete(repository); + response = Response.noContent().build(); + } + catch (RepositoryIsNotArchivedException ex) + { + logger.warn("non archived repository could not be deleted", ex); + response = Response.status(Response.Status.PRECONDITION_FAILED).build(); + } + catch (ScmSecurityException ex) + { + logger.warn("delete not allowd", ex); + response = Response.status(Response.Status.FORBIDDEN).build(); + } + catch (Exception ex) + { + logger.error("error during create", ex); + response = createErrorResonse(ex); + } + } + else + { + logger.warn("could not find repository {}", id); + response = Response.status(Status.NOT_FOUND).build(); + } + + return response; } /** diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index a70d79be82..84793f6451 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -237,7 +237,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager if (configuration.isEnableRepositoryArchive() &&!repository.isArchived()) { - throw new RepositoryException( + throw new RepositoryIsNotArchivedException( "Repository could not deleted, because it is not archived."); } diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryArchiveITCase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryArchiveITCase.java new file mode 100644 index 0000000000..6eeebd4d19 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryArchiveITCase.java @@ -0,0 +1,182 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.it; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import sonia.scm.config.ScmConfiguration; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryTestData; +import sonia.scm.repository.client.RepositoryClientException; + +import static org.junit.Assert.*; + +import static sonia.scm.it.IntegrationTestUtil.*; +import static sonia.scm.it.RepositoryITUtil.*; + +//~--- JDK imports ------------------------------------------------------------ + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; + +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +@RunWith(Parameterized.class) +public class RepositoryArchiveITCase extends RepositoryTypeITCaseBase +{ + + /** + * Constructs ... + * + * + * @param type + */ + public RepositoryArchiveITCase(String type) + { + this.type = type; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + */ + @Before + public void createTestRepository() + { + repository = RepositoryTestData.createHeartOfGold(type); + client = createAdminClient(); + repository = createRepository(client, repository); + } + + /** + * Method description + * + */ + @After + public void deleteTestRepository() + { + if (repository != null) + { + setArchiveMode(false); + deleteRepository(client, repository.getId()); + } + + logoutClient(client); + } + + /** + * Method description + * + */ + @Test + public void testDeleteAllowed() + { + setArchiveMode(true); + + WebResource resource = createResource(client, + "repositories/".concat(repository.getId())); + + repository.setArchived(true); + + ClientResponse response = resource.put(ClientResponse.class, repository); + + assertNotNull(response); + assertEquals(204, response.getStatus()); + response = resource.delete(ClientResponse.class); + assertNotNull(response); + assertEquals(204, response.getStatus()); + repository = null; + } + + /** + * Method description + * + */ + @Test + public void testDeleteDenied() + { + setArchiveMode(true); + + WebResource resource = createResource(client, + "repositories/".concat(repository.getId())); + ClientResponse response = resource.delete(ClientResponse.class); + + assertNotNull(response); + assertEquals(412, response.getStatus()); + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param archive + */ + private void setArchiveMode(boolean archive) + { + WebResource resource = createResource(client, "config"); + ScmConfiguration config = resource.get(ScmConfiguration.class); + + assertNotNull(config); + config.setEnableRepositoryArchive(archive); + + ClientResponse resp = resource.post(ClientResponse.class, config); + + assertNotNull(resp); + assertEquals(201, resp.getStatus()); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Client client; + + /** Field description */ + private Repository repository; + + /** Field description */ + private String type; +} diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryTypeITCaseBase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryTypeITCaseBase.java new file mode 100644 index 0000000000..beb78e25c3 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryTypeITCaseBase.java @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.it; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.junit.runners.Parameterized.Parameters; + +import sonia.scm.util.IOUtil; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.ArrayList; +import java.util.Collection; + +/** + * + * @author Sebastian Sdorra + */ +public class RepositoryTypeITCaseBase +{ + + /** + * Method description + * + * + * @return + */ + @Parameters + public static Collection createParameters() + { + Collection params = new ArrayList(); + + params.add(new String[] { "git" }); + params.add(new String[] { "svn" }); + + if (IOUtil.search("hg") != null) + { + params.add(new String[] { "hg" }); + } + + return params; + } +}