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) {