This is an automated email from the ASF dual-hosted git repository. rfscholte pushed a commit to branch MNG-6999 in repository https://gitbox.apache.org/repos/asf/maven.git
commit c48cc38bfe1260dd35bce4947a7eef01f81d6dde Author: rfscholte <[email protected]> AuthorDate: Sun Oct 18 12:46:57 2020 +0200 Improve tests --- .../xml/sax/filter/AbstractEventXMLFilter.java | 2 +- .../maven/xml/sax/filter/AbstractSAXFilter.java | 4 +- .../xml/sax/filter/BuildPomXMLFilterFactory.java | 12 +- .../maven/xml/sax/filter/ConsumerPomXMLFilter.java | 7 + .../sax/filter/ConsumerPomXMLFilterFactory.java | 1 + .../apache/maven/xml/sax/ChainedFilterTest.java | 150 +++++++++++++++++++++ .../xml/sax/filter/AbstractXMLFilterTests.java | 115 ++++++++++------ .../xml/sax/filter/ConsumerPomXMLFilterTest.java | 10 +- .../maven/xml/sax/filter/ModulesXMLFilterTest.java | 10 +- .../maven/xml/sax/filter/ParentXMLFilterTest.java | 7 +- .../sax/filter/ReactorDependencyXMLFilterTest.java | 9 +- 11 files changed, 264 insertions(+), 63 deletions(-) diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java index 1b72d11..9ef6917 100644 --- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java +++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java @@ -64,7 +64,7 @@ abstract class AbstractEventXMLFilter extends AbstractSAXFilter AbstractEventXMLFilter( AbstractSAXFilter parent ) { - setParent( parent ); + super( parent ); } private SAXEventFactory getEventFactory() diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractSAXFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractSAXFilter.java index 1761936..b930f77 100644 --- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractSAXFilter.java +++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractSAXFilter.java @@ -35,14 +35,14 @@ public class AbstractSAXFilter extends XMLFilterImpl implements LexicalHandler { private LexicalHandler lexicalHandler; - AbstractSAXFilter() + public AbstractSAXFilter() { super(); } public AbstractSAXFilter( AbstractSAXFilter parent ) { - setParent( parent ); + super( parent ); parent.setLexicalHandler( this ); } diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java index 626c7ac..4468da2 100644 --- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java +++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java @@ -22,6 +22,7 @@ package org.apache.maven.xml.sax.filter; import java.nio.file.Path; import java.util.Optional; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.function.Function; import javax.xml.parsers.ParserConfigurationException; @@ -40,16 +41,16 @@ import org.xml.sax.ext.LexicalHandler; */ public class BuildPomXMLFilterFactory { - private final LexicalHandler lexicalHandler; + private final Consumer<LexicalHandler> lexicalHandlerConsumer; public BuildPomXMLFilterFactory() { this( null ); } - public BuildPomXMLFilterFactory( LexicalHandler lexicalHandler ) + public BuildPomXMLFilterFactory( Consumer<LexicalHandler> lexicalHandlerConsumer ) { - this.lexicalHandler = lexicalHandler; + this.lexicalHandlerConsumer = lexicalHandlerConsumer; } /** @@ -65,7 +66,10 @@ public class BuildPomXMLFilterFactory { AbstractSAXFilter parent = new AbstractSAXFilter(); parent.setParent( getXMLReader() ); - parent.setLexicalHandler( lexicalHandler ); + if ( lexicalHandlerConsumer != null ) + { + lexicalHandlerConsumer.accept( parent ); + } if ( getDependencyKeyToVersionMapper() != null ) { diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilter.java index c02092d..b2a8ec1 100644 --- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilter.java +++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilter.java @@ -20,6 +20,7 @@ package org.apache.maven.xml.sax.filter; */ import org.xml.sax.XMLReader; +import org.xml.sax.ext.LexicalHandler; /** * XML Filter to transform pom.xml to consumer pom. @@ -50,4 +51,10 @@ public class ConsumerPomXMLFilter extends AbstractSAXFilter super.setParent( parent ); } } + + @Override + public LexicalHandler getLexicalHandler() + { + return ( (AbstractSAXFilter) getParent() ).getLexicalHandler(); + } } diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterFactory.java index 5703b89..298a84c 100644 --- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterFactory.java +++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterFactory.java @@ -46,6 +46,7 @@ public class ConsumerPomXMLFilterFactory { BuildPomXMLFilter parent = buildPomXMLFilterFactory.get( projectPath ); + // Ensure that xs:any elements aren't touched by next filters AbstractSAXFilter filter = new FastForwardFilter( parent ); diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/ChainedFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/ChainedFilterTest.java new file mode 100644 index 0000000..87fb6de --- /dev/null +++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/ChainedFilterTest.java @@ -0,0 +1,150 @@ +package org.apache.maven.xml.sax; + +/* + * 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.xmlunit.assertj.XmlAssert.assertThat; + +import java.io.StringReader; +import java.io.StringWriter; +import java.io.Writer; + +import javax.xml.transform.Transformer; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.sax.TransformerHandler; +import javax.xml.transform.stream.StreamResult; + +import org.apache.maven.xml.Factories; +import org.apache.maven.xml.sax.filter.AbstractSAXFilter; +import org.junit.Test; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/** + * A small example of a pipeline of 2 XML Filters, to understand how to get the expected result + * + * @author Robert Scholte + * @since 3.7.0 + */ +public class ChainedFilterTest +{ + + @Test + public void test() + throws Exception + { + String input = "<project><!-- aBc --><name>dEf</name></project>"; + + SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory(); + TransformerHandler transformerHandler = transformerFactory.newTransformerHandler(); + + Writer writer = new StringWriter(); + StreamResult result = new StreamResult( writer ); + transformerHandler.setResult( result ); + + Transformer transformer = transformerFactory.newTransformer(); + SAXResult transformResult = new SAXResult( transformerHandler ); + + // Watch the order of filters! In reverse order the values would be 'AweSome' + AbstractSAXFilter filter = new Awesome(); + + // AbstractSAXFilter doesn't have a constructor with XMLReader, otherwise the LexicalHandler pipeline will be broken + filter.setParent( Factories.newXMLReader() ); + + // LexicalHandler of transformerResult must be the first filter + transformResult.setLexicalHandler( filter ); + + filter = new ChangeCase( filter ); + // LexicalHandler on last filter must be the transformerHandler + filter.setLexicalHandler( transformerHandler ); + + SAXSource transformSource = new SAXSource( filter, new InputSource( new StringReader( input ) ) ); + + transformer.transform( transformSource, transformResult ); + + String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + + "<project><!--AWESOME--><name>awesome</name></project>"; + assertThat( writer.toString() ).and( expected ).areIdentical(); + } + + static class ChangeCase + extends AbstractSAXFilter + { + + public ChangeCase() + { + super(); + } + + public ChangeCase( AbstractSAXFilter parent ) + { + super( parent ); + } + + @Override + public void comment( char[] ch, int start, int length ) + throws SAXException + { + String s = new String( ch, start, length ).toUpperCase(); + super.comment( s.toCharArray(), 0, s.length() ); + } + + @Override + public void characters( char[] ch, int start, int length ) + throws SAXException + { + String s = new String( ch, start, length ).toLowerCase(); + super.characters( s.toCharArray(), 0, s.length() ); + } + } + + static class Awesome + extends AbstractSAXFilter + { + + public Awesome() + { + super(); + } + + public Awesome( AbstractSAXFilter parent ) + { + super( parent ); + } + + @Override + public void comment( char[] ch, int start, int length ) + throws SAXException + { + String s = "AweSome"; + super.comment( s.toCharArray(), 0, s.length() ); + } + + @Override + public void characters( char[] ch, int start, int length ) + throws SAXException + { + String s = "AweSome"; + super.characters( s.toCharArray(), 0, s.length() ); + } + } + +} diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/AbstractXMLFilterTests.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/AbstractXMLFilterTests.java index 2b2f173..862cb76 100644 --- a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/AbstractXMLFilterTests.java +++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/AbstractXMLFilterTests.java @@ -24,6 +24,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.net.ContentHandler; +import java.util.function.Consumer; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; @@ -39,28 +40,18 @@ import org.apache.maven.xml.Factories; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; +import org.xml.sax.ext.LexicalHandler; public abstract class AbstractXMLFilterTests { - public AbstractXMLFilterTests() + protected AbstractSAXFilter getFilter() throws TransformerException, SAXException, ParserConfigurationException { - super(); + throw new UnsupportedOperationException( "Override one of the getFilter() methods" ); } - protected abstract AbstractSAXFilter getFilter() throws TransformerException, SAXException, ParserConfigurationException; - - private void setParent( AbstractSAXFilter filter ) throws SAXException, ParserConfigurationException + protected AbstractSAXFilter getFilter( Consumer<LexicalHandler> result ) throws TransformerException, SAXException, ParserConfigurationException { - if( filter.getParent() == null ) - { - XMLReader r = Factories.newXMLReader(); - - AbstractSAXFilter perChar = new PerCharXMLFilter(); - perChar.setParent( r ); - - filter.setParent( perChar ); - filter.setFeature( "http://xml.org/sax/features/namespaces", true ); - } + return getFilter(); } protected String omitXmlDeclaration() { @@ -77,33 +68,54 @@ public abstract class AbstractXMLFilterTests return transform( new StringReader( input ) ); } - protected String transform( Reader input ) throws TransformerException, SAXException, ParserConfigurationException - { - AbstractSAXFilter filter = getFilter(); - setParent( filter ); - - return transform( input, filter ); - } - + /** + * Use this method only for testing a single filter. + * + * @param input + * @param filter + * @return + * @throws TransformerException + * @throws SAXException + * @throws ParserConfigurationException + */ protected String transform( String input, AbstractSAXFilter filter ) throws TransformerException, SAXException, ParserConfigurationException { setParent( filter ); + + SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory(); + TransformerHandler transformerHandler = transformerFactory.newTransformerHandler(); + + transformerHandler.getTransformer().setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, omitXmlDeclaration() ); + if ( indentAmount() != null ) + { + transformerHandler.getTransformer().setOutputProperty( OutputKeys.INDENT, "yes" ); + transformerHandler.getTransformer().setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", + indentAmount() ); + } + + Transformer transformer = transformerFactory.newTransformer(); + + Writer writer = new StringWriter(); + StreamResult result = new StreamResult( writer ); + transformerHandler.setResult( result ); - filter = new PerCharXMLFilter( filter ); + SAXResult transformResult = new SAXResult( transformerHandler ); + SAXSource transformSource = new SAXSource( filter, new InputSource( new StringReader( input ) ) ); + + transformResult.setLexicalHandler( filter ); + transformer.transform( transformSource, transformResult ); + + return writer.toString(); - return transform( new StringReader( input ), filter ); } - protected String transform( Reader input, AbstractSAXFilter filter ) + protected String transform( Reader input ) throws TransformerException, SAXException, ParserConfigurationException { - Writer writer = new StringWriter(); - StreamResult result = new StreamResult( writer ); - SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory(); TransformerHandler transformerHandler = transformerFactory.newTransformerHandler(); - filter.setLexicalHandler( transformerHandler ); + transformerHandler.getTransformer().setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, omitXmlDeclaration() ); if ( indentAmount() != null ) { @@ -111,18 +123,43 @@ public abstract class AbstractXMLFilterTests transformerHandler.getTransformer().setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", indentAmount() ); } - transformerHandler.setResult( result ); - Transformer transformer = transformerFactory.newTransformer(); - SAXSource transformSource = new SAXSource( filter, new InputSource( input ) ); + Transformer transformer = transformerFactory.newTransformer(); + + Writer writer = new StringWriter(); + StreamResult result = new StreamResult( writer ); + transformerHandler.setResult( result ); SAXResult transformResult = new SAXResult( transformerHandler ); - transformResult.setLexicalHandler( filter ); + + AbstractSAXFilter filter = getFilter( l -> transformResult.setLexicalHandler( l ) ); + setParent( filter ); + + filter = new PerCharXMLFilter( filter ); + + filter.setLexicalHandler( transformerHandler ); + + SAXSource transformSource = new SAXSource( filter, new InputSource( input ) ); + transformer.transform( transformSource, transformResult ); return writer.toString(); } + private void setParent( AbstractSAXFilter filter ) throws SAXException, ParserConfigurationException + { + if( filter.getParent() == null ) + { + XMLReader r = Factories.newXMLReader(); + + AbstractSAXFilter perChar = new PerCharXMLFilter(); + perChar.setParent( r ); + + filter.setParent( perChar ); + filter.setFeature( "http://xml.org/sax/features/namespaces", true ); + } + } + /** * From {@link ContentHandler} * <q>Your code should not assume that algorithms using char-at-a-time idioms will be working in characterunits; @@ -156,16 +193,6 @@ public abstract class AbstractXMLFilterTests } @Override - public void comment( char[] ch, int start, int length ) - throws SAXException - { - for ( int i = 0; i < length; i++ ) - { - super.comment( ch, start + i, 1 ); - } - } - - @Override public void ignorableWhitespace( char[] ch, int start, int length ) throws SAXException { diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterTest.java index 161519a..29c47d4 100644 --- a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterTest.java +++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterTest.java @@ -25,14 +25,15 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.function.Function; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerConfigurationException; -import org.junit.Ignore; import org.junit.Test; import org.xml.sax.SAXException; +import org.xml.sax.ext.LexicalHandler; public class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests { @@ -43,9 +44,10 @@ public class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests } @Override - protected AbstractSAXFilter getFilter() throws SAXException, ParserConfigurationException, TransformerConfigurationException + protected AbstractSAXFilter getFilter( Consumer<LexicalHandler> lexicalHandlerConsumer ) + throws SAXException, ParserConfigurationException, TransformerConfigurationException { - final BuildPomXMLFilterFactory buildPomXMLFilterFactory = new BuildPomXMLFilterFactory() + final BuildPomXMLFilterFactory buildPomXMLFilterFactory = new BuildPomXMLFilterFactory( lexicalHandlerConsumer ) { @Override protected Function<Path, Optional<RelativeProject>> getRelativePathMapper() @@ -234,7 +236,7 @@ public class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests } @Test - @Ignore +// @Ignore public void lexicalHandler() throws Exception { String input = "<project><!--before--><modules>" diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ModulesXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ModulesXMLFilterTest.java index 552b721..103794c 100644 --- a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ModulesXMLFilterTest.java +++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ModulesXMLFilterTest.java @@ -21,15 +21,19 @@ package org.apache.maven.xml.sax.filter; import static org.xmlunit.assertj.XmlAssert.assertThat; -import org.apache.maven.xml.sax.filter.ModulesXMLFilter; +import java.util.function.Consumer; + import org.junit.Test; +import org.xml.sax.ext.LexicalHandler; public class ModulesXMLFilterTest extends AbstractXMLFilterTests { @Override - protected ModulesXMLFilter getFilter() + protected ModulesXMLFilter getFilter( Consumer<LexicalHandler> lexicalHandlerConsumer ) { - return new ModulesXMLFilter(); + ModulesXMLFilter filter = new ModulesXMLFilter(); + lexicalHandlerConsumer.accept( filter ); + return filter; } @Test diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java index bb00222..eee0359 100644 --- a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java +++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java @@ -23,25 +23,26 @@ import static org.junit.Assert.assertEquals; import java.nio.file.Paths; import java.util.Optional; +import java.util.function.Consumer; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; -import org.apache.maven.xml.sax.filter.ParentXMLFilter; -import org.apache.maven.xml.sax.filter.RelativeProject; import org.junit.Test; import org.xml.sax.SAXException; +import org.xml.sax.ext.LexicalHandler; public class ParentXMLFilterTest extends AbstractXMLFilterTests { @Override - protected ParentXMLFilter getFilter() + protected ParentXMLFilter getFilter( Consumer<LexicalHandler> lexicalHandlerConsumer ) throws TransformerException, SAXException, ParserConfigurationException { ParentXMLFilter filter = new ParentXMLFilter( x -> Optional.of( new RelativeProject( "GROUPID", "ARTIFACTID", "1.0.0" ) ) ); filter.setProjectPath( Paths.get( "pom.xml").toAbsolutePath() ); + lexicalHandlerConsumer.accept( filter ); return filter; } diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilterTest.java index db6606c..49f7354 100644 --- a/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilterTest.java +++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilterTest.java @@ -20,19 +20,24 @@ package org.apache.maven.xml.sax.filter; */ import static org.xmlunit.assertj.XmlAssert.assertThat; +import java.util.function.Consumer; + import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import org.junit.Test; import org.xml.sax.SAXException; +import org.xml.sax.ext.LexicalHandler; public class ReactorDependencyXMLFilterTest extends AbstractXMLFilterTests { @Override - protected ReactorDependencyXMLFilter getFilter() + protected ReactorDependencyXMLFilter getFilter( Consumer<LexicalHandler> lexicalHandlerConsumer ) throws TransformerException, SAXException, ParserConfigurationException { - return new ReactorDependencyXMLFilter( (g, a) -> "1.0.0" ); + ReactorDependencyXMLFilter filter = new ReactorDependencyXMLFilter( (g, a) -> "1.0.0" ); + lexicalHandlerConsumer.accept( filter ); + return filter; } @Test
