You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ca...@apache.org on 2014/12/01 17:30:06 UTC

[1/4] archiva git commit: [MRM-1390] Add REST methods to search JCR store for generic metadata and properties

Repository: archiva
Updated Branches:
  refs/heads/master d9473241c -> f11f39932


[MRM-1390] Add REST methods to search JCR store for generic metadata and properties

Added REST methods:

artifactsByProjectVersionMetadata/{key}/{value}
artifactsByMetadata/{key}/{value}
artifactsByProperty/{key}/{value}
searchArtifacts/{text}
searchArtifacts/{key}/{text}

In JCR implementation When searching into any property (key = nil) we can't do exact searchs


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/e4da1fa6
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/e4da1fa6
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/e4da1fa6

Branch: refs/heads/master
Commit: e4da1fa6f5a56bbf63bae1de7d1b7dd0ae0375aa
Parents: d947324
Author: Carlos Sanchez <cs...@maestrodev.com>
Authored: Wed Nov 5 20:11:08 2014 +0100
Committer: Carlos Sanchez <ca...@apache.org>
Committed: Mon Dec 1 16:48:13 2014 +0100

----------------------------------------------------------------------
 .../site/apt/adminguide/webservices/rest.apt.vm |  33 +++
 .../rest/api/services/BrowseService.java        |  98 +++++++
 .../rest/services/AbstractRestService.java      |   8 +-
 .../rest/services/DefaultBrowseService.java     | 102 ++++++++
 .../rest/services/AbstractArchivaRestTest.java  |   2 +
 .../rest/services/BrowseServiceTest.java        |  86 ++++++
 .../metadata/metadata-repository-api/pom.xml    |   5 +
 .../repository/AbstractMetadataRepository.java  |  35 +++
 .../metadata/repository/MetadataRepository.java |  63 +++++
 .../AbstractMetadataRepositoryTest.java         | 262 +++++++++++++++++--
 .../plugins/metadata-store-cassandra/pom.xml    |   5 +
 .../cassandra/CassandraMetadataRepository.java  |  37 +++
 .../CassandraMetadataRepositoryTest.java        | 105 +++++++-
 .../plugins/metadata-store-file/pom.xml         |   5 +
 .../repository/file/FileMetadataRepository.java |  35 +++
 .../file/FileMetadataRepositoryTest.java        |  97 +++++++
 .../plugins/metadata-store-jcr/pom.xml          |  10 +
 .../repository/jcr/JcrMetadataRepository.java   | 112 +++++++-
 18 files changed, 1069 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-docs/src/site/apt/adminguide/webservices/rest.apt.vm
----------------------------------------------------------------------
diff --git a/archiva-docs/src/site/apt/adminguide/webservices/rest.apt.vm b/archiva-docs/src/site/apt/adminguide/webservices/rest.apt.vm
index 9147171..874c3ea 100644
--- a/archiva-docs/src/site/apt/adminguide/webservices/rest.apt.vm
+++ b/archiva-docs/src/site/apt/adminguide/webservices/rest.apt.vm
@@ -75,6 +75,39 @@ Using REST Services
 
   To know all the possible options, you can refer to the javadoc of SearchRequest class.
 
+* Browse Service
+
+   Get a Browse Service Client :
+
+%{snippet|id=cxf-browseservice-creation|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java}
+
+  Get artifacts based on project version metadata, generic metadata added previously in Archiva :
+
+%{snippet|id=get-artifacts-by-project-version-metadata|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java}
+
+  Get artifacts based on the artifact properties :
+
+%{snippet|id=get-artifacts-by-metadata|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java}
+
+
+  Get artifacts based on the project properties from POM :
+
+%{snippet|id=get-artifacts-by-property|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java}
+
+
+  Searching by properties and metadata :
+
+%{snippet|id=search-artifacts-by-field|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java}
+
+%{snippet|id=search-artifacts|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java}
+
+
+
+   Get  Search
+
+%{snippet|id=quick-search|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/SearchServiceTest.java}
+
+
   Dependencies to add in order to use those REST Services
 
 %{snippet|id=rest-dependencies|ignoreDownloadError=true|url=https://raw.githubusercontent.com/apache/archiva/master/pom.xml}

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
index 5cd0f50..777d15d 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
@@ -231,4 +231,102 @@ public interface BrowseService
     @RedbackAuthorization(noPermission = true, noRestriction = true)
     List<Artifact> getArtifacts( @PathParam("r") String repositoryId )
         throws ArchivaRestServiceException;
+
+    /**
+     * Return List of artifacts from this repository with project version level metadata key matching value. If
+     * repository is not provided the search runs in all repositories.
+     *
+     * @param key
+     * @param value
+     * @param repositoryId
+     * @return
+     * @throws ArchivaRestServiceException
+     * @since 2.2
+     */
+    @Path( "artifactsByProjectVersionMetadata/{key}/{value}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = true, noRestriction = true )
+    List<Artifact> getArtifactsByProjectVersionMetadata( @PathParam( "key" ) String key, @PathParam( "value" ) String value,
+                                           @QueryParam("repositoryId") String repositoryId )
+        throws ArchivaRestServiceException;
+
+    /**
+     * Return List of artifacts from this repository with artifact metadata key matching value.
+     * If repository is not provided the search runs in all repositories.
+     *
+     * @param key
+     * @param value
+     * @param repositoryId
+     * @return
+     * @throws ArchivaRestServiceException
+     * @since 2.2
+     */
+    @Path( "artifactsByMetadata/{key}/{value}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = true, noRestriction = true )
+    List<Artifact> getArtifactsByMetadata( @PathParam( "key" ) String key, @PathParam( "value" ) String value,
+                                           @QueryParam("repositoryId") String repositoryId )
+        throws ArchivaRestServiceException;
+
+    /**
+     * Return List of artifacts from this repository with property key matching value.
+     * If repository is not provided the search runs in all repositories.
+     *
+     * @param key
+     * @param value
+     * @param repositoryId
+     * @return
+     * @throws ArchivaRestServiceException
+     * @since 2.2
+     */
+    @Path( "artifactsByProperty/{key}/{value}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = true, noRestriction = true )
+    List<Artifact> getArtifactsByProperty( @PathParam( "key" ) String key, @PathParam( "value" ) String value,
+                                           @QueryParam("repositoryId") String repositoryId )
+        throws ArchivaRestServiceException;
+
+    /**
+     * Search artifacts with any property matching text. If repository is not provided the search runs in all
+     * repositories. If exact is true only the artifacts whose property match exactly are returned.
+     *
+     * @param text
+     * @param repositoryId
+     * @param exact
+     * @return
+     * @throws ArchivaRestServiceException
+     * @since 2.2
+     */
+    @Path( "searchArtifacts/{text}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = true, noRestriction = true )
+    List<Artifact> searchArtifacts( @PathParam( "text" ) String text,
+                                    @QueryParam( "repositoryId" ) String repositoryId,
+                                    @QueryParam( "exact" ) Boolean exact )
+        throws ArchivaRestServiceException;
+
+    /**
+     * Search artifacts with the property specified by key matching text. If repository is not provided the search runs
+     * in all repositories. If exact is true only the artifacts whose property match exactly are returned.
+     *
+     * @param key
+     * @param text
+     * @param repositoryId
+     * @param exact
+     * @return
+     * @throws ArchivaRestServiceException
+     * @since 2.2
+     */
+    @Path( "searchArtifacts/{key}/{text}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @RedbackAuthorization( noPermission = true, noRestriction = true )
+    List<Artifact> searchArtifacts( @PathParam( "key" ) String key, @PathParam( "text" ) String text,
+                                    @QueryParam( "repositoryId" ) String repositoryId,
+                                    @QueryParam( "exact" ) Boolean exact )
+        throws ArchivaRestServiceException;
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java
index b0107cc..2282959 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java
@@ -62,6 +62,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -322,9 +323,14 @@ public abstract class AbstractRestService
                 for ( ArtifactMetadata artifact : artifactMetadatas )
                 {
 
+                    String repoId = repositoryId != null ? repositoryId : artifact.getRepositoryId();
+                    if ( repoId == null ) {
+                        throw new IllegalStateException( "Repository Id is null" );
+                    }
+
                     ArtifactBuilder builder =
                         new ArtifactBuilder().forArtifactMetadata( artifact ).withManagedRepositoryContent(
-                            repositoryContentFactory.getManagedRepositoryContent( repositoryId ) );
+                            repositoryContentFactory.getManagedRepositoryContent( repoId ) );
                     Artifact art = builder.build();
                     art.setUrl( getArtifactUrl( art, repositoryId ) );
                     artifacts.add( art );

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
index c7af0fe..5e5a465 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
@@ -942,6 +942,66 @@ public class DefaultBrowseService
     }
 
     @Override
+    public List<Artifact> getArtifactsByProjectVersionMetadata( String key, String value, String repositoryId )
+        throws ArchivaRestServiceException
+    {
+        RepositorySession repositorySession = repositorySessionFactory.createSession();
+        try
+        {
+            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByProjectVersionMetadata( key, value, repositoryId );
+            return buildArtifacts( artifactMetadatas, repositoryId );
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            throw new ArchivaRestServiceException( e.getMessage(), e );
+        }
+        finally
+        {
+            repositorySession.close();
+        }
+    }
+
+    @Override
+    public List<Artifact> getArtifactsByMetadata( String key, String value, String repositoryId )
+        throws ArchivaRestServiceException
+    {
+        RepositorySession repositorySession = repositorySessionFactory.createSession();
+        try
+        {
+            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByMetadata( key, value, repositoryId );
+            return buildArtifacts( artifactMetadatas, repositoryId );
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            throw new ArchivaRestServiceException( e.getMessage(), e );
+        }
+        finally
+        {
+            repositorySession.close();
+        }
+    }
+
+    @Override
+    public List<Artifact> getArtifactsByProperty( String key, String value, String repositoryId )
+        throws ArchivaRestServiceException
+    {
+        RepositorySession repositorySession = repositorySessionFactory.createSession();
+        try
+        {
+            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByProperty( key, value, repositoryId );
+            return buildArtifacts( artifactMetadatas, repositoryId );
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            throw new ArchivaRestServiceException( e.getMessage(), e );
+        }
+        finally
+        {
+            repositorySession.close();
+        }
+    }
+
+    @Override
     public Boolean importMetadata( MetadataAddRequest metadataAddRequest, String repositoryId )
         throws ArchivaRestServiceException
     {
@@ -959,6 +1019,48 @@ public class DefaultBrowseService
         return result;
     }
 
+    @Override
+    public List<Artifact> searchArtifacts( String text, String repositoryId, Boolean exact )
+        throws ArchivaRestServiceException
+    {
+        RepositorySession repositorySession = repositorySessionFactory.createSession();
+        try
+        {
+            List<ArtifactMetadata> artifactMetadatas =
+                repositorySession.getRepository().searchArtifacts( text, repositoryId, exact == null ? false : exact );
+            return buildArtifacts( artifactMetadatas, repositoryId );
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            throw new ArchivaRestServiceException( e.getMessage(), e );
+        }
+        finally
+        {
+            repositorySession.close();
+        }
+    }
+
+    @Override
+    public List<Artifact> searchArtifacts( String key, String text, String repositoryId, Boolean exact )
+        throws ArchivaRestServiceException
+    {
+        RepositorySession repositorySession = repositorySessionFactory.createSession();
+        try
+        {
+            List<ArtifactMetadata> artifactMetadatas =
+                repositorySession.getRepository().searchArtifacts( key, text, repositoryId, exact == null ? false : exact );
+            return buildArtifacts( artifactMetadatas, repositoryId );
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            throw new ArchivaRestServiceException( e.getMessage(), e );
+        }
+        finally
+        {
+            repositorySession.close();
+        }
+    }
+
     //---------------------------
     // internals
     //---------------------------

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
index 3104480..2453e6a 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
@@ -252,6 +252,7 @@ public abstract class AbstractArchivaRestTest
 
     protected BrowseService getBrowseService( String authzHeader, boolean useXml )
     {
+        // START SNIPPET: cxf-browseservice-creation
         BrowseService service =
             JAXRSClientFactory.create( getBaseUrl() + "/" + getRestServicesPath() + "/archivaServices/",
                                        BrowseService.class,
@@ -274,6 +275,7 @@ public abstract class AbstractArchivaRestTest
             WebClient.client( service ).type( MediaType.APPLICATION_JSON_TYPE );
         }
         return service;
+        // END SNIPPET: cxf-browseservice-creation
 
     }
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java
index 99cb83b..9490cf6 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/BrowseServiceTest.java
@@ -237,6 +237,92 @@ public class BrowseServiceTest
 
 
     @Test
+    public void getArtifactsByMetadata()
+        throws Exception
+    {
+        // START SNIPPET: get-artifacts-by-metadata
+        BrowseService browseService = getBrowseService( authorizationHeader, true );
+
+        List<Artifact> artifactDownloadInfos = browseService.getArtifactsByMetadata( "type", "pom", TEST_REPO_ID );
+
+        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 11 );
+        // END SNIPPET: get-artifacts-by-metadata
+    }
+
+
+    @Test
+    public void getArtifactsByProjectVersionMetadata()
+        throws Exception
+    {
+        // START SNIPPET: get-artifacts-by-project-version-metadata
+        BrowseService browseService = getBrowseService( authorizationHeader, true );
+
+        browseService.addMetadata( "commons-cli", "commons-cli", "1.0", "wine", "bordeaux", TEST_REPO_ID );
+
+        List<Artifact> artifactDownloadInfos = browseService.getArtifactsByProjectVersionMetadata( "wine", "bordeaux", TEST_REPO_ID );
+
+        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 3 );
+        // END SNIPPET: get-artifacts-by-project-version-metadata
+    }
+
+
+    @Test
+    public void getArtifactsByProjectVersionMetadataWithNoRepository()
+        throws Exception
+    {
+        BrowseService browseService = getBrowseService( authorizationHeader, true );
+
+        browseService.addMetadata( "commons-cli", "commons-cli", "1.0", "wine", "bordeaux", TEST_REPO_ID );
+
+        List<Artifact> artifactDownloadInfos = browseService.getArtifactsByProjectVersionMetadata( "wine", "bordeaux", null );
+
+        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 3 );
+    }
+
+
+    @Test
+    public void getArtifactsByProperty()
+        throws Exception
+    {
+        // START SNIPPET: get-artifacts-by-property
+        BrowseService browseService = getBrowseService( authorizationHeader, true );
+
+        List<Artifact> artifactDownloadInfos = browseService.getArtifactsByProperty( "org.name", "The Apache Software Foundation", TEST_REPO_ID );
+
+        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 7 );
+        // END SNIPPET: get-artifacts-by-property
+    }
+
+
+    @Test
+    public void searchArtifacts()
+        throws Exception
+    {
+        // START SNIPPET: search-artifacts
+        BrowseService browseService = getBrowseService( authorizationHeader, true );
+
+        List<Artifact> artifactDownloadInfos = browseService.searchArtifacts( "The Apache Software Foundation", TEST_REPO_ID, true );
+
+        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 7 );
+        // END SNIPPET: search-artifacts
+    }
+
+
+    @Test
+    public void searchArtifactsByField()
+        throws Exception
+    {
+        // START SNIPPET: search-artifacts-by-field
+        BrowseService browseService = getBrowseService( authorizationHeader, true );
+
+        List<Artifact> artifactDownloadInfos = browseService.searchArtifacts( "org.name", "The Apache Software Foundation", TEST_REPO_ID, true );
+
+        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 7 );
+        // END SNIPPET: search-artifacts-by-field
+    }
+
+
+    @Test
     public void readArtifactContentText()
         throws Exception
     {

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/metadata/metadata-repository-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/metadata-repository-api/pom.xml b/archiva-modules/metadata/metadata-repository-api/pom.xml
index 8cfd25d..face825 100644
--- a/archiva-modules/metadata/metadata-repository-api/pom.xml
+++ b/archiva-modules/metadata/metadata-repository-api/pom.xml
@@ -67,6 +67,11 @@
       <artifactId>assertj-core</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>generic-metadata-support</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <plugins>

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java
index 7372229..8bec501 100644
--- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java
+++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java
@@ -125,6 +125,27 @@ public abstract class AbstractMetadataRepository
     }
 
     @Override
+    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( String key , String value , String repositoryId  )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByMetadata( String key , String value , String repositoryId  )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByProperty( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public void removeArtifact( String repositoryId, String namespace, String project, String version, String id )
         throws MetadataRepositoryException
     {
@@ -277,4 +298,18 @@ public abstract class AbstractMetadataRepository
         throw new UnsupportedOperationException();
     }
 
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
index eb7648b..421eccd 100644
--- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
+++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
@@ -102,6 +102,43 @@ public interface MetadataRepository
     Collection<ArtifactMetadata> getArtifactsByChecksum( String repositoryId, String checksum )
         throws MetadataRepositoryException;
 
+    /**
+     * Get artifacts with a project version metadata key that matches the passed value.
+     *  
+     * @param key
+     * @param value
+     * @param repositoryId can be null, meaning search in all repositories
+     * @return a list of artifacts
+     * @throws MetadataRepositoryException
+     */
+    List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException;
+
+    /**
+     * Get artifacts with an artifact metadata key that matches the passed value.
+     *  
+     * @param key
+     * @param value
+     * @param repositoryId can be null, meaning search in all repositories
+     * @return a list of artifacts
+     * @throws MetadataRepositoryException
+     */
+    List<ArtifactMetadata> getArtifactsByMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException;
+
+    /**
+     * Get artifacts with a property key that matches the passed value.
+     * Possible keys are 'scm.url', 'org.name', 'url', 'mailingList.0.name', 'license.0.name',...
+     *  
+     * @param key
+     * @param value
+     * @param repositoryId can be null, meaning search in all repositories
+     * @return a list of artifacts
+     * @throws MetadataRepositoryException
+     */
+    List<ArtifactMetadata> getArtifactsByProperty( String key, String value, String repositoryId )
+        throws MetadataRepositoryException;
+
     void removeArtifact( String repositoryId, String namespace, String project, String version, String id )
         throws MetadataRepositoryException;
 
@@ -270,4 +307,30 @@ public interface MetadataRepository
 
     <T> T obtainAccess( Class<T> aClass )
         throws MetadataRepositoryException;
+
+    /**
+     * Full text artifacts search.
+     *  
+     * @param text
+     * @param repositoryId can be null to search in all repositories
+     * @param exact running an exact search, the value must exactly match the text.  
+     * @return a list of artifacts
+     * @throws MetadataRepositoryException
+     */
+    List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException;
+
+    /**
+     * Full text artifacts search inside the specified key.
+     *  
+     * @param key search only inside this key
+     * @param text
+     * @param repositoryId can be null to search in all repositories
+     * @param exact running an exact search, the value must exactly match the text.  
+     * @return a list of artifacts
+     * @throws MetadataRepositoryException
+     */
+    List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException;
+
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
index 221eae2..75c961f 100644
--- a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
+++ b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
@@ -19,7 +19,26 @@ package org.apache.archiva.metadata.repository;
  * under the License.
  */
 
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
 import junit.framework.TestCase;
+
+import org.apache.archiva.metadata.generic.GenericMetadataFacet;
+import org.apache.archiva.metadata.generic.GenericMetadataFacetFactory;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.CiManagement;
 import org.apache.archiva.metadata.model.Dependency;
@@ -41,22 +60,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.test.context.ContextConfiguration;
 
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
 @RunWith( ArchivaSpringJUnit4ClassRunner.class )
 @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
 public abstract class AbstractMetadataRepositoryTest
@@ -76,6 +79,10 @@ public abstract class AbstractMetadataRepositoryTest
 
     private static final String TEST_PROJECT_VERSION_2_0 = "2.0";
 
+    private static final String TEST_URL = "http://archiva.apache.org";
+
+    private static final Organization TEST_ORGANIZATION = new Organization( "Apache", "http://apache.org" );
+
     private static final String TEST_FACET_ID = "test-facet-id";
 
     private static final String TEST_NAME = "test/name";
@@ -88,7 +95,9 @@ public abstract class AbstractMetadataRepositoryTest
 
     private static final String TEST_SHA1 = "2e5daf0201ddeb068a62d5e08da18657ab2c6be9";
 
-    private static final String TEST_METADATA_VALUE = "test-metadata";
+    private static final String TEST_METADATA_KEY = "testkey";
+
+    private static final String TEST_METADATA_VALUE = "testmetadata";
 
     protected Logger log = LoggerFactory.getLogger( getClass() );
 
@@ -125,6 +134,10 @@ public abstract class AbstractMetadataRepositoryTest
                 return new TestMetadataFacet( "", TEST_VALUE );
             }
         } );
+
+        // for the getArtifactsByProjectVersionMetadata tests
+        factories.put( GenericMetadataFacet.FACET_ID, new GenericMetadataFacetFactory() );
+
         return factories;
     }
 
@@ -301,10 +314,7 @@ public abstract class AbstractMetadataRepositoryTest
         tracker.setUrl( "issue tracker url" );
         metadata.setIssueManagement( tracker );
 
-        Organization org = new Organization();
-        org.setName( "org name" );
-        org.setUrl( "url" );
-        metadata.setOrganization( org );
+        metadata.setOrganization( TEST_ORGANIZATION );
 
         License l = new License();
         l.setName( "license name" );
@@ -341,8 +351,8 @@ public abstract class AbstractMetadataRepositoryTest
         assertEquals( "system", metadata.getIssueManagement().getSystem() );
         assertEquals( "issue tracker url", metadata.getIssueManagement().getUrl() );
 
-        assertEquals( "org name", metadata.getOrganization().getName() );
-        assertEquals( "url", metadata.getOrganization().getUrl() );
+        assertEquals( TEST_ORGANIZATION.getName(), metadata.getOrganization().getName() );
+        assertEquals( TEST_ORGANIZATION.getUrl(), metadata.getOrganization().getUrl() );
 
         assertEquals( 1, metadata.getMailingLists().size() );
         MailingList retrievedMailingList = metadata.getMailingLists().get( 0 );
@@ -1192,6 +1202,72 @@ public abstract class AbstractMetadataRepositoryTest
         assertThat( artifactsByChecksum ).isNotNull().isEmpty();
     }
 
+    @Test
+    public void testGetArtifactsByProjectVersionMetadata()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet( 10 );
+        Collection<ArtifactMetadata> artifactsByMetadata =
+            repository.getArtifactsByProjectVersionMetadata( TEST_METADATA_KEY, TEST_METADATA_VALUE, TEST_REPO_ID );
+        assertThat( artifactsByMetadata ).hasSize( 1 );
+        ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator().next();
+        assertThat( artifactMetadata.getId() ).isEqualTo( "projectId-1.0.jar" );
+        assertThat( artifactMetadata.getSha1() ).isEqualTo( TEST_SHA1 );
+        assertThat( artifactMetadata.getRepositoryId() ).isEqualTo( TEST_REPO_ID );
+    }
+
+    @Test
+    public void testGetArtifactsByProjectVersionMetadataNoRepository()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet();
+        Collection<ArtifactMetadata> artifactsByMetadata =
+            repository.getArtifactsByProjectVersionMetadata( TEST_METADATA_KEY, TEST_METADATA_VALUE, null );
+        assertThat( artifactsByMetadata ).hasSize( 1 );
+        assertThat( artifactsByMetadata.iterator().next().getRepositoryId() ).isNotNull().isNotEmpty();
+    }
+
+    @Test
+    public void testGetArtifactsByProjectVersionMetadataAllRepositories()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet();
+        Collection<ArtifactMetadata> artifactsByMetadata =
+            repository.getArtifactsByProjectVersionMetadata( TEST_METADATA_KEY, TEST_METADATA_VALUE, null );
+        assertThat( artifactsByMetadata ).hasSize( 1 );
+    }
+
+    @Test
+    public void testGetArtifactsByMetadataAllRepositories()
+        throws Exception
+    {
+        createArtifactWithMavenArtifactFacet();
+        Collection<ArtifactMetadata> artifactsByMetadata =
+            repository.getArtifactsByMetadata( "foo", TEST_METADATA_VALUE, null );
+        assertThat( artifactsByMetadata ).hasSize( 1 );
+        ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator().next();
+        assertThat( artifactMetadata.getId() ).isEqualTo( "projectId-1.0.jar" );
+        assertThat( artifactMetadata.getSha1() ).isEqualTo( TEST_SHA1 );
+        assertThat( artifactMetadata.getRepositoryId() ).isEqualTo( TEST_REPO_ID );
+        MetadataFacet facet = artifactMetadata.getFacet( TEST_FACET_ID );
+        assertThat( facet ).isNotNull();
+        assertThat( facet.toProperties() ).isEqualTo( Collections.singletonMap( "foo", TEST_METADATA_VALUE ) );
+    }
+
+    @Test
+    public void testGetArtifactsByPropertySingleResult()
+        throws Exception
+    {
+        createArtifactWithData();
+        // only works on JCR implementation
+        // Collection<ArtifactMetadata> artifactsByProperty = repository.getArtifactsByProperty( "org.name", TEST_ORGANIZATION.getName(), TEST_REPO_ID );
+        Collection<ArtifactMetadata> artifactsByProperty = repository.getArtifactsByProperty( "url", TEST_URL, TEST_REPO_ID );
+        assertThat( artifactsByProperty ).hasSize( 1 );
+        ArtifactMetadata artifactMetadata = artifactsByProperty.iterator().next();
+        assertThat( artifactMetadata.getId() ).isEqualTo( "projectId-1.0.jar" );
+        assertThat( artifactMetadata.getSha1() ).isEqualTo( TEST_SHA1 );
+        assertThat( artifactMetadata.getRepositoryId() ).isEqualTo( TEST_REPO_ID );
+    }
 
     @Test
     public void testDeleteRepository()
@@ -1424,6 +1500,78 @@ public abstract class AbstractMetadataRepositoryTest
 
     }
 
+    @Test
+    public void testSearchArtifactsByKey()
+        throws Exception
+    {
+        createArtifactWithData();
+        Collection<ArtifactMetadata> artifactsByProperty = repository.searchArtifacts( "url", TEST_URL, TEST_REPO_ID, false );
+        assertThat( artifactsByProperty ).isNotNull().isNotEmpty();
+    }
+
+    @Test
+    public void testSearchArtifactsByKeyExact()
+        throws Exception
+    {
+        createArtifactWithData();
+        Collection<ArtifactMetadata> artifactsByProperty = repository.searchArtifacts( "url", TEST_URL, TEST_REPO_ID, true );
+        assertThat( artifactsByProperty ).isNotNull().isNotEmpty();
+        artifactsByProperty = repository.searchArtifacts( "org.name", "pache", TEST_REPO_ID, true );
+        assertThat( artifactsByProperty ).isNotNull().isEmpty();
+    }
+
+    @Test
+    public void testSearchArtifactsByFacetKey()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet();
+        Collection<ArtifactMetadata> artifactsByProperty = repository.searchArtifacts( TEST_METADATA_KEY, TEST_METADATA_VALUE, TEST_REPO_ID, false );
+        assertThat( artifactsByProperty ).isNotNull().isNotEmpty();
+    }
+
+    @Test
+    public void testSearchArtifactsByFacetKeyAllRepos()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet();
+        Collection<ArtifactMetadata> artifactsByProperty = repository.searchArtifacts( TEST_METADATA_KEY, TEST_METADATA_VALUE, null, false );
+        assertThat( artifactsByProperty ).isNotNull().isNotEmpty();
+    }
+
+    @Test
+    public void testSearchArtifactsFullText()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet();
+        // only works in JCR
+        // Collection<ArtifactMetadata> artifactsByProperty = repository.searchArtifacts( TEST_URL, TEST_REPO_ID, false );
+        Collection<ArtifactMetadata> artifactsByProperty =
+            repository.searchArtifacts( TEST_METADATA_VALUE, TEST_REPO_ID, false );
+        assertThat( artifactsByProperty ).isNotNull().isNotEmpty();
+    }
+
+    @Test
+    public void testSearchArtifactsFullTextExact()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet();
+        // only works in JCR
+        // Collection<ArtifactMetadata> artifactsByProperty = repository.searchArtifacts( TEST_URL, TEST_REPO_ID, true );
+        Collection<ArtifactMetadata> artifactsByProperty =
+            repository.searchArtifacts( TEST_METADATA_VALUE, TEST_REPO_ID, true );
+        assertThat( artifactsByProperty ).isNotNull().isNotEmpty();
+        artifactsByProperty = repository.searchArtifacts( TEST_METADATA_VALUE.substring( 2 ), TEST_REPO_ID, true );
+        assertThat( artifactsByProperty ).isNotNull().isEmpty();
+    }
+
+    @Test
+    public void testSearchArtifactsFullTextByFacet()
+        throws Exception
+    {
+        createArtifactWithGenericMetadataFacet();
+        Collection<ArtifactMetadata> artifactsByProperty = repository.searchArtifacts( TEST_METADATA_VALUE, TEST_REPO_ID, false );
+        assertThat( artifactsByProperty ).isNotNull().isNotEmpty();
+    }
 
     private static ProjectMetadata createProject()
     {
@@ -1438,6 +1586,74 @@ public abstract class AbstractMetadataRepositoryTest
         return project;
     }
 
+    private void createArtifactWithGenericMetadataFacet()
+        throws MetadataRepositoryException, MetadataResolutionException
+    {
+        createArtifactWithGenericMetadataFacet( 1 );
+    }
+
+    private void createArtifactWithGenericMetadataFacet( int artifacts )
+        throws MetadataRepositoryException, MetadataResolutionException
+    {
+        MetadataFacet metadataFacet = new GenericMetadataFacet();
+        Map<String, String> properties = new HashMap<>();
+        properties.put( TEST_METADATA_KEY, TEST_METADATA_VALUE );
+        metadataFacet.fromProperties( properties );
+        createArtifactWithFacet( artifacts, null, metadataFacet );
+    }
+
+    private void createArtifactWithMavenArtifactFacet()
+        throws MetadataRepositoryException, MetadataResolutionException
+    {
+        createArtifactWithMavenArtifactFacet( 1 );
+    }
+
+    private void createArtifactWithMavenArtifactFacet( int artifacts )
+        throws MetadataRepositoryException, MetadataResolutionException
+    {
+        TestMetadataFacet facet = new TestMetadataFacet( TEST_METADATA_VALUE );
+        createArtifactWithFacet( artifacts, facet, null );
+    }
+
+    private void createArtifactWithFacet( int artifacts, MetadataFacet artifactFacet,
+                                          MetadataFacet projectVersionMetadataFacet )
+        throws MetadataRepositoryException, MetadataResolutionException
+    {
+        for ( int i = 0; i < artifacts; i++ )
+        {
+            ArtifactMetadata artifact = createArtifact();
+            if ( artifactFacet != null )
+            {
+                artifact.addFacet( artifactFacet );
+            }
+            repository.updateArtifact( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
+        }
+        if ( projectVersionMetadataFacet != null )
+        {
+            ProjectVersionMetadata metadata =
+                repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION );
+            metadata.addFacet( projectVersionMetadataFacet );
+            metadata.setOrganization( TEST_ORGANIZATION );
+            metadata.setUrl( TEST_URL );
+            repository.updateProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata );
+        }
+        repository.save();
+    }
+
+    private void createArtifactWithData()
+        throws MetadataRepositoryException, MetadataResolutionException
+    {
+        ArtifactMetadata artifact = createArtifact();
+        repository.updateArtifact( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
+        ProjectVersionMetadata metadata =
+            repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION );
+        metadata.setOrganization( TEST_ORGANIZATION );
+        metadata.setUrl( TEST_URL );
+
+        repository.updateProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata );
+        repository.save();
+    }
+
     private static ArtifactMetadata createArtifact()
     {
         return createArtifact( "jar" );

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/pom.xml b/archiva-modules/plugins/metadata-store-cassandra/pom.xml
index 6a8072c..83a6b17 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/pom.xml
+++ b/archiva-modules/plugins/metadata-store-cassandra/pom.xml
@@ -131,6 +131,11 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>generic-metadata-support</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
index f58b429..779c19f 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
@@ -21,6 +21,7 @@ package org.apache.archiva.metadata.repository.cassandra;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+
 import me.prettyprint.cassandra.serializers.LongSerializer;
 import me.prettyprint.cassandra.serializers.StringSerializer;
 import me.prettyprint.cassandra.service.template.ColumnFamilyResult;
@@ -37,6 +38,7 @@ import me.prettyprint.hector.api.mutation.MutationResult;
 import me.prettyprint.hector.api.mutation.Mutator;
 import me.prettyprint.hector.api.query.QueryResult;
 import me.prettyprint.hector.api.query.RangeSlicesQuery;
+
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.CiManagement;
@@ -67,6 +69,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.persistence.PersistenceException;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -1823,6 +1826,26 @@ public class CassandraMetadataRepository
         return artifactMetadataMap.values();
     }
 
+    @Override
+    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "not yet implemented in Cassandra backend" );
+    }
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "not yet implemented in Cassandra backend" );
+    }
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByProperty( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "getArtifactsByProperty not yet implemented in Cassandra backend" );
+    }
 
     @Override
     public void removeArtifact( final String repositoryId, final String namespace, final String project,
@@ -2174,4 +2197,18 @@ public class CassandraMetadataRepository
     {
         return ModelMapperHolder.MODEL_MAPPER;
     }
+
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "searchArtifacts not yet implemented in Cassandra backend" );
+    }
+
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "searchArtifacts not yet implemented in Cassandra backend" );
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
index c26a660..97b3718 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
@@ -19,21 +19,19 @@ package org.apache.archiva.metadata.repository.cassandra;
  * under the License.
  */
 
-import org.apache.archiva.metadata.model.MailingList;
 import org.apache.archiva.metadata.model.MetadataFacetFactory;
 import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest;
 import org.apache.archiva.metadata.repository.cassandra.model.ProjectVersionMetadataModel;
 import org.apache.commons.io.FileUtils;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import javax.inject.Inject;
 import javax.inject.Named;
+
 import java.io.File;
-import java.util.List;
 import java.util.Map;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -44,8 +42,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 public class CassandraMetadataRepositoryTest
     extends AbstractMetadataRepositoryTest
 {
-    private Logger logger = LoggerFactory.getLogger( getClass() );
-
     @Inject
     @Named(value = "archivaEntityManagerFactory#cassandra")
     CassandraArchivaManager cassandraArchivaManager;
@@ -73,6 +69,103 @@ public class CassandraMetadataRepositoryTest
         clearReposAndNamespace( cassandraArchivaManager );
     }
 
+    @Override
+    @Ignore
+    public void testGetArtifactsByProjectVersionMetadata()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByProjectVersionMetadataNoRepository()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByProjectVersionMetadataAllRepositories()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByMetadataAllRepositories()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByPropertySingleResult()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByKey()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByKeyExact()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsFullText()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsFullTextExact()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByFacetKeyAllRepos()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByFacetKey()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsFullTextByFacet()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+
     /**
      * ensure all dependant tables are cleaned up (mailinglist, license, dependencies)
      *

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-file/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-file/pom.xml b/archiva-modules/plugins/metadata-store-file/pom.xml
index ae161cd..87b5c3e 100644
--- a/archiva-modules/plugins/metadata-store-file/pom.xml
+++ b/archiva-modules/plugins/metadata-store-file/pom.xml
@@ -62,6 +62,11 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>generic-metadata-support</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-jcl</artifactId>
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
index e04c7d3..cca21bc 100644
--- a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
@@ -778,6 +778,27 @@ public class FileMetadataRepository
         }
     }
 
+    @Override
+    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "not yet implemented in File backend" );
+    }
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "not yet implemented in File backend" );
+    }
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByProperty( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "getArtifactsByProperty not yet implemented in File backend" );
+    }
+
     private File getMetadataDirectory( String repoId, String facetId )
     {
         return new File( getBaseDirectory( repoId ), "facets/" + facetId );
@@ -1296,4 +1317,18 @@ public class FileMetadataRepository
             }
         }
     }
+
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "searchArtifacts not yet implemented in File backend" );
+    }
+
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        throw new UnsupportedOperationException( "searchArtifacts not yet implemented in File backend" );
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
index df97f2e..aa589f3 100644
--- a/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
+++ b/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
@@ -26,6 +26,7 @@ import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.configuration.Configuration;
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
 import org.junit.Before;
+import org.junit.Ignore;
 
 import java.io.File;
 import java.util.Map;
@@ -55,6 +56,102 @@ public class FileMetadataRepositoryTest
         this.repository = new FileMetadataRepository( factories, config );
     }
 
+    @Override
+    @Ignore
+    public void testGetArtifactsByProjectVersionMetadata()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByProjectVersionMetadataNoRepository()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByProjectVersionMetadataAllRepositories()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByMetadataAllRepositories()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testGetArtifactsByPropertySingleResult()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByKey()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByKeyExact()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsFullText()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsFullTextExact()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByFacetKeyAllRepos()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsByFacetKey()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
+    @Override
+    @Ignore
+    public void testSearchArtifactsFullTextByFacet()
+        throws Exception
+    {
+        // TODO not implemented
+    }
+
     protected static ArchivaConfiguration createTestConfiguration( File directory )
     {
         ArchivaConfiguration config = mock( ArchivaConfiguration.class );

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-jcr/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-jcr/pom.xml b/archiva-modules/plugins/metadata-store-jcr/pom.xml
index e139e8a..9102982 100644
--- a/archiva-modules/plugins/metadata-store-jcr/pom.xml
+++ b/archiva-modules/plugins/metadata-store-jcr/pom.xml
@@ -79,6 +79,16 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>generic-metadata-support</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>maven2-repository</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/archiva/blob/e4da1fa6/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
index fbfe373..d4c79b6 100644
--- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
@@ -40,6 +40,8 @@ import org.apache.jackrabbit.commons.JcrUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -55,6 +57,9 @@ import javax.jcr.nodetype.NodeTypeManager;
 import javax.jcr.nodetype.NodeTypeTemplate;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryResult;
+import javax.jcr.query.Row;
+import javax.jcr.query.RowIterator;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -66,6 +71,7 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 /**
@@ -711,6 +717,83 @@ public class JcrMetadataRepository
         return artifacts;
     }
 
+    private List<ArtifactMetadata> runJcrQuery( String repositoryId, String q, Map<String, String> bindings )
+        throws MetadataRepositoryException
+    {
+        List<ArtifactMetadata> artifacts;
+        if ( repositoryId != null )
+        {
+            q += " AND ISDESCENDANTNODE(artifact,'/" + getRepositoryContentPath( repositoryId ) + "')";
+        }
+
+        log.info( "Running JCR Query: {}", q );
+
+        try
+        {
+            Query query = getJcrSession().getWorkspace().getQueryManager().createQuery( q, Query.JCR_SQL2 );
+            ValueFactory valueFactory = getJcrSession().getValueFactory();
+            for ( Entry<String, String> entry : bindings.entrySet() )
+            {
+                query.bindValue( entry.getKey(), valueFactory.createValue( entry.getValue() ) );
+            }
+            long start = Calendar.getInstance().getTimeInMillis();
+            QueryResult result = query.execute();
+            long end = Calendar.getInstance().getTimeInMillis();
+            log.info( "JCR Query ran in {} milliseconds: {}", end - start , q );
+
+            artifacts = new ArrayList<>();
+            RowIterator rows = result.getRows();
+            while ( rows.hasNext() )
+            {
+                Row row = rows.nextRow();
+                Node node = row.getNode( "artifact" );
+                artifacts.add( getArtifactFromNode( repositoryId, node ) );
+            }
+        }
+        catch ( RepositoryException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
+        }
+        return artifacts;
+    }
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        String q =
+            "SELECT * FROM [" + PROJECT_VERSION_NODE_TYPE + "] AS projectVersion INNER JOIN [" + ARTIFACT_NODE_TYPE
+                + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) INNER JOIN [" + FACET_NODE_TYPE
+                + "] AS facet ON ISCHILDNODE(facet, projectVersion) WHERE ([facet].[" + key + "] = $value)";
+
+        return runJcrQuery( repositoryId, q, ImmutableMap.of( "value", value ) );
+    }
+
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByMetadata( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        String q =
+            "SELECT * FROM [" + ARTIFACT_NODE_TYPE + "] AS artifact INNER JOIN [" + FACET_NODE_TYPE
+                + "] AS facet ON ISCHILDNODE(facet, artifact) WHERE ([facet].[" + key + "] = $value)";
+
+        return runJcrQuery( repositoryId, q, ImmutableMap.of( "value", value ) );
+    }
+
+
+    @Override
+    public List<ArtifactMetadata> getArtifactsByProperty( String key, String value, String repositoryId )
+        throws MetadataRepositoryException
+    {
+        String q =
+            "SELECT * FROM [" + PROJECT_VERSION_NODE_TYPE + "] AS projectVersion INNER JOIN [" + ARTIFACT_NODE_TYPE
+                + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) WHERE ([projectVersion].[" + key
+                + "] = $value)";
+
+        return runJcrQuery( repositoryId, q, ImmutableMap.of( "value", value ) );
+    }
+
 
     @Override
     public void removeRepository( String repositoryId )
@@ -1319,6 +1402,33 @@ public class JcrMetadataRepository
         }
     }
 
+
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        return searchArtifacts( null, text, repositoryId, exact );
+    }
+
+    @Override
+    public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact )
+        throws MetadataRepositoryException
+    {
+        // we can't do exact search in any property (*), we need a key
+        boolean e = exact && key != null;
+        String theKey = key == null ? "*" : "[" + key + "]";
+        String projectVersionCondition =
+            e ? "(projectVersion." + theKey + " = $value)" : "contains([projectVersion]." + theKey + ", $value)";
+        String facetCondition = e ? "(facet." + theKey + " = $value)" : "contains([facet]." + theKey + ", $value)";
+        String q =
+            "SELECT * FROM [" + PROJECT_VERSION_NODE_TYPE + "] AS projectVersion LEFT OUTER JOIN ["
+                + ARTIFACT_NODE_TYPE + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) LEFT OUTER JOIN ["
+                + FACET_NODE_TYPE + "] AS facet ON ISCHILDNODE(facet, projectVersion) WHERE ("
+                + projectVersionCondition + " OR " + facetCondition + ")";
+
+        return runJcrQuery( repositoryId, q, ImmutableMap.of( "value", text ) );
+    }
+
     private ArtifactMetadata getArtifactFromNode( String repositoryId, Node artifactNode )
         throws RepositoryException
     {
@@ -1326,7 +1436,7 @@ public class JcrMetadataRepository
 
         ArtifactMetadata artifact = new ArtifactMetadata();
         artifact.setId( id );
-        artifact.setRepositoryId( repositoryId );
+        artifact.setRepositoryId( repositoryId == null ? artifactNode.getAncestor(2).getName() : repositoryId );
 
         Node projectVersionNode = artifactNode.getParent();
         Node projectNode = projectVersionNode.getParent();


[3/4] archiva git commit: [MRM-1390] Cassandra: rename Metadata Facet column 'key' to 'facetKey'

Posted by ca...@apache.org.
[MRM-1390] Cassandra: rename Metadata Facet column 'key' to 'facetKey'

The column 'key' can't be queried in Cassandra
Probably because 'key' is reserved for the element key or a limitation in Hector


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/db8c78d4
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/db8c78d4
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/db8c78d4

Branch: refs/heads/master
Commit: db8c78d4d750c6d1cdd1094004d3663f8df44667
Parents: 4e5d118
Author: Carlos Sanchez <ca...@apache.org>
Authored: Mon Nov 24 20:00:03 2014 +0100
Committer: Carlos Sanchez <ca...@apache.org>
Committed: Mon Dec 1 16:48:31 2014 +0100

----------------------------------------------------------------------
 .../archiva/metadata/repository/cassandra/model/ColumnNames.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/db8c78d4/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/ColumnNames.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/ColumnNames.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/ColumnNames.java
index 7bbec29..fa81935 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/ColumnNames.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/ColumnNames.java
@@ -32,7 +32,7 @@ public enum ColumnNames
     NAMESPACE_ID( "namespaceId" ),
     PROJECT_ID( "projectId" ),
     PROJECT_VERSION( "projectVersion" ),
-    KEY( "key" ),
+    KEY( "facetKey" ),
     VALUE( "value" ),
     ID( "id" ),
     SIZE( "size" ),


[2/4] archiva git commit: [MRM-1390] Implement search methods for generic metadata and properties in Cassandra store

Posted by ca...@apache.org.
[MRM-1390] Implement search methods for generic metadata and properties in Cassandra store

Some caveats with Cassandra implementation:

We can't search artifacts by any (wildcard) property, so searchArtifacts(text,...) just calls getArtifactsByMetadata
The exact parameter is ignored as we can't do non exact searches in Cassandra


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/4e5d1183
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/4e5d1183
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/4e5d1183

Branch: refs/heads/master
Commit: 4e5d1183c31651680e8266198f41c4464647b28d
Parents: e4da1fa
Author: Carlos Sanchez <ca...@apache.org>
Authored: Sun Nov 23 11:34:24 2014 +0100
Committer: Carlos Sanchez <ca...@apache.org>
Committed: Mon Dec 1 16:48:31 2014 +0100

----------------------------------------------------------------------
 .../cassandra/CassandraMetadataRepository.java  | 141 +++++++++++++++----
 .../repository/cassandra/CassandraUtils.java    |   8 +-
 .../cassandra/model/MetadataFacetModel.java     |   5 +
 .../CassandraMetadataRepositoryTest.java        |  98 -------------
 .../repository/jcr/JcrMetadataRepository.java   |   3 +
 5 files changed, 127 insertions(+), 128 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/4e5d1183/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
index 779c19f..268fd15 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
@@ -77,6 +77,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -1826,25 +1827,114 @@ public class CassandraMetadataRepository
         return artifactMetadataMap.values();
     }
 
+    /**
+     * Project version and artifact level metadata are stored in the same place, no distinctions in Cassandra
+     * implementation, just calls {@link #getArtifactsByMetadata(String, String, String)}
+     */
     @Override
     public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
-        throw new UnsupportedOperationException( "not yet implemented in Cassandra backend" );
+        return getArtifactsByMetadata( key, value, repositoryId );
     }
 
     @Override
     public List<ArtifactMetadata> getArtifactsByMetadata( String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
-        throw new UnsupportedOperationException( "not yet implemented in Cassandra backend" );
+        RangeSlicesQuery<String, String, String> query =
+            HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
+            .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
+            .setColumnNames( MetadataFacetModel.COLUMNS ) //
+            .addEqualsExpression( VALUE.toString(), value );
+
+        if ( key != null )
+        {
+            query.addEqualsExpression( KEY.toString(), key ); //
+        }
+        if ( repositoryId != null )
+        {
+            query.addEqualsExpression( "repositoryName", repositoryId );
+        }
+
+        QueryResult<OrderedRows<String, String, String>> metadataFacetResult = query.execute();
+        if ( metadataFacetResult.get() == null || metadataFacetResult.get().getCount() < 1 )
+        {
+            return Collections.emptyList();
+        }
+
+        List<ArtifactMetadata> artifactMetadatas = new LinkedList<ArtifactMetadata>();
+
+        // TODO doing multiple queries, there should be a way to get all the artifactMetadatas for any number of
+        // projects
+        for ( Row<String, String, String> row : metadataFacetResult.get() )
+        {
+            QueryResult<OrderedRows<String, String, String>> artifactMetadataResult =
+                HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
+                .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
+                .setColumnNames( ArtifactMetadataModel.COLUMNS ) //
+                .setRowCount( Integer.MAX_VALUE ) //
+                .addEqualsExpression( REPOSITORY_NAME.toString(),
+                                      getStringValue( row.getColumnSlice(), REPOSITORY_NAME ) ) //
+                .addEqualsExpression( NAMESPACE_ID.toString(), getStringValue( row.getColumnSlice(), NAMESPACE_ID ) ) //
+                .addEqualsExpression( PROJECT.toString(), getStringValue( row.getColumnSlice(), PROJECT_ID ) ) //
+                .addEqualsExpression( PROJECT_VERSION.toString(),
+                                      getStringValue( row.getColumnSlice(), PROJECT_VERSION ) ) //
+                .execute();
+
+            if ( artifactMetadataResult.get() == null || artifactMetadataResult.get().getCount() < 1 )
+            {
+                return Collections.emptyList();
+            }
+
+            for ( Row<String, String, String> artifactMetadataRow : artifactMetadataResult.get() )
+            {
+                artifactMetadatas.add( mapArtifactMetadataStringColumnSlice( artifactMetadataRow.getColumnSlice() ) );
+            }
+        }
+
+        return mapArtifactMetadataToArtifact( metadataFacetResult, artifactMetadatas );
     }
 
     @Override
     public List<ArtifactMetadata> getArtifactsByProperty( String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
-        throw new UnsupportedOperationException( "getArtifactsByProperty not yet implemented in Cassandra backend" );
+        QueryResult<OrderedRows<String, String, String>> result =
+            HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
+            .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
+            .setColumnNames( PROJECT_ID.toString(), REPOSITORY_NAME.toString(), NAMESPACE_ID.toString(),
+                             PROJECT_VERSION.toString() ) //
+            .addEqualsExpression( key, value ) //
+            .execute();
+
+        int count = result.get().getCount();
+
+        if ( count < 1 )
+        {
+            return Collections.emptyList();
+        }
+
+        List<ArtifactMetadata> artifacts = new LinkedList<ArtifactMetadata>();
+
+        for ( Row<String, String, String> row : result.get() )
+        {
+            // TODO doing multiple queries, there should be a way to get all the artifactMetadatas for any number of
+            // projects
+            try
+            {
+                artifacts.addAll( getArtifacts( getStringValue( row.getColumnSlice(), REPOSITORY_NAME ),
+                                                getStringValue( row.getColumnSlice(), NAMESPACE_ID ),
+                                                getStringValue( row.getColumnSlice(), PROJECT_ID ),
+                                                getStringValue( row.getColumnSlice(), PROJECT_VERSION ) ) );
+            }
+            catch ( MetadataResolutionException e )
+            {
+                // never raised
+                throw new IllegalStateException( e );
+            }
+        }
+        return artifacts;
     }
 
     @Override
@@ -2046,29 +2136,12 @@ public class CassandraMetadataRepository
 
         for ( Row<String, String, String> row : result.get() )
         {
-            ColumnSlice<String, String> columnSlice = row.getColumnSlice();
-            ArtifactMetadata artifactMetadata = new ArtifactMetadata();
-            artifactMetadata.setNamespace( getStringValue( columnSlice, NAMESPACE_ID.toString() ) );
-            artifactMetadata.setSize( getAsLongValue( columnSlice, SIZE.toString() ) );
-            artifactMetadata.setId( getStringValue( columnSlice, ID.toString() ) );
-            artifactMetadata.setFileLastModified( getAsLongValue( columnSlice, FILE_LAST_MODIFIED.toString() ) );
-            artifactMetadata.setMd5( getStringValue( columnSlice, MD5.toString() ) );
-            artifactMetadata.setProject( getStringValue( columnSlice, PROJECT.toString() ) );
-            artifactMetadata.setProjectVersion( getStringValue( columnSlice, PROJECT_VERSION.toString() ) );
-            artifactMetadata.setRepositoryId( repoId );
-            artifactMetadata.setSha1( getStringValue( columnSlice, SHA1.toString() ) );
-            artifactMetadata.setVersion( getStringValue( columnSlice, VERSION.toString() ) );
-            Long whenGathered = getAsLongValue( columnSlice, WHEN_GATHERED.toString() );
-            if ( whenGathered != null )
-            {
-                artifactMetadata.setWhenGathered( new Date( whenGathered ) );
-            }
-            artifactMetadatas.add( artifactMetadata );
+            artifactMetadatas.add( mapArtifactMetadataStringColumnSlice( row.getColumnSlice() ) );
         }
 
         result = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
             .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
-            .setColumnNames( FACET_ID.toString(), NAME.toString(), VALUE.toString(), KEY.toString(), PROJECT_VERSION.toString() ) //
+            .setColumnNames( MetadataFacetModel.COLUMNS ) //
             .setRowCount( Integer.MAX_VALUE ) //
             .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) //
             .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) //
@@ -2076,6 +2149,13 @@ public class CassandraMetadataRepository
             .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) //
             .execute();
 
+        return mapArtifactMetadataToArtifact(result, artifactMetadatas);
+    }
+
+    /**
+     * Attach metadata to each of the  ArtifactMetadata objects
+     */
+    private List<ArtifactMetadata> mapArtifactMetadataToArtifact(QueryResult<OrderedRows<String, String, String>> result, List<ArtifactMetadata> artifactMetadatas) {
         if ( result.get() == null || result.get().getCount() < 1 )
         {
             return artifactMetadatas;
@@ -2147,8 +2227,6 @@ public class CassandraMetadataRepository
                     }
                 }
             }
-
-
         }
 
         return artifactMetadatas;
@@ -2198,17 +2276,28 @@ public class CassandraMetadataRepository
         return ModelMapperHolder.MODEL_MAPPER;
     }
 
+    /**
+     * This implementation just calls getArtifactsByMetadata( null, text, repositoryId ). We can't search artifacts by
+     * any property.
+     */
     @Override
     public List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact )
         throws MetadataRepositoryException
     {
-        throw new UnsupportedOperationException( "searchArtifacts not yet implemented in Cassandra backend" );
+        return getArtifactsByMetadata( null, text, repositoryId );
     }
 
+    /**
+     * The exact parameter is ignored as we can't do non exact searches in Cassandra
+     */
     @Override
     public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact )
         throws MetadataRepositoryException
     {
-        throw new UnsupportedOperationException( "searchArtifacts not yet implemented in Cassandra backend" );
+        // TODO optimize
+        List<ArtifactMetadata> artifacts = new LinkedList<ArtifactMetadata>();
+        artifacts.addAll( getArtifactsByMetadata( key, text, repositoryId ) );
+        artifacts.addAll( getArtifactsByProperty( key, text, repositoryId ) );
+        return artifacts;
     }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/4e5d1183/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraUtils.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraUtils.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraUtils.java
index 6366fe9..f3de42b 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraUtils.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraUtils.java
@@ -95,18 +95,18 @@ public class CassandraUtils
         return hColumn == null ? null : hColumn.getValue();
     }
 
-    public static Long getLongValue( ColumnSlice<String, Long> columnSlice, String columnName )
+    public static Long getLongValue( ColumnSlice<String, ?> columnSlice, String columnName )
     {
         if ( StringUtils.isEmpty( columnName ) )
         {
             return null;
         }
 
-        HColumn<String, Long> hColumn = columnSlice.getColumnByName( columnName );
+        HColumn<String, Long> hColumn = (HColumn<String, Long>) columnSlice.getColumnByName( columnName );
         return hColumn == null ? null : hColumn.getValue();
     }
 
-    public static String getAsStringValue( ColumnSlice<String, Long> columnSlice, String columnName )
+    public static <T> String getAsStringValue( ColumnSlice<String, T> columnSlice, String columnName )
     {
         StringSerializer ss = StringSerializer.get();
         if ( StringUtils.isEmpty( columnName ) )
@@ -114,7 +114,7 @@ public class CassandraUtils
             return null;
         }
 
-        HColumn<String, Long> hColumn = columnSlice.getColumnByName( columnName );
+        HColumn<String, T> hColumn = columnSlice.getColumnByName( columnName );
         return hColumn == null ? null : ss.fromByteBuffer( hColumn.getValueBytes() );
     }
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/4e5d1183/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/MetadataFacetModel.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/MetadataFacetModel.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/MetadataFacetModel.java
index ae494e1..a2347bf 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/MetadataFacetModel.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/model/MetadataFacetModel.java
@@ -19,6 +19,8 @@ package org.apache.archiva.metadata.repository.cassandra.model;
  * under the License.
  */
 
+import static org.apache.archiva.metadata.repository.cassandra.model.ColumnNames.*;
+
 import org.apache.archiva.metadata.repository.cassandra.CassandraUtils;
 
 /**
@@ -29,6 +31,9 @@ import org.apache.archiva.metadata.repository.cassandra.CassandraUtils;
  */
 public class MetadataFacetModel
 {
+    public static final String[] COLUMNS = new String[] { FACET_ID.toString(), KEY.toString(), VALUE.toString(),
+        REPOSITORY_NAME.toString(), NAMESPACE_ID.toString(), PROJECT_ID.toString(), PROJECT_VERSION.toString() };
+
     private String facetId;
 
     private String key;

http://git-wip-us.apache.org/repos/asf/archiva/blob/4e5d1183/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
index 97b3718..b4f0cdb 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java
@@ -25,7 +25,6 @@ import org.apache.archiva.metadata.repository.cassandra.model.ProjectVersionMeta
 import org.apache.commons.io.FileUtils;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import javax.inject.Inject;
@@ -69,103 +68,6 @@ public class CassandraMetadataRepositoryTest
         clearReposAndNamespace( cassandraArchivaManager );
     }
 
-    @Override
-    @Ignore
-    public void testGetArtifactsByProjectVersionMetadata()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testGetArtifactsByProjectVersionMetadataNoRepository()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testGetArtifactsByProjectVersionMetadataAllRepositories()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testGetArtifactsByMetadataAllRepositories()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testGetArtifactsByPropertySingleResult()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testSearchArtifactsByKey()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testSearchArtifactsByKeyExact()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testSearchArtifactsFullText()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testSearchArtifactsFullTextExact()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testSearchArtifactsByFacetKeyAllRepos()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testSearchArtifactsByFacetKey()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-    @Override
-    @Ignore
-    public void testSearchArtifactsFullTextByFacet()
-        throws Exception
-    {
-        // TODO not implemented
-    }
-
-
     /**
      * ensure all dependant tables are cleaned up (mailinglist, license, dependencies)
      *

http://git-wip-us.apache.org/repos/asf/archiva/blob/4e5d1183/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
index d4c79b6..8fecba8 100644
--- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
@@ -1403,6 +1403,9 @@ public class JcrMetadataRepository
     }
 
 
+    /**
+     * Exact is ignored as we can't do exact search in any property, we need a key
+     */
     @Override
     public List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact )
         throws MetadataRepositoryException


[4/4] archiva git commit: [MRM-1390] Bump version to 2.2.0

Posted by ca...@apache.org.
[MRM-1390] Bump version to 2.2.0


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/f11f3993
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/f11f3993
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/f11f3993

Branch: refs/heads/master
Commit: f11f39932a5fabcd14195897da3ff5b2cbcb7acc
Parents: db8c78d
Author: Carlos Sanchez <ca...@apache.org>
Authored: Mon Nov 24 10:54:32 2014 +0100
Committer: Carlos Sanchez <ca...@apache.org>
Committed: Mon Dec 1 16:56:43 2014 +0100

----------------------------------------------------------------------
 archiva-cli/pom.xml                                              | 2 +-
 archiva-docs/pom.xml                                             | 2 +-
 archiva-jetty/pom.xml                                            | 2 +-
 archiva-modules/archiva-base/archiva-checksum/pom.xml            | 2 +-
 archiva-modules/archiva-base/archiva-common/pom.xml              | 2 +-
 archiva-modules/archiva-base/archiva-configuration/pom.xml       | 2 +-
 .../archiva-base/archiva-consumers/archiva-consumer-api/pom.xml  | 2 +-
 .../archiva-consumers/archiva-consumer-archetype/pom.xml         | 2 +-
 .../archiva-consumers/archiva-core-consumers/pom.xml             | 2 +-
 .../archiva-consumers/archiva-lucene-consumers/pom.xml           | 2 +-
 .../archiva-consumers/archiva-metadata-consumer/pom.xml          | 2 +-
 .../archiva-consumers/archiva-signature-consumers/pom.xml        | 2 +-
 archiva-modules/archiva-base/archiva-consumers/pom.xml           | 2 +-
 archiva-modules/archiva-base/archiva-converter/pom.xml           | 2 +-
 archiva-modules/archiva-base/archiva-filelock/pom.xml            | 2 +-
 archiva-modules/archiva-base/archiva-indexer/pom.xml             | 2 +-
 archiva-modules/archiva-base/archiva-maven2-metadata/pom.xml     | 2 +-
 archiva-modules/archiva-base/archiva-maven2-model/pom.xml        | 2 +-
 archiva-modules/archiva-base/archiva-model/pom.xml               | 2 +-
 archiva-modules/archiva-base/archiva-plexus-bridge/pom.xml       | 2 +-
 archiva-modules/archiva-base/archiva-policies/pom.xml            | 2 +-
 archiva-modules/archiva-base/archiva-proxy-api/pom.xml           | 2 +-
 archiva-modules/archiva-base/archiva-proxy-common/pom.xml        | 2 +-
 archiva-modules/archiva-base/archiva-proxy/pom.xml               | 2 +-
 .../archiva-repository-admin-api/pom.xml                         | 2 +-
 .../archiva-repository-admin-default/pom.xml                     | 2 +-
 archiva-modules/archiva-base/archiva-repository-admin/pom.xml    | 2 +-
 archiva-modules/archiva-base/archiva-repository-layer/pom.xml    | 2 +-
 archiva-modules/archiva-base/archiva-repository-scanner/pom.xml  | 2 +-
 archiva-modules/archiva-base/archiva-security-common/pom.xml     | 2 +-
 archiva-modules/archiva-base/archiva-test-utils/pom.xml          | 2 +-
 archiva-modules/archiva-base/archiva-transaction/pom.xml         | 2 +-
 archiva-modules/archiva-base/archiva-xml-tools/pom.xml           | 2 +-
 archiva-modules/archiva-base/pom.xml                             | 2 +-
 archiva-modules/archiva-karaf/archiva-features/pom.xml           | 2 +-
 archiva-modules/archiva-karaf/pom.xml                            | 2 +-
 archiva-modules/archiva-scheduler/archiva-scheduler-api/pom.xml  | 2 +-
 .../archiva-scheduler/archiva-scheduler-indexing/pom.xml         | 2 +-
 .../archiva-scheduler/archiva-scheduler-repository-api/pom.xml   | 2 +-
 .../archiva-scheduler/archiva-scheduler-repository/pom.xml       | 2 +-
 archiva-modules/archiva-scheduler/pom.xml                        | 2 +-
 .../archiva-web/archiva-rest/archiva-rest-api/pom.xml            | 2 +-
 .../archiva-web/archiva-rest/archiva-rest-services/pom.xml       | 2 +-
 archiva-modules/archiva-web/archiva-rest/pom.xml                 | 2 +-
 archiva-modules/archiva-web/archiva-rss/pom.xml                  | 2 +-
 archiva-modules/archiva-web/archiva-security/pom.xml             | 2 +-
 archiva-modules/archiva-web/archiva-test-mocks/pom.xml           | 2 +-
 archiva-modules/archiva-web/archiva-web-common/pom.xml           | 2 +-
 archiva-modules/archiva-web/archiva-webapp-test/pom.xml          | 2 +-
 archiva-modules/archiva-web/archiva-webapp/pom.xml               | 2 +-
 archiva-modules/archiva-web/archiva-webdav/pom.xml               | 2 +-
 archiva-modules/archiva-web/pom.xml                              | 2 +-
 archiva-modules/metadata/metadata-model-maven2/pom.xml           | 2 +-
 archiva-modules/metadata/metadata-model/pom.xml                  | 2 +-
 archiva-modules/metadata/metadata-repository-api/pom.xml         | 2 +-
 archiva-modules/metadata/pom.xml                                 | 2 +-
 archiva-modules/metadata/test-repository/pom.xml                 | 2 +-
 archiva-modules/plugins/audit/pom.xml                            | 2 +-
 archiva-modules/plugins/generic-metadata-support/pom.xml         | 2 +-
 archiva-modules/plugins/maven2-repository/pom.xml                | 2 +-
 archiva-modules/plugins/metadata-store-cassandra/pom.xml         | 2 +-
 archiva-modules/plugins/metadata-store-file/pom.xml              | 2 +-
 archiva-modules/plugins/metadata-store-jcr/pom.xml               | 2 +-
 archiva-modules/plugins/npanday-support/pom.xml                  | 2 +-
 archiva-modules/plugins/pom.xml                                  | 2 +-
 archiva-modules/plugins/problem-reports/pom.xml                  | 2 +-
 archiva-modules/plugins/repository-statistics/pom.xml            | 2 +-
 archiva-modules/plugins/stage-repository-merge/pom.xml           | 2 +-
 archiva-modules/pom.xml                                          | 2 +-
 pom.xml                                                          | 4 ++--
 70 files changed, 71 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-cli/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-cli/pom.xml b/archiva-cli/pom.xml
index 41ec6b8..3e8e9b3 100644
--- a/archiva-cli/pom.xml
+++ b/archiva-cli/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-cli</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-docs/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-docs/pom.xml b/archiva-docs/pom.xml
index a2751a2..1e5ac77 100644
--- a/archiva-docs/pom.xml
+++ b/archiva-docs/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-docs</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-jetty/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-jetty/pom.xml b/archiva-jetty/pom.xml
index 344038f..7fc0836 100644
--- a/archiva-jetty/pom.xml
+++ b/archiva-jetty/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-jetty</artifactId>
   <packaging>pom</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-checksum/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-checksum/pom.xml b/archiva-modules/archiva-base/archiva-checksum/pom.xml
index 915d389..c232862 100644
--- a/archiva-modules/archiva-base/archiva-checksum/pom.xml
+++ b/archiva-modules/archiva-base/archiva-checksum/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-checksum</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-common/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-common/pom.xml b/archiva-modules/archiva-base/archiva-common/pom.xml
index 8663fc5..cde304a 100644
--- a/archiva-modules/archiva-base/archiva-common/pom.xml
+++ b/archiva-modules/archiva-base/archiva-common/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-common</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-configuration/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-configuration/pom.xml b/archiva-modules/archiva-base/archiva-configuration/pom.xml
index 976fb1d..fa2ad1c 100644
--- a/archiva-modules/archiva-base/archiva-configuration/pom.xml
+++ b/archiva-modules/archiva-base/archiva-configuration/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-configuration</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml
index 9abc941..8e81e36 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-consumers</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-consumer-api</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
index 8d5ea41..b141994 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-consumers</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-consumer-archetype</artifactId>
   <packaging>maven-archetype</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
index 41eda78..5e01347 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-consumers</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-core-consumers</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/pom.xml
index 7a91b53..cd44114 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-consumers</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-lucene-consumers</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/pom.xml
index 04b04e9..d406c4f 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <artifactId>archiva-consumers</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-metadata-consumer</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-consumers/archiva-signature-consumers/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-signature-consumers/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-signature-consumers/pom.xml
index 3254fb2..9b112da 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-signature-consumers/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-signature-consumers/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-consumers</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-signature-consumers</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-consumers/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/pom.xml b/archiva-modules/archiva-base/archiva-consumers/pom.xml
index c8622d5..dc16ce2 100644
--- a/archiva-modules/archiva-base/archiva-consumers/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-consumers</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-converter/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-converter/pom.xml b/archiva-modules/archiva-base/archiva-converter/pom.xml
index 0a402f8..fe94a72 100644
--- a/archiva-modules/archiva-base/archiva-converter/pom.xml
+++ b/archiva-modules/archiva-base/archiva-converter/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-converter</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-filelock/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-filelock/pom.xml b/archiva-modules/archiva-base/archiva-filelock/pom.xml
index 173a03b..37aa3ae 100644
--- a/archiva-modules/archiva-base/archiva-filelock/pom.xml
+++ b/archiva-modules/archiva-base/archiva-filelock/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-filelock</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-indexer/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-indexer/pom.xml b/archiva-modules/archiva-base/archiva-indexer/pom.xml
index 7e900c8..bb68732 100644
--- a/archiva-modules/archiva-base/archiva-indexer/pom.xml
+++ b/archiva-modules/archiva-base/archiva-indexer/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-indexer</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-maven2-metadata/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-maven2-metadata/pom.xml b/archiva-modules/archiva-base/archiva-maven2-metadata/pom.xml
index 420841f..b9dc78d 100644
--- a/archiva-modules/archiva-base/archiva-maven2-metadata/pom.xml
+++ b/archiva-modules/archiva-base/archiva-maven2-metadata/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-maven2-metadata</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-maven2-model/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-maven2-model/pom.xml b/archiva-modules/archiva-base/archiva-maven2-model/pom.xml
index 6843c01..9923908 100644
--- a/archiva-modules/archiva-base/archiva-maven2-model/pom.xml
+++ b/archiva-modules/archiva-base/archiva-maven2-model/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-maven2-model</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-model/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-model/pom.xml b/archiva-modules/archiva-base/archiva-model/pom.xml
index 1b7045b..8c3f583 100755
--- a/archiva-modules/archiva-base/archiva-model/pom.xml
+++ b/archiva-modules/archiva-base/archiva-model/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-model</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-plexus-bridge/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-plexus-bridge/pom.xml b/archiva-modules/archiva-base/archiva-plexus-bridge/pom.xml
index 280cdb3..94316d8 100644
--- a/archiva-modules/archiva-base/archiva-plexus-bridge/pom.xml
+++ b/archiva-modules/archiva-base/archiva-plexus-bridge/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-plexus-bridge</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-policies/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-policies/pom.xml b/archiva-modules/archiva-base/archiva-policies/pom.xml
index 2b9790f..7306a05 100644
--- a/archiva-modules/archiva-base/archiva-policies/pom.xml
+++ b/archiva-modules/archiva-base/archiva-policies/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-policies</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-proxy-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy-api/pom.xml b/archiva-modules/archiva-base/archiva-proxy-api/pom.xml
index 6096427..f8dceff 100644
--- a/archiva-modules/archiva-base/archiva-proxy-api/pom.xml
+++ b/archiva-modules/archiva-base/archiva-proxy-api/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-base</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-proxy-api</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-proxy-common/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy-common/pom.xml b/archiva-modules/archiva-base/archiva-proxy-common/pom.xml
index cf18860..5f0ba44 100644
--- a/archiva-modules/archiva-base/archiva-proxy-common/pom.xml
+++ b/archiva-modules/archiva-base/archiva-proxy-common/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-base</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-proxy-common</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-proxy/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy/pom.xml b/archiva-modules/archiva-base/archiva-proxy/pom.xml
index 18c7f02..2fdf14f 100644
--- a/archiva-modules/archiva-base/archiva-proxy/pom.xml
+++ b/archiva-modules/archiva-base/archiva-proxy/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-proxy</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/pom.xml b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/pom.xml
index 68d33d8..4ff3475 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-repository-admin</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-repository-admin-api</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
index 39c7e18..eaa1cf6 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-repository-admin</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-repository-admin-default</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/pom.xml b/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
index 5dc02ff..8fb25f3 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-repository-admin</artifactId>
   <name>Archiva Base :: Repository Admin</name>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/pom.xml b/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
index 817af62..ad0830f 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-repository-layer</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-repository-scanner/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/pom.xml b/archiva-modules/archiva-base/archiva-repository-scanner/pom.xml
index e766214..199b839 100644
--- a/archiva-modules/archiva-base/archiva-repository-scanner/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-scanner/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <artifactId>archiva-base</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-repository-scanner</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-security-common/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-security-common/pom.xml b/archiva-modules/archiva-base/archiva-security-common/pom.xml
index ca79d95..64a6c71 100644
--- a/archiva-modules/archiva-base/archiva-security-common/pom.xml
+++ b/archiva-modules/archiva-base/archiva-security-common/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-base</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <groupId>org.apache.archiva</groupId>
   <artifactId>archiva-security-common</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-test-utils/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-test-utils/pom.xml b/archiva-modules/archiva-base/archiva-test-utils/pom.xml
index 04192bc..c1e22d8 100644
--- a/archiva-modules/archiva-base/archiva-test-utils/pom.xml
+++ b/archiva-modules/archiva-base/archiva-test-utils/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-base</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-test-utils</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-transaction/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-transaction/pom.xml b/archiva-modules/archiva-base/archiva-transaction/pom.xml
index 350433e..38fc497 100644
--- a/archiva-modules/archiva-base/archiva-transaction/pom.xml
+++ b/archiva-modules/archiva-base/archiva-transaction/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-transaction</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/archiva-xml-tools/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-xml-tools/pom.xml b/archiva-modules/archiva-base/archiva-xml-tools/pom.xml
index 06fe736..e949e5b 100644
--- a/archiva-modules/archiva-base/archiva-xml-tools/pom.xml
+++ b/archiva-modules/archiva-base/archiva-xml-tools/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-base</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-xml-tools</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-base/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/pom.xml b/archiva-modules/archiva-base/pom.xml
index 5e4742e..cb6dbec 100644
--- a/archiva-modules/archiva-base/pom.xml
+++ b/archiva-modules/archiva-base/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-modules</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-base</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-karaf/archiva-features/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-karaf/archiva-features/pom.xml b/archiva-modules/archiva-karaf/archiva-features/pom.xml
index a582a7b..68fb6f6 100644
--- a/archiva-modules/archiva-karaf/archiva-features/pom.xml
+++ b/archiva-modules/archiva-karaf/archiva-features/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-karaf</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.archiva.karaf</groupId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-karaf/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-karaf/pom.xml b/archiva-modules/archiva-karaf/pom.xml
index e56228b..860d877 100644
--- a/archiva-modules/archiva-karaf/pom.xml
+++ b/archiva-modules/archiva-karaf/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-modules</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-karaf</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-scheduler/archiva-scheduler-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-api/pom.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-api/pom.xml
index e937db1..e811ca5 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-api/pom.xml
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-api/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-scheduler</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-scheduler-api</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
index 72cc89e..fcdb3cb 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-scheduler</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-scheduler-indexing</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-scheduler/archiva-scheduler-repository-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository-api/pom.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-repository-api/pom.xml
index cf47808..4da66dc 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository-api/pom.xml
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository-api/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-scheduler</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-scheduler-repository-api</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml
index 4b7c13d..14babe4 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-scheduler</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-scheduler-repository</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-scheduler/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/pom.xml b/archiva-modules/archiva-scheduler/pom.xml
index fdd9250..46fd76d 100644
--- a/archiva-modules/archiva-scheduler/pom.xml
+++ b/archiva-modules/archiva-scheduler/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-modules</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-scheduler</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml
index 4f9e8a4..b56d3ad 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-rest</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-rest-api</artifactId>
   <!-- DO NOT USE bundle packaging generated documentation is not included in the jar !!! -->

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
index 37d9c39..c63241d 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-rest</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-rest-services</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-rest/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/pom.xml b/archiva-modules/archiva-web/archiva-rest/pom.xml
index 22adc7b..f60976e 100644
--- a/archiva-modules/archiva-web/archiva-rest/pom.xml
+++ b/archiva-modules/archiva-web/archiva-rest/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-web</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-rest</artifactId>
   <name>Archiva Web :: REST support</name>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-rss/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rss/pom.xml b/archiva-modules/archiva-web/archiva-rss/pom.xml
index 6aba48e..fef756c 100644
--- a/archiva-modules/archiva-web/archiva-rss/pom.xml
+++ b/archiva-modules/archiva-web/archiva-rss/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-web</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-rss</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-security/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-security/pom.xml b/archiva-modules/archiva-web/archiva-security/pom.xml
index 2c176d2..d18f343 100644
--- a/archiva-modules/archiva-web/archiva-security/pom.xml
+++ b/archiva-modules/archiva-web/archiva-security/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-web</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-security</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-test-mocks/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-test-mocks/pom.xml b/archiva-modules/archiva-web/archiva-test-mocks/pom.xml
index c60811f..c155f1c 100644
--- a/archiva-modules/archiva-web/archiva-test-mocks/pom.xml
+++ b/archiva-modules/archiva-web/archiva-test-mocks/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-web</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-test-mocks</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-web-common/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-web-common/pom.xml b/archiva-modules/archiva-web/archiva-web-common/pom.xml
index 7cf47e2..d2d3a77 100644
--- a/archiva-modules/archiva-web/archiva-web-common/pom.xml
+++ b/archiva-modules/archiva-web/archiva-web-common/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-web</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-web-common</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-webapp-test/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webapp-test/pom.xml b/archiva-modules/archiva-web/archiva-webapp-test/pom.xml
index 26a9d26..9c841c3 100644
--- a/archiva-modules/archiva-web/archiva-webapp-test/pom.xml
+++ b/archiva-modules/archiva-web/archiva-webapp-test/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-web</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-webapp-test</artifactId>
   <packaging>pom</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-webapp/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webapp/pom.xml b/archiva-modules/archiva-web/archiva-webapp/pom.xml
index d4893cf..c12918e 100644
--- a/archiva-modules/archiva-web/archiva-webapp/pom.xml
+++ b/archiva-modules/archiva-web/archiva-webapp/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-web</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>archiva-webapp</artifactId>
   <packaging>war</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/archiva-webdav/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/pom.xml b/archiva-modules/archiva-web/archiva-webdav/pom.xml
index 39422f2..58b8043 100644
--- a/archiva-modules/archiva-web/archiva-webdav/pom.xml
+++ b/archiva-modules/archiva-web/archiva-webdav/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-web</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-webdav</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/archiva-web/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/pom.xml b/archiva-modules/archiva-web/pom.xml
index 85c64cf..71c2ce3 100644
--- a/archiva-modules/archiva-web/pom.xml
+++ b/archiva-modules/archiva-web/pom.xml
@@ -19,7 +19,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>archiva-modules</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>archiva-web</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/metadata/metadata-model-maven2/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/metadata-model-maven2/pom.xml b/archiva-modules/metadata/metadata-model-maven2/pom.xml
index 5d23fc7..5478e3c 100644
--- a/archiva-modules/metadata/metadata-model-maven2/pom.xml
+++ b/archiva-modules/metadata/metadata-model-maven2/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>metadata</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>metadata-model-maven2</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/metadata/metadata-model/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/metadata-model/pom.xml b/archiva-modules/metadata/metadata-model/pom.xml
index a678529..bcb441c 100644
--- a/archiva-modules/metadata/metadata-model/pom.xml
+++ b/archiva-modules/metadata/metadata-model/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>metadata</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>metadata-model</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/metadata/metadata-repository-api/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/metadata-repository-api/pom.xml b/archiva-modules/metadata/metadata-repository-api/pom.xml
index face825..d96c32b 100644
--- a/archiva-modules/metadata/metadata-repository-api/pom.xml
+++ b/archiva-modules/metadata/metadata-repository-api/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>metadata</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>metadata-repository-api</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/metadata/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/pom.xml b/archiva-modules/metadata/pom.xml
index 40d6811..2cd11ba 100644
--- a/archiva-modules/metadata/pom.xml
+++ b/archiva-modules/metadata/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-modules</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>metadata</artifactId>
   <name>Archiva :: Metadata</name>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/metadata/test-repository/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/metadata/test-repository/pom.xml b/archiva-modules/metadata/test-repository/pom.xml
index eaa871b..bb34098 100644
--- a/archiva-modules/metadata/test-repository/pom.xml
+++ b/archiva-modules/metadata/test-repository/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>metadata</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>test-repository</artifactId>
   <name>Archiva Metadata :: Repository for Testing</name>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/audit/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/audit/pom.xml b/archiva-modules/plugins/audit/pom.xml
index e6f2326..b473495 100644
--- a/archiva-modules/plugins/audit/pom.xml
+++ b/archiva-modules/plugins/audit/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>audit</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/generic-metadata-support/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/generic-metadata-support/pom.xml b/archiva-modules/plugins/generic-metadata-support/pom.xml
index d16c563..13e5790 100644
--- a/archiva-modules/plugins/generic-metadata-support/pom.xml
+++ b/archiva-modules/plugins/generic-metadata-support/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>generic-metadata-support</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/maven2-repository/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/pom.xml b/archiva-modules/plugins/maven2-repository/pom.xml
index 5594053..8672dc0 100644
--- a/archiva-modules/plugins/maven2-repository/pom.xml
+++ b/archiva-modules/plugins/maven2-repository/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <groupId>org.apache.archiva</groupId>
     <artifactId>plugins</artifactId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>maven2-repository</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/metadata-store-cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-cassandra/pom.xml b/archiva-modules/plugins/metadata-store-cassandra/pom.xml
index 83a6b17..50198b3 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/pom.xml
+++ b/archiva-modules/plugins/metadata-store-cassandra/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>metadata-store-cassandra</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/metadata-store-file/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-file/pom.xml b/archiva-modules/plugins/metadata-store-file/pom.xml
index 87b5c3e..5b658dd 100644
--- a/archiva-modules/plugins/metadata-store-file/pom.xml
+++ b/archiva-modules/plugins/metadata-store-file/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>metadata-store-file</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/metadata-store-jcr/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/metadata-store-jcr/pom.xml b/archiva-modules/plugins/metadata-store-jcr/pom.xml
index 9102982..2c07709 100644
--- a/archiva-modules/plugins/metadata-store-jcr/pom.xml
+++ b/archiva-modules/plugins/metadata-store-jcr/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>metadata-store-jcr</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/npanday-support/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/npanday-support/pom.xml b/archiva-modules/plugins/npanday-support/pom.xml
index 861cf7c..b86b70e 100644
--- a/archiva-modules/plugins/npanday-support/pom.xml
+++ b/archiva-modules/plugins/npanday-support/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>npanday-support</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/pom.xml b/archiva-modules/plugins/pom.xml
index da23c36..e8439a6 100644
--- a/archiva-modules/plugins/pom.xml
+++ b/archiva-modules/plugins/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>archiva-modules</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>plugins</artifactId>
   <name>Archiva :: Core Plugins</name>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/problem-reports/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/problem-reports/pom.xml b/archiva-modules/plugins/problem-reports/pom.xml
index ab446f6..dd8e648 100644
--- a/archiva-modules/plugins/problem-reports/pom.xml
+++ b/archiva-modules/plugins/problem-reports/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>problem-reports</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/repository-statistics/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/repository-statistics/pom.xml b/archiva-modules/plugins/repository-statistics/pom.xml
index 90a9902..59c6ecb 100644
--- a/archiva-modules/plugins/repository-statistics/pom.xml
+++ b/archiva-modules/plugins/repository-statistics/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <artifactId>repository-statistics</artifactId>
   <packaging>bundle</packaging>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/plugins/stage-repository-merge/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/stage-repository-merge/pom.xml b/archiva-modules/plugins/stage-repository-merge/pom.xml
index 176c0a9..cf92a8e 100644
--- a/archiva-modules/plugins/stage-repository-merge/pom.xml
+++ b/archiva-modules/plugins/stage-repository-merge/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>plugins</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <groupId>org.apache.archiva</groupId>
   <artifactId>stage-repository-merge</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/archiva-modules/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/pom.xml b/archiva-modules/pom.xml
index d213c34..b5ff4ea 100644
--- a/archiva-modules/pom.xml
+++ b/archiva-modules/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <artifactId>archiva</artifactId>
     <groupId>org.apache.archiva</groupId>
-    <version>2.1.2-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>archiva-modules</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva/blob/f11f3993/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ffa0930..d6ae063 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
   </parent>
 
   <artifactId>archiva</artifactId>
-  <version>2.1.2-SNAPSHOT</version>
+  <version>2.2.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>Apache Archiva</name>
@@ -79,7 +79,7 @@
     <javax.jcr.version>2.0</javax.jcr.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <surefire.redirectTestOutputToFile>true</surefire.redirectTestOutputToFile>
-    <jacocoagent></jacocoagent>
+    <jacocoagent />
     <lucene.version>3.6.2</lucene.version>
     <jackrabbit.version>2.8.0</jackrabbit.version>