diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index 92997f8b8..8d8feffb1 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -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/plugins/parser/xml/XmlModuleDescriptorParser.java b/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java index 878fd0ae0..952caf27d 100644 --- a/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java +++ b/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorParser.java @@ -83,6 +83,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; @@ -548,37 +549,30 @@ protected void extendsStarted(Attributes attributes) throws ParseException { * @param parent * a given parent module descriptor */ - protected void mergeWithOtherModuleDescriptor(List extendTypes, - ModuleDescriptor parent) { - + protected void mergeWithOtherModuleDescriptor(List extendTypes, ModuleDescriptor parent) { if (extendTypes.contains("all")) { mergeAll(parent); } else { if (extendTypes.contains("info")) { mergeInfo(parent); } - if (extendTypes.contains("configurations")) { mergeConfigurations(parent); } - if (extendTypes.contains("dependencies")) { mergeDependencies(parent.getDependencies()); } - if (extendTypes.contains("description")) { mergeDescription(parent.getDescription()); } - if (extendTypes.contains("licenses")) { mergeLicenses(parent.getLicenses()); } - if (extendTypes.contains("excludes")) { mergeExcludes(parent.getAllExcludeRules()); } } - + mergeNamespaces(parent.getExtraAttributesNamespaces()); // IVY-1658 } /** @@ -722,6 +716,17 @@ public void mergeExcludes(ExcludeRule[] excludeRules) { } } + private void mergeNamespaces(Map namespaces) { + if (namespaces != null && !namespaces.isEmpty()) { + for (Map.Entry entry : namespaces.entrySet()) { + Message.debug("Merging extra attribute namesapce: " + entry); + if (getMd().getExtraAttributesNamespaces().get(entry.getKey()) == null) { + getMd().addExtraAttributeNamespace(entry.getKey(), entry.getValue()); + } + } + } + } + /** * Returns the parent module using the location attribute (for dev purpose). * @@ -1455,5 +1460,4 @@ protected URL getSchemaURL() { public String toString() { return "ivy parser"; } - } 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 83440c4ac..b4cf70aab 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; @@ -409,13 +410,22 @@ public void startElement(String uri, String localName, String qName, Attributes // copy write("<" + qName); - for (int i = 0; i < attributes.getLength(); i++) { - write(" " + attributes.getQName(i) + "=\"" - + substitute(settings, attributes.getValue(i)) + "\""); + if (options.isMerge() && path.equals("ivy-module")) { + for (int i = 0, n = attributes.getLength(); i < n; i += 1) { + if (attributes.getQName(i).startsWith("xmlns:")) continue; + write(" " + attributes.getQName(i) + "=\"" + substitute(settings, attributes.getValue(i)) + "\""); + } + Map namespaces = options.getMergedDescriptor().getExtraAttributesNamespaces(); + for (Map.Entry namespace : namespaces.entrySet()) { + write(" xmlns:" + namespace.getKey() + "=\"" + substitute(settings, namespace.getValue()) + "\""); + } + } else { + for (int i = 0, n = attributes.getLength(); i < n; i += 1) { + write(" " + attributes.getQName(i) + "=\"" + substitute(settings, attributes.getValue(i)) + "\""); + } } } justOpen = qName; - // indent.append("\t"); } private void startExtends(Attributes attributes) { diff --git a/test/java/org/apache/ivy/core/deliver/DeliverTest.java b/test/java/org/apache/ivy/core/deliver/DeliverTest.java index cb194bc77..f903c4f96 100644 --- a/test/java/org/apache/ivy/core/deliver/DeliverTest.java +++ b/test/java/org/apache/ivy/core/deliver/DeliverTest.java @@ -17,35 +17,67 @@ */ package org.apache.ivy.core.deliver; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + import org.apache.ivy.TestHelper; import org.apache.ivy.ant.IvyDeliver; import org.apache.ivy.ant.IvyResolve; import org.apache.ivy.util.FileUtil; + +import org.apache.commons.io.FileUtils; import org.apache.tools.ant.Project; + import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.net.URI; - -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class DeliverTest { - private File cache; + + private File cacheDir; private File deliverDir; private IvyDeliver ivyDeliver; + private void createCache() { + cacheDir.mkdirs(); + } + + private void resolve(File ivyFile) { + IvyResolve ivyResolve = new IvyResolve(); + ivyResolve.setProject(ivyDeliver.getProject()); + ivyResolve.setFile(ivyFile); + ivyResolve.doExecute(); + } + + private String readFile(String fileName) throws IOException { + StringBuilder retval = new StringBuilder(); + File file = new File(fileName); + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + String line = null; + while ((line = reader.readLine()) != null) { + retval.append(line).append("\n"); + } + } + return retval.toString(); + } + + private File writeFile(String fileText) throws IOException { + File file = File.createTempFile("ivy", ".xml"); + file.deleteOnExit(); + FileUtils.write(file, fileText, "UTF-8"); + return file; + } + @Before public void setUp() { - cache = new File("build/cache"); - System.setProperty("ivy.cache.dir", cache.getAbsolutePath()); + cacheDir = new File("build/cache"); + System.setProperty("ivy.cache.dir", cacheDir.getAbsolutePath()); createCache(); deliverDir = new File("build/test/deliver"); @@ -56,61 +88,82 @@ public void setUp() { ivyDeliver = new IvyDeliver(); ivyDeliver.setProject(project); - ivyDeliver.setDeliverpattern(deliverDir.getAbsolutePath() - + "/[type]s/[artifact]-[revision](-[classifier]).[ext]"); + ivyDeliver.setDeliverpattern(deliverDir.getAbsolutePath() + "/[type]s/[artifact]-[revision](-[classifier]).[ext]"); } @After public void tearDown() { - FileUtil.forceDelete(cache); + FileUtil.forceDelete(cacheDir); FileUtil.forceDelete(deliverDir); } - private void createCache() { - cache.mkdirs(); - } - /** - * Test case for IVY-1111. - * - * @throws Exception if something goes wrong - * @see IVY-1111 + * Test case for IVY-1111. */ @Test - public void testIVY1111() throws Exception { - Project project = ivyDeliver.getProject(); - project.setProperty("ivy.settings.file", "test/repositories/IVY-1111/ivysettings.xml"); - File ivyFile = new File(new URI(DeliverTest.class.getResource("ivy-1111.xml").toString())); + public void testDeliver1111() throws Exception { + ivyDeliver.getProject().setProperty("ivy.settings.file", "test/repositories/IVY-1111/ivysettings.xml"); + + String ivyFile + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; - resolve(ivyFile); + resolve(writeFile(ivyFile)); ivyDeliver.setReplacedynamicrev(true); ivyDeliver.doExecute(); - String deliverContent = readFile(deliverDir.getAbsolutePath() + "/ivys/ivy-1.0.xml"); - assertFalse(deliverContent.contains("rev=\"latest.integration\"")); - assertTrue(deliverContent.contains("name=\"b\" rev=\"1.5\"")); + ivyFile = readFile(deliverDir.getAbsolutePath() + "/ivys/ivy-1.0.xml"); + assertTrue(ivyFile.contains("org=\"test\" name=\"a\" rev=\"1\" revConstraint=\"latest.integration\"")); + assertTrue(ivyFile.contains("org=\"test\" name=\"b\" rev=\"1.5\" revConstraint=\"latest.integration\" e:att=\"att\"")); + assertTrue(ivyFile.contains("org=\"junit\" name=\"junit\" rev=\"4.4\" revConstraint=\"latest.integration\"")); } - private void resolve(File ivyFile) { - IvyResolve ivyResolve = new IvyResolve(); - ivyResolve.setProject(ivyDeliver.getProject()); - ivyResolve.setFile(ivyFile); - ivyResolve.doExecute(); - } - - private String readFile(String fileName) throws IOException { - StringBuilder retval = new StringBuilder(); + /** + * Test case for IVY-1658. + */ + @Test + public void testDeliver1658() throws Exception { + String ivyFile + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + + ivyFile + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + + resolve(writeFile(ivyFile)); - File ivyFile = new File(fileName); - BufferedReader reader = new BufferedReader(new FileReader(ivyFile)); + ivyDeliver.doExecute(); - String line = null; - while ((line = reader.readLine()) != null) { - retval.append(line).append("\n"); - } + ivyFile = readFile(deliverDir.getAbsolutePath() + "/ivys/ivy-1.0.xml"); - reader.close(); - return retval.toString(); + assertTrue(ivyFile.contains(" version=\"2.0\"")); + assertTrue(ivyFile.contains(" xmlns:m=\"http://ant.apache.org/ivy/maven\"")); + assertTrue(ivyFile.contains(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")); + assertTrue(ivyFile.contains(" xsi:noNamespaceSchemaLocation=\"http://ant.apache.org/ivy/schemas/ivy.xsd\"")); } } diff --git a/test/java/org/apache/ivy/core/deliver/ivy-1111.xml b/test/java/org/apache/ivy/core/deliver/ivy-1111.xml deleted file mode 100644 index 3e8062601..000000000 --- a/test/java/org/apache/ivy/core/deliver/ivy-1111.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - -