]> source.dussan.org Git - archiva.git/blob
fb628fde01b1033cbe2d7ff2f246535b4e488efc
[archiva.git] /
1 package org.apache.maven.repository.indexing;\r
2 \r
3 /*\r
4  * Copyright 2005-2006 The Apache Software Foundation.\r
5  *\r
6  * Licensed under the Apache License, Version 2.0 (the "License");\r
7  * you may not use this file except in compliance with the License.\r
8  * You may obtain a copy of the License at\r
9  *\r
10  *      http://www.apache.org/licenses/LICENSE-2.0\r
11  *\r
12  * Unless required by applicable law or agreed to in writing, software\r
13  * distributed under the License is distributed on an "AS IS" BASIS,\r
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
15  * See the License for the specific language governing permissions and\r
16  * limitations under the License.\r
17  */\r
18 \r
19 import org.apache.maven.artifact.Artifact;\r
20 import org.apache.maven.artifact.factory.ArtifactFactory;\r
21 import org.apache.maven.artifact.repository.ArtifactRepository;\r
22 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;\r
23 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;\r
24 import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;\r
25 import org.apache.maven.artifact.repository.metadata.GroupRepositoryMetadata;\r
26 import org.apache.maven.artifact.repository.metadata.Metadata;\r
27 import org.apache.maven.artifact.repository.metadata.Plugin;\r
28 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;\r
29 import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;\r
30 import org.apache.maven.artifact.repository.metadata.Versioning;\r
31 import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;\r
32 import org.apache.maven.repository.indexing.query.Query;\r
33 import org.apache.maven.repository.indexing.query.RangeQuery;\r
34 import org.apache.maven.repository.indexing.query.SinglePhraseQuery;\r
35 import org.codehaus.plexus.PlexusTestCase;\r
36 import org.codehaus.plexus.util.FileUtils;\r
37 \r
38 import java.io.File;\r
39 import java.io.InputStream;\r
40 import java.io.InputStreamReader;\r
41 import java.net.URL;\r
42 import java.util.Iterator;\r
43 import java.util.List;\r
44 \r
45 /**\r
46  * This class tests the MetadataRepositoryIndex.\r
47  */\r
48 public class MetadataRepositoryIndexingTest\r
49     extends PlexusTestCase\r
50 {\r
51     private ArtifactRepository repository;\r
52 \r
53     private String indexPath;\r
54 \r
55     private MetadataRepositoryIndex indexer;\r
56 \r
57     private ArtifactFactory artifactFactory;\r
58 \r
59     /**\r
60      * Set up.\r
61      *\r
62      * @throws Exception\r
63      */\r
64     public void setUp()\r
65         throws Exception\r
66     {\r
67         super.setUp();\r
68         File repositoryDirectory = getTestFile( "src/test/repository" );\r
69         String repoDir = repositoryDirectory.toURL().toString();\r
70         ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );\r
71         ArtifactRepositoryFactory repoFactory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );\r
72         repository = repoFactory.createArtifactRepository( "test", repoDir, layout, null, null );\r
73 \r
74         indexPath = "target/index";\r
75         FileUtils.deleteDirectory( indexPath );\r
76     }\r
77 \r
78     /**\r
79      * Tear down.\r
80      *\r
81      * @throws Exception\r
82      */\r
83     public void tearDown()\r
84         throws Exception\r
85     {\r
86         repository = null;\r
87         super.tearDown();\r
88     }\r
89 \r
90     /**\r
91      * Create the test index.\r
92      * Indexing process: check if the object was already indexed [ checkIfIndexed(Object) ], open the index [ open() ],\r
93      * index the object [ index(Object) ], optimize the index [ optimize() ] and close the index [ close() ].\r
94      *\r
95      * @throws Exception\r
96      */\r
97     private void createTestIndex()\r
98         throws Exception\r
99     {\r
100         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
101         indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
102 \r
103         RepositoryMetadata repoMetadata =\r
104             getMetadata( "org.apache.maven", null, null, "maven-metadata.xml", MetadataRepositoryIndex.GROUP_METADATA );\r
105         indexer.index( repoMetadata );\r
106         indexer.optimize();\r
107         indexer.close();\r
108 \r
109         repoMetadata = getMetadata( "org.apache.maven", "maven-artifact", "2.0.1", "maven-metadata.xml",\r
110                                     MetadataRepositoryIndex.ARTIFACT_METADATA );\r
111         indexer.index( repoMetadata );\r
112         indexer.optimize();\r
113         indexer.close();\r
114 \r
115         repoMetadata = getMetadata( "org.apache.maven", "maven-artifact", "2.0.1", "maven-metadata.xml",\r
116                                     MetadataRepositoryIndex.SNAPSHOT_METADATA );\r
117         indexer.index( repoMetadata );\r
118         indexer.optimize();\r
119         indexer.close();\r
120 \r
121         repoMetadata = getMetadata( "test", null, null, "maven-metadata.xml", MetadataRepositoryIndex.GROUP_METADATA );\r
122         indexer.index( repoMetadata );\r
123         indexer.optimize();\r
124         indexer.close();\r
125     }\r
126 \r
127     /**\r
128      * Test the ArtifactRepositoryIndex using a single-phrase search.\r
129      *\r
130      * @throws Exception\r
131      */\r
132     public void testSearch()\r
133         throws Exception\r
134     {\r
135         createTestIndex();\r
136 \r
137         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
138         MetadataRepositoryIndex indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
139         //RepositoryIndexSearcher repoSearchLayer = factory.createDefaultRepositoryIndexSearcher( indexer );\r
140         RepositoryIndexSearchLayer repoSearchLayer = factory.createRepositoryIndexSearchLayer( indexer );\r
141 \r
142         // search last update\r
143         org.apache.maven.repository.indexing.query.Query qry =\r
144             new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" );\r
145         List metadataList = repoSearchLayer.searchAdvanced( qry );\r
146         //assertEquals( 1, metadataList.size() );\r
147         for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
148         {\r
149             RepositoryIndexSearchHit hit = (RepositoryIndexSearchHit) iter.next();\r
150             if ( hit.isMetadata() )\r
151             {\r
152                 RepositoryMetadata repoMetadata = (RepositoryMetadata) hit.getObject();\r
153                 Metadata metadata = repoMetadata.getMetadata();\r
154                 Versioning versioning = metadata.getVersioning();\r
155                 assertEquals( "20051212044643", versioning.getLastUpdated() );\r
156             }\r
157         }\r
158 \r
159         // search plugin prefix\r
160         qry = new SinglePhraseQuery( RepositoryIndex.FLD_PLUGINPREFIX, "org.apache.maven" );\r
161         metadataList = repoSearchLayer.searchAdvanced( qry );\r
162         //assertEquals( 1, metadataList.size() );\r
163         for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
164         {\r
165             RepositoryIndexSearchHit hit = (RepositoryIndexSearchHit) iter.next();\r
166             if ( hit.isMetadata() )\r
167             {\r
168                 RepositoryMetadata repoMetadata = (RepositoryMetadata) hit.getObject();\r
169                 Metadata metadata = repoMetadata.getMetadata();\r
170                 List plugins = metadata.getPlugins();\r
171                 for ( Iterator it = plugins.iterator(); it.hasNext(); )\r
172                 {\r
173                     Plugin plugin = (Plugin) it.next();\r
174                     assertEquals( "org.apache.maven", plugin.getPrefix() );\r
175                 }\r
176             }\r
177         }\r
178 \r
179         // search last update using INCLUSIVE Range Query\r
180         Query qry1 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" );\r
181         Query qry2 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212235959" );\r
182         RangeQuery rQry = new RangeQuery( true );\r
183         rQry.addQuery( qry1 );\r
184         rQry.addQuery( qry2 );\r
185 \r
186         metadataList = repoSearchLayer.searchAdvanced( rQry );\r
187         for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
188         {\r
189             RepositoryIndexSearchHit hit = (RepositoryIndexSearchHit) iter.next();\r
190             if ( hit.isMetadata() )\r
191             {\r
192                 RepositoryMetadata repoMetadata = (RepositoryMetadata) hit.getObject();\r
193                 Metadata metadata = repoMetadata.getMetadata();\r
194                 Versioning versioning = metadata.getVersioning();\r
195                 assertEquals( "20051212044643", versioning.getLastUpdated() );\r
196             }\r
197         }\r
198 \r
199         // search last update using EXCLUSIVE Range Query\r
200         qry1 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" );\r
201         qry2 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" );\r
202         rQry = new RangeQuery( false );\r
203         rQry.addQuery( qry1 );\r
204         rQry.addQuery( qry2 );\r
205 \r
206         metadataList = repoSearchLayer.searchAdvanced( rQry );\r
207         assertEquals( metadataList.size(), 0 );\r
208 \r
209         indexer.close();\r
210     }\r
211 \r
212     /**\r
213      * Test the exceptions thrown by MetadataRepositoryIndex.\r
214      *\r
215      * @throws Exception\r
216      */\r
217     public void testExceptions()\r
218         throws Exception\r
219     {\r
220         //test when the object passed in the index(..) method is not a RepositoryMetadata instance\r
221         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
222         indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
223         try\r
224         {\r
225             Artifact artifact = getArtifact( "org.apache.maven", "maven-artifact", "2.0.1" );\r
226             indexer.index( artifact );\r
227             fail( "Must throw exception when the passed object is not a RepositoryMetadata object." );\r
228             indexer.optimize();\r
229             indexer.close();\r
230         }\r
231         catch ( RepositoryIndexException e )\r
232         {\r
233             assertTrue( true );\r
234         }\r
235 \r
236         try\r
237         {\r
238             indexer.isIndexed( new Object() );\r
239             fail( "Must throw exception when the passed object is not of type metadata." );\r
240         }\r
241         catch ( RepositoryIndexException e )\r
242         {\r
243             assertTrue( true );\r
244         }\r
245     }\r
246 \r
247     /**\r
248      * Test delete of document from metadata index.\r
249      *\r
250      * @throws Exception\r
251      */\r
252     public void testDeleteMetadataDocument()\r
253         throws Exception\r
254     {\r
255         createTestIndex();\r
256 \r
257         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
258         indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
259 \r
260         RepositoryMetadata repoMetadata =\r
261             getMetadata( "org.apache.maven", null, null, "maven-metadata.xml", MetadataRepositoryIndex.GROUP_METADATA );\r
262         indexer.deleteDocument( RepositoryIndex.FLD_ID, (String) repoMetadata.getKey() );\r
263 \r
264         RepositoryIndexSearcher repoSearcher = factory.createDefaultRepositoryIndexSearcher( indexer );\r
265         org.apache.maven.repository.indexing.query.Query qry =\r
266             new SinglePhraseQuery( RepositoryIndex.FLD_ID, (String) repoMetadata.getKey() );\r
267         List metadataList = repoSearcher.search( qry );\r
268         assertEquals( metadataList.size(), 0 );\r
269     }\r
270 \r
271     /**\r
272      * Create RepositoryMetadata object.\r
273      *\r
274      * @param groupId      the groupId to be set\r
275      * @param artifactId   the artifactId to be set\r
276      * @param version      the version to be set\r
277      * @param filename     the name of the metadata file\r
278      * @param metadataType the type of RepositoryMetadata object to be created (GROUP, ARTIFACT or SNAPSHOT)\r
279      * @return RepositoryMetadata\r
280      * @throws Exception\r
281      */\r
282     private RepositoryMetadata getMetadata( String groupId, String artifactId, String version, String filename,\r
283                                             String metadataType )\r
284         throws Exception\r
285     {\r
286         RepositoryMetadata repoMetadata = null;\r
287         URL url;\r
288         InputStream is = null;\r
289         MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();\r
290 \r
291         //group metadata\r
292         if ( metadataType.equals( MetadataRepositoryIndex.GROUP_METADATA ) )\r
293         {\r
294             url = new File( repository.getBasedir() + groupId.replace( '.', '/' ) + "/" + filename ).toURL();\r
295             is = url.openStream();\r
296             repoMetadata = new GroupRepositoryMetadata( groupId );\r
297             repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
298         }\r
299         //artifact metadata\r
300         else if ( metadataType.equals( MetadataRepositoryIndex.ARTIFACT_METADATA ) )\r
301         {\r
302             url = new File(\r
303                 repository.getBasedir() + groupId.replace( '.', '/' ) + "/" + artifactId + "/" + filename ).toURL();\r
304             is = url.openStream();\r
305             repoMetadata = new ArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
306             repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
307         }\r
308         //snapshot/version metadata\r
309         else if ( metadataType.equals( MetadataRepositoryIndex.SNAPSHOT_METADATA ) )\r
310         {\r
311             url = new File( repository.getBasedir() + groupId.replace( '.', '/' ) + "/" + artifactId + "/" + version +\r
312                 "/" + filename ).toURL();\r
313             is = url.openStream();\r
314             repoMetadata = new SnapshotArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
315             repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
316         }\r
317 \r
318         return repoMetadata;\r
319     }\r
320 \r
321 \r
322     /**\r
323      * Create artifact object.\r
324      *\r
325      * @param groupId    the groupId of the artifact\r
326      * @param artifactId the artifactId of the artifact\r
327      * @param version    the version of the artifact\r
328      * @return Artifact\r
329      * @throws Exception\r
330      */\r
331     private Artifact getArtifact( String groupId, String artifactId, String version )\r
332         throws Exception\r
333     {\r
334         if ( artifactFactory == null )\r
335         {\r
336             artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );\r
337         }\r
338         return artifactFactory.createBuildArtifact( groupId, artifactId, version, "jar" );\r
339     }\r
340 }\r