Author: jvanzyl Date: Sat Mar 10 17:03:06 2007 New Revision: 516822 URL: http://svn.apache.org/viewvc?view=rev&rev=516822 Log: MNG-1577 dependencyManagement element is king! woo hoo! Thanks to Patrick, Mike and Ralph for helping with all the hard work.
Modified: maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DebugResolutionListener.java maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionListener.java maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/MavenProject.java maven/components/branches/maven-2.0.x/maven-project/src/test/java/org/apache/maven/project/MavenProjectTest.java Modified: maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DebugResolutionListener.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DebugResolutionListener.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DebugResolutionListener.java (original) +++ maven/components/branches/maven-2.0.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DebugResolutionListener.java Sat Mar 10 17:03:06 2007 @@ -30,7 +30,7 @@ * @version $Id$ */ public class DebugResolutionListener - implements ResolutionListener + implements ResolutionListener, ResolutionListenerForDepMgmt { private Logger logger; @@ -93,6 +93,12 @@ replacement.getVersionRange() + " to: " + newRange + " )" ); } + /** + * The logic used here used to be a copy of the logic used in the DefaultArtifactCollector, and this method was + * called right before the actual version/scope changes were done. However, a different set of conditionals (and + * more information) is needed to be able to determine when and if the version and/or scope changes. See the two + * added methods, manageArtifactVersion and manageArtifactScope. + */ public void manageArtifact( Artifact artifact, Artifact replacement ) { String msg = indent + artifact; @@ -108,4 +114,25 @@ msg += ")"; logger.debug( msg ); } -} + + public void manageArtifactVersion( Artifact artifact, Artifact replacement ) + { + // only show msg if a change is actually taking place + if ( !replacement.getVersion().equals( artifact.getVersion() ) ) + { + String msg = indent + artifact + " (applying version: " + replacement.getVersion() + ")"; + logger.debug( msg ); + } + } + + public void manageArtifactScope( Artifact artifact, Artifact replacement ) + { + // only show msg if a change is actually taking place + if ( !replacement.getScope().equals( artifact.getScope() ) ) + { + String msg = indent + artifact + " (applying scope: " + replacement.getScope() + ")"; + logger.debug( msg ); + } + } + +} \ No newline at end of file Modified: maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java (original) +++ maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java Sat Mar 10 17:03:06 2007 @@ -25,9 +25,11 @@ import org.apache.maven.artifact.metadata.ResolutionGroup; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; +import org.apache.maven.artifact.resolver.filter.AndArtifactFilter; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.artifact.versioning.ManagedVersionMap; import java.util.ArrayList; import java.util.Collections; @@ -67,7 +69,10 @@ root.addDependencies( artifacts, remoteRepositories, filter ); - recurse( root, resolvedArtifacts, managedVersions, localRepository, remoteRepositories, source, filter, + ManagedVersionMap versionMap = (managedVersions != null && managedVersions instanceof ManagedVersionMap) ? + (ManagedVersionMap)managedVersions : new ManagedVersionMap(managedVersions); + + recurse( root, resolvedArtifacts, versionMap, localRepository, remoteRepositories, source, filter, listeners ); Set set = new HashSet(); @@ -102,29 +107,20 @@ return result; } - private void recurse( ResolutionNode node, Map resolvedArtifacts, Map managedVersions, + private void recurse( ResolutionNode node, Map resolvedArtifacts, ManagedVersionMap managedVersions, ArtifactRepository localRepository, List remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter, List listeners ) throws CyclicDependencyException, ArtifactResolutionException, OverConstrainedVersionException { fireEvent( ResolutionListener.TEST_ARTIFACT, listeners, node ); - // TODO: use as a conflict resolver Object key = node.getKey(); - if ( managedVersions.containsKey( key ) ) + + // TODO: Does this check need to happen here? Had to add the same call + // below when we iterate on child nodes -- will that suffice? + if ( managedVersions.containsKey( key )) { - Artifact artifact = (Artifact) managedVersions.get( key ); - - fireEvent( ResolutionListener.MANAGE_ARTIFACT, listeners, node, artifact ); - - if ( artifact.getVersion() != null ) - { - node.getArtifact().setVersion( artifact.getVersion() ); - } - if ( artifact.getScope() != null ) - { - node.getArtifact().setScope( artifact.getScope() ); - } + manageArtifact( node, managedVersions, listeners ); } List previousNodes = (List) resolvedArtifacts.get( key ); @@ -274,6 +270,38 @@ fireEvent( ResolutionListener.SELECT_VERSION_FROM_RANGE, listeners, child ); } + Object childKey = child.getKey(); + if ( managedVersions.containsKey( childKey ) ) + { + // If this child node is a managed dependency, ensure + // we are using the dependency management version + // of this child if applicable b/c we want to use the + // managed version's POM, *not* any other version's POM. + // We retrieve the POM below in the retrieval step. + manageArtifact( child, managedVersions, listeners ); + + // Also, we need to ensure that any exclusions it presents are + // added to the artifact before we retrive the metadata + // for the artifact; otherwise we may end up with unwanted + // dependencies. + Artifact ma = (Artifact) managedVersions.get( childKey ); + ArtifactFilter managedExclusionFilter = ma.getDependencyFilter(); + if ( null != managedExclusionFilter ) + { + if ( null != artifact.getDependencyFilter() ) + { + AndArtifactFilter aaf = new AndArtifactFilter(); + aaf.add( artifact.getDependencyFilter() ); + aaf.add( managedExclusionFilter ); + artifact.setDependencyFilter( aaf ); + } + else + { + artifact.setDependencyFilter( managedExclusionFilter ); + } + } + } + artifact.setDependencyTrail( node.getDependencyTrail() ); ResolutionGroup rGroup = source.retrieve( artifact, localRepository, remoteRepositories ); @@ -286,6 +314,7 @@ } child.addDependencies( rGroup.getArtifacts(), rGroup.getResolutionRepositories(), filter ); + } catch ( CyclicDependencyException e ) { @@ -311,6 +340,32 @@ } } + private void manageArtifact( ResolutionNode node, ManagedVersionMap managedVersions, List listeners ) + { + Artifact artifact = (Artifact) managedVersions.get( node.getKey() ); + + // Before we update the version of the artifact, we need to know + // whether we are working on a transitive dependency or not. This + // allows depMgmt to always override transitive dependencies, while + // explicit child override depMgmt (viz. depMgmt should only + // provide defaults to children, but should override transitives). + // We can do this by calling isChildOfRootNode on the current node. + + if ( artifact.getVersion() != null + && ( node.isChildOfRootNode() ? node.getArtifact().getVersion() == null : true ) ) + { + fireEvent( ResolutionListener.MANAGE_ARTIFACT_VERSION, listeners, node, artifact ); + node.getArtifact().setVersion( artifact.getVersion() ); + } + + if ( artifact.getScope() != null + && ( node.isChildOfRootNode() ? node.getArtifact().getScope() == null : true ) ) + { + fireEvent( ResolutionListener.MANAGE_ARTIFACT_SCOPE, listeners, node, artifact ); + node.getArtifact().setScope( artifact.getScope() ); + } + } + /** * Check if the scope needs to be updated. * <a href="http://docs.codehaus.org/x/IGU#DependencyMediationandConflictResolution-Scoperesolution">More info</a>. @@ -407,8 +462,21 @@ case ResolutionListener.UPDATE_SCOPE_CURRENT_POM: listener.updateScopeCurrentPom( node.getArtifact(), replacement.getScope() ); break; - case ResolutionListener.MANAGE_ARTIFACT: - listener.manageArtifact( node.getArtifact(), replacement ); + case ResolutionListener.MANAGE_ARTIFACT_VERSION: + if (listener instanceof ResolutionListenerForDepMgmt) { + ResolutionListenerForDepMgmt asImpl = (ResolutionListenerForDepMgmt) listener; + asImpl.manageArtifactVersion( node.getArtifact(), replacement ); + } else { + listener.manageArtifact( node.getArtifact(), replacement ); + } + break; + case ResolutionListener.MANAGE_ARTIFACT_SCOPE: + if (listener instanceof ResolutionListenerForDepMgmt) { + ResolutionListenerForDepMgmt asImpl = (ResolutionListenerForDepMgmt) listener; + asImpl.manageArtifactScope( node.getArtifact(), replacement ); + } else { + listener.manageArtifact( node.getArtifact(), replacement ); + } break; case ResolutionListener.SELECT_VERSION_FROM_RANGE: listener.selectVersionFromRange( node.getArtifact() ); Modified: maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionListener.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionListener.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionListener.java (original) +++ maven/components/branches/maven-2.0.x/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionListener.java Sat Mar 10 17:03:06 2007 @@ -44,6 +44,9 @@ int UPDATE_SCOPE = 6; + /** + * @deprecated + */ int MANAGE_ARTIFACT = 7; int OMIT_FOR_CYCLE = 8; @@ -53,6 +56,10 @@ int SELECT_VERSION_FROM_RANGE = 10; int RESTRICT_RANGE = 11; + + int MANAGE_ARTIFACT_VERSION = 12; + + int MANAGE_ARTIFACT_SCOPE = 13; void testArtifact( Artifact node ); @@ -66,7 +73,17 @@ void updateScope( Artifact artifact, String scope ); + /** + * @deprecated + */ void manageArtifact( Artifact artifact, Artifact replacement ); + + // TODO Use the following two instead of manageArtifact + // TODO Remove ResolutionListenerDM interface + + //void manageArtifactVersion( Artifact artifact, Artifact replacement ); + + //void manageArtifactScope( Artifact artifact, Artifact replacement ); void omitForCycle( Artifact artifact ); Modified: maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java (original) +++ maven/components/branches/maven-2.0.x/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java Sat Mar 10 17:03:06 2007 @@ -31,6 +31,7 @@ import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.artifact.versioning.ManagedVersionMap; import org.codehaus.plexus.PlexusTestCase; import java.util.ArrayList; @@ -809,7 +810,8 @@ private String getKey( Artifact artifact ) { - return artifact.getDependencyConflictId() + ":" + artifact.getVersionRange(); + //return artifact.getDependencyConflictId() + ":" + artifact.getVersionRange(); + return artifact.getDependencyConflictId(); } private Set createArtifacts( ArtifactFactory artifactFactory, Set dependencies, String inheritedScope, Modified: maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (original) +++ maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java Sat Mar 10 17:03:06 2007 @@ -84,6 +84,7 @@ ArtifactResolutionResult result = artifactResolver.resolveTransitively( Collections.singleton( artifact ), project.getArtifact(), + project.getManagedVersionMap(), localRepository, project.getRemoteArtifactRepositories(), artifactMetadataSource, filter ); Modified: maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (original) +++ maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java Sat Mar 10 17:03:06 2007 @@ -618,6 +618,7 @@ repositories.addAll( project.getRemoteArtifactRepositories() ); ArtifactResolutionResult result = artifactResolver.resolveTransitively( dependencies, pluginArtifact, + project.getManagedVersionMap(), localRepository, repositories, artifactMetadataSource, artifactFilter ); @@ -1140,7 +1141,9 @@ project.setDependencyArtifacts( project.createArtifacts( artifactFactory, null, null ) ); } ArtifactResolutionResult result = artifactResolver.resolveTransitively( project.getDependencyArtifacts(), - artifact, context.getLocalRepository(), + artifact, + project.getManagedVersionMap(), + context.getLocalRepository(), project.getRemoteArtifactRepositories(), artifactMetadataSource, filter ); Modified: maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (original) +++ maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java Sat Mar 10 17:03:06 2007 @@ -33,12 +33,15 @@ import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.artifact.versioning.ManagedVersionMap; import org.apache.maven.model.Build; import org.apache.maven.model.Dependency; import org.apache.maven.model.DependencyManagement; import org.apache.maven.model.DistributionManagement; +import org.apache.maven.model.Exclusion; import org.apache.maven.model.Extension; import org.apache.maven.model.Model; import org.apache.maven.model.Parent; @@ -274,6 +277,8 @@ MavenProject project = new MavenProject( superModel ); + project.setManagedVersionMap(createManagedVersionMap(projectId, superModel.getDependencyManagement(), null)); + project.setActiveProfiles( activeProfiles ); project.setOriginalModel( superModel ); @@ -334,7 +339,8 @@ String projectId = safeVersionlessKey( project.getGroupId(), project.getArtifactId() ); - Map managedVersions = createManagedVersionMap( projectId, project.getDependencyManagement() ); + // Map managedVersions = createManagedVersionMap( projectId, project.getDependencyManagement() ); + Map managedVersions = project.getManagedVersionMap(); ensureMetadataSourceIsInitialized(); @@ -386,13 +392,20 @@ } } - private Map createManagedVersionMap( String projectId, DependencyManagement dependencyManagement ) + private Map createManagedVersionMap( String projectId, DependencyManagement dependencyManagement, MavenProject parent) throws ProjectBuildingException { - Map map; - if ( dependencyManagement != null && dependencyManagement.getDependencies() != null ) + Map map = null; + List deps; + if ( dependencyManagement != null && (deps = dependencyManagement.getDependencies()) != null && deps.size() > 0) { - map = new HashMap(); + map = new ManagedVersionMap(map); + + if ( getLogger().isDebugEnabled() ) + { + getLogger().debug("Adding managed depedendencies for " + projectId); + } + for ( Iterator i = dependencyManagement.getDependencies().iterator(); i.hasNext(); ) { Dependency d = (Dependency) i.next(); @@ -404,6 +417,26 @@ versionRange, d.getType(), d.getClassifier(), d.getScope(), d.isOptional() ); + if ( getLogger().isDebugEnabled()) + { + getLogger().debug(" " + artifact); + } + + // If the dependencyManagement section listed exclusions, + // add them to the managed artifacts here so that transitive + // dependencies will be excluded if necessary. + if ( null != d.getExclusions() && !d.getExclusions().isEmpty() ) { + List exclusions = new ArrayList(); + Iterator exclItr = d.getExclusions().iterator(); + while (exclItr.hasNext()) { + Exclusion e = (Exclusion) exclItr.next(); + exclusions.add(e.getGroupId() + ":" + e.getArtifactId()); + } + ExcludesArtifactFilter eaf = new ExcludesArtifactFilter( exclusions ); + artifact.setDependencyFilter( eaf ); + } else { + artifact.setDependencyFilter( null ); + } map.put( d.getManagementKey(), artifact ); } catch ( InvalidVersionSpecificationException e ) @@ -413,7 +446,7 @@ } } } - else + else if (map == null) { map = Collections.EMPTY_MAP; } @@ -804,6 +837,8 @@ } } + project.setManagedVersionMap(createManagedVersionMap(projectId, project.getDependencyManagement(), project.getParent())); + return project; } @@ -1033,10 +1068,10 @@ Parent parentModel = model.getParent(); + String projectId = safeVersionlessKey( model.getGroupId(), model.getArtifactId() ); + if ( parentModel != null ) { - String projectId = safeVersionlessKey( model.getGroupId(), model.getArtifactId() ); - if ( StringUtils.isEmpty( parentModel.getGroupId() ) ) { throw new ProjectBuildingException( projectId, "Missing groupId element from parent element" ); Modified: maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/MavenProject.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/MavenProject.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/MavenProject.java (original) +++ maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/MavenProject.java Sat Mar 10 17:03:06 2007 @@ -34,6 +34,7 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.DependencyResolutionRequiredException; +import org.apache.maven.artifact.versioning.ManagedVersionMap; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; @@ -139,6 +140,8 @@ private Map extensionArtifactMap; + private Map managedVersionMap; + private Map projectReferences = new HashMap(); private Build buildOverlay; @@ -252,7 +255,12 @@ if ( project.artifact != null ) { this.artifact = ArtifactUtils.copyArtifact( project.artifact ); - } + } + + if ( project.getManagedVersionMap() != null ) + { + setManagedVersionMap( new ManagedVersionMap( project.getManagedVersionMap() ) ); + } } public String getModulePathAdjustment( MavenProject moduleProject ) throws IOException @@ -1479,6 +1487,16 @@ public Model getOriginalModel() { return originalModel; + } + + public void setManagedVersionMap( Map map ) + { + this.managedVersionMap = map; + } + + public Map getManagedVersionMap() + { + return this.managedVersionMap; } public boolean equals( Object other ) Modified: maven/components/branches/maven-2.0.x/maven-project/src/test/java/org/apache/maven/project/MavenProjectTest.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-project/src/test/java/org/apache/maven/project/MavenProjectTest.java?view=diff&rev=516822&r1=516821&r2=516822 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-project/src/test/java/org/apache/maven/project/MavenProjectTest.java (original) +++ maven/components/branches/maven-2.0.x/maven-project/src/test/java/org/apache/maven/project/MavenProjectTest.java Sat Mar 10 17:03:06 2007 @@ -21,9 +21,15 @@ import java.io.File; import java.io.IOException; +import java.util.Map; +import java.util.Iterator; +import java.util.List; import org.apache.maven.model.Model; import org.apache.maven.model.Parent; +import org.apache.maven.model.DependencyManagement; +import org.apache.maven.model.Dependency; +import org.apache.maven.artifact.versioning.ManagedVersionMap; public class MavenProjectTest extends AbstractMavenProjectTestCase @@ -41,7 +47,7 @@ childModel.setArtifactId( "artifact" ); MavenProject childProject = new MavenProject( childModel ); - + File childFile = new File( System.getProperty( "java.io.tmpdir" ), "maven-project-tests" + System.currentTimeMillis() + "/child/pom.xml" ); childProject.setFile( childFile ); @@ -49,7 +55,7 @@ String adjustment = parentProject.getModulePathAdjustment( childProject ); assertNotNull( adjustment ); - + assertEquals( "..", adjustment ); } @@ -92,6 +98,33 @@ MavenProject clonedProject = new MavenProject( projectToClone ); assertEquals( "maven-core", clonedProject.getArtifactId() ); + Map clonedMap = clonedProject.getManagedVersionMap(); + assertNotNull("ManagedVersionMap not copied", clonedMap); + assertTrue("ManagedVersionMap is not empty", clonedMap.isEmpty()); + } + + public void testCopyConstructorWithDependencyManagement() + throws Exception + { + File f = getFileForClasspathResource( "dependencyManagement-pom.xml" ); + MavenProject projectToClone = getProjectWithDependencies( f ); + DependencyManagement dep = projectToClone.getDependencyManagement(); + assertNotNull("No dependencyManagement", dep); + List list = dep.getDependencies(); + assertNotNull("No dependencies", list); + assertTrue("Empty dependency list", !list.isEmpty()); + + Map map = projectToClone.getManagedVersionMap(); + assertNotNull("No ManagedVersionMap", map); + assertTrue("ManagedVersionMap is empty", !map.isEmpty()); + + MavenProject clonedProject = new MavenProject( projectToClone ); + assertEquals( "maven-core", clonedProject.getArtifactId() ); + Map clonedMap = clonedProject.getManagedVersionMap(); + assertNotNull("ManagedVersionMap not copied", clonedMap); + assertTrue("ManagedVersionMap is empty", !clonedMap.isEmpty()); + assertTrue("Not a ManagedVersionMap", clonedMap instanceof ManagedVersionMap); + assertTrue("ManagedVersionMap does not contain test key", clonedMap.containsKey("maven-test:maven-test-b:jar")); } public void testGetModulePathAdjustment()