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
*
* - 201 delete success
* - 403 forbidden, the current user has no owner privileges
+ * -
+ * 412 forbidden, the repository is not archived,
+ * this error occurs only with enabled repository archive.
+ *
* - 500 internal server error
*
*
@@ -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;
+ }
+}