]> source.dussan.org Git - archiva.git/commitdiff
add a rest method to get project metadata for 1 version only
authorOlivier Lamy <olamy@apache.org>
Fri, 16 Mar 2012 16:42:52 +0000 (16:42 +0000)
committerOlivier Lamy <olamy@apache.org>
Fri, 16 Mar 2012 16:42:52 +0000 (16:42 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1301640 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java

index cc76f25338741bcf7b15aa47ff631e49ce8aded7..92091d2edd208b7f52a0179b9a41bd121ee38639 100644 (file)
@@ -71,6 +71,15 @@ public interface BrowseService
                                                       @QueryParam( "repositoryId" ) String repositoryId )
         throws ArchivaRestServiceException;
 
+    @Path( "projectVersionMetadata/{g}/{a}/{v}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = true, noRestriction = true )
+    ProjectVersionMetadata getProjectMetadata( @PathParam( "g" ) String groupId, @PathParam( "a" ) String artifactId,
+                                               @PathParam( "v" ) String version,
+                                               @QueryParam( "repositoryId" ) String repositoryId )
+        throws ArchivaRestServiceException;
+
     @Path( "userRepositories" )
     @GET
     @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
index 980114f4c88b52b3c80f6709204976eb2b913c57..ec3948f1e1d34e9050afee0b693f0cd1275126b2 100644 (file)
@@ -35,6 +35,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
+import javax.ws.rs.PathParam;
 import javax.ws.rs.core.Response;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -251,6 +252,88 @@ public class DefaultBrowseService
         }
     }
 
+    public ProjectVersionMetadata getProjectMetadata( @PathParam( "g" ) String groupId,
+                                                      @PathParam( "a" ) String artifactId,
+                                                      @PathParam( "v" ) String version, String repositoryId )
+        throws ArchivaRestServiceException
+    {
+        List<String> selectedRepos = getObservableRepos();
+
+        if ( CollectionUtils.isEmpty( selectedRepos ) )
+        {
+            // FIXME 403 ???
+            return null;
+        }
+
+        if ( StringUtils.isNotEmpty( repositoryId ) )
+        {
+            // check user has karma on the repository
+            if ( !selectedRepos.contains( repositoryId ) )
+            {
+                throw new ArchivaRestServiceException( "browse.root.groups.repositoy.denied",
+                                                       Response.Status.FORBIDDEN.getStatusCode() );
+            }
+            selectedRepos = Collections.singletonList( repositoryId );
+        }
+
+        RepositorySession repositorySession = null;
+        try
+        {
+            repositorySession = repositorySessionFactory.createSession();
+
+            MetadataResolver metadataResolver = repositorySession.getResolver();
+
+            ProjectVersionMetadata versionMetadata = null;
+            for ( String repoId : selectedRepos )
+            {
+                if ( versionMetadata == null || versionMetadata.isIncomplete() )
+                {
+                    try
+                    {
+                        versionMetadata =
+                            metadataResolver.resolveProjectVersion( repositorySession, repoId, groupId, artifactId,
+                                                                    version );
+                    }
+                    catch ( MetadataResolutionException e )
+                    {
+                        log.error(
+                            "Skipping invalid metadata while compiling shared model for " + groupId + ":" + artifactId
+                                + " in repo " + repoId + ": " + e.getMessage() );
+                    }
+                }
+            }
+            if ( versionMetadata == null )
+            {
+                return null;
+            }
+
+            MavenProjectFacet mavenFacet = new MavenProjectFacet();
+            mavenFacet.setGroupId( groupId );
+            mavenFacet.setArtifactId( artifactId );
+            versionMetadata.addFacet( mavenFacet );
+            MavenProjectFacet versionMetadataMavenFacet =
+                (MavenProjectFacet) versionMetadata.getFacet( MavenProjectFacet.FACET_ID );
+            if ( versionMetadataMavenFacet != null )
+            {
+                if ( mavenFacet.getPackaging() != null && !StringUtils.equalsIgnoreCase( mavenFacet.getPackaging(),
+                                                                                         versionMetadataMavenFacet.getPackaging() ) )
+                {
+                    mavenFacet.setPackaging( null );
+                }
+            }
+
+            return versionMetadata;
+        }
+        finally
+        {
+            if ( repositorySession != null )
+            {
+                repositorySession.close();
+            }
+        }
+
+    }
+
     public ProjectVersionMetadata getProjectVersionMetadata( String groupId, String artifactId, String repositoryId )
         throws ArchivaRestServiceException
     {
@@ -298,7 +381,7 @@ public class DefaultBrowseService
                 ProjectVersionMetadata versionMetadata = null;
                 for ( String repoId : selectedRepos )
                 {
-                    if ( versionMetadata == null )
+                    if ( versionMetadata == null || versionMetadata.isIncomplete() )
                     {
                         try
                         {