]> source.dussan.org Git - archiva.git/commitdiff
PR: MEV-35
authorEdwin L. Punzalan <epunzalan@apache.org>
Mon, 16 Jan 2006 08:53:09 +0000 (08:53 +0000)
committerEdwin L. Punzalan <epunzalan@apache.org>
Mon, 16 Jan 2006 08:53:09 +0000 (08:53 +0000)
Submitted by: Maria Odea Ching

Applied patch for indexing metadata and for searching the metadata index

git-svn-id: https://svn.apache.org/repos/asf/maven/repository-manager/trunk@369402 13f79535-47bb-0310-9956-ffa450edef68

maven-repository-indexer/pom.xml
maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/AbstractRepositoryIndexSearcher.java
maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexingFactory.java
maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/MetadataRepositoryIndex.java [new file with mode: 0644]
maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexSearcher.java [new file with mode: 0644]
maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexingFactory.java
maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/RangeQuery.java [new file with mode: 0644]
maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexingTest.java [new file with mode: 0644]
maven-repository-indexer/src/test/repository/org/apache/maven/maven-artifact/2.0.1/maven-metadata.xml [new file with mode: 0644]
maven-repository-indexer/src/test/repository/org/apache/maven/maven-artifact/maven-metadata.xml [new file with mode: 0644]
maven-repository-indexer/src/test/repository/org/apache/maven/maven-metadata.xml [new file with mode: 0644]

index a7afee6b0f3092b432c29ae80cec7d893e46653e..4953d324340187dd8bf828fdf3de68a85bfaa77f 100644 (file)
@@ -32,7 +32,6 @@
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-artifact-manager</artifactId>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
@@ -55,5 +54,9 @@
       <groupId>org.apache.maven.repository</groupId>
       <artifactId>maven-repository-utils</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-repository-metadata</artifactId>
+    </dependency>
   </dependencies>
 </project>
index f593b8c74824c8bdb8881f295a3c4346bd4d52b5..c67d7ef3d2424b2922dc7913e8c071f808faf341 100644 (file)
@@ -28,6 +28,7 @@ import org.apache.maven.repository.indexing.query.CompoundQuery;
 import org.apache.maven.repository.indexing.query.CompoundQueryTerm;
 import org.apache.maven.repository.indexing.query.Query;
 import org.apache.maven.repository.indexing.query.SinglePhraseQuery;
+import org.apache.maven.repository.indexing.query.RangeQuery;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 
 import java.io.IOException;
@@ -158,6 +159,21 @@ public abstract class AbstractRepositoryIndexSearcher
             }
             retVal = booleanQuery;
         }
+        else if( query instanceof RangeQuery )
+        {
+            RangeQuery rq = (RangeQuery) query;
+            List queries = rq.getQueries();
+            Iterator iter = queries.iterator();
+            Term begin = null, end = null;
+            if(queries.size() == 2)
+            {
+                SinglePhraseQuery qry = (SinglePhraseQuery) iter.next();
+                begin = new Term( qry.getField(), qry.getValue() );
+                qry = ( SinglePhraseQuery ) iter.next();
+                end = new Term( qry.getField(), qry.getValue() );
+            }            
+            retVal = new org.apache.lucene.search.RangeQuery( begin, end, rq.isInclusive() );
+        }
         else
         {
             SinglePhraseQuery singlePhraseQuery = (SinglePhraseQuery) query;
index d999dc8b0e55a9f1b97362d0fc1f94c1bdd52426..47298d3d60b03c40e8a0075416b7b45e180c93fb 100644 (file)
@@ -71,4 +71,14 @@ public class DefaultRepositoryIndexingFactory
     {
         return new PomRepositoryIndexSearcher( index, artifactFactory );
     }
+
+    public MetadataRepositoryIndex createMetadataRepositoryIndex( String indexPath, ArtifactRepository repository)
+        throws RepositoryIndexException{
+        return new MetadataRepositoryIndex(indexPath, repository);
+    }
+
+    public MetadataRepositoryIndexSearcher createMetadataRepositoryIndexSearcher( MetadataRepositoryIndex index )
+    {
+        return new MetadataRepositoryIndexSearcher( index, artifactFactory );
+    }
 }
diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/MetadataRepositoryIndex.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/MetadataRepositoryIndex.java
new file mode 100644 (file)
index 0000000..5919acf
--- /dev/null
@@ -0,0 +1,180 @@
+package org.apache.maven.repository.indexing;\r
+\r
+/*\r
+ * Copyright 2005-2006 The Apache Software Foundation.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+import org.apache.lucene.analysis.Analyzer;\r
+import org.apache.lucene.analysis.standard.StandardAnalyzer;\r
+import org.apache.lucene.document.Document;\r
+import org.apache.lucene.document.Field;\r
+import org.apache.maven.artifact.repository.ArtifactRepository;\r
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;\r
+import org.apache.maven.artifact.repository.metadata.Metadata;\r
+import org.apache.maven.artifact.repository.metadata.Versioning;\r
+import org.apache.maven.artifact.repository.metadata.Plugin;\r
+\r
+import java.util.List;\r
+import java.util.Iterator;\r
+import java.io.IOException;\r
+\r
+/**\r
+ * This class indexes the metadata in the repository.\r
+ */\r
+public class MetadataRepositoryIndex\r
+        extends AbstractRepositoryIndex\r
+{\r
+    private static final String FLD_LASTUPDATE = "lastUpdate";\r
+\r
+    private static final String FLD_PLUGINPREFIX = "pluginPrefix";\r
+\r
+    private static final String FLD_METADATAPATH = "path";\r
+\r
+    private static final String FLD_GROUPID = "groupId";\r
+\r
+    private static final String FLD_ARTIFACTID = "artifactId";\r
+\r
+    private static final String FLD_VERSION = "version";\r
+\r
+    private static final String[] FIELDS = {FLD_METADATAPATH, FLD_PLUGINPREFIX, FLD_LASTUPDATE,\r
+            FLD_GROUPID, FLD_ARTIFACTID, FLD_VERSION};\r
+\r
+    /**\r
+     * Constructor\r
+     * @param indexPath the path to the index\r
+     * @param repository the repository where the metadata to be indexed is located\r
+     * @throws RepositoryIndexException\r
+     */\r
+    public MetadataRepositoryIndex( String indexPath, ArtifactRepository repository )\r
+            throws RepositoryIndexException\r
+    {\r
+        super( indexPath, repository, FIELDS );\r
+    }\r
+\r
+    /**\r
+     * Get the field names to be used in the index\r
+     * @return array of strings\r
+     */\r
+    public String[] getIndexFields()\r
+    {\r
+        return FIELDS;\r
+    }\r
+\r
+    /**\r
+     * Returns the analyzer used for indexing\r
+     * @return Analyzer object\r
+     */\r
+    public Analyzer getAnalyzer()\r
+    {\r
+        return new StandardAnalyzer();\r
+    }\r
+\r
+    /**\r
+     * Index the paramater object\r
+     * @param obj\r
+     * @throws RepositoryIndexException\r
+     */\r
+    public void index( Object obj ) throws RepositoryIndexException\r
+    {\r
+         if ( obj instanceof RepositoryMetadata )\r
+        {\r
+            indexMetadata( (RepositoryMetadata) obj );\r
+        }\r
+        else\r
+        {\r
+            throw new RepositoryIndexException(\r
+                "This instance of indexer cannot index instances of " + obj.getClass().getName() );\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Index the contents of the specified RepositoryMetadata paramter object\r
+     * @param repoMetadata the metadata object to be indexed\r
+     * @throws RepositoryIndexException\r
+     */\r
+    private void indexMetadata( RepositoryMetadata repoMetadata ) throws RepositoryIndexException\r
+    {\r
+         if ( !isOpen() )\r
+        {\r
+            throw new RepositoryIndexException( "Unable to add artifact index on a closed index" );\r
+        }\r
+\r
+        //get lastUpdated from Versioning (specified in Metadata object)\r
+        //get pluginPrefixes from Plugin (spcified in Metadata object) -----> concatenate/append???\r
+        //get the metadatapath: check where metadata is located, then concatenate the groupId,\r
+        // artifactId, version based on its location\r
+        Document doc = new Document();\r
+        String path = "";\r
+\r
+        if( repoMetadata.storedInGroupDirectory() && !repoMetadata.storedInArtifactVersionDirectory())\r
+        {\r
+            path = repoMetadata.getGroupId() + "/";\r
+        }\r
+        else if(!repoMetadata.storedInGroupDirectory() && !repoMetadata.storedInArtifactVersionDirectory())\r
+        {\r
+           path = repoMetadata.getGroupId() + "/" + repoMetadata.getArtifactId() + "/";\r
+        }\r
+        else if(!repoMetadata.storedInGroupDirectory() && repoMetadata.storedInArtifactVersionDirectory())\r
+        {\r
+           path = repoMetadata.getGroupId() + "/" + repoMetadata.getArtifactId() + "/" + repoMetadata.getBaseVersion() + "/";\r
+        }\r
+\r
+        //@todo use localfilename or remotefilename to get the path???\r
+        path = path + repoMetadata.getRemoteFilename();\r
+        doc.add( Field.Text( FLD_METADATAPATH, path) );\r
+\r
+        Metadata metadata = repoMetadata.getMetadata();\r
+        Versioning versioning = metadata.getVersioning();\r
+        if( versioning != null )\r
+        {\r
+            doc.add( Field.Text( FLD_LASTUPDATE, versioning.getLastUpdated() ) );\r
+        }\r
+\r
+        List plugins = metadata.getPlugins();\r
+        String pluginAppended = "";\r
+        for( Iterator iter = plugins.iterator(); iter.hasNext(); )\r
+        {\r
+            Plugin plugin = (Plugin) iter.next();\r
+            if( plugin.getPrefix() != null && !plugin.getPrefix().equals("") )\r
+            {\r
+                pluginAppended = plugin.getPrefix() + " ";\r
+            }\r
+        }\r
+        doc.add( Field.Text( FLD_PLUGINPREFIX, pluginAppended ) );\r
+        doc.add( Field.UnIndexed( FLD_GROUPID, metadata.getGroupId() ) );\r
+\r
+        if( metadata.getArtifactId() != null && !metadata.getArtifactId().equals("") )\r
+        {\r
+            doc.add( Field.UnIndexed( FLD_ARTIFACTID, metadata.getArtifactId() ) );\r
+        }\r
+        if( metadata.getVersion() != null && !metadata.getVersion().equals("") )\r
+        {\r
+            doc.add( Field.UnIndexed( FLD_VERSION, metadata.getVersion() ) );\r
+        }\r
+\r
+        try\r
+        {\r
+            getIndexWriter().addDocument( doc );\r
+        }\r
+        catch ( IOException e )\r
+        {\r
+            throw new RepositoryIndexException( "Error opening index", e );\r
+        }\r
+    }\r
+\r
+    public boolean isKeywordField( String field ){\r
+           return false;\r
+    }\r
+}\r
diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexSearcher.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexSearcher.java
new file mode 100644 (file)
index 0000000..1f8dceb
--- /dev/null
@@ -0,0 +1,174 @@
+package org.apache.maven.repository.indexing;\r
+\r
+/*\r
+ * Copyright 2005-2006 The Apache Software Foundation.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+import org.apache.lucene.document.Document;\r
+import org.apache.maven.artifact.factory.ArtifactFactory;\r
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;\r
+import org.apache.maven.artifact.repository.metadata.GroupRepositoryMetadata;\r
+import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;\r
+import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;\r
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;\r
+import org.apache.maven.artifact.Artifact;\r
+\r
+import java.net.URL;\r
+import java.io.InputStream;\r
+import java.io.File;\r
+import java.io.InputStreamReader;\r
+import java.util.*;\r
+\r
+/**\r
+ * This class searches the specified index given the search/query criteria.\r
+ *\r
+ */\r
+public class MetadataRepositoryIndexSearcher\r
+        extends AbstractRepositoryIndexSearcher\r
+{\r
+    private ArtifactFactory artifactFactory;\r
+\r
+    private static final String FLD_METADATAPATH = "path";\r
+\r
+    private static final String FLD_GROUPID = "groupId";\r
+\r
+    private static final String FLD_ARTIFACTID = "artifactId";\r
+\r
+    private static final String FLD_VERSION = "version";\r
+\r
+    private static final String GROUP_TYPE = "GROUP";\r
+\r
+    private static final String ARTIFACT_TYPE = "ARTIFACT";\r
+\r
+    private static final String SNAPSHOT_TYPE = "SNAPSHOT";\r
+\r
+    /**\r
+     * Constructor\r
+     * @param index the index object to be set\r
+     * @param factory\r
+     */\r
+    public MetadataRepositoryIndexSearcher( MetadataRepositoryIndex index, ArtifactFactory factory)\r
+    {\r
+        super(index);\r
+        artifactFactory = factory;\r
+    }\r
+\r
+    /**\r
+     * Create object to be returned by the search based on the document\r
+     * @param doc\r
+     * @return Object\r
+     */\r
+    protected Object createSearchedObjectFromIndexDocument( Document doc )\r
+    {\r
+        List pathParts = new ArrayList();\r
+        StringTokenizer st = new StringTokenizer( doc.get( FLD_METADATAPATH ), "/\\" );\r
+        while ( st.hasMoreTokens() )\r
+        {\r
+            pathParts.add( st.nextToken() );\r
+        }\r
+\r
+        Collections.reverse( pathParts );\r
+        Iterator it = pathParts.iterator();\r
+        String metadataFile = (String) it.next();\r
+        String tmpDir = (String) it.next();\r
+\r
+        String metadataType = "";\r
+        if( tmpDir.equals( doc.get( FLD_GROUPID ) ) )\r
+        {\r
+            metadataType = GROUP_TYPE;\r
+        }\r
+        else if( tmpDir.equals( doc.get( FLD_ARTIFACTID ) ) )\r
+        {\r
+            metadataType = ARTIFACT_TYPE;\r
+        }\r
+        else\r
+        {\r
+            metadataType = SNAPSHOT_TYPE;\r
+        }\r
+\r
+        RepositoryMetadata repoMetadata = null;\r
+\r
+        try{\r
+            repoMetadata = getMetadata(doc.get( FLD_GROUPID ), doc.get( FLD_ARTIFACTID ), doc.get( FLD_VERSION ), metadataFile, metadataType );\r
+        }\r
+        catch(Exception e)\r
+        {\r
+            //@todo\r
+        }\r
+\r
+        return repoMetadata;\r
+    }\r
+\r
+    /**\r
+     * Create RepositoryMetadata object.\r
+     *\r
+     * @param groupId the groupId to be set\r
+     * @param artifactId the artifactId to be set\r
+     * @param version the version to be set\r
+     * @param filename the name of the metadata file\r
+     * @param metadataType the type of RepositoryMetadata object to be created (GROUP, ARTIFACT or SNAPSHOT)\r
+     * @return RepositoryMetadata\r
+     * @throws Exception\r
+     */\r
+    private RepositoryMetadata getMetadata( String groupId, String artifactId, String version, String filename, String metadataType)\r
+        throws Exception\r
+    {\r
+        RepositoryMetadata repoMetadata = null;\r
+        URL url;\r
+        InputStream is = null;\r
+        MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();\r
+\r
+        //group metadata\r
+        if( metadataType.equals( GROUP_TYPE ) )\r
+        {\r
+            url = new File( index.getRepository().getBasedir() + groupId.replace('.', '/') + "/" + filename ).toURL();\r
+            is = url.openStream();\r
+            repoMetadata = new GroupRepositoryMetadata(groupId);\r
+            repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
+        }\r
+        //artifact metadata\r
+        else if( metadataType.equals( ARTIFACT_TYPE ) )\r
+        {\r
+            url = new File( index.getRepository().getBasedir() + groupId.replace('.', '/') + "/" + artifactId + "/" + filename ).toURL();\r
+            is = url.openStream();\r
+            repoMetadata = new ArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
+            repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
+        }\r
+        //snapshot/version metadata\r
+        else if( metadataType.equals( SNAPSHOT_TYPE ) )\r
+        {\r
+            url = new File( index.getRepository().getBasedir() + groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + filename ).toURL();\r
+            is = url.openStream();\r
+            repoMetadata = new SnapshotArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
+            repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
+        }\r
+\r
+        return repoMetadata;\r
+    }\r
+\r
+    /**\r
+     * Create artifact object.\r
+     * @param groupId the groupId of the artifact\r
+     * @param artifactId the artifactId of the artifact\r
+     * @param version the version of the artifact\r
+     * @return Artifact\r
+     * @throws Exception\r
+     */\r
+    private Artifact getArtifact( String groupId, String artifactId, String version )\r
+        throws Exception\r
+    {\r
+        return artifactFactory.createBuildArtifact( groupId, artifactId, version, "jar" );\r
+    }\r
+}\r
index 53126c4c23dab50bf2fe6fced74111313235e34f..f4c7f5f1a0bd97be56d39eff3d28d3ea2442d0e1 100644 (file)
@@ -64,4 +64,10 @@ public interface RepositoryIndexingFactory
      * @return the PomRepositoryIndexSearcher instance
      */
     PomRepositoryIndexSearcher createPomRepositoryIndexSearcher( PomRepositoryIndex index );
+
+    MetadataRepositoryIndex createMetadataRepositoryIndex( String indexPath, ArtifactRepository repository)
+            throws RepositoryIndexException;
+
+    MetadataRepositoryIndexSearcher createMetadataRepositoryIndexSearcher( MetadataRepositoryIndex index );
+
 }
diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/RangeQuery.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/query/RangeQuery.java
new file mode 100644 (file)
index 0000000..db0b388
--- /dev/null
@@ -0,0 +1,52 @@
+package org.apache.maven.repository.indexing.query;\r
+\r
+/*\r
+ * Copyright 2005-2006 The Apache Software Foundation.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+import java.util.List;\r
+import java.util.ArrayList;\r
+\r
+/**\r
+ * Query object that handles range queries for dates.\r
+ * @author Maria Odea Ching\r
+ */\r
+public class RangeQuery\r
+    implements Query\r
+{\r
+    List queries = new ArrayList();\r
+\r
+    private boolean inclusive;\r
+\r
+    public RangeQuery( boolean inclusive)\r
+    {\r
+        this.inclusive = inclusive;\r
+    }\r
+\r
+    public void addQuery( Query qry )\r
+    {\r
+        queries.add( qry );\r
+    }\r
+\r
+    public List getQueries()\r
+    {\r
+        return queries;\r
+    }\r
+\r
+    public boolean isInclusive()\r
+    {\r
+        return inclusive;\r
+    }\r
+}\r
diff --git a/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexingTest.java b/maven-repository-indexer/src/test/java/org/apache/maven/repository/indexing/MetadataRepositoryIndexingTest.java
new file mode 100644 (file)
index 0000000..e2ad7aa
--- /dev/null
@@ -0,0 +1,249 @@
+package org.apache.maven.repository.indexing;\r
+\r
+/*\r
+ * Copyright 2005-2006 The Apache Software Foundation.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+import org.apache.maven.artifact.Artifact;\r
+import org.apache.maven.artifact.factory.ArtifactFactory;\r
+import org.apache.maven.artifact.repository.ArtifactRepository;\r
+import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;\r
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;\r
+import org.apache.maven.artifact.repository.metadata.*;\r
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;\r
+import org.apache.maven.repository.indexing.query.Query;\r
+import org.apache.maven.repository.indexing.query.RangeQuery;\r
+import org.apache.maven.repository.indexing.query.SinglePhraseQuery;\r
+import org.codehaus.plexus.PlexusTestCase;\r
+import org.codehaus.plexus.util.FileUtils;\r
+\r
+import java.io.File;\r
+import java.io.InputStream;\r
+import java.io.InputStreamReader;\r
+import java.net.URL;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+/**\r
+ * This class tests the MetadataRepositoryIndex.\r
+ */\r
+public class MetadataRepositoryIndexingTest\r
+        extends PlexusTestCase\r
+{\r
+    private ArtifactRepository repository;\r
+\r
+    private String indexPath;\r
+\r
+    private static final String FLD_LASTUPDATE = "lastUpdate";\r
+\r
+    private static final String FLD_PLUGINPREFIX = "pluginPrefix";\r
+\r
+    private static final String GROUP_TYPE = "GROUP";\r
+\r
+    private static final String ARTIFACT_TYPE = "ARTIFACT";\r
+\r
+    private static final String SNAPSHOT_TYPE = "SNAPSHOT";\r
+\r
+    private MetadataRepositoryIndex indexer;\r
+\r
+    private ArtifactFactory artifactFactory;\r
+\r
+    /**\r
+     * Set up.\r
+     * @throws Exception\r
+     */\r
+    public void setUp() throws Exception\r
+    {\r
+        super.setUp();\r
+        File repositoryDirectory = getTestFile( "src/test/repository" );\r
+        String repoDir = repositoryDirectory.toURL().toString();\r
+        ArtifactRepositoryLayout layout = ( ArtifactRepositoryLayout ) lookup( ArtifactRepositoryLayout.ROLE, "default" );\r
+        ArtifactRepositoryFactory repoFactory = ( ArtifactRepositoryFactory ) lookup( ArtifactRepositoryFactory.ROLE );\r
+        repository = repoFactory.createArtifactRepository( "test", repoDir, layout, null, null );\r
+\r
+        indexPath = "target/index/metadata";\r
+        FileUtils.deleteDirectory( indexPath );\r
+    }\r
+\r
+    /**\r
+     * Tear down.\r
+     * @throws Exception\r
+     */\r
+    public void tearDown() throws Exception\r
+    {\r
+        repository = null;\r
+        super.tearDown();\r
+    }\r
+\r
+    /**\r
+     * Create the test index.\r
+     * @throws Exception\r
+     */\r
+    private void createTestIndex() throws Exception\r
+    {\r
+        RepositoryIndexingFactory factory = ( RepositoryIndexingFactory ) lookup( RepositoryIndexingFactory.ROLE );\r
+        indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
+\r
+        RepositoryMetadata repoMetadata = getMetadata( "org.apache.maven", null, null, "maven-metadata.xml", GROUP_TYPE );\r
+        indexer.index( repoMetadata );\r
+\r
+        repoMetadata = getMetadata( "org.apache.maven", "maven-artifact", "2.0.1", "maven-metadata.xml", ARTIFACT_TYPE );\r
+        indexer.index( repoMetadata );\r
+\r
+        repoMetadata = getMetadata( "org.apache.maven", "maven-artifact", "2.0.1", "maven-metadata.xml", SNAPSHOT_TYPE );\r
+        indexer.index( repoMetadata );\r
+\r
+        indexer.optimize();\r
+        indexer.close();\r
+    }\r
+\r
+    /**\r
+     * Test the ArtifactRepositoryIndexSearcher using a single-phrase search.\r
+     *\r
+     * @throws Exception\r
+     */\r
+     public void testSearchSingle()\r
+         throws Exception\r
+     {\r
+        createTestIndex();\r
+\r
+        RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
+        MetadataRepositoryIndex indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
+        RepositoryIndexSearcher repoSearcher = factory.createMetadataRepositoryIndexSearcher( indexer );\r
+\r
+        // search last update\r
+        org.apache.maven.repository.indexing.query.Query qry = new SinglePhraseQuery( FLD_LASTUPDATE, "20051212044643" );\r
+        List metadataList = repoSearcher.search( qry );\r
+        assertEquals( 1, metadataList.size() );\r
+        for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
+        {\r
+            RepositoryMetadata repoMetadata = (RepositoryMetadata) iter.next();\r
+\r
+            Metadata metadata = repoMetadata.getMetadata();\r
+            Versioning versioning = metadata.getVersioning();\r
+            assertEquals( "20051212044643", versioning.getLastUpdated() );\r
+        }\r
+\r
+        // search plugin prefix\r
+        qry = new SinglePhraseQuery( FLD_PLUGINPREFIX, "org.apache.maven" );\r
+        metadataList = repoSearcher.search( qry );\r
+        assertEquals( 1, metadataList.size() );\r
+        for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
+        {\r
+            RepositoryMetadata repoMetadata = (RepositoryMetadata) iter.next();\r
+            Metadata metadata = repoMetadata.getMetadata();\r
+            List plugins = metadata.getPlugins();\r
+            for( Iterator it = plugins.iterator(); it.hasNext(); )\r
+            {\r
+                Plugin plugin = (Plugin) it.next();\r
+                assertEquals( "org.apache.maven", plugin.getPrefix() );\r
+            }\r
+        }\r
+\r
+        // search last update using INCLUSIVE Range Query\r
+        Query qry1 = new SinglePhraseQuery( FLD_LASTUPDATE, "20051212000000" );\r
+        Query qry2 = new SinglePhraseQuery( FLD_LASTUPDATE, "20051212235959");\r
+        RangeQuery rQry = new RangeQuery( true );\r
+        rQry.addQuery( qry1 );\r
+        rQry.addQuery( qry2 );\r
+\r
+        metadataList = repoSearcher.search( rQry );\r
+        for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
+        {\r
+            RepositoryMetadata repoMetadata = (RepositoryMetadata) iter.next();\r
+            Metadata metadata = repoMetadata.getMetadata();\r
+            Versioning versioning = metadata.getVersioning();\r
+            assertEquals( "20051212044643", versioning.getLastUpdated() );\r
+        }\r
+\r
+        // search last update using EXCLUSIVE Range Query\r
+        qry1 = new SinglePhraseQuery( FLD_LASTUPDATE, "20051212000000" );\r
+        qry2 = new SinglePhraseQuery( FLD_LASTUPDATE, "20051212044643");\r
+        rQry = new RangeQuery( false );\r
+        rQry.addQuery( qry1 );\r
+        rQry.addQuery( qry2 );\r
+\r
+        metadataList = repoSearcher.search( rQry );\r
+        assertEquals( metadataList.size(), 0 );\r
+\r
+        indexer.close();\r
+     }\r
+\r
+    /**\r
+     * Create RepositoryMetadata object.\r
+     *\r
+     * @param groupId the groupId to be set\r
+     * @param artifactId the artifactId to be set\r
+     * @param version the version to be set\r
+     * @param filename the name of the metadata file\r
+     * @param metadataType the type of RepositoryMetadata object to be created (GROUP, ARTIFACT or SNAPSHOT)\r
+     * @return RepositoryMetadata\r
+     * @throws Exception\r
+     */\r
+    private RepositoryMetadata getMetadata( String groupId, String artifactId, String version, String filename, String metadataType)\r
+        throws Exception\r
+    {\r
+        RepositoryMetadata repoMetadata = null;\r
+        URL url;\r
+        InputStream is = null;\r
+        MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();\r
+\r
+        //group metadata\r
+        if( metadataType.equals( GROUP_TYPE ) )\r
+        {\r
+            url = new File( repository.getBasedir() + groupId.replace('.', '/') + "/" + filename ).toURL();\r
+            is = url.openStream();\r
+            repoMetadata = new GroupRepositoryMetadata(groupId);\r
+            repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
+        }\r
+        //artifact metadata\r
+        else if( metadataType.equals( ARTIFACT_TYPE ) )\r
+        {\r
+            url = new File( repository.getBasedir() + groupId.replace('.', '/') + "/" + artifactId + "/" + filename ).toURL();\r
+            is = url.openStream();\r
+            repoMetadata = new ArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
+            repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
+        }\r
+        //snapshot/version metadata\r
+        else if( metadataType.equals( SNAPSHOT_TYPE ) )\r
+        {\r
+            url = new File( repository.getBasedir() + groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + filename ).toURL();\r
+            is = url.openStream();\r
+            repoMetadata = new SnapshotArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
+            repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
+        }\r
+\r
+        return repoMetadata;\r
+    }\r
+\r
+\r
+    /**\r
+     * Create artifact object.\r
+     * @param groupId the groupId of the artifact\r
+     * @param artifactId the artifactId of the artifact\r
+     * @param version the version of the artifact\r
+     * @return Artifact\r
+     * @throws Exception\r
+     */\r
+    private Artifact getArtifact( String groupId, String artifactId, String version )\r
+        throws Exception\r
+    {\r
+        if ( artifactFactory == null )\r
+        {\r
+            artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );\r
+        }\r
+        return artifactFactory.createBuildArtifact( groupId, artifactId, version, "jar" );\r
+    }\r
+}\r
diff --git a/maven-repository-indexer/src/test/repository/org/apache/maven/maven-artifact/2.0.1/maven-metadata.xml b/maven-repository-indexer/src/test/repository/org/apache/maven/maven-artifact/2.0.1/maven-metadata.xml
new file mode 100644 (file)
index 0000000..739da6b
--- /dev/null
@@ -0,0 +1,5 @@
+<metadata>\r
+<groupId>org.apache.maven</groupId>\r
+<artifactId>maven-artifact</artifactId>\r
+<version>2.0.1</version>\r
+</metadata>\r
diff --git a/maven-repository-indexer/src/test/repository/org/apache/maven/maven-artifact/maven-metadata.xml b/maven-repository-indexer/src/test/repository/org/apache/maven/maven-artifact/maven-metadata.xml
new file mode 100644 (file)
index 0000000..fd40c7b
--- /dev/null
@@ -0,0 +1,12 @@
+<metadata>\r
+<groupId>org.apache.maven</groupId>\r
+<artifactId>maven-artifact</artifactId>\r
+<version>2.0.1</version>\r
+<versioning>\r
+<release>2.0.1</release>\r
+<versions>\r
+<version>2.0.1</version>\r
+</versions>\r
+<lastUpdated>20051212044643</lastUpdated>\r
+</versioning>\r
+</metadata>\r
diff --git a/maven-repository-indexer/src/test/repository/org/apache/maven/maven-metadata.xml b/maven-repository-indexer/src/test/repository/org/apache/maven/maven-metadata.xml
new file mode 100644 (file)
index 0000000..11612dc
--- /dev/null
@@ -0,0 +1,9 @@
+<metadata>\r
+<groupId>org.apache.maven</groupId>\r
+<plugins>\r
+  <plugin>\r
+    <prefix>org.apache.maven</prefix>\r
+    <artifactId>org.apache.maven-maven-plugin</artifactId>\r
+  </plugin>\r
+</plugins>\r
+</metadata>\r