This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch ARCHETYPE-571 in repository https://gitbox.apache.org/repos/asf/maven-archetype.git
commit 443064d6426f5cb1a1cd1dbe30bc41e0147ba289 Author: tibordigana <[email protected]> AuthorDate: Fri Jul 26 16:46:22 2019 +0200 [ARCHETYPE-571] Unable to generate project which has pom with multiple profiles with modules section --- .../maven/archetype/common/util/PomUtils.java | 75 +++++++++++++--------- .../apache/maven/archetype/old/ArchetypeTest.java | 52 +++++++++++++++ 2 files changed, 98 insertions(+), 29 deletions(-) diff --git a/archetype-common/src/main/java/org/apache/maven/archetype/common/util/PomUtils.java b/archetype-common/src/main/java/org/apache/maven/archetype/common/util/PomUtils.java index 971adaa..a27f125 100644 --- a/archetype-common/src/main/java/org/apache/maven/archetype/common/util/PomUtils.java +++ b/archetype-common/src/main/java/org/apache/maven/archetype/common/util/PomUtils.java @@ -102,37 +102,17 @@ public final class PomUtils "Unable to add module to the current project as it is not of packaging type 'pom'" ); } - NodeList modulesList = project.getElementsByTagName( "modules" ); - final Element modules; - if ( modulesList.getLength() == 0 ) - { - modules = document.createElement( "modules" ); - project.appendChild( modules ); - } - else if ( modulesList.getLength() == 1 ) - { - modules = (Element) modulesList.item( 0 ); - } - else - { - throw new ArchetypeTemplateProcessingException( "Illegal to use multiple <modules/> sections." ); - } - boolean found = false; - NodeList moduleList = modules.getElementsByTagName( "module" ); - for ( int len = moduleList.getLength(), i = 0; i < len; i++ ) - { - Node module = moduleList.item( i ); - String moduleValue = module.getTextContent(); - if ( moduleValue != null && moduleValue.equals( artifactId ) ) - { - found = true; - break; - } - } - if ( !found ) + Node modules = getModulesNode( project ); + + if ( !hasArtifactIdInModules( artifactId, modules ) ) { Element module = document.createElement( "module" ); module.setTextContent( artifactId ); + if ( modules == null ) + { + modules = document.createElement( "modules" ); + project.appendChild( modules ); + } modules.appendChild( module ); TransformerFactory tf = TransformerFactory.newInstance(); @@ -146,7 +126,44 @@ public final class PomUtils tr.setOutputProperty( OutputKeys.ENCODING, "UTF-8" ); tr.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2" ); tr.transform( new DOMSource( document ), new StreamResult( fileWriter ) ); + return true; + } + else + { + return false; + } + } + + private static Node getModulesNode( Element project ) + { + Node modules = null; + NodeList nodes = project.getChildNodes(); + for ( int len = nodes.getLength(), i = 0; i < len; i++ ) + { + Node node = nodes.item( i ); + if ( node.getNodeType() == Node.ELEMENT_NODE && "modules".equals( node.getNodeName() ) ) + { + modules = node; + break; + } + } + return modules; + } + + private static boolean hasArtifactIdInModules( String artifactId, Node modules ) + { + if ( modules != null ) + { + Node module = modules.getFirstChild(); + while ( module != null ) + { + if ( module.getNodeType() == Node.ELEMENT_NODE && artifactId.equals( module.getTextContent() ) ) + { + return true; + } + module = module.getNextSibling(); + } } - return !found; + return false; } } diff --git a/archetype-common/src/test/java/org/apache/maven/archetype/old/ArchetypeTest.java b/archetype-common/src/test/java/org/apache/maven/archetype/old/ArchetypeTest.java index 92f2fd5..e4490d1 100644 --- a/archetype-common/src/test/java/org/apache/maven/archetype/old/ArchetypeTest.java +++ b/archetype-common/src/test/java/org/apache/maven/archetype/old/ArchetypeTest.java @@ -324,6 +324,58 @@ public class ArchetypeTest // empty means unchanged assertEquals( "", out.toString().trim() ); + + + pom = "<project><modelVersion>4.0.0</modelVersion>\n" + + " <packaging>pom</packaging>\n" + + " <modules>\n" + + " <module>myArtifactId1</module>\n" + + " <module>myArtifactId2</module>\n" + + " <module>myArtifactId3</module>\n" + + " </modules>\n" + + " <profiles>\n" + + " <profile>\n" + + " <id>profile1</id>\n" + + " <modules>\n" + + " <module>module1</module>\n" + + " </modules>\n" + + " </profile>\n" + + " <profile>\n" + + " <id>profile2</id>\n" + + " <modules>\n" + + " <module>module2</module>\n" + + " </modules>\n" + + " </profile>\n" + + " </profiles>\n" + + "</project>"; + + out = new StringWriter(); + assertTrue( DefaultOldArchetype.addModuleToParentPom( "module1", new StringReader( pom ), out ) ); + + assertThat( out.toString(), isIdenticalTo("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" + + "<project><modelVersion>4.0.0</modelVersion>\n" + + " <packaging>pom</packaging>\n" + + " <modules>\n" + + " <module>myArtifactId1</module>\n" + + " <module>myArtifactId2</module>\n" + + " <module>myArtifactId3</module>\n" + + " <module>module1</module>\n" + + " </modules>\n" + + " <profiles>\n" + + " <profile>\n" + + " <id>profile1</id>\n" + + " <modules>\n" + + " <module>module1</module>\n" + + " </modules>\n" + + " </profile>\n" + + " <profile>\n" + + " <id>profile2</id>\n" + + " <modules>\n" + + " <module>module2</module>\n" + + " </modules>\n" + + " </profile>\n" + + " </profiles>\n" + + "</project>" ).normalizeWhitespace() ); } public void testAddModuleToParentPOMNoPackaging()
