From 710489fc7288eb61079356058eff72429751fb60 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Tue, 5 Jun 2012 23:17:23 +0000 Subject: [PATCH] implement service to delete groupId git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1346651 13f79535-47bb-0310-9956-ffa450edef68 --- .../repository/ManagedRepositoryContent.java | 9 +++ .../ManagedDefaultRepositoryContent.java | 22 ++++++++ .../ManagedLegacyRepositoryContent.java | 55 ++++++++++--------- .../api/services/RepositoriesService.java | 2 +- .../services/DefaultRepositoriesService.java | 29 +++++++++- .../services/RepositoriesServiceTest.java | 18 ++++++ 6 files changed, 108 insertions(+), 27 deletions(-) diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java index a23415ed9..01c5fc06f 100644 --- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java +++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java @@ -49,12 +49,21 @@ public interface ManagedRepositoryContent /** * delete a specified artifact from the repository + * * @param artifactReference * @throws ContentNotFoundException */ void deleteArtifact( ArtifactReference artifactReference ) throws ContentNotFoundException; + /** + * @since 1.4-M3 + * @param groupId + * @throws ContentNotFoundException + */ + void deleteGroupId( String groupId ) + throws ContentNotFoundException; + /** *

* Convenience method to get the repository id. diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedDefaultRepositoryContent.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedDefaultRepositoryContent.java index 0c626436f..36b32df06 100644 --- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedDefaultRepositoryContent.java +++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedDefaultRepositoryContent.java @@ -31,6 +31,7 @@ import org.apache.archiva.repository.ContentNotFoundException; import org.apache.archiva.repository.ManagedRepositoryContent; import org.apache.archiva.repository.layout.LayoutException; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @@ -102,6 +103,27 @@ public class ManagedDefaultRepositoryContent } } + public void deleteGroupId( String groupId ) + throws ContentNotFoundException + { + + String path = StringUtils.replaceChars( groupId, '.', '/' ); + + File directory = new File( getRepoRoot(), path ); + + if ( directory.exists() ) + { + try + { + FileUtils.deleteDirectory( directory ); + } + catch ( IOException e ) + { + log.warn( "skip error deleting directory {}:", directory.getPath(), e ); + } + } + } + public String getId() { return repository.getId(); diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedLegacyRepositoryContent.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedLegacyRepositoryContent.java index 56690c7b6..a03626a90 100644 --- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedLegacyRepositoryContent.java +++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/ManagedLegacyRepositoryContent.java @@ -20,8 +20,6 @@ package org.apache.archiva.repository.content; */ import org.apache.archiva.admin.model.beans.ManagedRepository; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.StringUtils; import org.apache.archiva.common.utils.PathUtil; import org.apache.archiva.configuration.FileTypes; import org.apache.archiva.model.ArchivaArtifact; @@ -31,6 +29,8 @@ import org.apache.archiva.model.VersionedReference; import org.apache.archiva.repository.ContentNotFoundException; import org.apache.archiva.repository.ManagedRepositoryContent; import org.apache.archiva.repository.layout.LayoutException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @@ -40,14 +40,13 @@ import java.util.HashSet; import java.util.Set; /** - * ManagedLegacyRepositoryContent + * ManagedLegacyRepositoryContent * * @version $Id$ - * * @todo no need to be a component when filetypes, legacy path parser is not */ -@Service("managedRepositoryContent#legacy") -@Scope("prototype") +@Service( "managedRepositoryContent#legacy" ) +@Scope( "prototype" ) public class ManagedLegacyRepositoryContent extends AbstractLegacyRepositoryContent implements ManagedRepositoryContent @@ -67,14 +66,14 @@ public class ManagedLegacyRepositoryContent if ( !groupDir.exists() ) { - throw new ContentNotFoundException( "Unable to get versions using a non-existant groupId directory: " - + groupDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() ); } if ( !groupDir.isDirectory() ) { - throw new ContentNotFoundException( "Unable to get versions using a non-directory: " - + groupDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() ); } // First gather up the versions found as artifacts in the managed repository. @@ -159,14 +158,14 @@ public class ManagedLegacyRepositoryContent if ( !repoDir.exists() ) { - throw new ContentNotFoundException( "Unable to get related artifacts using a non-existant directory: " - + repoDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get related artifacts using a non-existant directory: " + repoDir.getAbsolutePath() ); } if ( !repoDir.isDirectory() ) { - throw new ContentNotFoundException( "Unable to get related artifacts using a non-directory: " - + repoDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get related artifacts using a non-directory: " + repoDir.getAbsolutePath() ); } Set foundArtifacts = new HashSet(); @@ -210,14 +209,14 @@ public class ManagedLegacyRepositoryContent if ( !groupDir.exists() ) { - throw new ContentNotFoundException( "Unable to get versions using a non-existant groupId directory: " - + groupDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() ); } if ( !groupDir.isDirectory() ) { - throw new ContentNotFoundException( "Unable to get versions using a non-directory: " - + groupDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() ); } Set foundVersions = new HashSet(); @@ -250,14 +249,14 @@ public class ManagedLegacyRepositoryContent if ( !groupDir.exists() ) { - throw new ContentNotFoundException( "Unable to get versions using a non-existant groupId directory: " - + groupDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() ); } if ( !groupDir.isDirectory() ) { - throw new ContentNotFoundException( "Unable to get versions using a non-directory: " - + groupDir.getAbsolutePath() ); + throw new ContentNotFoundException( + "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() ); } Set foundVersions = new HashSet(); @@ -322,7 +321,7 @@ public class ManagedLegacyRepositoryContent /** * Convert a path to an artifact reference. - * + * * @param path the path to convert. (relative or full location path) * @throws LayoutException if the path cannot be converted to an artifact reference. */ @@ -337,7 +336,7 @@ public class ManagedLegacyRepositoryContent return super.toArtifactReference( path ); } - + public File toFile( ArchivaArtifact reference ) { return new File( repository.getLocation(), toPath( reference ) ); @@ -454,7 +453,7 @@ public class ManagedLegacyRepositoryContent } } } - + public void setFileTypes( FileTypes fileTypes ) { this.filetypes = fileTypes; @@ -465,4 +464,10 @@ public class ManagedLegacyRepositoryContent { // TODO implements for legacy ?? } + + public void deleteGroupId( String groupId ) + throws ContentNotFoundException + { + // TODO implements for legacy ?? + } } diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java index 06509af11..406322e3a 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java @@ -137,7 +137,7 @@ public interface RepositoriesService * permissions are checked in impl * @since 1.4-M3 */ - Boolean deleteGroupId( @QueryParam( "groupId" ) String groupId ) + Boolean deleteGroupId( @QueryParam( "groupId" ) String groupId, @QueryParam( "repositoryId" ) String repositoryId ) throws ArchivaRestServiceException; } diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java index d49f6efca..09b74a3cd 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java @@ -804,9 +804,36 @@ public class DefaultRepositoriesService return Boolean.TRUE; } - public Boolean deleteGroupId( String groupId ) + public Boolean deleteGroupId( String groupId, String repositoryId ) throws ArchivaRestServiceException { + if ( StringUtils.isEmpty( repositoryId ) ) + { + throw new ArchivaRestServiceException( "repositoryId cannot be null", 400, null ); + } + + if ( !isAuthorizedToDeleteArtifacts( repositoryId ) ) + { + throw new ArchivaRestServiceException( "not authorized to delete artifacts", 403, null ); + } + + if ( StringUtils.isEmpty( groupId ) ) + { + throw new ArchivaRestServiceException( "artifact.groupId cannot be null", 400, null ); + } + + try + { + ManagedRepositoryContent repository = repositoryFactory.getManagedRepositoryContent( repositoryId ); + + repository.deleteGroupId( groupId ); + + } + catch ( RepositoryException e ) + { + log.error( e.getMessage(), e ); + throw new ArchivaRestServiceException( "Repository exception: " + e.getMessage(), 500, e ); + } return true; } diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java index ad492a6c7..fdcd8e1ed 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java @@ -274,10 +274,28 @@ public class RepositoriesServiceTest assertNotNull( browseResult ); + log.info( "browseResult: {}", browseResult ); + Assertions.assertThat( browseResult.getBrowseResultEntries() ).isNotNull().isNotEmpty().contains( new BrowseResultEntry( "org.apache.karaf.features.org.apache.karaf.features.command", true ), new BrowseResultEntry( "org.apache.karaf.features.org.apache.karaf.features.core", true ) ); + File directory = + new File( "target/test-origin-repo/org/apache/karaf/features/org.apache.karaf.features.command" ); + + assertTrue( "directory not exists", directory.exists() ); + + RepositoriesService repositoriesService = getRepositoriesService( authorizationHeader ); + repositoriesService.deleteGroupId( "org.apache.karaf.features", SOURCE_REPO_ID ); + + assertFalse( "directory not exists", directory.exists() ); + + browseResult = browseService.browseGroupId( "org.apache.karaf.features", SOURCE_REPO_ID ); + + assertNotNull( browseResult ); + + Assertions.assertThat( browseResult.getBrowseResultEntries() ).isNotNull().isEmpty(); + log.info( "browseResult: {}", browseResult ); } finally