Return-Path: Delivered-To: apmail-ant-notifications-archive@locus.apache.org Received: (qmail 47352 invoked from network); 24 Mar 2008 18:05:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 24 Mar 2008 18:05:46 -0000 Received: (qmail 91743 invoked by uid 500); 24 Mar 2008 18:05:44 -0000 Delivered-To: apmail-ant-notifications-archive@ant.apache.org Received: (qmail 91724 invoked by uid 500); 24 Mar 2008 18:05:44 -0000 Mailing-List: contact notifications-help@ant.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ant.apache.org Delivered-To: mailing list notifications@ant.apache.org Received: (qmail 91715 invoked by uid 99); 24 Mar 2008 18:05:44 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 24 Mar 2008 11:05:44 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 24 Mar 2008 18:05:12 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id C20AA1A983A; Mon, 24 Mar 2008 11:05:23 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r640488 - in /ant/ivy/core/trunk: ./ src/java/org/apache/ivy/core/module/descriptor/ src/java/org/apache/ivy/core/resolve/ src/java/org/apache/ivy/plugins/parser/m2/ src/java/org/apache/ivy/plugins/parser/xml/ src/java/org/apache/ivy/plugin... Date: Mon, 24 Mar 2008 18:05:15 -0000 To: notifications@ant.apache.org From: xavier@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080324180523.C20AA1A983A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: xavier Date: Mon Mar 24 11:05:10 2008 New Revision: 640488 URL: http://svn.apache.org/viewvc?rev=640488&view=rev Log: NEW: Add transitive dependency version and branch override mechanism (IVY-784) (not completed yet) FIX: Compatibility with maven's dependencyMangement (IVY-753) (not completed yet) Syntax for IVY-784 still needs to be cleared out. Then I need to update documentation, xml module descriptor writer and updater. For IVY-753 to be fully completed, update of xml module descriptor writer still need to be achieved to be able to use converted pom file from cache. Added: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptorMediator.java (with props) ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/OverrideDependencyDescriptorMediator.java (with props) ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java (with props) ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.jar (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.pom (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.jar (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.pom (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.jar (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.pom (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.jar (with props) ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.pom (with props) Modified: ant/ivy/core/trunk/CHANGES.txt ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptor.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveData.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/ivy.xsd ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/CacheResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/IBiblioResolver.java ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParserTest.java ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/test.xml ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/parent/2.0/parent-2.0.pom Modified: ant/ivy/core/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/CHANGES.txt (original) +++ ant/ivy/core/trunk/CHANGES.txt Mon Mar 24 11:05:10 2008 @@ -66,6 +66,7 @@ ===================================== - NEW: Retain original dependency constraint rules in resolved ivy file (IVY-739) - NEW: Add a new resolve mode (optionally per module) to utilize dynamic constraint rule metadata (IVY-740) +- NEW: Add transitive dependency version and branch override mechanism (IVY-784) (not completed yet) - IMPROVEMENT: Make Ivy standalone runnable with no required dependencies (IVY-757) - IMPROVEMENT: add branch attribute in ivy:install task (IVY-727) @@ -73,6 +74,7 @@ - IMPROVEMENT: Parse description and home page from poms (IVY-767) - IMPROVEMENT: Smarter determination if an expression is exact or not for RegexpPatternMatcher and GlobPatternMatcher +- FIX: Compatibility with maven's dependencyMangement (IVY-753) (not completed yet) - FIX: ivy:settings fails when override is not set to 'true' (IVY-771) - FIX: NPE when specifying both resolveId and inline in an Ivy:Resolve (IVY-776) - FIX: repreport task not working against a repository structured by branches (IVY-716) Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java Mon Mar 24 11:05:10 2008 @@ -37,6 +37,7 @@ import org.apache.ivy.plugins.namespace.NameSpaceHelper; import org.apache.ivy.plugins.namespace.Namespace; import org.apache.ivy.plugins.namespace.NamespaceTransformer; +import org.apache.ivy.util.Checks; /** * This class can be used as the default implementation for DependencyDescriptor. It implements @@ -118,7 +119,7 @@ return newdd; } - private ModuleRevisionId revId; + private final ModuleRevisionId revId; private ModuleRevisionId dynamicRevId; @@ -158,10 +159,19 @@ private DependencyDescriptor asSystem = this; - public DefaultDependencyDescriptor(DependencyDescriptor dd, String revision) { + public DefaultDependencyDescriptor(DependencyDescriptor dd, ModuleRevisionId revision) { + Checks.checkNotNull(dd, "dd"); + Checks.checkNotNull(revision, "revision"); + + if (!revision.getModuleId().equals(dd.getDependencyId())) { + throw new IllegalArgumentException( + "new ModuleRevisionId MUST have the same ModuleId as original one." + + " original = " + dd.getDependencyId() + + " new = " + revision.getModuleId()); + } md = null; parentId = dd.getParentRevisionId(); - revId = ModuleRevisionId.newInstance(dd.getDependencyRevisionId(), revision); + revId = revision; dynamicRevId = dd.getDynamicConstraintDependencyRevisionId(); isForce = dd.isForce(); isChanging = dd.isChanging(); @@ -185,9 +195,20 @@ this(md, mrid, mrid, force, changing, transitive); } + public DefaultDependencyDescriptor(ModuleRevisionId mrid, boolean force) { + this(mrid, force, false); + } + + public DefaultDependencyDescriptor(ModuleRevisionId mrid, boolean force, boolean changing) { + this(null, mrid, mrid, force, changing, true); + } + public DefaultDependencyDescriptor( ModuleDescriptor md, ModuleRevisionId mrid, ModuleRevisionId dynamicConstraint, boolean force, boolean changing, boolean transitive) { + Checks.checkNotNull(mrid, "mrid"); + Checks.checkNotNull(dynamicConstraint, "dynamicConstraint"); + this.md = md; revId = mrid; dynamicRevId = dynamicConstraint; @@ -196,18 +217,6 @@ isTransitive = transitive; } - public DefaultDependencyDescriptor(ModuleRevisionId mrid, boolean force) { - this(mrid, force, false); - } - - public DefaultDependencyDescriptor(ModuleRevisionId mrid, boolean force, boolean changing) { - md = null; - revId = mrid; - dynamicRevId = mrid; - isForce = force; - isChanging = changing; - } - public ModuleId getDependencyId() { return getDependencyRevisionId().getModuleId(); } @@ -576,4 +585,7 @@ return excludeRules; } + public DependencyDescriptor clone(ModuleRevisionId revision) { + return new DefaultDependencyDescriptor(this, revision); + } } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java Mon Mar 24 11:05:10 2008 @@ -160,10 +160,11 @@ if (md instanceof DefaultModuleDescriptor) { DefaultModuleDescriptor dmd = (DefaultModuleDescriptor) md; nmd.conflictManagers.putAll(dmd.conflictManagers); + nmd.dependencyDescriptorMediators.putAll(dmd.dependencyDescriptorMediators); } else { Message.warn( "transformed module descriptor is not a default module descriptor: " - + "impossible to copy conflict manager configuration: " + md); + + "impossible to copy conflict manager and version mediation configuration: " + md); } nmd.licenses.addAll(Arrays.asList(md.getLicenses())); nmd.homePage = md.getHomePage(); @@ -199,6 +200,9 @@ private boolean isDefault = false; private Map conflictManagers = new LinkedHashMap(); // Map (ModuleId -> ) + + private Map/**/ dependencyDescriptorMediators + = new LinkedHashMap(); private List licenses = new ArrayList(); // List(License) @@ -470,6 +474,22 @@ } } return null; + } + + public void addDependencyDescriptorMediator(ModuleId moduleId, PatternMatcher matcher, + DependencyDescriptorMediator ddm) { + dependencyDescriptorMediators.put(new ModuleIdMatcher(matcher, moduleId), ddm); + } + + public DependencyDescriptor mediate(DependencyDescriptor dd) { + for (Iterator iter = dependencyDescriptorMediators.keySet().iterator(); iter.hasNext();) { + ModuleIdMatcher matcher = (ModuleIdMatcher) iter.next(); + if (matcher.matches(dd.getDependencyId())) { + dd = ((DependencyDescriptorMediator) dependencyDescriptorMediators.get(matcher)) + .mediate(dd); + } + } + return dd; } public void addLicense(License license) { Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptor.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptor.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptor.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptor.java Mon Mar 24 11:05:10 2008 @@ -125,4 +125,16 @@ public boolean canExclude(); DependencyDescriptor asSystem(); + + /** + * Clones current dependency descriptor with another revision. + * + * @param revision + * the revision of the cloned dependency descriptor + * @return the cloned dependency descriptor + * @throws IllegalArgumentException + * if the given {@link ModuleRevisionId} has not the same {@link ModuleId} as the + * {@link ModuleRevisionId} of this descriptor. + */ + DependencyDescriptor clone(ModuleRevisionId revision); } Added: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptorMediator.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptorMediator.java?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptorMediator.java (added) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptorMediator.java Mon Mar 24 11:05:10 2008 @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.ivy.core.module.descriptor; + +/** + * A DependencyDescriptorMediator is responsible for dependency descriptor mediation. + *

+ * Dependency descriptor mediation consists in adjusting dependency descriptors according to + * a context, environment, the stack of dependers, ... + *

+ */ +public interface DependencyDescriptorMediator { + + /** + * Mediates the given {@link DependencyDescriptor} according to this {@link ModuleDescriptor}. + *

+ * This method gives the opportunity to a ModuleDescriptor to override dependency version + * information of any of its transitive dependencies, since it is called by dependency resolvers + * before actually resolving a dependency. + *

+ * + * @param dd + * the dependency descriptor which should be mediated. + * @return the mediated {@link DependencyDescriptor}, or the original + * {@link DependencyDescriptor} if no mediation is required by this ModuleDescriptor. + */ + DependencyDescriptor mediate(DependencyDescriptor dd); + +} Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptorMediator.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DependencyDescriptorMediator.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java Mon Mar 24 11:05:10 2008 @@ -36,7 +36,9 @@ /** * Decriptor of a module. This is the Java representation of an ivy.xml */ -public interface ModuleDescriptor extends ExtendableItem, ArtifactInfo { +public interface ModuleDescriptor + extends ExtendableItem, ArtifactInfo, DependencyDescriptorMediator { + public static final String DEFAULT_CONFIGURATION = "default"; public static final String CALLER_ALL_CONFIGURATION = "all"; @@ -136,7 +138,8 @@ Configuration getConfiguration(String confName); /** - * Returns the conflict manager to use for the given ModuleId + * Returns the conflict manager to use for the given ModuleId, or null if no + * specific conflict manager is associated with the given module id in this module descriptor. * * @param id * @return Added: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/OverrideDependencyDescriptorMediator.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/OverrideDependencyDescriptorMediator.java?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/OverrideDependencyDescriptorMediator.java (added) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/OverrideDependencyDescriptorMediator.java Mon Mar 24 11:05:10 2008 @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.ivy.core.module.descriptor; + +import org.apache.ivy.core.module.id.ModuleRevisionId; + +/** + * DependencyDescriptorMediator used to override some dependency descriptors values, such as + * the branch or version of the dependency. + */ +public class OverrideDependencyDescriptorMediator implements DependencyDescriptorMediator { + private String version; + private String branch; + + /** + * Constructs a new instance. + * + * @param branch + * the branch to give to mediated dependency descriptors, null to keep + * the original branch. + * @param version + * the version to give to mediated dependency descriptors, null to + * keep the original one. + */ + public OverrideDependencyDescriptorMediator(String branch, String version) { + this.branch = branch; + this.version = version; + } + + /** + * Returns the version this mediator will give to mediated descriptors, or null + * if this mediator does not override version. + * + * @return the version this mediator will give to mediated descriptors. + */ + public String getVersion() { + return version; + } + + /** + * Returns the branch this mediator will give to mediated descriptors, or null + * if this mediator does not override branch. + * + * @return the branch this mediator will give to mediated descriptors. + */ + public String getBranch() { + return branch; + } + + public DependencyDescriptor mediate(DependencyDescriptor dd) { + ModuleRevisionId mrid = dd.getDependencyRevisionId(); + if ((version == null || version.equals(mrid.getRevision())) + && (branch == null || branch.equals(mrid.getBranch()))) { + return dd; + } + + String version = this.version == null ? mrid.getRevision() : this.version; + String branch = this.branch == null ? mrid.getBranch() : this.branch; + + return dd.clone(ModuleRevisionId.newInstance( + mrid.getOrganisation(), mrid.getName(), branch, version, mrid.getExtraAttributes())); + } +} Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/OverrideDependencyDescriptorMediator.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/OverrideDependencyDescriptorMediator.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNode.java Mon Mar 24 11:05:10 2008 @@ -167,7 +167,7 @@ private Map blacklisted = new HashMap(); public IvyNode(ResolveData data, IvyNode parent, DependencyDescriptor dd) { - id = data.getEngine().getRequestedDependencyRevisionId(dd, data.getOptions()); + id = dd.getDependencyRevisionId(); dds.put(parent, dd); root = parent.getRoot(); init(data); @@ -220,8 +220,8 @@ Message.debug("\tusing " + resolver + " to resolve " + getId()); DependencyDescriptor dependencyDescriptor = getDependencyDescriptor(parent); long start = System.currentTimeMillis(); - ModuleRevisionId requestedRevisionId = - data.getRequestedDependencyRevisionId(dependencyDescriptor); + ModuleRevisionId requestedRevisionId + = dependencyDescriptor.getDependencyRevisionId(); data.getEventManager().fireIvyEvent( new StartResolveDependencyEvent(resolver, dependencyDescriptor, requestedRevisionId)); module = resolver.getDependency(dependencyDescriptor, data); @@ -370,15 +370,14 @@ DependencyDescriptor[] dds = md.getDependencies(); Collection dependencies = new LinkedHashSet(); // it's important to respect order for (int i = 0; i < dds.length; i++) { - DependencyDescriptor dd = dds[i]; + DependencyDescriptor dd = data.mediate(dds[i]); String[] dependencyConfigurations = dd.getDependencyConfigurations(conf, requestedConf); if (dependencyConfigurations.length == 0) { // no configuration of the dependency is required for current confs : // it is exactly the same as if there was no dependency at all on it continue; } - ModuleRevisionId requestedDependencyRevisionId = - data.getEngine().getRequestedDependencyRevisionId(dd, data.getOptions()); + ModuleRevisionId requestedDependencyRevisionId = dd.getDependencyRevisionId(); if (isDependencyModuleExcluded(rootModuleConf, requestedDependencyRevisionId, conf)) { // the whole module is excluded, it is considered as not being part of dependencies // at all Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java Mon Mar 24 11:05:10 2008 @@ -96,7 +96,7 @@ } public ModuleRevisionId getAskedDependencyId(ResolveData resolveData) { - return resolveData.getRequestedDependencyRevisionId(dd); + return dd.getDependencyRevisionId(); } public ModuleDescriptor getModuleDescriptor() { Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveData.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveData.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveData.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveData.java Mon Mar 24 11:05:10 2008 @@ -19,16 +19,20 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.ivy.core.event.EventManager; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; +import org.apache.ivy.core.module.descriptor.ModuleDescriptor; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.ConfigurationResolveReport; +import org.apache.ivy.util.Message; public class ResolveData { private ResolveEngine engine; @@ -39,9 +43,12 @@ private ResolveOptions options; + private VisitNode currentVisitNode = null; + public ResolveData(ResolveData data, boolean validate) { - this(data.engine, new ResolveOptions(data.options).setValidate(validate), data.report, - data.visitData); + this(data.engine, new ResolveOptions(data.options).setValidate(validate), + data.report, data.visitData); + setCurrentVisitNode(currentVisitNode); } public ResolveData(ResolveEngine engine, ResolveOptions options) { @@ -86,6 +93,26 @@ public VisitData getVisitData(ModuleRevisionId mrid) { return (VisitData) visitData.get(mrid); } + + /** + * Returns the VisitNode currently visited, or null if there is no node currently + * visited in this context. + * + * @return the VisitNode currently visited + */ + public VisitNode getCurrentVisitNode() { + return currentVisitNode; + } + + /** + * Sets the currently visited node. + * WARNING: This should only be called by Ivy core ResolveEngine! + * + * @param currentVisitNode + */ + void setCurrentVisitNode(VisitNode currentVisitNode) { + this.currentVisitNode = currentVisitNode; + } public void register(VisitNode node) { register(node.getId(), node); @@ -180,7 +207,30 @@ return node != null && node.isBlacklisted(rootModuleConf); } - public ModuleRevisionId getRequestedDependencyRevisionId(DependencyDescriptor dd) { - return getEngine().getRequestedDependencyRevisionId(dd, getOptions()); + + public DependencyDescriptor mediate(DependencyDescriptor dd) { + VisitNode current = getCurrentVisitNode(); + if (current != null) { + // mediating dd through dependers stack + DependencyDescriptor originalDD = dd; + List dependers = new ArrayList(current.getPath()); + // the returned path contains the currently visited node, we are only interested in + // the dependers, so we remove the currently visted node from the end + dependers.remove(dependers.size() - 1); + // we want to apply mediation going up in the dependers stack, not the opposite + Collections.reverse(dependers); + for (Iterator iterator = dependers.iterator(); iterator.hasNext();) { + VisitNode n = (VisitNode) iterator.next(); + ModuleDescriptor md = n.getDescriptor(); + if (md != null) { + dd = md.mediate(dd); + } + } + if (originalDD != dd) { + Message.verbose("dependency descriptor has been mediated: " + + originalDD + " => " + dd); + } + } + return getEngine().mediate(dd, getOptions()); } } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveEngine.java Mon Mar 24 11:05:10 2008 @@ -254,8 +254,7 @@ if (dd != null) { ModuleRevisionId depResolvedId = dependencies[i].getResolvedId(); ModuleDescriptor depDescriptor = dependencies[i].getDescriptor(); - ModuleRevisionId depRevisionId = - getRequestedDependencyRevisionId(dd, options); + ModuleRevisionId depRevisionId = dd.getDependencyRevisionId(); if (depResolvedId == null) { throw new NullPointerException("getResolvedId() is null for " + dependencies[i].toString()); @@ -595,6 +594,10 @@ } else { Message.verbose("== resolving dependencies for " + node.getId() + " [" + conf + "]"); } + ResolveData data = node.getNode().getData(); + VisitNode parentVisitNode = data.getCurrentVisitNode(); + + data.setCurrentVisitNode(node); resolveConflict(node, conf); if (node.loadData(conf, shouldBePublic)) { @@ -640,6 +643,7 @@ Message.debug(node.getId() + " => dependencies resolved in " + conf + " (" + (System.currentTimeMillis() - start) + "ms)"); } + data.setCurrentVisitNode(parentVisitNode); } private void doFetchDependencies(VisitNode node, String conf) { @@ -966,17 +970,20 @@ } /** - * Returns the module revision id constraint requested by the given dependency descriptor, - * according to the given resolve options. + * Mediates the given dependency descriptor according to given options. + *

+ * The mediated dependency descriptor must return the actually requested module revision id when + * the method {@link DependencyDescriptor#getDependencyRevisionId()} is called. + *

* * @param dd * the dependency descriptor for which the requested module revision id should be * returned * @param options * the resolve options to use - * @return the {@link ModuleRevisionId} corresponding to the requested dependency constraint + * @return the mediated {@link DependencyDescriptor}. */ - public ModuleRevisionId getRequestedDependencyRevisionId( + public DependencyDescriptor mediate( DependencyDescriptor dd, ResolveOptions options) { if (dd == null) { return null; @@ -984,9 +991,13 @@ String resolveMode = options.getResolveMode() == null ? settings.getResolveMode(dd.getDependencyId()) : options.getResolveMode(); - return ResolveOptions.RESOLVEMODE_DYNAMIC.equals(resolveMode) - ? dd.getDynamicConstraintDependencyRevisionId() - : dd.getDependencyRevisionId(); + if (ResolveOptions.RESOLVEMODE_DYNAMIC.equals(resolveMode) + && !dd.getDynamicConstraintDependencyRevisionId() + .equals(dd.getDependencyRevisionId())) { + return dd.clone(dd.getDynamicConstraintDependencyRevisionId()); + } else { + return dd; + } } public EventManager getEventManager() { Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/VisitNode.java Mon Mar 24 11:05:10 2008 @@ -140,14 +140,14 @@ return root; } - public Collection getPath() { + public Collection/**/ getPath() { if (path == null) { path = computePath(); } return path; } - private Collection computePath() { + private Collection/**/ computePath() { if (parent != null) { Collection p = new LinkedHashSet(parent.getPath()); p.add(this); Added: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java (added) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java Mon Mar 24 11:05:10 2008 @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.ivy.plugins.parser.m2; + +public class DefaultPomDependencyMgt implements PomDependencyMgt { + private String groupId; + private String artifactId; + private String version; + + public DefaultPomDependencyMgt(String groupId, String artifactId, String version) { + this.groupId = groupId; + this.artifactId = artifactId; + this.version = version; + } + + public String getGroupId() { + return groupId; + } + public String getArtifaceId() { + return artifactId; + } + public String getVersion() { + return version; + } + + +} Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java (added) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java Mon Mar 24 11:05:10 2008 @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.ivy.plugins.parser.m2; + +public interface PomDependencyMgt { + + public abstract String getGroupId(); + + public abstract String getArtifaceId(); + + public abstract String getVersion(); + +} \ No newline at end of file Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java Mon Mar 24 11:05:10 2008 @@ -21,6 +21,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; @@ -33,6 +34,7 @@ import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; +import org.apache.ivy.core.module.descriptor.OverrideDependencyDescriptorMediator; import org.apache.ivy.core.module.descriptor.Configuration.Visibility; import org.apache.ivy.core.module.id.ArtifactId; import org.apache.ivy.core.module.id.ModuleId; @@ -41,8 +43,8 @@ import org.apache.ivy.plugins.matcher.PatternMatcher; import org.apache.ivy.plugins.parser.ModuleDescriptorParser; import org.apache.ivy.plugins.parser.m2.PomReader.PomDependencyData; -import org.apache.ivy.plugins.parser.m2.PomReader.PomDependencyMgt; import org.apache.ivy.plugins.repository.Resource; +import org.apache.ivy.util.Message; /** @@ -52,6 +54,8 @@ public class PomModuleDescriptorBuilder { + private static final int DEPENDENCY_MANAGEMENT_KEY_PARTS_COUNT = 3; + public static final Configuration[] MAVEN2_CONFIGURATIONS = new Configuration[] { new Configuration("default", Visibility.PUBLIC, "runtime dependencies and master artifact can be used with this conf", @@ -257,6 +261,11 @@ public void addDependencyMgt(PomDependencyMgt dep) { String key = getDependencyMgtExtraInfoKey(dep.getGroupId(), dep.getArtifaceId()); ivyModuleDescriptor.addExtraInfo(key, dep.getVersion()); + // dependency management info is also used for version mediation of transitive dependencies + ivyModuleDescriptor.addDependencyDescriptorMediator( + ModuleId.newInstance(dep.getGroupId(), dep.getArtifaceId()), + ExactPatternMatcher.INSTANCE, + new OverrideDependencyDescriptorMediator(null, dep.getVersion())); } private String getDefaultVersion(PomDependencyData dep) { @@ -274,6 +283,24 @@ return PROPERTIES + EXTRA_INFO_DELIMITER + propertyName; } + public static Map/**/ + getDependencyManagementMap(ModuleDescriptor md) { + Map ret = new LinkedHashMap(); + for (Iterator iterator = md.getExtraInfo().entrySet().iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + String key = (String) entry.getKey(); + if ((key).startsWith(DEPENDENCY_MANAGEMENT)) { + String[] parts = key.split(EXTRA_INFO_DELIMITER); + if (parts.length != DEPENDENCY_MANAGEMENT_KEY_PARTS_COUNT) { + Message.warn("what seem to be a dependency management extra info " + + "doesn't match expected pattern: " + key); + } else { + ret.put(ModuleId.newInstance(parts[1], parts[2]), entry.getValue()); + } + } + } + return ret; + } public void addExtraInfos(Map extraAttributes) { Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParser.java Mon Mar 24 11:05:10 2008 @@ -32,6 +32,7 @@ import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; +import org.apache.ivy.core.module.id.ModuleId; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.resolve.ResolveData; import org.apache.ivy.core.resolve.ResolveEngine; @@ -196,22 +197,31 @@ } if (parentDescr != null) { - Map parentPomProps = mdBuilder.extractPomProperties(parentDescr.getExtraInfo()); + Map parentPomProps = PomModuleDescriptorBuilder + .extractPomProperties(parentDescr.getExtraInfo()); for (Iterator iter = parentPomProps.entrySet().iterator(); iter.hasNext();) { Map.Entry prop = (Map.Entry) iter.next(); domReader.setProperty((String) prop.getKey(), (String) prop.getValue()); } + + mdBuilder.addExtraInfos(parentDescr.getExtraInfo()); + + // add dependency management info from parent + Map depMgt = PomModuleDescriptorBuilder.getDependencyManagementMap(parentDescr); + for (Iterator iterator = depMgt.entrySet().iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + ModuleId mid = (ModuleId) entry.getKey(); + String v = (String) entry.getValue(); + mdBuilder.addDependencyMgt( + new DefaultPomDependencyMgt(mid.getOrganisation(), mid.getName(), v)); + } } for (Iterator it = domReader.getDependencyMgt().iterator(); it.hasNext();) { - PomReader.PomDependencyMgt dep = (PomReader.PomDependencyMgt) it.next(); + PomDependencyMgt dep = (PomDependencyMgt) it.next(); mdBuilder.addDependencyMgt(dep); } - if (parentDescr != null) { - mdBuilder.addExtraInfos(parentDescr.getExtraInfo()); - } - for (Iterator it = domReader.getDependencies().iterator(); it.hasNext();) { PomReader.PomDependencyData dep = (PomReader.PomDependencyData) it.next(); mdBuilder.addDependency(res, dep); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java Mon Mar 24 11:05:10 2008 @@ -220,7 +220,7 @@ for (int i = 0; i < childs.getLength(); i++) { Node node = childs.item(i); if (node instanceof Element && DEPENDENCY.equals(node.getNodeName())) { - dependencies.add(new PomDependencyMgt((Element) node)); + dependencies.add(new PomDependencyMgtElement((Element) node)); } } } @@ -228,23 +228,32 @@ } - public class PomDependencyMgt { + public class PomDependencyMgtElement implements PomDependencyMgt { private final Element depElement; - PomDependencyMgt(Element depElement) { + PomDependencyMgtElement(Element depElement) { this.depElement = depElement; } + /* (non-Javadoc) + * @see org.apache.ivy.plugins.parser.m2.PomDependencyMgt#getGroupId() + */ public String getGroupId() { String val = getFirstChildText(depElement , GROUP_ID); return replaceProps(val); } + /* (non-Javadoc) + * @see org.apache.ivy.plugins.parser.m2.PomDependencyMgt#getArtifaceId() + */ public String getArtifaceId() { String val = getFirstChildText(depElement , ARTIFACT_ID); return replaceProps(val); } + /* (non-Javadoc) + * @see org.apache.ivy.plugins.parser.m2.PomDependencyMgt#getVersion() + */ public String getVersion() { String val = getFirstChildText(depElement , VERSION); return replaceProps(val); @@ -253,7 +262,7 @@ } - public class PomDependencyData extends PomDependencyMgt { + public class PomDependencyData extends PomDependencyMgtElement { private final Element depElement; PomDependencyData(Element depElement) { super(depElement); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java Mon Mar 24 11:05:10 2008 @@ -45,6 +45,7 @@ import org.apache.ivy.core.module.descriptor.License; import org.apache.ivy.core.module.descriptor.MDArtifact; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; +import org.apache.ivy.core.module.descriptor.OverrideDependencyDescriptorMediator; import org.apache.ivy.core.module.id.ArtifactId; import org.apache.ivy.core.module.id.ModuleId; import org.apache.ivy.core.module.id.ModuleRevisionId; @@ -184,6 +185,10 @@ private static final int EXTRA_INFO = 12; + private static final int ENGINE_HINTS = 13; + + private static final int MEDIATION = 14; + private int state = NONE; private final URL xmlURL; @@ -298,6 +303,11 @@ } else if ("conflicts".equals(qName)) { state = CONFLICT; checkConfigurations(); + } else if ("engine-hints".equals(qName)) { + state = ENGINE_HINTS; + checkConfigurations(); + } else if ("mediation".equals(qName)) { + state = MEDIATION; } else if ("artifact".equals(qName)) { artifactStarted(qName, attributes); } else if ("include".equals(qName) && state == DEP) { @@ -317,6 +327,8 @@ .getValue("name"))); } else if ("manager".equals(qName) && state == CONFLICT) { managerStarted(attributes); + } else if ("override".equals(qName) && state == MEDIATION) { + mediationOverrideStarted(attributes); } else if ("include".equals(qName) && state == CONF) { includeConfStarted(attributes); } else if (validate && state != EXTRA_INFO && state != DESCRIPTION) { @@ -367,6 +379,25 @@ return; } getMd().addConflictManager(new ModuleId(org, mod), matcher, cm); + } + + private void mediationOverrideStarted(Attributes attributes) { + String org = ivy.substitute(attributes.getValue("org")); + org = org == null ? PatternMatcher.ANY_EXPRESSION : org; + String mod = ivy.substitute(attributes.getValue("module")); + mod = mod == null ? PatternMatcher.ANY_EXPRESSION : mod; + String rev = ivy.substitute(attributes.getValue("rev")); + String branch = ivy.substitute(attributes.getValue("branch")); + String matcherName = ivy.substitute(attributes.getValue("matcher")); + PatternMatcher matcher = matcherName == null ? defaultMatcher : ivy + .getMatcher(matcherName); + if (matcher == null) { + addError("unknown matcher: " + matcherName); + return; + } + getMd().addDependencyDescriptorMediator( + new ModuleId(org, mod), matcher, + new OverrideDependencyDescriptorMediator(branch, rev)); } private void includeConfStarted(Attributes attributes) Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/ivy.xsd URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/ivy.xsd?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/ivy.xsd (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/xml/ivy.xsd Mon Mar 24 11:05:10 2008 @@ -251,6 +251,27 @@ + + + + + + + + + + + + + + + + + + + + + Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.java Mon Mar 24 11:05:10 2008 @@ -298,7 +298,7 @@ protected ResolvedModuleRevision findModuleInCache( DependencyDescriptor dd, ResolveData data, boolean anyResolver) { return getRepositoryCacheManager().findModuleInCache( - dd, data.getRequestedDependencyRevisionId(dd), + dd, dd.getDependencyRevisionId(), getCacheOptions(data), anyResolver ? null : getName()); } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java Mon Mar 24 11:05:10 2008 @@ -71,7 +71,7 @@ } public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data) { - ModuleRevisionId mrid = data.getRequestedDependencyRevisionId(dd); + ModuleRevisionId mrid = dd.getDependencyRevisionId(); if (isM2compatible()) { mrid = convertM2IdForResourceSearch(mrid); } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java Mon Mar 24 11:05:10 2008 @@ -166,8 +166,8 @@ try { clearIvyAttempts(); clearArtifactAttempts(); - ModuleRevisionId systemMrid = data.getRequestedDependencyRevisionId(systemDd); - ModuleRevisionId nsMrid = data.getRequestedDependencyRevisionId(nsDd); + ModuleRevisionId systemMrid = systemDd.getDependencyRevisionId(); + ModuleRevisionId nsMrid = nsDd.getDependencyRevisionId(); checkRevision(systemMrid); @@ -444,7 +444,7 @@ DependencyDescriptor nsDd = dd; dd = toSystem(nsDd); - ModuleRevisionId mrid = data.getRequestedDependencyRevisionId(dd); + ModuleRevisionId mrid = dd.getDependencyRevisionId(); ModuleDescriptorParser parser = ModuleDescriptorParserRegistry .getInstance().getParser(mdRef.getResource()); if (parser == null) { Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/CacheResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/CacheResolver.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/CacheResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/CacheResolver.java Mon Mar 24 11:05:10 2008 @@ -26,7 +26,6 @@ import org.apache.ivy.core.cache.DefaultRepositoryCacheManager; import org.apache.ivy.core.cache.RepositoryCacheManager; import org.apache.ivy.core.module.descriptor.Artifact; -import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.ArtifactDownloadReport; @@ -56,7 +55,7 @@ throws ParseException { clearIvyAttempts(); - ModuleRevisionId mrid = data.getRequestedDependencyRevisionId(dd); + ModuleRevisionId mrid = dd.getDependencyRevisionId(); // check revision ResolvedModuleRevision rmr = getRepositoryCacheManager() @@ -84,7 +83,8 @@ return node.getModuleRevision(); } rmr = getRepositoryCacheManager().findModuleInCache( - new DefaultDependencyDescriptor(dd, ivyRef.getRevision()), + dd.clone(ModuleRevisionId.newInstance( + dd.getDependencyRevisionId(), ivyRef.getRevision())), dd.getDependencyRevisionId(), getCacheOptions(data), null); if (rmr != null) { Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/ChainResolver.java Mon Mar 24 11:05:10 2008 @@ -106,7 +106,7 @@ ResolvedModuleRevision mr = null; - ModuleRevisionId mrid = data.getRequestedDependencyRevisionId(dd); + ModuleRevisionId mrid = dd.getDependencyRevisionId(); Message.verbose(getName() + ": Checking cache for: " + dd); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/IBiblioResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/IBiblioResolver.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/IBiblioResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/IBiblioResolver.java Mon Mar 24 11:05:10 2008 @@ -80,7 +80,7 @@ public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data) { if (isM2compatible() && isUsepoms()) { - ModuleRevisionId mrid = data.getRequestedDependencyRevisionId(dd); + ModuleRevisionId mrid = dd.getDependencyRevisionId(); mrid = convertM2IdForResourceSearch(mrid); ResolvedResource rres = findResourceUsingPatterns(mrid, getIvyPatterns(), DefaultArtifact.newPomArtifact(mrid, data.getDate()), getRMDParser(dd, data), data Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/core/resolve/ResolveTest.java Mon Mar 24 11:05:10 2008 @@ -3564,7 +3564,50 @@ assertTrue(getArchiveFileInCache(ivy, "org.apache.dm", "test3", "1.0", "test3", "jar", "jar").exists()); } + + public void testResolveMaven2ParentPomDependencyManagementOverrideTransitiveVersion() throws Exception { + // test;2.0 has a dependency on test2;3.0. + // test has a parent of parent(2.0) then parent2. + // Both parents have a dependencyManagement element for test2, and each list the version as + // ${pom.version}. The version for test2 in test should take precedance, + // so the version should be test2 version 3.0. + // test2;3.0 -> test4;2.0, but parent has a dependencyManagement section specifying test4;1.0. + // since maven 2.0.6, the information in parent should override transitive dependency version, + // and thus we should get test4;1.0 + Ivy ivy = new Ivy(); + ivy.configure(new File("test/repositories/parentPom/ivysettings.xml")); + ivy.getSettings().setDefaultResolver("parentChain"); + ResolveReport report = ivy.resolve(new File( + "test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.pom").toURL(), + getResolveOptions(new String[] {"*"})); + assertNotNull(report); + + //test the report to make sure the right dependencies are listed + List dependencies = report.getDependencies(); + assertEquals(3, dependencies.size()); + + IvyNode ivyNode; + ivyNode = (IvyNode) dependencies.get(0); + assertNotNull(ivyNode); + ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache.dm", "test2", "3.0"); + assertEquals(mrid, ivyNode.getId()); + assertTrue(getIvyFileInCache( + ModuleRevisionId.newInstance("org.apache.dm", "test2", "3.0")).exists()); + assertTrue(getArchiveFileInCache(ivy, "org.apache.dm", "test2", "3.0", + "test2", "jar", "jar").exists()); + + ivyNode = (IvyNode) dependencies.get(2); + assertNotNull(ivyNode); + mrid = ModuleRevisionId.newInstance("org.apache.dm", "test4", "1.0"); + assertEquals(mrid, ivyNode.getId()); + assertTrue(getIvyFileInCache( + ModuleRevisionId.newInstance("org.apache.dm", "test4", "1.0")).exists()); + assertTrue(getArchiveFileInCache(ivy, "org.apache.dm", "test4", "1.0", + "test4", "jar", "jar").exists()); + } + + public void testNamespaceMapping() throws Exception { // the dependency is in another namespace Ivy ivy = new Ivy(); Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParserTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParserTest.java?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParserTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParserTest.java Mon Mar 24 11:05:10 2008 @@ -29,7 +29,9 @@ import org.apache.ivy.Ivy; import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.Configuration; +import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; +import org.apache.ivy.core.module.descriptor.DependencyDescriptorMediator; import org.apache.ivy.core.module.descriptor.ExcludeRule; import org.apache.ivy.core.module.descriptor.License; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; @@ -453,6 +455,12 @@ cm = md.getConflictManager(new ModuleId("theirorg", "theirmodule2")); assertNull(cm); + + assertEquals( + ModuleRevisionId.parse("yourorg#yourmodule1#BRANCH;1.0"), + md.mediate(new DefaultDependencyDescriptor( + ModuleRevisionId.parse("yourorg#yourmodule1;2.0"), false)) + .getDependencyRevisionId()); ExcludeRule[] rules = md.getAllExcludeRules(); assertNotNull(rules); Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/test.xml URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/test.xml?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/test.xml (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/xml/test.xml Mon Mar 24 11:05:10 2008 @@ -106,4 +106,9 @@ + + + + + Modified: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/parent/2.0/parent-2.0.pom URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/parent/2.0/parent-2.0.pom?rev=640488&r1=640487&r2=640488&view=diff ============================================================================== --- ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/parent/2.0/parent-2.0.pom (original) +++ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/parent/2.0/parent-2.0.pom Mon Mar 24 11:05:10 2008 @@ -35,6 +35,11 @@ test2 ${pom.version} + + org.apache.dm + test4 + 1.0 + Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.jar URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.jar?rev=640488&view=auto ============================================================================== Binary file - no diff available. Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.jar ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.pom URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.pom?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.pom (added) +++ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.pom Mon Mar 24 11:05:10 2008 @@ -0,0 +1,38 @@ + + + + + parent + org.apache.dm + 2.0 + + 4.0.0 + org.apache.dm + test + Test parsing parent POM + 2.0 + + + org.apache.dm + test2 + 3.0 + + + Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test/2.0/test-2.0.pom ------------------------------------------------------------------------------ svn:eol-style = native Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.jar URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.jar?rev=640488&view=auto ============================================================================== Binary file - no diff available. Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.jar ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.pom URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.pom?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.pom (added) +++ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.pom Mon Mar 24 11:05:10 2008 @@ -0,0 +1,33 @@ + + + + 4.0.0 + org.apache.dm + test2 + Test parsing parent POM + 3.0 + + + org.apache.dm + test4 + 2.0 + + + Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test2/3.0/test2-3.0.pom ------------------------------------------------------------------------------ svn:eol-style = native Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.jar URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.jar?rev=640488&view=auto ============================================================================== Binary file - no diff available. Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.jar ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.pom URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.pom?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.pom (added) +++ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.pom Mon Mar 24 11:05:10 2008 @@ -0,0 +1,26 @@ + + + + 4.0.0 + org.apache.dm + test4 + Test parsing parent POM + 1.0 + Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/1.0/test4-1.0.pom ------------------------------------------------------------------------------ svn:eol-style = native Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.jar URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.jar?rev=640488&view=auto ============================================================================== Binary file - no diff available. Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.jar ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.pom URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.pom?rev=640488&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.pom (added) +++ ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.pom Mon Mar 24 11:05:10 2008 @@ -0,0 +1,26 @@ + + + + 4.0.0 + org.apache.dm + test4 + Test parsing parent POM + 2.0 + Propchange: ant/ivy/core/trunk/test/repositories/parentPom/org/apache/dm/test4/2.0/test4-2.0.pom ------------------------------------------------------------------------------ svn:eol-style = native