]> source.dussan.org Git - archiva.git/blob
39670273fecc7d2bac9a33022d777ec1846831f4
[archiva.git] /
1 package org.apache.maven.repository.indexing;
2
3 /*
4  * Copyright 2005-2006 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 import org.apache.lucene.document.DateField;
20 import org.apache.lucene.document.Document;
21 import org.apache.lucene.queryParser.QueryParser;
22 import org.apache.lucene.search.Hits;
23 import org.apache.lucene.search.IndexSearcher;
24 import org.apache.maven.artifact.Artifact;
25 import org.apache.maven.artifact.factory.ArtifactFactory;
26 import org.apache.maven.artifact.repository.ArtifactRepository;
27 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
28 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
29 import org.apache.maven.repository.digest.DefaultDigester;
30 import org.apache.maven.repository.digest.Digester;
31 import org.codehaus.plexus.PlexusTestCase;
32 import org.codehaus.plexus.util.FileUtils;
33
34 import java.io.File;
35
36 /**
37  * @author Edwin Punzalan
38  */
39 public class EclipseRepositoryIndexTest
40     extends PlexusTestCase
41 {
42     private ArtifactFactory artifactFactory;
43
44     private ArtifactRepository repository;
45
46     private String indexPath;
47
48     private Digester digester;
49
50     private long artifactFileTime;
51
52     private static final long TIME_DIFFERENCE = 10000L;
53
54     protected void setUp()
55         throws Exception
56     {
57         super.setUp();
58
59         File repositoryDirectory = getTestFile( "src/test/repository" );
60         String repoDir = repositoryDirectory.toURL().toString();
61         ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );
62         ArtifactRepositoryFactory repoFactory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
63         repository = repoFactory.createArtifactRepository( "test", repoDir, layout, null, null );
64         digester = new DefaultDigester();
65
66         indexPath = "target/index";
67         FileUtils.deleteDirectory( indexPath );
68     }
69
70     /**
71      * Create an index that will be used for testing.
72      * Indexing process: check if the object was already indexed [ checkIfIndexed(Object) ], open the index [ open() ],
73      * index the object [ index(Object) ], optimize the index [ optimize() ] and close the index [ close() ].
74      *
75      * @throws Exception
76      */
77     private EclipseRepositoryIndex createTestIndex()
78         throws Exception
79     {
80         EclipseRepositoryIndex indexer = new EclipseRepositoryIndex( indexPath, repository, new DefaultDigester() );
81
82         Artifact artifact = getArtifact( "org.apache.maven", "maven-artifact", "2.0.1" );
83         artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) );
84         artifactFileTime = artifact.getFile().lastModified();
85         indexer.indexArtifact( artifact );
86         indexer.optimize();
87         indexer.close();
88
89         long historicTime = artifactFileTime - TIME_DIFFERENCE;
90
91         artifact = getArtifact( "org.apache.maven", "maven-model", "2.0" );
92         artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) );
93         artifact.getFile().setLastModified( historicTime );
94         indexer.indexArtifact( artifact );
95         indexer.optimize();
96         indexer.close();
97
98         artifact = getArtifact( "test", "test-artifactId", "1.0" );
99         artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) );
100         artifact.getFile().setLastModified( historicTime );
101         indexer.indexArtifact( artifact );
102         indexer.optimize();
103         indexer.close();
104
105         artifact = getArtifact( "test", "test-artifactId", "1.0" );
106         artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) );
107         artifact.getFile().setLastModified( historicTime );
108         indexer.indexArtifact( artifact );
109         indexer.optimize();
110         indexer.close();
111
112         return indexer;
113     }
114
115     /**
116      * Method for testing the exceptions thrown by ArtifactRepositoryIndex
117      *
118      * @throws Exception
119      */
120     public void testIndexerExceptions()
121         throws Exception
122     {
123         Artifact artifact = getArtifact( "test", "test-artifactId", "1.0" );
124         artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) );
125
126         try
127         {
128             String notIndexDir = new File( "pom.xml" ).getAbsolutePath();
129             EclipseRepositoryIndex indexer = new EclipseRepositoryIndex( notIndexDir, repository, digester );
130             indexer.indexArtifact( artifact );
131             fail( "Must throw exception on non-directory index directory" );
132         }
133         catch ( RepositoryIndexException e )
134         {
135             assertTrue( true );
136         }
137
138         try
139         {
140             String notIndexDir = new File( "" ).getAbsolutePath();
141             EclipseRepositoryIndex indexer = new EclipseRepositoryIndex( notIndexDir, repository, digester );
142             indexer.indexArtifact( artifact );
143             fail( "Must throw an exception on a non-index directory" );
144         }
145         catch ( RepositoryIndexException e )
146         {
147             assertTrue( true );
148         }
149
150         EclipseRepositoryIndex indexer = new EclipseRepositoryIndex( indexPath, repository, digester );
151         try
152         {
153             indexer.deleteIfIndexed( new Object() );
154             fail( "Must throw exception on object not of type artifact." );
155         }
156         catch ( RepositoryIndexException e )
157         {
158             assertTrue( true );
159         }
160     }
161
162     /**
163      * Test the ArtifactRepositoryIndex using a single-phrase search.
164      *
165      * @throws Exception
166      */
167     public void testSearch()
168         throws Exception
169     {
170         EclipseRepositoryIndex index = createTestIndex();
171
172         IndexSearcher searcher = new IndexSearcher( index.getIndexPath() );
173         try
174         {
175             QueryParser parser = new QueryParser( "j", index.getAnalyzer() );
176             Hits hits = searcher.search( parser.parse( "maven-artifact-2.0.1.jar" ) );
177
178             assertEquals( "Total hits", 1, hits.length() );
179             Document doc = hits.doc( 0 );
180             assertEquals( "Check jar name", "maven-artifact-2.0.1.jar", doc.get( "j" ) );
181
182             parser = new QueryParser( "s", index.getAnalyzer() );
183             hits = searcher.search( parser.parse( "78377" ) );
184
185             assertEquals( "Total hits", 1, hits.length() );
186             doc = hits.doc( 0 );
187             assertEquals( "Check jar name", "maven-artifact-2.0.1.jar", doc.get( "j" ) );
188
189             parser = new QueryParser( "d", index.getAnalyzer() );
190             hits = searcher.search( parser.parse( DateField.timeToString( artifactFileTime ) ) );
191
192             assertEquals( "Total hits", 1, hits.length() );
193             doc = hits.doc( 0 );
194             assertEquals( "Check jar name", "maven-artifact-2.0.1.jar", doc.get( "j" ) );
195
196             parser = new QueryParser( "m", index.getAnalyzer() );
197             hits = searcher.search( parser.parse( "AE55D9B5720E11B6CF19FE1E31A42E51" ) );
198
199             assertEquals( "Total hits", 1, hits.length() );
200             doc = hits.doc( 0 );
201             assertEquals( "Check jar name", "maven-artifact-2.0.1.jar", doc.get( "j" ) );
202
203             parser = new QueryParser( "c", index.getAnalyzer() );
204             hits = searcher.search( parser.parse( "MavenXpp3Reader" ) );
205
206             assertEquals( "Total hits", 1, hits.length() );
207             doc = hits.doc( 0 );
208             assertEquals( "Check jar name", "maven-model-2.0.jar", doc.get( "j" ) );
209
210             parser = new QueryParser( "j", index.getAnalyzer() );
211             hits = searcher.search( parser.parse( "maven" ) );
212
213             assertEquals( "Total hits", 2, hits.length() );
214         }
215         finally
216         {
217             searcher.close();
218         }
219     }
220
221     /**
222      * Method for creating artifact object
223      *
224      * @param groupId    the groupId of the artifact to be created
225      * @param artifactId the artifactId of the artifact to be created
226      * @param version    the version of the artifact to be created
227      * @return Artifact object
228      * @throws Exception
229      */
230     private Artifact getArtifact( String groupId, String artifactId, String version )
231         throws Exception
232     {
233         if ( artifactFactory == null )
234         {
235             artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
236         }
237
238         return artifactFactory.createBuildArtifact( groupId, artifactId, version, "jar" );
239     }
240
241     protected void tearDown()
242         throws Exception
243     {
244         repository = null;
245
246         super.tearDown();
247     }
248 }