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 9535ad5f..8c8f2117 100644 --- a/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java +++ b/src/java/org/apache/ivy/plugins/parser/xml/XmlModuleDescriptorUpdater.java @@ -285,15 +285,11 @@ public final class XmlModuleDescriptorUpdater { flushMergedElementsBefore(qName); - // according to ivy.xsd, all elements must occur before - // the , or elements if (options.isMerge() - && "ivy-module/dependencies".equals(getContext()) - && ("exclude".equals(localName) || "override".equals(localName) || "conflict".equals(localName))) { + && !mergedDependencies + && "ivy-module/dependencies".equals(getContext())) { ModuleDescriptor merged = options.getMergedDescriptor(); writeInheritedDependencies(merged); - out.println(); - out.print(getIndent()); } context.push(qName); @@ -973,7 +969,7 @@ public final class XmlModuleDescriptorUpdater { * just write the inherited items inline, with a comment indicating where they * came from. */ - private void writeInheritedItems(ModuleDescriptor merged, InheritableItem[] items, + private boolean writeInheritedItems(ModuleDescriptor merged, InheritableItem[] items, ItemPrinter printer, String itemName, boolean includeContainer) { // first categorize inherited items by their source module, so that // we can add some useful comments @@ -995,6 +991,10 @@ public final class XmlModuleDescriptorUpdater { newMapping.isEmpty() ? "" : " defaultconfmapping=\"" + newMapping + "\"", (confMappingOverride != null) ? " confmappingoverride=\"" + confMappingOverride + "\"" : "")); context.push(itemName); + if ("dependencies".equals(itemName)) { + out.println(); + out.print(getIndent()); + } justOpen = null; } @@ -1019,13 +1019,17 @@ public final class XmlModuleDescriptorUpdater { // restore the prior indent out.print(currentIndent); } + + return hasItems; } private void writeInheritanceComment(String itemDescription, Object parentInfo) { PrintWriter out = getWriter(); - out.println(); - out.println(getIndent() + ""); + if (!"dependencies".equals(itemDescription)) { + out.println(); + out.print(getIndent()); + } + out.println(""); } /** @@ -1088,7 +1092,10 @@ public final class XmlModuleDescriptorUpdater { if (!mergedDependencies) { mergedDependencies = true; InheritableItem[] items = getDependencies(merged); - writeInheritedItems(merged, items, DependencyPrinter.INSTANCE, "dependencies", false); + if (writeInheritedItems(merged, items, DependencyPrinter.INSTANCE, "dependencies", false)) { + out.println(""); + out.print(getIndent()); + } } } @@ -1123,7 +1130,7 @@ public final class XmlModuleDescriptorUpdater { * 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() && "ivy-module".equals(getContext()) && !(mergedConfigurations && mergedDependencies)) { // calculate the position of the element in ivy-module int position = (moduleElement == null) ? MODULE_ELEMENTS.size() : MODULE_ELEMENTS.indexOf(moduleElement); ModuleDescriptor merged = options.getMergedDescriptor(); @@ -1150,7 +1157,6 @@ public final class XmlModuleDescriptorUpdater { } public void endElement(String uri, String localName, String qName) throws SAXException { - String path = getContext(); if (options.isMerge()) { ModuleDescriptor merged = options.getMergedDescriptor(); @@ -1164,10 +1170,6 @@ public final class XmlModuleDescriptorUpdater { // write inherited configurations after all child configurations writeInheritedConfigurations(merged); break; - case "ivy-module/dependencies": - // write inherited dependencies after all child dependencies - writeInheritedDependencies(merged); - break; case "ivy-module": // write any remaining inherited data before we close the // descriptor. @@ -1250,9 +1252,14 @@ public final class XmlModuleDescriptorUpdater { justOpen = null; } - write(""); + if (options.isMerge() + && !mergedDependencies + && "ivy-module/dependencies".equals(getContext())) { + ModuleDescriptor merged = options.getMergedDescriptor(); + writeInheritedDependencies(merged); + } + + write(new StringBuilder("").toString()); if (inHeader) { write(LINE_SEPARATOR); diff --git a/test/java/org/apache/ivy/ant/ivy-extends-merged.xml b/test/java/org/apache/ivy/ant/ivy-extends-merged.xml index 62fdd994..ab759f06 100644 --- a/test/java/org/apache/ivy/ant/ivy-extends-merged.xml +++ b/test/java/org/apache/ivy/ant/ivy-extends-merged.xml @@ -21,7 +21,7 @@ - + Demonstrates configuration-specific dependencies @@ -31,22 +31,22 @@ - + - + + + + + - - - - - \ No newline at end of file +