1 package org.apache.maven.artifact.resolver; 2 3 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 ; 34 import java.util.Arrays ; 35 import java.util.Collections ; 36 import java.util.HashMap ; 37 import java.util.HashSet ; 38 import java.util.Iterator ; 39 import java.util.LinkedHashSet ; 40 import java.util.List ; 41 import java.util.Map ; 42 import java.util.Set ; 43 44 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 GROUP_ID = "test"; 62 63 protected void setUp() 64 throws Exception 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 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 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 []{a.artifact, b.artifact, c.artifact, d.artifact} ), 123 res.getArtifacts() ); 124 125 ArtifactFilter filter = new ExclusionSetFilter( new String []{"b"} ); 126 res = collect( a, filter ); 127 assertEquals( "Check artifact list", createSet( new Object []{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 []{a.artifact, e.artifact} ) ); 143 assertEquals( "Check artifact list", 144 createSet( new Object []{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 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 []{a.artifact, e.artifact} ) ); 163 assertEquals( "Check artifact list", 164 createSet( new Object []{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 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 []{a.artifact} ) ); 184 Object [] artifacts = new Object []{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 []{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 []{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 []{a.artifact, b.artifact} ) ); 228 assertEquals( "Check artifact list", createSet( new Object []{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 []{a.artifact, b.artifact} ) ); 240 assertEquals( "Check artifact list", createSet( new Object []{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 []{a.artifact, b.artifact} ) ); 252 assertEquals( "Check artifact list", createSet( new Object []{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 []{a.artifact, b.artifact} ) ); 265 assertEquals( "Check artifact list", createSet( new Object []{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 []{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 []{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 []{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 []{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 []{a.artifact, c.artifact} ) ); 396 assertEquals( "Check artifact list", createSet( new Object []{a.artifact, modifiedC} ), res.getArtifacts() ); 397 Artifact artifact = getArtifact( "c", res.getArtifacts() ); 398 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 []{a.artifact, c.artifact} ) ); 414 assertEquals( "Check artifact list", createSet( new Object []{a.artifact, modifiedC} ), res.getArtifacts() ); 415 Artifact artifact = getArtifact( "c", res.getArtifacts() ); 416 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 []{root.artifact} ) ); 433 assertEquals( "Check artifact list", createSet( new Object []{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 []{a.artifact, c.artifact} ) ); 450 assertEquals( "Check artifact list", createSet( new Object []{a.artifact, modifiedC} ), res.getArtifacts() ); 451 Artifact artifact = getArtifact( "c", res.getArtifacts() ); 452 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 []{a.artifact, c.artifact} ) ); 468 assertEquals( "Check artifact list", createSet( new Object []{a.artifact, modifiedC} ), res.getArtifacts() ); 469 Artifact artifact = getArtifact( "c", res.getArtifacts() ); 470 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 []{a.artifact, b.artifact} ) ); 483 assertEquals( "Check artifact list", createSet( new Object []{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 []{a.artifact, b.artifact} ) ); 494 assertEquals( "Check artifact list", createSet( new Object []{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 []{a.artifact, b.artifact} ) ); 505 assertEquals( "Check artifact list", createSet( new Object []{a.artifact, b.artifact} ), res.getArtifacts() ); 506 } 507 508 public void testScopeUpdate() 509 throws InvalidVersionSpecificationException, ArtifactResolutionException 510 { 511 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 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 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 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 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 farthestScope, String nearestScope, String expectedScope ) 548 throws ArtifactResolutionException, InvalidVersionSpecificationException 549 { 550 checkScopeUpdateDirect( farthestScope, nearestScope, expectedScope ); 551 checkScopeUpdateTransitively( farthestScope, nearestScope, expectedScope ); 552 } 553 554 private void checkScopeUpdateTransitively( String farthestScope, String nearestScope, String 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 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 farthestScope, String nearestScope, String 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 expectedScope, String 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 []{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 []{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 []{a.artifact, b.artifact} ) ); 632 assertEquals( "Check artifact list", 633 createSet( new Object []{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 []{a.artifact, b.artifact} ) ); 647 assertEquals( "Check artifact list", createSet( new Object []{a.artifact, b.artifact} ), res.getArtifacts() ); 648 } 649 650 private Artifact getArtifact( String id, Set artifacts ) 651 { 652 for ( Iterator 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 artifacts ) 664 throws ArtifactResolutionException 665 { 666 return collect( artifacts, null ); 667 } 668 669 private ArtifactResolutionResult collect( Set 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 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 id, String version ) 699 throws InvalidVersionSpecificationException 700 { 701 return createArtifact( id, version, Artifact.SCOPE_COMPILE ); 702 } 703 704 private ArtifactSpec createArtifact( String id, String version, boolean optional ) 705 throws InvalidVersionSpecificationException 706 { 707 return createArtifact( id, version, Artifact.SCOPE_COMPILE, null, optional ); 708 } 709 710 private ArtifactSpec createArtifact( String id, String version, String scope ) 711 throws InvalidVersionSpecificationException 712 { 713 return createArtifact( id, version, scope, null, false ); 714 } 715 716 private ArtifactSpec createArtifact( String id, String version, String scope, String 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 createSet( Object [] x ) 734 { 735 return new LinkedHashSet ( Arrays.asList( x ) ); 736 } 737 738 private class ArtifactSpec 739 { 740 private Artifact artifact; 741 742 private Set dependencies = new HashSet (); 743 744 public ArtifactSpec addDependency( String id, String version ) 745 throws InvalidVersionSpecificationException 746 { 747 return addDependency( id, version, Artifact.SCOPE_COMPILE ); 748 } 749 750 public ArtifactSpec addDependency( String id, String version, String 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 id, String version, String 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 id, String 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 artifacts = new HashMap (); 784 785 private Map versions = new HashMap (); 786 787 public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository, 788 List remoteRepositories ) 789 throws ArtifactMetadataRetrievalException 790 { 791 String 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 getKey( Artifact artifact ) 808 { 809 return artifact.getDependencyConflictId() + ":" + artifact.getVersionRange(); 810 } 811 812 private Set createArtifacts( ArtifactFactory artifactFactory, Set dependencies, String inheritedScope, 813 ArtifactFilter dependencyFilter ) 814 throws InvalidVersionSpecificationException 815 { 816 Set projectArtifacts = new HashSet (); 817 818 for ( Iterator 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 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 retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository, 857 List remoteRepositories ) 858 throws ArtifactMetadataRetrievalException 859 { 860 List artifactVersions = (List ) 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 key = spec.artifact.getDependencyConflictId(); 873 List artifactVersions = (List ) versions.get( key ); 874 if ( artifactVersions == null ) 875 { 876 artifactVersions = new ArrayList (); 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 |