<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact-manager</artifactId>
- <scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<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>
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;
}
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;
{
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 );
+ }
}
--- /dev/null
+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
--- /dev/null
+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
* @return the PomRepositoryIndexSearcher instance
*/
PomRepositoryIndexSearcher createPomRepositoryIndexSearcher( PomRepositoryIndex index );
+
+ MetadataRepositoryIndex createMetadataRepositoryIndex( String indexPath, ArtifactRepository repository)
+ throws RepositoryIndexException;
+
+ MetadataRepositoryIndexSearcher createMetadataRepositoryIndexSearcher( MetadataRepositoryIndex index );
+
}
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+<metadata>\r
+<groupId>org.apache.maven</groupId>\r
+<artifactId>maven-artifact</artifactId>\r
+<version>2.0.1</version>\r
+</metadata>\r
--- /dev/null
+<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
--- /dev/null
+<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