Author: olamy
Date: Sat Mar 24 18:23:43 2012
New Revision: 1304880

URL: http://svn.apache.org/viewvc?rev=1304880&view=rev
Log:
rest services for artifact generic metadatas

Modified:
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java?rev=1304880&r1=1304879&r2=1304880&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
 Sat Mar 24 18:23:43 2012
@@ -26,13 +26,16 @@ import org.apache.archiva.rest.api.model
 import org.apache.archiva.rest.api.model.VersionsList;
 import org.codehaus.plexus.redback.authorization.RedbackAuthorization;
 
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author Olivier Lamy
@@ -103,6 +106,33 @@ public interface BrowseService
     @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
     @RedbackAuthorization( noPermission = true, noRestriction = true )
     List<Artifact> getDependees( @PathParam( "g" ) String groupId, @PathParam( 
"a" ) String artifactId,
-                              @PathParam( "v" ) String version, @QueryParam( 
"repositoryId" ) String repositoryId )
+                                 @PathParam( "v" ) String version, 
@QueryParam( "repositoryId" ) String repositoryId )
+        throws ArchivaRestServiceException;
+
+    @Path( "metadatas/{g}/{a}/{v}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = true, noRestriction = true )
+    Map<String, String> getMetadatas( @PathParam( "g" ) String groupId, 
@PathParam( "a" ) String artifactId,
+                                      @PathParam( "v" ) String version,
+                                      @QueryParam( "repositoryId" ) String 
repositoryId )
+        throws ArchivaRestServiceException;
+
+    @Path( "metadata/{g}/{a}/{v}/{key}/{value}" )
+    @PUT
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = false, noRestriction = false, 
permissions = "archiva-add-metadata" )
+    Boolean addMetadata( @PathParam( "g" ) String groupId, @PathParam( "a" ) 
String artifactId,
+                         @PathParam( "v" ) String version, @PathParam( "key" ) 
String key,
+                         @PathParam( "value" ) String value, @QueryParam( 
"repositoryId" ) String repositoryId )
+        throws ArchivaRestServiceException;
+
+    @Path( "metadata/{g}/{a}/{v}/{key}" )
+    @DELETE
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = false, noRestriction = false, 
permissions = "archiva-add-metadata" )
+    Boolean deleteMetadata( @PathParam( "g" ) String groupId, @PathParam( "a" 
) String artifactId,
+                            @PathParam( "v" ) String version, @PathParam( 
"key" ) String key,
+                            @QueryParam( "repositoryId" ) String repositoryId )
         throws ArchivaRestServiceException;
 }

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml?rev=1304880&r1=1304879&r2=1304880&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
 Sat Mar 24 18:23:43 2012
@@ -63,6 +63,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.archiva</groupId>
+      <artifactId>generic-metadata-support</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-scheduler-repository</artifactId>
     </dependency>
     <dependency>
@@ -301,6 +305,13 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.easytesting</groupId>
+      <artifactId>fest-assert</artifactId>
+      <version>1.4</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
   <build>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java?rev=1304880&r1=1304879&r2=1304880&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
 Sat Mar 24 18:23:43 2012
@@ -18,12 +18,15 @@ package org.apache.archiva.rest.services
  * under the License.
  */
 
-import net.sf.beanlib.provider.replicator.BeanReplicator;
 import org.apache.archiva.admin.model.beans.ManagedRepository;
 import org.apache.archiva.common.utils.VersionComparator;
 import org.apache.archiva.dependency.tree.maven2.DependencyTreeBuilder;
+import org.apache.archiva.metadata.generic.GenericMetadataFacet;
+import org.apache.archiva.metadata.model.MetadataFacet;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
+import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.MetadataResolutionException;
 import org.apache.archiva.metadata.repository.MetadataResolver;
 import org.apache.archiva.metadata.repository.RepositorySession;
@@ -35,12 +38,11 @@ import org.apache.archiva.rest.api.model
 import org.apache.archiva.rest.api.model.VersionsList;
 import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
 import org.apache.archiva.rest.api.services.BrowseService;
+import org.apache.archiva.rest.services.utils.TreeDependencyNodeVisitor;
 import org.apache.archiva.security.ArchivaSecurityException;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
-import org.apache.maven.shared.dependency.tree.DependencyNode;
 import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
 import org.springframework.stereotype.Service;
 
 import javax.inject.Inject;
@@ -48,8 +50,10 @@ import javax.ws.rs.core.Response;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -508,52 +512,6 @@ public class DefaultBrowseService
         return treeEntries;
     }
 
-    private static class TreeDependencyNodeVisitor
-        implements DependencyNodeVisitor
-    {
-
-        final List<TreeEntry> treeEntries;
-
-        private TreeEntry currentEntry;
-
-
-        private DependencyNode firstNode;
-
-
-        boolean firstChild = true;
-
-        private TreeDependencyNodeVisitor( List<TreeEntry> treeEntries )
-        {
-            this.treeEntries = treeEntries;
-        }
-
-        public boolean visit( DependencyNode node )
-        {
-            TreeEntry entry = new TreeEntry( new 
BeanReplicator().replicateBean( node.getArtifact(), Artifact.class ) );
-            entry.setParent( currentEntry );
-            currentEntry = entry;
-
-            if ( firstNode == null )
-            {
-                firstNode = node;
-                treeEntries.add( currentEntry );
-            }
-            else
-            {
-                currentEntry.getParent().getChilds().add( currentEntry );
-            }
-            return true;
-        }
-
-        public boolean endVisit( DependencyNode node )
-        {
-            currentEntry = currentEntry.getParent();
-            firstChild = false;
-            return true;
-        }
-
-    }
-
     public List<ManagedRepository> getUserRepositories()
         throws ArchivaRestServiceException
     {
@@ -605,6 +563,127 @@ public class DefaultBrowseService
         return artifacts;
     }
 
+    public Map<String, String> getMetadatas( String groupId, String 
artifactId, String version, String repositoryId )
+        throws ArchivaRestServiceException
+    {
+        ProjectVersionMetadata projectVersionMetadata =
+            getProjectMetadata( groupId, artifactId, version, repositoryId );
+        if ( projectVersionMetadata == null )
+        {
+            return Collections.emptyMap();
+        }
+        MetadataFacet metadataFacet = projectVersionMetadata.getFacet( 
GenericMetadataFacet.FACET_ID );
+
+        if ( metadataFacet == null )
+        {
+            return Collections.emptyMap();
+        }
+
+        return metadataFacet.toProperties();
+    }
+
+    public Boolean addMetadata( String groupId, String artifactId, String 
version, String key, String value,
+                                String repositoryId )
+        throws ArchivaRestServiceException
+    {
+        ProjectVersionMetadata projectVersionMetadata =
+            getProjectMetadata( groupId, artifactId, version, repositoryId );
+
+        if ( projectVersionMetadata == null )
+        {
+            return Boolean.FALSE;
+        }
+
+        Map<String, String> properties = new HashMap<String, String>();
+
+        MetadataFacet metadataFacet = projectVersionMetadata.getFacet( 
GenericMetadataFacet.FACET_ID );
+
+        if ( metadataFacet != null && metadataFacet.toProperties() != null )
+        {
+            properties.putAll( metadataFacet.toProperties() );
+        }
+        else
+        {
+            metadataFacet = new GenericMetadataFacet();
+        }
+
+        properties.put( key, value );
+
+        metadataFacet.fromProperties( properties );
+
+        projectVersionMetadata.addFacet( metadataFacet );
+
+        RepositorySession repositorySession = 
repositorySessionFactory.createSession();
+
+        try
+        {
+            MetadataRepository metadataRepository = 
repositorySession.getRepository();
+
+            metadataRepository.updateProjectVersion( repositoryId, groupId, 
artifactId, projectVersionMetadata );
+
+            repositorySession.save();
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            log.error( e.getMessage(), e );
+            throw new ArchivaRestServiceException( e.getMessage(),
+                                                   
Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+        }
+        finally
+        {
+            repositorySession.close();
+        }
+        return Boolean.TRUE;
+    }
+
+    public Boolean deleteMetadata( String groupId, String artifactId, String 
version, String key, String repositoryId )
+        throws ArchivaRestServiceException
+    {
+        ProjectVersionMetadata projectVersionMetadata =
+            getProjectMetadata( groupId, artifactId, version, repositoryId );
+
+        if ( projectVersionMetadata == null )
+        {
+            return Boolean.FALSE;
+        }
+
+        GenericMetadataFacet metadataFacet =
+            (GenericMetadataFacet) projectVersionMetadata.getFacet( 
GenericMetadataFacet.FACET_ID );
+
+        if ( metadataFacet != null && metadataFacet.toProperties() != null )
+        {
+            Map<String, String> properties = metadataFacet.toProperties();
+            properties.remove( key );
+            metadataFacet.setAdditionalProperties( properties );
+        }
+        else
+        {
+            return Boolean.TRUE;
+        }
+
+        RepositorySession repositorySession = 
repositorySessionFactory.createSession();
+
+        try
+        {
+            MetadataRepository metadataRepository = 
repositorySession.getRepository();
+
+            metadataRepository.updateProjectVersion( repositoryId, groupId, 
artifactId, projectVersionMetadata );
+
+            repositorySession.save();
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            log.error( e.getMessage(), e );
+            throw new ArchivaRestServiceException( e.getMessage(),
+                                                   
Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+        }
+        finally
+        {
+            repositorySession.close();
+        }
+        return Boolean.TRUE;
+    }
+
     //---------------------------
     // internals
     //---------------------------

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java?rev=1304880&r1=1304879&r2=1304880&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
 Sat Mar 24 18:23:43 2012
@@ -22,6 +22,7 @@ package org.apache.archiva.rest.services
 import org.apache.archiva.admin.model.beans.ManagedRepository;
 import org.apache.archiva.common.utils.FileUtil;
 import org.apache.archiva.rest.api.services.ArchivaAdministrationService;
+import org.apache.archiva.rest.api.services.BrowseService;
 import org.apache.archiva.rest.api.services.CommonServices;
 import org.apache.archiva.rest.api.services.ManagedRepositoriesService;
 import org.apache.archiva.rest.api.services.NetworkProxyService;
@@ -200,6 +201,26 @@ public abstract class AbstractArchivaRes
         return service;
     }
 
+    protected BrowseService getBrowseService( String authzHeader )
+    {
+        BrowseService service =
+            JAXRSClientFactory.create( getBaseUrl() + "/" + 
getRestServicesPath() + "/archivaServices/",
+                                       BrowseService.class,
+                                       Collections.singletonList( new 
JacksonJaxbJsonProvider() ) );
+        // to add authentification
+        if ( authzHeader != null )
+        {
+            WebClient.client( service ).header( "Authorization", authzHeader );
+        }
+
+        WebClient.getConfig( service 
).getHttpConduit().getClient().setReceiveTimeout( 100000000 );
+
+        WebClient.client( service ).accept( MediaType.APPLICATION_JSON_TYPE );
+        WebClient.client( service ).type( MediaType.APPLICATION_JSON_TYPE );
+        return service;
+
+    }
+
     protected SearchService getSearchService( String authzHeader )
     {
         // START SNIPPET: cxf-searchservice-creation


Reply via email to