From 0905dc00459013e72c8eb7993c3dfe2987cdf794 Mon Sep 17 00:00:00 2001 From: Nicolas Lalevee Date: Thu, 6 Jan 2011 19:18:41 +0000 Subject: [PATCH] Try to make the code more generic about handling descriptor based repository git-svn-id: https://svn.apache.org/repos/asf/ant/ivy/core/trunk@1056016 13f79535-47bb-0310-9956-ffa450edef68 --- .../descriptor/DefaultModuleDescriptor.java | 167 ++++--- .../ivy/osgi/core/BundleInfoAdapter.java | 22 +- .../ExecutionEnvironmentProfile.java | 2 +- .../ExecutionEnvironmentProfileProvider.java | 23 +- .../org/apache/ivy/osgi/obr/OBRResolver.java | 4 +- .../apache/ivy/osgi/obr/xml/OBRXMLParser.java | 10 +- .../org/apache/ivy/osgi/repo/BundleRepo.java | 163 ------ .../ivy/osgi/repo/BundleRepoDescriptor.java | 85 ++++ .../apache/ivy/osgi/repo/RepoDescriptor.java | 105 ++++ ....java => RepoDescriptorBasedResolver.java} | 247 +++------- .../AbstractPatternsBasedResolver.java | 109 ----- .../ivy/plugins/resolver/BasicResolver.java | 462 +++++++++++------- ...ExecutionEnvironmentProfileLoaderTest.java | 1 - .../apache/ivy/osgi/obr/OBRParserTest.java | 6 +- .../apache/ivy/osgi/obr/OBRResolverTest.java | 4 +- .../apache/ivy/osgi/repo/BundleRepoTest.java | 25 +- test/test-repo/ivyrepo/repo.xml | 22 +- 17 files changed, 699 insertions(+), 758 deletions(-) rename src/java/org/apache/ivy/osgi/{repo => core}/ExecutionEnvironmentProfile.java (98%) delete mode 100644 src/java/org/apache/ivy/osgi/repo/BundleRepo.java create mode 100644 src/java/org/apache/ivy/osgi/repo/BundleRepoDescriptor.java create mode 100644 src/java/org/apache/ivy/osgi/repo/RepoDescriptor.java rename src/java/org/apache/ivy/osgi/repo/{BundleRepoResolver.java => RepoDescriptorBasedResolver.java} (65%) diff --git a/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java b/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java index 63d5ce6d..5594d93c 100644 --- a/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java +++ b/src/java/org/apache/ivy/core/module/descriptor/DefaultModuleDescriptor.java @@ -65,9 +65,9 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { public static DefaultModuleDescriptor newCallerInstance(ModuleRevisionId mrid, String[] confs, boolean transitive, boolean changing) { - DefaultModuleDescriptor moduleDescriptor = new DefaultModuleDescriptor(ModuleRevisionId - .newInstance(mrid.getOrganisation(), mrid.getName() + "-caller", "working"), - "integration", null, true); + DefaultModuleDescriptor moduleDescriptor = new DefaultModuleDescriptor( + ModuleRevisionId.newInstance(mrid.getOrganisation(), mrid.getName() + "-caller", + "working"), "integration", null, true); for (int i = 0; i < confs.length; i++) { moduleDescriptor.addConfiguration(new Configuration(confs[i])); } @@ -84,8 +84,9 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { public static DefaultModuleDescriptor newCallerInstance(ModuleRevisionId[] mrid, boolean transitive, boolean changing) { - DefaultModuleDescriptor moduleDescriptor = new DefaultModuleDescriptor(ModuleRevisionId - .newInstance("caller", "all-caller", "working"), "integration", null, true); + DefaultModuleDescriptor moduleDescriptor = new DefaultModuleDescriptor( + ModuleRevisionId.newInstance("caller", "all-caller", "working"), "integration", + null, true); moduleDescriptor.addConfiguration(new Configuration(DEFAULT_CONFIGURATION)); moduleDescriptor.setLastModified(System.currentTimeMillis()); for (int i = 0; i < mrid.length; i++) { @@ -105,9 +106,10 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { moduleDescriptor.addConfiguration(new Configuration(DEFAULT_CONFIGURATION)); if (artifacts != null && artifacts.length > 0) { for (int i = 0; i < artifacts.length; i++) { - moduleDescriptor.addArtifact(DEFAULT_CONFIGURATION, new MDArtifact( - moduleDescriptor, artifacts[i].getName(), artifacts[i].getType(), - artifacts[i].getExt(), artifacts[i].getUrl(), artifacts[i].getExtraAttributes())); + moduleDescriptor.addArtifact(DEFAULT_CONFIGURATION, + new MDArtifact(moduleDescriptor, artifacts[i].getName(), + artifacts[i].getType(), artifacts[i].getExt(), artifacts[i].getUrl(), + artifacts[i].getExtraAttributes())); } } else { moduleDescriptor.addArtifact(DEFAULT_CONFIGURATION, new MDArtifact(moduleDescriptor, @@ -122,8 +124,8 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { DefaultModuleDescriptor moduleDescriptor = new DefaultModuleDescriptor(mrid, "release", publicationDate, false); moduleDescriptor.addConfiguration(new Configuration(DEFAULT_CONFIGURATION)); - moduleDescriptor.addArtifact(DEFAULT_CONFIGURATION, new MDArtifact(moduleDescriptor, mrid - .getName(), "jar", "jar")); + moduleDescriptor.addArtifact(DEFAULT_CONFIGURATION, + new MDArtifact(moduleDescriptor, mrid.getName(), "jar", "jar")); return moduleDescriptor; } @@ -153,8 +155,8 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { for (int i = 0; i < ed.length; ++i) { ModuleRevisionId mrid = t.transform(ed[i].getParentRevisionId()); ModuleRevisionId resolvedMrid = t.transform(ed[i].getResolvedParentRevisionId()); - nmd.inheritedDescriptors.add(new DefaultExtendsDescriptor(mrid, resolvedMrid, - ed[i].getLocation(), ed[i].getExtendsTypes())); + nmd.inheritedDescriptors.add(new DefaultExtendsDescriptor(mrid, resolvedMrid, ed[i] + .getLocation(), ed[i].getExtendsTypes())); } DependencyDescriptor[] dd = md.getDependencies(); @@ -173,12 +175,12 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { if (md instanceof DefaultModuleDescriptor) { DefaultModuleDescriptor dmd = (DefaultModuleDescriptor) md; nmd.conflictManagers = (ModuleRules) dmd.conflictManagers.clone(); - nmd.dependencyDescriptorMediators = - (ModuleRules) dmd.dependencyDescriptorMediators.clone(); + nmd.dependencyDescriptorMediators = (ModuleRules) dmd.dependencyDescriptorMediators + .clone(); } else { - Message.warn( - "transformed module descriptor is not a default module descriptor: " - + "impossible to copy conflict manager and version mediation configuration: " + md); + Message.warn("transformed module descriptor is not a default module descriptor: " + + "impossible to copy conflict manager and version mediation configuration: " + + md); } nmd.licenses.addAll(Arrays.asList(md.getLicenses())); nmd.homePage = md.getHomePage(); @@ -207,15 +209,16 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { private Map artifactsByConf = new HashMap(); // Map (String conf -> Collection(Artifact)) - private Collection artifacts = new LinkedHashSet(); // Collection(Artifact) + private Collection artifacts = new LinkedHashSet(); // Collection(Artifact) + // all artifacts could also be found in the artifactsByConf map, but here we can // preserve the order private boolean isDefault = false; - private ModuleRules conflictManagers = new ModuleRules(); - - private ModuleRules dependencyDescriptorMediators = new ModuleRules(); + private ModuleRules conflictManagers = new ModuleRules(); + + private ModuleRules dependencyDescriptorMediators = new ModuleRules(); private List licenses = new ArrayList(); // List(License) @@ -232,16 +235,16 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { private ModuleDescriptorParser parser; private Resource resource; - + private List excludeRules = new ArrayList(); // List(ExcludeRule) private Artifact metadataArtifact; - private List inheritedDescriptors = new ArrayList(); //List(ExtendsDescriptor) - - private Map/**/ extraAttributesNamespaces = new LinkedHashMap(); + private List inheritedDescriptors = new ArrayList(); // List(ExtendsDescriptor) - private Map/**/ extraInfo = new HashMap(); + private Map/* */extraAttributesNamespaces = new LinkedHashMap(); + + private Map/* */extraInfo = new HashMap(); public DefaultModuleDescriptor(ModuleRevisionId id, String status, Date pubDate) { this(id, status, pubDate, false); @@ -272,15 +275,15 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { this.parser = parser; resource = res; } - + public Artifact getMetadataArtifact() { if (metadataArtifact == null) { - metadataArtifact = DefaultArtifact.newIvyArtifact( - resolvedRevId, resolvedPublicationDate); + metadataArtifact = DefaultArtifact.newIvyArtifact(resolvedRevId, + resolvedPublicationDate); } return metadataArtifact; } - + public void setModuleArtifact(Artifact moduleArtifact) { this.metadataArtifact = moduleArtifact; } @@ -310,7 +313,7 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { public Date getResolvedPublicationDate() { return resolvedPublicationDate; } - + public String getRevision() { return getResolvedModuleRevisionId().getRevision(); } @@ -355,8 +358,9 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { public void addArtifact(String conf, Artifact artifact) { Configuration c = getConfiguration(conf); if (c == null) { - throw new IllegalArgumentException("Cannot add artifact '" + artifact.getId().getArtifactId().getShortDescription() - + "' to configuration '" + conf + "' of module " + revId + throw new IllegalArgumentException("Cannot add artifact '" + + artifact.getId().getArtifactId().getShortDescription() + + "' to configuration '" + conf + "' of module " + revId + " because this configuration doesn't exist!"); } if (c instanceof ConfigurationGroup) { @@ -389,8 +393,8 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { } public ExtendsDescriptor[] getInheritedDescriptors() { - return (ExtendsDescriptor[]) inheritedDescriptors.toArray( - new ExtendsDescriptor[inheritedDescriptors.size()]); + return (ExtendsDescriptor[]) inheritedDescriptors + .toArray(new ExtendsDescriptor[inheritedDescriptors.size()]); } public Configuration[] getConfigurations() { @@ -427,7 +431,7 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { String attValue = m.group(2); // this is a conf group, let's search for its members - Map /**/ members = new LinkedHashMap(); + Map /* */members = new LinkedHashMap(); for (Iterator it = configurations.values().iterator(); it.hasNext();) { Configuration conf = (Configuration) it.next(); if (attValue.equals(conf.getAttribute(attName))) { @@ -436,19 +440,18 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { } return new ConfigurationGroup(confName, members); } - + // let's see if a configuration intersection is requested String[] confs = confName.split("\\+"); if (confs.length <= 1) { return null; } - Map /**/ intersectedConfs = new LinkedHashMap(); + Map /* */intersectedConfs = new LinkedHashMap(); for (int i = 0; i < confs.length; i++) { Configuration c = (Configuration) configurations.get(confs[i]); if (c == null) { - Message.verbose( - "missing configuration '" + confs[i] - + "' from intersection " + confName + " in " + this); + Message.verbose("missing configuration '" + confs[i] + "' from intersection " + + confName + " in " + this); return null; } intersectedConfs.put(confs[i], c); @@ -467,7 +470,7 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { if (c instanceof ConfigurationIntersection) { ConfigurationIntersection intersection = (ConfigurationIntersection) c; String[] intersected = intersection.getIntersectedConfigurationNames(); - Set/**/ intersectedArtifacts = new LinkedHashSet(); + Set/* */intersectedArtifacts = new LinkedHashSet(); for (int j = 0; j < intersected.length; j++) { Collection arts = getArtifactsIncludingExtending(intersected[j]); if (intersectedArtifacts.isEmpty()) { @@ -479,12 +482,12 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { if (artifacts != null) { intersectedArtifacts.addAll(artifacts); } - return (Artifact[]) intersectedArtifacts.toArray( - new Artifact[intersectedArtifacts.size()]); + return (Artifact[]) intersectedArtifacts.toArray(new Artifact[intersectedArtifacts + .size()]); } else if (c instanceof ConfigurationGroup) { ConfigurationGroup group = (ConfigurationGroup) c; String[] members = group.getMembersConfigurationNames(); - Set/**/ groupArtifacts = new LinkedHashSet(); + Set/* */groupArtifacts = new LinkedHashSet(); for (int i = 0; i < members.length; i++) { groupArtifacts.addAll(getArtifactsIncludingExtending(members[i])); } @@ -501,10 +504,10 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { } } - private Collection/**/ getArtifactsIncludingExtending(String conf) { - Collection extendingConfs = Configuration.findConfigurationExtending( - conf, getConfigurations()); - Set/**/ artifacts = new LinkedHashSet(); + private Collection/* */getArtifactsIncludingExtending(String conf) { + Collection extendingConfs = Configuration.findConfigurationExtending(conf, + getConfigurations()); + Set/* */artifacts = new LinkedHashSet(); Collection arts = (Collection) artifactsByConf.get(conf); if (arts != null) { artifacts.addAll(arts); @@ -524,8 +527,8 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { } public DependencyDescriptor[] getDependencies() { - return (DependencyDescriptor[]) dependencies - .toArray(new DependencyDescriptor[dependencies.size()]); + return (DependencyDescriptor[]) dependencies.toArray(new DependencyDescriptor[dependencies + .size()]); } public boolean dependsOn(VersionMatcher matcher, ModuleDescriptor md) { @@ -550,6 +553,34 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { } } + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((revId == null) ? 0 : revId.hashCode()); + return result; + } + + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + DefaultModuleDescriptor other = (DefaultModuleDescriptor) obj; + if (revId == null) { + if (other.revId != null) { + return false; + } + } else if (!revId.equals(other.revId)) { + return false; + } + return true; + } + public String toString() { return "module: " + revId + " status=" + status + " publication=" + publicationDate + " configurations=" + configurations + " artifacts=" + artifactsByConf @@ -576,13 +607,13 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { public ConflictManager getConflictManager(ModuleId moduleId) { return (ConflictManager) conflictManagers.getRule(moduleId); } - + public void addDependencyDescriptorMediator(ModuleId moduleId, PatternMatcher matcher, DependencyDescriptorMediator ddm) { - dependencyDescriptorMediators.defineRule( - new MapMatcher(moduleId.getAttributes(), matcher), ddm); + dependencyDescriptorMediators.defineRule(new MapMatcher(moduleId.getAttributes(), matcher), + ddm); } - + public DependencyDescriptor mediate(DependencyDescriptor dd) { Object[] mediators = dependencyDescriptorMediators.getRules(dd.getDependencyId()); for (int i = 0; i < mediators.length; i++) { @@ -591,7 +622,7 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { return dd; } - public ModuleRules/**/ getAllDependencyDescriptorMediators() { + public ModuleRules/* */getAllDependencyDescriptorMediators() { return (ModuleRules) dependencyDescriptorMediators.clone(); } @@ -610,11 +641,11 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { public void setHomePage(String homePage) { this.homePage = homePage; } - + public String getDescription() { return description; } - + public void setDescription(String description) { this.description = description; } @@ -646,8 +677,8 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { } /** - * Throws an exception if the module descriptor is inconsistent - * For the moment, only extended configurations existence and cycles are checked + * Throws an exception if the module descriptor is inconsistent For the moment, only extended + * configurations existence and cycles are checked */ public void check() { Stack confs = new Stack(); @@ -670,8 +701,8 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { cycle.append(confs.get(index)).append(" => "); } cycle.append(confName); - throw new IllegalStateException( - "illegal cycle detected in configuration extension: " + cycle); + throw new IllegalStateException("illegal cycle detected in configuration extension: " + + cycle); } Configuration conf = getConfiguration(confName); if (conf == null) { @@ -714,8 +745,6 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { return resolvedRevId.getQualifiedExtraAttributes(); } - - public ModuleDescriptorParser getParser() { return parser; } @@ -738,8 +767,8 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { */ public boolean doesExclude(String[] moduleConfigurations, ArtifactId artifactId) { if (namespace != null) { - artifactId = NameSpaceHelper.transform(artifactId, namespace - .getFromSystemTransformer()); + artifactId = NameSpaceHelper + .transform(artifactId, namespace.getFromSystemTransformer()); } ExcludeRule[] rules = getExcludeRules(moduleConfigurations); for (int i = 0; i < rules.length; i++) { @@ -769,7 +798,7 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { private boolean containsAny(String[] arr1, String[] arr2) { return new ArrayList(Arrays.asList(arr1)).removeAll(Arrays.asList(arr2)); } - + public Map getExtraAttributesNamespaces() { return extraAttributesNamespaces; } @@ -778,12 +807,10 @@ public class DefaultModuleDescriptor implements ModuleDescriptor { extraAttributesNamespaces.put(prefix, namespace); } - - public void addExtraInfo(String infoKey, String value) { extraInfo.put(infoKey, value); } - + public Map getExtraInfo() { return extraInfo; } diff --git a/src/java/org/apache/ivy/osgi/core/BundleInfoAdapter.java b/src/java/org/apache/ivy/osgi/core/BundleInfoAdapter.java index 4cf76689..41295532 100644 --- a/src/java/org/apache/ivy/osgi/core/BundleInfoAdapter.java +++ b/src/java/org/apache/ivy/osgi/core/BundleInfoAdapter.java @@ -37,7 +37,6 @@ import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; import org.apache.ivy.core.module.id.ArtifactId; import org.apache.ivy.core.module.id.ModuleId; import org.apache.ivy.core.module.id.ModuleRevisionId; -import org.apache.ivy.osgi.repo.ExecutionEnvironmentProfile; import org.apache.ivy.osgi.util.Version; import org.apache.ivy.osgi.util.VersionRange; import org.apache.ivy.plugins.matcher.ExactOrRegexpPatternMatcher; @@ -197,7 +196,7 @@ public class BundleInfoAdapter { return builder.toString(); } - private static DefaultArtifact decodeIvyLocation(String uri) { + private static DefaultArtifact decodeIvyLocation(final String uri) { String org = null; String name = null; String branch = null; @@ -206,24 +205,27 @@ public class BundleInfoAdapter { String type = null; String ext = null; - uri = uri.substring(6); - int i = uri.indexOf('/'); + String u = uri.substring(6); + int i = u.indexOf('/'); if (i < 0) { throw new IllegalArgumentException("Expecting an organisation in the ivy uri: " + uri); } - org = uri.substring(0, i); - uri = uri.substring(i + 1); + org = u.substring(0, i); + u = u.substring(i + 1); - i = uri.indexOf('?'); + i = u.indexOf('?'); if (i < 0) { throw new IllegalArgumentException("Expecting an module name in the ivy uri: " + uri); } - name = uri.substring(0, i); - uri = uri.substring(i + 1); + name = u.substring(0, i); + u = u.substring(i + 1); - String[] parameters = uri.split("&"); + String[] parameters = u.split("&"); for (int j = 0; j < parameters.length; j++) { String parameter = parameters[j]; + if (parameter.length() == 0) { + continue; + } String[] nameAndValue = parameter.split("="); if (nameAndValue.length != 2) { throw new IllegalArgumentException("Malformed query string in the ivy uri: " + uri); diff --git a/src/java/org/apache/ivy/osgi/repo/ExecutionEnvironmentProfile.java b/src/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfile.java similarity index 98% rename from src/java/org/apache/ivy/osgi/repo/ExecutionEnvironmentProfile.java rename to src/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfile.java index 2537b03a..dc55da76 100644 --- a/src/java/org/apache/ivy/osgi/repo/ExecutionEnvironmentProfile.java +++ b/src/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfile.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.ivy.osgi.repo; +package org.apache.ivy.osgi.core; import java.util.Set; import java.util.TreeSet; diff --git a/src/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileProvider.java b/src/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileProvider.java index bb095a1c..88e6edf3 100644 --- a/src/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileProvider.java +++ b/src/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileProvider.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Properties; -import org.apache.ivy.osgi.repo.ExecutionEnvironmentProfile; import org.apache.ivy.util.Message; public class ExecutionEnvironmentProfileProvider { @@ -37,6 +36,20 @@ public class ExecutionEnvironmentProfileProvider { private Map/* */profileList; + private static final ExecutionEnvironmentProfileProvider INSTANCE; + + static { + try { + INSTANCE = new ExecutionEnvironmentProfileProvider(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static ExecutionEnvironmentProfileProvider getInstance() { + return INSTANCE; + } + public ExecutionEnvironmentProfileProvider() throws IOException { profileList = loadDefaultProfileList(); } @@ -76,10 +89,10 @@ public class ExecutionEnvironmentProfileProvider { } private static ExecutionEnvironmentProfile loadProfile(Properties props, Map/* - * - */profiles, + * + */profiles, String name) { ExecutionEnvironmentProfile profile = new ExecutionEnvironmentProfile(name); diff --git a/src/java/org/apache/ivy/osgi/obr/OBRResolver.java b/src/java/org/apache/ivy/osgi/obr/OBRResolver.java index 60db89e6..077b0dd6 100644 --- a/src/java/org/apache/ivy/osgi/obr/OBRResolver.java +++ b/src/java/org/apache/ivy/osgi/obr/OBRResolver.java @@ -32,8 +32,8 @@ import org.apache.ivy.core.module.descriptor.DefaultArtifact; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.ArtifactDownloadReport; import org.apache.ivy.osgi.obr.xml.OBRXMLParser; -import org.apache.ivy.osgi.repo.BundleRepoResolver; import org.apache.ivy.osgi.repo.RelativeURLRepository; +import org.apache.ivy.osgi.repo.RepoDescriptorBasedResolver; import org.apache.ivy.plugins.repository.ArtifactResourceResolver; import org.apache.ivy.plugins.repository.Resource; import org.apache.ivy.plugins.repository.ResourceDownloader; @@ -43,7 +43,7 @@ import org.apache.ivy.plugins.resolver.util.ResolvedResource; import org.apache.ivy.util.FileUtil; import org.xml.sax.SAXException; -public class OBRResolver extends BundleRepoResolver { +public class OBRResolver extends RepoDescriptorBasedResolver { private String repoXmlURL; diff --git a/src/java/org/apache/ivy/osgi/obr/xml/OBRXMLParser.java b/src/java/org/apache/ivy/osgi/obr/xml/OBRXMLParser.java index 7f227ea4..ac5e4c6b 100644 --- a/src/java/org/apache/ivy/osgi/obr/xml/OBRXMLParser.java +++ b/src/java/org/apache/ivy/osgi/obr/xml/OBRXMLParser.java @@ -24,8 +24,9 @@ import java.text.ParseException; import javax.xml.parsers.ParserConfigurationException; import org.apache.ivy.osgi.core.BundleInfo; +import org.apache.ivy.osgi.core.ExecutionEnvironmentProfileProvider; import org.apache.ivy.osgi.obr.filter.RequirementFilterParser; -import org.apache.ivy.osgi.repo.BundleRepo; +import org.apache.ivy.osgi.repo.BundleRepoDescriptor; import org.apache.ivy.osgi.util.DelegetingHandler; import org.apache.ivy.osgi.util.Version; import org.apache.ivy.util.Message; @@ -82,7 +83,8 @@ public class OBRXMLParser { static final String FALSE = "false"; - public static BundleRepo parse(InputStream in) throws ParseException, IOException, SAXException { + public static BundleRepoDescriptor parse(InputStream in) throws ParseException, IOException, + SAXException { RepositoryHandler handler = new RepositoryHandler(); try { XMLHelper.parse(in, null, handler, null); @@ -96,7 +98,7 @@ public class OBRXMLParser { private static class RepositoryHandler extends DelegetingHandler/* > */{ - BundleRepo repo; + BundleRepoDescriptor repo; public RepositoryHandler() { super(REPOSITORY, null); @@ -104,7 +106,7 @@ public class OBRXMLParser { } protected void handleAttributes(Attributes atts) { - repo = new BundleRepo(); + repo = new BundleRepoDescriptor(ExecutionEnvironmentProfileProvider.getInstance()); repo.setName(atts.getValue(REPOSITORY_NAME)); diff --git a/src/java/org/apache/ivy/osgi/repo/BundleRepo.java b/src/java/org/apache/ivy/osgi/repo/BundleRepo.java deleted file mode 100644 index bbbfac26..00000000 --- a/src/java/org/apache/ivy/osgi/repo/BundleRepo.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.ivy.osgi.repo; - -import java.text.ParseException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.ivy.osgi.core.BundleCapability; -import org.apache.ivy.osgi.core.BundleInfo; -import org.apache.ivy.osgi.core.ManifestParser; -import org.apache.ivy.osgi.util.Version; -import org.apache.ivy.util.Message; - -public class BundleRepo { - - private String name; - - private Long lastModified; - - private final Set/* */bundles = new HashSet/* */(); - - private final Map/* >> */bundleByCapabilities = new HashMap/* - * < - * String - * , - * Map - * < - * String - * , - * Set - * < - * BundleCapabilityAndLocation - * >>> - */(); - - public BundleRepo() { - // default constructor - } - - public BundleRepo(Iterator/* */it) { - populate(it); - } - - public void setName(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setLastModified(Long lastModified) { - this.lastModified = lastModified; - } - - public Long getLastModified() { - return lastModified; - } - - public void populate(Iterator/* */it) { - while (it.hasNext()) { - ManifestAndLocation manifestAndLocation = (ManifestAndLocation) it.next(); - try { - BundleInfo bundleInfo = ManifestParser.parseManifest(manifestAndLocation - .getManifest()); - bundleInfo.setUri(manifestAndLocation.getLocation()); - addBundle(bundleInfo); - } catch (ParseException e) { - Message.error("Rejected " + manifestAndLocation.getLocation() + ": " - + e.getMessage()); - } - } - } - - public void addBundle(BundleInfo bundleInfo) { - bundles.add(bundleInfo); - populateCapabilities(BundleInfo.BUNDLE_TYPE, bundleInfo.getSymbolicName(), - bundleInfo.getVersion(), bundleInfo); - Iterator itCapability = bundleInfo.getCapabilities().iterator(); - while (itCapability.hasNext()) { - BundleCapability capability = (BundleCapability) itCapability.next(); - populateCapabilities(capability.getType(), capability.getName(), - capability.getVersion(), bundleInfo); - } - } - - private void populateCapabilities(String type, String n, Version version, BundleInfo bundleInfo) { - Map/* > */map = (Map) bundleByCapabilities - .get(type); - if (map == null) { - map = new HashMap/* > */(); - bundleByCapabilities.put(type, map); - } - Set/* */bundleReferences = (Set) map.get(n); - if (bundleReferences == null) { - bundleReferences = new HashSet/* */(); - map.put(n, bundleReferences); - } - if (!bundleReferences.add(new BundleCapabilityAndLocation(type, n, version, bundleInfo))) { - Message.warn("The repo did already contains " + n + "#" + version); - } - } - - public Set/* */getBundles() { - return bundles; - } - - public Map/* >> */getBundleByCapabilities() { - return bundleByCapabilities; - } - - public String toString() { - return bundles.toString(); - } - - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((bundles == null) ? 0 : bundles.hashCode()); - return result; - } - - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof BundleRepo)) { - return false; - } - BundleRepo other = (BundleRepo) obj; - if (bundles == null) { - if (other.bundles != null) { - return false; - } - } else if (!bundles.equals(other.bundles)) { - return false; - } - return true; - } - -} diff --git a/src/java/org/apache/ivy/osgi/repo/BundleRepoDescriptor.java b/src/java/org/apache/ivy/osgi/repo/BundleRepoDescriptor.java new file mode 100644 index 00000000..f47a5ccb --- /dev/null +++ b/src/java/org/apache/ivy/osgi/repo/BundleRepoDescriptor.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.ivy.osgi.repo; + +import java.text.ParseException; +import java.util.Iterator; + +import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; +import org.apache.ivy.osgi.core.BundleCapability; +import org.apache.ivy.osgi.core.BundleInfo; +import org.apache.ivy.osgi.core.BundleInfoAdapter; +import org.apache.ivy.osgi.core.ExecutionEnvironmentProfileProvider; +import org.apache.ivy.osgi.core.ManifestParser; +import org.apache.ivy.util.Message; + +public class BundleRepoDescriptor extends RepoDescriptor { + + private String name; + + private Long lastModified; + + private final ExecutionEnvironmentProfileProvider profileProvider; + + public BundleRepoDescriptor(ExecutionEnvironmentProfileProvider profileProvider) { + this.profileProvider = profileProvider; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setLastModified(Long lastModified) { + this.lastModified = lastModified; + } + + public Long getLastModified() { + return lastModified; + } + + public void populate(Iterator/* */it) { + while (it.hasNext()) { + ManifestAndLocation manifestAndLocation = (ManifestAndLocation) it.next(); + try { + BundleInfo bundleInfo = ManifestParser.parseManifest(manifestAndLocation + .getManifest()); + bundleInfo.setUri(manifestAndLocation.getLocation()); + addBundle(bundleInfo); + } catch (ParseException e) { + Message.error("Rejected " + manifestAndLocation.getLocation() + ": " + + e.getMessage()); + } + } + } + + public void addBundle(BundleInfo bundleInfo) { + DefaultModuleDescriptor md = BundleInfoAdapter.toModuleDescriptor(bundleInfo, + profileProvider); + add(BundleInfo.BUNDLE_TYPE, bundleInfo.getSymbolicName(), md); + Iterator itCapability = bundleInfo.getCapabilities().iterator(); + while (itCapability.hasNext()) { + BundleCapability capability = (BundleCapability) itCapability.next(); + add(capability.getType(), capability.getName(), md); + } + } + +} diff --git a/src/java/org/apache/ivy/osgi/repo/RepoDescriptor.java b/src/java/org/apache/ivy/osgi/repo/RepoDescriptor.java new file mode 100644 index 00000000..c4aac99c --- /dev/null +++ b/src/java/org/apache/ivy/osgi/repo/RepoDescriptor.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.ivy.osgi.repo; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.ivy.core.module.descriptor.ModuleDescriptor; +import org.apache.ivy.util.Message; + +public class RepoDescriptor { + + private final Map/* >> */moduleByCapbilities = new HashMap(); + + private final Set/* */modules = new HashSet(); + + public Set getModules() { + return modules; + } + + public Set/* */findModule(String requirement, String value) { + Map/* > */modules = (Map) moduleByCapbilities + .get(requirement); + if (modules == null) { + return null; + } + return (Set) modules.get(value); + } + + public Set/* */getCapabilityValues(String capabilityName) { + Map/* > */modules = (Map) moduleByCapbilities + .get(capabilityName); + if (modules == null) { + return null; + } + return (Set) modules.keySet(); + } + + public void add(String type, String value, ModuleDescriptor md) { + modules.add(md); + Map/* > */map = (Map) moduleByCapbilities.get(type); + if (map == null) { + map = new HashMap/* > */(); + moduleByCapbilities.put(type, map); + } + Set/* */bundleReferences = (Set) map.get(value); + if (bundleReferences == null) { + bundleReferences = new HashSet/* */(); + map.put(value, bundleReferences); + } + if (!bundleReferences.add(md)) { + Message.warn("The repo did already contains " + md); + } + } + + public String toString() { + return modules.toString(); + } + + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((modules == null) ? 0 : modules.hashCode()); + return result; + } + + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + RepoDescriptor other = (RepoDescriptor) obj; + if (modules == null) { + if (other.modules != null) { + return false; + } + } else if (!modules.equals(other.modules)) { + return false; + } + return true; + } + +} diff --git a/src/java/org/apache/ivy/osgi/repo/BundleRepoResolver.java b/src/java/org/apache/ivy/osgi/repo/RepoDescriptorBasedResolver.java similarity index 65% rename from src/java/org/apache/ivy/osgi/repo/BundleRepoResolver.java rename to src/java/org/apache/ivy/osgi/repo/RepoDescriptorBasedResolver.java index 0c824595..cad1a80e 100644 --- a/src/java/org/apache/ivy/osgi/repo/BundleRepoResolver.java +++ b/src/java/org/apache/ivy/osgi/repo/RepoDescriptorBasedResolver.java @@ -19,7 +19,6 @@ package org.apache.ivy.osgi.repo; import java.io.File; import java.io.IOException; -import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -33,40 +32,34 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import org.apache.ivy.core.IvyContext; import org.apache.ivy.core.IvyPatternHelper; import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.Configuration; import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; -import org.apache.ivy.core.module.descriptor.MDArtifact; +import org.apache.ivy.core.module.descriptor.ModuleDescriptor; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.DownloadStatus; import org.apache.ivy.core.report.MetadataArtifactDownloadReport; -import org.apache.ivy.core.resolve.IvyNode; import org.apache.ivy.core.resolve.ResolveData; import org.apache.ivy.core.resolve.ResolvedModuleRevision; import org.apache.ivy.osgi.core.BundleInfo; import org.apache.ivy.osgi.core.BundleInfoAdapter; import org.apache.ivy.osgi.core.ExecutionEnvironmentProfileProvider; -import org.apache.ivy.osgi.obr.xml.OBRXMLParser; import org.apache.ivy.osgi.util.Version; -import org.apache.ivy.plugins.conflict.ConflictManager; -import org.apache.ivy.plugins.latest.ArtifactInfo; import org.apache.ivy.plugins.repository.Repository; import org.apache.ivy.plugins.repository.Resource; -import org.apache.ivy.plugins.repository.file.FileRepository; import org.apache.ivy.plugins.resolver.BasicResolver; +import org.apache.ivy.plugins.resolver.util.MDResolvedResource; import org.apache.ivy.plugins.resolver.util.ResolvedResource; -import org.apache.ivy.plugins.version.VersionMatcher; +import org.apache.ivy.plugins.resolver.util.ResourceMDParser; import org.apache.ivy.util.Message; -import org.xml.sax.SAXException; -public abstract class BundleRepoResolver extends BasicResolver { +public abstract class RepoDescriptorBasedResolver extends BasicResolver { private Repository repository = null; - private BundleRepo repoDescriptor = null; + private RepoDescriptor repoDescriptor = null; private ExecutionEnvironmentProfileProvider profileProvider; @@ -106,7 +99,7 @@ public abstract class BundleRepoResolver extends BasicResolver { this.repository = repository; } - protected void setRepoDescriptor(BundleRepo repoDescriptor) { + protected void setRepoDescriptor(RepoDescriptor repoDescriptor) { this.repoDescriptor = repoDescriptor; } @@ -123,173 +116,74 @@ public abstract class BundleRepoResolver extends BasicResolver { return repository; } - private BundleRepo getRepoDescriptor() { + private RepoDescriptor getRepoDescriptor() { ensureInit(); return repoDescriptor; } - public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data) - throws ParseException { - DefaultModuleDescriptor md = getDependencyMD(dd, data); - if (md == null) { - // not found, so let's return the mrid resolved by a previous resolver - return data.getCurrentResolvedModuleRevision(); - } - Artifact mdar = new MDArtifact(md, "MANIFEST", "manifest", "MF"); - MetadataArtifactDownloadReport mdardr = new MetadataArtifactDownloadReport(mdar); - mdardr.setDownloadStatus(DownloadStatus.SUCCESSFUL); - return new ResolvedModuleRevision(this, this, md, mdardr); + public boolean isCheckconsistency() { + // since a module can fit a requirement with a different id, no not check anything + return false; } - private DefaultModuleDescriptor getDependencyMD(DependencyDescriptor dd, ResolveData data) { + public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data) { ModuleRevisionId mrid = dd.getDependencyRevisionId(); String osgiAtt = mrid.getExtraAttribute(BundleInfoAdapter.EXTRA_ATTRIBUTE_NAME); - Map/* > */bundleCapabilities = (Map) getRepoDescriptor() - .getBundleByCapabilities().get(osgiAtt); - if (bundleCapabilities == null) { - Message.verbose("\t Not an OSGi dependency: " + mrid); - return null; - } - String id = mrid.getName(); - Set/* */bundleReferences = (Set) bundleCapabilities.get(id); - if (bundleReferences == null || bundleReferences.isEmpty()) { + Set/* */mds = getRepoDescriptor().findModule(osgiAtt, id); + if (mds == null || mds.isEmpty()) { Message.verbose("\t " + id + " not found."); return null; } - List/* */ret = new ArrayList/* */(); - Iterator itBundle = bundleReferences.iterator(); - while (itBundle.hasNext()) { - BundleCapabilityAndLocation bundleCapability = (BundleCapabilityAndLocation) itBundle - .next(); - BundleInfo bundleInfo = bundleCapability.getBundleInfo(); - if (!bundleCapability.getType().equals(BundleInfo.BUNDLE_TYPE)) { - ModuleRevisionId foundMrid = ModuleRevisionId.newInstance("", - bundleInfo.getSymbolicName(), bundleInfo.getVersion().toString(), - BundleInfoAdapter.OSGI_BUNDLE); - if (data.getVisitData(foundMrid) != null) { + ResolvedResource[] ret = new ResolvedResource[mds.size()]; + int i = 0; + Iterator itMd = mds.iterator(); + while (itMd.hasNext()) { + ModuleDescriptor md = (ModuleDescriptor) itMd.next(); + MetadataArtifactDownloadReport report = new MetadataArtifactDownloadReport(null); + report.setDownloadStatus(DownloadStatus.NO); + report.setSearched(true); + ResolvedModuleRevision rmr = new ResolvedModuleRevision(this, this, md, report); + MDResolvedResource mdrr = new MDResolvedResource(null, md.getRevision(), rmr); + if (!BundleInfo.BUNDLE_TYPE.equals(osgiAtt)) { + if (data.getVisitData(md.getModuleRevisionId()) != null) { // already resolved import, no need to go further - DefaultModuleDescriptor md = BundleInfoAdapter.toModuleDescriptor(bundleInfo, - profileProvider); - md.setPublicationDate(new Date(0)); - return md; + return mdrr; } } - BundleCandidate candidate = new BundleCandidate(); - candidate.bundleInfo = bundleInfo; - candidate.version = bundleCapability.getVersion().toString(); - ret.add(candidate); + ret[i++] = mdrr; } - DefaultModuleDescriptor found = selectResource(ret, mrid, data.getDate()); + ResolvedResource found = findResource(ret, getDefaultRMDParser(dd.getDependencyId()), mrid, + data.getDate()); if (found == null) { Message.debug("\t" + getName() + ": no resource found for " + mrid); } return found; } - private class BundleCandidate implements ArtifactInfo { - - BundleInfo bundleInfo; - - String version; - - public long getLastModified() { - return 0; - } - - public String getRevision() { - return version; - } - - } - - public DefaultModuleDescriptor selectResource(List/* */rress, + public ResolvedResource findResource(ResolvedResource[] rress, ResourceMDParser rmdparser, ModuleRevisionId mrid, Date date) { - VersionMatcher versionMatcher = getSettings().getVersionMatcher(); - - List/* */founds = new ArrayList/* */(); - List/* */sorted = getLatestStrategy().sort( - (ArtifactInfo[]) rress.toArray(new BundleCandidate[rress.size()])); - List/* */rejected = new ArrayList/* */(); - List/* */foundBlacklisted = new ArrayList/* */(); - IvyContext context = IvyContext.getContext(); - - Iterator itBundle = sorted.iterator(); - while (itBundle.hasNext()) { - BundleCandidate rres = (BundleCandidate) itBundle.next(); - if (filterNames(new ArrayList/* */(Collections.singleton(rres.getRevision()))) - .isEmpty()) { - Message.debug("\t" + getName() + ": filtered by name: " + rres); - continue; - } - if ((date != null && rres.getLastModified() > date.getTime())) { - Message.verbose("\t" + getName() + ": too young: " + rres); - rejected.add(rres.getRevision() + " (" + rres.getLastModified() + ")"); - continue; - } - ModuleRevisionId foundMrid = ModuleRevisionId.newInstance(mrid, rres.getRevision()); - - ResolveData data = context.getResolveData(); - if (data != null && data.getReport() != null - && data.isBlacklisted(data.getReport().getConfiguration(), foundMrid)) { - Message.debug("\t" + getName() + ": blacklisted: " + rres); - rejected.add(rres.getRevision() + " (blacklisted)"); - foundBlacklisted.add(foundMrid); - continue; - } - - if (!versionMatcher.accept(mrid, foundMrid)) { - Message.debug("\t" + getName() + ": rejected by version matcher: " + rres); - rejected.add(rres.getRevision()); - continue; - } - if (versionMatcher.needModuleDescriptor(mrid, foundMrid)) { - throw new IllegalStateException(); - } else { - founds.add(rres); - } - } - if (founds.isEmpty() && !rejected.isEmpty()) { - logAttempt(rejected.toString()); - } - if (founds.isEmpty() && !foundBlacklisted.isEmpty()) { - // all acceptable versions have been blacklisted, this means that an unsolvable conflict - // has been found - DependencyDescriptor dd = context.getDependencyDescriptor(); - IvyNode parentNode = context.getResolveData().getNode(dd.getParentRevisionId()); - ConflictManager cm = parentNode.getConflictManager(mrid.getModuleId()); - cm.handleAllBlacklistedRevisions(dd, foundBlacklisted); - } - if (founds.isEmpty()) { - return null; - } - - BundleCandidate found = (BundleCandidate) founds.get(0); + ResolvedResource found = super.findResource(rress, rmdparser, mrid, date); String osgiAtt = mrid.getExtraAttribute(BundleInfoAdapter.EXTRA_ATTRIBUTE_NAME); // for non bundle requirement : log the selected bundle if (!BundleInfo.BUNDLE_TYPE.equals(osgiAtt)) { // several candidates with different symbolic name : make an warning about the ambiguity - if (founds.size() != 1) { + if (rress.length != 1) { // several candidates with different symbolic name ? - Map/* > */matching = new HashMap/* - * > - */(); - Iterator itBundle2 = founds.iterator(); - while (itBundle2.hasNext()) { - BundleCandidate c = (BundleCandidate) itBundle2.next(); - String name = c.bundleInfo.getSymbolicName(); - List/* */list = (List) matching.get(name); + Map/* > */matching = new HashMap(); + for (int i = 0; i < rress.length; i++) { + String name = ((MDResolvedResource) rress[i]).getResolvedModuleRevision() + .getId().getName(); + List/* */list = (List) matching.get(name); if (list == null) { - list = new ArrayList/* */(); + list = new ArrayList/* */(); matching.put(name, list); } - list.add(c); + list.add(rress[i]); } if (matching.keySet().size() != 1) { if (requirementStrategy == RequirementStrategy.first) { @@ -297,12 +191,12 @@ public abstract class BundleRepoResolver extends BasicResolver { + mrid.getName() + ";version=" + mrid.getRevision()); Iterator itMatching = matching.entrySet().iterator(); while (itMatching.hasNext()) { - Entry/* > */entry = (Entry) itMatching + Entry/* > */entry = (Entry) itMatching .next(); Message.warn("\t" + entry.getKey()); Iterator itB = ((List) entry.getValue()).iterator(); while (itB.hasNext()) { - BundleCandidate c = (BundleCandidate) itB.next(); + MDResolvedResource c = (MDResolvedResource) itB.next(); Message.warn("\t\t" + c.getRevision() + (found == c ? " (selected)" : "")); } @@ -312,12 +206,12 @@ public abstract class BundleRepoResolver extends BasicResolver { + mrid.getName() + ";version=" + mrid.getRevision()); Iterator itMatching = matching.entrySet().iterator(); while (itMatching.hasNext()) { - Entry/* > */entry = (Entry) itMatching + Entry/* > */entry = (Entry) itMatching .next(); Message.error("\t" + entry.getKey()); Iterator itB = ((List) entry.getValue()).iterator(); while (itB.hasNext()) { - BundleCandidate c = (BundleCandidate) itB.next(); + MDResolvedResource c = (MDResolvedResource) itB.next(); Message.error("\t\t" + c.getRevision() + (found == c ? " (best match)" : "")); } @@ -327,14 +221,12 @@ public abstract class BundleRepoResolver extends BasicResolver { } } Message.info("'" + osgiAtt + "' requirement " + mrid.getName() + ";version=" - + mrid.getRevision() + " satisfied by " + found.bundleInfo.getSymbolicName() + + mrid.getRevision() + " satisfied by " + + ((MDResolvedResource) found).getResolvedModuleRevision().getId().getName() + ";" + found.getRevision()); } - DefaultModuleDescriptor md = BundleInfoAdapter.toModuleDescriptor(found.bundleInfo, - profileProvider); - md.setPublicationDate(new Date(found.getLastModified())); - return md; + return found; } public ResolvedResource findArtifactRef(Artifact artifact, Date date) { @@ -361,9 +253,8 @@ public abstract class BundleRepoResolver extends BasicResolver { String osgiAtt = (String) tokenValues.get(BundleInfoAdapter.EXTRA_ATTRIBUTE_NAME); - Map/* > */bundleCapabilityMap = (Map) getRepoDescriptor() - .getBundleByCapabilities().get(osgiAtt); - if (bundleCapabilityMap == null || bundleCapabilityMap.isEmpty()) { + Set/* */capabilityValues = getRepoDescriptor().getCapabilityValues(osgiAtt); + if (capabilityValues == null || capabilityValues.isEmpty()) { return Collections.EMPTY_LIST; } @@ -372,20 +263,18 @@ public abstract class BundleRepoResolver extends BasicResolver { } if (IvyPatternHelper.MODULE_KEY.equals(token)) { - return bundleCapabilityMap.keySet(); + return capabilityValues; } if (IvyPatternHelper.REVISION_KEY.equals(token)) { String name = (String) tokenValues.get(IvyPatternHelper.MODULE_KEY); List/* */versions = new ArrayList/* */(); - Set/* */bundleCapabilities = (Set) bundleCapabilityMap - .get(name); - if (bundleCapabilities != null) { - Iterator itBundle = bundleCapabilities.iterator(); - while (itBundle.hasNext()) { - BundleCapabilityAndLocation bundleCapability = (BundleCapabilityAndLocation) itBundle - .next(); - versions.add(bundleCapability.getVersion().toString()); + Set/* */mds = getRepoDescriptor().findModule(osgiAtt, name); + if (mds != null) { + Iterator itMd = mds.iterator(); + while (itMd.hasNext()) { + ModuleDescriptor md = (ModuleDescriptor) itMd.next(); + versions.add(md.getRevision()); } } return versions; @@ -399,8 +288,8 @@ public abstract class BundleRepoResolver extends BasicResolver { if (osgiAtt.equals(BundleInfo.PACKAGE_TYPE)) { return Collections.singletonList(BundleInfoAdapter.CONF_USE_PREFIX + name); } - Set/* */bundleCapabilities = (Set) bundleCapabilityMap - .get(name); + Set/* */bundleCapabilities = getRepoDescriptor() + .findModule(osgiAtt, name); if (bundleCapabilities == null) { return Collections.EMPTY_LIST; } @@ -474,9 +363,8 @@ public abstract class BundleRepoResolver extends BasicResolver { } values.put(BundleInfoAdapter.EXTRA_ATTRIBUTE_NAME, osgiAtt); - Map/* > */bundleCapabilityMap = (Map) getRepoDescriptor() - .getBundleByCapabilities().get(osgiAtt); - if (bundleCapabilityMap == null || bundleCapabilityMap.isEmpty()) { + Set/* */capabilities = getRepoDescriptor().getCapabilityValues(osgiAtt); + if (capabilities == null || capabilities.isEmpty()) { return Collections.EMPTY_SET; } @@ -490,9 +378,8 @@ public abstract class BundleRepoResolver extends BasicResolver { tokenSet.remove(IvyPatternHelper.MODULE_KEY); String module = (String) criteria.get(IvyPatternHelper.MODULE_KEY); if (module == null) { - Set/* */names = bundleCapabilityMap.keySet(); Set/* > */tokenValues = new HashSet/* > */(); - Iterator itNames = names.iterator(); + Iterator itNames = capabilities.iterator(); while (itNames.hasNext()) { String name = (String) itNames.next(); Map/* */newCriteria = new HashMap/* */(criteria); @@ -506,8 +393,8 @@ public abstract class BundleRepoResolver extends BasicResolver { tokenSet.remove(IvyPatternHelper.REVISION_KEY); String rev = (String) criteria.get(IvyPatternHelper.REVISION_KEY); if (rev == null) { - Set/* */bundleCapabilities = (Set) bundleCapabilityMap - .get(module); + Set/* */bundleCapabilities = getRepoDescriptor() + .findModule(osgiAtt, module); if (bundleCapabilities == null) { return Collections.EMPTY_SET; } @@ -531,8 +418,8 @@ public abstract class BundleRepoResolver extends BasicResolver { values.put(IvyPatternHelper.CONF_KEY, BundleInfoAdapter.CONF_USE_PREFIX + module); return Collections./* > */singleton(values); } - Set/* */bundleCapabilities = (Set) bundleCapabilityMap - .get(module); + Set/* */bundleCapabilities = getRepoDescriptor() + .findModule(osgiAtt, module); if (bundleCapabilities == null) { return Collections.EMPTY_SET; } @@ -589,10 +476,4 @@ public abstract class BundleRepoResolver extends BasicResolver { throw new UnsupportedOperationException(); } - // useless methods that must not be called - - public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data) { - throw new UnsupportedOperationException(); - } - } diff --git a/src/java/org/apache/ivy/plugins/resolver/AbstractPatternsBasedResolver.java b/src/java/org/apache/ivy/plugins/resolver/AbstractPatternsBasedResolver.java index 6c5dc404..048534c0 100644 --- a/src/java/org/apache/ivy/plugins/resolver/AbstractPatternsBasedResolver.java +++ b/src/java/org/apache/ivy/plugins/resolver/AbstractPatternsBasedResolver.java @@ -114,100 +114,6 @@ public abstract class AbstractPatternsBasedResolver extends BasicResolver { protected abstract ResolvedResource findResourceUsingPattern(ModuleRevisionId mrid, String pattern, Artifact artifact, ResourceMDParser rmdparser, Date date); - public ResolvedResource findResource(ResolvedResource[] rress, ResourceMDParser rmdparser, - ModuleRevisionId mrid, Date date) { - String name = getName(); - VersionMatcher versionMatcher = getSettings().getVersionMatcher(); - - ResolvedResource found = null; - List sorted = getLatestStrategy().sort(rress); - List rejected = new ArrayList(); - List foundBlacklisted = new ArrayList(); - IvyContext context = IvyContext.getContext(); - - for (ListIterator iter = sorted.listIterator(sorted.size()); iter.hasPrevious();) { - ResolvedResource rres = (ResolvedResource) iter.previous(); - // we start by filtering based on information already available, - // even though we don't even know if the resource actually exist. - // But checking for existence is most of the time more costly than checking - // name, blacklisting and first level version matching - if (filterNames(new ArrayList(Collections.singleton(rres.getRevision()))).isEmpty()) { - Message.debug("\t" + name + ": filtered by name: " + rres); - continue; - } - ModuleRevisionId foundMrid = ModuleRevisionId.newInstance(mrid, rres.getRevision()); - - ResolveData data = context.getResolveData(); - if (data != null - && data.getReport() != null - && data.isBlacklisted(data.getReport().getConfiguration(), foundMrid)) { - Message.debug("\t" + name + ": blacklisted: " + rres); - rejected.add(rres.getRevision() + " (blacklisted)"); - foundBlacklisted.add(foundMrid); - continue; - } - - if (!versionMatcher.accept(mrid, foundMrid)) { - Message.debug("\t" + name + ": rejected by version matcher: " + rres); - rejected.add(rres.getRevision()); - continue; - } - if (!rres.getResource().exists()) { - Message.debug("\t" + name + ": unreachable: " + rres - + "; res=" + rres.getResource()); - rejected.add(rres.getRevision() + " (unreachable)"); - continue; - } - if ((date != null && rres.getLastModified() > date.getTime())) { - Message.verbose("\t" + name + ": too young: " + rres); - rejected.add(rres.getRevision() + " (" + rres.getLastModified() + ")"); - continue; - } - if (versionMatcher.needModuleDescriptor(mrid, foundMrid)) { - ResolvedResource r = rmdparser.parse(rres.getResource(), rres.getRevision()); - if (r == null) { - Message.debug("\t" + name - + ": impossible to get module descriptor resource: " + rres); - rejected.add(rres.getRevision() + " (no or bad MD)"); - continue; - } - ModuleDescriptor md = ((MDResolvedResource) r).getResolvedModuleRevision() - .getDescriptor(); - if (md.isDefault()) { - Message.debug("\t" + name + ": default md rejected by version matcher" - + "requiring module descriptor: " + rres); - rejected.add(rres.getRevision() + " (MD)"); - continue; - } else if (!versionMatcher.accept(mrid, md)) { - Message.debug("\t" + name + ": md rejected by version matcher: " + rres); - rejected.add(rres.getRevision() + " (MD)"); - continue; - } else { - found = r; - } - } else { - found = rres; - } - - if (found != null) { - break; - } - } - if (found == null && !rejected.isEmpty()) { - logAttempt(rejected.toString()); - } - if (found == null && !foundBlacklisted.isEmpty()) { - // all acceptable versions have been blacklisted, this means that an unsolvable conflict - // has been found - DependencyDescriptor dd = context.getDependencyDescriptor(); - IvyNode parentNode = context.getResolveData().getNode(dd.getParentRevisionId()); - ConflictManager cm = parentNode.getConflictManager(mrid.getModuleId()); - cm.handleAllBlacklistedRevisions(dd, foundBlacklisted); - } - - return found; - } - protected Collection findNames(Map tokenValues, String token) { Collection names = new HashSet(); names.addAll(findIvyNames(tokenValues, token)); @@ -356,21 +262,6 @@ public abstract class AbstractPatternsBasedResolver extends BasicResolver { protected abstract boolean exist(String path); - /** - * Filters names before returning them in the findXXXNames or findTokenValues method. - *

- * Remember to call the super implementation when overriding this method. - *

- * - * @param names - * the list to filter. - * @return the filtered list - */ - protected Collection filterNames(Collection names) { - getSettings().filterIgnore(names); - return names; - } - protected void findTokenValues(Collection names, List patterns, Map tokenValues, String token) { //to be overridden by subclasses wanting to have listing features } diff --git a/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java b/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java index e977fb84..fa0ad0f4 100644 --- a/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java +++ b/src/java/org/apache/ivy/plugins/resolver/BasicResolver.java @@ -58,6 +58,7 @@ 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.plugins.conflict.ConflictManager; import org.apache.ivy.plugins.namespace.Namespace; import org.apache.ivy.plugins.parser.ModuleDescriptorParser; import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry; @@ -72,6 +73,7 @@ import org.apache.ivy.plugins.repository.url.URLResource; import org.apache.ivy.plugins.resolver.util.MDResolvedResource; import org.apache.ivy.plugins.resolver.util.ResolvedResource; import org.apache.ivy.plugins.resolver.util.ResourceMDParser; +import org.apache.ivy.plugins.version.VersionMatcher; import org.apache.ivy.util.Checks; import org.apache.ivy.util.ChecksumHelper; import org.apache.ivy.util.HostUtil; @@ -84,7 +86,7 @@ public abstract class BasicResolver extends AbstractResolver { public static final String DESCRIPTOR_OPTIONAL = "optional"; public static final String DESCRIPTOR_REQUIRED = "required"; - + /** * Exception thrown internally in getDependency to indicate a dependency is unresolved. *

@@ -96,32 +98,33 @@ public abstract class BasicResolver extends AbstractResolver { private boolean error; /** - * Dependency has not been resolved. - * This is not an error and won't log any message. + * Dependency has not been resolved. This is not an error and won't log any message. */ public UnresolvedDependencyException() { this("", false); } + /** - * Dependency has not been resolved. - * This is an error and will log a message. + * Dependency has not been resolved. This is an error and will log a message. */ public UnresolvedDependencyException(String message) { this(message, true); } + /** - * Dependency has not been resolved. - * The boolean tells if it is an error or not, a message will be logged if non empty. + * Dependency has not been resolved. The boolean tells if it is an error or not, a message + * will be logged if non empty. */ public UnresolvedDependencyException(String message, boolean error) { super(message); this.error = error; } + public boolean isError() { return error; } } - + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss"); private String workspaceName; @@ -179,21 +182,21 @@ public abstract class BasicResolver extends AbstractResolver { return mr; } } - + if (isForce()) { - dd = dd.clone(ModuleRevisionId.newInstance( - dd.getDependencyRevisionId(), "latest.integration")); + 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(); ModuleRevisionId nsMrid = nsDd.getDependencyRevisionId(); - + checkRevision(systemMrid); boolean isDynamic = getAndCheckIsDynamic(systemMrid); @@ -203,27 +206,25 @@ public abstract class BasicResolver extends AbstractResolver { rmr = findModuleInCache(systemDd, data); if (rmr != null) { if (rmr.getDescriptor().isDefault() && rmr.getResolver() != this) { - Message.verbose("\t" + getName() + ": found revision in cache: " - + systemMrid - + " (resolved by " + rmr.getResolver().getName() - + "): but it's a default one, maybe we can find a better one"); + Message.verbose("\t" + getName() + ": found revision in cache: " + systemMrid + + " (resolved by " + rmr.getResolver().getName() + + "): but it's a default one, maybe we can find a better one"); } else if (isForce() && rmr.getResolver() != this) { - Message.verbose("\t" + getName() + ": found revision in cache: " - + systemMrid - + " (resolved by " + rmr.getResolver().getName() - + "): but we are in force mode, let's try to find one ourself"); + Message.verbose("\t" + getName() + ": found revision in cache: " + systemMrid + + " (resolved by " + rmr.getResolver().getName() + + "): but we are in force mode, let's try to find one ourself"); } else { Message.verbose("\t" + getName() + ": revision in cache: " + systemMrid); return checkLatest(systemDd, checkForcedResolvedModuleRevision(rmr), data); } } if (data.getOptions().isUseCacheOnly()) { - throw new UnresolvedDependencyException( - "\t" + getName() + " (useCacheOnly) : no ivy file found for " + systemMrid, false); + throw new UnresolvedDependencyException("\t" + getName() + + " (useCacheOnly) : no ivy file found for " + systemMrid, false); } checkInterrupted(); - + ResolvedResource ivyRef = findIvyFileRef(nsDd, data); checkInterrupted(); @@ -232,35 +233,35 @@ public abstract class BasicResolver extends AbstractResolver { ModuleDescriptor systemMd = null; if (ivyRef == null) { if (!isAllownomd()) { - throw new UnresolvedDependencyException( - "\t" + getName() + ": no ivy file found for " + systemMrid, false); + throw new UnresolvedDependencyException("\t" + getName() + + ": no ivy file found for " + systemMrid, false); } - nsMd = DefaultModuleDescriptor.newDefaultInstance(nsMrid, nsDd - .getAllDependencyArtifacts()); + nsMd = DefaultModuleDescriptor.newDefaultInstance(nsMrid, + nsDd.getAllDependencyArtifacts()); ResolvedResource artifactRef = findFirstArtifactRef(nsMd, nsDd, data); checkInterrupted(); if (artifactRef == null) { - throw new UnresolvedDependencyException("\t" + getName() - + ": no ivy file nor artifact found for " + systemMrid, false); + throw new UnresolvedDependencyException("\t" + getName() + + ": no ivy file nor artifact found for " + systemMrid, false); } else { long lastModified = artifactRef.getLastModified(); if (lastModified != 0 && nsMd instanceof DefaultModuleDescriptor) { ((DefaultModuleDescriptor) nsMd).setLastModified(lastModified); } Message.verbose("\t" + getName() + ": no ivy file found for " + systemMrid - + ": using default data"); + + ": using default data"); if (isDynamic) { nsMd.setResolvedModuleRevisionId(ModuleRevisionId.newInstance(nsMrid, artifactRef.getRevision())); } systemMd = toSystem(nsMd); - MetadataArtifactDownloadReport madr = - new MetadataArtifactDownloadReport(systemMd.getMetadataArtifact()); + MetadataArtifactDownloadReport madr = new MetadataArtifactDownloadReport( + systemMd.getMetadataArtifact()); madr.setDownloadStatus(DownloadStatus.NO); madr.setSearched(true); rmr = new ResolvedModuleRevision(this, this, systemMd, madr, isForce()); - getRepositoryCacheManager().cacheModuleDescriptor(this, artifactRef, toSystem(dd), - systemMd.getAllArtifacts()[0], null, getCacheOptions(data)); + getRepositoryCacheManager().cacheModuleDescriptor(this, artifactRef, + toSystem(dd), systemMd.getAllArtifacts()[0], null, getCacheOptions(data)); } } else { if (ivyRef instanceof MDResolvedResource) { @@ -272,8 +273,7 @@ public abstract class BasicResolver extends AbstractResolver { throw new UnresolvedDependencyException(); } } - if (!rmr.getReport().isDownloaded() - && rmr.getReport().getLocalFile() != null) { + if (!rmr.getReport().isDownloaded() && rmr.getReport().getLocalFile() != null) { return checkLatest(systemDd, checkForcedResolvedModuleRevision(rmr), data); } else { nsMd = rmr.getDescriptor(); @@ -290,15 +290,14 @@ public abstract class BasicResolver extends AbstractResolver { defaultMd.setModuleRevisionId(revision); defaultMd.setResolvedModuleRevisionId(revision); } else { - Message.warn( - "consistency disabled with instance of non DefaultModuleDescriptor..." - + " module info can't be updated, so consistency check will be done"); + Message.warn("consistency disabled with instance of non DefaultModuleDescriptor..." + + " module info can't be updated, so consistency check will be done"); checkDescriptorConsistency(nsMrid, nsMd, ivyRef); checkDescriptorConsistency(systemMrid, systemMd, ivyRef); } } - rmr = new ResolvedModuleRevision( - this, this, systemMd, toSystem(rmr.getReport()), isForce()); + rmr = new ResolvedModuleRevision(this, this, systemMd, + toSystem(rmr.getReport()), isForce()); } } @@ -306,8 +305,10 @@ public abstract class BasicResolver extends AbstractResolver { resolveAndCheckPublicationDate(systemDd, systemMd, systemMrid, data); checkNotConvertedExclusionRule(systemMd, ivyRef, data); - cacheModuleDescriptor(systemMd, systemMrid, ivyRef, rmr); - + if (ivyRef == null || ivyRef.getResource() != null) { + cacheModuleDescriptor(systemMd, systemMrid, ivyRef, rmr); + } + return checkLatest(systemDd, checkForcedResolvedModuleRevision(rmr), data); } catch (UnresolvedDependencyException ex) { if (ex.getMessage().length() > 0) { @@ -323,17 +324,16 @@ public abstract class BasicResolver extends AbstractResolver { } } - protected boolean shouldReturnResolvedModule( - DependencyDescriptor dd, ResolvedModuleRevision mr) { + 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; } @@ -344,63 +344,54 @@ public abstract class BasicResolver extends AbstractResolver { if (!isForce() || rmr.isForce()) { return rmr; } - return new ResolvedModuleRevision( - rmr.getResolver(), rmr.getArtifactResolver(), - rmr.getDescriptor(), rmr.getReport(), true); + return new ResolvedModuleRevision(rmr.getResolver(), rmr.getArtifactResolver(), + rmr.getDescriptor(), rmr.getReport(), true); } private void cacheModuleDescriptor(ModuleDescriptor systemMd, ModuleRevisionId systemMrid, ResolvedResource ivyRef, ResolvedModuleRevision rmr) { RepositoryCacheManager cacheManager = getRepositoryCacheManager(); - + final ModuleDescriptorParser parser = systemMd.getParser(); - - // the metadata artifact which was used to cache the original metadata file - Artifact requestedMetadataArtifact = - ivyRef == null - ? systemMd.getMetadataArtifact() - : parser.getMetadataArtifact( - ModuleRevisionId.newInstance(systemMrid, ivyRef.getRevision()), - ivyRef.getResource()); - - cacheManager.originalToCachedModuleDescriptor(this, ivyRef, requestedMetadataArtifact, - rmr, new ModuleDescriptorWriter() { - public void write(ResolvedResource originalMdResource, ModuleDescriptor md, - File src, File dest) - throws IOException, ParseException { - if (originalMdResource == null) { - // a basic ivy file is written containing default data - XmlModuleDescriptorWriter.write(md, dest); - } else { - // copy and update ivy file from source to cache - parser.toIvyFile( - new FileInputStream(src), - originalMdResource.getResource(), dest, - md); - long repLastModified = originalMdResource.getLastModified(); - if (repLastModified > 0) { - dest.setLastModified(repLastModified); + + // the metadata artifact which was used to cache the original metadata file + Artifact requestedMetadataArtifact = ivyRef == null ? systemMd.getMetadataArtifact() + : parser.getMetadataArtifact( + ModuleRevisionId.newInstance(systemMrid, ivyRef.getRevision()), + ivyRef.getResource()); + + cacheManager.originalToCachedModuleDescriptor(this, ivyRef, requestedMetadataArtifact, rmr, + new ModuleDescriptorWriter() { + public void write(ResolvedResource originalMdResource, ModuleDescriptor md, + File src, File dest) throws IOException, ParseException { + if (originalMdResource == null) { + // a basic ivy file is written containing default data + XmlModuleDescriptorWriter.write(md, dest); + } else { + // copy and update ivy file from source to cache + parser.toIvyFile(new FileInputStream(src), + originalMdResource.getResource(), dest, md); + long repLastModified = originalMdResource.getLastModified(); + if (repLastModified > 0) { + dest.setLastModified(repLastModified); + } } } - } - }); + }); } private void checkNotConvertedExclusionRule(ModuleDescriptor systemMd, ResolvedResource ivyRef, ResolveData data) { - if (!getNamespace().equals(Namespace.SYSTEM_NAMESPACE) - && !systemMd.isDefault() - && data.getSettings().logNotConvertedExclusionRule() + if (!getNamespace().equals(Namespace.SYSTEM_NAMESPACE) && !systemMd.isDefault() + && data.getSettings().logNotConvertedExclusionRule() && systemMd instanceof DefaultModuleDescriptor) { DefaultModuleDescriptor dmd = (DefaultModuleDescriptor) systemMd; if (dmd.isNamespaceUseful()) { - Message.warn( - "the module descriptor " - + ivyRef.getResource() - + " has information which can't be converted into " - + "the system namespace. " - + "It will require the availability of the namespace '" - + getNamespace().getName() + "' to be fully usable."); + Message.warn("the module descriptor " + ivyRef.getResource() + + " has information which can't be converted into " + + "the system namespace. " + + "It will require the availability of the namespace '" + + getNamespace().getName() + "' to be fully usable."); } } } @@ -411,34 +402,33 @@ public abstract class BasicResolver extends AbstractResolver { if (data.getDate() != null) { long pubDate = getPublicationDate(systemMd, systemDd, data); if (pubDate > data.getDate().getTime()) { - throw new UnresolvedDependencyException( - "\t" + getName() + ": unacceptable publication date => was=" - + new Date(pubDate) + " required=" + data.getDate()); + throw new UnresolvedDependencyException("\t" + getName() + + ": unacceptable publication date => was=" + new Date(pubDate) + + " required=" + data.getDate()); } else if (pubDate == -1) { throw new UnresolvedDependencyException("\t" + getName() - + ": impossible to guess publication date: artifact missing for " - + systemMrid); + + ": impossible to guess publication date: artifact missing for " + + systemMrid); } - systemMd.setResolvedPublicationDate(new Date(pubDate)); + systemMd.setResolvedPublicationDate(new Date(pubDate)); } } private void checkModuleDescriptorRevision(ModuleDescriptor systemMd, ModuleRevisionId systemMrid) { if (!getSettings().getVersionMatcher().accept(systemMrid, systemMd)) { - throw new UnresolvedDependencyException( - "\t" + getName() + ": unacceptable revision => was=" - + systemMd.getResolvedModuleRevisionId().getRevision() + " required=" - + systemMrid.getRevision()); + throw new UnresolvedDependencyException("\t" + getName() + + ": unacceptable revision => was=" + + systemMd.getResolvedModuleRevisionId().getRevision() + " required=" + + systemMrid.getRevision()); } } private boolean getAndCheckIsDynamic(ModuleRevisionId systemMrid) { boolean isDynamic = getSettings().getVersionMatcher().isDynamic(systemMrid); if (isDynamic && !acceptLatest()) { - throw new UnresolvedDependencyException( - "dynamic revisions not handled by " + getClass().getName() - + ". impossible to resolve " + systemMrid); + throw new UnresolvedDependencyException("dynamic revisions not handled by " + + getClass().getName() + ". impossible to resolve " + systemMrid); } return isDynamic; } @@ -446,10 +436,9 @@ public abstract class BasicResolver extends AbstractResolver { private void checkRevision(ModuleRevisionId systemMrid) { // check revision int index = systemMrid.getRevision().indexOf("@"); - if (index != -1 - && !systemMrid.getRevision().substring(index + 1).equals(workspaceName)) { - throw new UnresolvedDependencyException("\t" + getName() - + ": unhandled revision => " + systemMrid.getRevision()); + if (index != -1 && !systemMrid.getRevision().substring(index + 1).equals(workspaceName)) { + throw new UnresolvedDependencyException("\t" + getName() + ": unhandled revision => " + + systemMrid.getRevision()); } } @@ -458,27 +447,24 @@ public abstract class BasicResolver extends AbstractResolver { // we get the resolved module revision id from the descriptor: it may contain extra // attributes that were not included in the dependency constraint ModuleRevisionId resolvedMrid = systemMd.getResolvedModuleRevisionId(); - if (resolvedMrid.getRevision() == null - || resolvedMrid.getRevision().length() == 0 + if (resolvedMrid.getRevision() == null || resolvedMrid.getRevision().length() == 0 || resolvedMrid.getRevision().startsWith("working@")) { if (!isDynamic) { - resolvedMrid = ModuleRevisionId.newInstance( - resolvedMrid, dependencyConstraint.getRevision()); + resolvedMrid = ModuleRevisionId.newInstance(resolvedMrid, + dependencyConstraint.getRevision()); } else if (ivyRef == null) { resolvedMrid = systemMd.getMetadataArtifact().getModuleRevisionId(); } else if (ivyRef.getRevision() == null || ivyRef.getRevision().length() == 0) { - resolvedMrid = ModuleRevisionId.newInstance(resolvedMrid, "working@" - + getName()); + resolvedMrid = ModuleRevisionId.newInstance(resolvedMrid, "working@" + getName()); } else { - resolvedMrid = ModuleRevisionId.newInstance(resolvedMrid, ivyRef - .getRevision()); + resolvedMrid = ModuleRevisionId.newInstance(resolvedMrid, ivyRef.getRevision()); } } if (isDynamic) { - Message.verbose("\t\t[" + toSystem(resolvedMrid).getRevision() + "] " - + dependencyConstraint.getModuleId()); + Message.verbose("\t\t[" + toSystem(resolvedMrid).getRevision() + "] " + + dependencyConstraint.getModuleId()); } - systemMd.setResolvedModuleRevisionId(resolvedMrid); + systemMd.setResolvedModuleRevisionId(resolvedMrid); checkModuleDescriptorRevision(systemMd, dependencyConstraint); } @@ -487,7 +473,7 @@ public abstract class BasicResolver extends AbstractResolver { Map allAttributes = new HashMap(); allAttributes.putAll(md.getQualifiedExtraAttributes()); allAttributes.putAll(askedMrid.getQualifiedExtraAttributes()); - + String revision = ivyRef.getRevision(); if (revision == null) { Message.debug("no revision found in reference for " + askedMrid); @@ -503,9 +489,9 @@ public abstract class BasicResolver extends AbstractResolver { revision = askedMrid.getRevision(); } } - + return ModuleRevisionId.newInstance(askedMrid.getOrganisation(), askedMrid.getName(), - askedMrid.getBranch(), revision, allAttributes); + askedMrid.getBranch(), revision, allAttributes); } public ResolvedModuleRevision parse(final ResolvedResource mdRef, DependencyDescriptor dd, @@ -513,10 +499,10 @@ public abstract class BasicResolver extends AbstractResolver { DependencyDescriptor nsDd = dd; dd = toSystem(nsDd); - + ModuleRevisionId mrid = dd.getDependencyRevisionId(); - ModuleDescriptorParser parser = ModuleDescriptorParserRegistry - .getInstance().getParser(mdRef.getResource()); + ModuleDescriptorParser parser = ModuleDescriptorParserRegistry.getInstance().getParser( + mdRef.getResource()); if (parser == null) { Message.warn("no module descriptor parser available for " + mdRef.getResource()); return null; @@ -547,9 +533,8 @@ public abstract class BasicResolver extends AbstractResolver { } Artifact moduleArtifact = parser.getMetadataArtifact(resolvedMrid, mdRef.getResource()); - return getRepositoryCacheManager().cacheModuleDescriptor( - this, mdRef, dd, moduleArtifact, downloader, - getCacheOptions(data)); + return getRepositoryCacheManager().cacheModuleDescriptor(this, mdRef, dd, moduleArtifact, + downloader, getCacheOptions(data)); } protected ResourceMDParser getRMDParser(final DependencyDescriptor dd, final ResolveData data) { @@ -564,8 +549,7 @@ public abstract class BasicResolver extends AbstractResolver { return new MDResolvedResource(resource, rev, rmr); } } catch (ParseException e) { - Message.warn("Failed to parse the file '" + resource + "': " - + e.getMessage()); + Message.warn("Failed to parse the file '" + resource + "': " + e.getMessage()); return null; } } @@ -576,10 +560,10 @@ public abstract class BasicResolver extends AbstractResolver { protected ResourceMDParser getDefaultRMDParser(final ModuleId mid) { return new ResourceMDParser() { public MDResolvedResource parse(Resource resource, String rev) { - DefaultModuleDescriptor md = - DefaultModuleDescriptor.newDefaultInstance(new ModuleRevisionId(mid, rev)); - MetadataArtifactDownloadReport madr = - new MetadataArtifactDownloadReport(md.getMetadataArtifact()); + DefaultModuleDescriptor md = DefaultModuleDescriptor + .newDefaultInstance(new ModuleRevisionId(mid, rev)); + MetadataArtifactDownloadReport madr = new MetadataArtifactDownloadReport( + md.getMetadataArtifact()); madr.setDownloadStatus(DownloadStatus.NO); madr.setSearched(true); return new MDResolvedResource(resource, rev, new ResolvedModuleRevision( @@ -613,7 +597,7 @@ public abstract class BasicResolver extends AbstractResolver { + md.getModuleRevisionId().getName() + "'; "); ok = false; } - if (mrid.getBranch() != null + if (mrid.getBranch() != null && !mrid.getBranch().equals(md.getModuleRevisionId().getBranch())) { Message.error("\t" + getName() + ": bad branch name found in " + ivyRef.getResource() + ": expected='" + mrid.getBranch() + " found='" @@ -642,11 +626,11 @@ public abstract class BasicResolver extends AbstractResolver { } for (Iterator it = mrid.getExtraAttributes().entrySet().iterator(); it.hasNext();) { Entry extra = (Entry) it.next(); - if (extra.getValue() != null && !extra.getValue().equals( - md.getExtraAttribute((String) extra.getKey()))) { + if (extra.getValue() != null + && !extra.getValue().equals(md.getExtraAttribute((String) extra.getKey()))) { String errorMsg = "bad " + extra.getKey() + " found in " + ivyRef.getResource() - + ": expected='" + extra.getValue() + "' found='" - + md.getExtraAttribute((String) extra.getKey()) + "'"; + + ": expected='" + extra.getValue() + "' found='" + + md.getExtraAttribute((String) extra.getKey()) + "'"; Message.error("\t" + getName() + ": " + errorMsg); errors.append(errorMsg + ";"); ok = false; @@ -658,6 +642,127 @@ public abstract class BasicResolver extends AbstractResolver { } } + /** + * When the resolver has many choices, this function helps choosing one + * + * @param rress + * the list of resolved resource which the resolver found to fit the requirement + * @param rmdparser + * the parser of module descriptor + * @param mrid + * the module being resolved + * @param date + * the current date + * @return the selected resource + */ + public ResolvedResource findResource(ResolvedResource[] rress, ResourceMDParser rmdparser, + ModuleRevisionId mrid, Date date) { + String name = getName(); + VersionMatcher versionMatcher = getSettings().getVersionMatcher(); + + ResolvedResource found = null; + List sorted = getLatestStrategy().sort(rress); + List rejected = new ArrayList(); + List foundBlacklisted = new ArrayList(); + IvyContext context = IvyContext.getContext(); + + for (ListIterator iter = sorted.listIterator(sorted.size()); iter.hasPrevious();) { + ResolvedResource rres = (ResolvedResource) iter.previous(); + // we start by filtering based on information already available, + // even though we don't even know if the resource actually exist. + // But checking for existence is most of the time more costly than checking + // name, blacklisting and first level version matching + if (filterNames(new ArrayList(Collections.singleton(rres.getRevision()))).isEmpty()) { + Message.debug("\t" + name + ": filtered by name: " + rres); + continue; + } + ModuleRevisionId foundMrid = ModuleRevisionId.newInstance(mrid, rres.getRevision()); + + ResolveData data = context.getResolveData(); + if (data != null && data.getReport() != null + && data.isBlacklisted(data.getReport().getConfiguration(), foundMrid)) { + Message.debug("\t" + name + ": blacklisted: " + rres); + rejected.add(rres.getRevision() + " (blacklisted)"); + foundBlacklisted.add(foundMrid); + continue; + } + + if (!versionMatcher.accept(mrid, foundMrid)) { + Message.debug("\t" + name + ": rejected by version matcher: " + rres); + rejected.add(rres.getRevision()); + continue; + } + if (rres.getResource() != null && !rres.getResource().exists()) { + Message.debug("\t" + name + ": unreachable: " + rres + "; res=" + + rres.getResource()); + rejected.add(rres.getRevision() + " (unreachable)"); + continue; + } + if ((date != null && rres.getLastModified() > date.getTime())) { + Message.verbose("\t" + name + ": too young: " + rres); + rejected.add(rres.getRevision() + " (" + rres.getLastModified() + ")"); + continue; + } + if (versionMatcher.needModuleDescriptor(mrid, foundMrid)) { + ResolvedResource r = rmdparser.parse(rres.getResource(), rres.getRevision()); + if (r == null) { + Message.debug("\t" + name + ": impossible to get module descriptor resource: " + + rres); + rejected.add(rres.getRevision() + " (no or bad MD)"); + continue; + } + ModuleDescriptor md = ((MDResolvedResource) r).getResolvedModuleRevision() + .getDescriptor(); + if (md.isDefault()) { + Message.debug("\t" + name + ": default md rejected by version matcher" + + "requiring module descriptor: " + rres); + rejected.add(rres.getRevision() + " (MD)"); + continue; + } else if (!versionMatcher.accept(mrid, md)) { + Message.debug("\t" + name + ": md rejected by version matcher: " + rres); + rejected.add(rres.getRevision() + " (MD)"); + continue; + } else { + found = r; + } + } else { + found = rres; + } + + if (found != null) { + break; + } + } + if (found == null && !rejected.isEmpty()) { + logAttempt(rejected.toString()); + } + if (found == null && !foundBlacklisted.isEmpty()) { + // all acceptable versions have been blacklisted, this means that an unsolvable conflict + // has been found + DependencyDescriptor dd = context.getDependencyDescriptor(); + IvyNode parentNode = context.getResolveData().getNode(dd.getParentRevisionId()); + ConflictManager cm = parentNode.getConflictManager(mrid.getModuleId()); + cm.handleAllBlacklistedRevisions(dd, foundBlacklisted); + } + + return found; + } + + /** + * Filters names before returning them in the findXXXNames or findTokenValues method. + *

+ * Remember to call the super implementation when overriding this method. + *

+ * + * @param names + * the list to filter. + * @return the filtered list + */ + protected Collection filterNames(Collection names) { + getSettings().filterIgnore(names); + return names; + } + protected void clearIvyAttempts() { ivyattempts.clear(); clearArtifactAttempts(); @@ -727,9 +832,8 @@ public abstract class BasicResolver extends AbstractResolver { clearArtifactAttempts(); DownloadReport dr = new DownloadReport(); for (int i = 0; i < artifacts.length; i++) { - ArtifactDownloadReport adr = cacheManager.download( - artifacts[i], artifactResourceResolver, downloader, - getCacheDownloadOptions(options)); + ArtifactDownloadReport adr = cacheManager.download(artifacts[i], + artifactResourceResolver, downloader, getCacheDownloadOptions(options)); if (DownloadStatus.FAILED == adr.getDownloadStatus()) { if (!ArtifactDownloadReport.MISSING_ARTIFACT.equals(adr.getDownloadDetails())) { Message.warn("\t" + adr); @@ -750,11 +854,10 @@ public abstract class BasicResolver extends AbstractResolver { protected void clearArtifactAttempts() { artattempts.clear(); } - + public ArtifactDownloadReport download(final ArtifactOrigin origin, DownloadOptions options) { Checks.checkNotNull(origin, "origin"); - return getRepositoryCacheManager().download( - origin.getArtifact(), + return getRepositoryCacheManager().download(origin.getArtifact(), new ArtifactResourceResolver() { public ResolvedResource resolve(Artifact artifact) { try { @@ -768,11 +871,9 @@ public abstract class BasicResolver extends AbstractResolver { return null; } } - }, - downloader, - getCacheDownloadOptions(options)); + }, downloader, getCacheDownloadOptions(options)); } - + protected abstract Resource getResource(String source) throws IOException; public boolean exists(Artifact artifact) { @@ -782,24 +883,22 @@ public abstract class BasicResolver extends AbstractResolver { } return false; } - + public ArtifactOrigin locate(Artifact artifact) { - ArtifactOrigin origin = getRepositoryCacheManager().getSavedArtifactOrigin(toSystem(artifact)); + ArtifactOrigin origin = getRepositoryCacheManager().getSavedArtifactOrigin( + toSystem(artifact)); if (!ArtifactOrigin.isUnknown(origin)) { return origin; } ResolvedResource artifactRef = getArtifactRef(artifact, null); if (artifactRef != null && artifactRef.getResource().exists()) { - return new ArtifactOrigin( - artifact, - artifactRef.getResource().isLocal(), - artifactRef.getResource().getName()); + return new ArtifactOrigin(artifact, artifactRef.getResource().isLocal(), artifactRef + .getResource().getName()); } return null; } - protected long getPublicationDate(ModuleDescriptor md, DependencyDescriptor dd, - ResolveData data) { + protected long getPublicationDate(ModuleDescriptor md, DependencyDescriptor dd, ResolveData data) { if (md.getPublicationDate() != null) { return md.getPublicationDate().getTime(); } @@ -903,7 +1002,7 @@ public abstract class BasicResolver extends AbstractResolver { if (!ChecksumHelper.isKnownAlgorithm(algorithm)) { throw new IllegalArgumentException("Unknown checksum algorithm: " + algorithm); } - + Resource csRes = resource.clone(resource.getName() + "." + algorithm); if (csRes.exists()) { Message.debug(algorithm + " file found for " + resource + ": checking..."); @@ -940,8 +1039,7 @@ public abstract class BasicResolver extends AbstractResolver { } else { resource = new URLResource(url); } - ret = new ResolvedResource(resource, artifact.getModuleRevisionId() - .getRevision()); + ret = new ResolvedResource(resource, artifact.getModuleRevisionId().getRevision()); } return ret; } finally { @@ -964,11 +1062,11 @@ public abstract class BasicResolver extends AbstractResolver { public void setCheckconsistency(boolean checkConsitency) { checkconsistency = checkConsitency; } - + public void setForce(boolean force) { this.force = force; } - + public boolean isForce() { return force; } @@ -978,28 +1076,27 @@ public abstract class BasicResolver extends AbstractResolver { } public void setAllownomd(boolean b) { - Message.deprecated( - "allownomd is deprecated, please use descriptor=\"" - + (b ? DESCRIPTOR_OPTIONAL : DESCRIPTOR_REQUIRED) + "\" instead"); + Message.deprecated("allownomd is deprecated, please use descriptor=\"" + + (b ? DESCRIPTOR_OPTIONAL : DESCRIPTOR_REQUIRED) + "\" instead"); allownomd = b; } - + /** - * Sets the module descriptor presence rule. - * Should be one of {@link #DESCRIPTOR_REQUIRED} or {@link #DESCRIPTOR_OPTIONAL}. - * - * @param descriptorRule the descriptor rule to use with this resolver. + * Sets the module descriptor presence rule. Should be one of {@link #DESCRIPTOR_REQUIRED} or + * {@link #DESCRIPTOR_OPTIONAL}. + * + * @param descriptorRule + * the descriptor rule to use with this resolver. */ public void setDescriptor(String descriptorRule) { if (DESCRIPTOR_REQUIRED.equals(descriptorRule)) { - allownomd = false; + allownomd = false; } else if (DESCRIPTOR_OPTIONAL.equals(descriptorRule)) { - allownomd = true; + allownomd = true; } else { - throw new IllegalArgumentException( - "unknown descriptor rule '" + descriptorRule - + "'. Allowed rules are: " - + Arrays.asList(new String[] {DESCRIPTOR_REQUIRED, DESCRIPTOR_OPTIONAL})); + throw new IllegalArgumentException("unknown descriptor rule '" + descriptorRule + + "'. Allowed rules are: " + + Arrays.asList(new String[] {DESCRIPTOR_REQUIRED, DESCRIPTOR_OPTIONAL})); } } @@ -1024,9 +1121,8 @@ public abstract class BasicResolver extends AbstractResolver { public void setChecksums(String checksums) { this.checksums = checksums; } - - private final ArtifactResourceResolver artifactResourceResolver - = new ArtifactResourceResolver() { + + private final ArtifactResourceResolver artifactResourceResolver = new ArtifactResourceResolver() { public ResolvedResource resolve(Artifact artifact) { artifact = fromSystem(artifact); return getArtifactRef(artifact, null); @@ -1039,8 +1135,7 @@ public abstract class BasicResolver extends AbstractResolver { dest.delete(); } File part = new File(dest.getAbsolutePath() + ".part"); - if (resource.getName().equals( - String.valueOf(artifact.getUrl()))) { + if (resource.getName().equals(String.valueOf(artifact.getUrl()))) { if (part.getParentFile() != null) { part.getParentFile().mkdirs(); } @@ -1049,11 +1144,10 @@ public abstract class BasicResolver extends AbstractResolver { getAndCheck(resource, part); } if (!part.renameTo(dest)) { - throw new IOException( - "impossible to move part file to definitive one: " - + part + " -> " + dest); + throw new IOException("impossible to move part file to definitive one: " + part + + " -> " + dest); } - + } }; diff --git a/test/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileLoaderTest.java b/test/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileLoaderTest.java index e1eb5480..a36ee3e4 100644 --- a/test/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileLoaderTest.java +++ b/test/java/org/apache/ivy/osgi/core/ExecutionEnvironmentProfileLoaderTest.java @@ -20,7 +20,6 @@ package org.apache.ivy.osgi.core; import java.util.Map; import org.apache.ivy.osgi.core.ExecutionEnvironmentProfileProvider; -import org.apache.ivy.osgi.repo.ExecutionEnvironmentProfile; import junit.framework.TestCase; diff --git a/test/java/org/apache/ivy/osgi/obr/OBRParserTest.java b/test/java/org/apache/ivy/osgi/obr/OBRParserTest.java index 6ef203e3..847380a5 100644 --- a/test/java/org/apache/ivy/osgi/obr/OBRParserTest.java +++ b/test/java/org/apache/ivy/osgi/obr/OBRParserTest.java @@ -24,16 +24,16 @@ import java.util.Iterator; import junit.framework.TestCase; import org.apache.ivy.osgi.obr.xml.OBRXMLParser; -import org.apache.ivy.osgi.repo.BundleRepo; +import org.apache.ivy.osgi.repo.BundleRepoDescriptor; import org.apache.ivy.util.Message; public class OBRParserTest extends TestCase { public void testParse() throws Exception { - BundleRepo repo = OBRXMLParser + BundleRepoDescriptor repo = OBRXMLParser .parse(new FileInputStream(new File("test/test-obr/obr.xml"))); assertNotNull(repo); - System.out.println(repo.getBundles().size() + " bundles successfully parsed, " + System.out.println(repo.getModules().size() + " bundles successfully parsed, " + Message.getProblems().size() + " errors"); Iterator itPb = Message.getProblems().iterator(); while (itPb.hasNext()) { diff --git a/test/java/org/apache/ivy/osgi/obr/OBRResolverTest.java b/test/java/org/apache/ivy/osgi/obr/OBRResolverTest.java index 0d2f86dc..50951995 100644 --- a/test/java/org/apache/ivy/osgi/obr/OBRResolverTest.java +++ b/test/java/org/apache/ivy/osgi/obr/OBRResolverTest.java @@ -49,7 +49,7 @@ import org.apache.ivy.osgi.core.BundleInfo; import org.apache.ivy.osgi.core.BundleInfoAdapter; import org.apache.ivy.osgi.core.ManifestParser; import org.apache.ivy.osgi.obr.OBRResolver; -import org.apache.ivy.osgi.repo.BundleRepoResolver.RequirementStrategy; +import org.apache.ivy.osgi.repo.RepoDescriptorBasedResolver.RequirementStrategy; import org.apache.ivy.plugins.resolver.DependencyResolver; import org.apache.ivy.plugins.resolver.DualResolver; import org.apache.ivy.plugins.resolver.FileSystemResolver; @@ -285,7 +285,7 @@ public class OBRResolverTest extends TestCase { DefaultModuleDescriptor md = BundleInfoAdapter.toModuleDescriptor(bundleInfo, null); ResolveReport resolveReport = ivy.resolve(md, new ResolveOptions().setConfs(new String[] {conf}).setOutputReport(false)); - assertFalse("resolve failed " + resolveReport.getProblemMessages(), + assertFalse("resolve failed " + resolveReport.getAllProblemMessages(), resolveReport.hasError()); Set/* */actual = new HashSet/* */(); List/* */artifacts = resolveReport.getArtifacts(); diff --git a/test/java/org/apache/ivy/osgi/repo/BundleRepoTest.java b/test/java/org/apache/ivy/osgi/repo/BundleRepoTest.java index 2d880688..314d2708 100644 --- a/test/java/org/apache/ivy/osgi/repo/BundleRepoTest.java +++ b/test/java/org/apache/ivy/osgi/repo/BundleRepoTest.java @@ -32,6 +32,7 @@ import javax.xml.transform.stream.StreamResult; import junit.framework.TestCase; import org.apache.ivy.core.settings.IvySettings; +import org.apache.ivy.osgi.core.ExecutionEnvironmentProfileProvider; import org.apache.ivy.osgi.obr.xml.OBRXMLParser; import org.apache.ivy.osgi.obr.xml.OBRXMLWriter; import org.apache.ivy.plugins.repository.file.FileRepository; @@ -43,10 +44,11 @@ public class BundleRepoTest extends TestCase { public void testFS() throws Exception { FSManifestIterable it = new FSManifestIterable(new File("test/test-repo/bundlerepo"), ""); - BundleRepo repo = new BundleRepo(); + BundleRepoDescriptor repo = new BundleRepoDescriptor( + ExecutionEnvironmentProfileProvider.getInstance()); repo.populate(it.iterator()); - BundleRepo repo2 = OBRXMLParser.parse(new FileInputStream( + BundleRepoDescriptor repo2 = OBRXMLParser.parse(new FileInputStream( "test/test-repo/bundlerepo/repo.xml")); assertEquals(repo, repo2); @@ -55,10 +57,11 @@ public class BundleRepoTest extends TestCase { public void testFileRepo() throws Exception { RepositoryManifestIterable it = new RepositoryManifestIterable(new FileRepository(new File( "test/test-repo/bundlerepo").getAbsoluteFile())); - BundleRepo repo = new BundleRepo(); + BundleRepoDescriptor repo = new BundleRepoDescriptor( + ExecutionEnvironmentProfileProvider.getInstance()); repo.populate(it.iterator()); - BundleRepo repo2 = OBRXMLParser.parse(new FileInputStream( + BundleRepoDescriptor repo2 = OBRXMLParser.parse(new FileInputStream( "test/test-repo/bundlerepo/repo.xml")); assertEquals(repo, repo2); @@ -74,18 +77,20 @@ public class BundleRepoTest extends TestCase { + "/[organisation]/[module]/[revision]/[type]s/[artifact]-[revision].[ext]"); fileSystemResolver.setSettings(new IvySettings()); ResolverManifestIterable it = new ResolverManifestIterable(fileSystemResolver); - BundleRepo repo = new BundleRepo(); + BundleRepoDescriptor repo = new BundleRepoDescriptor( + ExecutionEnvironmentProfileProvider.getInstance()); repo.populate(it.iterator()); - BundleRepo repo2 = OBRXMLParser - .parse(new FileInputStream("test/test-repo/ivyrepo/repo.xml")); + BundleRepoDescriptor repo2 = OBRXMLParser.parse(new FileInputStream( + "test/test-repo/ivyrepo/repo.xml")); assertEquals(repo, repo2); } public void testXMLSerialisation() throws SAXException, ParseException, IOException { FSManifestIterable it = new FSManifestIterable(new File("test/test-repo/bundlerepo"), ""); - BundleRepo repo = new BundleRepo(); + BundleRepoDescriptor repo = new BundleRepoDescriptor( + ExecutionEnvironmentProfileProvider.getInstance()); repo.populate(it.iterator()); SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); @@ -100,10 +105,10 @@ public class BundleRepoTest extends TestCase { StreamResult stream = new StreamResult(out); hd.setResult(stream); - OBRXMLWriter.writeBundles(repo.getBundles().iterator(), hd); + OBRXMLWriter.writeManifests(it.iterator(), hd, false); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - BundleRepo repo2 = OBRXMLParser.parse(in); + BundleRepoDescriptor repo2 = OBRXMLParser.parse(in); assertEquals(repo, repo2); } diff --git a/test/test-repo/ivyrepo/repo.xml b/test/test-repo/ivyrepo/repo.xml index c72adb20..bd403049 100644 --- a/test/test-repo/ivyrepo/repo.xml +++ b/test/test-repo/ivyrepo/repo.xml @@ -30,53 +30,53 @@ + uri="ivy://org.apache.ivy.osgi/testbundle-importing?rev=3.2.1&type=jar&art=testbundle-importing&ext=jar">

+ uri="ivy://org.apache.ivy.osgi/testbundle-importing-optional?rev=3.2.1&type=jar&art=testbundle-importing-optional&ext=jar">

+ uri="ivy://org.apache.ivy.osgi/testbundle-importing-transitiveoptional?rev=3.2.1&type=jar&art=testbundle-importing-transitiveoptional&ext=jar">

+ uri="ivy://org.apache.ivy.osgi/testbundle-importing-version?rev=3.2.1&type=jar&art=testbundle-importing-version&ext=jar">

+ uri="ivy://org.apache.ivy.osgi/testbundle-importing-rangeversion?rev=3.2.1&type=jar&art=testbundle-importing-rangeversion&ext=jar">

+ uri="ivy://org.apache.ivy.osgi/testbundle-importing-use?rev=3.2.1&type=jar&art=testbundle-importing-use&ext=jar">

+ uri="ivy://org.apache.ivy.osgi/testbundle-require?&rev=1.1.1&type=jar&art=testbundle-require&ext=jar"> + uri="ivy://org.apache.ivy.osgi/testbundle-use?rev=2.2.2&type=jar&art=testbundle-use&ext=jar">

@@ -85,17 +85,17 @@ + uri="ivy://org.apache.ivy.osgi/testbundle-exporting-ambiguity?rev=3.3.3&type=jar&art=testbundle-exporting-ambiguity&ext=jar">

+ uri="ivy://org.apache.ivy.osgi/testbundle-importing-ambiguity?rev=3.2.1&type=jar&art=testbundle-importing-ambiguity&ext=jar"> + uri="ivy://org.apache.ivy.osgi/testbundle-require-ambiguity?rev=1.1.1&type=jar&art=testbundle-require-ambiguity&ext=jar">