Author: xavier Date: Fri Aug 22 08:32:18 2008 New Revision: 688097 URL: http://svn.apache.org/viewvc?rev=688097&view=rev Log: FIX: ChainResolverTest failures (IVY-882) The problem was due to the changes introduced in IVY-857. Indeed the cache checking was removed from the chain, to allow a resolver to force a revision even when there is already something in the cache. The problem is that resolvers where always checked in the chain even when the cache is filled. To implement this properly, I've moved the responsibility of knowing what resolved module revision should be returned to each individual resolver instead of the chain (pretty much like in the chain of responsibility pattern, where each node is responsible for calling the next one). To avoid changing the DependencyResolver API, I've added the detail about a possibly already resolved module revision in ResolveData. The added responsibility to DependencyResolver makes it more flexible, but also more complex to write. Hopefully most people writing dependency resolvers at least extend BasicResolver where all this logic is already implemented.
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/resolve/ResolveData.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/AbstractResolver.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/ChainResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DualResolver.java ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/DualResolverTest.java ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/IBiblioResolverTest.java ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/MockResolver.java 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=688097&r1=688096&r2=688097&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 Fri Aug 22 08:32:18 2008 @@ -45,10 +45,13 @@ private VisitNode currentVisitNode = null; + private ResolvedModuleRevision currentResolvedModuleRevision; + public ResolveData(ResolveData data, boolean validate) { this(data.engine, new ResolveOptions(data.options).setValidate(validate), data.report, data.visitData); - setCurrentVisitNode(currentVisitNode); + setCurrentVisitNode(data.currentVisitNode); + setCurrentResolvedModuleRevision(data.currentResolvedModuleRevision); } public ResolveData(ResolveEngine engine, ResolveOptions options) { @@ -235,4 +238,33 @@ } return getEngine().mediate(dd, getOptions()); } + + /** + * Sets the last [EMAIL PROTECTED] ResolvedModuleRevision} which has been currently resolved. + * <p> + * This can be used especially in dependency resolvers, to know if another dependency resolver + * has already resolved the requested dependency, to take a decision if the resolver should try + * to resolve it by itself or not. Indeed, the dependency resolver is responsible for taking + * this decision, even when included in a chain. The chain responsibility is only to set this + * current resolved module revision to enable the resolver to take the decision. + * </p> + * + * @param mr + * the last [EMAIL PROTECTED] ResolvedModuleRevision} which has been currently resolved. + */ + public void setCurrentResolvedModuleRevision(ResolvedModuleRevision mr) { + this.currentResolvedModuleRevision = mr; + } + + /** + * Returns the last [EMAIL PROTECTED] ResolvedModuleRevision} which has been currently resolved. + * <p> + * It can be <code>null</code>. + * </p> + * + * @return the last [EMAIL PROTECTED] ResolvedModuleRevision} which has been currently resolved. + */ + public ResolvedModuleRevision getCurrentResolvedModuleRevision() { + return currentResolvedModuleRevision; + } } 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=688097&r1=688096&r2=688097&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 Fri Aug 22 08:32:18 2008 @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Date; import java.util.Map; import org.apache.ivy.core.IvyContext; @@ -50,9 +51,11 @@ import org.apache.ivy.core.search.OrganisationEntry; import org.apache.ivy.core.search.RevisionEntry; import org.apache.ivy.core.settings.Validatable; +import org.apache.ivy.plugins.latest.ArtifactInfo; import org.apache.ivy.plugins.latest.LatestStrategy; import org.apache.ivy.plugins.namespace.NameSpaceHelper; import org.apache.ivy.plugins.namespace.Namespace; +import org.apache.ivy.plugins.resolver.ChainResolver.ResolvedModuleRevisionArtifactInfo; import org.apache.ivy.plugins.resolver.util.HasLatestStrategy; import org.apache.ivy.plugins.resolver.util.ResolvedResource; import org.apache.ivy.util.Message; @@ -461,4 +464,52 @@ }; } + + /** + * Returns true if rmr1 is after rmr2, using the latest strategy to determine which is the + * latest + * + * @param rmr1 + * @param rmr2 + * @return + */ + protected boolean isAfter(ResolvedModuleRevision rmr1, ResolvedModuleRevision rmr2, Date date) { + ArtifactInfo[] ais = new ArtifactInfo[] { + new ResolvedModuleRevisionArtifactInfo(rmr1), + new ResolvedModuleRevisionArtifactInfo(rmr2)}; + return getLatestStrategy().findLatest(ais, date) == ais[0]; + } + + protected ResolvedModuleRevision checkLatest( + ResolvedModuleRevision newModuleFound, + ResolveData data) { + // check if latest is asked and compare to return the most recent + ResolvedModuleRevision previousModuleFound = data.getCurrentResolvedModuleRevision(); + String newModuleDesc = describe(newModuleFound); + Message.debug("\tchecking " + newModuleDesc + " against " + describe(previousModuleFound)); + if (previousModuleFound == null) { + Message.debug("\tmodule revision kept as first found: " + newModuleDesc); + return newModuleFound; + } else if (isAfter(newModuleFound, previousModuleFound, data.getDate())) { + Message.debug("\tmodule revision kept as younger: " + newModuleDesc); + return newModuleFound; + } else if (!newModuleFound.getDescriptor().isDefault() + && previousModuleFound.getDescriptor().isDefault()) { + Message.debug("\tmodule revision kept as better (not default): " + newModuleDesc); + return newModuleFound; + } else { + Message.debug("\tmodule revision discarded as older: " + newModuleDesc); + return previousModuleFound; + } + } + + private String describe(ResolvedModuleRevision rmr) { + if (rmr == null) { + return "[none]"; + } + return rmr.getId() + + (rmr.getDescriptor().isDefault() ? "[default]" : "") + " from " + + rmr.getResolver().getName(); + } + } 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=688097&r1=688096&r2=688097&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 Fri Aug 22 08:32:18 2008 @@ -166,15 +166,23 @@ public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data) throws ParseException { IvyContext context = IvyContext.pushNewCopyContext(); - if (isForce()) { - dd = dd.clone(ModuleRevisionId.newInstance( - dd.getDependencyRevisionId(), "latest.integration")); - } - DependencyDescriptor systemDd = dd; - DependencyDescriptor nsDd = fromSystem(dd); - context.setDependencyDescriptor(systemDd); - context.setResolveData(data); try { + ResolvedModuleRevision mr = data.getCurrentResolvedModuleRevision(); + if (mr != null) { + if (shouldReturnResolvedModule(dd, mr)) { + return mr; + } + } + + if (isForce()) { + dd = dd.clone(ModuleRevisionId.newInstance( + dd.getDependencyRevisionId(), "latest.integration")); + } + DependencyDescriptor systemDd = dd; + DependencyDescriptor nsDd = fromSystem(dd); + context.setDependencyDescriptor(systemDd); + context.setResolveData(data); + clearIvyAttempts(); clearArtifactAttempts(); ModuleRevisionId systemMrid = systemDd.getDependencyRevisionId(); @@ -200,7 +208,7 @@ + "): but we are in force mode, let's try to find one ourself"); } else { Message.verbose("\t" + getName() + ": revision in cache: " + systemMrid); - return checkForcedResolvedModuleRevision(rmr); + return checkLatest(checkForcedResolvedModuleRevision(rmr), data); } } @@ -254,7 +262,7 @@ } if (!rmr.getReport().isDownloaded() && rmr.getReport().getLocalFile() != null) { - return checkForcedResolvedModuleRevision(toSystem(rmr)); + return checkLatest(checkForcedResolvedModuleRevision(rmr), data); } else { nsMd = rmr.getDescriptor(); @@ -287,7 +295,7 @@ cacheModuleDescriptor(systemMd, systemMrid, ivyRef, rmr); - return checkForcedResolvedModuleRevision(rmr); + return checkLatest(checkForcedResolvedModuleRevision(rmr), data); } catch (UnresolvedDependencyException ex) { if (ex.getMessage().length() > 0) { if (ex.isError()) { @@ -296,12 +304,26 @@ Message.verbose(ex.getMessage()); } } - return null; + return data.getCurrentResolvedModuleRevision(); } finally { IvyContext.popContext(); } } + protected boolean shouldReturnResolvedModule( + DependencyDescriptor dd, ResolvedModuleRevision mr) { + // a resolved module revision has already been found by a prior dependency resolver + // let's see if it should be returned and bypass this resolver + + ModuleRevisionId mrid = dd.getDependencyRevisionId(); + boolean isDynamic = getSettings().getVersionMatcher().isDynamic(mrid); + boolean shouldReturn = mr.isForce(); + shouldReturn |= !isDynamic && !mr.getDescriptor().isDefault(); + shouldReturn &= !isForce(); + + return shouldReturn; + } + private ResolvedModuleRevision checkForcedResolvedModuleRevision(ResolvedModuleRevision rmr) { if (rmr == null) { return 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=688097&r1=688096&r2=688097&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 Fri Aug 22 08:32:18 2008 @@ -22,7 +22,6 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.Iterator; import java.util.List; @@ -100,20 +99,33 @@ public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data) throws ParseException { data = new ResolveData(data, doValidate(data)); - ResolvedModuleRevision ret = null; List errors = new ArrayList(); - ResolvedModuleRevision mr = null; + ResolvedModuleRevision resolved = data.getCurrentResolvedModuleRevision(); + ResolvedModuleRevision mr = resolved; - ModuleRevisionId mrid = dd.getDependencyRevisionId(); - - boolean isDynamic = getSettings().getVersionMatcher().isDynamic(mrid); + if (mr == null) { + Message.verbose(getName() + ": Checking cache for: " + dd); + mr = findModuleInCache(dd, data, true); + if (mr != null) { + Message.verbose(getName() + ": module revision found in cache: " + mr.getId()); + if (!isCheckmodified()) { + mr = forcedRevision(mr); + } + } + } + for (Iterator iter = chain.iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); LatestStrategy oldLatest = setLatestIfRequired(resolver, getLatestStrategy()); try { + ResolvedModuleRevision previouslyResolved = mr; + data.setCurrentResolvedModuleRevision(previouslyResolved); mr = resolver.getDependency(dd, data); + if (mr != previouslyResolved && isReturnFirst()) { + mr = forcedRevision(mr); + } } catch (Exception ex) { Message.verbose("problem occured while resolving " + dd + " with " + resolver + ": " + StringUtils.getStackTrace(ex)); @@ -124,41 +136,8 @@ } } checkInterrupted(); - if (mr != null) { - boolean shouldReturn = returnFirst; - shouldReturn |= !isDynamic - && ret != null && !ret.getDescriptor().isDefault(); - shouldReturn |= mr.isForce(); - if (!shouldReturn) { - // check if latest is asked and compare to return the most recent - String mrDesc = mr.getId() - + (mr.getDescriptor().isDefault() ? "[default]" : "") + " from " - + mr.getResolver().getName(); - Message.debug("\tchecking " + mrDesc + " against " + ret); - if (ret == null) { - Message.debug("\tmodule revision kept as first found: " + mrDesc); - ret = mr; - } else if (isAfter(mr, ret, data.getDate())) { - Message.debug("\tmodule revision kept as younger: " + mrDesc); - ret = mr; - } else if (!mr.getDescriptor().isDefault() && ret.getDescriptor().isDefault()) { - Message.debug("\tmodule revision kept as better (not default): " + mrDesc); - ret = mr; - } else { - Message.debug("\tmodule revision discarded as older: " + mrDesc); - } - if (!isDynamic - && !ret.getDescriptor().isDefault()) { - Message.debug("\tmodule revision found and is not default: returning " - + mrDesc); - return resolvedRevision(mr); - } - } else { - return resolvedRevision(mr); - } - } } - if (ret == null && !errors.isEmpty()) { + if (mr == null && !errors.isEmpty()) { if (errors.size() == 1) { Exception ex = (Exception) errors.get(0); if (ex instanceof RuntimeException) { @@ -179,7 +158,11 @@ + err); } } - return resolvedRevision(ret); + if (resolved == mr) { + // nothing has actually been resolved here, we don't need to touch the returned rmr + return resolved; + } + return resolvedRevision(mr); } private ResolvedModuleRevision resolvedRevision(ResolvedModuleRevision mr) { @@ -190,6 +173,15 @@ return mr; } } + + private ResolvedModuleRevision forcedRevision(ResolvedModuleRevision rmr) { + if (rmr == null) { + return null; + } + return new ResolvedModuleRevision( + rmr.getResolver(), rmr.getArtifactResolver(), + rmr.getDescriptor(), rmr.getReport(), true); + } private LatestStrategy setLatestIfRequired(DependencyResolver resolver, LatestStrategy latestStrategy) { @@ -203,20 +195,6 @@ } } - /** - * Returns true if rmr1 is after rmr2, using the latest strategy to determine which is the - * latest - * - * @param rmr1 - * @param rmr2 - * @return - */ - private boolean isAfter(ResolvedModuleRevision rmr1, ResolvedModuleRevision rmr2, Date date) { - ArtifactInfo[] ais = new ArtifactInfo[] {new ResolvedModuleRevisionArtifactInfo(rmr2), - new ResolvedModuleRevisionArtifactInfo(rmr1)}; - return getLatestStrategy().findLatest(ais, date) != ais[0]; - } - public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data) { for (Iterator iter = chain.iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DualResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DualResolver.java?rev=688097&r1=688096&r2=688097&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DualResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DualResolver.java Fri Aug 22 08:32:18 2008 @@ -65,6 +65,8 @@ throw new IllegalStateException( "exactly two resolvers must be added: ivy(1) and artifact(2) one"); } + ResolvedModuleRevision resolved = data.getCurrentResolvedModuleRevision(); + data = new ResolveData(data, doValidate(data)); final ResolvedModuleRevision mr = ivyResolver.getDependency(dd, data); if (mr == null) { @@ -77,6 +79,10 @@ return null; } } else { + if (mr == resolved) { + // nothing has actually been resolved here, we don't need to touch the returned rmr + return mr; + } return new ResolvedModuleRevision( mr.getResolver(), this, mr.getDescriptor(), mr.getReport(), mr.isForce()); } Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java?rev=688097&r1=688096&r2=688097&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/ChainResolverTest.java Fri Aug 22 08:32:18 2008 @@ -106,9 +106,9 @@ chain.setName("chain"); chain.setSettings(settings); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", false, null), - MockResolver.buildMockResolver("2", true, null), - MockResolver.buildMockResolver("3", true, null)}; + MockResolver.buildMockResolver(settings, "1", false, null), + MockResolver.buildMockResolver(settings, "2", true, null), + MockResolver.buildMockResolver(settings, "3", true, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -128,18 +128,19 @@ ChainResolver chain = new ChainResolver(); chain.setName("chain"); chain.setSettings(settings); - chain.setLatestStrategy(new LatestTimeStrategy()); + settings.setDefaultLatestStrategy(new LatestTimeStrategy()); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", true, new GregorianCalendar(2005, 1, 20) + MockResolver.buildMockResolver(settings, "1", true, new GregorianCalendar(2005, 1, 20) .getTime()), - MockResolver.buildMockResolver("2", false, null), - MockResolver.buildMockResolver("3", true, new GregorianCalendar(2005, 1, 25) + MockResolver.buildMockResolver(settings, "2", false, null), + MockResolver.buildMockResolver(settings, "3", true, new GregorianCalendar(2005, 1, 25) .getTime()), // younger -> should the one kept - MockResolver.buildMockResolver("4", false, null), - MockResolver.buildMockResolver("5", true, new GregorianCalendar(2005, 1, 22) + MockResolver.buildMockResolver(settings, "4", false, null), + MockResolver.buildMockResolver(settings, "5", true, new GregorianCalendar(2005, 1, 22) .getTime()), - MockResolver.buildMockResolver("6", true, new GregorianCalendar(2005, 1, 18) - .getTime()), MockResolver.buildMockResolver("7", false, null)}; + MockResolver.buildMockResolver(settings, "6", true, new GregorianCalendar(2005, 1, 18) + .getTime()), + MockResolver.buildMockResolver(settings, "7", false, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -162,19 +163,19 @@ chain.setSettings(settings); chain.setLatestStrategy(new LatestRevisionStrategy()); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "1", true, ModuleRevisionId.newInstance("org", "mod", "1"), new GregorianCalendar(2005, 1, 20).getTime()), - MockResolver.buildMockResolver("2", false, null), - MockResolver.buildMockResolver("3", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "2", false, null), + MockResolver.buildMockResolver(settings, "3", true, ModuleRevisionId.newInstance("org", "mod", "2"), new GregorianCalendar(2005, 1, 25).getTime()), - MockResolver.buildMockResolver("4", false, null), - MockResolver.buildMockResolver("5", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "4", false, null), + MockResolver.buildMockResolver(settings, "5", true, ModuleRevisionId.newInstance("org", "mod", "4"), new GregorianCalendar(2005, 1, 22).getTime()), // latest -> // should the // one kept - MockResolver.buildMockResolver("6", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "6", true, ModuleRevisionId.newInstance("org", "mod", "3"), new GregorianCalendar(2005, 1, 18).getTime()), - MockResolver.buildMockResolver("7", false, null)}; + MockResolver.buildMockResolver(settings, "7", false, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -197,20 +198,20 @@ chain.setSettings(settings); chain.setLatestStrategy(new LatestRevisionStrategy()); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", false, null), - MockResolver.buildMockResolver("2", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "1", false, null), + MockResolver.buildMockResolver(settings, "2", true, ModuleRevisionId.newInstance("org", "mod", "4"), new GregorianCalendar(2005, 1, 22).getTime(), true), // latest // -> // but // default - MockResolver.buildMockResolver("3", false, null), - MockResolver.buildMockResolver("4", false, null), - MockResolver.buildMockResolver("5", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "3", false, null), + MockResolver.buildMockResolver(settings, "4", false, null), + MockResolver.buildMockResolver(settings, "5", true, ModuleRevisionId.newInstance("org", "mod", "4"), new GregorianCalendar(2005, 1, 22).getTime()), // latest -> // should the // one kept - MockResolver.buildMockResolver("6", false, null), - MockResolver.buildMockResolver("7", false, null)}; + MockResolver.buildMockResolver(settings, "6", false, null), + MockResolver.buildMockResolver(settings, "7", false, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -236,23 +237,23 @@ chain.setSettings(settings); chain.setLatestStrategy(new LatestRevisionStrategy()); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "1", true, ModuleRevisionId.newInstance("org", "mod", "1"), new GregorianCalendar(2005, 1, 20).getTime()), - MockResolver.buildMockResolver("2", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "2", true, ModuleRevisionId.newInstance("org", "mod", "4"), new GregorianCalendar(2005, 1, 22).getTime(), true), // latest // -> // but // default - MockResolver.buildMockResolver("3", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "3", true, ModuleRevisionId.newInstance("org", "mod", "2"), new GregorianCalendar(2005, 1, 25).getTime()), - MockResolver.buildMockResolver("4", false, null), - MockResolver.buildMockResolver("5", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "4", false, null), + MockResolver.buildMockResolver(settings, "5", true, ModuleRevisionId.newInstance("org", "mod", "4"), new GregorianCalendar(2005, 1, 22).getTime()), // latest -> // should the // one kept - MockResolver.buildMockResolver("6", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "6", true, ModuleRevisionId.newInstance("org", "mod", "3"), new GregorianCalendar(2005, 1, 18).getTime()), - MockResolver.buildMockResolver("7", false, null)}; + MockResolver.buildMockResolver(settings, "7", false, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -275,15 +276,15 @@ chain.setSettings(settings); chain.setLatestStrategy(new LatestRevisionStrategy()); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", false, null), - MockResolver.buildMockResolver("2", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "1", false, null), + MockResolver.buildMockResolver(settings, "2", true, ModuleRevisionId.newInstance("org", "mod", "4"), new GregorianCalendar(2005, 1, 22).getTime(), true), // default - MockResolver.buildMockResolver("3", false, null), - MockResolver.buildMockResolver("4", true, ModuleRevisionId.newInstance("org", + MockResolver.buildMockResolver(settings, "3", false, null), + MockResolver.buildMockResolver(settings, "4", true, ModuleRevisionId.newInstance("org", "mod", "4"), new GregorianCalendar(2005, 1, 22).getTime()), // not default // -> should the // one kept - MockResolver.buildMockResolver("5", false, null)}; + MockResolver.buildMockResolver(settings, "5", false, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -352,7 +353,7 @@ chain.setName("chain"); chain.setSettings(settings); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", true, null)}; + MockResolver.buildMockResolver(settings, "1", true, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -369,16 +370,16 @@ chain.setReturnFirst(true); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", true, new GregorianCalendar(2005, 1, 20) + MockResolver.buildMockResolver(settings, "1", true, new GregorianCalendar(2005, 1, 20) .getTime()), - MockResolver.buildMockResolver("2", false, null), - MockResolver.buildMockResolver("3", true, new GregorianCalendar(2005, 1, 25) + MockResolver.buildMockResolver(settings, "2", false, null), + MockResolver.buildMockResolver(settings, "3", true, new GregorianCalendar(2005, 1, 25) .getTime()), // younger -> should the one kept - MockResolver.buildMockResolver("4", false, null), - MockResolver.buildMockResolver("5", true, new GregorianCalendar(2005, 1, 22) + MockResolver.buildMockResolver(settings, "4", false, null), + MockResolver.buildMockResolver(settings, "5", true, new GregorianCalendar(2005, 1, 22) .getTime()), - MockResolver.buildMockResolver("6", true, new GregorianCalendar(2005, 1, 18) - .getTime()), MockResolver.buildMockResolver("7", false, null)}; + MockResolver.buildMockResolver(settings, "6", true, new GregorianCalendar(2005, 1, 18) + .getTime()), MockResolver.buildMockResolver(settings, "7", false, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } @@ -485,9 +486,9 @@ chain.setSettings(settings); chain.setDual(true); MockResolver[] resolvers = new MockResolver[] { - MockResolver.buildMockResolver("1", false, null), - MockResolver.buildMockResolver("2", true, null), - MockResolver.buildMockResolver("3", true, null)}; + MockResolver.buildMockResolver(settings, "1", false, null), + MockResolver.buildMockResolver(settings, "2", true, null), + MockResolver.buildMockResolver(settings, "3", true, null)}; for (int i = 0; i < resolvers.length; i++) { chain.add(resolvers[i]); } Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/DualResolverTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/DualResolverTest.java?rev=688097&r1=688096&r2=688097&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/DualResolverTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/DualResolverTest.java Fri Aug 22 08:32:18 2008 @@ -103,9 +103,9 @@ public void testResolve() throws Exception { DualResolver dual = new DualResolver(); - MockResolver ivyResolver = MockResolver.buildMockResolver("ivy", true, + MockResolver ivyResolver = MockResolver.buildMockResolver(_settings, "ivy", true, new GregorianCalendar(2005, 1, 20).getTime()); - MockResolver artifactResolver = MockResolver.buildMockResolver("artifact", false, + MockResolver artifactResolver = MockResolver.buildMockResolver(_settings, "artifact", false, new GregorianCalendar(2005, 1, 20).getTime()); dual.setIvyResolver(ivyResolver); dual.setArtifactResolver(artifactResolver); @@ -121,9 +121,9 @@ public void testResolveFromArtifact() throws Exception { DualResolver dual = new DualResolver(); - MockResolver ivyResolver = MockResolver.buildMockResolver("ivy", false, + MockResolver ivyResolver = MockResolver.buildMockResolver(_settings, "ivy", false, new GregorianCalendar(2005, 1, 20).getTime()); - MockResolver artifactResolver = MockResolver.buildMockResolver("artifact", true, + MockResolver artifactResolver = MockResolver.buildMockResolver(_settings, "artifact", true, new GregorianCalendar(2005, 1, 20).getTime()); dual.setIvyResolver(ivyResolver); dual.setArtifactResolver(artifactResolver); @@ -139,9 +139,9 @@ public void testResolveFail() throws Exception { DualResolver dual = new DualResolver(); - MockResolver ivyResolver = MockResolver.buildMockResolver("ivy", false, + MockResolver ivyResolver = MockResolver.buildMockResolver(_settings, "ivy", false, new GregorianCalendar(2005, 1, 20).getTime()); - MockResolver artifactResolver = MockResolver.buildMockResolver("artifact", false, + MockResolver artifactResolver = MockResolver.buildMockResolver(_settings, "artifact", false, new GregorianCalendar(2005, 1, 20).getTime()); dual.setIvyResolver(ivyResolver); dual.setArtifactResolver(artifactResolver); Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/IBiblioResolverTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/IBiblioResolverTest.java?rev=688097&r1=688096&r2=688097&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/IBiblioResolverTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/IBiblioResolverTest.java Fri Aug 22 08:32:18 2008 @@ -18,9 +18,15 @@ package org.apache.ivy.plugins.resolver; import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.ivy.core.IvyContext; +import org.apache.ivy.core.IvyPatternHelper; import org.apache.ivy.core.event.EventManager; import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.DefaultArtifact; @@ -35,6 +41,9 @@ import org.apache.ivy.core.resolve.ResolveEngine; import org.apache.ivy.core.resolve.ResolveOptions; import org.apache.ivy.core.resolve.ResolvedModuleRevision; +import org.apache.ivy.core.search.ModuleEntry; +import org.apache.ivy.core.search.OrganisationEntry; +import org.apache.ivy.core.search.RevisionEntry; import org.apache.ivy.core.settings.IvySettings; import org.apache.ivy.core.sort.SortEngine; import org.apache.ivy.plugins.matcher.ExactPatternMatcher; @@ -194,6 +203,38 @@ assertEquals(DownloadStatus.NO, ar.getDownloadStatus()); } + public void testMaven2Listing() throws Exception { + IBiblioResolver resolver = new IBiblioResolver(); + resolver.setName("test"); + resolver.setSettings(_settings); + resolver.setM2compatible(true); + assertEquals("test", resolver.getName()); + + ModuleEntry[] modules = resolver.listModules(new OrganisationEntry(resolver, "commons-lang")); + assertNotNull(modules); + assertEquals(1, modules.length); + assertEquals("commons-lang", modules[0].getModule()); + + RevisionEntry[] revisions = resolver.listRevisions(modules[0]); + assertTrue(revisions.length > 0); + + Map otherTokenValues = new HashMap(); + otherTokenValues.put(IvyPatternHelper.ORGANISATION_KEY, "commons-lang"); + String[] values = resolver.listTokenValues(IvyPatternHelper.MODULE_KEY, otherTokenValues); + assertNotNull(values); + assertEquals(1, values.length); + assertEquals("commons-lang", values[0]); + + Map[] valuesMaps = resolver.listTokenValues(new String[] {IvyPatternHelper.MODULE_KEY}, otherTokenValues); + Set vals = new HashSet(); + for (int i = 0; i < valuesMaps.length; i++) { + vals.add(valuesMaps[i].get(IvyPatternHelper.MODULE_KEY)); + } + values = (String[]) vals.toArray(new String[vals.size()]); + assertEquals(1, values.length); + assertEquals("commons-lang", values[0]); + } + public void testErrorReport() throws Exception { IBiblioResolver resolver = new IBiblioResolver(); resolver.setRoot("http://unknown.host.comx/"); Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/MockResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/MockResolver.java?rev=688097&r1=688096&r2=688097&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/MockResolver.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/resolver/MockResolver.java Fri Aug 22 08:32:18 2008 @@ -38,21 +38,23 @@ import org.apache.ivy.plugins.resolver.util.ResolvedResource; public class MockResolver extends AbstractResolver { - static MockResolver buildMockResolver(String name, boolean findRevision, - final Date publicationDate) { - return buildMockResolver(name, findRevision, ModuleRevisionId.newInstance("test", "test", - "test"), publicationDate); + static MockResolver buildMockResolver(ResolverSettings settings, String name, + boolean findRevision, final Date publicationDate) { + return buildMockResolver(settings, name, findRevision, ModuleRevisionId.newInstance("test", + "test", "test"), publicationDate); } - static MockResolver buildMockResolver(String name, boolean findRevision, - final ModuleRevisionId mrid, final Date publicationDate) { - return buildMockResolver(name, findRevision, mrid, publicationDate, false); + static MockResolver buildMockResolver(ResolverSettings settings, String name, + boolean findRevision, final ModuleRevisionId mrid, final Date publicationDate) { + return buildMockResolver(settings, name, findRevision, mrid, publicationDate, false); } - static MockResolver buildMockResolver(String name, boolean findRevision, - final ModuleRevisionId mrid, final Date publicationDate, final boolean isdefault) { + static MockResolver buildMockResolver(ResolverSettings settings, String name, + boolean findRevision, final ModuleRevisionId mrid, final Date publicationDate, + final boolean isdefault) { final MockResolver r = new MockResolver(); r.setName(name); + r.setSettings(settings); if (findRevision) { DefaultModuleDescriptor md = new DefaultModuleDescriptor( mrid, "integration", publicationDate, isdefault); @@ -68,8 +70,26 @@ public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data) throws ParseException { + ResolvedModuleRevision mr = data.getCurrentResolvedModuleRevision(); + if (mr != null) { + if (shouldReturnResolvedModule(dd, mr)) { + return mr; + } + } askedDeps.add(dd); - return rmr; + return checkLatest(rmr, data); + } + + private boolean shouldReturnResolvedModule(DependencyDescriptor dd, ResolvedModuleRevision mr) { + // a resolved module revision has already been found by a prior dependency resolver + // let's see if it should be returned and bypass this resolver + + ModuleRevisionId mrid = dd.getDependencyRevisionId(); + boolean isDynamic = getSettings().getVersionMatcher().isDynamic(mrid); + boolean shouldReturn = mr.isForce(); + shouldReturn |= !isDynamic && !mr.getDescriptor().isDefault(); + + return shouldReturn; } public DownloadReport download(Artifact[] artifacts, DownloadOptions options) {