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>
