This is an automated email from the ASF dual-hosted git repository. rfscholte pushed a commit to branch MNG-6656 in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/MNG-6656 by this push: new 51b74ad Fix lineseparator in comments 51b74ad is described below commit 51b74adb8aea1f32b8db7584b4370f8424bb3ddd Author: rfscholte <rfscho...@apache.org> AuthorDate: Sat Jun 6 13:05:23 2020 +0200 Fix lineseparator in comments --- apache-maven/maven-wrapper.pom | 5 + .../aether/ConsumerModelSourceTransformer.java | 1 + .../DefaultRepositorySystemSessionFactory.java | 2 +- .../maven/project/DefaultProjectBuilder.java | 79 +-------------- .../building/AbstractModelSourceTransformer.java | 4 +- .../maven/model/building/TransformerContext.java | 2 + maven-xml/pom.xml | 8 +- .../maven/xml/sax/ext/CommentRenormalizer.java | 108 +++++++++++++++++++++ .../maven/xml/sax/ext/CommentRenormalizerTest.java | 84 ++++++++++++++++ 9 files changed, 213 insertions(+), 80 deletions(-) diff --git a/apache-maven/maven-wrapper.pom b/apache-maven/maven-wrapper.pom index f2bcc7f..fc6755c 100644 --- a/apache-maven/maven-wrapper.pom +++ b/apache-maven/maven-wrapper.pom @@ -33,7 +33,12 @@ under the License. <name>Apache Maven Wrapper Distribution</name> <description>The Apache Maven Wrapper distribution in zip and tar.gz formats.</description> + <properties> + <distributionFileName>${artifactId}-${project.version}</distributionFileName> + </properties> + <build> + <finalName>${distributionFileName}</finalName> <pluginManagement> <plugins> <plugin> diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java index 0f92f66..8ca0ca6 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java @@ -81,6 +81,7 @@ class ConsumerModelSourceTransformer extends AbstractModelSourceTransformer final String version = streamReader.getVersion(); Transformer transformer = transformerHandler.getTransformer(); + transformer.setOutputProperty( OutputKeys.METHOD, "xml" ); if ( encoding == null && version == null ) { transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" ); diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index d0dd442..928d200 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -248,7 +248,7 @@ public class DefaultRepositorySystemSessionFactory if ( Features.buildConsumer().isActive() ) { session.setFileTransformerManager( a -> getTransformersForArtifact( a, - (TransformerContext) session.getData().get( TransformerContext.class ) ) ); + (TransformerContext) session.getData().get( TransformerContext.KEY ) ) ); } return session; diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java index 0def9e3..f09941b 100644 --- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java +++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java @@ -21,8 +21,6 @@ package org.apache.maven.project; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; import java.nio.file.Path; import java.util.AbstractMap; import java.util.ArrayList; @@ -40,16 +38,6 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.sax.SAXTransformerFactory; -import javax.xml.transform.sax.TransformerHandler; - import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.InvalidArtifactRTException; @@ -67,9 +55,7 @@ import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; import org.apache.maven.model.Profile; import org.apache.maven.model.ReportPlugin; -import org.apache.maven.model.building.AbstractModelSourceTransformer; import org.apache.maven.model.building.ArtifactModelSource; -import org.apache.maven.model.building.DefaultBuildPomXMLFilterFactory; import org.apache.maven.model.building.DefaultModelBuildingRequest; import org.apache.maven.model.building.DefaultModelProblem; import org.apache.maven.model.building.FileModelSource; @@ -84,9 +70,6 @@ import org.apache.maven.model.building.StringModelSource; import org.apache.maven.model.building.TransformerContext; import org.apache.maven.model.resolution.ModelResolver; import org.apache.maven.repository.internal.ArtifactDescriptorUtils; -import org.apache.maven.xml.Factories; -import org.apache.maven.xml.sax.filter.AbstractSAXFilter; -import org.apache.maven.xml.sax.filter.ConsumerPomXMLFilterFactory; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.Os; import org.codehaus.plexus.util.StringUtils; @@ -98,7 +81,6 @@ import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.repository.WorkspaceRepository; import org.eclipse.aether.resolution.ArtifactRequest; import org.eclipse.aether.resolution.ArtifactResult; -import org.xml.sax.SAXException; /** * DefaultProjectBuilder @@ -313,7 +295,7 @@ public class DefaultProjectBuilder request.setBuildStartTime( configuration.getBuildStartTime() ); request.setModelResolver( resolver ); request.setModelCache( config.modelCache ); - request.setTransformerContext( (TransformerContext) config.session.getData().get( TransformerContext.class ) ); + request.setTransformerContext( (TransformerContext) config.session.getData().get( TransformerContext.KEY ) ); return request; } @@ -426,7 +408,7 @@ public class DefaultProjectBuilder return modelPool.get( groupId, artifactId, null ); } }; - request.getRepositorySession().getData().set( TransformerContext.class, context ); + request.getRepositorySession().getData().set( TransformerContext.KEY, context ); } InternalConfig config = new InternalConfig( request, modelPool, @@ -1127,63 +1109,6 @@ public class DefaultProjectBuilder } - static class ConsumerModelSourceTransformer extends AbstractModelSourceTransformer - { - @Override - protected AbstractSAXFilter getSAXFilter( Path pomFile, TransformerContext context ) - throws TransformerConfigurationException, SAXException, ParserConfigurationException - { - return new ConsumerPomXMLFilterFactory( new DefaultBuildPomXMLFilterFactory( context ) ).get( pomFile ); - } - - @Override - protected TransformerHandler getTransformerHandler( Path pomFile ) - throws IOException, org.apache.maven.model.building.TransformerException - { - final TransformerHandler transformerHandler; - - final SAXTransformerFactory transformerFactory = - (SAXTransformerFactory) Factories.newTransformerFactory(); - - // Keep same encoding+version - try ( InputStream input = Files.newInputStream( pomFile ) ) - { - XMLStreamReader streamReader = - XMLInputFactory.newFactory().createXMLStreamReader( input ); - - transformerHandler = transformerFactory.newTransformerHandler(); - - final String encoding = streamReader.getCharacterEncodingScheme(); - final String version = streamReader.getVersion(); - - Transformer transformer = transformerHandler.getTransformer(); - if ( encoding == null && version == null ) - { - transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" ); - } - else - { - transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no" ); - - if ( encoding != null ) - { - transformer.setOutputProperty( OutputKeys.ENCODING, encoding ); - } - if ( version != null ) - { - transformer.setOutputProperty( OutputKeys.VERSION, version ); - } - } - } - catch ( XMLStreamException | TransformerConfigurationException e ) - { - throw new org.apache.maven.model.building.TransformerException( - "Failed to detect XML encoding and version", e ); - } - return transformerHandler; - } - } - private ReactorModelCache getModelCache() { return this.modelCache; diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java index e0767fb..6fedada 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelSourceTransformer.java @@ -39,6 +39,7 @@ import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.apache.maven.xml.Factories; +import org.apache.maven.xml.sax.ext.CommentRenormalizer; import org.apache.maven.xml.sax.filter.AbstractSAXFilter; import org.xml.sax.SAXException; @@ -101,8 +102,9 @@ public abstract class AbstractModelSourceTransformer } else { + result = new SAXResult( transformerHandler ); + ( (SAXResult) result ).setLexicalHandler( new CommentRenormalizer( transformerHandler ) ); transformerHandler.setResult( new StreamResult( out ) ); - result = new SAXResult( transformerHandler ); } IOExceptionHandler eh = new IOExceptionHandler(); diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java index cad2d25..f012220 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/TransformerContext.java @@ -30,6 +30,8 @@ import org.apache.maven.model.Model; */ public interface TransformerContext { + Object KEY = TransformerContext.class; + String getUserProperty( String key ); Model getRawModel( Path p ); diff --git a/maven-xml/pom.xml b/maven-xml/pom.xml index eb285eb..6b98f12 100644 --- a/maven-xml/pom.xml +++ b/maven-xml/pom.xml @@ -30,12 +30,18 @@ under the License. </parent> <artifactId>maven-xml</artifactId> <name>Maven XML</name> - + <dependencies> <dependency> <groupId>org.xmlunit</groupId> <artifactId>xmlunit-assertj</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> + </dependencies> </project> \ No newline at end of file diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/ext/CommentRenormalizer.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/ext/CommentRenormalizer.java new file mode 100644 index 0000000..3ae19a4 --- /dev/null +++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/ext/CommentRenormalizer.java @@ -0,0 +1,108 @@ +package org.apache.maven.xml.sax.ext; + +/* + * 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.xml.sax.SAXException; +import org.xml.sax.ext.LexicalHandler; + +/** + * During parsing the line separators are transformed to \n + * Unlike characters(), comments don't use the systems line separator for serialization. + * Hence use this class in the LexicalHandler chain to do so + * + * @author Robert Scholte + * @since 3.7.0 + */ +public class CommentRenormalizer implements LexicalHandler +{ + private final LexicalHandler lexicalHandler; + + private final String lineSeparator; + + public CommentRenormalizer( LexicalHandler lexicalHandler ) + { + this( lexicalHandler, System.lineSeparator() ); + } + + // for testing purpose + CommentRenormalizer( LexicalHandler lexicalHandler, String lineSeparator ) + { + this.lexicalHandler = lexicalHandler; + this.lineSeparator = lineSeparator; + } + + @Override + public void comment( char[] ch, int start, int length ) + throws SAXException + { + if ( "\n".equals( lineSeparator ) ) + { + lexicalHandler.comment( ch, start, length ); + } + else + { + char[] ca = new String( ch, start, length ).replaceAll( "\n", lineSeparator ).toCharArray(); + + lexicalHandler.comment( ca, 0, ca.length ); + } + } + + @Override + public void startDTD( String name, String publicId, String systemId ) + throws SAXException + { + lexicalHandler.startDTD( name, publicId, systemId ); + } + + @Override + public void endDTD() + throws SAXException + { + lexicalHandler.endDTD(); + } + + @Override + public void startEntity( String name ) + throws SAXException + { + lexicalHandler.startEntity( name ); + } + + @Override + public void endEntity( String name ) + throws SAXException + { + lexicalHandler.endEntity( name ); + } + + @Override + public void startCDATA() + throws SAXException + { + lexicalHandler.startCDATA(); + } + + @Override + public void endCDATA() + throws SAXException + { + lexicalHandler.endCDATA(); + } +} diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/ext/CommentRenormalizerTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/ext/CommentRenormalizerTest.java new file mode 100644 index 0000000..b6bc381 --- /dev/null +++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/ext/CommentRenormalizerTest.java @@ -0,0 +1,84 @@ +package org.apache.maven.xml.sax.ext; + +/* + * 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 static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.util.Arrays; +import java.util.Collection; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import org.xml.sax.ext.LexicalHandler; + +@RunWith( Parameterized.class ) +public class CommentRenormalizerTest +{ + private LexicalHandler lexicalHandler; + + private final String lineSeparator; + + @Parameters + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { "\n" }, + { "\r\n" }, + { "\r" } + }); + } + + public CommentRenormalizerTest( String lineSeparator ) + { + this.lineSeparator = lineSeparator; + this.lexicalHandler = mock( LexicalHandler.class ); + } + + @Test + public void singleLine() + throws Exception + { + CommentRenormalizer commentRenormalizer = new CommentRenormalizer( lexicalHandler, lineSeparator ); + + char[] ch = "single line".toCharArray(); + + commentRenormalizer.comment( ch, 0, ch.length ); + + verify( lexicalHandler ).comment( ch, 0, ch.length ); + } + + @Test + public void multiLine() + throws Exception + { + CommentRenormalizer commentRenormalizer = new CommentRenormalizer( lexicalHandler, lineSeparator ); + + String text = "I%sam%sthe%sbest%s"; + + char[] chIn = String.format( text, "\n", "\n", "\n", "\n" ).toCharArray(); + char[] chOut = String.format( text, lineSeparator, lineSeparator, lineSeparator, lineSeparator ).toCharArray(); + + commentRenormalizer.comment( chIn, 0, chIn.length ); + + verify( lexicalHandler ).comment( chOut, 0, chOut.length ); + } +}