KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > maven > artifact > resolver > DefaultArtifactCollectorTest


1 package org.apache.maven.artifact.resolver;
2
3 /*
4  * Copyright 2001-2005 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.maven.artifact.Artifact;
20 import org.apache.maven.artifact.factory.ArtifactFactory;
21 import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
22 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
23 import org.apache.maven.artifact.metadata.ResolutionGroup;
24 import org.apache.maven.artifact.repository.ArtifactRepository;
25 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
26 import org.apache.maven.artifact.resolver.filter.ExclusionSetFilter;
27 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
28 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
29 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
30 import org.apache.maven.artifact.versioning.VersionRange;
31 import org.codehaus.plexus.PlexusTestCase;
32
33 import java.util.ArrayList JavaDoc;
34 import java.util.Arrays JavaDoc;
35 import java.util.Collections JavaDoc;
36 import java.util.HashMap JavaDoc;
37 import java.util.HashSet JavaDoc;
38 import java.util.Iterator JavaDoc;
39 import java.util.LinkedHashSet JavaDoc;
40 import java.util.List JavaDoc;
41 import java.util.Map JavaDoc;
42 import java.util.Set JavaDoc;
43
44 /**
45  * Test the default artifact collector.
46  *
47  * @author <a HREF="mailto:brett@apache.org">Brett Porter</a>
48  * @version $Id: DefaultArtifactCollectorTest.java 379647 2006-02-22 01:19:13Z brett $
49  */

50 public class DefaultArtifactCollectorTest
51     extends PlexusTestCase
52 {
53     private ArtifactCollector artifactCollector;
54
55     private ArtifactFactory artifactFactory;
56
57     private ArtifactSpec projectArtifact;
58
59     private Source source;
60
61     private static final String JavaDoc GROUP_ID = "test";
62
63     protected void setUp()
64         throws Exception JavaDoc
65     {
66         super.setUp();
67
68         this.source = new Source();
69         this.artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
70         this.artifactCollector = new DefaultArtifactCollector();
71
72         this.projectArtifact = createArtifact( "project", "1.0", null );
73     }
74
75     // works, but we don't fail on cycles presently
76
public void disabledtestCircularDependencyNotIncludingCurrentProject()
77         throws ArtifactResolutionException, InvalidVersionSpecificationException
78     {
79         ArtifactSpec a = createArtifact( "a", "1.0" );
80         ArtifactSpec b = a.addDependency( "b", "1.0" );
81         b.addDependency( "a", "1.0" );
82         try
83         {
84             collect( a );
85             fail( "Should have failed on cyclic dependency not involving project" );
86         }
87         catch ( CyclicDependencyException expected )
88         {
89             assertTrue( true );
90         }
91     }
92
93     // works, but we don't fail on cycles presently
94
public void disabledtestCircularDependencyIncludingCurrentProject()
95         throws ArtifactResolutionException, InvalidVersionSpecificationException
96     {
97         ArtifactSpec a = createArtifact( "a", "1.0" );
98         ArtifactSpec b = a.addDependency( "b", "1.0" );
99         b.addDependency( "project", "1.0" );
100         try
101         {
102             collect( a );
103             fail( "Should have failed on cyclic dependency involving project" );
104         }
105         catch ( CyclicDependencyException expected )
106         {
107             assertTrue( true );
108         }
109     }
110
111     public void testResolveWithFilter()
112         throws ArtifactResolutionException, InvalidVersionSpecificationException
113     {
114         ArtifactSpec a = createArtifact( "a", "1.0" );
115         ArtifactSpec b = a.addDependency( "b", "1.0" );
116         ArtifactSpec c = a.addDependency( "c", "3.0" );
117
118         b.addDependency( "c", "2.0" );
119         ArtifactSpec d = b.addDependency( "d", "4.0" );
120
121         ArtifactResolutionResult res = collect( a );
122         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact, c.artifact, d.artifact} ),
123                       res.getArtifacts() );
124
125         ArtifactFilter filter = new ExclusionSetFilter( new String JavaDoc[]{"b"} );
126         res = collect( a, filter );
127         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, c.artifact} ), res.getArtifacts() );
128     }
129
130     public void testResolveCorrectDependenciesWhenDifferentDependenciesOnNearest()
131         throws ArtifactResolutionException, InvalidVersionSpecificationException
132     {
133         ArtifactSpec a = createArtifact( "a", "1.0" );
134         ArtifactSpec b = a.addDependency( "b", "1.0" );
135         ArtifactSpec c2 = b.addDependency( "c", "2.0" );
136         c2.addDependency( "d", "1.0" );
137
138         ArtifactSpec e = createArtifact( "e", "1.0" );
139         ArtifactSpec c1 = e.addDependency( "c", "1.0" );
140         ArtifactSpec f = c1.addDependency( "f", "1.0" );
141
142         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, e.artifact} ) );
143         assertEquals( "Check artifact list",
144                       createSet( new Object JavaDoc[]{a.artifact, b.artifact, e.artifact, c1.artifact, f.artifact} ),
145                       res.getArtifacts() );
146         assertEquals( "Check version", "1.0", getArtifact( "c", res.getArtifacts() ).getVersion() );
147     }
148
149     public void disabledtestResolveCorrectDependenciesWhenDifferentDependenciesOnNewest()
150         throws ArtifactResolutionException, InvalidVersionSpecificationException
151     {
152         // TODO: use newest conflict resolver
153
ArtifactSpec a = createArtifact( "a", "1.0" );
154         ArtifactSpec b = a.addDependency( "b", "1.0" );
155         ArtifactSpec c2 = b.addDependency( "c", "2.0" );
156         ArtifactSpec d = c2.addDependency( "d", "1.0" );
157
158         ArtifactSpec e = createArtifact( "e", "1.0" );
159         ArtifactSpec c1 = e.addDependency( "c", "1.0" );
160         c1.addDependency( "f", "1.0" );
161
162         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, e.artifact} ) );
163         assertEquals( "Check artifact list",
164                       createSet( new Object JavaDoc[]{a.artifact, b.artifact, e.artifact, c2.artifact, d.artifact} ),
165                       res.getArtifacts() );
166         assertEquals( "Check version", "2.0", getArtifact( "c", res.getArtifacts() ).getVersion() );
167     }
168
169     public void disabledtestResolveCorrectDependenciesWhenDifferentDependenciesOnNewestVersionReplaced()
170         throws ArtifactResolutionException, InvalidVersionSpecificationException
171     {
172         // TODO: use newest conflict resolver
173
ArtifactSpec a = createArtifact( "a", "1.0" );
174         ArtifactSpec b1 = a.addDependency( "b", "1.0" );
175         ArtifactSpec c = a.addDependency( "c", "1.0" );
176         ArtifactSpec d2 = b1.addDependency( "d", "2.0" );
177         d2.addDependency( "h", "1.0" );
178         ArtifactSpec d1 = c.addDependency( "d", "1.0" );
179         ArtifactSpec b2 = c.addDependency( "b", "2.0" );
180         ArtifactSpec e = b2.addDependency( "e", "1.0" );
181         ArtifactSpec g = d1.addDependency( "g", "1.0" );
182
183         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact} ) );
184         Object JavaDoc[] artifacts = new Object JavaDoc[]{a.artifact, c.artifact, d1.artifact, b2.artifact, e.artifact, g.artifact};
185         assertEquals( "Check artifact list", createSet( artifacts ), res.getArtifacts() );
186         assertEquals( "Check version", "1.0", getArtifact( "d", res.getArtifacts() ).getVersion() );
187         assertEquals( "Check version", "2.0", getArtifact( "b", res.getArtifacts() ).getVersion() );
188     }
189
190     public void testResolveNearestNewestIsNearest()
191         throws ArtifactResolutionException, InvalidVersionSpecificationException
192     {
193         ArtifactSpec a = createArtifact( "a", "1.0" );
194         ArtifactSpec b = a.addDependency( "b", "1.0" );
195         ArtifactSpec c = a.addDependency( "c", "3.0" );
196
197         b.addDependency( "c", "2.0" );
198
199         ArtifactResolutionResult res = collect( a );
200         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact, c.artifact} ),
201                       res.getArtifacts() );
202         assertEquals( "Check version", "3.0", getArtifact( "c", res.getArtifacts() ).getVersion() );
203     }
204
205     public void testResolveNearestOldestIsNearest()
206         throws ArtifactResolutionException, InvalidVersionSpecificationException
207     {
208         ArtifactSpec a = createArtifact( "a", "1.0" );
209         ArtifactSpec b = a.addDependency( "b", "1.0" );
210         ArtifactSpec c = a.addDependency( "c", "2.0" );
211
212         b.addDependency( "c", "3.0" );
213
214         ArtifactResolutionResult res = collect( a );
215         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact, c.artifact} ),
216                       res.getArtifacts() );
217         assertEquals( "Check version", "2.0", getArtifact( "c", res.getArtifacts() ).getVersion() );
218     }
219
220     public void testResolveLocalNewestIsLocal()
221         throws ArtifactResolutionException, InvalidVersionSpecificationException
222     {
223         ArtifactSpec a = createArtifact( "a", "1.0" );
224         a.addDependency( "b", "2.0" );
225         ArtifactSpec b = createArtifact( "b", "3.0" );
226
227         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
228         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
229         assertEquals( "Check version", "3.0", getArtifact( "b", res.getArtifacts() ).getVersion() );
230     }
231
232     public void testResolveLocalOldestIsLocal()
233         throws ArtifactResolutionException, InvalidVersionSpecificationException
234     {
235         ArtifactSpec a = createArtifact( "a", "1.0" );
236         a.addDependency( "b", "3.0" );
237         ArtifactSpec b = createArtifact( "b", "2.0" );
238
239         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
240         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
241         assertEquals( "Check version", "2.0", getArtifact( "b", res.getArtifacts() ).getVersion() );
242     }
243
244     public void testResolveLocalWithNewerVersionButLesserScope()
245         throws ArtifactResolutionException, InvalidVersionSpecificationException
246     {
247         ArtifactSpec a = createArtifact( "commons-logging", "1.0" );
248         a.addDependency( "junit", "3.7" );
249         ArtifactSpec b = createArtifact( "junit", "3.8.1", Artifact.SCOPE_TEST );
250
251         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
252         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
253         assertEquals( "Check version", "3.8.1", getArtifact( "junit", res.getArtifacts() ).getVersion() );
254         assertEquals( "Check scope", Artifact.SCOPE_TEST, getArtifact( "junit", res.getArtifacts() ).getScope() );
255     }
256
257     public void testResolveLocalWithNewerVersionButLesserScopeResolvedFirst()
258         throws ArtifactResolutionException, InvalidVersionSpecificationException
259     {
260         ArtifactSpec b = createArtifact( "junit", "3.8.1", Artifact.SCOPE_TEST );
261         ArtifactSpec a = createArtifact( "commons-logging", "1.0" );
262         a.addDependency( "junit", "3.7" );
263
264         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
265         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
266         assertEquals( "Check version", "3.8.1", getArtifact( "junit", res.getArtifacts() ).getVersion() );
267         assertEquals( "Check scope", Artifact.SCOPE_TEST, getArtifact( "junit", res.getArtifacts() ).getScope() );
268     }
269
270     public void testResolveNearestWithRanges()
271         throws ArtifactResolutionException, InvalidVersionSpecificationException
272     {
273         ArtifactSpec a = createArtifact( "a", "1.0" );
274         ArtifactSpec b = a.addDependency( "b", "1.0" );
275         ArtifactSpec c = a.addDependency( "c", "2.0" );
276
277         b.addDependency( "c", "[1.0,3.0]" );
278
279         ArtifactResolutionResult res = collect( a );
280         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact, c.artifact} ),
281                       res.getArtifacts() );
282         assertEquals( "Check version", "2.0", getArtifact( "c", res.getArtifacts() ).getVersion() );
283     }
284
285     public void testCompatibleRanges()
286         throws ArtifactResolutionException, InvalidVersionSpecificationException
287     {
288         ArtifactSpec a = createArtifact( "a", "1.0" );
289         ArtifactSpec b = a.addDependency( "b", "1.0" );
290         a.addDependency( "c", "[2.0,2.5]" );
291         b.addDependency( "c", "[1.0,3.0]" );
292
293         ArtifactResolutionResult res = collect( a );
294
295         ArtifactSpec c = createArtifact( "c", "2.5" );
296         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact, c.artifact} ),
297                       res.getArtifacts() );
298         assertEquals( "Check version", "2.5", getArtifact( "c", res.getArtifacts() ).getVersion() );
299     }
300
301     public void testIncompatibleRanges()
302         throws ArtifactResolutionException, InvalidVersionSpecificationException
303     {
304         ArtifactSpec a = createArtifact( "a", "1.0" );
305         ArtifactSpec b = a.addDependency( "b", "1.0" );
306         a.addDependency( "c", "[2.4,3.0]" );
307
308         b.addDependency( "c", "[1.0,2.0]" );
309
310         try
311         {
312             ArtifactResolutionResult res = collect( a );
313             fail( "Should not succeed collecting, got: " + res.getArtifacts() );
314         }
315         catch ( ArtifactResolutionException expected )
316         {
317         }
318     }
319
320     public void testUnboundedRangeWhenVersionUnavailable()
321         throws ArtifactResolutionException, InvalidVersionSpecificationException
322     {
323         ArtifactSpec a = createArtifact( "a", "1.0" );
324         ArtifactSpec b = a.addDependency( "b", "1.0" );
325         a.addDependency( "c", "[2.0,]" );
326         b.addDependency( "c", "[1.0,]" );
327
328         try
329         {
330             ArtifactResolutionResult res = collect( a );
331             fail( "Should not succeed collecting, got: " + res.getArtifacts() );
332         }
333         catch ( ArtifactResolutionException expected )
334         {
335             assertTrue( true );
336         }
337     }
338
339     public void testUnboundedRangeBelowLastRelease()
340         throws ArtifactResolutionException, InvalidVersionSpecificationException
341     {
342         ArtifactSpec a = createArtifact( "a", "1.0" );
343         createArtifact( "c", "1.5" );
344         ArtifactSpec c = createArtifact( "c", "2.0" );
345         createArtifact( "c", "1.1" );
346         a.addDependency( "c", "[1.0,)" );
347
348         ArtifactResolutionResult res = collect( a );
349
350         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, c.artifact} ), res.getArtifacts() );
351         assertEquals( "Check version", "2.0", getArtifact( "c", res.getArtifacts() ).getVersion() );
352     }
353
354     public void testUnboundedRangeAboveLastRelease()
355         throws ArtifactResolutionException, InvalidVersionSpecificationException
356     {
357         ArtifactSpec a = createArtifact( "a", "1.0" );
358         createArtifact( "c", "2.0" );
359         a.addDependency( "c", "[10.0,)" );
360
361         try
362         {
363             ArtifactResolutionResult res = collect( a );
364             fail( "Should not succeed collecting, got: " + res.getArtifacts() );
365         }
366         catch ( ArtifactResolutionException expected )
367         {
368             assertTrue( true );
369         }
370     }
371
372     public void testResolveManagedVersion()
373         throws ArtifactResolutionException, InvalidVersionSpecificationException
374     {
375         ArtifactSpec a = createArtifact( "a", "1.0" );
376         a.addDependency( "b", "3.0", Artifact.SCOPE_RUNTIME );
377
378         Artifact managedVersion = createArtifact( "b", "5.0" ).artifact;
379         Artifact modifiedB = createArtifact( "b", "5.0", Artifact.SCOPE_RUNTIME ).artifact;
380
381         ArtifactResolutionResult res = collect( a, managedVersion );
382         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, modifiedB} ), res.getArtifacts() );
383     }
384
385     public void testResolveCompileScopeOverTestScope()
386         throws ArtifactResolutionException, InvalidVersionSpecificationException
387     {
388         ArtifactSpec a = createArtifact( "a", "1.0" );
389         ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_TEST );
390
391         a.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
392
393         Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_COMPILE ).artifact;
394
395         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, c.artifact} ) );
396         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, modifiedC} ), res.getArtifacts() );
397         Artifact artifact = getArtifact( "c", res.getArtifacts() );
398         // local wins now, and irrelevant if not local as test/provided aren't transitive
399
// assertEquals( "Check scope", Artifact.SCOPE_COMPILE, artifact.getScope() );
400
assertEquals( "Check scope", Artifact.SCOPE_TEST, artifact.getScope() );
401     }
402
403     public void testResolveRuntimeScopeOverTestScope()
404         throws ArtifactResolutionException, InvalidVersionSpecificationException
405     {
406         ArtifactSpec a = createArtifact( "a", "1.0" );
407         ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_TEST );
408
409         a.addDependency( "c", "2.0", Artifact.SCOPE_RUNTIME );
410
411         Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_RUNTIME ).artifact;
412
413         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, c.artifact} ) );
414         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, modifiedC} ), res.getArtifacts() );
415         Artifact artifact = getArtifact( "c", res.getArtifacts() );
416         // local wins now, and irrelevant if not local as test/provided aren't transitive
417
// assertEquals( "Check scope", Artifact.SCOPE_RUNTIME, artifact.getScope() );
418
assertEquals( "Check scope", Artifact.SCOPE_TEST, artifact.getScope() );
419     }
420
421     public void testResolveCompileScopeOverRuntimeScope()
422         throws ArtifactResolutionException, InvalidVersionSpecificationException
423     {
424         ArtifactSpec root = createArtifact( "root", "1.0" );
425         ArtifactSpec a = root.addDependency( "a", "1.0" );
426         root.addDependency( "c", "3.0", Artifact.SCOPE_RUNTIME );
427
428         a.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
429
430         Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_COMPILE ).artifact;
431
432         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{root.artifact} ) );
433         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, root.artifact, modifiedC} ),
434                       res.getArtifacts() );
435         Artifact artifact = getArtifact( "c", res.getArtifacts() );
436         assertEquals( "Check scope", Artifact.SCOPE_COMPILE, artifact.getScope() );
437     }
438
439     public void testResolveCompileScopeOverProvidedScope()
440         throws ArtifactResolutionException, InvalidVersionSpecificationException
441     {
442         ArtifactSpec a = createArtifact( "a", "1.0" );
443         ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_PROVIDED );
444
445         a.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
446
447         Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_COMPILE ).artifact;
448
449         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, c.artifact} ) );
450         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, modifiedC} ), res.getArtifacts() );
451         Artifact artifact = getArtifact( "c", res.getArtifacts() );
452         // local wins now, and irrelevant if not local as test/provided aren't transitive
453
// assertEquals( "Check scope", Artifact.SCOPE_COMPILE, artifact.getScope() );
454
assertEquals( "Check scope", Artifact.SCOPE_PROVIDED, artifact.getScope() );
455     }
456
457     public void testResolveRuntimeScopeOverProvidedScope()
458         throws ArtifactResolutionException, InvalidVersionSpecificationException
459     {
460         ArtifactSpec a = createArtifact( "a", "1.0" );
461         ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_PROVIDED );
462
463         a.addDependency( "c", "2.0", Artifact.SCOPE_RUNTIME );
464
465         Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_RUNTIME ).artifact;
466
467         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, c.artifact} ) );
468         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, modifiedC} ), res.getArtifacts() );
469         Artifact artifact = getArtifact( "c", res.getArtifacts() );
470         // local wins now, and irrelevant if not local as test/provided aren't transitive
471
// assertEquals( "Check scope", Artifact.SCOPE_RUNTIME, artifact.getScope() );
472
assertEquals( "Check scope", Artifact.SCOPE_PROVIDED, artifact.getScope() );
473     }
474
475     public void testProvidedScopeNotTransitive()
476         throws ArtifactResolutionException, InvalidVersionSpecificationException
477     {
478         ArtifactSpec a = createArtifact( "a", "1.0", Artifact.SCOPE_PROVIDED );
479         ArtifactSpec b = createArtifact( "b", "1.0" );
480         b.addDependency( "c", "3.0", Artifact.SCOPE_PROVIDED );
481
482         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
483         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
484     }
485
486     public void testOptionalNotTransitive()
487         throws ArtifactResolutionException, InvalidVersionSpecificationException
488     {
489         ArtifactSpec a = createArtifact( "a", "1.0" );
490         ArtifactSpec b = createArtifact( "b", "1.0" );
491         b.addDependency( "c", "3.0", true );
492
493         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
494         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
495     }
496
497     public void testOptionalIncludedAtRoot()
498         throws ArtifactResolutionException, InvalidVersionSpecificationException
499     {
500         ArtifactSpec a = createArtifact( "a", "1.0" );
501
502         ArtifactSpec b = createArtifact( "b", "1.0", true );
503
504         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
505         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
506     }
507
508     public void testScopeUpdate()
509         throws InvalidVersionSpecificationException, ArtifactResolutionException
510     {
511         /* farthest = compile */
512         checkScopeUpdate( Artifact.SCOPE_COMPILE, Artifact.SCOPE_COMPILE, Artifact.SCOPE_COMPILE );
513         checkScopeUpdate( Artifact.SCOPE_COMPILE, Artifact.SCOPE_PROVIDED, Artifact.SCOPE_COMPILE );
514         checkScopeUpdate( Artifact.SCOPE_COMPILE, Artifact.SCOPE_RUNTIME, Artifact.SCOPE_COMPILE );
515         checkScopeUpdate( Artifact.SCOPE_COMPILE, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_COMPILE );
516         checkScopeUpdate( Artifact.SCOPE_COMPILE, Artifact.SCOPE_TEST, Artifact.SCOPE_COMPILE );
517
518         /* farthest = provided */
519         checkScopeUpdate( Artifact.SCOPE_PROVIDED, Artifact.SCOPE_COMPILE, Artifact.SCOPE_COMPILE );
520         checkScopeUpdate( Artifact.SCOPE_PROVIDED, Artifact.SCOPE_PROVIDED, Artifact.SCOPE_PROVIDED );
521         checkScopeUpdate( Artifact.SCOPE_PROVIDED, Artifact.SCOPE_RUNTIME, Artifact.SCOPE_RUNTIME );
522         checkScopeUpdate( Artifact.SCOPE_PROVIDED, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_SYSTEM );
523         checkScopeUpdate( Artifact.SCOPE_PROVIDED, Artifact.SCOPE_TEST, Artifact.SCOPE_TEST );
524
525         /* farthest = runtime */
526         checkScopeUpdate( Artifact.SCOPE_RUNTIME, Artifact.SCOPE_COMPILE, Artifact.SCOPE_COMPILE );
527         checkScopeUpdate( Artifact.SCOPE_RUNTIME, Artifact.SCOPE_PROVIDED, Artifact.SCOPE_RUNTIME );
528         checkScopeUpdate( Artifact.SCOPE_RUNTIME, Artifact.SCOPE_RUNTIME, Artifact.SCOPE_RUNTIME );
529         checkScopeUpdate( Artifact.SCOPE_RUNTIME, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_SYSTEM );
530         checkScopeUpdate( Artifact.SCOPE_RUNTIME, Artifact.SCOPE_TEST, Artifact.SCOPE_RUNTIME );
531
532         /* farthest = system */
533         checkScopeUpdate( Artifact.SCOPE_SYSTEM, Artifact.SCOPE_COMPILE, Artifact.SCOPE_COMPILE );
534         checkScopeUpdate( Artifact.SCOPE_SYSTEM, Artifact.SCOPE_PROVIDED, Artifact.SCOPE_PROVIDED );
535         checkScopeUpdate( Artifact.SCOPE_SYSTEM, Artifact.SCOPE_RUNTIME, Artifact.SCOPE_RUNTIME );
536         checkScopeUpdate( Artifact.SCOPE_SYSTEM, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_SYSTEM );
537         checkScopeUpdate( Artifact.SCOPE_SYSTEM, Artifact.SCOPE_TEST, Artifact.SCOPE_TEST );
538
539         /* farthest = test */
540         checkScopeUpdate( Artifact.SCOPE_TEST, Artifact.SCOPE_COMPILE, Artifact.SCOPE_COMPILE );
541         checkScopeUpdate( Artifact.SCOPE_TEST, Artifact.SCOPE_PROVIDED, Artifact.SCOPE_PROVIDED );
542         checkScopeUpdate( Artifact.SCOPE_TEST, Artifact.SCOPE_RUNTIME, Artifact.SCOPE_RUNTIME );
543         checkScopeUpdate( Artifact.SCOPE_TEST, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_SYSTEM );
544         checkScopeUpdate( Artifact.SCOPE_TEST, Artifact.SCOPE_TEST, Artifact.SCOPE_TEST );
545     }
546
547     private void checkScopeUpdate( String JavaDoc farthestScope, String JavaDoc nearestScope, String JavaDoc expectedScope )
548         throws ArtifactResolutionException, InvalidVersionSpecificationException
549     {
550         checkScopeUpdateDirect( farthestScope, nearestScope, expectedScope );
551         checkScopeUpdateTransitively( farthestScope, nearestScope, expectedScope );
552     }
553
554     private void checkScopeUpdateTransitively( String JavaDoc farthestScope, String JavaDoc nearestScope, String JavaDoc expectedScope )
555         throws ArtifactResolutionException, InvalidVersionSpecificationException
556     {
557         ArtifactSpec a = createArtifact( "a", "1.0" );
558         ArtifactSpec b = createArtifact( "b", "1.0", nearestScope );
559         ArtifactSpec c = createArtifact( "c", "1.0" );
560         a.addDependency( c );
561         ArtifactSpec dNearest = createArtifact( "d", "2.0" );
562         b.addDependency( dNearest );
563         ArtifactSpec dFarthest = createArtifact( "d", "3.0", farthestScope );
564         c.addDependency( dFarthest );
565
566         /* system and provided dependencies are not transitive */
567         if ( !Artifact.SCOPE_SYSTEM.equals( nearestScope ) && !Artifact.SCOPE_PROVIDED.equals( nearestScope ) )
568         {
569             checkScopeUpdate( a, b, expectedScope, "2.0" );
570         }
571     }
572
573     private void checkScopeUpdateDirect( String JavaDoc farthestScope, String JavaDoc nearestScope, String JavaDoc expectedScope )
574         throws ArtifactResolutionException, InvalidVersionSpecificationException
575     {
576         ArtifactSpec a = createArtifact( "a", "1.0" );
577         ArtifactSpec b = createArtifact( "b", "1.0" );
578         ArtifactSpec c = createArtifact( "c", "1.0" );
579         a.addDependency( c );
580         ArtifactSpec dNearest = createArtifact( "d", "2.0", nearestScope );
581         b.addDependency( dNearest );
582         ArtifactSpec dFarthest = createArtifact( "d", "3.0", farthestScope );
583         c.addDependency( dFarthest );
584
585         checkScopeUpdate( a, b, expectedScope, "2.0" );
586     }
587
588     private void checkScopeUpdate( ArtifactSpec a, ArtifactSpec b, String JavaDoc expectedScope, String JavaDoc expectedVersion )
589         throws ArtifactResolutionException, InvalidVersionSpecificationException
590     {
591         ScopeArtifactFilter filter;
592         if ( Artifact.SCOPE_PROVIDED.equals( expectedScope ) )
593         {
594             filter = new ScopeArtifactFilter( Artifact.SCOPE_COMPILE );
595         }
596         else if ( Artifact.SCOPE_SYSTEM.equals( expectedScope ) )
597         {
598             filter = new ScopeArtifactFilter( Artifact.SCOPE_COMPILE );
599         }
600         else
601         {
602             filter = new ScopeArtifactFilter( expectedScope );
603         }
604
605         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), filter );
606         Artifact artifact = getArtifact( "d", res.getArtifacts() );
607         assertNotNull( "MNG-1895 Dependency was not added to resolution", artifact );
608         assertEquals( "Check scope", expectedScope, artifact.getScope() );
609         assertEquals( "Check version", expectedVersion, artifact.getVersion() );
610
611         ArtifactSpec d = createArtifact( "d", "1.0" );
612         res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact, d.artifact} ), filter );
613         artifact = getArtifact( "d", res.getArtifacts() );
614         assertNotNull( "MNG-1895 Dependency was not added to resolution", artifact );
615         assertEquals( "Check scope", d.artifact.getScope(), artifact.getScope() );
616         assertEquals( "Check version", "1.0", artifact.getVersion() );
617     }
618
619     public void disabledtestOptionalNotTransitiveButVersionIsInfluential()
620         throws ArtifactResolutionException, InvalidVersionSpecificationException
621     {
622         ArtifactSpec a = createArtifact( "a", "1.0" );
623         ArtifactSpec b = createArtifact( "b", "1.0" );
624         b.addDependency( "c", "3.0", true );
625         ArtifactSpec d = a.addDependency( "d", "1.0" );
626         ArtifactSpec e = d.addDependency( "e", "1.0" );
627         e.addDependency( "c", "2.0" );
628
629         ArtifactSpec c = createArtifact( "c", "3.0" );
630
631         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
632         assertEquals( "Check artifact list",
633                       createSet( new Object JavaDoc[]{a.artifact, b.artifact, c.artifact, d.artifact, e.artifact} ),
634                       res.getArtifacts() );
635         Artifact artifact = getArtifact( "c", res.getArtifacts() );
636         assertEquals( "Check version", "3.0", artifact.getVersion() );
637     }
638
639     public void testTestScopeNotTransitive()
640         throws ArtifactResolutionException, InvalidVersionSpecificationException
641     {
642         ArtifactSpec a = createArtifact( "a", "1.0", Artifact.SCOPE_TEST );
643         ArtifactSpec b = createArtifact( "b", "1.0" );
644         b.addDependency( "c", "3.0", Artifact.SCOPE_TEST );
645
646         ArtifactResolutionResult res = collect( createSet( new Object JavaDoc[]{a.artifact, b.artifact} ) );
647         assertEquals( "Check artifact list", createSet( new Object JavaDoc[]{a.artifact, b.artifact} ), res.getArtifacts() );
648     }
649
650     private Artifact getArtifact( String JavaDoc id, Set JavaDoc artifacts )
651     {
652         for ( Iterator JavaDoc i = artifacts.iterator(); i.hasNext(); )
653         {
654             Artifact a = (Artifact) i.next();
655             if ( a.getArtifactId().equals( id ) && a.getGroupId().equals( GROUP_ID ) )
656             {
657                 return a;
658             }
659         }
660         return null;
661     }
662
663     private ArtifactResolutionResult collect( Set JavaDoc artifacts )
664         throws ArtifactResolutionException
665     {
666         return collect( artifacts, null );
667     }
668
669     private ArtifactResolutionResult collect( Set JavaDoc artifacts, ArtifactFilter filter )
670         throws ArtifactResolutionException
671     {
672         return artifactCollector.collect( artifacts, projectArtifact.artifact, null, null, source, filter,
673                                           Collections.EMPTY_LIST );
674     }
675
676     private ArtifactResolutionResult collect( ArtifactSpec a )
677         throws ArtifactResolutionException
678     {
679         return artifactCollector.collect( Collections.singleton( a.artifact ), projectArtifact.artifact, null, null,
680                                           source, null, Collections.EMPTY_LIST );
681     }
682
683     private ArtifactResolutionResult collect( ArtifactSpec a, ArtifactFilter filter )
684         throws ArtifactResolutionException
685     {
686         return artifactCollector.collect( Collections.singleton( a.artifact ), projectArtifact.artifact, null, null,
687                                           source, filter, Collections.EMPTY_LIST );
688     }
689
690     private ArtifactResolutionResult collect( ArtifactSpec a, Artifact managedVersion )
691         throws ArtifactResolutionException
692     {
693         Map JavaDoc managedVersions = Collections.singletonMap( managedVersion.getDependencyConflictId(), managedVersion );
694         return artifactCollector.collect( Collections.singleton( a.artifact ), projectArtifact.artifact,
695                                           managedVersions, null, null, source, null, Collections.EMPTY_LIST );
696     }
697
698     private ArtifactSpec createArtifact( String JavaDoc id, String JavaDoc version )
699         throws InvalidVersionSpecificationException
700     {
701         return createArtifact( id, version, Artifact.SCOPE_COMPILE );
702     }
703
704     private ArtifactSpec createArtifact( String JavaDoc id, String JavaDoc version, boolean optional )
705         throws InvalidVersionSpecificationException
706     {
707         return createArtifact( id, version, Artifact.SCOPE_COMPILE, null, optional );
708     }
709
710     private ArtifactSpec createArtifact( String JavaDoc id, String JavaDoc version, String JavaDoc scope )
711         throws InvalidVersionSpecificationException
712     {
713         return createArtifact( id, version, scope, null, false );
714     }
715
716     private ArtifactSpec createArtifact( String JavaDoc id, String JavaDoc version, String JavaDoc scope, String JavaDoc inheritedScope,
717                                          boolean optional )
718         throws InvalidVersionSpecificationException
719     {
720         VersionRange versionRange = VersionRange.createFromVersionSpec( version );
721         Artifact artifact = artifactFactory.createDependencyArtifact( GROUP_ID, id, versionRange, "jar", null, scope,
722                                                                       inheritedScope, optional );
723         ArtifactSpec spec = null;
724         if ( artifact != null )
725         {
726             spec = new ArtifactSpec();
727             spec.artifact = artifact;
728             source.addArtifact( spec );
729         }
730         return spec;
731     }
732
733     private static Set JavaDoc createSet( Object JavaDoc[] x )
734     {
735         return new LinkedHashSet JavaDoc( Arrays.asList( x ) );
736     }
737
738     private class ArtifactSpec
739     {
740         private Artifact artifact;
741
742         private Set JavaDoc dependencies = new HashSet JavaDoc();
743
744         public ArtifactSpec addDependency( String JavaDoc id, String JavaDoc version )
745             throws InvalidVersionSpecificationException
746         {
747             return addDependency( id, version, Artifact.SCOPE_COMPILE );
748         }
749
750         public ArtifactSpec addDependency( String JavaDoc id, String JavaDoc version, String JavaDoc scope )
751             throws InvalidVersionSpecificationException
752         {
753             return addDependency( id, version, scope, false );
754         }
755
756         private ArtifactSpec addDependency( ArtifactSpec dep )
757             throws InvalidVersionSpecificationException
758         {
759             if ( dep != null )
760             {
761                 dependencies.add( dep.artifact );
762             }
763             return dep;
764         }
765
766         private ArtifactSpec addDependency( String JavaDoc id, String JavaDoc version, String JavaDoc scope, boolean optional )
767             throws InvalidVersionSpecificationException
768         {
769             ArtifactSpec dep = createArtifact( id, version, scope, this.artifact.getScope(), optional );
770             return addDependency( dep );
771         }
772
773         public ArtifactSpec addDependency( String JavaDoc id, String JavaDoc version, boolean optional )
774             throws InvalidVersionSpecificationException
775         {
776             return addDependency( id, version, Artifact.SCOPE_COMPILE, optional );
777         }
778     }
779
780     private class Source
781         implements ArtifactMetadataSource
782     {
783         private Map JavaDoc artifacts = new HashMap JavaDoc();
784
785         private Map JavaDoc versions = new HashMap JavaDoc();
786
787         public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository,
788                                          List JavaDoc remoteRepositories )
789             throws ArtifactMetadataRetrievalException
790         {
791             String JavaDoc key = getKey( artifact );
792
793             ArtifactSpec a = (ArtifactSpec) artifacts.get( key );
794             try
795             {
796                 return new ResolutionGroup( artifact, createArtifacts( artifactFactory, a.dependencies,
797                                                                        artifact.getScope(),
798                                                                        artifact.getDependencyFilter() ),
799                                                       Collections.EMPTY_LIST );
800             }
801             catch ( InvalidVersionSpecificationException e )
802             {
803                 throw new ArtifactMetadataRetrievalException( e );
804             }
805         }
806
807         private String JavaDoc getKey( Artifact artifact )
808         {
809             return artifact.getDependencyConflictId() + ":" + artifact.getVersionRange();
810         }
811
812         private Set JavaDoc createArtifacts( ArtifactFactory artifactFactory, Set JavaDoc dependencies, String JavaDoc inheritedScope,
813                                      ArtifactFilter dependencyFilter )
814             throws InvalidVersionSpecificationException
815         {
816             Set JavaDoc projectArtifacts = new HashSet JavaDoc();
817
818             for ( Iterator JavaDoc i = dependencies.iterator(); i.hasNext(); )
819             {
820                 Artifact d = (Artifact) i.next();
821
822                 VersionRange versionRange;
823                 if ( d.getVersionRange() != null )
824                 {
825                     versionRange = d.getVersionRange();
826                 }
827                 else
828                 {
829                     versionRange = VersionRange.createFromVersionSpec( d.getVersion() );
830                 }
831                 Artifact artifact;
832                 if ( d.getScope().equals( Artifact.SCOPE_TEST ) || d.getScope().equals( Artifact.SCOPE_PROVIDED ) )
833                 {
834                     /* don't call createDependencyArtifact as it'll ignore test and provided scopes */
835                     artifact = artifactFactory.createArtifact( d.getGroupId(), d.getArtifactId(), d.getVersion(), d
836                         .getScope(), d.getType() );
837                 }
838                 else
839                 {
840                     artifact = artifactFactory.createDependencyArtifact( d.getGroupId(), d.getArtifactId(),
841                                                                          versionRange, d.getType(), d.getClassifier(),
842                                                                          d.getScope(), inheritedScope, d.isOptional() );
843                 }
844
845                 if ( artifact != null && ( dependencyFilter == null || dependencyFilter.include( artifact ) ) )
846                 {
847                     artifact.setDependencyFilter( dependencyFilter );
848
849                     projectArtifacts.add( artifact );
850                 }
851             }
852
853             return projectArtifacts;
854         }
855
856         public List JavaDoc retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository,
857                                                List JavaDoc remoteRepositories )
858             throws ArtifactMetadataRetrievalException
859         {
860             List JavaDoc artifactVersions = (List JavaDoc) versions.get( artifact.getDependencyConflictId() );
861             if ( artifactVersions == null )
862             {
863                 artifactVersions = Collections.EMPTY_LIST;
864             }
865             return artifactVersions;
866         }
867
868         public void addArtifact( ArtifactSpec spec )
869         {
870             artifacts.put( getKey( spec.artifact ), spec );
871
872             String JavaDoc key = spec.artifact.getDependencyConflictId();
873             List JavaDoc artifactVersions = (List JavaDoc) versions.get( key );
874             if ( artifactVersions == null )
875             {
876                 artifactVersions = new ArrayList JavaDoc();
877                 versions.put( key, artifactVersions );
878             }
879             if ( spec.artifact.getVersion() != null )
880             {
881                 artifactVersions.add( new DefaultArtifactVersion( spec.artifact.getVersion() ) );
882             }
883         }
884     }
885 }
886
Popular Tags