From 16773d9cc45e4fb7d3d4ca3c4c169205fbb1e905 Mon Sep 17 00:00:00 2001 From: Eric Milles Date: Fri, 12 Sep 2025 14:56:01 -0500 Subject: [PATCH] reformat and refactor --- META-INF/MANIFEST.MF | 4 +- src/java/org/apache/ivy/ant/IvyDeliver.java | 16 +- .../apache/ivy/core/settings/IvySettings.java | 57 ++-- .../xml/XmlModuleDescriptorUpdater.java | 110 +++---- .../org/apache/ivy/ant/IvyDeliverTest.java | 278 +++++++----------- 5 files changed, 189 insertions(+), 276 deletions(-) diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index 1dcde4b72..71f7239b0 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -67,7 +67,7 @@ Export-Package: org.apache.ivy;version="2.0.0", org.apache.ivy.core.resolve;version="2.0.0", org.apache.ivy.core.retrieve;version="2.0.0", org.apache.ivy.core.search;version="2.0.0", - org.apache.ivy.core.settings;version="2.0.0", + org.apache.ivy.core.settings;version="2.6.0", org.apache.ivy.core.sort;version="2.0.0", org.apache.ivy.osgi.core;version="2.3.0", org.apache.ivy.osgi.filter;version="2.3.0", @@ -88,7 +88,7 @@ Export-Package: org.apache.ivy;version="2.0.0", org.apache.ivy.plugins.pack;version="2.6.0", org.apache.ivy.plugins.parser;version="2.0.0", org.apache.ivy.plugins.parser.m2;version="2.0.0", - org.apache.ivy.plugins.parser.xml;version="2.0.0", + org.apache.ivy.plugins.parser.xml;version="2.6.0", org.apache.ivy.plugins.report;version="2.0.0", org.apache.ivy.plugins.repository;version="2.0.0", org.apache.ivy.plugins.repository.file;version="2.0.0", diff --git a/src/java/org/apache/ivy/ant/IvyDeliver.java b/src/java/org/apache/ivy/ant/IvyDeliver.java index 3d2af066c..836eea7c1 100644 --- a/src/java/org/apache/ivy/ant/IvyDeliver.java +++ b/src/java/org/apache/ivy/ant/IvyDeliver.java @@ -30,6 +30,7 @@ import org.apache.ivy.core.settings.IvySettings; import org.apache.ivy.util.DateUtil; import org.apache.ivy.util.Message; + import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.CallTarget; import org.apache.tools.ant.taskdefs.Echo; @@ -412,19 +413,20 @@ public void doExecute() throws BuildException { drResolver = new DeliverDRResolver(); } - DeliverOptions options = new DeliverOptions(status, pubdate, drResolver, - doValidate(settings), replacedynamicrev, splitToArray(conf)) - .setResolveId(resolveId).setReplaceForcedRevisions(isReplaceForcedRev()) - .setGenerateRevConstraint(generateRevConstraint).setMerge(merge) - .setPubBranch(pubBranch); + DeliverOptions options = + new DeliverOptions(status, pubdate, drResolver, doValidate(settings), replacedynamicrev, splitToArray(conf)) + .setGenerateRevConstraint(generateRevConstraint) + .setReplaceForcedRevisions(isReplaceForcedRev()) + .setResolveId(resolveId) + .setPubBranch(pubBranch) + .setMerge(merge); if (mrid == null) { ivy.deliver(pubRevision, deliverpattern, options); } else { ivy.deliver(mrid, pubRevision, deliverpattern, options); } } catch (Exception e) { - throw new BuildException("impossible to deliver " + (mrid == null ? resolveId : mrid) - + ": " + e, e); + throw new BuildException("impossible to deliver " + (mrid == null ? resolveId : mrid) + ": " + e, e); } finally { if (isLeading) { if (deliveryList.exists()) { diff --git a/src/java/org/apache/ivy/core/settings/IvySettings.java b/src/java/org/apache/ivy/core/settings/IvySettings.java index 04e62bf1f..2d6c7ad47 100644 --- a/src/java/org/apache/ivy/core/settings/IvySettings.java +++ b/src/java/org/apache/ivy/core/settings/IvySettings.java @@ -17,6 +17,25 @@ */ package org.apache.ivy.core.settings; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.security.AccessControlException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + import org.apache.ivy.Ivy; import org.apache.ivy.core.IvyPatternHelper; import org.apache.ivy.core.NormalRelativeUrlResolver; @@ -97,25 +116,6 @@ import org.apache.ivy.util.filter.Filter; import org.apache.ivy.util.url.URLHandlerRegistry; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.security.AccessControlException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - import static org.apache.ivy.util.StringUtils.splitToArray; public class IvySettings implements SortEngineSettings, PublishEngineSettings, ParserSettings, @@ -933,17 +933,16 @@ public synchronized boolean hasResolver(String resolverName) { } public synchronized DependencyResolver getResolver(String resolverName) { - DependencyResolver r = getDictatorResolver(); - if (r != null) { - return r; - } - DependencyResolver resolver = resolversMap.get(resolverName); + DependencyResolver resolver = getDictatorResolver(); if (resolver == null) { - Message.error("unknown resolver " + resolverName); - } else if (workspaceResolver != null && !(resolver instanceof WorkspaceChainResolver)) { - resolver = new WorkspaceChainResolver(this, resolver, workspaceResolver); - resolversMap.put(resolver.getName(), resolver); - resolversMap.put(resolverName, resolver); + resolver = resolversMap.get(resolverName); + if (resolver == null) { + Message.debug("unknown resolver " + resolverName); + } else if (workspaceResolver != null && !(resolver instanceof WorkspaceChainResolver)) { + resolver = new WorkspaceChainResolver(this, resolver, workspaceResolver); + resolversMap.put(resolver.getName(), resolver); + resolversMap.put(resolverName, resolver); + } } return resolver; } diff --git a/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java b/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java index 9af53fa39..9535ad5f2 100644 --- a/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java +++ b/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java @@ -59,6 +59,7 @@ import org.apache.ivy.util.Message; import org.apache.ivy.util.XMLHelper; import org.apache.ivy.util.extendable.ExtendableItemHelper; + import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -166,23 +167,19 @@ public static void update(InputStream in, Resource res, File destFile, UpdateOpt private static class UpdaterHandler extends DefaultHandler implements LexicalHandler { /** standard attributes of ivy-module/info */ - private static final Collection STD_ATTS = Arrays.asList("organisation", - "module", "branch", "revision", "status", "publication", "namespace"); + private static final Collection STD_ATTS = Collections.unmodifiableList(Arrays.asList("organisation", "module", "branch", "revision", "status", "publication", "namespace")); /** elements that may appear inside ivy-module, in expected order */ - private static final List MODULE_ELEMENTS = Arrays.asList("info", - "configurations", "publications", "dependencies", "conflicts"); + private static final List MODULE_ELEMENTS = Collections.unmodifiableList(Arrays.asList("info", "configurations", "publications", "dependencies", "conflicts")); /** element position of "configurations" inside "ivy-module" */ - private static final int CONFIGURATIONS_POSITION = MODULE_ELEMENTS - .indexOf("configurations"); + private static final int CONFIGURATIONS_POSITION = MODULE_ELEMENTS.indexOf("configurations"); /** element position of "dependencies" inside "ivy-module" */ private static final int DEPENDENCIES_POSITION = MODULE_ELEMENTS.indexOf("dependencies"); /** elements that may appear inside of ivy-module/info */ - private static final Collection INFO_ELEMENTS = Arrays.asList("extends", - "ivyauthor", "license", "repository", "description"); + private static final Collection INFO_ELEMENTS = Collections.unmodifiableList(Arrays.asList("extends", "ivyauthor", "license", "repository", "description")); private final ParserSettings settings; @@ -212,7 +209,7 @@ private static class UpdaterHandler extends DefaultHandler implements LexicalHan private final UpdateOptions options; - public UpdaterHandler(URL relativePathCtx, PrintWriter out, final UpdateOptions options) { + UpdaterHandler(URL relativePathCtx, PrintWriter out, final UpdateOptions options) { this.options = options; this.settings = options.getSettings(); this.out = out; @@ -291,8 +288,8 @@ public void startElement(String uri, String localName, String qName, Attributes // according to ivy.xsd, all elements must occur before // the , or elements if (options.isMerge() - && ("exclude".equals(localName) || "override".equals(localName) || "conflict" - .equals(localName)) && "ivy-module/dependencies".equals(getContext())) { + && "ivy-module/dependencies".equals(getContext()) + && ("exclude".equals(localName) || "override".equals(localName) || "conflict".equals(localName))) { ModuleDescriptor merged = options.getMergedDescriptor(); writeInheritedDependencies(merged); out.println(); @@ -547,6 +544,7 @@ private void startElementInDependency(Attributes attributes) { buffers.push(buffer); confAttributeBuffers.push(buffer); buffer.setDefaultPrint(isNullOrEmpty(attributes.getValue("conf"))); + write(" extraAttributes = ExtendableItemHelper.getExtraAttributes(settings, attributes, - XmlModuleDescriptorParser.DEPENDENCY_REGULAR_ATTRIBUTES); - ModuleRevisionId localMrid = ModuleRevisionId.newInstance(org, module, branch, - revision, extraAttributes); - ModuleRevisionId systemMrid = (ns == null) ? localMrid : ns.getToSystemTransformer() - .transform(localMrid); + Map extraAttributes = ExtendableItemHelper.getExtraAttributes(settings, attributes, XmlModuleDescriptorParser.DEPENDENCY_REGULAR_ATTRIBUTES); + ModuleRevisionId localMrid = ModuleRevisionId.newInstance(org, module, branch, revision, extraAttributes); + ModuleRevisionId systemMrid = (ns == null) ? localMrid : ns.getToSystemTransformer().transform(localMrid); String newBranch = resolvedBranches.get(systemMrid); @@ -636,8 +631,7 @@ private void startElementInDependency(Attributes attributes) { } break; default: - write(" " + attName + "=\"" - + substitute(settings, attributes.getValue(attName)) + "\""); + write(" " + attName + "=\"" + substitute(settings, attributes.getValue(attName)) + "\""); break; } } @@ -985,8 +979,7 @@ private void writeInheritedItems(ModuleDescriptor merged, InheritableItem[] item // we can add some useful comments PrintWriter out = getWriter(); - Map> inheritedItems = collateInheritedItems( - merged, items); + Map> inheritedItems = collateInheritedItems(merged, items); boolean hasItems = !inheritedItems.isEmpty(); if (hasItems && includeContainer) { @@ -1005,8 +998,7 @@ private void writeInheritedItems(ModuleDescriptor merged, InheritableItem[] item justOpen = null; } - for (Map.Entry> entry : inheritedItems - .entrySet()) { + for (Map.Entry> entry : inheritedItems.entrySet()) { if (justOpen != null) { out.println(">"); justOpen = null; // helps endElement() decide how to write close tags @@ -1048,20 +1040,15 @@ private void writeInheritanceComment(String itemDescription, Object parentInfo) * @return maps parent ModuleRevisionId to a List of InheritedItems imported from that * parent */ - private Map> collateInheritedItems( - ModuleDescriptor merged, InheritableItem[] items) { + private Map> collateInheritedItems(ModuleDescriptor merged, InheritableItem[] items) { Map> inheritedItems = new LinkedHashMap<>(); for (InheritableItem item : items) { - ModuleRevisionId source = item.getSourceModule(); // ignore items that are defined directly in the child descriptor - if (source != null - && !source.getModuleId().equals(merged.getModuleRevisionId().getModuleId())) { - List accum = inheritedItems.get(source); - if (accum == null) { - accum = new ArrayList<>(); - inheritedItems.put(source, accum); - } - accum.add(item); + ModuleRevisionId sourceModule = item.getSourceModule(); + ModuleRevisionId mergedModule = merged.getModuleRevisionId(); + if (sourceModule != null && !sourceModule.getModuleId().equals(mergedModule.getModuleId())) { + List list = inheritedItems.computeIfAbsent(sourceModule, k -> new ArrayList<>()); + list.add(item); } } return inheritedItems; @@ -1081,8 +1068,7 @@ private void writeInheritedDescription(ModuleDescriptor merged) { writer.println(">"); } writeInheritanceComment("description", "parent"); - writer.println(getIndent() + "" + XMLHelper.escape(description) - + ""); + writer.println(getIndent() + "" + XMLHelper.escape(description) + ""); // restore the indent that existed before we wrote the extra elements writer.print(currentIndent); justOpen = null; @@ -1093,29 +1079,29 @@ private void writeInheritedDescription(ModuleDescriptor merged) { private void writeInheritedConfigurations(ModuleDescriptor merged) { if (!mergedConfigurations) { mergedConfigurations = true; - writeInheritedItems(merged, merged.getConfigurations(), - ConfigurationPrinter.INSTANCE, "configurations", false); + InheritableItem[] items = merged.getConfigurations(); + writeInheritedItems(merged, items, ConfigurationPrinter.INSTANCE, "configurations", false); } } private void writeInheritedDependencies(ModuleDescriptor merged) { if (!mergedDependencies) { mergedDependencies = true; - writeInheritedItems(merged, getDependencies(merged), DependencyPrinter.INSTANCE, - "dependencies", false); + InheritableItem[] items = getDependencies(merged); + writeInheritedItems(merged, items, DependencyPrinter.INSTANCE, "dependencies", false); } } private DependencyDescriptor[] getDependencies(ModuleDescriptor merged) { - DependencyDescriptor[] dependencies = merged.getDependencies(); - for (int i = 0; i < dependencies.length; i += 1) { - ModuleRevisionId mrid = dependencies[i].getDependencyRevisionId(); - String rev = resolvedRevisions.get(mrid); // IVY-1410 - if (rev != null && !rev.equals(mrid.getRevision())) { - dependencies[i] = dependencies[i].clone(ModuleRevisionId.newInstance(mrid, rev)); + DependencyDescriptor[] dependencies = merged.getDependencies(); + for (int i = 0; i < dependencies.length; i += 1) { + ModuleRevisionId mrid = dependencies[i].getDependencyRevisionId(); + String rev = resolvedRevisions.get(mrid); // IVY-1410 + if (rev != null && !rev.equals(mrid.getRevision())) { + dependencies[i] = dependencies[i].clone(ModuleRevisionId.newInstance(mrid, rev)); + } } - } - return dependencies; + return dependencies; } /** @@ -1137,32 +1123,24 @@ private DependencyDescriptor[] getDependencies(ModuleDescriptor merged) { * a descriptor element name, for example "configurations" or "info" */ private void flushMergedElementsBefore(String moduleElement) { - if (options.isMerge() && context.size() == 1 && "ivy-module".equals(context.peek()) - && !(mergedConfigurations && mergedDependencies)) { - + if (options.isMerge() && context.size() == 1 && "ivy-module".equals(context.peek()) && !(mergedConfigurations && mergedDependencies)) { // calculate the position of the element in ivy-module - int position = (moduleElement == null) ? MODULE_ELEMENTS.size() - : MODULE_ELEMENTS.indexOf(moduleElement); - + int position = (moduleElement == null) ? MODULE_ELEMENTS.size() : MODULE_ELEMENTS.indexOf(moduleElement); ModuleDescriptor merged = options.getMergedDescriptor(); + InheritableItem[] items; // see if we should write - if (!mergedConfigurations && position > CONFIGURATIONS_POSITION - && merged.getConfigurations().length > 0) { - + items = merged.getConfigurations(); + if (!mergedConfigurations && items.length > 0 && position > CONFIGURATIONS_POSITION) { mergedConfigurations = true; - writeInheritedItems(merged, merged.getConfigurations(), - ConfigurationPrinter.INSTANCE, "configurations", true); - + writeInheritedItems(merged, items, ConfigurationPrinter.INSTANCE, "configurations", true); } - // see if we should write - if (!mergedDependencies && position > DEPENDENCIES_POSITION - && merged.getDependencies().length > 0) { + // see if we should write + items = getDependencies(merged); + if (!mergedDependencies && items.length > 0 && position > DEPENDENCIES_POSITION) { mergedDependencies = true; - writeInheritedItems(merged, merged.getDependencies(), - DependencyPrinter.INSTANCE, "dependencies", true); - + writeInheritedItems(merged, items, DependencyPrinter.INSTANCE, "dependencies", true); } } } diff --git a/test/java/org/apache/ivy/ant/IvyDeliverTest.java b/test/java/org/apache/ivy/ant/IvyDeliverTest.java index 0c29614e2..9c673d628 100644 --- a/test/java/org/apache/ivy/ant/IvyDeliverTest.java +++ b/test/java/org/apache/ivy/ant/IvyDeliverTest.java @@ -22,8 +22,11 @@ import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.apache.ivy.TestHelper; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; @@ -94,7 +97,12 @@ private void cleanRep() { del.execute(); } - @Test + private ModuleDescriptor parse(File ivyFile, boolean validate) throws Exception { + assertTrue(ivyFile.exists()); + return XmlModuleDescriptorParser.getInstance().parseDescriptor(new IvySettings(), ivyFile.toURI().toURL(), validate); + } + + @Test public void testMergeParent() throws IOException { // publish the parent descriptor first, so that it can be found while // we are reading the child descriptor. @@ -112,8 +120,7 @@ public void testMergeParent() throws IOException { pubParent.execute(); // resolve and deliver the child descriptor - project.setProperty("ivy.dep.file", - "test/java/org/apache/ivy/ant/ivy-extends-multiconf.xml"); + project.setProperty("ivy.dep.file", "test/java/org/apache/ivy/ant/ivy-extends-multiconf.xml"); res = new IvyResolve(); res.setProject(project); res.execute(); @@ -130,24 +137,23 @@ public void testMergeParent() throws IOException { // we could do a better job of this with xmlunit int lineNo = 1; - try (BufferedReader merged = new BufferedReader(new FileReader(delivered)); - BufferedReader expected = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("ivy-extends-merged.xml")))) { - String mergeLine = merged.readLine(); - String expectedLine = expected.readLine(); - while (mergeLine != null && expectedLine != null) { - mergeLine = mergeLine.trim(); - expectedLine = expectedLine.trim(); - - if (!mergeLine.startsWith("IVY-404 */ @Test @@ -312,16 +291,11 @@ public void testWithBranch() throws Exception { deliver.execute(); // should have done the ivy delivering - File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), true); - assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), - md.getModuleRevisionId()); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.2.xml"), true); + assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), md.getModuleRevisionId()); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(1, dds.length); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "TRUNK", "2.2"), - dds[0].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "TRUNK", "2.2"), dds[0].getDependencyRevisionId()); } @Test @@ -330,8 +304,7 @@ public void testReplaceBranch() throws Exception { settings.setProject(project); settings.execute(); // change the default branch to use - IvyAntSettings.getDefaultInstance(settings).getConfiguredIvyInstance(settings) - .getSettings().setDefaultBranch("BRANCH1"); + IvyAntSettings.getDefaultInstance(settings).getConfiguredIvyInstance(settings).getSettings().setDefaultBranch("BRANCH1"); // resolve a module dependencies project.setProperty("ivy.dep.file", "test/java/org/apache/ivy/ant/ivy-latest.xml"); @@ -346,24 +319,17 @@ public void testReplaceBranch() throws Exception { // should have done the ivy delivering, including setting the branch according to the // configured default - File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), true); - assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), - md.getModuleRevisionId()); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.2.xml"), true); + assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), md.getModuleRevisionId()); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(1, dds.length); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "BRANCH1", "2.2"), - dds[0].getDependencyRevisionId()); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "latest.integration"), - dds[0].getDynamicConstraintDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "BRANCH1", "2.2"), dds[0].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "latest.integration"), dds[0].getDynamicConstraintDependencyRevisionId()); } /** * Test case for IVY-415. * - * @throws Exception if something goes wrong * @see IVY-415 */ @Test @@ -380,28 +346,22 @@ public void testWithExtraAttributes() throws Exception { deliver.execute(); // should have done the ivy delivering - File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), false); - assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), - md.getModuleRevisionId()); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.2.xml"), false); + assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), md.getModuleRevisionId()); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(1, dds.length); Map extraAtt = new HashMap<>(); extraAtt.put("myExtraAtt", "myValue"); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "2.2", extraAtt), - dds[0].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "2.2", extraAtt), dds[0].getDependencyRevisionId()); } /** * Test case for IVY-1300. * - * @throws Exception if something goes wrong * @see IVY-1300 */ @Test - public void testIVY1300() throws Exception { + public void testDeliverRevisionBeforeConflictResolution() throws Exception { project.setProperty("ivy.settings.file", "test/repositories/IVY-1300/ivysettings.xml"); project.setProperty("ivy.dep.file", "test/repositories/IVY-1300/assembly-ivy.xml"); IvyResolve res = new IvyResolve(); @@ -416,16 +376,11 @@ public void testIVY1300() throws Exception { deliver.execute(); // verify that the dynamic revisions have been replaced by the resolved ones (before conflict resolution) - File deliveredIvyFile = new File("build/test/deliver/ivy-1.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), false); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.xml"), false); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(2, dds.length); - assertEquals(ModuleRevisionId.newInstance("myorg", "modA", "releasebranch", "1"), - dds[0].getDependencyRevisionId()); - assertEquals(ModuleRevisionId.newInstance("myorg", "modB", "releasebranch", "1"), - dds[1].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("myorg", "modA", "releasebranch", "1"), dds[0].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("myorg", "modB", "releasebranch", "1"), dds[1].getDependencyRevisionId()); } /** @@ -449,10 +404,7 @@ public void testDeliverWithTransitiveDepsInDifferentConfs() throws Exception { deliver.execute(); // now check that the transitive dependency didn't override the direct ones - File deliveredIvyFile = new File("build/test/deliver/ivy-1.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURL(), false); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.xml"), false); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(2, dds.length); assertEquals(ModuleRevisionId.newInstance("simple", "modA", "5"), dds[0].getDependencyRevisionId()); @@ -480,10 +432,7 @@ public void testDeliverWithTransitiveDepsInOverlappingConfsTransitiveNewer() thr deliver.execute(); // now check that the transitive dependency didn't override the direct ones - File deliveredIvyFile = new File("build/test/deliver/ivy-1.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURL(), false); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.xml"), false); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(2, dds.length); assertEquals(ModuleRevisionId.newInstance("overlap-newer", "modA", "1"), dds[0].getDependencyRevisionId()); @@ -511,10 +460,7 @@ public void testDeliverWithTransitiveDepsInOverlappingConfsTransitiveOlder() thr deliver.execute(); // now check that the transitive dependency didn't override the direct ones - File deliveredIvyFile = new File("build/test/deliver/ivy-1.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURL(), false); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.xml"), false); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(2, dds.length); assertEquals(ModuleRevisionId.newInstance("overlap-older", "modA", "5"), dds[0].getDependencyRevisionId()); @@ -525,32 +471,37 @@ public void testDeliverWithTransitiveDepsInOverlappingConfsTransitiveOlder() thr public void testWithDynEvicted() throws Exception { project.setProperty("ivy.dep.file", "test/java/org/apache/ivy/ant/ivy-dyn-evicted.xml"); IvyResolve res = new IvyResolve(); - res.setValidate(false); res.setProject(project); + res.setValidate(false); res.execute(); - deliver.setPubrevision("1.2"); deliver.setDeliverpattern("build/test/deliver/ivy-[revision].xml"); + deliver.setPubrevision("1.2"); deliver.setValidate(false); deliver.execute(); // should have done the ivy delivering File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), false); - assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), - md.getModuleRevisionId()); + ModuleDescriptor md = parse(deliveredIvyFile, false); + assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), md.getModuleRevisionId()); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(2, dds.length); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "1.1"), - dds[0].getDependencyRevisionId()); + // rev="1+" should have been replaced by rev="1.1" + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "1.1"), dds[0].getDependencyRevisionId()); + + IvyRetrieve ret = new IvyRetrieve(); + ret.setPattern("build/test/retrieve/[artifact]-[revision].[ext]"); + ret.setProject(project); + ret.execute(); + + Set expectFileSet = new HashSet<>(Arrays.asList("mod1.2-2.2.jar", "mod6.1-2.0.jar")); + Set actualFileSet = new HashSet<>(Arrays.asList(new File("build/test/retrieve").list())); + assertEquals("Delivered Ivy descriptor inconsistent with retrieved artifacts", expectFileSet, actualFileSet); } /** * Test case for IVY-707. * - * @throws Exception if something goes wrong * @see IVY-707 */ @Test @@ -558,26 +509,32 @@ public void testWithDynEvicted2() throws Exception { // same as previous but dynamic dependency is placed after the one causing the conflict project.setProperty("ivy.dep.file", "test/java/org/apache/ivy/ant/ivy-dyn-evicted2.xml"); IvyResolve res = new IvyResolve(); - res.setValidate(false); res.setProject(project); + res.setValidate(false); res.execute(); - deliver.setPubrevision("1.2"); deliver.setDeliverpattern("build/test/deliver/ivy-[revision].xml"); + deliver.setPubrevision("1.2"); deliver.setValidate(false); deliver.execute(); // should have done the ivy delivering File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), false); - assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), - md.getModuleRevisionId()); + ModuleDescriptor md = parse(deliveredIvyFile, false); + assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), md.getModuleRevisionId()); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(2, dds.length); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "1.1"), - dds[1].getDependencyRevisionId()); + // rev="1+" should have been replaced by rev="1.1" + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "1.1"), dds[1].getDependencyRevisionId()); + + IvyRetrieve ret = new IvyRetrieve(); + ret.setPattern("build/test/retrieve/[artifact]-[revision].[ext]"); + ret.setProject(project); + ret.execute(); + + Set expectFileSet = new HashSet<>(Arrays.asList("mod1.2-2.2.jar", "mod6.1-2.0.jar")); + Set actualFileSet = new HashSet<>(Arrays.asList(new File("build/test/retrieve").list())); + assertEquals("Delivered Ivy descriptor inconsistent with retrieved artifacts", expectFileSet, actualFileSet); } @Test @@ -592,14 +549,9 @@ public void testReplaceImportedConfigurations() throws Exception { deliver.execute(); // should have done the ivy delivering - File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - String deliveredFileContent = FileUtil.readEntirely(new BufferedReader(new FileReader( - deliveredIvyFile))); - assertTrue("import not replaced: import can still be found in file", - !deliveredFileContent.contains("import")); - assertTrue("import not replaced: conf1 cannot be found in file", - deliveredFileContent.contains("conf1")); + String deliveredFileContent = FileUtil.readEntirely(new File("build/test/deliver/ivy-1.2.xml")); + assertTrue("import not replaced: import can still be found in file", !deliveredFileContent.contains("import")); + assertTrue("import not replaced: conf1 cannot be found in file", deliveredFileContent.contains("conf1")); } @Test @@ -616,14 +568,9 @@ public void testReplaceVariables() throws Exception { deliver.execute(); // should have done the ivy delivering - File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - String deliveredFileContent = FileUtil.readEntirely(new BufferedReader(new FileReader( - deliveredIvyFile))); - assertTrue("variable not replaced: myvar can still be found in file", - !deliveredFileContent.contains("myvar")); - assertTrue("variable not replaced: myvalue cannot be found in file", - deliveredFileContent.contains("myvalue")); + String deliveredFileContent = FileUtil.readEntirely(new File("build/test/deliver/ivy-1.2.xml")); + assertTrue("variable not replaced: myvar can still be found in file", !deliveredFileContent.contains("myvar")); + assertTrue("variable not replaced: myvalue cannot be found in file", deliveredFileContent.contains("myvalue")); } @Test @@ -639,22 +586,16 @@ public void testNoReplaceDynamicRev() throws Exception { deliver.execute(); // should have done the ivy delivering - File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), true); - assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), - md.getModuleRevisionId()); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.2.xml"), true); + assertEquals(ModuleRevisionId.newInstance("apache", "resolve-latest", "1.2"), md.getModuleRevisionId()); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(1, dds.length); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "latest.integration"), - dds[0].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "latest.integration"), dds[0].getDependencyRevisionId()); } @Test public void testDifferentRevisionsForSameModule() throws Exception { - project.setProperty("ivy.dep.file", - "test/java/org/apache/ivy/ant/ivy-different-revisions.xml"); + project.setProperty("ivy.dep.file", "test/java/org/apache/ivy/ant/ivy-different-revisions.xml"); IvyResolve res = new IvyResolve(); res.setProject(project); res.execute(); @@ -664,19 +605,12 @@ public void testDifferentRevisionsForSameModule() throws Exception { deliver.execute(); // should have done the ivy delivering - File deliveredIvyFile = new File("build/test/deliver/ivy-1.2.xml"); - assertTrue(deliveredIvyFile.exists()); - ModuleDescriptor md = XmlModuleDescriptorParser.getInstance().parseDescriptor( - new IvySettings(), deliveredIvyFile.toURI().toURL(), true); - assertEquals(ModuleRevisionId.newInstance("apache", "different-revs", "1.2"), - md.getModuleRevisionId()); + ModuleDescriptor md = parse(new File("build/test/deliver/ivy-1.2.xml"), true); + assertEquals(ModuleRevisionId.newInstance("apache", "different-revs", "1.2"), md.getModuleRevisionId()); DependencyDescriptor[] dds = md.getDependencies(); assertEquals(3, dds.length); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "2.0"), - dds[0].getDependencyRevisionId()); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.1", "1.0"), - dds[1].getDependencyRevisionId()); - assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "1.1"), - dds[2].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "2.0"), dds[0].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.1", "1.0"), dds[1].getDependencyRevisionId()); + assertEquals(ModuleRevisionId.newInstance("org1", "mod1.2", "1.1"), dds[2].getDependencyRevisionId()); } }