[MRM-1573] improve browse service with returning ProjectVersionMetadata (so add some annotation for REST exchange)

git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1293423 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Olivier Lamy 2012-02-24 21:18:34 +00:00
parent b4bd369412
commit f1f0ceaf47
15 changed files with 211 additions and 10 deletions

View File

@ -45,6 +45,10 @@
<artifactId>archiva-policies</artifactId> <artifactId>archiva-policies</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>metadata-model</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.codehaus.redback</groupId> <groupId>org.codehaus.redback</groupId>

View File

@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
* under the License. * under the License.
*/ */
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.rest.api.model.BrowseResult; import org.apache.archiva.rest.api.model.BrowseResult;
import org.apache.archiva.rest.api.model.VersionsList; import org.apache.archiva.rest.api.model.VersionsList;
import org.codehaus.plexus.redback.authorization.RedbackAuthorization; import org.codehaus.plexus.redback.authorization.RedbackAuthorization;
@ -26,7 +27,6 @@ import javax.ws.rs.GET;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
/** /**
@ -50,10 +50,18 @@ public interface BrowseService
BrowseResult browseGroupId( @PathParam( "groupId" ) String groupId ) BrowseResult browseGroupId( @PathParam( "groupId" ) String groupId )
throws ArchivaRestServiceException; throws ArchivaRestServiceException;
@Path( "browseGroupId" ) @Path( "versionsList/{g}/{a}" )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( noRestriction = true, noPermission = false ) @RedbackAuthorization( noRestriction = true, noPermission = false )
VersionsList getVersionsList( @QueryParam( "g" ) String groupId, @QueryParam( "a" ) String artifactId ) VersionsList getVersionsList( @PathParam( "g" ) String groupId, @PathParam( "a" ) String artifactId )
throws ArchivaRestServiceException;
@Path( "projectVersionMetadata/{g}/{a}" )
@GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( noRestriction = true, noPermission = false )
ProjectVersionMetadata getProjectVersionMetadata( @PathParam( "g" ) String groupId,
@PathParam( "a" ) String artifactId )
throws ArchivaRestServiceException; throws ArchivaRestServiceException;
} }

View File

@ -44,6 +44,10 @@
<groupId>org.apache.archiva</groupId> <groupId>org.apache.archiva</groupId>
<artifactId>archiva-repository-admin-api</artifactId> <artifactId>archiva-repository-admin-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>metadata-model</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.apache.archiva</groupId> <groupId>org.apache.archiva</groupId>
<artifactId>archiva-configuration</artifactId> <artifactId>archiva-configuration</artifactId>

View File

@ -18,15 +18,18 @@ package org.apache.archiva.rest.services;
* under the License. * under the License.
*/ */
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.MetadataResolutionException;
import org.apache.archiva.metadata.repository.MetadataResolver; import org.apache.archiva.metadata.repository.MetadataResolver;
import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.RepositorySession;
import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;
import org.apache.archiva.rest.api.model.BrowseResult; import org.apache.archiva.rest.api.model.BrowseResult;
import org.apache.archiva.rest.api.model.BrowseResultEntry; import org.apache.archiva.rest.api.model.BrowseResultEntry;
import org.apache.archiva.rest.api.model.VersionsList; import org.apache.archiva.rest.api.model.VersionsList;
import org.apache.archiva.rest.api.services.ArchivaRestServiceException; import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
import org.apache.archiva.rest.api.services.BrowseService; import org.apache.archiva.rest.api.services.BrowseService;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
@ -170,8 +173,23 @@ public class DefaultBrowseService
return new VersionsList(); return new VersionsList();
} }
RepositorySession repositorySession = repositorySessionFactory.createSession(); try
{
return new VersionsList( new ArrayList<String>( getVersions( selectedRepos, groupId, artifactId ) ) );
}
catch ( MetadataResolutionException e )
{
throw new ArchivaRestServiceException( e.getMessage(),
Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
}
}
private Set<String> getVersions( List<String> selectedRepos, String groupId, String artifactId )
throws MetadataResolutionException
{
RepositorySession repositorySession = repositorySessionFactory.createSession();
try try
{ {
MetadataResolver metadataResolver = repositorySession.getResolver(); MetadataResolver metadataResolver = repositorySession.getResolver();
@ -184,7 +202,132 @@ public class DefaultBrowseService
metadataResolver.resolveProjectVersions( repositorySession, repoId, groupId, artifactId ) ); metadataResolver.resolveProjectVersions( repositorySession, repoId, groupId, artifactId ) );
} }
return new VersionsList( new ArrayList<String>( versions ) ); return versions;
}
finally
{
repositorySession.close();
}
}
public ProjectVersionMetadata getProjectVersionMetadata( String groupId, String artifactId )
throws ArchivaRestServiceException
{
List<String> selectedRepos = getObservableRepos();
if ( CollectionUtils.isEmpty( selectedRepos ) )
{
// FIXME 403 ???
return null;
}
RepositorySession repositorySession = null;
try
{
Set<String> projectVersions = getVersions( selectedRepos, groupId, artifactId );
repositorySession = repositorySessionFactory.createSession();
MetadataResolver metadataResolver = repositorySession.getResolver();
ProjectVersionMetadata sharedModel = new ProjectVersionMetadata();
MavenProjectFacet mavenFacet = new MavenProjectFacet();
mavenFacet.setGroupId( groupId );
mavenFacet.setArtifactId( artifactId );
sharedModel.addFacet( mavenFacet );
boolean isFirstVersion = true;
for ( String version : projectVersions )
{
ProjectVersionMetadata versionMetadata = null;
for ( String repoId : selectedRepos )
{
if ( versionMetadata == null )
{
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 )
{
continue;
}
if ( isFirstVersion )
{
sharedModel = versionMetadata;
sharedModel.setId( null );
}
else
{
MavenProjectFacet versionMetadataMavenFacet =
(MavenProjectFacet) versionMetadata.getFacet( MavenProjectFacet.FACET_ID );
if ( versionMetadataMavenFacet != null )
{
if ( mavenFacet.getPackaging() != null && !StringUtils.equalsIgnoreCase(
mavenFacet.getPackaging(), versionMetadataMavenFacet.getPackaging() ) )
{
mavenFacet.setPackaging( null );
}
}
if ( sharedModel.getName() != null && !StringUtils.equalsIgnoreCase( sharedModel.getName(),
versionMetadata.getName() ) )
{
sharedModel.setName( "" );
}
if ( sharedModel.getDescription() != null && !StringUtils.equalsIgnoreCase(
sharedModel.getDescription(), versionMetadata.getDescription() ) )
{
sharedModel.setDescription( null );
}
if ( sharedModel.getIssueManagement() != null && versionMetadata.getIssueManagement() != null
&& !StringUtils.equalsIgnoreCase( sharedModel.getIssueManagement().getUrl(),
versionMetadata.getIssueManagement().getUrl() ) )
{
sharedModel.setIssueManagement( null );
}
if ( sharedModel.getCiManagement() != null && versionMetadata.getCiManagement() != null
&& !StringUtils.equalsIgnoreCase( sharedModel.getCiManagement().getUrl(),
versionMetadata.getCiManagement().getUrl() ) )
{
sharedModel.setCiManagement( null );
}
if ( sharedModel.getOrganization() != null && versionMetadata.getOrganization() != null
&& !StringUtils.equalsIgnoreCase( sharedModel.getOrganization().getName(),
versionMetadata.getOrganization().getName() ) )
{
sharedModel.setOrganization( null );
}
if ( sharedModel.getUrl() != null && !StringUtils.equalsIgnoreCase( sharedModel.getUrl(),
versionMetadata.getUrl() ) )
{
sharedModel.setUrl( null );
}
}
isFirstVersion = false;
}
return sharedModel;
} }
catch ( MetadataResolutionException e ) catch ( MetadataResolutionException e )
{ {
@ -193,9 +336,11 @@ public class DefaultBrowseService
} }
finally finally
{ {
repositorySession.close(); if ( repositorySession != null )
{
repositorySession.close();
}
} }
} }
//--------------------------- //---------------------------

View File

@ -42,7 +42,7 @@ $(function() {
displayProjectEntry=function(id){ displayProjectEntry=function(id){
$.log("displayProjectEntry:"+id); $.log("displayProjectEntry:"+id);
var url = "restServices/archivaServices/browseService/browseGroupId?g=org.apache.maven&a=maven-archiver"; var url = "restServices/archivaServices/browseService/versionsList/org.apache.maven/maven-archiver";
$.ajax(url, { $.ajax(url, {
type: "GET", type: "GET",
@ -50,7 +50,18 @@ $(function() {
success: function(data) { success: function(data) {
} }
}); });
url = "restServices/archivaServices/browseService/projectVersionMetadata/org.apache.maven/maven-archiver";
$.ajax(url, {
type: "GET",
dataType: 'json',
success: function(data) {
}
});
} }
breadCrumbEntries=function(){ breadCrumbEntries=function(){

View File

@ -19,11 +19,14 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlRootElement;
/** /**
* Information about the CI system used by the project. * Information about the CI system used by the project.
* *
* @todo considering moving this to a facet - avoid referring to it externally * @todo considering moving this to a facet - avoid referring to it externally
*/ */
@XmlRootElement( name = "ciManagement" )
public class CiManagement public class CiManagement
{ {
/** /**

View File

@ -19,11 +19,14 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlRootElement;
/** /**
* Information about a dependency that this project has on another project or artifact. * Information about a dependency that this project has on another project or artifact.
* *
* @todo will be reviewing what is appropriate for the base here - rest should be in a maven dependency facet - avoid details on it externally * @todo will be reviewing what is appropriate for the base here - rest should be in a maven dependency facet - avoid details on it externally
*/ */
@XmlRootElement( name = "dependency" )
public class Dependency public class Dependency
{ {
/** /**

View File

@ -19,6 +19,7 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlElement;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -77,7 +78,7 @@ public abstract class FacetedMetadata
/** /**
* Get all available facets as a Map (typically used by bean rendering, such as in Archiva's JSPs). * Get all available facets as a Map (typically used by bean rendering, such as in Archiva's JSPs).
*
* @return the map of facets * @return the map of facets
* @see #facets * @see #facets
*/ */

View File

@ -19,11 +19,14 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlRootElement;
/** /**
* Information about the issue management system used by the project. * Information about the issue management system used by the project.
* *
* @todo considering moving this to a facet - avoid referring to it externally * @todo considering moving this to a facet - avoid referring to it externally
*/ */
@XmlRootElement( name = "issueManagement" )
public class IssueManagement public class IssueManagement
{ {
/** /**

View File

@ -19,9 +19,12 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlRootElement;
/** /**
* A description of a particular license used by a project. * A description of a particular license used by a project.
*/ */
@XmlRootElement( name = "license" )
public class License public class License
{ {
/** /**

View File

@ -1,5 +1,6 @@
package org.apache.archiva.metadata.model; package org.apache.archiva.metadata.model;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List; import java.util.List;
/* /*
@ -26,6 +27,7 @@ import java.util.List;
* *
* @todo considering moving this to a facet - avoid referring to it externally * @todo considering moving this to a facet - avoid referring to it externally
*/ */
@XmlRootElement( name = "mailingList" )
public class MailingList public class MailingList
{ {
/** /**

View File

@ -19,14 +19,20 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Map; import java.util.Map;
@XmlRootElement( name = "metadataFacet" )
public interface MetadataFacet public interface MetadataFacet
{ {
@XmlElement(name = "facetId")
String getFacetId(); String getFacetId();
@XmlElement(name = "name")
String getName(); String getName();
@XmlElement(name = "properties")
Map<String, String> toProperties(); Map<String, String> toProperties();
void fromProperties( Map<String, String> properties ); void fromProperties( Map<String, String> properties );

View File

@ -19,6 +19,9 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement( name = "organization" )
public class Organization public class Organization
{ {
private String name; private String name;

View File

@ -19,9 +19,11 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@XmlRootElement( name = "projectVersionMetadata" )
public class ProjectVersionMetadata public class ProjectVersionMetadata
extends FacetedMetadata extends FacetedMetadata
{ {

View File

@ -19,6 +19,9 @@ package org.apache.archiva.metadata.model;
* under the License. * under the License.
*/ */
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement( name = "scm" )
public class Scm public class Scm
{ {
private String connection; private String connection;