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
commit dfb0c2cc75d9b381332c979d3ca1fb17330115b9 Author: rfscholte <[email protected]> AuthorDate: Tue May 14 21:26:07 2019 +0200 [MNG-6656] Introduce base for build/consumer pom --- maven-core/pom.xml | 5 + .../DefaultRepositorySystemSessionFactory.java | 107 +++++++++++++++-- .../apache/maven/xml/filter/BuildPomXMLFilter.java | 44 +++++++ .../maven/xml/filter/ConsumerPomXMLFilter.java | 73 ++++++++++++ .../apache/maven/xml/filter/FastForwardFilter.java | 128 +++++++++++++++++++++ .../apache/maven/xml/filter/ModulesXMLFilter.java | 102 ++++++++++++++++ .../maven/xml/filter/RelativePathXMLFilter.java | 98 ++++++++++++++++ .../maven/xml/filter/AbstractXMLFilterTests.java | 80 +++++++++++++ .../maven/xml/filter/ConsumerPomXMLFilterTest.java | 64 +++++++++++ .../maven/xml/filter/ModulesXMLFilterTest.java | 62 ++++++++++ .../xml/filter/RelativePathXMLFilterTest.java | 61 ++++++++++ pom.xml | 8 +- 12 files changed, 823 insertions(+), 9 deletions(-) diff --git a/maven-core/pom.xml b/maven-core/pom.xml index be31a3e..e467851 100644 --- a/maven-core/pom.xml +++ b/maven-core/pom.xml @@ -136,6 +136,11 @@ under the License. <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.xmlunit</groupId> + <artifactId>xmlunit-assertj</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> 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 248a3b6..792b085 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 @@ -19,6 +19,27 @@ package org.apache.maven.internal.aether; * under the License. */ +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Properties; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamResult; + import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.bridge.MavenRepositorySystem; @@ -32,32 +53,31 @@ import org.apache.maven.settings.building.SettingsProblem; import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest; import org.apache.maven.settings.crypto.SettingsDecrypter; import org.apache.maven.settings.crypto.SettingsDecryptionResult; +import org.apache.maven.xml.filter.ConsumerPomXMLFilter; import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.eclipse.aether.ConfigurationProperties; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.repository.NoLocalRepositoryManagerException; import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.aether.repository.WorkspaceReader; import org.eclipse.aether.resolution.ResolutionErrorPolicy; import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; +import org.eclipse.aether.transform.FileTransformer; +import org.eclipse.aether.transform.FileTransformerManager; +import org.eclipse.aether.transform.TransformException; import org.eclipse.aether.util.repository.AuthenticationBuilder; import org.eclipse.aether.util.repository.DefaultAuthenticationSelector; import org.eclipse.aether.util.repository.DefaultMirrorSelector; import org.eclipse.aether.util.repository.DefaultProxySelector; import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy; import org.eclipse.sisu.Nullable; - -import javax.inject.Inject; -import javax.inject.Named; -import java.io.IOException; -import java.io.InputStream; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Properties; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; /** * @since 3.3.0 @@ -238,9 +258,80 @@ public class DefaultRepositorySystemSessionFactory mavenRepositorySystem.injectProxy( session, request.getPluginArtifactRepositories() ); mavenRepositorySystem.injectAuthentication( session, request.getPluginArtifactRepositories() ); + if ( Boolean.getBoolean( "maven.experimental.buildconsumer" ) ) + { + session.setFileTransformerManager( newFileTransformerManager() ); + } return session; } + private FileTransformerManager newFileTransformerManager() + { + return new FileTransformerManager() + { + @Override + public Collection<FileTransformer> getTransformersForArtifact( Artifact artifact ) + { + Collection<FileTransformer> transformers = new ArrayList<>(); + if ( "pom".equals( artifact.getExtension() ) ) + { + final TransformerFactory transformerFactory = TransformerFactory.newInstance(); + + transformers.add( new FileTransformer() + { + @Override + public InputStream transformData( File file ) + throws IOException, TransformException + { + try + { + final PipedOutputStream pipedOutputStream = new PipedOutputStream(); + final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream ); + + final SAXSource transformSource = + new SAXSource( new ConsumerPomXMLFilter(), + new InputSource( new FileReader( file ) ) ); + + final StreamResult result = new StreamResult( pipedOutputStream ); + + final Runnable runnable = new Runnable() + { + @Override + public void run() + { + try ( PipedOutputStream out = pipedOutputStream ) + { + transformerFactory.newTransformer().transform( transformSource, result ); + } + catch ( TransformerException | IOException e ) + { + throw new RuntimeException( e ); + } + } + }; + + new Thread( runnable ).start(); + + return pipedInputStream; + } + catch ( SAXException | ParserConfigurationException e ) + { + throw new TransformException( e ); + } + } + + @Override + public Artifact transformArtifact( Artifact artifact ) + { + return artifact; + } + } ); + } + return Collections.unmodifiableCollection( transformers ); + } + }; + } + private String getUserAgent() { return "Apache-Maven/" + getMavenVersion() + " (Java " + System.getProperty( "java.version" ) + "; " diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java new file mode 100644 index 0000000..60f0c49 --- /dev/null +++ b/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java @@ -0,0 +1,44 @@ +package org.apache.maven.xml.filter; + +/* + * 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.XMLReader; +import org.xml.sax.helpers.XMLFilterImpl; + +/** + * Filter to adjust pom on filesystem before being processed for effective pom. + * + * @author Robert Scholte + * @since 3.7.0 + */ +public class BuildPomXMLFilter extends XMLFilterImpl +{ + public BuildPomXMLFilter() + { + super(); + } + + public BuildPomXMLFilter( XMLReader parent ) + { + super( parent ); + } + + +} diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java b/maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java new file mode 100644 index 0000000..8709b9c --- /dev/null +++ b/maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java @@ -0,0 +1,73 @@ +package org.apache.maven.xml.filter; + +/* + * 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 javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.SAXException; +import org.xml.sax.XMLFilter; +import org.xml.sax.XMLReader; + +import org.xml.sax.helpers.XMLFilterImpl; + +/** + * XML Filter to transform pom.xml to consumer pom. + * This often means stripping of build-specific information. + * + * This filter is used at 2 locations: + * - {@link org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory} when publishing pom files. + * - TODO ???Class when a reactor module is used as dependency. This ensures consistency of dependency handling + * + * @author Robert Scholte + * @since 3.7.0 + */ +public class ConsumerPomXMLFilter extends XMLFilterImpl +{ + private final XMLFilter rootFilter; + + public ConsumerPomXMLFilter() throws SAXException, ParserConfigurationException + { + this( SAXParserFactory.newInstance().newSAXParser().getXMLReader() ); + } + + public ConsumerPomXMLFilter( XMLReader parent ) + { + rootFilter = new BuildPomXMLFilter( parent ); + + // Ensure that xs:any elements aren't touched by next filters + XMLFilter filter = new FastForwardFilter( rootFilter ); + + // Strip modules + filter = new ModulesXMLFilter( filter ); + // Adjust relativePath + filter = new RelativePathXMLFilter( filter ); + + // maybe more to follow + + super.setParent( filter ); + } + + @Override + public void setParent( XMLReader parent ) + { + rootFilter.setParent( parent ); + } +} diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java b/maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java new file mode 100644 index 0000000..df68167 --- /dev/null +++ b/maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java @@ -0,0 +1,128 @@ +package org.apache.maven.xml.filter; + +/* + * 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 java.util.ArrayDeque; +import java.util.Deque; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; +import org.xml.sax.XMLFilter; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLFilterImpl; + +/** + * This filter will skip all following filters and write directly to the output. + * Should be used in case of a DOM that should not be effected by other filters, even though the elements match + * + * @author Robert Scholte + * @since 4.0.0 + */ +class FastForwardFilter extends XMLFilterImpl +{ + /** + * DOM elements of pom + * + * <ul> + * <li>execution.configuration</li> + * <li>plugin.configuration</li> + * <li>plugin.goals</li> + * <li>profile.reports</li> + * <li>project.reports</li> + * <li>reportSet.configuration</li> + * <ul> + */ + private final Deque<String> state = new ArrayDeque<>(); + + private int domDepth = 0; + + private ContentHandler originalHandler; + + FastForwardFilter() + { + super(); + } + + FastForwardFilter( XMLReader parent ) + { + super( parent ); + } + + @Override + public void startElement( String uri, String localName, String qName, Attributes atts ) + throws SAXException + { + super.startElement( uri, localName, qName, atts ); + if ( domDepth > 0 ) + { + domDepth++; + } + else + { + final String key = state.peek() + '.' + localName; + switch ( key ) + { + case "execution.configuration": + case "plugin.configuration": + case "plugin.goals": + case "profile.reports": + case "project.reports": + case "reportSet.configuration": + domDepth++; + + originalHandler = getContentHandler(); + + ContentHandler outputContentHandler = getContentHandler(); + while ( outputContentHandler instanceof XMLFilter ) + { + outputContentHandler = ( (XMLFilter) outputContentHandler ).getContentHandler(); + } + setContentHandler( outputContentHandler ); + break; + default: + break; + } + state.push( localName ); + } + } + + @Override + public void endElement( String uri, String localName, String qName ) + throws SAXException + { + if ( domDepth > 0 ) + { + domDepth--; + + if ( domDepth == 0 ) + { + setContentHandler( originalHandler ); + } + } + else + { + state.pop(); + } + super.endElement( uri, localName, qName ); + } + + +} \ No newline at end of file diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java b/maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java new file mode 100644 index 0000000..9e7b6fd --- /dev/null +++ b/maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java @@ -0,0 +1,102 @@ +package org.apache.maven.xml.filter; + +/* + * 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.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLFilterImpl; + +/** + * Remove all modules, this is just buildtime information + * + * @author Robert Scholte + * @since 3.7.0 + */ +class ModulesXMLFilter + extends XMLFilterImpl +{ + /** + * Using 3 to also remove whitespace-block after closing tag + * -1 none + * 1 started + * 2 ended + */ + int modulesStatus = -1; + + ModulesXMLFilter() + { + super(); + } + + ModulesXMLFilter( XMLReader parent ) + { + super( parent ); + } + + @Override + public void startElement( String uri, String localName, String qName, Attributes atts ) + throws SAXException + { + if ( modulesStatus == -1 && "modules".equals( localName ) ) + { + modulesStatus = 1; + } + else if ( modulesStatus == 2 ) + { + modulesStatus = -1; + } + + if ( modulesStatus != 1 ) + { + super.startElement( uri, localName, qName, atts ); + } + } + + @Override + public void endElement( String uri, String localName, String qName ) + throws SAXException + { + if ( modulesStatus == 1 && "modules".equals( localName ) ) + { + modulesStatus = 2; + } + else if ( modulesStatus == 2 ) + { + modulesStatus = -1; + } + + if ( modulesStatus == -1 ) + { + super.endElement( uri, localName, qName ); + } + } + + @Override + public void characters( char[] ch, int start, int length ) + throws SAXException + { + if ( modulesStatus == -1 ) + { + super.characters( ch, start, length ); + } + } + +} diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java b/maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java new file mode 100644 index 0000000..8548ddd --- /dev/null +++ b/maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java @@ -0,0 +1,98 @@ +package org.apache.maven.xml.filter; + +/* + * 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.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLFilterImpl; + +/** + * Remove content from relativePath + * + * TODO fix indentation of closing parent tag + * + * @author Robert Scholte + * @since 3.7.0 + */ +class RelativePathXMLFilter + extends XMLFilterImpl +{ + /** + * Using 3 to also remove whitespace-block after closing tag + * -1 none + * 1 started + * 2 ended + */ + int relativePathStatus = -1; + + RelativePathXMLFilter() + { + super(); + } + + RelativePathXMLFilter( XMLReader parent ) + { + super( parent ); + } + + @Override + public void startElement( String uri, String localName, String qName, Attributes atts ) + throws SAXException + { + if ( relativePathStatus == -1 && "relativePath".equals( localName ) ) + { + relativePathStatus = 1; + } + else if ( relativePathStatus == 2 ) + { + relativePathStatus = -1; + } + + super.startElement( uri, localName, qName, atts ); + } + + @Override + public void endElement( String uri, String localName, String qName ) + throws SAXException + { + if ( relativePathStatus == 1 && "relativePath".equals( localName ) ) + { + relativePathStatus = 2; + } + else if ( relativePathStatus == 2 ) + { + relativePathStatus = -1; + } + + super.endElement( uri, localName, qName ); + } + + @Override + public void characters( char[] ch, int start, int length ) + throws SAXException + { + if ( relativePathStatus != 1 ) + { + super.characters( ch, start, length ); + } + } + +} diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java b/maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java new file mode 100644 index 0000000..69fc33b --- /dev/null +++ b/maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java @@ -0,0 +1,80 @@ +package org.apache.maven.xml.filter; + +import java.io.Reader; + +/* + * 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 java.io.StringReader; +import java.io.StringWriter; +import java.io.Writer; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamResult; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLFilter; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; + +public class AbstractXMLFilterTests +{ + + public AbstractXMLFilterTests() + { + super(); + } + + protected String transform( String input, XMLFilter filter ) + throws TransformerException, SAXException + { + return transform( new StringReader( input ), filter ); + } + + protected String transform( Reader input, XMLFilter filter ) + throws TransformerException, SAXException + { + XMLReader reader = XMLReaderFactory.createXMLReader(); + + XMLFilter parent = filter; + while ( parent.getParent() instanceof XMLFilter ) + { + parent = (XMLFilter) parent.getParent(); + } + parent.setParent( reader ); + + Writer writer = new StringWriter(); + StreamResult result = new StreamResult( writer ); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" ); + + SAXSource transformSource = new SAXSource( filter, new InputSource( input ) ); + + transformer.transform( transformSource, result ); + + return writer.toString(); + } +} \ No newline at end of file diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java new file mode 100644 index 0000000..b3d44db --- /dev/null +++ b/maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java @@ -0,0 +1,64 @@ +package org.apache.maven.xml.filter; + +/* + * 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 org.junit.Before; +import org.junit.Test; + +public class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests +{ + private ConsumerPomXMLFilter filter; + + @Before + public void setup() throws Exception { + filter = new ConsumerPomXMLFilter(); + } + + @Test + public void testAllFilters() throws Exception { + String input = "<project>\n" + + " <parent>\n" + + " <groupId>GROUPID</groupId>\n" + + " <artifactId>PARENT</artifactId>\n" + + " <version>VERSION</version>\n" + + " <relativePath>../pom.xml</relativePath>\n" + + " </parent>\n" + + " <artifactId>PROJECT</artifactId>\n" + + " <modules>\n" + + " <module>ab</module>\n" + + " <module>../cd</module>\n" + + " </modules>\n" + + "</project>"; + String expected = "<project>\n" + + " <parent>\n" + + " <groupId>GROUPID</groupId>\n" + + " <artifactId>PARENT</artifactId>\n" + + " <version>VERSION</version>\n" + + " <relativePath/>\n" + + " </parent>\n" + + " <artifactId>PROJECT</artifactId>\n" + + "</project>"; + String actual = transform( input, filter ); + assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical(); + } + +} diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java b/maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java new file mode 100644 index 0000000..353f174 --- /dev/null +++ b/maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java @@ -0,0 +1,62 @@ +package org.apache.maven.xml.filter; + +/* + * 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 org.junit.Before; +import org.junit.Test; + +public class ModulesXMLFilterTest extends AbstractXMLFilterTests { + + private ModulesXMLFilter filter; + + @Before + public void setup() { + filter = new ModulesXMLFilter(); + } + + @Test + public void testEmptyModules() throws Exception { + String input = "<project><modules/></project>"; + String expected = "<project/>"; + String actual = transform( input, filter ); + assertThat( actual ).and( expected ).areIdentical(); + } + + @Test + public void testSetOfModules() throws Exception { + String input = "<project><modules>" + + "<module>ab</module>" + + "<module>../cd</module>" + + "</modules></project>"; + String expected = "<project/>"; + String actual = transform( input, filter ); + assertThat( actual ).and( expected ).areIdentical(); + } + + @Test + public void testNoModules() throws Exception { + String input = "<project><name>NAME</name></project>"; + String expected = input; + String actual = transform( input, filter ); + assertThat( actual ).and( expected ).areIdentical(); + } +} diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java b/maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java new file mode 100644 index 0000000..298197d --- /dev/null +++ b/maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java @@ -0,0 +1,61 @@ +package org.apache.maven.xml.filter; + +import static org.xmlunit.assertj.XmlAssert.assertThat; + +/* + * 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.junit.Before; +import org.junit.Test; + +public class RelativePathXMLFilterTest extends AbstractXMLFilterTests +{ + private RelativePathXMLFilter filter; + + @Before + public void setup() { + filter = new RelativePathXMLFilter(); + } + + @Test + public void testRelativePath() throws Exception + { + String input = "<project>\n" + + " <parent>\n" + + " <groupId>GROUPID</groupId>\n" + + " <artifactId>PARENT</artifactId>\n" + + " <version>VERSION</version>\n" + + " <relativePath>../pom.xml</relativePath>\n" + + " </parent>\n" + + " <artifactId>PROJECT</artifactId>\n" + + "</project>"; + String expected = "<project>\n" + + " <parent>\n" + + " <groupId>GROUPID</groupId>\n" + + " <artifactId>PARENT</artifactId>\n" + + " <version>VERSION</version>\n" + + " <relativePath/>\n" + + " </parent>\n" + + " <artifactId>PROJECT</artifactId>\n" + + "</project>"; + String actual = transform( input, filter ); + assertThat( actual ).and( expected ).areIdentical(); + } + +} diff --git a/pom.xml b/pom.xml index c3f4bcb..9677856 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ under the License. <jxpathVersion>1.3</jxpathVersion> <resolverVersion>1.3.3</resolverVersion> <slf4jVersion>1.7.25</slf4jVersion> - <xmlunitVersion>2.2.1</xmlunitVersion> + <xmlunitVersion>2.6.2</xmlunitVersion> <maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile> <!-- Control the name of the distribution and information output by mvn --> <distributionId>apache-maven</distributionId> @@ -408,6 +408,12 @@ under the License. </dependency> <dependency> <groupId>org.xmlunit</groupId> + <artifactId>xmlunit-assertj</artifactId> + <version>${xmlunitVersion}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.xmlunit</groupId> <artifactId>xmlunit-core</artifactId> <version>${xmlunitVersion}</version> <scope>test</scope>
