This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-archetype.git

commit bf7961805ea56cdad7e138f47098aacccb314db8
Author: tibordigana <[email protected]>
AuthorDate: Thu Jun 6 00:23:22 2019 +0200

    [ARCHETYPE-568] Removed dom4j library
---
 Jenkinsfile                                        |   2 +-
 archetype-common/pom.xml                           |  13 +-
 .../maven/archetype/common/DefaultPomManager.java  | 110 +++------------
 .../apache/maven/archetype/common/PomManager.java  |   8 +-
 .../maven/archetype/common/util/PomUtils.java      | 152 +++++++++++++++++++++
 .../generator/DefaultArchetypeGenerator.java       |  38 +-----
 .../DefaultFilesetArchetypeGenerator.java          |  51 +++----
 .../generator/FilesetArchetypeGenerator.java       |   5 +-
 .../maven/archetype/old/DefaultOldArchetype.java   |  90 ++----------
 .../apache/maven/archetype/old/OldArchetype.java   |   7 +-
 .../apache/maven/archetype/old/ArchetypeTest.java  |  84 ++++++------
 pom.xml                                            |  14 +-
 12 files changed, 282 insertions(+), 292 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index fbaa780..e4757d9 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -17,4 +17,4 @@
  * under the License.
  */
 
-asfMavenTlpPlgnBuild(tmpWs: true, jdk:['8','11','12','13'])
+asfMavenTlpPlgnBuild(tmpWs: true, jdk:['7', '8','11','12','13'])
diff --git a/archetype-common/pom.xml b/archetype-common/pom.xml
index f20dacf..27a8730 100644
--- a/archetype-common/pom.xml
+++ b/archetype-common/pom.xml
@@ -78,10 +78,6 @@
       <version>1.5.5</version>
     </dependency>
     <dependency>
-      <groupId>org.dom4j</groupId>
-      <artifactId>dom4j</artifactId>
-    </dependency>
-    <dependency>
       <groupId>jdom</groupId>
       <artifactId>jdom</artifactId>
     </dependency>
@@ -133,13 +129,11 @@
       <groupId>org.apache.maven.wagon</groupId>
       <artifactId>wagon-provider-api</artifactId>
     </dependency>
-    
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
-
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-compat</artifactId>
@@ -165,7 +159,11 @@
       <artifactId>wagon-http</artifactId>
       <scope>test</scope>
     </dependency>
-
+    <dependency>
+      <groupId>org.xmlunit</groupId>
+      <artifactId>xmlunit-matchers</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -408,6 +406,7 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
+          <trimStackTrace>false</trimStackTrace>
           <systemPropertyVariables>
             <maven.home>${maven.home}</maven.home>
             <java.io.tmpdir>${project.build.outputDirectory}</java.io.tmpdir>
diff --git 
a/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java
 
b/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java
index 1de3629..ca30cd7 100644
--- 
a/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java
@@ -20,36 +20,35 @@ package org.apache.maven.archetype.common;
  */
 
 import org.apache.maven.archetype.common.util.Format;
+import org.apache.maven.archetype.common.util.PomUtils;
 import org.apache.maven.archetype.exception.InvalidPackaging;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.apache.maven.archetype.old.ArchetypeTemplateProcessingException;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.BuildBase;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
+import org.apache.maven.model.ModelBase;
 import org.apache.maven.model.Parent;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Build;
+import org.apache.maven.model.Plugin;
 import org.apache.maven.model.Profile;
-import org.apache.maven.model.ModelBase;
-import org.apache.maven.model.Reporting;
 import org.apache.maven.model.ReportPlugin;
-import org.apache.maven.model.BuildBase;
-import org.apache.maven.model.Plugin;
+import org.apache.maven.model.Reporting;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.codehaus.plexus.util.xml.Xpp3DomUtils;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-import org.dom4j.io.XMLWriter;
+import org.codehaus.plexus.util.xml.Xpp3DomUtils;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.jdom.JDOMException;
 import org.jdom.input.SAXBuilder;
+import org.xml.sax.SAXException;
 
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -62,7 +61,6 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -72,80 +70,14 @@ public class DefaultPomManager
     implements PomManager
 {
     @Override
-    public void addModule( File pom, String artifactId )
-        throws IOException, XmlPullParserException, DocumentException, 
InvalidPackaging
+    public void addModule( File pom, String artifactId ) throws IOException, 
ParserConfigurationException,
+            TransformerException, SAXException, InvalidPackaging, 
ArchetypeTemplateProcessingException
     {
-        boolean found = false;
-
-        StringWriter writer = new StringWriter();
-        
-        try ( Reader fileReader = ReaderFactory.newXmlReader( pom ) )
+        StringWriter out = new StringWriter();
+        boolean found = PomUtils.addNewModule( artifactId, 
ReaderFactory.newXmlReader( pom ), out );
+        if ( found )
         {
-            SAXReader reader = new SAXReader();
-            Document document = reader.read( fileReader );
-            Element project = document.getRootElement();
-
-            String packaging = null;
-            Element packagingElement = project.element( "packaging" );
-            if ( packagingElement != null )
-            {
-                packaging = packagingElement.getStringValue();
-            }
-            if ( !"pom".equals( packaging ) )
-            {
-                throw new InvalidPackaging(
-                    "Unable to add module to the current project as it is not 
of packaging type 'pom'"
-                );
-            }
-
-            Element modules = project.element( "modules" );
-            if ( modules == null )
-            {
-                modules = project.addText( "  " ).addElement( "modules" );
-                modules.setText( "\n  " );
-                project.addText( "\n" );
-            }
-            // TODO: change to while loop
-            for ( @SuppressWarnings( "unchecked" )
-            Iterator<Element> i = modules.elementIterator( "module" ); 
i.hasNext() && !found; )
-            {
-                Element module = i.next();
-                if ( module.getText().equals( artifactId ) )
-                {
-                    found = true;
-                }
-            }
-            if ( !found )
-            {
-                Node lastTextNode = null;
-                for ( @SuppressWarnings( "unchecked" )
-                Iterator<Node> i = modules.nodeIterator(); i.hasNext(); )
-                {
-                    Node node = i.next();
-                    if ( node.getNodeType() == Node.ELEMENT_NODE )
-                    {
-                        lastTextNode = null;
-                    }
-                    else if ( node.getNodeType() == Node.TEXT_NODE )
-                    {
-                        lastTextNode = node;
-                    }
-                }
-
-                if ( lastTextNode != null )
-                {
-                    modules.remove( lastTextNode );
-                }
-
-                modules.addText( "\n    " );
-                modules.addElement( "module" ).setText( artifactId );
-                modules.addText( "\n  " );
-
-                XMLWriter xmlWriter = new XMLWriter( writer );
-                xmlWriter.write( document );
-
-                FileUtils.fileWrite( pom.getAbsolutePath(), writer.toString() 
);
-            } // end if
+            FileUtils.fileWrite( pom.getAbsolutePath(), out.toString() );
         }
     }
 
diff --git 
a/archetype-common/src/main/java/org/apache/maven/archetype/common/PomManager.java
 
b/archetype-common/src/main/java/org/apache/maven/archetype/common/PomManager.java
index 10f184a..efe04f7 100644
--- 
a/archetype-common/src/main/java/org/apache/maven/archetype/common/PomManager.java
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/common/PomManager.java
@@ -20,10 +20,13 @@ package org.apache.maven.archetype.common;
  */
 
 import org.apache.maven.archetype.exception.InvalidPackaging;
+import org.apache.maven.archetype.old.ArchetypeTemplateProcessingException;
 import org.apache.maven.model.Model;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.dom4j.DocumentException;
+import org.xml.sax.SAXException;
 
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -33,7 +36,8 @@ public interface PomManager
     String ROLE = PomManager.class.getName();
 
     void addModule( File basedirPom, String artifactId )
-        throws IOException, XmlPullParserException, DocumentException, 
InvalidPackaging;
+            throws IOException, ParserConfigurationException, 
TransformerException, SAXException, InvalidPackaging,
+            ArchetypeTemplateProcessingException;
 
     void addParent( File pom, File basedirPom )
         throws IOException, XmlPullParserException;
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
new file mode 100644
index 0000000..971adaa
--- /dev/null
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/common/util/PomUtils.java
@@ -0,0 +1,152 @@
+package org.apache.maven.archetype.common.util;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.archetype.exception.InvalidPackaging;
+import org.apache.maven.archetype.old.ArchetypeTemplateProcessingException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+/**
+ * POM helper class.
+ */
+public final class PomUtils
+{
+    private PomUtils()
+    {
+        throw new IllegalStateException( "no instantiable constructor" );
+    }
+
+    /**
+     * Adds module {@code artifactId} unless the module already presents in 
{@code fileReader}.
+     *
+     * @param artifactId artifactId of module to add
+     * @param fileReader source POM XML
+     * @param fileWriter target XML
+     * @return {@code true} if modules section in POM is empty or does not 
exist or {@code artifactId} does not appear
+     * a module in {@code fileReader} XML.
+     * @throws IOException if I/O error
+     * @throws InvalidPackaging if packaging is not "pom" or not exist in POM
+     * @throws ArchetypeTemplateProcessingException if "project" does not 
exist or "modules" element is duplicated
+     * @throws ParserConfigurationException if parser error
+     * @throws SAXException if parser error
+     * @throws TransformerException if an error writing to {@code fileWriter}
+     */
+    public static boolean addNewModule( String artifactId, Reader fileReader, 
Writer fileWriter )
+            throws ArchetypeTemplateProcessingException, InvalidPackaging, 
IOException,
+            ParserConfigurationException, SAXException, TransformerException
+    {
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        dbf.setFeature( 
"http://apache.org/xml/features/disallow-doctype-decl";, true );
+        dbf.setFeature( 
"http://xml.org/sax/features/external-general-entities";, false );
+        dbf.setFeature( 
"http://xml.org/sax/features/external-parameter-entities";, false );
+        dbf.setFeature( 
"http://apache.org/xml/features/nonvalidating/load-external-dtd";, false );
+        dbf.setXIncludeAware( false );
+        dbf.setExpandEntityReferences( false );
+
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        InputSource inputSource = new InputSource();
+        inputSource.setCharacterStream( fileReader );
+        Document document = db.parse( inputSource );
+
+        Element project = document.getDocumentElement();
+        if ( !"project".equals( project.getNodeName() ) )
+        {
+            throw new ArchetypeTemplateProcessingException( "Unable to find 
root element 'project'." );
+        }
+
+        String packaging = null;
+        NodeList packagingElement = project.getElementsByTagName( "packaging" 
);
+        if ( packagingElement != null && packagingElement.getLength() == 1 )
+        {
+            packaging = packagingElement.item( 0 ).getTextContent();
+        }
+        if ( !"pom".equals( packaging ) )
+        {
+            throw new InvalidPackaging(
+                    "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 )
+        {
+            Element module = document.createElement( "module" );
+            module.setTextContent( artifactId );
+            modules.appendChild( module );
+
+            TransformerFactory tf = TransformerFactory.newInstance();
+            tf.setAttribute( XMLConstants.ACCESS_EXTERNAL_DTD, "" );
+            tf.setAttribute( XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "" );
+
+            tf.setAttribute( "indent-number", 2 );
+            Transformer tr = tf.newTransformer();
+            tr.setOutputProperty( OutputKeys.INDENT, "yes" );
+            tr.setOutputProperty( OutputKeys.METHOD, "xml" );
+            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 !found;
+    }
+}
diff --git 
a/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultArchetypeGenerator.java
 
b/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultArchetypeGenerator.java
index c00cbd7..061dfc6 100644
--- 
a/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultArchetypeGenerator.java
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultArchetypeGenerator.java
@@ -19,6 +19,7 @@ package org.apache.maven.archetype.generator;
  * under the License.
  */
 
+import org.apache.maven.archetype.exception.InvalidPackaging;
 import org.apache.maven.archetype.old.OldArchetype;
 import org.apache.maven.archetype.ArchetypeGenerationRequest;
 import org.apache.maven.archetype.ArchetypeGenerationResult;
@@ -35,11 +36,8 @@ import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.dom4j.DocumentException;
 
 import java.io.File;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -64,7 +62,7 @@ public class DefaultArchetypeGenerator
     private OldArchetype oldArchetype;
 
     private File getArchetypeFile( ArchetypeGenerationRequest request, 
ArtifactRepository localRepository )
-        throws IOException, ArchetypeException, XmlPullParserException, 
DocumentException
+        throws ArchetypeException
     {
         if ( !isArchetypeDefined( request ) )
         {
@@ -99,7 +97,7 @@ public class DefaultArchetypeGenerator
     }
 
     private void generateArchetype( ArchetypeGenerationRequest request, File 
archetypeFile )
-        throws IOException, ArchetypeException, XmlPullParserException, 
DocumentException
+        throws ArchetypeException
     {
         if ( archetypeArtifactManager.isFileSetArchetype( archetypeFile ) )
         {
@@ -136,7 +134,7 @@ public class DefaultArchetypeGenerator
     }
 
     private void processOldArchetype( ArchetypeGenerationRequest request, File 
archetypeFile )
-        throws UnknownArchetype, ArchetypeGenerationFailure
+            throws ArchetypeGenerationFailure, InvalidPackaging
     {
         oldArchetype.createArchetype( request, archetypeFile );
     }
@@ -149,21 +147,9 @@ public class DefaultArchetypeGenerator
         {
             generateArchetype( request, archetypeFile );
         }
-        catch ( IOException ex )
-        {
-            result.setCause( ex );
-        }
-        catch ( ArchetypeException ex )
-        {
-            result.setCause( ex );
-        }
-        catch ( XmlPullParserException ex )
-        {
-            result.setCause( ex );
-        }
-        catch ( DocumentException ex )
+        catch ( ArchetypeException e )
         {
-            result.setCause( ex );
+            result.setCause( e );
         }
     }
 
@@ -176,22 +162,10 @@ public class DefaultArchetypeGenerator
 
             generateArchetype( request, archetypeFile, result );
         }
-        catch ( IOException ex )
-        {
-            result.setCause( ex );
-        }
         catch ( ArchetypeException ex )
         {
             result.setCause( ex );
         }
-        catch ( XmlPullParserException ex )
-        {
-            result.setCause( ex );
-        }
-        catch ( DocumentException ex )
-        {
-            result.setCause( ex );
-        }
     }
     
     private ArtifactRepository createRepository( String url, String 
repositoryId )
diff --git 
a/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java
 
b/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java
index 0f08bad..b4d22c0 100644
--- 
a/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java
@@ -49,8 +49,10 @@ import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.codehaus.plexus.velocity.VelocityComponent;
-import org.dom4j.DocumentException;
+import org.xml.sax.SAXException;
 
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -95,8 +97,8 @@ public class DefaultFilesetArchetypeGenerator
 
     @Override
     public void generateArchetype( ArchetypeGenerationRequest request, File 
archetypeFile )
-        throws UnknownArchetype, ArchetypeNotConfigured, 
ProjectDirectoryExists, PomFileExists, OutputFileExists,
-        ArchetypeGenerationFailure
+            throws UnknownArchetype, ArchetypeNotConfigured, 
ProjectDirectoryExists, PomFileExists, OutputFileExists,
+            ArchetypeGenerationFailure, InvalidPackaging
     {
         ClassLoader old = Thread.currentThread().getContextClassLoader();
 
@@ -240,29 +242,10 @@ public class DefaultFilesetArchetypeGenerator
                 getLogger().info( "Project created from Archetype in dir: " + 
outputDirectoryFile.getAbsolutePath() );
             }
         }
-        catch ( FileNotFoundException ex )
+        catch ( IOException | XmlPullParserException | 
ParserConfigurationException | TransformerException
+                | SAXException e )
         {
-            throw new ArchetypeGenerationFailure( ex );
-        }
-        catch ( IOException ex )
-        {
-            throw new ArchetypeGenerationFailure( ex );
-        }
-        catch ( XmlPullParserException ex )
-        {
-            throw new ArchetypeGenerationFailure( ex );
-        }
-        catch ( DocumentException ex )
-        {
-            throw new ArchetypeGenerationFailure( ex );
-        }
-        catch ( ArchetypeGenerationFailure ex )
-        {
-            throw new ArchetypeGenerationFailure( ex );
-        }
-        catch ( InvalidPackaging ex )
-        {
-            throw new ArchetypeGenerationFailure( ex );
+            throw new ArchetypeGenerationFailure( e );
         }
         finally
         {
@@ -277,7 +260,7 @@ public class DefaultFilesetArchetypeGenerator
 
     private boolean copyFile( final File outFile, final String template, final 
boolean failIfExists,
                               final ZipFile archetypeZipFile )
-        throws FileNotFoundException, OutputFileExists, IOException
+        throws OutputFileExists, IOException
     {
         getLogger().debug( "Copying file " + template );
 
@@ -536,9 +519,9 @@ public class DefaultFilesetArchetypeGenerator
                                        final List<String> archetypeResources, 
File pom, final ZipFile archetypeZipFile,
                                        String moduleOffset, File basedirPom, 
File outputDirectoryFile,
                                        final String packageName, final 
AbstractArchetypeDescriptor archetypeDescriptor,
-                                       final Context context )
-        throws DocumentException, XmlPullParserException, 
ArchetypeGenerationFailure, InvalidPackaging, IOException,
-        OutputFileExists
+                                       final Context context ) throws 
XmlPullParserException, IOException,
+            ParserConfigurationException, SAXException, TransformerException,
+            OutputFileExists, ArchetypeGenerationFailure, InvalidPackaging
     {
         outputDirectoryFile.mkdirs();
         getLogger().debug( "Processing module " + artifactId );
@@ -596,8 +579,8 @@ public class DefaultFilesetArchetypeGenerator
                                         final ZipFile archetypeZipFile, String 
moduleOffset, final Context context,
                                         final String packageName, final File 
outputDirectoryFile,
                                         final File basedirPom )
-        throws DocumentException, XmlPullParserException, 
ArchetypeGenerationFailure, InvalidPackaging, IOException,
-        FileNotFoundException, OutputFileExists
+            throws XmlPullParserException, IOException, 
ParserConfigurationException, SAXException,
+            TransformerException, OutputFileExists, 
ArchetypeGenerationFailure, InvalidPackaging
     {
         getLogger().debug( "Processing fileset project moduleId " + moduleId );
         getLogger().debug( "Processing fileset project pom " + pom );
@@ -655,8 +638,8 @@ public class DefaultFilesetArchetypeGenerator
 
     private void processPomWithParent( Context context, File pom, String 
moduleOffset, File basedirPom,
                                        String moduleId )
-        throws OutputFileExists, XmlPullParserException, DocumentException, 
IOException, InvalidPackaging,
-        ArchetypeGenerationFailure
+            throws XmlPullParserException, IOException, 
ParserConfigurationException, SAXException,
+            TransformerException, OutputFileExists, 
ArchetypeGenerationFailure, InvalidPackaging
     {
         getLogger().debug( "Processing pom " + pom + " with parent " + 
basedirPom );
 
@@ -736,7 +719,7 @@ public class DefaultFilesetArchetypeGenerator
     private void processTemplates( String packageName, File 
outputDirectoryFile, Context context,
                                    AbstractArchetypeDescriptor 
archetypeDescriptor, List<String> archetypeResources,
                                    ZipFile archetypeZipFile, String 
moduleOffset, boolean failIfExists )
-        throws OutputFileExists, ArchetypeGenerationFailure, 
FileNotFoundException, IOException
+        throws OutputFileExists, ArchetypeGenerationFailure, IOException
     {
         Iterator<FileSet> iterator = 
archetypeDescriptor.getFileSets().iterator();
         if ( iterator.hasNext() )
diff --git 
a/archetype-common/src/main/java/org/apache/maven/archetype/generator/FilesetArchetypeGenerator.java
 
b/archetype-common/src/main/java/org/apache/maven/archetype/generator/FilesetArchetypeGenerator.java
index 97b479d..709fca6 100644
--- 
a/archetype-common/src/main/java/org/apache/maven/archetype/generator/FilesetArchetypeGenerator.java
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/generator/FilesetArchetypeGenerator.java
@@ -21,6 +21,7 @@ package org.apache.maven.archetype.generator;
 
 import org.apache.maven.archetype.exception.ArchetypeGenerationFailure;
 import org.apache.maven.archetype.exception.ArchetypeNotConfigured;
+import org.apache.maven.archetype.exception.InvalidPackaging;
 import org.apache.maven.archetype.exception.OutputFileExists;
 import org.apache.maven.archetype.exception.PomFileExists;
 import org.apache.maven.archetype.exception.ProjectDirectoryExists;
@@ -43,6 +44,6 @@ public interface FilesetArchetypeGenerator
      * Generate a project from an archetype file.
      */
     void generateArchetype( ArchetypeGenerationRequest request, File 
archetypeFile )
-        throws UnknownArchetype, ArchetypeNotConfigured, 
ProjectDirectoryExists, PomFileExists, OutputFileExists,
-        ArchetypeGenerationFailure;
+            throws UnknownArchetype, ArchetypeNotConfigured, 
ProjectDirectoryExists, PomFileExists, OutputFileExists,
+            ArchetypeGenerationFailure, InvalidPackaging;
 }
diff --git 
a/archetype-common/src/main/java/org/apache/maven/archetype/old/DefaultOldArchetype.java
 
b/archetype-common/src/main/java/org/apache/maven/archetype/old/DefaultOldArchetype.java
index f39c58d..07f75b8 100644
--- 
a/archetype-common/src/main/java/org/apache/maven/archetype/old/DefaultOldArchetype.java
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/old/DefaultOldArchetype.java
@@ -21,13 +21,15 @@ package org.apache.maven.archetype.old;
 
 import org.apache.commons.io.input.XmlStreamReader;
 import org.apache.maven.archetype.ArchetypeGenerationRequest;
+import org.apache.maven.archetype.common.ArchetypeArtifactManager;
+import org.apache.maven.archetype.common.Constants;
+import org.apache.maven.archetype.common.util.PomUtils;
+import org.apache.maven.archetype.exception.InvalidPackaging;
+import org.apache.maven.archetype.exception.UnknownArchetype;
 import org.apache.maven.archetype.old.descriptor.ArchetypeDescriptor;
 import org.apache.maven.archetype.old.descriptor.ArchetypeDescriptorBuilder;
 import org.apache.maven.archetype.old.descriptor.TemplateDescriptor;
 import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.archetype.common.ArchetypeArtifactManager;
-import org.apache.maven.archetype.common.Constants;
-import org.apache.maven.archetype.exception.UnknownArchetype;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
@@ -46,13 +48,10 @@ import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.WriterFactory;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.codehaus.plexus.velocity.VelocityComponent;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-import org.dom4j.io.XMLWriter;
+import org.xml.sax.SAXException;
 
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -106,8 +105,8 @@ public class DefaultOldArchetype
 
     @Override
     public void createArchetype( ArchetypeGenerationRequest request, 
ArtifactRepository archetypeRepository )
-        throws UnknownArchetype, ArchetypeNotFoundException, 
ArchetypeDescriptorException,
-        ArchetypeTemplateProcessingException
+            throws UnknownArchetype, ArchetypeDescriptorException, 
ArchetypeTemplateProcessingException,
+            InvalidPackaging
     {
         // 
----------------------------------------------------------------------
         // Download the archetype
@@ -125,7 +124,7 @@ public class DefaultOldArchetype
 
     @Override
     public void createArchetype( ArchetypeGenerationRequest request, File 
archetypeFile )
-        throws ArchetypeDescriptorException, 
ArchetypeTemplateProcessingException
+            throws ArchetypeDescriptorException, 
ArchetypeTemplateProcessingException, InvalidPackaging
     {
         Map<String, String> parameters = new HashMap<>();
 
@@ -341,7 +340,7 @@ public class DefaultOldArchetype
             {
                 added = addModuleToParentPom( artifactId, fileReader, w );
             }
-            catch ( IOException | DocumentException e )
+            catch ( IOException | SAXException | ParserConfigurationException 
| TransformerException  e )
             {
                 throw new ArchetypeTemplateProcessingException( "Unable to 
rewrite parent POM", e );
             }
@@ -388,69 +387,10 @@ public class DefaultOldArchetype
     }
 
     static boolean addModuleToParentPom( String artifactId, Reader fileReader, 
Writer fileWriter )
-        throws DocumentException, IOException, 
ArchetypeTemplateProcessingException
+            throws ArchetypeTemplateProcessingException, InvalidPackaging, 
IOException, ParserConfigurationException,
+            SAXException, TransformerException
     {
-        SAXReader reader = new SAXReader();
-        Document document = reader.read( fileReader );
-        Element project = document.getRootElement();
-
-        String packaging = null;
-        Element packagingElement = project.element( "packaging" );
-        if ( packagingElement != null )
-        {
-            packaging = packagingElement.getStringValue();
-        }
-        if ( !"pom".equals( packaging ) )
-        {
-            throw new ArchetypeTemplateProcessingException(
-                "Unable to add module to the current project as it is not of 
packaging type 'pom'" );
-        }
-
-        Element modules = project.element( "modules" );
-        if ( modules == null )
-        {
-            modules = project.addText( "  " ).addElement( "modules" );
-            modules.setText( "\n  " );
-            project.addText( "\n" );
-        }
-        boolean found = false;
-        for ( Iterator<?> i = modules.elementIterator( "module" ); i.hasNext() 
&& !found; )
-        {
-            Element module = (Element) i.next();
-            if ( module.getText().equals( artifactId ) )
-            {
-                found = true;
-            }
-        }
-        if ( !found )
-        {
-            Node lastTextNode = null;
-            for ( Iterator<?> i = modules.nodeIterator(); i.hasNext(); )
-            {
-                Node node = (Node) i.next();
-                if ( node.getNodeType() == Node.ELEMENT_NODE )
-                {
-                    lastTextNode = null;
-                }
-                else if ( node.getNodeType() == Node.TEXT_NODE )
-                {
-                    lastTextNode = node;
-                }
-            }
-
-            if ( lastTextNode != null )
-            {
-                modules.remove( lastTextNode );
-            }
-
-            modules.addText( "\n    " );
-            modules.addElement( "module" ).setText( artifactId );
-            modules.addText( "\n  " );
-
-            XMLWriter writer = new XMLWriter( fileWriter );
-            writer.write( document );
-        }
-        return !found;
+        return PomUtils.addNewModule( artifactId, fileReader, fileWriter );
     }
 
     private void processTemplates( File pomFile, String outputDirectory, 
Context context,
diff --git 
a/archetype-common/src/main/java/org/apache/maven/archetype/old/OldArchetype.java
 
b/archetype-common/src/main/java/org/apache/maven/archetype/old/OldArchetype.java
index 668409a..c28cd6f 100644
--- 
a/archetype-common/src/main/java/org/apache/maven/archetype/old/OldArchetype.java
+++ 
b/archetype-common/src/main/java/org/apache/maven/archetype/old/OldArchetype.java
@@ -19,6 +19,7 @@ package org.apache.maven.archetype.old;
  * under the License.
  */
 
+import org.apache.maven.archetype.exception.InvalidPackaging;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 
 import java.io.File;
@@ -49,12 +50,12 @@ public interface OldArchetype
      * Download an archetype then create a project from it.
      */
     void createArchetype( ArchetypeGenerationRequest request, 
ArtifactRepository archetypeRepository )
-        throws UnknownArchetype, ArchetypeNotFoundException, 
ArchetypeDescriptorException,
-        ArchetypeTemplateProcessingException;
+            throws UnknownArchetype, ArchetypeNotFoundException, 
ArchetypeDescriptorException,
+            ArchetypeTemplateProcessingException, InvalidPackaging;
 
     /**
      * Create a project from an archetype file.
      */
     void createArchetype( ArchetypeGenerationRequest request, File 
archetypeFile )
-        throws ArchetypeDescriptorException, 
ArchetypeTemplateProcessingException;
+            throws ArchetypeDescriptorException, 
ArchetypeTemplateProcessingException, InvalidPackaging;
 }
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 d89c7d8..92f2fd5 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
@@ -29,6 +29,7 @@ import java.util.Map;
  */
 
 import org.apache.maven.archetype.ArchetypeGenerationRequest;
+import org.apache.maven.archetype.exception.InvalidPackaging;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -48,9 +49,11 @@ import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.codehaus.plexus.velocity.VelocityComponent;
-import org.dom4j.DocumentException;
 import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.xmlunit.matchers.CompareMatcher.isIdenticalTo;
+
 /**
  * @author <a href="mailto:[email protected]";>Jason van Zyl</a>
  * @version $Id$
@@ -239,7 +242,7 @@ public class ArchetypeTest
     }
 
     public void testAddModuleToParentPOM()
-        throws DocumentException, IOException, 
ArchetypeTemplateProcessingException
+        throws Exception
     {
         String pom = "<project>\n"
             + "  <packaging>pom</packaging>\n"
@@ -248,14 +251,13 @@ public class ArchetypeTest
         StringWriter out = new StringWriter();
         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", 
new StringReader( pom ), out ) );
 
-        assertEquals(
-                     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-                     + "<project>\n"
-                     + "  <packaging>pom</packaging>\n"
-                     + "  <modules>\n"
-                     + "    <module>myArtifactId1</module>\n"
-                     + "  </modules>\n"
-                     + "</project>", out.toString() );
+        assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" 
encoding=\"UTF-8\" standalone=\"no\"?>\n"
+                + "<project>\n"
+                + "  <packaging>pom</packaging>\n"
+                + "  <modules>\n"
+                + "    <module>myArtifactId1</module>\n"
+                + "  </modules>\n"
+                + "</project>" ).normalizeWhitespace() );
 
         pom = "<project>\n"
             + "  <modelVersion>4.0.0</modelVersion>\n"
@@ -265,14 +267,14 @@ public class ArchetypeTest
         out = new StringWriter();
         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId2", 
new StringReader( pom ), out ) );
 
-        assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-                      + "<project>\n"
-                      + "  <modelVersion>4.0.0</modelVersion>\n"
-                      + "  <packaging>pom</packaging>\n"
-                      + "  <modules>\n"
-                      + "    <module>myArtifactId2</module>\n"
-                      + "  </modules>\n"
-                      + "</project>", out.toString() );
+        assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" 
encoding=\"UTF-8\" standalone=\"no\"?>\n"
+                + "<project>\n"
+                + "  <modelVersion>4.0.0</modelVersion>\n"
+                + "  <packaging>pom</packaging>\n"
+                + "  <modules>\n"
+                + "    <module>myArtifactId2</module>\n"
+                + "  </modules>\n"
+                + "</project>" ).normalizeWhitespace() );
 
         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
             + "  <packaging>pom</packaging>\n"
@@ -283,13 +285,13 @@ public class ArchetypeTest
         out = new StringWriter();
         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId3", 
new StringReader( pom ), out ) );
 
-        assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-                      + "<project><modelVersion>4.0.0</modelVersion>\n"
-                      + "  <packaging>pom</packaging>\n"
-                      + "  <modules>\n"
-                      + "    <module>myArtifactId3</module>\n"
-                      + "  </modules>\n"
-                      + "</project>", out.toString() );
+        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>myArtifactId3</module>\n"
+                + "  </modules>\n"
+                + "</project>" ).normalizeWhitespace() );
 
         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
             + "  <packaging>pom</packaging>\n"
@@ -301,14 +303,14 @@ public class ArchetypeTest
         out = new StringWriter();
         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId4", 
new StringReader( pom ), out ) );
 
-        assertEquals( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-                      + "<project><modelVersion>4.0.0</modelVersion>\n"
-                      + "  <packaging>pom</packaging>\n"
-                      + "  <modules>\n"
-                      + "    <module>myArtifactId3</module>\n"
-                      + "    <module>myArtifactId4</module>\n"
-                      + "  </modules>\n"
-                      + "</project>", out.toString() );
+        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>myArtifactId3</module>\n"
+                + "    <module>myArtifactId4</module>\n"
+                + "  </modules>\n"
+                + "</project>" ).normalizeWhitespace() );
 
         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
             + "  <packaging>pom</packaging>\n"
@@ -321,11 +323,11 @@ public class ArchetypeTest
         assertFalse( DefaultOldArchetype.addModuleToParentPom( 
"myArtifactId3", new StringReader( pom ), out ) );
 
         // empty means unchanged
-        assertEquals( "", out.toString() );
+        assertEquals( "", out.toString().trim() );
     }
 
     public void testAddModuleToParentPOMNoPackaging()
-        throws DocumentException, IOException
+        throws Exception
     {
         try
         {
@@ -333,15 +335,16 @@ public class ArchetypeTest
             DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new 
StringReader( pom ), new StringWriter() );
             fail( "Should fail to add a module to a JAR packaged project" );
         }
-        catch ( ArchetypeTemplateProcessingException e )
+        catch ( InvalidPackaging e )
         {
             // great!
-            assertTrue( true );
+            assertEquals( "Unable to add module to the current project as it 
is not of packaging type 'pom'",
+                    e.getLocalizedMessage() );
         }
     }
 
     public void testAddModuleToParentPOMJarPackaging()
-        throws DocumentException, IOException
+        throws Exception
     {
         try
         {
@@ -349,10 +352,11 @@ public class ArchetypeTest
             DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new 
StringReader( pom ), new StringWriter() );
             fail( "Should fail to add a module to a JAR packaged project" );
         }
-        catch ( ArchetypeTemplateProcessingException e )
+        catch ( InvalidPackaging e )
         {
             // great!
-            assertTrue( true );
+            assertEquals( "Unable to add module to the current project as it 
is not of packaging type 'pom'",
+                    e.getLocalizedMessage() );
         }
     }
 
diff --git a/pom.xml b/pom.xml
index bf1bb1f..c854e89 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
   <properties>
     
<maven.archetype.scm.devConnection>scm:git:https://gitbox.apache.org/repos/asf/maven-archetype.git</maven.archetype.scm.devConnection>
     <mavenVersion>3.0</mavenVersion>
-    <javaVersion>8</javaVersion>
+    <javaVersion>7</javaVersion>
     <netbeans.hint.useExternalMaven>true</netbeans.hint.useExternalMaven>
     <wagonVersion>2.8</wagonVersion>
     <surefire.version>2.21.0</surefire.version>
@@ -193,11 +193,6 @@
         </exclusions>
       </dependency>
       <dependency>
-        <groupId>org.dom4j</groupId>
-        <artifactId>dom4j</artifactId>
-        <version>2.1.1</version>
-      </dependency>
-      <dependency>
         <groupId>jdom</groupId>
         <artifactId>jdom</artifactId>
         <version>1.0</version>
@@ -257,7 +252,12 @@
         <artifactId>aether-connector-wagon</artifactId>
         <version>1.7</version>
       </dependency>
-      
+
+      <dependency>
+        <groupId>org.xmlunit</groupId>
+        <artifactId>xmlunit-matchers</artifactId>
+        <version>2.6.0</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 

Reply via email to