]> source.dussan.org Git - archiva.git/blob
bfc4a54bf6037dd445675db72fe0896920730188
[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 ArtifactFactory artifactFactory;\r
56 \r
57     /**\r
58      * Set up.\r
59      *\r
60      * @throws Exception\r
61      */\r
62     public void setUp()\r
63         throws Exception\r
64     {\r
65         super.setUp();\r
66         File repositoryDirectory = getTestFile( "src/test/repository" );\r
67         String repoDir = repositoryDirectory.toURL().toString();\r
68         ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );\r
69         ArtifactRepositoryFactory repoFactory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );\r
70         repository = repoFactory.createArtifactRepository( "test", repoDir, layout, null, null );\r
71 \r
72         indexPath = "target/index";\r
73         FileUtils.deleteDirectory( indexPath );\r
74     }\r
75 \r
76     /**\r
77      * Tear down.\r
78      *\r
79      * @throws Exception\r
80      */\r
81     public void tearDown()\r
82         throws Exception\r
83     {\r
84         repository = null;\r
85         super.tearDown();\r
86     }\r
87 \r
88     /**\r
89      * Create the test index.\r
90      * Indexing process: check if the object was already indexed [ checkIfIndexed(Object) ], open the index [ open() ],\r
91      * index the object [ index(Object) ], optimize the index [ optimize() ] and close the index [ close() ].\r
92      *\r
93      * @throws Exception\r
94      */\r
95     private void createTestIndex()\r
96         throws Exception\r
97     {\r
98         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
99         MetadataRepositoryIndex indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
100 \r
101         RepositoryMetadata repoMetadata =\r
102             getMetadata( "org.apache.maven", null, null, "maven-metadata.xml", MetadataRepositoryIndex.GROUP_METADATA );\r
103         indexer.index( repoMetadata );\r
104         indexer.optimize();\r
105         indexer.close();\r
106 \r
107         repoMetadata = getMetadata( "org.apache.maven", "maven-artifact", "2.0.1", "maven-metadata.xml",\r
108                                     MetadataRepositoryIndex.ARTIFACT_METADATA );\r
109         indexer.index( repoMetadata );\r
110         indexer.optimize();\r
111         indexer.close();\r
112 \r
113         repoMetadata = getMetadata( "org.apache.maven", "maven-artifact", "2.0.1", "maven-metadata.xml",\r
114                                     MetadataRepositoryIndex.SNAPSHOT_METADATA );\r
115         indexer.index( repoMetadata );\r
116         indexer.optimize();\r
117         indexer.close();\r
118 \r
119         repoMetadata = getMetadata( "test", null, null, "maven-metadata.xml", MetadataRepositoryIndex.GROUP_METADATA );\r
120         indexer.index( repoMetadata );\r
121         indexer.optimize();\r
122         indexer.close();\r
123     }\r
124 \r
125     /**\r
126      * Test the ArtifactRepositoryIndex using a single-phrase search.\r
127      *\r
128      * @throws Exception\r
129      */\r
130     public void testSearch()\r
131         throws Exception\r
132     {\r
133         createTestIndex();\r
134 \r
135         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
136         MetadataRepositoryIndex indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
137         //RepositoryIndexSearcher repoSearchLayer = factory.createDefaultRepositoryIndexSearcher( indexer );\r
138         RepositoryIndexSearchLayer repoSearchLayer = factory.createRepositoryIndexSearchLayer( indexer );\r
139 \r
140         // search last update\r
141         Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" );\r
142         List metadataList = repoSearchLayer.searchAdvanced( qry );\r
143         //assertEquals( 1, metadataList.size() );\r
144         for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
145         {\r
146             RepositoryIndexSearchHit hit = (RepositoryIndexSearchHit) iter.next();\r
147             if ( hit.isMetadata() )\r
148             {\r
149                 RepositoryMetadata repoMetadata = (RepositoryMetadata) hit.getObject();\r
150                 Metadata metadata = repoMetadata.getMetadata();\r
151                 Versioning versioning = metadata.getVersioning();\r
152                 assertEquals( "20051212044643", versioning.getLastUpdated() );\r
153             }\r
154         }\r
155 \r
156         // search plugin prefix\r
157         qry = new SinglePhraseQuery( RepositoryIndex.FLD_PLUGINPREFIX, "org.apache.maven" );\r
158         metadataList = repoSearchLayer.searchAdvanced( qry );\r
159         //assertEquals( 1, metadataList.size() );\r
160         for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
161         {\r
162             RepositoryIndexSearchHit hit = (RepositoryIndexSearchHit) iter.next();\r
163             if ( hit.isMetadata() )\r
164             {\r
165                 RepositoryMetadata repoMetadata = (RepositoryMetadata) hit.getObject();\r
166                 Metadata metadata = repoMetadata.getMetadata();\r
167                 List plugins = metadata.getPlugins();\r
168                 for ( Iterator it = plugins.iterator(); it.hasNext(); )\r
169                 {\r
170                     Plugin plugin = (Plugin) it.next();\r
171                     assertEquals( "org.apache.maven", plugin.getPrefix() );\r
172                 }\r
173             }\r
174         }\r
175 \r
176         // search last update using INCLUSIVE Range Query\r
177         Query qry1 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" );\r
178         Query qry2 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212235959" );\r
179         RangeQuery rQry = new RangeQuery( true );\r
180         rQry.addQuery( qry1 );\r
181         rQry.addQuery( qry2 );\r
182 \r
183         metadataList = repoSearchLayer.searchAdvanced( rQry );\r
184         for ( Iterator iter = metadataList.iterator(); iter.hasNext(); )\r
185         {\r
186             RepositoryIndexSearchHit hit = (RepositoryIndexSearchHit) iter.next();\r
187             if ( hit.isMetadata() )\r
188             {\r
189                 RepositoryMetadata repoMetadata = (RepositoryMetadata) hit.getObject();\r
190                 Metadata metadata = repoMetadata.getMetadata();\r
191                 Versioning versioning = metadata.getVersioning();\r
192                 assertEquals( "20051212044643", versioning.getLastUpdated() );\r
193             }\r
194         }\r
195 \r
196         // search last update using EXCLUSIVE Range Query\r
197         qry1 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212000000" );\r
198         qry2 = new SinglePhraseQuery( RepositoryIndex.FLD_LASTUPDATE, "20051212044643" );\r
199         rQry = new RangeQuery( false );\r
200         rQry.addQuery( qry1 );\r
201         rQry.addQuery( qry2 );\r
202 \r
203         metadataList = repoSearchLayer.searchAdvanced( rQry );\r
204         assertEquals( 0, metadataList.size() );\r
205 \r
206         indexer.close();\r
207     }\r
208 \r
209     /**\r
210      * Test the exceptions thrown by MetadataRepositoryIndex.\r
211      *\r
212      * @throws Exception\r
213      */\r
214     public void testExceptions()\r
215         throws Exception\r
216     {\r
217         //test when the object passed in the index(..) method is not a RepositoryMetadata instance\r
218         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
219         MetadataRepositoryIndex indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
220         try\r
221         {\r
222             Artifact artifact = getArtifact( "org.apache.maven", "maven-artifact", "2.0.1" );\r
223             indexer.index( artifact );\r
224             fail( "Must throw exception when the passed object is not a RepositoryMetadata object." );\r
225             indexer.optimize();\r
226             indexer.close();\r
227         }\r
228         catch ( RepositoryIndexException e )\r
229         {\r
230             assertTrue( true );\r
231         }\r
232 \r
233         try\r
234         {\r
235             indexer.deleteIfIndexed( new Object() );\r
236             fail( "Must throw exception when the passed object is not of type metadata." );\r
237         }\r
238         catch ( RepositoryIndexException e )\r
239         {\r
240             assertTrue( true );\r
241         }\r
242     }\r
243 \r
244     /**\r
245      * Test delete of document from metadata index.\r
246      *\r
247      * @throws Exception\r
248      */\r
249     public void testDeleteMetadataDocument()\r
250         throws Exception\r
251     {\r
252         createTestIndex();\r
253 \r
254         RepositoryIndexingFactory factory = (RepositoryIndexingFactory) lookup( RepositoryIndexingFactory.ROLE );\r
255         MetadataRepositoryIndex indexer = factory.createMetadataRepositoryIndex( indexPath, repository );\r
256 \r
257         RepositoryMetadata repoMetadata =\r
258             getMetadata( "org.apache.maven", null, null, "maven-metadata.xml", MetadataRepositoryIndex.GROUP_METADATA );\r
259         indexer.deleteDocument( RepositoryIndex.FLD_ID, (String) repoMetadata.getKey() );\r
260 \r
261         RepositoryIndexSearcher repoSearcher = factory.createDefaultRepositoryIndexSearcher( indexer );\r
262         Query qry = new SinglePhraseQuery( RepositoryIndex.FLD_ID, (String) repoMetadata.getKey() );\r
263         List metadataList = repoSearcher.search( qry );\r
264         assertEquals( 0, metadataList.size() );\r
265     }\r
266 \r
267     /**\r
268      * Create RepositoryMetadata object.\r
269      *\r
270      * @param groupId      the groupId to be set\r
271      * @param artifactId   the artifactId to be set\r
272      * @param version      the version to be set\r
273      * @param filename     the name of the metadata file\r
274      * @param metadataType the type of RepositoryMetadata object to be created (GROUP, ARTIFACT or SNAPSHOT)\r
275      * @return RepositoryMetadata\r
276      * @throws Exception\r
277      */\r
278     private RepositoryMetadata getMetadata( String groupId, String artifactId, String version, String filename,\r
279                                             String metadataType )\r
280         throws Exception\r
281     {\r
282         RepositoryMetadata repoMetadata = null;\r
283         URL url;\r
284         InputStream is;\r
285         MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();\r
286 \r
287         //group metadata\r
288         if ( metadataType.equals( MetadataRepositoryIndex.GROUP_METADATA ) )\r
289         {\r
290             url = new File( repository.getBasedir() + groupId.replace( '.', '/' ) + "/" + filename ).toURL();\r
291             is = url.openStream();\r
292             repoMetadata = new GroupRepositoryMetadata( groupId );\r
293             repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
294         }\r
295         //artifact metadata\r
296         else if ( metadataType.equals( MetadataRepositoryIndex.ARTIFACT_METADATA ) )\r
297         {\r
298             url = new File(\r
299                 repository.getBasedir() + groupId.replace( '.', '/' ) + "/" + artifactId + "/" + filename ).toURL();\r
300             is = url.openStream();\r
301             repoMetadata = new ArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
302             repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
303         }\r
304         //snapshot/version metadata\r
305         else if ( metadataType.equals( MetadataRepositoryIndex.SNAPSHOT_METADATA ) )\r
306         {\r
307             url = new File( repository.getBasedir() + groupId.replace( '.', '/' ) + "/" + artifactId + "/" + version +\r
308                 "/" + filename ).toURL();\r
309             is = url.openStream();\r
310             repoMetadata = new SnapshotArtifactRepositoryMetadata( getArtifact( groupId, artifactId, version ) );\r
311             repoMetadata.setMetadata( metadataReader.read( new InputStreamReader( is ) ) );\r
312         }\r
313 \r
314         return repoMetadata;\r
315     }\r
316 \r
317 \r
318     /**\r
319      * Create artifact object.\r
320      *\r
321      * @param groupId    the groupId of the artifact\r
322      * @param artifactId the artifactId of the artifact\r
323      * @param version    the version of the artifact\r
324      * @return Artifact\r
325      * @throws Exception\r
326      */\r
327     private Artifact getArtifact( String groupId, String artifactId, String version )\r
328         throws Exception\r
329     {\r
330         if ( artifactFactory == null )\r
331         {\r
332             artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );\r
333         }\r
334         return artifactFactory.createBuildArtifact( groupId, artifactId, version, "jar" );\r
335     }\r
336 }\r