Author: maartenc Date: Tue Mar 18 15:13:04 2008 New Revision: 638606 URL: http://svn.apache.org/viewvc?rev=638606&view=rev Log: FIX: repreport task not working against a repository structured by branches (IVY-716)
Added: ant/ivy/core/trunk/test/repositories/IVY-716/ ant/ivy/core/trunk/test/repositories/IVY-716/ivysettings.xml ant/ivy/core/trunk/test/repositories/IVY-716/org1/ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/ivy.xml.txt ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/mod1.1.jar ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/ivy.xml.txt ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/mod1.1.jar Modified: ant/ivy/core/trunk/CHANGES.txt ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyRepositoryReport.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java ant/ivy/core/trunk/src/java/org/apache/ivy/core/search/SearchEngine.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/AbstractResourceResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DependencyResolver.java ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyRepositoryReportTest.java Modified: ant/ivy/core/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/CHANGES.txt (original) +++ ant/ivy/core/trunk/CHANGES.txt Tue Mar 18 15:13:04 2008 @@ -73,6 +73,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: repreport task not working against a repository structured by branches (IVY-716) - FIX: Ivy reports a conflict when the same file is supposed to be retrieved at the same location twice (or more) (IVY-743) - FIX: StackOverflowError when configuration extends itself (IVY-696) - FIX: XML schema ambiguity (IVY-750) Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyRepositoryReport.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyRepositoryReport.java?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyRepositoryReport.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/ant/IvyRepositoryReport.java Tue Mar 18 15:13:04 2008 @@ -20,12 +20,15 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import org.apache.ivy.Ivy; import org.apache.ivy.core.cache.ResolutionCacheManager; import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; +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.report.ResolveReport; @@ -87,18 +90,24 @@ ModuleRevisionId mrid = ModuleRevisionId.newInstance(organisation, module, revision); try { - ModuleId[] mids = ivy.listModules(new ModuleId(organisation, module), settings - .getMatcher(matcher)); - ModuleRevisionId[] mrids = new ModuleRevisionId[mids.length]; + ModuleRevisionId criteria = null; + + if ((revision == null) || settings.getVersionMatcher().isDynamic(mrid)) { + criteria = new ModuleRevisionId(new ModuleId(organisation, module), branch, "*"); + } else { + criteria = new ModuleRevisionId(new ModuleId(organisation, module), branch, revision); + } + + ModuleRevisionId[] mrids = ivy.listModules(criteria, settings.getMatcher(matcher)); + + // replace all found revisions with the original requested revision + Set modules = new HashSet(); for (int i = 0; i < mrids.length; i++) { - if (branch != null) { - mrids[i] = new ModuleRevisionId(mids[i], branch, revision); - } else { - mrids[i] = new ModuleRevisionId(mids[i], revision); - } + modules.add(ModuleRevisionId.newInstance(mrids[i], revision)); } - DefaultModuleDescriptor md = DefaultModuleDescriptor.newCallerInstance(mrids, true, - false); + + mrids = (ModuleRevisionId[]) modules.toArray(new ModuleRevisionId[modules.size()]); + ModuleDescriptor md = DefaultModuleDescriptor.newCallerInstance(mrids, true, false); String resolveId = ResolveOptions.getDefaultResolveId(md); ResolveReport report = ivy.resolve(md, new ResolveOptions() Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/IvyPatternHelper.java Tue Mar 18 15:13:04 2008 @@ -457,4 +457,19 @@ return pattern.substring(0, index); } } + + public static String getFirstToken(String pattern) { + if (pattern == null) { + return null; + } + int startIndex = pattern.indexOf('['); + if (startIndex == -1) { + return null; + } + int endIndex = pattern.indexOf(']', startIndex); + if (endIndex == -1) { + return null; + } + return pattern.substring(startIndex + 1, endIndex); + } } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/install/InstallEngine.java Tue Mar 18 15:13:04 2008 @@ -103,12 +103,11 @@ dd.addDependencyConfiguration("default", "*"); md.addDependency(dd); } else { - Collection mrids = searchEngine.findModuleRevisionIds(fromResolver, mrid, matcher); + ModuleRevisionId[] mrids = searchEngine.listModules(fromResolver, mrid, matcher); - for (Iterator iter = mrids.iterator(); iter.hasNext();) { - ModuleRevisionId foundMrid = (ModuleRevisionId) iter.next(); - Message.info("\tfound " + foundMrid + " to install: adding to the list"); - DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(md, foundMrid, + for (int i = 0; i < mrids.length; i++) { + Message.info("\tfound " + mrids[i] + " to install: adding to the list"); + DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(md, mrids[i], false, false, options.isTransitive()); dd.addDependencyConfiguration("default", "*"); md.addDependency(dd); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/search/SearchEngine.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/search/SearchEngine.java?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/core/search/SearchEngine.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/search/SearchEngine.java Tue Mar 18 15:13:04 2008 @@ -23,9 +23,9 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.ivy.core.IvyPatternHelper; import org.apache.ivy.core.module.id.ModuleId; @@ -55,90 +55,120 @@ * @return */ public String[] listTokenValues(String token, Map otherTokenValues) { - Collection r = new LinkedHashSet(); + Set entries = new HashSet(); + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); - r.addAll(Arrays.asList(resolver.listTokenValues(token, otherTokenValues))); + Map[] values = resolver.listTokenValues(new String[] {token}, new HashMap()); + for (int i = 0; i < values.length; i++) { + entries.add(values[i].get(token)); + } } - return (String[]) r.toArray(new String[r.size()]); + + return (String[]) entries.toArray(new String[entries.size()]); } public OrganisationEntry[] listOrganisationEntries() { - List entries = new ArrayList(); + Set entries = new HashSet(); + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); - entries.addAll(Arrays.asList(resolver.listOrganisations())); + Map[] orgs = resolver.listTokenValues(new String[] {IvyPatternHelper.ORGANISATION_KEY}, new HashMap()); + for (int i = 0; i < orgs.length; i++) { + String org = (String) orgs[i].get(IvyPatternHelper.ORGANISATION_KEY); + entries.add(new OrganisationEntry(resolver, org)); + } } + return (OrganisationEntry[]) entries.toArray(new OrganisationEntry[entries.size()]); } public String[] listOrganisations() { - Collection orgs = new HashSet(); + Set entries = new HashSet(); + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); - OrganisationEntry[] entries = resolver.listOrganisations(); - if (entries != null) { - for (int i = 0; i < entries.length; i++) { - if (entries[i] != null) { - orgs.add(entries[i].getOrganisation()); - } - } + Map[] orgs = resolver.listTokenValues(new String[] {IvyPatternHelper.ORGANISATION_KEY}, new HashMap()); + for (int i = 0; i < orgs.length; i++) { + entries.add(orgs[i].get(IvyPatternHelper.ORGANISATION_KEY)); } } - return (String[]) orgs.toArray(new String[orgs.size()]); + + return (String[]) entries.toArray(new String[entries.size()]); } public ModuleEntry[] listModuleEntries(OrganisationEntry org) { - List entries = new ArrayList(); + Set entries = new HashSet(); + + Map tokenValues = new HashMap(); + tokenValues.put(IvyPatternHelper.ORGANISATION_KEY, org.getOrganisation()); + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); - entries.addAll(Arrays.asList(resolver.listModules(org))); + Map[] modules = resolver.listTokenValues(new String[] {IvyPatternHelper.MODULE_KEY}, tokenValues); + for (int i = 0; i < modules.length; i++) { + String module = (String) modules[i].get(IvyPatternHelper.MODULE_KEY); + entries.add(new ModuleEntry(org, module)); + } } + return (ModuleEntry[]) entries.toArray(new ModuleEntry[entries.size()]); } public String[] listModules(String org) { - List mods = new ArrayList(); + Set entries = new HashSet(); + + Map tokenValues = new HashMap(); + tokenValues.put(IvyPatternHelper.ORGANISATION_KEY, org); + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); - ModuleEntry[] entries = resolver.listModules(new OrganisationEntry(resolver, org)); - if (entries != null) { - for (int i = 0; i < entries.length; i++) { - if (entries[i] != null) { - mods.add(entries[i].getModule()); - } - } + Map[] modules = resolver.listTokenValues(new String[] {IvyPatternHelper.MODULE_KEY}, tokenValues); + for (int i = 0; i < modules.length; i++) { + entries.add(modules[i].get(IvyPatternHelper.MODULE_KEY)); } } - return (String[]) mods.toArray(new String[mods.size()]); - } + return (String[]) entries.toArray(new String[entries.size()]); + } + public RevisionEntry[] listRevisionEntries(ModuleEntry module) { - List entries = new ArrayList(); + Set entries = new HashSet(); + + Map tokenValues = new HashMap(); + tokenValues.put(IvyPatternHelper.ORGANISATION_KEY, module.getOrganisation()); + tokenValues.put(IvyPatternHelper.MODULE_KEY, module.getModule()); + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); - entries.addAll(Arrays.asList(resolver.listRevisions(module))); + Map[] revisions = resolver.listTokenValues(new String[] {IvyPatternHelper.REVISION_KEY}, tokenValues); + for (int i = 0; i < revisions.length; i++) { + String revision = (String) revisions[i].get(IvyPatternHelper.REVISION_KEY); + entries.add(new RevisionEntry(module, revision)); + } } + return (RevisionEntry[]) entries.toArray(new RevisionEntry[entries.size()]); } public String[] listRevisions(String org, String module) { - List revs = new ArrayList(); + Set entries = new HashSet(); + + Map tokenValues = new HashMap(); + tokenValues.put(IvyPatternHelper.ORGANISATION_KEY, org); + tokenValues.put(IvyPatternHelper.MODULE_KEY, module); + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { DependencyResolver resolver = (DependencyResolver) iter.next(); - RevisionEntry[] entries = resolver.listRevisions(new ModuleEntry(new OrganisationEntry( - resolver, org), module)); - if (entries != null) { - for (int i = 0; i < entries.length; i++) { - if (entries[i] != null) { - revs.add(entries[i].getRevision()); - } - } + Map[] revisions = resolver.listTokenValues(new String[] {IvyPatternHelper.REVISION_KEY}, tokenValues); + for (int i = 0; i < revisions.length; i++) { + entries.add(revisions[i].get(IvyPatternHelper.REVISION_KEY)); } } - return (String[]) revs.toArray(new String[revs.size()]); - } + return (String[]) entries.toArray(new String[entries.size()]); + } + /** * List module ids of the module accessible through the current resolvers matching the given mid * criteria according to the given matcher. @@ -147,23 +177,26 @@ * @param matcher * @return */ - public ModuleId[] listModules(ModuleId criteria, PatternMatcher matcher) { + public ModuleId[] listModules(ModuleId moduleCrit, PatternMatcher matcher) { List ret = new ArrayList(); - Matcher orgMatcher = matcher.getMatcher(criteria.getOrganisation()); - Matcher modMatcher = matcher.getMatcher(criteria.getName()); - Map tokenValues = new HashMap(); - String[] orgs = listTokenValues(IvyPatternHelper.ORGANISATION_KEY, tokenValues); - for (int i = 0; i < orgs.length; i++) { - if (orgMatcher.matches(orgs[i])) { - tokenValues.put(IvyPatternHelper.ORGANISATION_KEY, orgs[i]); - String[] mods = listTokenValues(IvyPatternHelper.MODULE_KEY, tokenValues); - for (int j = 0; j < mods.length; j++) { - if (modMatcher.matches(mods[j])) { - ret.add(new ModuleId(orgs[i], mods[j])); - } - } + + Map criteria = new HashMap(); + addMatcher(matcher, moduleCrit.getOrganisation(), criteria, IvyPatternHelper.ORGANISATION_KEY); + addMatcher(matcher, moduleCrit.getName(), criteria, IvyPatternHelper.MODULE_KEY); + + String[] tokensToList = new String[] {IvyPatternHelper.ORGANISATION_KEY, IvyPatternHelper.MODULE_KEY}; + + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { + DependencyResolver resolver = (DependencyResolver) iter.next(); + Map[] moduleIdAsMap = resolver.listTokenValues(tokensToList, criteria); + for (int i = 0; i < moduleIdAsMap.length; i++) { + String org = (String) moduleIdAsMap[i].get(IvyPatternHelper.ORGANISATION_KEY); + String name = (String) moduleIdAsMap[i].get(IvyPatternHelper.MODULE_KEY); + ModuleId modId = ModuleId.newInstance(org, name); + ret.add(modId); } } + return (ModuleId[]) ret.toArray(new ModuleId[ret.size()]); } @@ -175,50 +208,68 @@ * @param matcher * @return */ - public ModuleRevisionId[] listModules(ModuleRevisionId criteria, PatternMatcher matcher) { + public ModuleRevisionId[] listModules(ModuleRevisionId moduleCrit, PatternMatcher matcher) { List ret = new ArrayList(); - Matcher orgMatcher = matcher.getMatcher(criteria.getOrganisation()); - Matcher modMatcher = matcher.getMatcher(criteria.getName()); - Matcher branchMatcher = matcher.getMatcher(criteria.getBranch()); - Matcher revMatcher = matcher.getMatcher(criteria.getRevision()); - Map tokenValues = new HashMap(); - String[] orgs = listTokenValues(IvyPatternHelper.ORGANISATION_KEY, tokenValues); - for (int i = 0; i < orgs.length; i++) { - if (orgMatcher.matches(orgs[i])) { - tokenValues.put(IvyPatternHelper.ORGANISATION_KEY, orgs[i]); - String[] mods = listTokenValues(IvyPatternHelper.MODULE_KEY, tokenValues); - for (int j = 0; j < mods.length; j++) { - if (modMatcher.matches(mods[j])) { - tokenValues.put(IvyPatternHelper.MODULE_KEY, mods[j]); - String[] branches = listTokenValues(IvyPatternHelper.BRANCH_KEY, - tokenValues); - if (branches == null || branches.length == 0) { - branches = new String[] {settings.getDefaultBranch(new ModuleId( - orgs[i], mods[j]))}; - } - for (int k = 0; k < branches.length; k++) { - if (branches[k] == null || branchMatcher.matches(branches[k])) { - tokenValues.put(IvyPatternHelper.BRANCH_KEY, tokenValues); - String[] revs = listTokenValues(IvyPatternHelper.REVISION_KEY, - tokenValues); - for (int l = 0; l < revs.length; l++) { - if (revMatcher.matches(revs[l])) { - ret.add(ModuleRevisionId.newInstance(orgs[i], mods[j], - branches[k], revs[l])); - } - } - tokenValues.remove(IvyPatternHelper.REVISION_KEY); - } - } - tokenValues.remove(IvyPatternHelper.BRANCH_KEY); - } - } - tokenValues.remove(IvyPatternHelper.MODULE_KEY); + + Map criteria = new HashMap(); + addMatcher(matcher, moduleCrit.getOrganisation(), criteria, IvyPatternHelper.ORGANISATION_KEY); + addMatcher(matcher, moduleCrit.getName(), criteria, IvyPatternHelper.MODULE_KEY); + addMatcher(matcher, moduleCrit.getBranch(), criteria, IvyPatternHelper.BRANCH_KEY); + addMatcher(matcher, moduleCrit.getRevision(), criteria, IvyPatternHelper.REVISION_KEY); + + String[] tokensToList = new String[] {IvyPatternHelper.ORGANISATION_KEY, IvyPatternHelper.MODULE_KEY, IvyPatternHelper.BRANCH_KEY, IvyPatternHelper.REVISION_KEY}; + + for (Iterator iter = settings.getResolvers().iterator(); iter.hasNext();) { + DependencyResolver resolver = (DependencyResolver) iter.next(); + Map[] moduleIdAsMap = resolver.listTokenValues(tokensToList, criteria); + for (int i = 0; i < moduleIdAsMap.length; i++) { + String org = (String) moduleIdAsMap[i].get(IvyPatternHelper.ORGANISATION_KEY); + String name = (String) moduleIdAsMap[i].get(IvyPatternHelper.MODULE_KEY); + String branch = (String) moduleIdAsMap[i].get(IvyPatternHelper.BRANCH_KEY); + String rev = (String) moduleIdAsMap[i].get(IvyPatternHelper.REVISION_KEY); + ModuleRevisionId modRevId = ModuleRevisionId.newInstance(org, name, branch, rev); + ret.add(modRevId); } } + return (ModuleRevisionId[]) ret.toArray(new ModuleRevisionId[ret.size()]); } + public ModuleRevisionId[] listModules(DependencyResolver resolver, ModuleRevisionId moduleCrit, PatternMatcher matcher) { + Map criteria = new HashMap(); + addMatcher(matcher, moduleCrit.getOrganisation(), criteria, IvyPatternHelper.ORGANISATION_KEY); + addMatcher(matcher, moduleCrit.getName(), criteria, IvyPatternHelper.MODULE_KEY); + addMatcher(matcher, moduleCrit.getBranch(), criteria, IvyPatternHelper.BRANCH_KEY); + addMatcher(matcher, moduleCrit.getRevision(), criteria, IvyPatternHelper.REVISION_KEY); + + String[] tokensToList = new String[] {IvyPatternHelper.ORGANISATION_KEY, IvyPatternHelper.MODULE_KEY, IvyPatternHelper.BRANCH_KEY, IvyPatternHelper.REVISION_KEY}; + + Map[] moduleIdAsMap = resolver.listTokenValues(tokensToList, criteria); + ModuleRevisionId[] result = new ModuleRevisionId[moduleIdAsMap.length]; + for (int i = 0; i < moduleIdAsMap.length; i++) { + String org = (String) moduleIdAsMap[i].get(IvyPatternHelper.ORGANISATION_KEY); + String name = (String) moduleIdAsMap[i].get(IvyPatternHelper.MODULE_KEY); + String branch = (String) moduleIdAsMap[i].get(IvyPatternHelper.BRANCH_KEY); + String rev = (String) moduleIdAsMap[i].get(IvyPatternHelper.REVISION_KEY); + result[i] = ModuleRevisionId.newInstance(org, name, branch, rev); + } + + return result; + } + + private void addMatcher(PatternMatcher patternMatcher, String expression, Map criteria, String key) { + if (expression == null) { + return; + } + + Matcher matcher = patternMatcher.getMatcher(expression); + if (matcher.isExact()) { + criteria.put(key, expression); + } else { + criteria.put(key, matcher); + } + } + public Collection findModuleRevisionIds(DependencyResolver resolver, ModuleRevisionId pattern, PatternMatcher matcher) { Collection mrids = new ArrayList(); 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=638606&r1=638605&r2=638606&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 Tue Mar 18 15:13:04 2008 @@ -155,6 +155,10 @@ return new String[0]; } + public Map[] listTokenValues(String[] tokens, Map criteria) { + return new Map[0]; + } + public OrganisationEntry[] listOrganisations() { return new OrganisationEntry[0]; } 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=638606&r1=638605&r2=638606&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 Tue Mar 18 15:13:04 2008 @@ -18,6 +18,7 @@ package org.apache.ivy.plugins.resolver; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -28,6 +29,7 @@ import java.util.ListIterator; import java.util.Map; import java.util.Set; +import java.util.Map.Entry; import org.apache.ivy.core.IvyContext; import org.apache.ivy.core.IvyPatternHelper; @@ -40,6 +42,7 @@ import org.apache.ivy.core.resolve.ResolveData; import org.apache.ivy.core.settings.IvyPattern; import org.apache.ivy.plugins.conflict.ConflictManager; +import org.apache.ivy.plugins.matcher.Matcher; import org.apache.ivy.plugins.resolver.util.MDResolvedResource; import org.apache.ivy.plugins.resolver.util.ResolvedResource; import org.apache.ivy.plugins.resolver.util.ResourceMDParser; @@ -238,6 +241,99 @@ filterNames(names); return names; } + + public Map[] listTokenValues(String[] tokens, Map criteria) { + Set result = new HashSet(); + + // use ivy patterns + List ivyPatterns = getIvyPatterns(); + Map tokenValues = new HashMap(criteria); + tokenValues.put(IvyPatternHelper.TYPE_KEY, "ivy"); + tokenValues.put(IvyPatternHelper.EXT_KEY, "xml"); + for (Iterator it = ivyPatterns.iterator(); it.hasNext(); ) { + String ivyPattern = (String) it.next(); + result.addAll(resolveTokenValues(tokens, ivyPattern, tokenValues, false)); + } + + if (isAllownomd()) { + List artifactPatterns = getArtifactPatterns(); + tokenValues = new HashMap(criteria); + tokenValues.put(IvyPatternHelper.TYPE_KEY, "jar"); + tokenValues.put(IvyPatternHelper.EXT_KEY, "jar"); + for (Iterator it = artifactPatterns.iterator(); it.hasNext(); ) { + String artifactPattern = (String) it.next(); + result.addAll(resolveTokenValues(tokens, artifactPattern, tokenValues, true)); + } + } + + return (Map[]) result.toArray(new Map[result.size()]); + } + + private Set resolveTokenValues(String[] tokens, String pattern, Map criteria, boolean noMd) { + Set result = new HashSet(); + Set tokenSet = new HashSet(Arrays.asList(tokens)); + + Map tokenValues = new HashMap(); + for (Iterator it = criteria.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = (Entry) it.next(); + Object key = entry.getKey(); + Object value = entry.getValue(); + if (value instanceof String) { + tokenValues.put(key, value); + } + } + + if (tokenSet.isEmpty()) { + // no more tokens to resolve + result.add(tokenValues); + return result; + } + + String partiallyResolvedPattern = IvyPatternHelper.substituteTokens(pattern, tokenValues); + String token = IvyPatternHelper.getFirstToken(partiallyResolvedPattern); + if ((token == null) && exist(partiallyResolvedPattern)) { + // no more tokens to resolve + result.add(tokenValues); + return result; + } + + tokenSet.remove(token); + + Matcher matcher = null; + Object criteriaForToken = criteria.get(token); + if (criteriaForToken instanceof Matcher) { + matcher = (Matcher) criteriaForToken; + } + + String[] values = listTokenValues(partiallyResolvedPattern, token); + if (values == null) { + return result; + } + + for (int i = 0; i < values.length; i++) { + if ((matcher != null) && !matcher.matches(values[i])) { + continue; + } + + tokenValues.put(token, values[i]); + String moreResolvedPattern = IvyPatternHelper.substituteTokens(partiallyResolvedPattern, tokenValues); + + Map newCriteria = new HashMap(criteria); + newCriteria.put(token, values[i]); + if (noMd && "artifact".equals(token)) { + newCriteria.put("module", values[i]); + } else if (noMd && "module".equals(token)) { + newCriteria.put("artifact", values[i]); + } + result.addAll(resolveTokenValues((String[]) tokenSet.toArray(new String[tokenSet.size()]), moreResolvedPattern, newCriteria, noMd)); + } + + return result; + } + + protected abstract String[] listTokenValues(String pattern, String token); + + protected abstract boolean exist(String path); /** * Filters names before returning them in the findXXXNames or findTokenValues method. Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DependencyResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DependencyResolver.java?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DependencyResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/DependencyResolver.java Tue Mar 18 15:13:04 2008 @@ -104,13 +104,15 @@ * bar from the org foo. */ String[] listTokenValues(String token, Map otherTokenValues); + + Map[] listTokenValues(String[] tokens, Map criteria); OrganisationEntry[] listOrganisations(); ModuleEntry[] listModules(OrganisationEntry org); RevisionEntry[] listRevisions(ModuleEntry module); - + void dumpSettings(); void setSettings(ResolverSettings settings); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java Tue Mar 18 15:13:04 2008 @@ -230,6 +230,19 @@ } } } + + protected String[] listTokenValues(String pattern, String token) { + return ResolverHelper.listTokenValues(repository, pattern, token); + } + + protected boolean exist(String path) { + try { + Resource resource = repository.getResource(path); + return resource.exists(); + } catch (IOException e) { + return false; + } + } public String getTypeName() { return "repository"; Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyRepositoryReportTest.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyRepositoryReportTest.java?rev=638606&r1=638605&r2=638606&view=diff ============================================================================== --- ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyRepositoryReportTest.java (original) +++ ant/ivy/core/trunk/test/java/org/apache/ivy/ant/IvyRepositoryReportTest.java Tue Mar 18 15:13:04 2008 @@ -17,10 +17,13 @@ */ package org.apache.ivy.ant; +import java.io.BufferedReader; import java.io.File; +import java.io.FileReader; import junit.framework.TestCase; +import org.apache.ivy.util.FileUtil; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Delete; @@ -55,36 +58,56 @@ del.execute(); } - public void test() { + public void testSimple() throws Exception { + report.setOrganisation("org1"); + report.setOutputname("testsimple"); + report.setTodir(cache); + report.execute(); + + File reportFile = new File(cache, "testsimple.xml"); + assertTrue(reportFile.exists()); + String g = FileUtil.readEntirely(new BufferedReader(new FileReader(reportFile))); + + // check presence of the modules + assertTrue(g.indexOf("<module organisation=\"org1\" name=\"mod1.1\"") != -1); + assertTrue(g.indexOf("<module organisation=\"org1\" name=\"mod1.2\"") != -1); + assertTrue(g.indexOf("<module organisation=\"org1\" name=\"mod1.3\"") != -1); + assertTrue(g.indexOf("<module organisation=\"org1\" name=\"mod1.4\"") != -1); + assertTrue(g.indexOf("<module organisation=\"org1\" name=\"mod1.5\"") != -1); + assertTrue(g.indexOf("<module organisation=\"org1\" name=\"mod1.6\"") != -1); + } + + public void testBranchBeforeModule() throws Exception { + report.getProject().setProperty("ivy.settings.file", "test/repositories/IVY-716/ivysettings.xml"); + report.setOutputname("testbranch"); + report.setTodir(cache); + report.execute(); + + File reportFile = new File(cache, "testbranch.xml"); + assertTrue(reportFile.exists()); + String g = FileUtil.readEntirely(new BufferedReader(new FileReader(reportFile))); + + // check presence of the modules + assertTrue(g.indexOf("<module organisation=\"org1\" name=\"mod1.1\"") != -1); + + // check presence of the branches + assertTrue(g.indexOf("<revision name=\"1.0\" branch=\"branch1\"") != -1); + assertTrue(g.indexOf("<revision name=\"1.0\" branch=\"branch2\"") != -1); + } + + public void testPatternWithoutOrganisation() throws Exception { + report.getProject().setProperty("ivy.settings.file", "test/repositories/IVY-729/ivysettings.xml"); + report.setOutputname("test-no-org"); + report.setTodir(cache); + report.execute(); + + File reportFile = new File(cache, "test-no-org.xml"); + assertTrue(reportFile.exists()); + String g = FileUtil.readEntirely(new BufferedReader(new FileReader(reportFile))); + + // check presence of the modules + assertTrue(g.indexOf("<module organisation=\"null\" name=\"a\"") != -1); + assertTrue(g.indexOf("<module organisation=\"null\" name=\"b\"") != -1); + assertTrue(g.indexOf("<module organisation=\"null\" name=\"c\"") != -1); } - - // no xslt transformation is possible in the junit test on our continuous integration server for - // the moment... - // public void testGraph() throws Exception { - // _report.setOrganisation("org1"); - // _report.setXml(false); - // _report.setGraph(true); - // _report.setTodir(_cache); - // _report.setOutputname("test-graph"); - // _report.execute(); - // File graphml = new File(_cache, "test-graph.graphml"); - // assertTrue(graphml.exists()); - // String g = FileUtil.readEntirely(new BufferedReader(new FileReader(graphml))); - // assertFalse(g.indexOf("caller") != -1); - // assertTrue(g.indexOf("mod1.1") != -1); - // } - // - // public void testDot() throws Exception { - // _report.setOrganisation("org1"); - // _report.setXml(false); - // _report.setDot(true); - // _report.setTodir(_cache); - // _report.setOutputname("test-graph"); - // _report.execute(); - // File dot = new File(_cache, "test-graph.dot"); - // assertTrue(dot.exists()); - // String g = FileUtil.readEntirely(new BufferedReader(new FileReader(dot))); - // assertFalse(g.indexOf("caller") != -1); - // assertTrue(g.indexOf("mod1.1") != -1); - // } } Added: ant/ivy/core/trunk/test/repositories/IVY-716/ivysettings.xml URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/IVY-716/ivysettings.xml?rev=638606&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/IVY-716/ivysettings.xml (added) +++ ant/ivy/core/trunk/test/repositories/IVY-716/ivysettings.xml Tue Mar 18 15:13:04 2008 @@ -0,0 +1,27 @@ +<!-- + 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. +--> +<ivysettings> + <settings defaultResolver="myresolver"/> + <resolvers> + <filesystem name="myresolver"> + <ivy pattern="${ivy.settings.dir}/[organisation]/[branch]/[module]/[revision]/ivy.xml" /> + <artifact pattern="${ivy.settings.dir}/[organisation]/[branch]/[module]/[revision]/[artifact].[ext]" /> + </filesystem> + </resolvers> +</ivysettings> Added: ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/ivy.xml.txt URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/ivy.xml.txt?rev=638606&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/ivy.xml.txt (added) +++ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/ivy.xml.txt Tue Mar 18 15:13:04 2008 @@ -0,0 +1,30 @@ +<!-- + 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. +--> +<ivy-module version="1.0"> + <info organisation="org1" + module="mod1.1" + revision="1.0" + branch="branch1" + status="integration" + publication="20041101110000" + /> + <dependencies> + <dependency name="mod1.2" rev="2.0"/> + </dependencies> +</ivy-module> Added: ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/mod1.1.jar URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/mod1.1.jar?rev=638606&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/mod1.1.jar (added) +++ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch1/mod1.1/1.0/mod1.1.jar Tue Mar 18 15:13:04 2008 @@ -0,0 +1 @@ + Added: ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/ivy.xml.txt URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/ivy.xml.txt?rev=638606&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/ivy.xml.txt (added) +++ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/ivy.xml.txt Tue Mar 18 15:13:04 2008 @@ -0,0 +1,30 @@ +<!-- + 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. +--> +<ivy-module version="1.0"> + <info organisation="org1" + module="mod1.1" + revision="1.0" + branch="branch2" + status="integration" + publication="20041101110000" + /> + <dependencies> + <dependency name="mod1.2" rev="2.0"/> + </dependencies> +</ivy-module> Added: ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/mod1.1.jar URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/mod1.1.jar?rev=638606&view=auto ============================================================================== --- ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/mod1.1.jar (added) +++ ant/ivy/core/trunk/test/repositories/IVY-716/org1/branch2/mod1.1/1.0/mod1.1.jar Tue Mar 18 15:13:04 2008 @@ -0,0 +1 @@ +