From 65a5a1bbaaf205fa2614d0725291a4bbc63f9633 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Tue, 14 May 2019 21:26:07 +0200
Subject: [PATCH 01/52] [MNG-6656] Introduce base for build/consumer pom
---
maven-core/pom.xml | 5 +
...DefaultRepositorySystemSessionFactory.java | 107 +++++++++++++--
.../maven/xml/filter/BuildPomXMLFilter.java | 44 ++++++
.../xml/filter/ConsumerPomXMLFilter.java | 73 ++++++++++
.../maven/xml/filter/FastForwardFilter.java | 128 ++++++++++++++++++
.../maven/xml/filter/ModulesXMLFilter.java | 102 ++++++++++++++
.../xml/filter/RelativePathXMLFilter.java | 98 ++++++++++++++
.../xml/filter/AbstractXMLFilterTests.java | 80 +++++++++++
.../xml/filter/ConsumerPomXMLFilterTest.java | 64 +++++++++
.../xml/filter/ModulesXMLFilterTest.java | 62 +++++++++
.../xml/filter/RelativePathXMLFilterTest.java | 61 +++++++++
pom.xml | 8 +-
12 files changed, 823 insertions(+), 9 deletions(-)
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index be31a3eca54b..e467851442b5 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -136,6 +136,11 @@ under the License.
mockito-coretest
+
+ org.xmlunit
+ xmlunit-assertj
+ test
+
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 248a3b6dd120..792b08544784 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 @@
* 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.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 @@ else if ( request.isUpdateSnapshots() )
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 getTransformersForArtifact( Artifact artifact )
+ {
+ Collection 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 000000000000..60f0c4951d32
--- /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 000000000000..8709b9c0a15d
--- /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 000000000000..df68167a1394
--- /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
+ *
+ *
+ *
execution.configuration
+ *
plugin.configuration
+ *
plugin.goals
+ *
profile.reports
+ *
project.reports
+ *
reportSet.configuration
+ *
+ */
+ private final Deque 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 000000000000..9e7b6fdbe5de
--- /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 000000000000..8548ddd73d9c
--- /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 000000000000..69fc33ba8f59
--- /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 000000000000..b3d44db91b6b
--- /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 = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " ../pom.xml\n"
+ + " \n"
+ + " PROJECT\n"
+ + " \n"
+ + " ab\n"
+ + " ../cd\n"
+ + " \n"
+ + "";
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " \n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ 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 000000000000..353f1742d896
--- /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 = "";
+ String expected = "";
+ String actual = transform( input, filter );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+ @Test
+ public void testSetOfModules() throws Exception {
+ String input = ""
+ + "ab"
+ + "../cd"
+ + "";
+ String expected = "";
+ String actual = transform( input, filter );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+ @Test
+ public void testNoModules() throws Exception {
+ String input = "NAME";
+ 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 000000000000..298197dd1c81
--- /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 = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " ../pom.xml\n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " \n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String actual = transform( input, filter );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index cb9dae5b6647..640e57cbd9a1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,7 @@ under the License.
1.31.3.31.7.25
- 2.2.1
+ 2.6.2trueapache-maven
@@ -405,6 +405,12 @@ under the License.
${mockitoVersion}test
+
+ org.xmlunit
+ xmlunit-assertj
+ ${xmlunitVersion}
+ test
+ org.xmlunitxmlunit-core
From dfb0c2cc75d9b381332c979d3ca1fb17330115b9 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Tue, 14 May 2019 21:26:07 +0200
Subject: [PATCH 02/52] [MNG-6656] Introduce base for build/consumer pom
---
maven-core/pom.xml | 5 +
...DefaultRepositorySystemSessionFactory.java | 107 +++++++++++++--
.../maven/xml/filter/BuildPomXMLFilter.java | 44 ++++++
.../xml/filter/ConsumerPomXMLFilter.java | 73 ++++++++++
.../maven/xml/filter/FastForwardFilter.java | 128 ++++++++++++++++++
.../maven/xml/filter/ModulesXMLFilter.java | 102 ++++++++++++++
.../xml/filter/RelativePathXMLFilter.java | 98 ++++++++++++++
.../xml/filter/AbstractXMLFilterTests.java | 80 +++++++++++
.../xml/filter/ConsumerPomXMLFilterTest.java | 64 +++++++++
.../xml/filter/ModulesXMLFilterTest.java | 62 +++++++++
.../xml/filter/RelativePathXMLFilterTest.java | 61 +++++++++
pom.xml | 8 +-
12 files changed, 823 insertions(+), 9 deletions(-)
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
create mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index be31a3eca54b..e467851442b5 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -136,6 +136,11 @@ under the License.
mockito-coretest
+
+ org.xmlunit
+ xmlunit-assertj
+ test
+
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 248a3b6dd120..792b08544784 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 @@
* 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.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 @@ else if ( request.isUpdateSnapshots() )
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 getTransformersForArtifact( Artifact artifact )
+ {
+ Collection 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 000000000000..60f0c4951d32
--- /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 000000000000..8709b9c0a15d
--- /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 000000000000..df68167a1394
--- /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
+ *
+ *
+ *
execution.configuration
+ *
plugin.configuration
+ *
plugin.goals
+ *
profile.reports
+ *
project.reports
+ *
reportSet.configuration
+ *
+ */
+ private final Deque 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 000000000000..9e7b6fdbe5de
--- /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 000000000000..8548ddd73d9c
--- /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 000000000000..69fc33ba8f59
--- /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 000000000000..b3d44db91b6b
--- /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 = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " ../pom.xml\n"
+ + " \n"
+ + " PROJECT\n"
+ + " \n"
+ + " ab\n"
+ + " ../cd\n"
+ + " \n"
+ + "";
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " \n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ 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 000000000000..353f1742d896
--- /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 = "";
+ String expected = "";
+ String actual = transform( input, filter );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+ @Test
+ public void testSetOfModules() throws Exception {
+ String input = ""
+ + "ab"
+ + "../cd"
+ + "";
+ String expected = "";
+ String actual = transform( input, filter );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+ @Test
+ public void testNoModules() throws Exception {
+ String input = "NAME";
+ 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 000000000000..298197dd1c81
--- /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 = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " ../pom.xml\n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " \n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String actual = transform( input, filter );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index c3f4bcbdaaf8..967785678438 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,7 @@ under the License.
1.31.3.31.7.25
- 2.2.1
+ 2.6.2trueapache-maven
@@ -406,6 +406,12 @@ under the License.
${mockitoVersion}test
+
+ org.xmlunit
+ xmlunit-assertj
+ ${xmlunitVersion}
+ test
+ org.xmlunitxmlunit-core
From 79c4813558486fcedcdd902f8f3188591c747a21 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 1 Jun 2019 19:08:21 +0200
Subject: [PATCH 03/52] [MNG-6656] separate module for maven-xml,
maven-model-builder doesn't depend on maven-core
---
maven-core/pom.xml | 4 +
...DefaultRepositorySystemSessionFactory.java | 53 ++++-----
maven-model-builder/pom.xml | 6 +-
.../model/building/DefaultModelBuilder.java | 15 ++-
maven-xml/pom.xml | 62 ++++++++++
.../java/org/apache/maven/xml/SAXEvent.java | 34 ++++++
.../org/apache/maven/xml/SAXEventFactory.java | 111 ++++++++++++++++++
.../org/apache/maven/xml/SAXEventUtils.java | 38 ++++++
.../maven/xml/filter/BuildPomXMLFilter.java | 11 +-
.../xml/filter/ConsumerPomXMLFilter.java | 23 +++-
.../maven/xml/filter/FastForwardFilter.java | 0
.../maven/xml/filter/ModulesXMLFilter.java | 0
.../xml/filter/RelativePathXMLFilter.java | 0
.../xml/filter/AbstractXMLFilterTests.java | 0
.../xml/filter/ConsumerPomXMLFilterTest.java | 0
.../xml/filter/ModulesXMLFilterTest.java | 0
.../xml/filter/RelativePathXMLFilterTest.java | 0
pom.xml | 27 +++++
18 files changed, 337 insertions(+), 47 deletions(-)
create mode 100644 maven-xml/pom.xml
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
rename {maven-core => maven-xml}/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java (85%)
rename {maven-core => maven-xml}/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java (79%)
rename {maven-core => maven-xml}/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java (100%)
rename {maven-core => maven-xml}/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java (100%)
rename {maven-core => maven-xml}/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java (100%)
rename {maven-core => maven-xml}/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java (100%)
rename {maven-core => maven-xml}/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java (100%)
rename {maven-core => maven-xml}/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java (100%)
rename {maven-core => maven-xml}/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java (100%)
diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index e467851442b5..79dc86e2600f 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -60,6 +60,10 @@ under the License.
org.apache.mavenmaven-artifact
+
+ org.apache.maven
+ maven-xml
+ org.apache.mavenmaven-plugin-api
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 792b08544784..5ee55255d033 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
@@ -34,7 +34,6 @@
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;
@@ -77,7 +76,6 @@
import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy;
import org.eclipse.sisu.Nullable;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* @since 3.3.0
@@ -283,41 +281,34 @@ public Collection getTransformersForArtifact( Artifact artifact
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( null /* @TODO bass BuildPomXMLFilter */ ),
+ new InputSource( new FileReader( file ) ) );
+
+ final StreamResult result = new StreamResult( pipedOutputStream );
+
+ final Runnable runnable = new Runnable()
{
- 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()
{
- @Override
- public void run()
+ try ( PipedOutputStream out = pipedOutputStream )
{
- try ( PipedOutputStream out = pipedOutputStream )
- {
- transformerFactory.newTransformer().transform( transformSource, result );
- }
- catch ( TransformerException | IOException e )
- {
- throw new RuntimeException( e );
- }
+ transformerFactory.newTransformer().transform( transformSource, result );
}
- };
+ catch ( TransformerException | IOException e )
+ {
+ throw new RuntimeException( e );
+ }
+ }
+ };
- new Thread( runnable ).start();
+ new Thread( runnable ).start();
- return pipedInputStream;
- }
- catch ( SAXException | ParserConfigurationException e )
- {
- throw new TransformException( e );
- }
+ return pipedInputStream;
}
@Override
diff --git a/maven-model-builder/pom.xml b/maven-model-builder/pom.xml
index 9a85016fbeaf..0f10fa927670 100644
--- a/maven-model-builder/pom.xml
+++ b/maven-model-builder/pom.xml
@@ -58,6 +58,11 @@ under the License.
org.apache.mavenmaven-builder-support
+
+ org.apache.maven
+ maven-xml
+
+
org.eclipse.sisuorg.eclipse.sisu.inject
@@ -67,7 +72,6 @@ under the License.
org.eclipse.sisu.plexustest
-
com.google.injectguice
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index f981944f940f..7022781e6e04 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -549,6 +549,7 @@ private Model readModel( ModelSource modelSource, File pomFile, ModelBuildingReq
try
{
+ // RFS adjust inputstream
model = modelProcessor.read( modelSource.getInputStream(), options );
}
catch ( ModelParseException e )
@@ -733,12 +734,24 @@ private void checkPluginVersions( List lineage, ModelBuildingRequest
private void assembleInheritance( List lineage, ModelBuildingRequest request,
ModelProblemCollector problems )
{
- for ( int i = lineage.size() - 2; i >= 0; i-- )
+ for ( int i = lineage.size() - 2; i >= 1; i-- )
{
Model parent = lineage.get( i + 1 ).getModel();
Model child = lineage.get( i ).getModel();
inheritanceAssembler.assembleModelInheritance( child, parent, request, problems );
}
+
+ // re-read model from file
+ if ( Boolean.getBoolean( "maven.experimental.buildconsumer" ) )
+ {
+ throw new UnsupportedOperationException();
+ }
+ else
+ {
+ Model parent = lineage.get( 1 ).getModel();
+ Model child = lineage.get( 0 ).getModel();
+ inheritanceAssembler.assembleModelInheritance( child, parent, request, problems );
+ }
}
private Map getProfileActivations( Model model, boolean clone )
diff --git a/maven-xml/pom.xml b/maven-xml/pom.xml
new file mode 100644
index 000000000000..aeef99eab9ec
--- /dev/null
+++ b/maven-xml/pom.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+ 4.0.0
+
+ org.apache.maven
+ maven
+ 3.6.2-SNAPSHOT
+
+ maven-xml
+ Maven XML
+
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.codehaus.mojo
+ animal-sniffer-maven-plugin
+
+
+ org.codehaus.mojo.signature
+ java18
+ 1.0
+
+
+
+
+
+
+
+
+ org.xmlunit
+ xmlunit-assertj
+ test
+
+
+
\ No newline at end of file
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
new file mode 100644
index 000000000000..07da2808b4a0
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
@@ -0,0 +1,34 @@
+package org.apache.maven.xml;
+
+/*
+ * 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;
+
+/**
+ * Command pattern to gather events which can be executed later on.
+ *
+ * @author Robert Scholte
+ * @since
+ */
+@FunctionalInterface
+public interface SAXEvent
+{
+ void execute() throws SAXException;
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
new file mode 100644
index 000000000000..42739e120bbb
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
@@ -0,0 +1,111 @@
+package org.apache.maven.xml;
+
+/*
+ * 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.ContentHandler;
+import org.xml.sax.Locator;
+
+/**
+ * Factory for SAXEvents
+ *
+ * @author Robert Scholte
+ * @since 4.0.0
+ */
+public final class SAXEventFactory
+{
+ private final ContentHandler contentHandler;
+
+ protected SAXEventFactory( ContentHandler contentHandler )
+ {
+ this.contentHandler = contentHandler;
+ }
+
+ public SAXEvent characters( final char[] ch, final int start, final int length )
+ {
+ final char[] txt;
+ if ( start > 0 )
+ {
+ txt = new char[length];
+ System.arraycopy( ch, start, txt, 0, length );
+ }
+ else
+ {
+ txt = ch;
+ }
+
+ return () -> contentHandler.characters( txt, 0, length );
+ }
+
+ public SAXEvent endDocument()
+ {
+ return () -> contentHandler.endDocument();
+ }
+
+ public SAXEvent endElement( final String uri, final String localName, final String qName )
+ {
+ return () -> contentHandler.endElement( uri, localName, qName );
+ }
+
+ public SAXEvent endPrefixMapping( final String prefix )
+ {
+ return () -> contentHandler.endPrefixMapping( prefix );
+ }
+
+ public SAXEvent ignorableWhitespace( final char[] ch, final int start, final int length )
+ {
+ return () -> contentHandler.ignorableWhitespace( ch, start, length );
+ }
+
+ public SAXEvent processingInstruction( final String target, final String data )
+ {
+ return () -> contentHandler.processingInstruction( target, data );
+ }
+
+ public SAXEvent setDocumentLocator( final Locator locator )
+ {
+ return () -> contentHandler.setDocumentLocator( locator );
+ }
+
+ public SAXEvent skippedEntity( final String name )
+ {
+ return () -> contentHandler.skippedEntity( name );
+ }
+
+ public SAXEvent startDocument()
+ {
+ return () -> contentHandler.startDocument();
+ }
+
+ public SAXEvent startElement( final String uri, final String localName, final String qName, final Attributes atts )
+ {
+ return () -> contentHandler.startElement( uri, localName, qName, atts );
+ }
+
+ public SAXEvent startPrefixMapping( final String prefix, final String uri )
+ {
+ return () -> contentHandler.startPrefixMapping( prefix, uri );
+ }
+
+ public static SAXEventFactory newInstance( ContentHandler handler )
+ {
+ return new SAXEventFactory( handler );
+ }
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
new file mode 100644
index 000000000000..06f4f26d98d9
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
@@ -0,0 +1,38 @@
+package org.apache.maven.xml;
+
+/*
+ * 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.
+ */
+
+/**
+ * Utility class for SAXEvents
+ *
+ * @author Robert Scholte
+ * @since 4.0.0
+ */
+public final class SAXEventUtils
+{
+ private SAXEventUtils()
+ {
+ }
+
+ public static String renameQName( String oldQName, String newLocalName )
+ {
+ return oldQName.replaceFirst( "[^:]+$", newLocalName );
+ }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
similarity index 85%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
index 60f0c4951d32..58d219b29657 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
@@ -19,7 +19,6 @@
* under the License.
*/
-import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
/**
@@ -30,15 +29,7 @@
*/
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-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
similarity index 79%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
index 8709b9c0a15d..a367419fb948 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
@@ -31,6 +31,7 @@
/**
* XML Filter to transform pom.xml to consumer pom.
* This often means stripping of build-specific information.
+ * When extra information is required during filtering it is probably a member of the BuildPomXMLFilter
*
* This filter is used at 2 locations:
* - {@link org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory} when publishing pom files.
@@ -43,15 +44,29 @@ public class ConsumerPomXMLFilter extends XMLFilterImpl
{
private final XMLFilter rootFilter;
- public ConsumerPomXMLFilter() throws SAXException, ParserConfigurationException
+ // only for testing purpose
+ ConsumerPomXMLFilter() throws SAXException, ParserConfigurationException
{
this( SAXParserFactory.newInstance().newSAXParser().getXMLReader() );
}
-
- public ConsumerPomXMLFilter( XMLReader parent )
+
+ // only for testing purpose
+ ConsumerPomXMLFilter( XMLReader parent )
{
- rootFilter = new BuildPomXMLFilter( parent );
+ this.rootFilter = new XMLFilterImpl( parent );
+ applyFilters();
+ }
+
+ public ConsumerPomXMLFilter( BuildPomXMLFilter buildPomXMLFilter )
+ {
+ this.rootFilter = buildPomXMLFilter;
+
+ applyFilters();
+ }
+
+ private void applyFilters()
+ {
// Ensure that xs:any elements aren't touched by next filters
XMLFilter filter = new FastForwardFilter( rootFilter );
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
similarity index 100%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
similarity index 100%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
similarity index 100%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
diff --git a/pom.xml b/pom.xml
index 967785678438..da0b9de53f2e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,6 +92,7 @@ under the License.
maven-embeddermaven-compatapache-maven
+ maven-xml
@@ -229,6 +230,11 @@ under the License.
maven-slf4j-provider${project.version}
+
+ org.apache.maven
+ maven-xml
+ ${project.version}
+
@@ -442,6 +448,27 @@ under the License.
+
+ org.apache.maven.plugins
+ maven-enforcer-plugin
+
+
+ enforce-bytecode-version
+
+ enforce
+
+
+
+
+
+ org.apache.maven:maven-xml
+
+
+
+
+
+
+ org.codehaus.plexusplexus-component-metadata
From eeea0bb98c1d4d205914c5acaf85d0b620b01c0a Mon Sep 17 00:00:00 2001
From: Stefan Oehme
Date: Tue, 23 Jul 2019 12:25:34 +0200
Subject: [PATCH 04/52] [MNG-6720] MultiThreadedBuilder: wait for parallel
running projects when using --fail-fast
Otherwise the sessionFinished event may be sent before some
projects/goals finish, which violates the contracts of execution
listeners and makes it hard to properly life cycle components that
are needed for goal execution.
This closes #272
---
.../multithreaded/MultiThreadedBuilder.java | 20 ++++---------------
1 file changed, 4 insertions(+), 16 deletions(-)
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java
index bfbfb0260a29..94d10af4b44c 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java
@@ -27,7 +27,7 @@
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.internal.BuildThreadFactory;
@@ -114,6 +114,9 @@ public void build( MavenSession session, ReactorContext reactorContext, ProjectB
}
}
+
+ executor.shutdown();
+ executor.awaitTermination( Long.MAX_VALUE, TimeUnit.MILLISECONDS );
}
private void multiThreadedProjectTaskSegmentBuild( ConcurrencyDependencyGraph analyzer,
@@ -172,21 +175,6 @@ private void multiThreadedProjectTaskSegmentBuild( ConcurrencyDependencyGraph an
break;
}
}
-
- // cancel outstanding builds (if any) - this can happen if an exception is thrown in above block
-
- Future unprocessed;
- while ( ( unprocessed = service.poll() ) != null )
- {
- try
- {
- unprocessed.get();
- }
- catch ( InterruptedException | ExecutionException e )
- {
- throw new RuntimeException( e );
- }
- }
}
private Callable createBuildCallable( final MavenSession rootSession,
From 144076c00c0b82026ddf028844169861e9b7d172 Mon Sep 17 00:00:00 2001
From: tibordigana
Date: Tue, 30 Jul 2019 11:52:43 +0200
Subject: [PATCH 05/52] [MNG-6725] Skip '.mavenrc' via MAVEN_SKIP_RC=1 and
'-Dmaven.skip.rc=true' on child ITs (by default on Jenkins CI).
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index b9e510dae4e2..af9a395c4144 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -100,7 +100,7 @@ for (String os in runITsOses) {
withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/it-local-repo", options:[
junitPublisher(ignoreAttachments: false)
]) {
- String cmd = "${runITscommand} -DmavenDistro=$WORK_DIR/apache-maven-dist.zip -Dmaven.test.failure.ignore=true"
+ String cmd = "${runITscommand} -DmavenDistro=$WORK_DIR/apache-maven-dist.zip -Dmaven.test.failure.ignore=true -Dmaven.skip.rc=true"
if (stageId.endsWith('-jdk7')) {
// Java 7u80 has TLS 1.2 disabled by default: need to explicitly enable
cmd = "${cmd} -Dhttps.protocols=TLSv1.2"
From b9c7c4af6e2e93e2d0ac500d4dcc720e26fe217d Mon Sep 17 00:00:00 2001
From: tibordigana
Date: Wed, 31 Jul 2019 17:22:07 +0200
Subject: [PATCH 06/52] IT archives
---
Jenkinsfile | 43 +++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index af9a395c4144..0998f02f8b2d 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -97,22 +97,29 @@ for (String os in runITsOses) {
bat "if exist apache-maven-dist.zip del /q apache-maven-dist.zip"
}
unstash 'dist'
- withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/it-local-repo", options:[
- junitPublisher(ignoreAttachments: false)
- ]) {
- String cmd = "${runITscommand} -DmavenDistro=$WORK_DIR/apache-maven-dist.zip -Dmaven.test.failure.ignore=true -Dmaven.skip.rc=true"
- if (stageId.endsWith('-jdk7')) {
- // Java 7u80 has TLS 1.2 disabled by default: need to explicitly enable
- cmd = "${cmd} -Dhttps.protocols=TLSv1.2"
- }
-
- if (isUnix()) {
- sh "${cmd}"
- } else {
- bat "${cmd}"
+ try {
+ withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/it-local-repo", options:[
+ junitPublisher(ignoreAttachments: false)
+ ]) {
+ String cmd = "${runITscommand} -DmavenDistro=$WORK_DIR/apache-maven-dist.zip -Dmaven.test.failure.ignore=true -Dmaven.skip.rc=true"
+ if (stageId.endsWith('-jdk7')) {
+ // Java 7u80 has TLS 1.2 disabled by default: need to explicitly enable
+ cmd = "${cmd} -Dhttps.protocols=TLSv1.2"
+ }
+
+ if (isUnix()) {
+ sh 'df -hT'
+ sh "${cmd}"
+ } else {
+ bat 'wmic logicaldisk get size,freespace,caption'
+ bat "${cmd}"
+ }
}
+ } finally {
+ archiveDirs(stageId, ['core-it-suite-logs':'core-it-suite/target/test-classes',
+ 'core-it-suite-reports':'core-it-suite/target/surefire-reports'])
+ deleteDir() // clean up after ourselves to reduce disk space
}
- deleteDir() // clean up after ourselves to reduce disk space
}
}
}
@@ -156,3 +163,11 @@ parallel(runITsTasks)
jenkinsNotify()
}
}
+
+def archiveDirs(stageId, archives) {
+ archives.each { archivePrefix, pathToContent ->
+ if (fileExists(pathToContent)) {
+ zip(zipFile: "${archivePrefix}-${stageId}.zip", dir: pathToContent, archive: true)
+ }
+ }
+}
From 5822ea7a4fe2ca50524a939fe5260f7c35e3054d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20Boutemy?=
Date: Mon, 5 Aug 2019 13:12:08 +0100
Subject: [PATCH 07/52] improved handlers documentation: artifact vs dependency
attributes
---
maven-core/src/site/apt/artifact-handlers.apt | 53 ++++++++++---------
1 file changed, 27 insertions(+), 26 deletions(-)
diff --git a/maven-core/src/site/apt/artifact-handlers.apt b/maven-core/src/site/apt/artifact-handlers.apt
index f79c5a065edb..299d7d821218 100644
--- a/maven-core/src/site/apt/artifact-handlers.apt
+++ b/maven-core/src/site/apt/artifact-handlers.apt
@@ -26,33 +26,34 @@
Default Artifact Handlers Reference
Artifact handlers (see {{{../maven-artifact/apidocs/org/apache/maven/artifact/handler/ArtifactHandler.html} API}})
- define for each {{{../maven-model/maven.html#class_dependency}dependency type}} information on the artifact.
+ define for each {{{../maven-model/maven.html#class_dependency}dependency type}} information on the artifact
+ (classifier, extension, language) and how to manage it as dependency (add to classpath, include dependencies).
Some artifact handlers
are configured by default in <<>>:
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-|| type || extension || packaging || classifier || language || added to classpath || includesDependencies ||
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <= type> | <= type> | | none | | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <= type> | <= type> | | java | <<>> | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <<>> | <<>> | <<>> | java | <<>> | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <<>> | <= type> | | java | <<>> | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <<>> | <= type> | | java | <<>> | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <<>> | <<>> | <<>> | java | <<>> | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <= type> | <= type> | | java | | <<>> |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <= type> | <= type> | | java | | <<>> |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <= type> | <= type> | | java | | <<>> |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <<>> | <= type> | <<>> | java | | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
-| <<>> | <<>> | <= type> | <<>> | java | <<>> | |
-*--------------------+------------+------------+---------------+-----------+---------------------+-----------------------+
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+|| type || classifier || extension || packaging || language || added to classpath || includesDependencies ||
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | | <= type> | <= type> | none | | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | | <= type> | <= type> | java | <<>> | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | <<>> | <<>> | <<>> | java | <<>> | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | | <<>> | <= type> | java | <<>> | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | | <<>> | <= type> | java | <<>> | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | <<>> | <<>> | <<>> | java | <<>> | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | | <= type> | <= type> | java | | <<>> |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | | <= type> | <= type> | java | | <<>> |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | | <= type> | <= type> | java | | <<>> |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | <<>> | <<>> | <= type> | java | | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
+| <<>> | <<>> | <<>> | <= type> | java | <<>> | |
+*--------------------+---------------+------------+------------+-----------+---------------------+-----------------------+
From 01972483e14ba5b2e2e8ccd159ecca89145a6418 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Mon, 5 Aug 2019 18:43:09 +0200
Subject: [PATCH 08/52] [INFRA-18812] Revert unnecessary commits after fixing
INFRA-18812
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 0998f02f8b2d..5d5d998c0398 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -101,7 +101,7 @@ for (String os in runITsOses) {
withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/it-local-repo", options:[
junitPublisher(ignoreAttachments: false)
]) {
- String cmd = "${runITscommand} -DmavenDistro=$WORK_DIR/apache-maven-dist.zip -Dmaven.test.failure.ignore=true -Dmaven.skip.rc=true"
+ String cmd = "${runITscommand} -DmavenDistro=$WORK_DIR/apache-maven-dist.zip -Dmaven.test.failure.ignore=true"
if (stageId.endsWith('-jdk7')) {
// Java 7u80 has TLS 1.2 disabled by default: need to explicitly enable
cmd = "${cmd} -Dhttps.protocols=TLSv1.2"
From 297a6b72a18fc97fe139393c7ffbe6900b6ed802 Mon Sep 17 00:00:00 2001
From: tibordigana
Date: Mon, 5 Aug 2019 23:38:16 +0200
Subject: [PATCH 09/52] fixed ArtifactHandlerTest after commit d5b0f4ce
---
.../maven/artifact/handler/ArtifactHandlerTest.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/maven-core/src/test/java/org/apache/maven/artifact/handler/ArtifactHandlerTest.java b/maven-core/src/test/java/org/apache/maven/artifact/handler/ArtifactHandlerTest.java
index ac02e106d318..69f59fdb364e 100644
--- a/maven-core/src/test/java/org/apache/maven/artifact/handler/ArtifactHandlerTest.java
+++ b/maven-core/src/test/java/org/apache/maven/artifact/handler/ArtifactHandlerTest.java
@@ -42,7 +42,7 @@ public void testAptConsistency()
{
String[] cols = line.split( "\\|\\|" );
String[] expected =
- new String[] { "", "type", "extension", "packaging", "classifier", "language", "added to classpath",
+ new String[] { "", "type", "classifier", "extension", "packaging", "language", "added to classpath",
"includesDependencies", "" };
int i = 0;
@@ -56,9 +56,9 @@ else if ( line.startsWith( "|" ) )
String[] cols = line.split( "\\|" );
String type = trimApt( cols[1] );
- String extension = trimApt( cols[2], type );
- String packaging = trimApt( cols[3], type );
- String classifier = trimApt( cols[4] );
+ String classifier = trimApt( cols[2] );
+ String extension = trimApt( cols[3], type );
+ String packaging = trimApt( cols[4], type );
String language = trimApt( cols[5] );
String addedToClasspath = trimApt( cols[6] );
String includesDependencies = trimApt( cols[7] );
From e6240d586c89442aa8732711ede859f08cae5fa7 Mon Sep 17 00:00:00 2001
From: Ray Tsang
Date: Tue, 6 Aug 2019 09:18:58 -0700
Subject: [PATCH 10/52] [MNG-6713] Fix ExclusionArtifactFilter to respect
wildcard exclusions. (#269)
* [MNG-6713] Fix ExclusionArtifactFilter to respect wildcard exclusions.
* Moved `*` to a constant
---
.../filter/ExclusionArtifactFilter.java | 24 +++-
.../filter/ExclusionArtifactFilterTest.java | 123 ++++++++++++++++++
2 files changed, 142 insertions(+), 5 deletions(-)
create mode 100644 maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java
diff --git a/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter.java b/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter.java
index 42390d640a26..e0c9994f2ae8 100644
--- a/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter.java
+++ b/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter.java
@@ -19,16 +19,18 @@
* under the License.
*/
-import java.util.List;
-
import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Exclusion;
+import java.util.List;
+
/**
- * Filter to exclude from a list of artifact patterns.
+ * Filter to exclude from a list of artifact patterns.
*/
public class ExclusionArtifactFilter implements ArtifactFilter
{
+ private static final String WILDCARD = "*";
+
private final List exclusions;
public ExclusionArtifactFilter( List exclusions )
@@ -41,8 +43,20 @@ public boolean include( Artifact artifact )
{
for ( Exclusion exclusion : exclusions )
{
- if ( exclusion.getGroupId().equals( artifact.getGroupId() )
- && exclusion.getArtifactId().equals( artifact.getArtifactId() ) )
+ if ( WILDCARD.equals( exclusion.getGroupId() ) && WILDCARD.equals( exclusion.getArtifactId() ) )
+ {
+ return false;
+ }
+ if ( WILDCARD.equals( exclusion.getGroupId() ) )
+ {
+ return !exclusion.getArtifactId().equals( artifact.getArtifactId() );
+ }
+ if ( WILDCARD.equals( exclusion.getArtifactId() ) )
+ {
+ return !exclusion.getGroupId().equals( artifact.getGroupId() );
+ }
+ if ( exclusion.getGroupId().equals( artifact.getGroupId() ) && exclusion.getArtifactId().equals(
+ artifact.getArtifactId() ) )
{
return false;
}
diff --git a/maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java b/maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java
new file mode 100644
index 000000000000..62a49111b777
--- /dev/null
+++ b/maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java
@@ -0,0 +1,123 @@
+package org.apache.maven.artifact.resolver.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.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Exclusion;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class ExclusionArtifactFilterTest
+{
+ private Artifact artifact;
+
+ @Before
+ public void setup()
+ {
+ artifact = mock( Artifact.class );
+ when( artifact.getGroupId() ).thenReturn( "org.apache.maven" );
+ when( artifact.getArtifactId() ).thenReturn( "maven-core" );
+ }
+
+ @Test
+ public void testExcludeExact()
+ {
+ Exclusion exclusion = new Exclusion();
+ exclusion.setGroupId( "org.apache.maven" );
+ exclusion.setArtifactId( "maven-core" );
+ ExclusionArtifactFilter filter = new ExclusionArtifactFilter( Collections.singletonList( exclusion ) );
+
+ assertThat( filter.include( artifact ), is( false ) );
+ }
+
+ @Test
+ public void testExcludeNoMatch()
+ {
+ Exclusion exclusion = new Exclusion();
+ exclusion.setGroupId( "org.apache.maven" );
+ exclusion.setArtifactId( "maven-model" );
+ ExclusionArtifactFilter filter = new ExclusionArtifactFilter( Collections.singletonList( exclusion ) );
+
+ assertThat( filter.include( artifact ), is( true ) );
+ }
+
+ @Test
+ public void testExcludeGroupIdWildcard()
+ {
+ Exclusion exclusion = new Exclusion();
+ exclusion.setGroupId( "*" );
+ exclusion.setArtifactId( "maven-core" );
+ ExclusionArtifactFilter filter = new ExclusionArtifactFilter( Collections.singletonList( exclusion ) );
+
+ assertThat( filter.include( artifact ), is( false ) );
+ }
+
+
+ @Test
+ public void testExcludeGroupIdWildcardNoMatch()
+ {
+ Exclusion exclusion = new Exclusion();
+ exclusion.setGroupId( "*" );
+ exclusion.setArtifactId( "maven-compat" );
+ ExclusionArtifactFilter filter = new ExclusionArtifactFilter( Collections.singletonList( exclusion ) );
+
+ assertThat( filter.include( artifact ), is( true ) );
+ }
+
+ @Test
+ public void testExcludeArtifactIdWildcard()
+ {
+ Exclusion exclusion = new Exclusion();
+ exclusion.setGroupId( "org.apache.maven" );
+ exclusion.setArtifactId( "*" );
+ ExclusionArtifactFilter filter = new ExclusionArtifactFilter( Collections.singletonList( exclusion ) );
+
+ assertThat( filter.include( artifact ), is( false ) );
+ }
+
+ @Test
+ public void testExcludeArtifactIdWildcardNoMatch()
+ {
+ Exclusion exclusion = new Exclusion();
+ exclusion.setGroupId( "org.apache.groovy" );
+ exclusion.setArtifactId( "*" );
+ ExclusionArtifactFilter filter = new ExclusionArtifactFilter( Collections.singletonList( exclusion ) );
+
+ assertThat( filter.include( artifact ), is( true ) );
+ }
+
+ @Test
+ public void testExcludeAllWildcard()
+ {
+ Exclusion exclusion = new Exclusion();
+ exclusion.setGroupId( "*" );
+ exclusion.setArtifactId( "*" );
+ ExclusionArtifactFilter filter = new ExclusionArtifactFilter( Collections.singletonList( exclusion ) );
+
+ assertThat( filter.include( artifact ), is( false ) );
+ }
+}
\ No newline at end of file
From 5065aecb27fdc1d825d9d53c71e72f422b0d4c70 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 24 Aug 2019 18:10:31 +0200
Subject: [PATCH 11/52] Move Filters to maven-xml filter, so it can be picked
up by maven-model-builder and maven-core Provide BuildPomXMlFilter to set CI
Friendly properties
---
...DefaultRepositorySystemSessionFactory.java | 32 +++---
.../model/building/DefaultModelBuilder.java | 40 +++----
maven-xml/pom.xml | 5 +
.../maven/xml/filter/BuildPomXMLFilter.java | 13 ++-
.../xml/filter/ConsumerPomXMLFilter.java | 19 ++++
.../maven/xml/filter/FastForwardFilter.java | 2 +-
.../xml/filter/RelativePathXMLFilter.java | 1 +
.../xml/filter/AbstractXMLFilterTests.java | 33 +++---
.../xml/filter/ConsumerPomXMLFilterTest.java | 103 ++++++++++++++++--
.../xml/filter/ModulesXMLFilterTest.java | 22 +++-
.../xml/filter/RelativePathXMLFilterTest.java | 75 +++++++++++--
11 files changed, 264 insertions(+), 81 deletions(-)
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 a291c4d27677..20bd44982194 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
@@ -34,6 +34,7 @@
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;
@@ -52,9 +53,7 @@
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.BuildPomXMLFilter;
-import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
-import org.apache.maven.xml.filter.ConsumerPomXMLFilter;
+import org.apache.maven.xml.filter.ConsumerPomXMLFilterFactory;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.xml.Xpp3Dom;
@@ -79,8 +78,6 @@
import org.eclipse.sisu.Nullable;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
/**
* @since 3.3.0
@@ -116,6 +113,9 @@ public class DefaultRepositorySystemSessionFactory
@Inject
MavenRepositorySystem mavenRepositorySystem;
+ @Inject
+ private ConsumerPomXMLFilterFactory consumerPomXMLFilterFactory;
+
public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request )
{
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
@@ -273,7 +273,7 @@ private FileTransformerManager newFileTransformerManager()
return new FileTransformerManager()
{
@Override
- public Collection getTransformersForArtifact( Artifact artifact )
+ public Collection getTransformersForArtifact( final Artifact artifact )
{
Collection transformers = new ArrayList<>();
if ( "pom".equals( artifact.getExtension() ) )
@@ -286,23 +286,24 @@ public Collection getTransformersForArtifact( Artifact artifact
public InputStream transformData( File file )
throws IOException, TransformException
{
+ System.out.println( "transforming " + file.getAbsolutePath() );
final PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream );
- XMLReader parent;
+ final SAXSource transformSource;
try
{
- parent = XMLReaderFactory.createXMLReader();
+ transformSource =
+ new SAXSource( consumerPomXMLFilterFactory.get( artifact.getGroupId(),
+ artifact.getArtifactId() ),
+ new InputSource( new FileReader( file ) ) );
}
- catch ( SAXException e )
- {
- throw new TransformException( "Failed to create XMLReader", e );
+ catch ( SAXException | ParserConfigurationException e )
+ {
+ e.printStackTrace();
+ throw new TransformException( "Failed to create a consumerPomXMLFilter", e );
}
- final SAXSource transformSource =
- new SAXSource( new ConsumerPomXMLFilter( new B ),
- new InputSource( new FileReader( file ) ) );
-
final StreamResult result = new StreamResult( pipedOutputStream );
final Runnable runnable = new Runnable()
@@ -316,6 +317,7 @@ public void run()
}
catch ( TransformerException | IOException e )
{
+ e.printStackTrace();
throw new RuntimeException( e );
}
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 50f877393154..1fea6ddd8b70 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -39,10 +39,10 @@
import javax.inject.Inject;
import javax.inject.Named;
+import javax.inject.Provider;
import javax.inject.Singleton;
import javax.xml.crypto.dsig.TransformException;
import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
@@ -87,12 +87,11 @@
import org.apache.maven.model.resolution.WorkspaceModelResolver;
import org.apache.maven.model.superpom.SuperPomProvider;
import org.apache.maven.model.validation.ModelValidator;
-import org.apache.maven.xml.filter.BuildPomXMLFilter;
+import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
import org.codehaus.plexus.interpolation.MapBasedValueSource;
import org.codehaus.plexus.interpolation.StringSearchInterpolator;
import org.eclipse.sisu.Nullable;
import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
/**
* @author Benjamin Bentmann
@@ -153,6 +152,9 @@ public class DefaultModelBuilder
@Inject
private ReportingConverter reportingConverter;
+
+ @Inject
+ private Provider buildPomXMLFilterFactory;
public DefaultModelBuilder setModelProcessor( ModelProcessor modelProcessor )
{
@@ -561,7 +563,6 @@ private Model readModel( ModelSource modelSource, File pomFile, ModelBuildingReq
try
{
- // RFS adjust inputstream
model = modelProcessor.read( modelSource.getInputStream(), options );
}
catch ( ModelParseException e )
@@ -760,14 +761,19 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
{
// TODO: parent might be part of reactor... better read all lineage items like this?
Model parent = lineage.get( 1 ).getModel();
- Model child = lineage.get( 0 ).getModel();
- // modelProcessor.read( lineage.get( 0 ).getSource().getInputStream(), null );
+
+ Model child = modelProcessor.read( transformData( lineage.get( 0 ) ), null );
inheritanceAssembler.assembleModelInheritance( child, parent, request, problems );
+
+ // sync pomfile, is transient
+ child.setPomFile( lineage.get( 0 ).getModel().getPomFile() );
+ // overwrite child
+ lineage.get( 0 ).setModel( child );
}
- finally
-// catch ( IOException e )
+ catch ( IOException | TransformException | SAXException | ParserConfigurationException e )
{
// this is second read, should not happen
+ e.printStackTrace();
}
}
else
@@ -778,27 +784,17 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
}
}
- private InputStream transformData( InputStream inputStream )
- throws IOException, TransformException
+ private InputStream transformData( ModelData modelData )
+ throws IOException, TransformException, SAXException, ParserConfigurationException
{
final TransformerFactory transformerFactory = TransformerFactory.newInstance();
final PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream );
- XMLReader parent;
- try
- {
- parent = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
- }
- catch ( SAXException | ParserConfigurationException e )
- {
- throw new TransformException( "Failed to create XMLReader", e );
- }
-
final SAXSource transformSource =
- new SAXSource( new BuildPomXMLFilter( parent ),
- new org.xml.sax.InputSource( inputStream ) );
+ new SAXSource( buildPomXMLFilterFactory.get().get( modelData.getGroupId(), modelData.getArtifactId() ),
+ new org.xml.sax.InputSource( modelData.getSource().getInputStream() ) );
final StreamResult result = new StreamResult( pipedOutputStream );
diff --git a/maven-xml/pom.xml b/maven-xml/pom.xml
index aeef99eab9ec..1c576907b20f 100644
--- a/maven-xml/pom.xml
+++ b/maven-xml/pom.xml
@@ -53,6 +53,11 @@ under the License.
+
+ javax.inject
+ javax.inject
+ true
+ org.xmlunitxmlunit-assertj
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
index 9e8d2613fcc7..ab846a080a4b 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
@@ -1,7 +1,5 @@
package org.apache.maven.xml.filter;
-import org.xml.sax.XMLFilter;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -36,8 +34,6 @@
*/
public class BuildPomXMLFilter extends XMLFilterImpl
{
- private XMLFilter rootFilter;
-
BuildPomXMLFilter()
{
super();
@@ -47,4 +43,13 @@ public class BuildPomXMLFilter extends XMLFilterImpl
{
super( parent );
}
+
+ @Override
+ public final void setParent( XMLReader parent )
+ {
+ if ( getParent() == null )
+ {
+ super.setParent( parent );
+ }
+ }
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
index 6c2ea9f65f9c..9975c224f7ee 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
@@ -1,5 +1,24 @@
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;
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
index df68167a1394..6e03a3459d42 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
@@ -34,7 +34,7 @@
* 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
+ * @since 3.7.0
*/
class FastForwardFilter extends XMLFilterImpl
{
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
index 8548ddd73d9c..5dc367fa993e 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
@@ -57,6 +57,7 @@ class RelativePathXMLFilter
public void startElement( String uri, String localName, String qName, Attributes atts )
throws SAXException
{
+
if ( relativePathStatus == -1 && "relativePath".equals( localName ) )
{
relativePathStatus = 1;
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
index 69fc33ba8f59..4ee0e313690c 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
@@ -1,7 +1,5 @@
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
@@ -21,10 +19,13 @@
* under the License.
*/
+import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
@@ -35,34 +36,32 @@
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 abstract class AbstractXMLFilterTests
{
-
public AbstractXMLFilterTests()
{
super();
}
+
+ protected abstract XMLFilter getFilter() throws TransformerException, SAXException, ParserConfigurationException;
+
- protected String transform( String input, XMLFilter filter )
- throws TransformerException, SAXException
+ protected String transform( String input )
+ throws TransformerException, SAXException, ParserConfigurationException
{
- return transform( new StringReader( input ), filter );
+ return transform( new StringReader( input ) );
}
- protected String transform( Reader input, XMLFilter filter )
- throws TransformerException, SAXException
+ protected String transform( Reader input )
+ throws TransformerException, SAXException, ParserConfigurationException
{
- XMLReader reader = XMLReaderFactory.createXMLReader();
-
- XMLFilter parent = filter;
- while ( parent.getParent() instanceof XMLFilter )
+ XMLFilter filter = getFilter();
+ if( filter.getParent() == null )
{
- parent = (XMLFilter) parent.getParent();
+ filter.setParent( SAXParserFactory.newInstance().newSAXParser().getXMLReader() );
+ filter.setFeature( "http://xml.org/sax/features/namespaces", true );
}
- parent.setParent( reader );
Writer writer = new StringWriter();
StreamResult result = new StreamResult( writer );
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
index a169b132dc2e..8fe2d67e4b56 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
@@ -21,18 +21,56 @@
import static org.xmlunit.assertj.XmlAssert.assertThat;
-import javax.xml.parsers.SAXParserFactory;
+import java.util.Optional;
+
+import javax.inject.Provider;
+import javax.xml.parsers.ParserConfigurationException;
-import org.junit.Before;
import org.junit.Test;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLFilter;
public class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests
{
- private ConsumerPomXMLFilter filter;
-
- @Before
- public void setup() throws Exception {
- filter = new ConsumerPomXMLFilterFactory(){}.get( new BuildPomXMLFilter( SAXParserFactory.newInstance().newSAXParser().getXMLReader() ) );
+ @Override
+ protected XMLFilter getFilter() throws SAXException, ParserConfigurationException
+ {
+ final BuildPomXMLFilterFactory buildPomXMLFilterFactory = new BuildPomXMLFilterFactory()
+ {
+ @Override
+ protected Optional getSha1()
+ {
+ return Optional.empty();
+ }
+
+ @Override
+ protected Optional getRevision()
+ {
+ return Optional.empty();
+ }
+
+ @Override
+ protected Optional getChangelist()
+ {
+ return Optional.of( "CL" );
+ }
+ };
+
+ Provider provider = new Provider()
+ {
+
+ @Override
+ public BuildPomXMLFilterFactory get()
+ {
+ return buildPomXMLFilterFactory;
+ }
+ };
+
+ XMLFilter filter = new ConsumerPomXMLFilterFactory( provider )
+ {
+ }.get( "G", "A" );
+ filter.setFeature( "http://xml.org/sax/features/namespaces", true );
+ return filter;
}
@Test
@@ -59,8 +97,57 @@ public void testAllFilters() throws Exception {
+ " \n"
+ " PROJECT\n"
+ "";
- String actual = transform( input, filter );
+ String actual = transform( input );
assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical();
}
+
+ @Test
+ public void testMe() throws Exception {
+ String input = "\r\n" +
+ "\r\n" +
+ " 4.0.0\r\n" +
+ " org.sonatype.mavenbook.multispring\r\n" +
+ " parent\r\n" +
+ " 0.9-${changelist}-SNAPSHOT\r\n" +
+ " pom\r\n" +
+ " Multi-Spring Chapter Parent Project\r\n" +
+ " \r\n" +
+ " simple-parent\r\n" +
+ " \r\n" +
+ " \r\n" +
+ " \r\n" +
+ " \r\n" +
+ " apache.snapshots\r\n" +
+ " http://repository.apache.org/snapshots/\r\n" +
+ " \r\n" +
+ " \r\n" +
+ "";
+ String expected = "\r\n" +
+ "\r\n" +
+ " 4.0.0\r\n" +
+ " org.sonatype.mavenbook.multispring\r\n" +
+ " parent\r\n" +
+ " 0.9-CL-SNAPSHOT\r\n" +
+ " pom\r\n" +
+ " Multi-Spring Chapter Parent Project\r\n" +
+ " \r\n" +
+ " \r\n" +
+ " \r\n" +
+ " apache.snapshots\r\n" +
+ " http://repository.apache.org/snapshots/\r\n" +
+ " \r\n" +
+ " \r\n" +
+ "";
+ String actual = transform( input );
+ assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical();
+ }
+
+
}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
index 353f1742d896..63880ed27008 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
@@ -21,23 +21,35 @@
import static org.xmlunit.assertj.XmlAssert.assertThat;
+import javax.xml.parsers.SAXParserFactory;
+
import org.junit.Before;
import org.junit.Test;
+import org.xml.sax.XMLFilter;
+import org.xml.sax.XMLReader;
public class ModulesXMLFilterTest extends AbstractXMLFilterTests {
private ModulesXMLFilter filter;
+
+ @Override
+ protected XMLFilter getFilter()
+ {
+ return new ModulesXMLFilter();
+ }
@Before
- public void setup() {
- filter = new ModulesXMLFilter();
+ public void setup() throws Exception {
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ filter = new ModulesXMLFilter( xmlReader );
+ filter.setFeature( "http://xml.org/sax/features/namespaces", true );
}
@Test
public void testEmptyModules() throws Exception {
String input = "";
String expected = "";
- String actual = transform( input, filter );
+ String actual = transform( input );
assertThat( actual ).and( expected ).areIdentical();
}
@@ -48,7 +60,7 @@ public void testSetOfModules() throws Exception {
+ "../cd"
+ "";
String expected = "";
- String actual = transform( input, filter );
+ String actual = transform( input );
assertThat( actual ).and( expected ).areIdentical();
}
@@ -56,7 +68,7 @@ public void testSetOfModules() throws Exception {
public void testNoModules() throws Exception {
String input = "NAME";
String expected = input;
- String actual = transform( input, filter );
+ String actual = transform( input );
assertThat( actual ).and( expected ).areIdentical();
}
}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
index 298197dd1c81..1fed1cadf500 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
@@ -1,7 +1,5 @@
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
@@ -21,16 +19,17 @@
* under the License.
*/
-import org.junit.Before;
+import static org.xmlunit.assertj.XmlAssert.assertThat;
+
import org.junit.Test;
+import org.xml.sax.XMLFilter;
public class RelativePathXMLFilterTest extends AbstractXMLFilterTests
{
- private RelativePathXMLFilter filter;
-
- @Before
- public void setup() {
- filter = new RelativePathXMLFilter();
+ @Override
+ protected XMLFilter getFilter()
+ {
+ return new RelativePathXMLFilter();
}
@Test
@@ -54,7 +53,65 @@ public void testRelativePath() throws Exception
+ " \n"
+ " PROJECT\n"
+ "";
- String actual = transform( input, filter );
+ String actual = transform( input );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+ @Test
+ public void testRelativePathNS() throws Exception
+ {
+ String input = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " ../pom.xml\n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " \n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String actual = transform( input );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+ @Test
+ public void testRelativePathPasNS() throws Exception
+ {
+ String input = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " ../pom.xml\n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " \n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String actual = transform( input );
assertThat( actual ).and( expected ).areIdentical();
}
From 82d8693fad39cbe5217bcf1a9518f548a2444eb1 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 24 Aug 2019 18:36:02 +0200
Subject: [PATCH 12/52] Add missing classes
---
.../DefaultBuildPomXMLFilterFactory.java | 69 +++++++++++++++
.../DefaultConsumerPomXMLFilterFactory.java | 37 ++++++++
.../xml/filter/BuildPomXMLFilterFactory.java | 70 ++++++++++++++++
.../maven/xml/filter/CiFriendlyXMLFilter.java | 84 +++++++++++++++++++
.../filter/ConsumerPomXMLFilterFactory.java | 65 ++++++++++++++
5 files changed, 325 insertions(+)
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
create mode 100644 maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/filter/CiFriendlyXMLFilter.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
diff --git a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
new file mode 100644
index 000000000000..0b51da2a99fa
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
@@ -0,0 +1,69 @@
+package org.apache.maven.xml.internal;
+
+/*
+ * 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.Optional;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+//import javax.inject.Provider;
+import javax.inject.Singleton;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
+import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
+
+/**
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+@Named
+@Singleton
+@IgnoreJRERequirement( )
+public class DefaultBuildPomXMLFilterFactory extends BuildPomXMLFilterFactory
+{
+ private MavenSession session;
+
+ @Inject
+ public DefaultBuildPomXMLFilterFactory( MavenSession session )
+ {
+ this.session = session;
+ }
+
+ @Override
+ protected Optional getChangelist()
+ {
+ return Optional.ofNullable( session.getUserProperties().getProperty( "changelist" ) );
+ }
+
+ @Override
+ protected Optional getRevision()
+ {
+ return Optional.ofNullable( session.getUserProperties().getProperty( "revision" ) );
+ }
+
+ @Override
+ protected Optional getSha1()
+ {
+ return Optional.ofNullable( session.getUserProperties().getProperty( "sha1" ) );
+ }
+
+}
diff --git a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
new file mode 100644
index 000000000000..af05bc392344
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
@@ -0,0 +1,37 @@
+package org.apache.maven.xml.internal;
+
+/*
+ * 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.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.xml.filter.ConsumerPomXMLFilterFactory;
+
+/**
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+@Named
+@Singleton
+public class DefaultConsumerPomXMLFilterFactory extends ConsumerPomXMLFilterFactory
+{
+
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
new file mode 100644
index 000000000000..03cad018c9b6
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
@@ -0,0 +1,70 @@
+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.Optional;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Robert Scholte
+ *
+ * @since 3.7.0
+ */
+public abstract class BuildPomXMLFilterFactory
+{
+ public final BuildPomXMLFilter get( String groupId, String artifactId )
+ throws SAXException, ParserConfigurationException
+ {
+ CiFriendlyXMLFilter filter = new CiFriendlyXMLFilter();
+ getChangelist().ifPresent( filter::setChangelist );
+ getRevision().ifPresent( filter::setRevision );
+ getSha1().ifPresent( filter::setSha1 );
+
+ if ( filter.isSet() )
+ {
+ filter.setParent( getParent() );
+ return new BuildPomXMLFilter( filter );
+ }
+ else
+ {
+ return new BuildPomXMLFilter( getParent() );
+ }
+ }
+
+ protected XMLReader getParent() throws SAXException, ParserConfigurationException
+ {
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ xmlReader.setFeature( "http://xml.org/sax/features/namespaces", true );
+ return xmlReader;
+ }
+
+ // For CIFriendly
+ protected abstract Optional getChangelist();
+
+ protected abstract Optional getRevision();
+
+ protected abstract Optional getSha1();
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/CiFriendlyXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/CiFriendlyXMLFilter.java
new file mode 100644
index 000000000000..7f8c206232ed
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/CiFriendlyXMLFilter.java
@@ -0,0 +1,84 @@
+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.function.Function;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ * Resolves all ci-friendly properties occurrences
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+class CiFriendlyXMLFilter
+ extends XMLFilterImpl
+{
+ private Function replaceChain = Function.identity();
+
+ public CiFriendlyXMLFilter setChangelist( String changelist )
+ {
+ replaceChain = replaceChain.andThen( t -> t.replace( "${changelist}", changelist ) );
+ return this;
+ }
+
+ public CiFriendlyXMLFilter setRevision( String revision )
+ {
+ replaceChain = replaceChain.andThen( t -> t.replace( "${revision}", revision ) );
+ return this;
+ }
+
+ public CiFriendlyXMLFilter setSha1( String sha1 )
+ {
+ replaceChain = replaceChain.andThen( t -> t.replace( "${sha1}", sha1 ) );
+ return this;
+ }
+
+ /**
+ * @return {@code true} is any of the ci properties is set, otherwise {@code false}
+ */
+ public boolean isSet()
+ {
+ return !replaceChain.equals( Function.identity() );
+ }
+
+ @Override
+ public void characters( char[] ch, int start, int length )
+ throws SAXException
+ {
+ String text = new String( ch, start, length );
+
+ // assuming this has the best performance
+ if ( text.contains( "${" ) )
+ {
+ String newText = replaceChain.apply( text );
+
+ super.characters( newText.toCharArray(), 0, newText.length() );
+ }
+ else
+ {
+ super.characters( ch, start, length );
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
new file mode 100644
index 000000000000..c185fdfb4186
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
@@ -0,0 +1,65 @@
+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.inject.Inject;
+import javax.inject.Provider;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLFilter;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public abstract class ConsumerPomXMLFilterFactory
+{
+ @Inject
+ private Provider buildPomXMLFilterFactory;
+
+ public ConsumerPomXMLFilterFactory()
+ {
+ }
+
+ // For testing purpose
+ ConsumerPomXMLFilterFactory( Provider buildPomXMLFilterFactory )
+ {
+ this.buildPomXMLFilterFactory = buildPomXMLFilterFactory;
+ }
+
+ public final ConsumerPomXMLFilter get( String groupId, String artifactId )
+ throws SAXException, ParserConfigurationException
+ {
+ XMLFilter parent = buildPomXMLFilterFactory.get().get( groupId, artifactId );
+
+ // Ensure that xs:any elements aren't touched by next filters
+ XMLReader filter = new FastForwardFilter( parent );
+
+ // Strip modules
+ filter = new ModulesXMLFilter( filter );
+ // Adjust relativePath
+ filter = new RelativePathXMLFilter( filter );
+
+ return new ConsumerPomXMLFilter( filter );
+ }
+}
From a6843705d184bcf7267df1e6ae421cb257bd5093 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Mon, 26 Aug 2019 16:35:08 +0200
Subject: [PATCH 13/52] [MNG-6656] Support versionless parent
---
...DefaultRepositorySystemSessionFactory.java | 8 +-
.../DefaultBuildPomXMLFilterFactory.java | 34 +-
.../model/building/DefaultModelBuilder.java | 23 +-
.../building/DefaultModelCacheManager.java | 55 +++
.../model/building/ModelCacheManager.java | 38 +++
.../maven/model/building/ModelData.java | 23 +-
.../validation/DefaultModelValidator.java | 8 +-
.../xml/filter/BuildPomXMLFilterFactory.java | 35 +-
.../filter/ConsumerPomXMLFilterFactory.java | 6 +-
.../maven/xml/filter/ParentXMLFilter.java | 313 ++++++++++++++++++
.../maven/xml/filter/RelativeProject.java | 56 ++++
.../xml/filter/AbstractXMLFilterTests.java | 30 +-
.../xml/filter/ConsumerPomXMLFilterTest.java | 11 +-
.../maven/xml/filter/ParentXMLFilterTest.java | 185 +++++++++++
pom.xml | 27 +-
15 files changed, 795 insertions(+), 57 deletions(-)
create mode 100644 maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
create mode 100644 maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
create mode 100644 maven-xml/src/test/java/org/apache/maven/xml/filter/ParentXMLFilterTest.java
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 20bd44982194..e4f8439012ab 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
@@ -34,6 +34,7 @@
import javax.inject.Inject;
import javax.inject.Named;
+import javax.inject.Provider;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
@@ -114,7 +115,8 @@ public class DefaultRepositorySystemSessionFactory
MavenRepositorySystem mavenRepositorySystem;
@Inject
- private ConsumerPomXMLFilterFactory consumerPomXMLFilterFactory;
+ @Nullable
+ private Provider consumerPomXMLFilterFactory;
public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request )
{
@@ -286,7 +288,6 @@ public Collection getTransformersForArtifact( final Artifact ar
public InputStream transformData( File file )
throws IOException, TransformException
{
- System.out.println( "transforming " + file.getAbsolutePath() );
final PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream );
@@ -294,8 +295,7 @@ public InputStream transformData( File file )
try
{
transformSource =
- new SAXSource( consumerPomXMLFilterFactory.get( artifact.getGroupId(),
- artifact.getArtifactId() ),
+ new SAXSource( consumerPomXMLFilterFactory.get().get( file.toPath() ),
new InputSource( new FileReader( file ) ) );
}
catch ( SAXException | ParserConfigurationException e )
diff --git a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
index 0b51da2a99fa..cdded2bca759 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
@@ -19,16 +19,20 @@
* under the License.
*/
+
+import java.nio.file.Path;
import java.util.Optional;
+import java.util.function.Function;
import javax.inject.Inject;
import javax.inject.Named;
-//import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.building.ModelCacheManager;
import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
-import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
+import org.apache.maven.xml.filter.RelativeProject;
/**
*
@@ -37,11 +41,13 @@
*/
@Named
@Singleton
-@IgnoreJRERequirement( )
public class DefaultBuildPomXMLFilterFactory extends BuildPomXMLFilterFactory
{
private MavenSession session;
+ @Inject
+ private ModelCacheManager rawModelCache;
+
@Inject
public DefaultBuildPomXMLFilterFactory( MavenSession session )
{
@@ -66,4 +72,26 @@ protected Optional getSha1()
return Optional.ofNullable( session.getUserProperties().getProperty( "sha1" ) );
}
+ @Override
+ protected Function> getRelativePathMapper()
+ {
+ return p -> Optional.ofNullable( rawModelCache.get( p ) ).map( m -> toRelativeProject( m ) );
+ }
+
+ private RelativeProject toRelativeProject( final Model m )
+ {
+ String groupId = m.getGroupId();
+ if ( groupId == null && m.getParent() != null )
+ {
+ groupId = m.getParent().getGroupId();
+ }
+
+ String version = m.getVersion();
+ if ( version == null && m.getParent() != null )
+ {
+ version = m.getParent().getVersion();
+ }
+
+ return new RelativeProject( groupId, m.getArtifactId(), version );
+ }
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 1fea6ddd8b70..0b0a615ea8c3 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -51,6 +51,7 @@
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.building.FileSource;
import org.apache.maven.model.Activation;
import org.apache.maven.model.Build;
import org.apache.maven.model.Dependency;
@@ -154,7 +155,12 @@ public class DefaultModelBuilder
private ReportingConverter reportingConverter;
@Inject
+ @Nullable
private Provider buildPomXMLFilterFactory;
+
+ @Inject
+ @Nullable
+ private ModelCacheManager modelCacheManager;
public DefaultModelBuilder setModelProcessor( ModelProcessor modelProcessor )
{
@@ -294,7 +300,11 @@ public ModelBuildingResult build( ModelBuildingRequest request )
{
inputModel = readModel( request.getModelSource(), request.getPomFile(), request, problems );
}
-
+ if ( modelCacheManager != null && request.getPomFile() != null )
+ {
+ modelCacheManager.put( request.getPomFile().toPath(), inputModel );
+ }
+
problems.setRootModel( inputModel );
ModelData resultData = new ModelData( request.getModelSource(), inputModel );
@@ -755,7 +765,7 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
}
// re-read model from file
- if ( Boolean.getBoolean( "maven.experimental.buildconsumer" ) )
+ if ( Boolean.getBoolean( "maven.experimental.buildconsumer" ) && !lineage.get( 0 ).isExternal() )
{
try
{
@@ -791,9 +801,12 @@ private InputStream transformData( ModelData modelData )
final PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream );
+
+ // Should always be FileSource for reactor poms
+ FileSource source = (FileSource) modelData.getSource();
final SAXSource transformSource =
- new SAXSource( buildPomXMLFilterFactory.get().get( modelData.getGroupId(), modelData.getArtifactId() ),
+ new SAXSource( buildPomXMLFilterFactory.get().get( source.getFile().toPath() ),
new org.xml.sax.InputSource( modelData.getSource().getInputStream() ) );
final StreamResult result = new StreamResult( pipedOutputStream );
@@ -1103,6 +1116,8 @@ private ModelData readParentLocally( Model childModel, ModelSource childSource,
*/
ModelData parentData = new ModelData( candidateSource, candidateModel, groupId, artifactId, version );
+
+ parentData.setExternal( false );
return parentData;
}
@@ -1220,6 +1235,8 @@ public int getValidationLevel()
ModelData parentData = new ModelData( modelSource, parentModel, parent.getGroupId(), parent.getArtifactId(),
parent.getVersion() );
+ parentData.setExternal( true );
+
return parentData;
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
new file mode 100644
index 000000000000..9a87805c158b
--- /dev/null
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
@@ -0,0 +1,55 @@
+package org.apache.maven.model.building;
+
+/*
+ * 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.nio.file.Path;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.model.Model;
+
+/**
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+@Named
+@Singleton
+public class DefaultModelCacheManager implements ModelCacheManager
+{
+ private static final Map RAWMODELCACHE = Collections.synchronizedMap( new HashMap() );
+
+ @Override
+ public void put( Path p, Model t )
+ {
+ RAWMODELCACHE.put( p, t );
+ }
+
+ @Override
+ public Model get( Path p )
+ {
+ return RAWMODELCACHE.get( p );
+ }
+
+}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
new file mode 100644
index 000000000000..6619607d3be3
--- /dev/null
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
@@ -0,0 +1,38 @@
+package org.apache.maven.model.building;
+
+/*
+ * 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.nio.file.Path;
+
+import org.apache.maven.model.Model;
+
+/**
+ * Registers models for usage later on
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public interface ModelCacheManager
+{
+ void put( Path p, Model t );
+
+ Model get( Path p );
+
+}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java
index 1f39ad443b80..2d093c6ba31e 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java
@@ -45,6 +45,8 @@ class ModelData
private String artifactId;
private String version;
+
+ private boolean external = true;
/**
* Creates a new container for the specified model.
@@ -199,6 +201,25 @@ public void setVersion( String version )
this.version = version;
}
+ /**
+ *
+ * @return {@code false} if model is part of reactor, otherwise {@code true}
+ */
+ public boolean isExternal()
+ {
+ return external;
+ }
+
+ /**
+ * Set to {@code false} if model is part of reactor, otherwise {@code true}
+ *
+ * @param external
+ */
+ public void setExternal( boolean external )
+ {
+ this.external = external;
+ }
+
/**
* Gets the effective identifier of the model in the form {@code ::}.
*
@@ -212,7 +233,7 @@ public String getId()
return buffer.toString();
}
-
+
@Override
public String toString()
{
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
index cfa6e20f6cdc..15a55878bdc8 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
@@ -98,8 +98,12 @@ public void validateRawModel( Model m, ModelBuildingRequest request, ModelProble
validateStringNotEmpty( "parent.artifactId", problems, Severity.FATAL, Version.BASE, parent.getArtifactId(),
parent );
- validateStringNotEmpty( "parent.version", problems, Severity.FATAL, Version.BASE, parent.getVersion(),
- parent );
+ // resolvedModel will assign version based on relativePath
+ if ( !Boolean.getBoolean( "maven.experimental.buildconsumer" ) )
+ {
+ validateStringNotEmpty( "parent.version", problems, Severity.FATAL, Version.BASE, parent.getVersion(),
+ parent );
+ }
if ( equals( parent.getGroupId(), m.getGroupId() ) && equals( parent.getArtifactId(), m.getArtifactId() ) )
{
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
index 03cad018c9b6..7a3f52ac0909 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
@@ -19,7 +19,9 @@
* under the License.
*/
+import java.nio.file.Path;
import java.util.Optional;
+import java.util.function.Function;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
@@ -35,23 +37,31 @@
*/
public abstract class BuildPomXMLFilterFactory
{
- public final BuildPomXMLFilter get( String groupId, String artifactId )
+ public final BuildPomXMLFilter get( Path projectFile )
throws SAXException, ParserConfigurationException
{
- CiFriendlyXMLFilter filter = new CiFriendlyXMLFilter();
- getChangelist().ifPresent( filter::setChangelist );
- getRevision().ifPresent( filter::setRevision );
- getSha1().ifPresent( filter::setSha1 );
+ XMLReader parent = getParent();
- if ( filter.isSet() )
+ if ( getRelativePathMapper() != null )
{
- filter.setParent( getParent() );
- return new BuildPomXMLFilter( filter );
+ ParentXMLFilter parentFilter = new ParentXMLFilter( getRelativePathMapper() );
+ parentFilter.setProjectPath( projectFile.getParent() );
+ parentFilter.setParent( parent );
+ parent = parentFilter;
}
- else
+
+ CiFriendlyXMLFilter ciFriendlyFilter = new CiFriendlyXMLFilter();
+ getChangelist().ifPresent( ciFriendlyFilter::setChangelist );
+ getRevision().ifPresent( ciFriendlyFilter::setRevision );
+ getSha1().ifPresent( ciFriendlyFilter::setSha1 );
+
+ if ( ciFriendlyFilter.isSet() )
{
- return new BuildPomXMLFilter( getParent() );
+ ciFriendlyFilter.setParent( parent );
+ parent = ciFriendlyFilter;
}
+
+ return new BuildPomXMLFilter( parent );
}
protected XMLReader getParent() throws SAXException, ParserConfigurationException
@@ -67,4 +77,9 @@ protected XMLReader getParent() throws SAXException, ParserConfigurationExceptio
protected abstract Optional getRevision();
protected abstract Optional getSha1();
+
+ /**
+ * @return the mapper or {@code null} if relativePaths don't need to be mapped
+ */
+ protected abstract Function> getRelativePathMapper();
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
index c185fdfb4186..dfea9ba06aa5 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
@@ -19,6 +19,8 @@
* under the License.
*/
+import java.nio.file.Path;
+
import javax.inject.Inject;
import javax.inject.Provider;
import javax.xml.parsers.ParserConfigurationException;
@@ -47,10 +49,10 @@ public ConsumerPomXMLFilterFactory()
this.buildPomXMLFilterFactory = buildPomXMLFilterFactory;
}
- public final ConsumerPomXMLFilter get( String groupId, String artifactId )
+ public final ConsumerPomXMLFilter get( Path projectPath )
throws SAXException, ParserConfigurationException
{
- XMLFilter parent = buildPomXMLFilterFactory.get().get( groupId, artifactId );
+ XMLFilter parent = buildPomXMLFilterFactory.get().get( projectPath );
// Ensure that xs:any elements aren't touched by next filters
XMLReader filter = new FastForwardFilter( parent );
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
new file mode 100644
index 000000000000..244ecc576f1e
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
@@ -0,0 +1,313 @@
+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.nio.file.Path;
+import java.nio.file.Paths;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Function;
+
+import org.apache.maven.xml.SAXEvent;
+import org.apache.maven.xml.SAXEventFactory;
+import org.apache.maven.xml.SAXEventUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ *
+ * Transforms relativePath to version.
+ * We could decide to simply allow {@code }, but let's require the GA for now for checking
+ *
+ *
+ * @author Robert Scholte
+ */
+class ParentXMLFilter
+ extends XMLFilterImpl
+{
+ private boolean parsingParent = false;
+
+ // states
+ private String state;
+
+ private String groupId;
+
+ private String artifactId;
+
+ private String relativePath;
+
+ private boolean hasVersion;
+
+ private Optional resolvedParent;
+
+ private char[] linebreak;
+
+ private List saxEvents = new ArrayList<>();
+
+ private SAXEventFactory eventFactory;
+
+ private final Function> relativePathMapper;
+
+ private Path projectPath;
+
+ /**
+ *
+ *
+ * @param relativePathMapper
+ */
+ ParentXMLFilter( Function> relativePathMapper )
+ {
+ this.relativePathMapper = relativePathMapper;
+ }
+
+ public void setProjectPath( Path projectPath )
+ {
+ this.projectPath = projectPath;
+ }
+
+ private SAXEventFactory getEventFactory()
+ {
+ if ( eventFactory == null )
+ {
+ eventFactory = SAXEventFactory.newInstance( getContentHandler() );
+ }
+ return eventFactory;
+ }
+
+ private void processEvent( final SAXEvent event )
+ throws SAXException
+ {
+ if ( parsingParent )
+ {
+ final String eventState = state;
+
+ saxEvents.add( () ->
+ {
+ if ( !( "relativePath".equals( eventState ) && resolvedParent.isPresent() ) )
+ {
+ event.execute();
+ }
+ } );
+ }
+ else
+ {
+ event.execute();
+ }
+ }
+
+ @Override
+ public void startElement( String uri, final String localName, String qName, Attributes atts )
+ throws SAXException
+ {
+ if ( !parsingParent && "parent".equals( localName ) )
+ {
+ parsingParent = true;
+ }
+
+ if ( parsingParent )
+ {
+ state = localName;
+
+ hasVersion |= "version".equals( localName );
+ }
+
+ processEvent( getEventFactory().startElement( uri, localName, qName, atts ) );
+ }
+
+ @Override
+ public void characters( char[] ch, int start, int length )
+ throws SAXException
+ {
+ if ( parsingParent )
+ {
+ final String eventState = state;
+
+ switch ( eventState )
+ {
+ case "parent":
+ int l;
+ for ( l = length ; l >= 0; l-- )
+ {
+ int i = start + l - 1;
+ if ( ch[i] == '\n' || ch[i] == '\r' )
+ {
+ break;
+ }
+ }
+
+ linebreak = new char[l];
+ System.arraycopy( ch, start, linebreak, 0, l );
+ break;
+ case "relativePath":
+ relativePath = new String( ch, start, length );
+ break;
+ case "groupId":
+ groupId = new String( ch, start, length );
+ break;
+ case "artifactId":
+ artifactId = new String( ch, start, length );
+ break;
+ default:
+ break;
+ }
+ }
+
+ processEvent( getEventFactory().characters( ch, start, length ) );
+ }
+
+ @Override
+ public void endDocument()
+ throws SAXException
+ {
+ processEvent( getEventFactory().endDocument() );
+ }
+
+ @Override
+ public void endElement( String uri, final String localName, String qName )
+ throws SAXException
+ {
+ if ( parsingParent )
+ {
+ switch ( localName )
+ {
+ case "parent":
+ if ( !hasVersion || relativePath != null )
+ {
+ resolvedParent =
+ resolveRelativePath( Paths.get( Objects.toString( relativePath, "../pom.xml" ) ) );
+ }
+
+ // not with streams due to checked SAXException
+ for ( SAXEvent saxEvent : saxEvents )
+ {
+ saxEvent.execute();
+ }
+
+ if ( !hasVersion && resolvedParent.isPresent() )
+ {
+ String versionQName = SAXEventUtils.renameQName( qName, "version" );
+
+ getEventFactory().startElement( uri, "version", versionQName, null ).execute();
+
+ String resolvedParentVersion = resolvedParent.get().getVersion();
+
+ getEventFactory().characters( resolvedParentVersion.toCharArray(), 0,
+ resolvedParentVersion.length() ).execute();
+
+ getEventFactory().endElement( uri, "version", versionQName ).execute();
+
+ if ( linebreak != null )
+ {
+ getEventFactory().characters( linebreak, 0, linebreak.length ).execute();
+ }
+ }
+
+ parsingParent = false;
+ break;
+ default:
+ break;
+ }
+ }
+
+ processEvent( getEventFactory().endElement( uri, localName, qName ) );
+
+ // for this simple structure resetting to parent it sufficient
+ state = "parent";
+ }
+
+ @Override
+ public void endPrefixMapping( String prefix )
+ throws SAXException
+ {
+ processEvent( getEventFactory().endPrefixMapping( prefix ) );
+ }
+
+ @Override
+ public void ignorableWhitespace( char[] ch, int start, int length )
+ throws SAXException
+ {
+ processEvent( getEventFactory().ignorableWhitespace( ch, start, length ) );
+ }
+
+ @Override
+ public void processingInstruction( String target, String data )
+ throws SAXException
+ {
+ processEvent( getEventFactory().processingInstruction( target, data ) );
+
+ }
+
+ @Override
+ public void setDocumentLocator( Locator locator )
+ {
+ try
+ {
+ processEvent( getEventFactory().setDocumentLocator( locator ) );
+ }
+ catch ( SAXException e )
+ {
+ // noop
+ }
+ }
+
+ @Override
+ public void skippedEntity( String name )
+ throws SAXException
+ {
+ processEvent( getEventFactory().skippedEntity( name ) );
+ }
+
+ @Override
+ public void startDocument()
+ throws SAXException
+ {
+ processEvent( getEventFactory().startDocument() );
+ }
+
+ @Override
+ public void startPrefixMapping( String prefix, String uri )
+ throws SAXException
+ {
+ processEvent( getEventFactory().startPrefixMapping( prefix, uri ) );
+ }
+
+ protected Optional resolveRelativePath( Path relativePath )
+ {
+ Optional mappedProject =
+ relativePathMapper.apply( projectPath.resolve( relativePath ).normalize() );
+
+ if ( mappedProject.isPresent() )
+ {
+ RelativeProject project = mappedProject.get();
+
+ if ( Objects.equals( groupId, project.getGroupId() )
+ && Objects.equals( artifactId, project.getArtifactId() ) )
+ {
+ return mappedProject;
+ }
+ }
+ return Optional.empty();
+ }
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
new file mode 100644
index 000000000000..bbceff36597d
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
@@ -0,0 +1,56 @@
+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.
+ */
+
+/**
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public class RelativeProject
+{
+ private String groupId;
+
+ private String artifactId;
+
+ private String version;
+
+ public RelativeProject( String groupId, String artifactId, String version )
+ {
+ this.groupId = groupId;
+ this.artifactId = artifactId;
+ this.version = version;
+ }
+
+ public String getGroupId()
+ {
+ return groupId;
+ }
+
+ public String getArtifactId()
+ {
+ return artifactId;
+ }
+
+ public String getVersion()
+ {
+ return version;
+ }
+}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
index 4ee0e313690c..e406f6c9e544 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
@@ -46,22 +46,38 @@ public AbstractXMLFilterTests()
protected abstract XMLFilter getFilter() throws TransformerException, SAXException, ParserConfigurationException;
+ private void setParent( XMLFilter filter ) throws SAXException, ParserConfigurationException
+ {
+ if( filter.getParent() == null )
+ {
+ filter.setParent( SAXParserFactory.newInstance().newSAXParser().getXMLReader() );
+ filter.setFeature( "http://xml.org/sax/features/namespaces", true );
+ }
+ }
protected String transform( String input )
throws TransformerException, SAXException, ParserConfigurationException
{
return transform( new StringReader( input ) );
}
+
+ protected String transform( Reader input ) throws TransformerException, SAXException, ParserConfigurationException
+ {
+ XMLFilter filter = getFilter();
+ setParent( filter );
+ return transform( input, filter );
+ }
- protected String transform( Reader input )
+ protected String transform( String input, XMLFilter filter )
+ throws TransformerException, SAXException, ParserConfigurationException
+ {
+ setParent( filter );
+ return transform( new StringReader( input ), filter );
+ }
+
+ protected String transform( Reader input, XMLFilter filter )
throws TransformerException, SAXException, ParserConfigurationException
{
- XMLFilter filter = getFilter();
- if( filter.getParent() == null )
- {
- filter.setParent( SAXParserFactory.newInstance().newSAXParser().getXMLReader() );
- filter.setFeature( "http://xml.org/sax/features/namespaces", true );
- }
Writer writer = new StringWriter();
StreamResult result = new StreamResult( writer );
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
index 8fe2d67e4b56..b02589e72285 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
@@ -21,7 +21,10 @@
import static org.xmlunit.assertj.XmlAssert.assertThat;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Optional;
+import java.util.function.Function;
import javax.inject.Provider;
import javax.xml.parsers.ParserConfigurationException;
@@ -54,6 +57,12 @@ protected Optional getChangelist()
{
return Optional.of( "CL" );
}
+
+ @Override
+ protected Function> getRelativePathMapper()
+ {
+ return null;
+ }
};
Provider provider = new Provider()
@@ -68,7 +77,7 @@ public BuildPomXMLFilterFactory get()
XMLFilter filter = new ConsumerPomXMLFilterFactory( provider )
{
- }.get( "G", "A" );
+ }.get( Paths.get( "pom.xml" ) );
filter.setFeature( "http://xml.org/sax/features/namespaces", true );
return filter;
}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ParentXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ParentXMLFilterTest.java
new file mode 100644
index 000000000000..aa70b0db9a97
--- /dev/null
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/ParentXMLFilterTest.java
@@ -0,0 +1,185 @@
+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.junit.Assert.assertEquals;
+
+import java.nio.file.Paths;
+import java.util.Optional;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import org.junit.Test;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLFilter;
+
+public class ParentXMLFilterTest extends AbstractXMLFilterTests
+{
+ @Override
+ protected XMLFilter getFilter()
+ 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() );
+
+ return filter;
+ }
+
+ @Test
+ public void testMinimum() throws Exception
+ {
+ String input = "";
+ String expected = input;
+ String actual = transform( input );
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testNoRelativePath() throws Exception
+ {
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "VERSION"
+ + "";
+ String expected = input;
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testDefaultRelativePath() throws Exception
+ {
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "";
+ String expected = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "1.0.0"
+ + "";
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testNoVersion() throws Exception
+ {
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "RELATIVEPATH"
+ + "";
+ String expected = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "1.0.0"
+ + "";
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testInvalidRelativePath() throws Exception
+ {
+ ParentXMLFilter filter = new ParentXMLFilter( x -> Optional.ofNullable( null ) );
+ filter.setProjectPath( Paths.get( "pom.xml").toAbsolutePath() );
+
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "RELATIVEPATH"
+ + "";
+ String expected = input;
+
+ String actual = transform( input, filter );
+
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testRelativePathAndVersion() throws Exception
+ {
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "RELATIVEPATH"
+ + "1.0.0"
+ + "";
+ String expected = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "1.0.0"
+ + "";
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testWithWeirdNamespace() throws Exception
+ {
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "RELATIVEPATH"
+ + "";
+ String expected = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "1.0.0"
+ + "";
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+
+
+ @Test
+ public void testIndent() throws Exception
+ {
+ String input = "\n"
+ + " GROUPID\n"
+ + " ARTIFACTID\n"
+ + " ";
+ // transformer is responsible for line separator and indents
+ String expected = "" + System.lineSeparator()
+ + " GROUPID" + System.lineSeparator()
+ + " ARTIFACTID" + System.lineSeparator()
+ + " 1.0.0" + System.lineSeparator()
+ + "";
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+}
diff --git a/pom.xml b/pom.xml
index bed263330fd6..5c23389235e5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,8 +47,8 @@ under the License.
3.0.5
- 1.7
- 1.7
+ 1.8
+ 1.82.6.01.43.8.1
@@ -454,27 +454,6 @@ under the License.
-
- org.apache.maven.plugins
- maven-enforcer-plugin
-
-
- enforce-bytecode-version
-
- enforce
-
-
-
-
-
- org.apache.maven:maven-xml
-
-
-
-
-
-
- org.codehaus.plexusplexus-component-metadata
@@ -604,7 +583,7 @@ under the License.
org.codehaus.mojo.signature
- java17
+ java181.0
From 712b95fe7d317e6714e5d82e0a7dfd4f39a6e9ae Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Thu, 29 Aug 2019 18:44:31 +0200
Subject: [PATCH 14/52] [MNG-6656] Support reactor managed versions
---
.../maven/project/DefaultProjectBuilder.java | 2 +
.../DefaultBuildPomXMLFilterFactory.java | 20 +++
.../model/building/DefaultModelBuilder.java | 17 +--
.../building/DefaultModelBuildingRequest.java | 16 ++
.../building/DefaultModelCacheManager.java | 27 +++-
.../building/FilterModelBuildingRequest.java | 12 ++
.../model/building/ModelBuildingRequest.java | 5 +-
.../model/building/ModelCacheManager.java | 3 +
.../maven/model/building/ModelData.java | 21 ---
.../xml/filter/BuildPomXMLFilterFactory.java | 14 +-
.../maven/xml/filter/DependencyKey.java | 88 +++++++++++
.../maven/xml/filter/ParentXMLFilter.java | 2 +-
.../filter/ReactorDependencyXMLFilter.java | 140 ++++++++++++++++++
.../maven/xml/filter/RelativeProject.java | 6 +-
.../xml/filter/ConsumerPomXMLFilterTest.java | 6 +
.../ReactorDependencyXMLFilterTest.java | 89 +++++++++++
16 files changed, 427 insertions(+), 41 deletions(-)
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
create mode 100644 maven-xml/src/test/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilterTest.java
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 7e18f1ef3ce2..c3a0a8f9f549 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
@@ -164,6 +164,7 @@ private ProjectBuildingResult build( File pomFile, ModelSource modelSource, Inte
request.setModelBuildingListener( listener );
request.setPomFile( pomFile );
+ request.setTransformPom( true );
request.setModelSource( modelSource );
request.setLocationTracking( true );
@@ -437,6 +438,7 @@ private boolean build( List results, List
request.setPomFile( pomFile );
request.setTwoPhaseBuilding( true );
request.setLocationTracking( true );
+ request.setTransformPom( true );
DefaultModelBuildingListener listener =
new DefaultModelBuildingListener( project, projectBuildingHelper, config.request );
diff --git a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
index cdded2bca759..e1b5ab500535 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
@@ -32,6 +32,7 @@
import org.apache.maven.model.Model;
import org.apache.maven.model.building.ModelCacheManager;
import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
+import org.apache.maven.xml.filter.DependencyKey;
import org.apache.maven.xml.filter.RelativeProject;
/**
@@ -77,6 +78,14 @@ protected Function> getRelativePathMapper()
{
return p -> Optional.ofNullable( rawModelCache.get( p ) ).map( m -> toRelativeProject( m ) );
}
+
+ @Override
+ protected Function getDependencyKeyToVersionMapper()
+ {
+ return k -> Optional.ofNullable( rawModelCache.get( k ) )
+ .map( m -> toVersion( m ) )
+ .orElse( null );
+ }
private RelativeProject toRelativeProject( final Model m )
{
@@ -94,4 +103,15 @@ private RelativeProject toRelativeProject( final Model m )
return new RelativeProject( groupId, m.getArtifactId(), version );
}
+
+ private String toVersion( final Model m )
+ {
+ String version = m.getVersion();
+ if ( version == null && m.getParent() != null )
+ {
+ version = m.getParent().getVersion();
+ }
+
+ return version;
+ }
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 0b0a615ea8c3..d60e68dda02b 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -300,10 +300,6 @@ public ModelBuildingResult build( ModelBuildingRequest request )
{
inputModel = readModel( request.getModelSource(), request.getPomFile(), request, problems );
}
- if ( modelCacheManager != null && request.getPomFile() != null )
- {
- modelCacheManager.put( request.getPomFile().toPath(), inputModel );
- }
problems.setRootModel( inputModel );
@@ -439,6 +435,11 @@ else if ( !parentIds.add( parentData.getId() ) )
resultData.setVersion( resultModel.getVersion() );
result.setEffectiveModel( resultModel );
+
+ if ( modelCacheManager != null && request.getPomFile() != null )
+ {
+ modelCacheManager.put( request.getPomFile().toPath(), resultModel );
+ }
for ( ModelData currentData : lineage )
{
@@ -765,7 +766,7 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
}
// re-read model from file
- if ( Boolean.getBoolean( "maven.experimental.buildconsumer" ) && !lineage.get( 0 ).isExternal() )
+ if ( Boolean.getBoolean( "maven.experimental.buildconsumer" ) && request.isTransformPom() )
{
try
{
@@ -805,6 +806,8 @@ private InputStream transformData( ModelData modelData )
// Should always be FileSource for reactor poms
FileSource source = (FileSource) modelData.getSource();
+ System.out.println( "transforming " + source.getFile() );
+
final SAXSource transformSource =
new SAXSource( buildPomXMLFilterFactory.get().get( source.getFile().toPath() ),
new org.xml.sax.InputSource( modelData.getSource().getInputStream() ) );
@@ -1116,8 +1119,6 @@ private ModelData readParentLocally( Model childModel, ModelSource childSource,
*/
ModelData parentData = new ModelData( candidateSource, candidateModel, groupId, artifactId, version );
-
- parentData.setExternal( false );
return parentData;
}
@@ -1235,8 +1236,6 @@ public int getValidationLevel()
ModelData parentData = new ModelData( modelSource, parentModel, parent.getGroupId(), parent.getArtifactId(),
parent.getVersion() );
- parentData.setExternal( true );
-
return parentData;
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
index 84a68f74c8fb..06128a8ec64c 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
@@ -72,6 +72,8 @@ public class DefaultModelBuildingRequest
private ModelCache modelCache;
private WorkspaceModelResolver workspaceResolver;
+
+ private boolean transformPom;
/**
* Creates an empty request.
@@ -101,6 +103,7 @@ public DefaultModelBuildingRequest( ModelBuildingRequest request )
setModelResolver( request.getModelResolver() );
setModelBuildingListener( request.getModelBuildingListener() );
setModelCache( request.getModelCache() );
+ setTransformPom( request.isTransformPom() );
}
@Override
@@ -407,5 +410,18 @@ public ModelBuildingRequest setWorkspaceModelResolver( WorkspaceModelResolver wo
this.workspaceResolver = workspaceResolver;
return this;
}
+
+ @Override
+ public boolean isTransformPom()
+ {
+ return transformPom;
+ }
+
+ @Override
+ public ModelBuildingRequest setTransformPom( boolean transformPom )
+ {
+ this.transformPom = transformPom;
+ return this;
+ }
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
index 9a87805c158b..f33d71388e4e 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
@@ -28,6 +28,7 @@
import javax.inject.Singleton;
import org.apache.maven.model.Model;
+import org.apache.maven.xml.filter.DependencyKey;
/**
*
@@ -38,18 +39,36 @@
@Singleton
public class DefaultModelCacheManager implements ModelCacheManager
{
- private static final Map RAWMODELCACHE = Collections.synchronizedMap( new HashMap() );
+ private static final Map MODELCACHE = Collections.synchronizedMap( new HashMap() );
+
+ private static final Map DEPKEYMODELCACHE =
+ Collections.synchronizedMap( new HashMap() );
@Override
- public void put( Path p, Model t )
+ public void put( Path p, Model m )
{
- RAWMODELCACHE.put( p, t );
+ MODELCACHE.put( p, m );
+
+ String groupId = m.getGroupId();
+ if ( groupId == null && m.getParent() != null )
+ {
+ groupId = m.getParent().getGroupId();
+ }
+
+ String artifactId = m.getArtifactId();
+ DEPKEYMODELCACHE.put( new DependencyKey( groupId, artifactId ), m );
}
@Override
public Model get( Path p )
{
- return RAWMODELCACHE.get( p );
+ return MODELCACHE.get( p );
+ }
+
+ @Override
+ public Model get( DependencyKey k )
+ {
+ return DEPKEYMODELCACHE.get( k );
}
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
index a51126f280ae..a9012a176030 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
@@ -282,4 +282,16 @@ public ModelBuildingRequest setWorkspaceModelResolver( WorkspaceModelResolver wo
return this;
}
+ @Override
+ public boolean isTransformPom()
+ {
+ return request.isTransformPom();
+ }
+
+ @Override
+ public ModelBuildingRequest setTransformPom( boolean transform )
+ {
+ request.setTransformPom( transform );
+ return this;
+ }
}
\ No newline at end of file
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
index dce0c321d0c3..10aedc103e65 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
@@ -334,5 +334,8 @@ public interface ModelBuildingRequest
WorkspaceModelResolver getWorkspaceModelResolver();
ModelBuildingRequest setWorkspaceModelResolver( WorkspaceModelResolver workspaceResolver );
-
+
+ boolean isTransformPom();
+
+ ModelBuildingRequest setTransformPom( boolean transform );
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
index 6619607d3be3..f28116fbfd4f 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
@@ -22,6 +22,7 @@
import java.nio.file.Path;
import org.apache.maven.model.Model;
+import org.apache.maven.xml.filter.DependencyKey;
/**
* Registers models for usage later on
@@ -34,5 +35,7 @@ public interface ModelCacheManager
void put( Path p, Model t );
Model get( Path p );
+
+ Model get( DependencyKey k );
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java
index 2d093c6ba31e..5117602ca071 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java
@@ -46,8 +46,6 @@ class ModelData
private String version;
- private boolean external = true;
-
/**
* Creates a new container for the specified model.
*
@@ -201,25 +199,6 @@ public void setVersion( String version )
this.version = version;
}
- /**
- *
- * @return {@code false} if model is part of reactor, otherwise {@code true}
- */
- public boolean isExternal()
- {
- return external;
- }
-
- /**
- * Set to {@code false} if model is part of reactor, otherwise {@code true}
- *
- * @param external
- */
- public void setExternal( boolean external )
- {
- this.external = external;
- }
-
/**
* Gets the effective identifier of the model in the form {@code ::}.
*
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
index 7a3f52ac0909..83eafe60e287 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
@@ -41,7 +41,15 @@ public final BuildPomXMLFilter get( Path projectFile )
throws SAXException, ParserConfigurationException
{
XMLReader parent = getParent();
-
+
+ if ( getDependencyKeyToVersionMapper() != null )
+ {
+ ReactorDependencyXMLFilter reactorDependencyXMLFilter =
+ new ReactorDependencyXMLFilter( getDependencyKeyToVersionMapper() );
+ reactorDependencyXMLFilter.setParent( parent );
+ parent = reactorDependencyXMLFilter;
+ }
+
if ( getRelativePathMapper() != null )
{
ParentXMLFilter parentFilter = new ParentXMLFilter( getRelativePathMapper() );
@@ -60,7 +68,7 @@ public final BuildPomXMLFilter get( Path projectFile )
ciFriendlyFilter.setParent( parent );
parent = ciFriendlyFilter;
}
-
+
return new BuildPomXMLFilter( parent );
}
@@ -82,4 +90,6 @@ protected XMLReader getParent() throws SAXException, ParserConfigurationExceptio
* @return the mapper or {@code null} if relativePaths don't need to be mapped
*/
protected abstract Function> getRelativePathMapper();
+
+ protected abstract Function getDependencyKeyToVersionMapper();
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
new file mode 100644
index 000000000000..bf91cf97255e
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
@@ -0,0 +1,88 @@
+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.Objects;
+
+/**
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public class DependencyKey
+{
+ private final String groupId;
+
+ private final String artifactId;
+
+ public DependencyKey( String groupId, String artifactId )
+ {
+ this.groupId = groupId;
+ this.artifactId = artifactId;
+ }
+
+ public String getGroupId()
+ {
+ return groupId;
+ }
+
+ public String getArtifactId()
+ {
+ return artifactId;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return Objects.hash( artifactId, groupId );
+ }
+
+ @Override
+ public boolean equals( Object obj )
+ {
+ if ( this == obj )
+ {
+ return true;
+ }
+ if ( obj == null )
+ {
+ return false;
+ }
+ if ( getClass() != obj.getClass() )
+ {
+ return false;
+ }
+
+ DependencyKey other = (DependencyKey) obj;
+
+ if ( !Objects.equals( artifactId, other.artifactId ) )
+ {
+ return false;
+ }
+ if ( !Objects.equals( groupId, other.groupId ) )
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
index 244ecc576f1e..747a28300350 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
@@ -47,7 +47,7 @@
class ParentXMLFilter
extends XMLFilterImpl
{
- private boolean parsingParent = false;
+ private boolean parsingParent;
// states
private String state;
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
new file mode 100644
index 000000000000..a568df57cea1
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
@@ -0,0 +1,140 @@
+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.function.Function;
+
+import org.apache.maven.xml.SAXEventUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ * Will apply the version if the dependency is part of the reactor
+ *
+ * @author Robert Scholte
+ * @since 4.0.0
+ */
+public class ReactorDependencyXMLFilter extends XMLFilterImpl
+{
+ private boolean parsingDependency;
+
+ // states
+ private String state;
+
+ private boolean hasVersion;
+
+ private String groupId;
+
+ private String artifactId;
+
+ private final Function reactorVersionMapper;
+
+ public ReactorDependencyXMLFilter( Function reactorVersionMapper )
+ {
+ this.reactorVersionMapper = reactorVersionMapper;
+ }
+
+ @Override
+ public void startElement( String uri, String localName, String qName, Attributes atts )
+ throws SAXException
+ {
+ if ( !parsingDependency && "dependency".equals( localName ) )
+ {
+ parsingDependency = true;
+ }
+
+ if ( parsingDependency )
+ {
+ state = localName;
+
+ hasVersion |= "version".equals( localName );
+ }
+ super.startElement( uri, localName, qName, atts );
+ }
+
+ @Override
+ public void characters( char[] ch, int start, int length )
+ throws SAXException
+ {
+ if ( parsingDependency )
+ {
+ final String eventState = state;
+ switch ( eventState )
+ {
+ case "groupId":
+ groupId = new String( ch, start, length );
+ break;
+ case "artifactId":
+ artifactId = new String( ch, start, length );
+ break;
+ default:
+ break;
+ }
+ }
+ super.characters( ch, start, length );
+ }
+
+ @Override
+ public void endElement( String uri, final String localName, String qName )
+ throws SAXException
+ {
+ if ( parsingDependency )
+ {
+ switch ( localName )
+ {
+ case "dependency":
+ if ( !hasVersion )
+ {
+ String version = getVersion();
+
+ // dependency is not part of reactor, probably it is managed
+ if ( version != null )
+ {
+ String versionQName = SAXEventUtils.renameQName( qName, "version" );
+ super.startElement( uri, "version", versionQName, null );
+ super.characters( version.toCharArray(), 0, version.length() );
+ super.endElement( uri, "version", versionQName );
+ }
+ }
+ parsingDependency = false;
+
+ // reset
+ hasVersion = false;
+ groupId = null;
+ artifactId = null;
+
+ break;
+ default:
+ break;
+ }
+ }
+
+ super.endElement( uri, localName, qName );
+
+ state = "dependency";
+ }
+
+ private String getVersion()
+ {
+ return reactorVersionMapper.apply( new DependencyKey( groupId, artifactId ) );
+ }
+
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
index bbceff36597d..a158d38ee215 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
@@ -26,11 +26,11 @@
*/
public class RelativeProject
{
- private String groupId;
+ private final String groupId;
- private String artifactId;
+ private final String artifactId;
- private String version;
+ private final String version;
public RelativeProject( String groupId, String artifactId, String version )
{
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
index b02589e72285..5484ea6daaf2 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
@@ -63,6 +63,12 @@ protected Function> getRelativePathMapper()
{
return null;
}
+
+ @Override
+ protected Function getDependencyKeyToVersionMapper()
+ {
+ return null;
+ }
};
Provider provider = new Provider()
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilterTest.java
new file mode 100644
index 000000000000..6a5998ed7ac6
--- /dev/null
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilterTest.java
@@ -0,0 +1,89 @@
+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.junit.Assert.*;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import org.junit.Test;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLFilter;
+
+public class ReactorDependencyXMLFilterTest extends AbstractXMLFilterTests
+{
+ @Override
+ protected XMLFilter getFilter()
+ throws TransformerException, SAXException, ParserConfigurationException
+ {
+ return new ReactorDependencyXMLFilter( r -> "1.0.0" );
+ }
+
+ @Test
+ public void testDefaultDependency() throws Exception
+ {
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "VERSION"
+ + "";
+ String expected = input;
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testManagedDependency() throws Exception
+ {
+ XMLFilter filter = new ReactorDependencyXMLFilter( r -> null );
+
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "";
+ String expected = input;
+
+ String actual = transform( input, filter );
+
+ assertEquals( expected, actual );
+ }
+
+ @Test
+ public void testReactorDependency() throws Exception
+ {
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "";
+ String expected = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + "1.0.0"
+ + "";
+
+ String actual = transform( input );
+
+ assertEquals( expected, actual );
+ }
+
+}
From b46a4c727026191977bea62f968a5b044f003cbc Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Tue, 10 Sep 2019 21:57:06 +0200
Subject: [PATCH 15/52] [MNG-6656] Update project versions
---
apache-maven/pom.xml | 2 +-
maven-artifact/pom.xml | 2 +-
maven-builder-support/pom.xml | 2 +-
maven-compat/pom.xml | 2 +-
maven-core/pom.xml | 2 +-
maven-embedder/pom.xml | 2 +-
maven-model-builder/pom.xml | 2 +-
maven-model/pom.xml | 2 +-
maven-plugin-api/pom.xml | 2 +-
maven-repository-metadata/pom.xml | 2 +-
maven-resolver-provider/pom.xml | 2 +-
maven-settings-builder/pom.xml | 2 +-
maven-settings/pom.xml | 2 +-
maven-slf4j-provider/pom.xml | 2 +-
maven-xml/pom.xml | 2 +-
pom.xml | 2 +-
16 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/apache-maven/pom.xml b/apache-maven/pom.xml
index edbec830a36f..f57506afa0ea 100644
--- a/apache-maven/pom.xml
+++ b/apache-maven/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTapache-maven
diff --git a/maven-artifact/pom.xml b/maven-artifact/pom.xml
index 834905ffd850..f9d78c862bfd 100644
--- a/maven-artifact/pom.xml
+++ b/maven-artifact/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-artifact
diff --git a/maven-builder-support/pom.xml b/maven-builder-support/pom.xml
index de4b9dbb6711..3a24e3d950d7 100644
--- a/maven-builder-support/pom.xml
+++ b/maven-builder-support/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-builder-support
diff --git a/maven-compat/pom.xml b/maven-compat/pom.xml
index 24bfbf1d4cff..058eeec7c0ab 100644
--- a/maven-compat/pom.xml
+++ b/maven-compat/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-compat
diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index 7c9d48374208..c814a959d448 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-core
diff --git a/maven-embedder/pom.xml b/maven-embedder/pom.xml
index 9c00974dc35a..e308277e9583 100644
--- a/maven-embedder/pom.xml
+++ b/maven-embedder/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-embedder
diff --git a/maven-model-builder/pom.xml b/maven-model-builder/pom.xml
index a44089f235e7..d9e02f4ba87d 100644
--- a/maven-model-builder/pom.xml
+++ b/maven-model-builder/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-model-builder
diff --git a/maven-model/pom.xml b/maven-model/pom.xml
index a1505d429b29..59a4dd258947 100644
--- a/maven-model/pom.xml
+++ b/maven-model/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-model
diff --git a/maven-plugin-api/pom.xml b/maven-plugin-api/pom.xml
index 80470c3f4fee..a59bfed3090a 100644
--- a/maven-plugin-api/pom.xml
+++ b/maven-plugin-api/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-plugin-api
diff --git a/maven-repository-metadata/pom.xml b/maven-repository-metadata/pom.xml
index f3e6588152c3..9d94f166a901 100644
--- a/maven-repository-metadata/pom.xml
+++ b/maven-repository-metadata/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-repository-metadata
diff --git a/maven-resolver-provider/pom.xml b/maven-resolver-provider/pom.xml
index 3180d9a7551a..0f6825617d69 100644
--- a/maven-resolver-provider/pom.xml
+++ b/maven-resolver-provider/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-resolver-provider
diff --git a/maven-settings-builder/pom.xml b/maven-settings-builder/pom.xml
index a6ac8fb1a5d6..4c4b406b3fd8 100644
--- a/maven-settings-builder/pom.xml
+++ b/maven-settings-builder/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-settings-builder
diff --git a/maven-settings/pom.xml b/maven-settings/pom.xml
index 3636f0fc5bab..b4a6943bc84c 100644
--- a/maven-settings/pom.xml
+++ b/maven-settings/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-settings
diff --git a/maven-slf4j-provider/pom.xml b/maven-slf4j-provider/pom.xml
index fdf586088ad8..e0bd341fcaf6 100644
--- a/maven-slf4j-provider/pom.xml
+++ b/maven-slf4j-provider/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-slf4j-provider
diff --git a/maven-xml/pom.xml b/maven-xml/pom.xml
index 1c576907b20f..454188883102 100644
--- a/maven-xml/pom.xml
+++ b/maven-xml/pom.xml
@@ -26,7 +26,7 @@ under the License.
org.apache.mavenmaven
- 3.6.2-SNAPSHOT
+ 3.7.0-SNAPSHOTmaven-xmlMaven XML
diff --git a/pom.xml b/pom.xml
index 36007725b004..0a50d1722baf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@ under the License.
maven
- 3.6.3-SNAPSHOT
+ 3.7.0-SNAPSHOTpomApache Maven
From b19b05cbf2f30705dffb8c1a541d65096d967d11 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Wed, 2 Oct 2019 23:08:34 +0200
Subject: [PATCH 16/52] [MNG-6656] Applying review comments
---
...DefaultRepositorySystemSessionFactory.java | 35 ++++++++-------
.../DefaultBuildPomXMLFilterFactory.java | 2 +-
maven-model-builder/pom.xml | 5 ---
.../model/building/DefaultModelBuilder.java | 43 ++++++++++---------
.../building/DefaultModelCacheManager.java | 16 +++----
.../maven/model/building/ModelProblem.java | 3 +-
.../StringSearchModelInterpolatorTest.java | 40 +++++++++--------
.../java/org/apache/maven/xml/SAXEvent.java | 2 +-
.../org/apache/maven/xml/SAXEventFactory.java | 2 +-
.../org/apache/maven/xml/SAXEventUtils.java | 9 +++-
.../xml/filter/BuildPomXMLFilterFactory.java | 7 +--
.../xml/filter/ConsumerPomXMLFilter.java | 3 +-
.../maven/xml/filter/DependencyKey.java | 6 ++-
.../maven/xml/filter/ParentXMLFilter.java | 1 +
.../filter/ReactorDependencyXMLFilter.java | 2 +-
.../xml/filter/AbstractXMLFilterTests.java | 6 +--
.../xml/filter/ConsumerPomXMLFilterTest.java | 16 +++----
pom.xml | 6 ---
18 files changed, 106 insertions(+), 98 deletions(-)
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 e4f8439012ab..107c98b4ff82 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
@@ -31,12 +31,15 @@
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
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;
@@ -54,6 +57,7 @@
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.Factories;
import org.apache.maven.xml.filter.ConsumerPomXMLFilterFactory;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.logging.Logger;
@@ -280,7 +284,7 @@ public Collection getTransformersForArtifact( final Artifact ar
Collection transformers = new ArrayList<>();
if ( "pom".equals( artifact.getExtension() ) )
{
- final TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ final TransformerFactory transformerFactory = Factories.newTransformerFactory();
transformers.add( new FileTransformer()
{
@@ -300,30 +304,29 @@ public InputStream transformData( File file )
}
catch ( SAXException | ParserConfigurationException e )
{
- e.printStackTrace();
throw new TransformException( "Failed to create a consumerPomXMLFilter", e );
}
final StreamResult result = new StreamResult( pipedOutputStream );
- final Runnable runnable = new Runnable()
+ final Callable callable = () ->
{
- @Override
- public void run()
+ try ( PipedOutputStream out = pipedOutputStream )
{
- try ( PipedOutputStream out = pipedOutputStream )
- {
- transformerFactory.newTransformer().transform( transformSource, result );
- }
- catch ( TransformerException | IOException e )
- {
- e.printStackTrace();
- throw new RuntimeException( e );
- }
+ transformerFactory.newTransformer().transform( transformSource, result );
}
+ return null;
};
- new Thread( runnable ).start();
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ try
+ {
+ executorService.submit( callable ).get();
+ }
+ catch ( InterruptedException | ExecutionException e )
+ {
+ throw new TransformException( "Failed to transform pom", e );
+ }
return pipedInputStream;
}
diff --git a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
index e1b5ab500535..2728103de941 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
@@ -104,7 +104,7 @@ private RelativeProject toRelativeProject( final Model m )
return new RelativeProject( groupId, m.getArtifactId(), version );
}
- private String toVersion( final Model m )
+ private static String toVersion( final Model m )
{
String version = m.getVersion();
if ( version == null && m.getParent() != null )
diff --git a/maven-model-builder/pom.xml b/maven-model-builder/pom.xml
index d9e02f4ba87d..511957c5474c 100644
--- a/maven-model-builder/pom.xml
+++ b/maven-model-builder/pom.xml
@@ -88,11 +88,6 @@ under the License.
xmlunit-matcherstest
-
- org.powermock
- powermock-reflect
- test
-
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index d60e68dda02b..5efb532faf51 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -36,12 +36,15 @@
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
-import javax.xml.crypto.dsig.TransformException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
@@ -88,6 +91,7 @@
import org.apache.maven.model.resolution.WorkspaceModelResolver;
import org.apache.maven.model.superpom.SuperPomProvider;
import org.apache.maven.model.validation.ModelValidator;
+import org.apache.maven.xml.Factories;
import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
import org.codehaus.plexus.interpolation.MapBasedValueSource;
import org.codehaus.plexus.interpolation.StringSearchInterpolator;
@@ -770,7 +774,6 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
{
try
{
- // TODO: parent might be part of reactor... better read all lineage items like this?
Model parent = lineage.get( 1 ).getModel();
Model child = modelProcessor.read( transformData( lineage.get( 0 ) ), null );
@@ -781,10 +784,9 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
// overwrite child
lineage.get( 0 ).setModel( child );
}
- catch ( IOException | TransformException | SAXException | ParserConfigurationException e )
+ catch ( IOException | TransformerException | SAXException | ParserConfigurationException e )
{
- // this is second read, should not happen
- e.printStackTrace();
+ problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V37 ).setException( e ) );
}
}
else
@@ -796,9 +798,9 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
}
private InputStream transformData( ModelData modelData )
- throws IOException, TransformException, SAXException, ParserConfigurationException
+ throws IOException, TransformerException, SAXException, ParserConfigurationException
{
- final TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ final TransformerFactory transformerFactory = Factories.newTransformerFactory() ;
final PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream );
@@ -806,7 +808,7 @@ private InputStream transformData( ModelData modelData )
// Should always be FileSource for reactor poms
FileSource source = (FileSource) modelData.getSource();
- System.out.println( "transforming " + source.getFile() );
+ // System.out.println( "transforming " + source.getFile() );
final SAXSource transformSource =
new SAXSource( buildPomXMLFilterFactory.get().get( source.getFile().toPath() ),
@@ -814,23 +816,24 @@ private InputStream transformData( ModelData modelData )
final StreamResult result = new StreamResult( pipedOutputStream );
- final Runnable runnable = new Runnable()
+ final Callable callable = () ->
{
- @Override
- public void run()
+ try ( PipedOutputStream out = pipedOutputStream )
{
- try ( PipedOutputStream out = pipedOutputStream )
- {
- transformerFactory.newTransformer().transform( transformSource, result );
- }
- catch ( TransformerException | IOException e )
- {
- throw new RuntimeException( e );
- }
+ transformerFactory.newTransformer().transform( transformSource, result );
}
+ return null;
};
- new Thread( runnable ).start();
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ try
+ {
+ executorService.submit( callable ).get();
+ }
+ catch ( InterruptedException | ExecutionException e )
+ {
+ throw new TransformerException( "Failed to transform pom", e );
+ }
return pipedInputStream;
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
index f33d71388e4e..96ca4206586c 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
@@ -20,9 +20,8 @@
*/
import java.nio.file.Path;
-import java.util.Collections;
-import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javax.inject.Named;
import javax.inject.Singleton;
@@ -39,15 +38,14 @@
@Singleton
public class DefaultModelCacheManager implements ModelCacheManager
{
- private static final Map MODELCACHE = Collections.synchronizedMap( new HashMap() );
+ private final Map modelCache = new ConcurrentHashMap<>();
- private static final Map DEPKEYMODELCACHE =
- Collections.synchronizedMap( new HashMap() );
+ private final Map depKeyModelCache = new ConcurrentHashMap<>();
@Override
public void put( Path p, Model m )
{
- MODELCACHE.put( p, m );
+ modelCache.put( p, m );
String groupId = m.getGroupId();
if ( groupId == null && m.getParent() != null )
@@ -56,19 +54,19 @@ public void put( Path p, Model m )
}
String artifactId = m.getArtifactId();
- DEPKEYMODELCACHE.put( new DependencyKey( groupId, artifactId ), m );
+ depKeyModelCache.put( new DependencyKey( groupId, artifactId ), m );
}
@Override
public Model get( Path p )
{
- return MODELCACHE.get( p );
+ return modelCache.get( p );
}
@Override
public Model get( DependencyKey k )
{
- return DEPKEYMODELCACHE.get( k );
+ return depKeyModelCache.get( k );
}
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java
index 2c7a72e70a10..30b67249eaf2 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java
@@ -50,7 +50,8 @@ enum Version
BASE,
V20,
V30,
- V31
+ V31,
+ V37
}
/**
diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java
index b66abcade2a9..4cc2508f108c 100644
--- a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java
+++ b/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java
@@ -19,25 +19,29 @@
* under the License.
*/
-import org.apache.maven.model.InputLocation;
-import org.apache.maven.model.InputSource;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.building.DefaultModelBuildingRequest;
-import org.apache.maven.model.building.ModelBuildingRequest;
-import org.apache.maven.model.building.SimpleProblemCollector;
+import static org.apache.commons.lang3.reflect.FieldUtils.*;
+import static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
import java.io.File;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
-import static org.hamcrest.CoreMatchers.anyOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-import static org.powermock.reflect.Whitebox.getField;
-import static org.powermock.reflect.Whitebox.getInternalState;
+import org.apache.maven.model.InputLocation;
+import org.apache.maven.model.InputSource;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.building.DefaultModelBuildingRequest;
+import org.apache.maven.model.building.ModelBuildingRequest;
+import org.apache.maven.model.building.SimpleProblemCollector;
/**
* @author jdcasey
@@ -395,8 +399,7 @@ public void testNotInterpolateObjectWithFile()
//noinspection unchecked
Map, ?> cache =
- (Map, ?>) getField( StringSearchModelInterpolator.class, "CACHED_ENTRIES" )
- .get( null );
+ (Map, ?>) readStaticField( StringSearchModelInterpolator.class, "CACHED_ENTRIES", true );
Object objCacheItem = cache.get( Object.class );
Object fileCacheItem = cache.get( File.class );
@@ -404,8 +407,8 @@ public void testNotInterpolateObjectWithFile()
assertNotNull( objCacheItem );
assertNotNull( fileCacheItem );
- assertThat( ( (Object[]) getInternalState( objCacheItem, "fields" ) ).length, is( 0 ) );
- assertThat( ( (Object[]) getInternalState( fileCacheItem, "fields" ) ).length, is( 0 ) );
+ assertThat( ( (Object[]) readField( objCacheItem, "fields", true ) ).length, is( 0 ) );
+ assertThat( ( (Object[]) readField( fileCacheItem, "fields", true ) ).length, is( 0 ) );
}
public void testNotInterpolateFile()
@@ -427,14 +430,13 @@ public void testNotInterpolateFile()
//noinspection unchecked
Map, ?> cache =
- (Map, ?>) getField( StringSearchModelInterpolator.class, "CACHED_ENTRIES" )
- .get( null );
+ (Map, ?>) readStaticField( StringSearchModelInterpolator.class, "CACHED_ENTRIES", true );
Object fileCacheItem = cache.get( File.class );
assertNotNull( fileCacheItem );
- assertThat( ( (Object[]) getInternalState( fileCacheItem, "fields" ) ).length, is( 0 ) );
+ assertThat( ( (Object[]) readField( fileCacheItem, "fields", true ) ).length, is( 0 ) );
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
index 07da2808b4a0..11aad6dec52f 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
@@ -25,7 +25,7 @@
* Command pattern to gather events which can be executed later on.
*
* @author Robert Scholte
- * @since
+ * @since 3.7.0
*/
@FunctionalInterface
public interface SAXEvent
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
index 42739e120bbb..6d525f696124 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
@@ -27,7 +27,7 @@
* Factory for SAXEvents
*
* @author Robert Scholte
- * @since 4.0.0
+ * @since 3.7.0
*/
public final class SAXEventFactory
{
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
index 06f4f26d98d9..2f3644d0a23c 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
@@ -23,7 +23,7 @@
* Utility class for SAXEvents
*
* @author Robert Scholte
- * @since 4.0.0
+ * @since 3.7.0
*/
public final class SAXEventUtils
{
@@ -31,6 +31,13 @@ private SAXEventUtils()
{
}
+ /**
+ * Returns the newLocalName prefixed with the namespace of the oldQName if present
+ *
+ * @param oldQName the QName, used for its namespace
+ * @param newLocalName the preferred localName
+ * @return the new QName
+ */
public static String renameQName( String oldQName, String newLocalName )
{
return oldQName.replaceFirst( "[^:]+$", newLocalName );
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
index 83eafe60e287..1df17baa7682 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
@@ -24,8 +24,8 @@
import java.util.function.Function;
import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
+import org.apache.maven.xml.Factories;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
@@ -74,12 +74,13 @@ public final BuildPomXMLFilter get( Path projectFile )
protected XMLReader getParent() throws SAXException, ParserConfigurationException
{
- XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ XMLReader xmlReader = Factories.newXMLReader();
xmlReader.setFeature( "http://xml.org/sax/features/namespaces", true );
return xmlReader;
}
- // For CIFriendly
+ // getters for the 3 magic properties of CIFriendly versions ( https://maven.apache.org/maven-ci-friendly.html )
+
protected abstract Optional getChangelist();
protected abstract Optional getRevision();
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
index 9975c224f7ee..8993d1dba4c9 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
@@ -27,9 +27,8 @@
* This often means stripping of build-specific information.
* When extra information is required during filtering it is probably a member of the BuildPomXMLFilter
*
- * This filter is used at 2 locations:
+ * This filter is used at 1 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
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
index bf91cf97255e..6b5e905012ed 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
@@ -31,11 +31,15 @@ public class DependencyKey
private final String groupId;
private final String artifactId;
+
+ private final int hashCode;
public DependencyKey( String groupId, String artifactId )
{
this.groupId = groupId;
this.artifactId = artifactId;
+
+ this.hashCode = Objects.hash( artifactId, groupId );
}
public String getGroupId()
@@ -51,7 +55,7 @@ public String getArtifactId()
@Override
public int hashCode()
{
- return Objects.hash( artifactId, groupId );
+ return hashCode;
}
@Override
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
index 747a28300350..7bb744d3e2ed 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
@@ -43,6 +43,7 @@
*
*
* @author Robert Scholte
+ * @since 3.7.0
*/
class ParentXMLFilter
extends XMLFilterImpl
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
index a568df57cea1..fa8b1e533352 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
@@ -30,7 +30,7 @@
* Will apply the version if the dependency is part of the reactor
*
* @author Robert Scholte
- * @since 4.0.0
+ * @since 3.7.0
*/
public class ReactorDependencyXMLFilter extends XMLFilterImpl
{
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
index e406f6c9e544..0d9b7791e398 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
@@ -25,7 +25,6 @@
import java.io.Writer;
import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
@@ -33,6 +32,7 @@
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
+import org.apache.maven.xml.Factories;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLFilter;
@@ -50,7 +50,7 @@ private void setParent( XMLFilter filter ) throws SAXException, ParserConfigurat
{
if( filter.getParent() == null )
{
- filter.setParent( SAXParserFactory.newInstance().newSAXParser().getXMLReader() );
+ filter.setParent( Factories.newXMLReader() );
filter.setFeature( "http://xml.org/sax/features/namespaces", true );
}
}
@@ -82,7 +82,7 @@ protected String transform( Reader input, XMLFilter filter )
Writer writer = new StringWriter();
StreamResult result = new StreamResult( writer );
- TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ TransformerFactory transformerFactory = Factories.newTransformerFactory();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
index 5484ea6daaf2..4ed4ab682bdf 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
@@ -119,10 +119,10 @@ public void testAllFilters() throws Exception {
@Test
public void testMe() throws Exception {
String input = "\r\n" +
- "\r\n" +
+ "\r\n" +
" 4.0.0\r\n" +
" org.sonatype.mavenbook.multispring\r\n" +
" parent\r\n" +
@@ -141,10 +141,10 @@ public void testMe() throws Exception {
" \r\n" +
"";
String expected = "\r\n" +
- "\r\n" +
+ "\r\n" +
" 4.0.0\r\n" +
" org.sonatype.mavenbook.multispring\r\n" +
" parent\r\n" +
diff --git a/pom.xml b/pom.xml
index 0a50d1722baf..805cb06e23fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -67,7 +67,6 @@ under the License.
1.4.11.7.252.6.2
- 1.7.4trueapache-maven
@@ -431,11 +430,6 @@ under the License.
${xmlunitVersion}test
-
- org.powermock
- powermock-reflect
- ${powermockVersion}
-
From c52f383c4b4d06adb8800d5cd88227bbbec19a2f Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Fri, 11 Oct 2019 15:20:57 +0200
Subject: [PATCH 17/52] [MNG-6656] Support LexicalHandler
---
...DefaultRepositorySystemSessionFactory.java | 5 +-
.../xml/filter/ConsumerPomXMLFilter.java | 73 -----
.../maven/xml/filter/FastForwardFilter.java | 128 --------
.../maven/xml/filter/ModulesXMLFilter.java | 102 -------
.../xml/filter/RelativePathXMLFilter.java | 98 -------
.../DefaultBuildPomXMLFilterFactory.java | 8 +-
.../DefaultConsumerPomXMLFilterFactory.java | 2 +-
.../xml/filter/AbstractXMLFilterTests.java | 80 -----
.../xml/filter/ConsumerPomXMLFilterTest.java | 64 ----
.../xml/filter/ModulesXMLFilterTest.java | 62 ----
.../xml/filter/RelativePathXMLFilterTest.java | 61 ----
.../model/building/DefaultModelBuilder.java | 2 +-
.../building/DefaultModelCacheManager.java | 2 +-
.../model/building/ModelCacheManager.java | 2 +-
.../java/org/apache/maven/xml/Factories.java | 118 ++++++++
.../apache/maven/xml/{ => sax}/SAXEvent.java | 2 +-
.../maven/xml/{ => sax}/SAXEventFactory.java | 63 +++-
.../maven/xml/{ => sax}/SAXEventUtils.java | 2 +-
.../sax/filter/AbstractEventXMLFilter.java | 272 +++++++++++++++++
.../xml/sax/filter/AbstractSAXFilter.java | 130 ++++++++
.../{ => sax}/filter/BuildPomXMLFilter.java | 8 +-
.../filter/BuildPomXMLFilterFactory.java | 31 +-
.../{ => sax}/filter/CiFriendlyXMLFilter.java | 5 +-
.../filter/ConsumerPomXMLFilter.java | 8 +-
.../filter/ConsumerPomXMLFilterFactory.java | 11 +-
.../xml/{ => sax}/filter/DependencyKey.java | 2 +-
.../{ => sax}/filter/FastForwardFilter.java | 8 +-
.../{ => sax}/filter/ModulesXMLFilter.java | 19 +-
.../xml/{ => sax}/filter/ParentXMLFilter.java | 146 ++-------
.../filter/ReactorDependencyXMLFilter.java | 22 +-
.../filter/RelativePathXMLFilter.java | 75 +++--
.../xml/{ => sax}/filter/RelativeProject.java | 2 +-
.../xml/filter/ConsumerPomXMLFilterTest.java | 168 -----------
.../maven/xml/sax/LexicalHandlerVerifier.java | 277 ++++++++++++++++++
.../maven/xml/sax/SAXEventUtilsTest.java | 31 +-
.../filter/AbstractXMLFilterTests.java | 50 +++-
.../sax/filter/ConsumerPomXMLFilterTest.java | 252 ++++++++++++++++
.../filter/ModulesXMLFilterTest.java | 40 +--
.../{ => sax}/filter/ParentXMLFilterTest.java | 34 ++-
.../ReactorDependencyXMLFilterTest.java | 36 ++-
.../filter/RelativePathXMLFilterTest.java | 9 +-
41 files changed, 1379 insertions(+), 1131 deletions(-)
delete mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
delete mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
delete mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
delete mode 100644 maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
delete mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
delete mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
delete mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
delete mode 100644 maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/Factories.java
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/SAXEvent.java (96%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/SAXEventFactory.java (65%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/SAXEventUtils.java (97%)
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractSAXFilter.java
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/BuildPomXMLFilter.java (87%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/BuildPomXMLFilterFactory.java (66%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/CiFriendlyXMLFilter.java (95%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/ConsumerPomXMLFilter.java (87%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/ConsumerPomXMLFilterFactory.java (83%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/DependencyKey.java (98%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/FastForwardFilter.java (94%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/ModulesXMLFilter.java (85%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/ParentXMLFilter.java (59%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/ReactorDependencyXMLFilter.java (90%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/RelativePathXMLFilter.java (57%)
rename maven-xml/src/main/java/org/apache/maven/xml/{ => sax}/filter/RelativeProject.java (97%)
delete mode 100644 maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
create mode 100644 maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java
rename maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java => maven-xml/src/test/java/org/apache/maven/xml/sax/SAXEventUtilsTest.java (63%)
rename maven-xml/src/test/java/org/apache/maven/xml/{ => sax}/filter/AbstractXMLFilterTests.java (57%)
create mode 100644 maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterTest.java
rename maven-xml/src/test/java/org/apache/maven/xml/{ => sax}/filter/ModulesXMLFilterTest.java (67%)
rename maven-xml/src/test/java/org/apache/maven/xml/{ => sax}/filter/ParentXMLFilterTest.java (86%)
rename maven-xml/src/test/java/org/apache/maven/xml/{ => sax}/filter/ReactorDependencyXMLFilterTest.java (66%)
rename maven-xml/src/test/java/org/apache/maven/xml/{ => sax}/filter/RelativePathXMLFilterTest.java (95%)
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 107c98b4ff82..3eaad6f63824 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
@@ -40,6 +40,7 @@
import javax.inject.Named;
import javax.inject.Provider;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
@@ -58,7 +59,7 @@
import org.apache.maven.settings.crypto.SettingsDecrypter;
import org.apache.maven.settings.crypto.SettingsDecryptionResult;
import org.apache.maven.xml.Factories;
-import org.apache.maven.xml.filter.ConsumerPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.ConsumerPomXMLFilterFactory;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.xml.Xpp3Dom;
@@ -302,7 +303,7 @@ public InputStream transformData( File file )
new SAXSource( consumerPomXMLFilterFactory.get().get( file.toPath() ),
new InputSource( new FileReader( file ) ) );
}
- catch ( SAXException | ParserConfigurationException e )
+ catch ( SAXException | ParserConfigurationException | TransformerConfigurationException e )
{
throw new TransformException( "Failed to create a consumerPomXMLFilter", e );
}
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
deleted file mode 100644
index 8709b9c0a15d..000000000000
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-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
deleted file mode 100644
index df68167a1394..000000000000
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
+++ /dev/null
@@ -1,128 +0,0 @@
-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
- *
- *
- *
execution.configuration
- *
plugin.configuration
- *
plugin.goals
- *
profile.reports
- *
project.reports
- *
reportSet.configuration
- *
- */
- private final Deque 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
deleted file mode 100644
index 9e7b6fdbe5de..000000000000
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-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
deleted file mode 100644
index 8548ddd73d9c..000000000000
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
+++ /dev/null
@@ -1,98 +0,0 @@
-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/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
index 2728103de941..d359eb65ea8b 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultBuildPomXMLFilterFactory.java
@@ -31,9 +31,9 @@
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Model;
import org.apache.maven.model.building.ModelCacheManager;
-import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
-import org.apache.maven.xml.filter.DependencyKey;
-import org.apache.maven.xml.filter.RelativeProject;
+import org.apache.maven.xml.sax.filter.BuildPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.DependencyKey;
+import org.apache.maven.xml.sax.filter.RelativeProject;
/**
*
@@ -87,7 +87,7 @@ protected Function getDependencyKeyToVersionMapper()
.orElse( null );
}
- private RelativeProject toRelativeProject( final Model m )
+ private static RelativeProject toRelativeProject( final Model m )
{
String groupId = m.getGroupId();
if ( groupId == null && m.getParent() != null )
diff --git a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
index af05bc392344..489019fd6c69 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
@@ -22,7 +22,7 @@
import javax.inject.Named;
import javax.inject.Singleton;
-import org.apache.maven.xml.filter.ConsumerPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.ConsumerPomXMLFilterFactory;
/**
*
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
deleted file mode 100644
index 69fc33ba8f59..000000000000
--- a/maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
+++ /dev/null
@@ -1,80 +0,0 @@
-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
deleted file mode 100644
index b3d44db91b6b..000000000000
--- a/maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-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 = "\n"
- + " \n"
- + " GROUPID\n"
- + " PARENT\n"
- + " VERSION\n"
- + " ../pom.xml\n"
- + " \n"
- + " PROJECT\n"
- + " \n"
- + " ab\n"
- + " ../cd\n"
- + " \n"
- + "";
- String expected = "\n"
- + " \n"
- + " GROUPID\n"
- + " PARENT\n"
- + " VERSION\n"
- + " \n"
- + " \n"
- + " PROJECT\n"
- + "";
- 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
deleted file mode 100644
index 353f1742d896..000000000000
--- a/maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-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 = "";
- String expected = "";
- String actual = transform( input, filter );
- assertThat( actual ).and( expected ).areIdentical();
- }
-
- @Test
- public void testSetOfModules() throws Exception {
- String input = ""
- + "ab"
- + "../cd"
- + "";
- String expected = "";
- String actual = transform( input, filter );
- assertThat( actual ).and( expected ).areIdentical();
- }
-
- @Test
- public void testNoModules() throws Exception {
- String input = "NAME";
- 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
deleted file mode 100644
index 298197dd1c81..000000000000
--- a/maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-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 = "\n"
- + " \n"
- + " GROUPID\n"
- + " PARENT\n"
- + " VERSION\n"
- + " ../pom.xml\n"
- + " \n"
- + " PROJECT\n"
- + "";
- String expected = "\n"
- + " \n"
- + " GROUPID\n"
- + " PARENT\n"
- + " VERSION\n"
- + " \n"
- + " \n"
- + " PROJECT\n"
- + "";
- String actual = transform( input, filter );
- assertThat( actual ).and( expected ).areIdentical();
- }
-
-}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 5efb532faf51..bc13d33e3a5d 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -92,7 +92,7 @@
import org.apache.maven.model.superpom.SuperPomProvider;
import org.apache.maven.model.validation.ModelValidator;
import org.apache.maven.xml.Factories;
-import org.apache.maven.xml.filter.BuildPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.BuildPomXMLFilterFactory;
import org.codehaus.plexus.interpolation.MapBasedValueSource;
import org.codehaus.plexus.interpolation.StringSearchInterpolator;
import org.eclipse.sisu.Nullable;
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
index 96ca4206586c..e205749ffb3f 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelCacheManager.java
@@ -27,7 +27,7 @@
import javax.inject.Singleton;
import org.apache.maven.model.Model;
-import org.apache.maven.xml.filter.DependencyKey;
+import org.apache.maven.xml.sax.filter.DependencyKey;
/**
*
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
index f28116fbfd4f..f6e651592ede 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheManager.java
@@ -22,7 +22,7 @@
import java.nio.file.Path;
import org.apache.maven.model.Model;
-import org.apache.maven.xml.filter.DependencyKey;
+import org.apache.maven.xml.sax.filter.DependencyKey;
/**
* Registers models for usage later on
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/Factories.java b/maven-xml/src/main/java/org/apache/maven/xml/Factories.java
new file mode 100644
index 000000000000..eb2166a686e1
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/Factories.java
@@ -0,0 +1,118 @@
+package org.apache.maven.xml;
+
+/*
+ * 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.XMLConstants;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.TransformerFactory;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+
+/**
+ * Creates XML related factories with OWASP advices applied
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public final class Factories
+{
+ private Factories()
+ {
+ }
+
+ /**
+ *
+ * @return
+ * @see https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#transformerfactory
+ */
+ public static TransformerFactory newTransformerFactory()
+ {
+ TransformerFactory tf = TransformerFactory.newInstance();
+ tf.setAttribute( XMLConstants.ACCESS_EXTERNAL_DTD, "" );
+ tf.setAttribute( XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "" );
+
+ return tf;
+ }
+
+ public static SAXParserFactory newSAXParserFactory()
+ {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+
+ try
+ {
+ // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+ // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
+
+ // Using the SAXParserFactory's setFeature
+ spf.setFeature( "http://xml.org/sax/features/external-general-entities", false );
+
+ // Xerces 2 only - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+ spf.setFeature( "http://apache.org/xml/features/disallow-doctype-decl", true );
+ }
+ catch ( ParserConfigurationException e )
+ {
+ // Tried an unsupported feature.
+ }
+ catch ( SAXNotRecognizedException e )
+ {
+ // Tried an unknown feature.
+ }
+ catch ( SAXNotSupportedException e )
+ {
+ // Tried a feature known to the parser but unsupported.
+ }
+ return spf;
+ }
+
+ public static SAXParser newSAXParser() throws ParserConfigurationException, SAXException
+ {
+ SAXParser saxParser = newSAXParserFactory().newSAXParser();
+
+ return saxParser;
+ }
+
+ public static XMLReader newXMLReader() throws SAXException, ParserConfigurationException
+ {
+ XMLReader reader = newSAXParser().getXMLReader();
+
+ try
+ {
+ // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+ // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
+
+ // Using the XMLReader's setFeature
+ reader.setFeature( "http://xml.org/sax/features/external-general-entities", false );
+ }
+ catch ( SAXNotRecognizedException e )
+ {
+ // Tried an unknown feature.
+ }
+ catch ( SAXNotSupportedException e )
+ {
+ // Tried a feature known to the parser but unsupported.
+ }
+ return reader;
+ }
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEvent.java
similarity index 96%
rename from maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEvent.java
index 11aad6dec52f..81269570ad60 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEvent.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml;
+package org.apache.maven.xml.sax;
/*
* Licensed to the Apache Software Foundation (ASF) under one
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventFactory.java
similarity index 65%
rename from maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventFactory.java
index 6d525f696124..84e13e5fad58 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventFactory.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml;
+package org.apache.maven.xml.sax;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -22,6 +22,7 @@
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
+import org.xml.sax.ext.LexicalHandler;
/**
* Factory for SAXEvents
@@ -32,25 +33,19 @@
public final class SAXEventFactory
{
private final ContentHandler contentHandler;
+
+ private final LexicalHandler lexicalHandler;
- protected SAXEventFactory( ContentHandler contentHandler )
+ protected SAXEventFactory( ContentHandler contentHandler, LexicalHandler lexicalHandler )
{
this.contentHandler = contentHandler;
+ this.lexicalHandler = lexicalHandler;
}
public SAXEvent characters( final char[] ch, final int start, final int length )
{
- final char[] txt;
- if ( start > 0 )
- {
- txt = new char[length];
- System.arraycopy( ch, start, txt, 0, length );
- }
- else
- {
- txt = ch;
- }
-
+ final char[] txt = new char[length];
+ System.arraycopy( ch, start, txt, 0, length );
return () -> contentHandler.characters( txt, 0, length );
}
@@ -104,8 +99,46 @@ public SAXEvent startPrefixMapping( final String prefix, final String uri )
return () -> contentHandler.startPrefixMapping( prefix, uri );
}
- public static SAXEventFactory newInstance( ContentHandler handler )
+ public static SAXEventFactory newInstance( ContentHandler contentHandler, LexicalHandler lexicalHandler )
+ {
+ return new SAXEventFactory( contentHandler, lexicalHandler );
+ }
+
+ public SAXEvent startDTD( String name, String publicId, String systemId )
+ {
+ return () -> lexicalHandler.startDTD( name, publicId, systemId );
+ }
+
+ public SAXEvent endDTD()
+ {
+ return () -> lexicalHandler.endDTD();
+ }
+
+ public SAXEvent startEntity( String name )
+ {
+ return () -> lexicalHandler.startEntity( name );
+ }
+
+ public SAXEvent endEntity( String name )
+ {
+ return () -> lexicalHandler.endEntity( name );
+
+ }
+
+ public SAXEvent startCDATA()
+ {
+ return () -> lexicalHandler.startCDATA();
+ }
+
+ public SAXEvent endCDATA()
+ {
+ return () -> lexicalHandler.endCDATA();
+ }
+
+ public SAXEvent comment( char[] ch, int start, int length )
{
- return new SAXEventFactory( handler );
+ final char[] txt = new char[length];
+ System.arraycopy( ch, start, txt, 0, length );
+ return () -> lexicalHandler.comment( txt, 0, length );
}
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventUtils.java
similarity index 97%
rename from maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventUtils.java
index 2f3644d0a23c..483bb7d8b7fc 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventUtils.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml;
+package org.apache.maven.xml.sax;
/*
* Licensed to the Apache Software Foundation (ASF) under one
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
new file mode 100644
index 000000000000..d52cb7c64d37
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractEventXMLFilter.java
@@ -0,0 +1,272 @@
+package org.apache.maven.xml.sax.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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.xml.sax.SAXEvent;
+import org.apache.maven.xml.sax.SAXEventFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * Builds up a list of SAXEvents, which will be executed with {@link #executeEvents()}
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+abstract class AbstractEventXMLFilter extends AbstractSAXFilter
+{
+ private List saxEvents = new ArrayList<>();
+
+ private SAXEventFactory eventFactory;
+
+ // characters BEFORE startElement must get state of startingElement
+ // this way removing based on state keeps formatting
+ private SAXEvent characters;
+
+ // map of characters AFTER starting element, will be cleaned up after closeElement
+ private Map charactersMap = new HashMap<>();
+
+ protected abstract boolean isParsing();
+
+ protected abstract String getState();
+
+ protected boolean acceptEvent( String state )
+ {
+ return true;
+ }
+
+// protected final void applyCharacters() throws SAXException
+// {
+// if ( characters != null )
+// {
+// processEvent( characters );
+// }
+// }
+
+ AbstractEventXMLFilter()
+ {
+ super();
+ }
+
+ AbstractEventXMLFilter( T parent )
+ {
+ setParent( parent );
+ }
+
+ private SAXEventFactory getEventFactory()
+ {
+ if ( eventFactory == null )
+ {
+ eventFactory = SAXEventFactory.newInstance( getContentHandler(), getLexicalHandler() );
+ }
+ return eventFactory;
+ }
+
+ private void processEvent( final SAXEvent event )
+ throws SAXException
+ {
+ if ( isParsing() )
+ {
+ final String eventState = getState();
+ final SAXEvent charactersEvent = characters;
+
+ if ( charactersEvent != null )
+ {
+ saxEvents.add( () ->
+ {
+ if ( acceptEvent( eventState ) )
+ {
+ charactersEvent.execute();
+ }
+ } );
+ characters = null;
+ }
+
+ saxEvents.add( () ->
+ {
+ if ( acceptEvent( eventState ) )
+ {
+ event.execute();
+ }
+ } );
+ }
+ else
+ {
+ event.execute();
+ }
+ }
+
+ protected final void executeEvents() throws SAXException
+ {
+ final String eventState = getState();
+ final SAXEvent charactersEvent = characters;
+ if ( charactersEvent != null )
+ {
+ saxEvents.add( () ->
+ {
+ if ( acceptEvent( eventState ) )
+ {
+ charactersEvent.execute();
+ }
+ } );
+ characters = null;
+ }
+
+ // not with streams due to checked SAXException
+ for ( SAXEvent saxEvent : saxEvents )
+ {
+ saxEvent.execute();
+ }
+ }
+
+ @Override
+ public void setDocumentLocator( Locator locator )
+ {
+ try
+ {
+ processEvent( getEventFactory().setDocumentLocator( locator ) );
+ }
+ catch ( SAXException e )
+ {
+ // noop, setDocumentLocator can never throw a SAXException
+ }
+ }
+
+ @Override
+ public void startDocument() throws SAXException
+ {
+ processEvent( getEventFactory().startDocument() );
+ }
+
+ @Override
+ public void endDocument() throws SAXException
+ {
+ processEvent( getEventFactory().endDocument() );
+ }
+
+ @Override
+ public void startPrefixMapping( String prefix, String uri ) throws SAXException
+ {
+ processEvent( getEventFactory().startPrefixMapping( prefix, uri ) );
+ }
+
+ @Override
+ public void endPrefixMapping( String prefix ) throws SAXException
+ {
+ processEvent( getEventFactory().endPrefixMapping( prefix ) );
+ }
+
+ @Override
+ public void startElement( String uri, String localName, String qName, Attributes atts ) throws SAXException
+ {
+ processEvent( getEventFactory().startElement( uri, localName, qName, atts ) );
+ }
+
+ @Override
+ public void endElement( String uri, String localName, String qName ) throws SAXException
+ {
+ processEvent( getEventFactory().endElement( uri, localName, qName ) );
+ }
+
+ @Override
+ public void characters( char[] ch, int start, int length ) throws SAXException
+ {
+ if ( isParsing() )
+ {
+ this.characters = getEventFactory().characters( ch, start, length );
+ this.charactersMap.put( getState(), characters );
+ }
+ else
+ {
+ super.characters( ch, start, length );
+ }
+ }
+
+ @Override
+ public void ignorableWhitespace( char[] ch, int start, int length ) throws SAXException
+ {
+ processEvent( getEventFactory().ignorableWhitespace( ch, start, length ) );
+ }
+
+ @Override
+ public void processingInstruction( String target, String data ) throws SAXException
+ {
+ processEvent( getEventFactory().processingInstruction( target, data ) );
+ }
+
+ @Override
+ public void skippedEntity( String name ) throws SAXException
+ {
+ processEvent( getEventFactory().skippedEntity( name ) );
+ }
+
+ @Override
+ public void startDTD( String name, String publicId, String systemId ) throws SAXException
+ {
+ processEvent( getEventFactory().startCDATA() );
+ }
+
+ @Override
+ public void endDTD() throws SAXException
+ {
+ processEvent( getEventFactory().endDTD() );
+ }
+
+ @Override
+ public void startEntity( String name ) throws SAXException
+ {
+ processEvent( getEventFactory().startEntity( name ) );
+ }
+
+ @Override
+ public void endEntity( String name ) throws SAXException
+ {
+ processEvent( getEventFactory().endEntity( name ) );
+ }
+
+ @Override
+ public void startCDATA()
+ throws SAXException
+ {
+ processEvent( getEventFactory().startCDATA() );
+ }
+
+ @Override
+ public void endCDATA()
+ throws SAXException
+ {
+ processEvent( getEventFactory().endCDATA() );
+ }
+
+ @Override
+ public void comment( char[] ch, int start, int length )
+ throws SAXException
+ {
+ processEvent( getEventFactory().comment( ch, start, length ) );
+ }
+}
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
new file mode 100644
index 000000000000..89de519c5963
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/AbstractSAXFilter.java
@@ -0,0 +1,130 @@
+package org.apache.maven.xml.sax.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.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ * XMLFilter with LexicalHandler.
+ * Since some filters collect events before processing them, the LexicalHandler events must be collected too.
+ * Otherwise the LexicalHandler events might end up before all collected XMLReader events.
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public class AbstractSAXFilter extends XMLFilterImpl implements LexicalHandler
+{
+ private LexicalHandler lexicalHandler;
+
+ AbstractSAXFilter()
+ {
+ super();
+ }
+
+ public AbstractSAXFilter( T parent )
+ {
+ setParent( parent );
+ setLexicalHandler( parent );
+ }
+
+ public LexicalHandler getLexicalHandler()
+ {
+ return lexicalHandler;
+ }
+
+ public void setLexicalHandler( LexicalHandler lexicalHandler )
+ {
+ this.lexicalHandler = lexicalHandler;
+ }
+
+ @Override
+ public void startDTD( String name, String publicId, String systemId )
+ throws SAXException
+ {
+ if ( lexicalHandler != null )
+ {
+ lexicalHandler.startDTD( name, publicId, systemId );
+ }
+ }
+
+ @Override
+ public void endDTD()
+ throws SAXException
+ {
+ if ( lexicalHandler != null )
+ {
+ lexicalHandler.endDTD();
+ }
+ }
+
+ @Override
+ public void startEntity( String name )
+ throws SAXException
+ {
+ if ( lexicalHandler != null )
+ {
+ lexicalHandler.startEntity( name );
+ }
+ }
+
+ @Override
+ public void endEntity( String name )
+ throws SAXException
+ {
+ if ( lexicalHandler != null )
+ {
+ lexicalHandler.endEntity( name );
+ }
+ }
+
+ @Override
+ public void startCDATA()
+ throws SAXException
+ {
+ if ( lexicalHandler != null )
+ {
+ lexicalHandler.startCDATA();
+ }
+ }
+
+ @Override
+ public void endCDATA()
+ throws SAXException
+ {
+ if ( lexicalHandler != null )
+ {
+ lexicalHandler.endCDATA();
+ }
+ }
+
+ @Override
+ public void comment( char[] ch, int start, int length )
+ throws SAXException
+ {
+ if ( lexicalHandler != null )
+ {
+ lexicalHandler.comment( ch, start, length );
+ }
+ }
+
+}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilter.java
similarity index 87%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilter.java
index ab846a080a4b..041d5c18bccf 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -20,7 +20,7 @@
*/
import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
+import org.xml.sax.ext.LexicalHandler;
/**
* Filter to adjust pom on filesystem before being processed for effective pom.
@@ -32,14 +32,14 @@
* @author Robert Scholte
* @since 3.7.0
*/
-public class BuildPomXMLFilter extends XMLFilterImpl
+public class BuildPomXMLFilter extends AbstractSAXFilter
{
BuildPomXMLFilter()
{
super();
}
- BuildPomXMLFilter( XMLReader parent )
+ BuildPomXMLFilter( T parent )
{
super( parent );
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java
similarity index 66%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java
index 1df17baa7682..d1156739e251 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilterFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterFactory.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -24,12 +24,18 @@
import java.util.function.Function;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXTransformerFactory;
import org.apache.maven.xml.Factories;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
/**
+ * Base class for third parties to extend. When annotating it with Named("somecustomname"),
+ * Maven will pick this up as instead of the DefaultBuildPomXMLFilterFactory
*
* @author Robert Scholte
*
@@ -38,15 +44,18 @@
public abstract class BuildPomXMLFilterFactory
{
public final BuildPomXMLFilter get( Path projectFile )
- throws SAXException, ParserConfigurationException
+ throws SAXException, ParserConfigurationException, TransformerConfigurationException
{
- XMLReader parent = getParent();
+ AbstractSAXFilter parent = new AbstractSAXFilter();
+ parent.setParent( getXMLReader() );
+ parent.setLexicalHandler( getLexicalHander() );
if ( getDependencyKeyToVersionMapper() != null )
{
ReactorDependencyXMLFilter reactorDependencyXMLFilter =
new ReactorDependencyXMLFilter( getDependencyKeyToVersionMapper() );
reactorDependencyXMLFilter.setParent( parent );
+ reactorDependencyXMLFilter.setLexicalHandler( parent );
parent = reactorDependencyXMLFilter;
}
@@ -55,6 +64,7 @@ public final BuildPomXMLFilter get( Path projectFile )
ParentXMLFilter parentFilter = new ParentXMLFilter( getRelativePathMapper() );
parentFilter.setProjectPath( projectFile.getParent() );
parentFilter.setParent( parent );
+ parentFilter.setLexicalHandler( parent );
parent = parentFilter;
}
@@ -66,19 +76,32 @@ public final BuildPomXMLFilter get( Path projectFile )
if ( ciFriendlyFilter.isSet() )
{
ciFriendlyFilter.setParent( parent );
+ ciFriendlyFilter.setLexicalHandler( parent );
parent = ciFriendlyFilter;
}
return new BuildPomXMLFilter( parent );
}
- protected XMLReader getParent() throws SAXException, ParserConfigurationException
+ protected XMLReader getXMLReader() throws SAXException, ParserConfigurationException
{
XMLReader xmlReader = Factories.newXMLReader();
xmlReader.setFeature( "http://xml.org/sax/features/namespaces", true );
return xmlReader;
}
+ protected LexicalHandler getLexicalHander() throws TransformerConfigurationException
+ {
+ TransformerFactory transformerFactory = Factories.newTransformerFactory();
+ if ( transformerFactory instanceof SAXTransformerFactory )
+ {
+ SAXTransformerFactory saxTransformerFactory = (SAXTransformerFactory) transformerFactory;
+ return saxTransformerFactory.newTransformerHandler();
+ }
+ throw new TransformerConfigurationException( "Failed to get LexicalHandler via TransformerFactory:"
+ + " it is not an instance of SAXTransformerFactory" );
+ }
+
// getters for the 3 magic properties of CIFriendly versions ( https://maven.apache.org/maven-ci-friendly.html )
protected abstract Optional getChangelist();
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/CiFriendlyXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/CiFriendlyXMLFilter.java
similarity index 95%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/CiFriendlyXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/CiFriendlyXMLFilter.java
index 7f8c206232ed..a13e4d432fc7 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/CiFriendlyXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/CiFriendlyXMLFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -22,7 +22,6 @@
import java.util.function.Function;
import org.xml.sax.SAXException;
-import org.xml.sax.helpers.XMLFilterImpl;
/**
* Resolves all ci-friendly properties occurrences
@@ -31,7 +30,7 @@
* @since 3.7.0
*/
class CiFriendlyXMLFilter
- extends XMLFilterImpl
+ extends AbstractSAXFilter
{
private Function replaceChain = Function.identity();
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilter.java
similarity index 87%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilter.java
index 8993d1dba4c9..1c227a733a28 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -20,7 +20,7 @@
*/
import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
+import org.xml.sax.ext.LexicalHandler;
/**
* XML Filter to transform pom.xml to consumer pom.
@@ -33,9 +33,9 @@
* @author Robert Scholte
* @since 3.7.0
*/
-public class ConsumerPomXMLFilter extends XMLFilterImpl
+public class ConsumerPomXMLFilter extends AbstractSAXFilter
{
- ConsumerPomXMLFilter( XMLReader filter )
+ ConsumerPomXMLFilter( T filter )
{
super( filter );
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterFactory.java
similarity index 83%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterFactory.java
index dfea9ba06aa5..612ddb9ead91 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterFactory.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterFactory.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -24,10 +24,9 @@
import javax.inject.Inject;
import javax.inject.Provider;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerConfigurationException;
import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.XMLReader;
/**
*
@@ -50,12 +49,12 @@ public ConsumerPomXMLFilterFactory()
}
public final ConsumerPomXMLFilter get( Path projectPath )
- throws SAXException, ParserConfigurationException
+ throws SAXException, ParserConfigurationException, TransformerConfigurationException
{
- XMLFilter parent = buildPomXMLFilterFactory.get().get( projectPath );
+ BuildPomXMLFilter parent = buildPomXMLFilterFactory.get().get( projectPath );
// Ensure that xs:any elements aren't touched by next filters
- XMLReader filter = new FastForwardFilter( parent );
+ AbstractSAXFilter filter = new FastForwardFilter( parent );
// Strip modules
filter = new ModulesXMLFilter( filter );
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/DependencyKey.java
similarity index 98%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/DependencyKey.java
index 6b5e905012ed..1168351744fa 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/DependencyKey.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/DependencyKey.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/FastForwardFilter.java
similarity index 94%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/FastForwardFilter.java
index 6e03a3459d42..0100e6bffd00 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/FastForwardFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -27,7 +27,7 @@
import org.xml.sax.SAXException;
import org.xml.sax.XMLFilter;
import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
+import org.xml.sax.ext.LexicalHandler;
/**
* This filter will skip all following filters and write directly to the output.
@@ -36,7 +36,7 @@
* @author Robert Scholte
* @since 3.7.0
*/
-class FastForwardFilter extends XMLFilterImpl
+class FastForwardFilter extends AbstractSAXFilter
{
/**
* DOM elements of pom
@@ -61,7 +61,7 @@ class FastForwardFilter extends XMLFilterImpl
super();
}
- FastForwardFilter( XMLReader parent )
+ FastForwardFilter( T parent )
{
super( parent );
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ModulesXMLFilter.java
similarity index 85%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ModulesXMLFilter.java
index 9e7b6fdbe5de..16ca2edb35c7 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ModulesXMLFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -22,7 +22,7 @@
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
+import org.xml.sax.ext.LexicalHandler;
/**
* Remove all modules, this is just buildtime information
@@ -31,7 +31,7 @@
* @since 3.7.0
*/
class ModulesXMLFilter
- extends XMLFilterImpl
+ extends AbstractSAXFilter
{
/**
* Using 3 to also remove whitespace-block after closing tag
@@ -46,7 +46,7 @@ class ModulesXMLFilter
super();
}
- ModulesXMLFilter( XMLReader parent )
+ ModulesXMLFilter( T parent )
{
super( parent );
}
@@ -98,5 +98,14 @@ public void characters( char[] ch, int start, int length )
super.characters( ch, start, length );
}
}
-
+
+ @Override
+ public void comment( char[] ch, int start, int length )
+ throws SAXException
+ {
+ if ( modulesStatus != 1 )
+ {
+ super.comment( ch, start, length );
+ }
+ }
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ParentXMLFilter.java
similarity index 59%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ParentXMLFilter.java
index 7bb744d3e2ed..9cb6ff28210d 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ParentXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ParentXMLFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -22,19 +22,13 @@
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
-import org.apache.maven.xml.SAXEvent;
-import org.apache.maven.xml.SAXEventFactory;
-import org.apache.maven.xml.SAXEventUtils;
+import org.apache.maven.xml.sax.SAXEventUtils;
import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
import org.xml.sax.SAXException;
-import org.xml.sax.helpers.XMLFilterImpl;
/**
*
@@ -46,7 +40,7 @@
* @since 3.7.0
*/
class ParentXMLFilter
- extends XMLFilterImpl
+ extends AbstractEventXMLFilter
{
private boolean parsingParent;
@@ -63,12 +57,6 @@ class ParentXMLFilter
private Optional resolvedParent;
- private char[] linebreak;
-
- private List saxEvents = new ArrayList<>();
-
- private SAXEventFactory eventFactory;
-
private final Function> relativePathMapper;
private Path projectPath;
@@ -88,36 +76,24 @@ public void setProjectPath( Path projectPath )
this.projectPath = projectPath;
}
- private SAXEventFactory getEventFactory()
+ @Override
+ protected boolean isParsing()
{
- if ( eventFactory == null )
- {
- eventFactory = SAXEventFactory.newInstance( getContentHandler() );
- }
- return eventFactory;
+ return parsingParent;
}
- private void processEvent( final SAXEvent event )
- throws SAXException
+ @Override
+ protected String getState()
{
- if ( parsingParent )
- {
- final String eventState = state;
-
- saxEvents.add( () ->
- {
- if ( !( "relativePath".equals( eventState ) && resolvedParent.isPresent() ) )
- {
- event.execute();
- }
- } );
- }
- else
- {
- event.execute();
- }
+ return state;
}
+ @Override
+ protected boolean acceptEvent( String eventState )
+ {
+ return !( "relativePath".equals( eventState ) && resolvedParent.isPresent() );
+ }
+
@Override
public void startElement( String uri, final String localName, String qName, Attributes atts )
throws SAXException
@@ -134,7 +110,7 @@ public void startElement( String uri, final String localName, String qName, Attr
hasVersion |= "version".equals( localName );
}
- processEvent( getEventFactory().startElement( uri, localName, qName, atts ) );
+ super.startElement( uri, localName, qName, atts );
}
@Override
@@ -157,9 +133,6 @@ public void characters( char[] ch, int start, int length )
break;
}
}
-
- linebreak = new char[l];
- System.arraycopy( ch, start, linebreak, 0, l );
break;
case "relativePath":
relativePath = new String( ch, start, length );
@@ -175,14 +148,7 @@ public void characters( char[] ch, int start, int length )
}
}
- processEvent( getEventFactory().characters( ch, start, length ) );
- }
-
- @Override
- public void endDocument()
- throws SAXException
- {
- processEvent( getEventFactory().endDocument() );
+ super.characters( ch, start, length );
}
@Override
@@ -200,30 +166,20 @@ public void endElement( String uri, final String localName, String qName )
resolveRelativePath( Paths.get( Objects.toString( relativePath, "../pom.xml" ) ) );
}
- // not with streams due to checked SAXException
- for ( SAXEvent saxEvent : saxEvents )
- {
- saxEvent.execute();
- }
-
if ( !hasVersion && resolvedParent.isPresent() )
{
String versionQName = SAXEventUtils.renameQName( qName, "version" );
- getEventFactory().startElement( uri, "version", versionQName, null ).execute();
+ super.startElement( uri, "version", versionQName, null );
String resolvedParentVersion = resolvedParent.get().getVersion();
- getEventFactory().characters( resolvedParentVersion.toCharArray(), 0,
- resolvedParentVersion.length() ).execute();
-
- getEventFactory().endElement( uri, "version", versionQName ).execute();
+ super.characters( resolvedParentVersion.toCharArray(), 0,
+ resolvedParentVersion.length() );
- if ( linebreak != null )
- {
- getEventFactory().characters( linebreak, 0, linebreak.length ).execute();
- }
+ super.endElement( uri, "version", versionQName );
}
+ executeEvents();
parsingParent = false;
break;
@@ -232,68 +188,12 @@ public void endElement( String uri, final String localName, String qName )
}
}
- processEvent( getEventFactory().endElement( uri, localName, qName ) );
+ super.endElement( uri, localName, qName );
// for this simple structure resetting to parent it sufficient
state = "parent";
}
- @Override
- public void endPrefixMapping( String prefix )
- throws SAXException
- {
- processEvent( getEventFactory().endPrefixMapping( prefix ) );
- }
-
- @Override
- public void ignorableWhitespace( char[] ch, int start, int length )
- throws SAXException
- {
- processEvent( getEventFactory().ignorableWhitespace( ch, start, length ) );
- }
-
- @Override
- public void processingInstruction( String target, String data )
- throws SAXException
- {
- processEvent( getEventFactory().processingInstruction( target, data ) );
-
- }
-
- @Override
- public void setDocumentLocator( Locator locator )
- {
- try
- {
- processEvent( getEventFactory().setDocumentLocator( locator ) );
- }
- catch ( SAXException e )
- {
- // noop
- }
- }
-
- @Override
- public void skippedEntity( String name )
- throws SAXException
- {
- processEvent( getEventFactory().skippedEntity( name ) );
- }
-
- @Override
- public void startDocument()
- throws SAXException
- {
- processEvent( getEventFactory().startDocument() );
- }
-
- @Override
- public void startPrefixMapping( String prefix, String uri )
- throws SAXException
- {
- processEvent( getEventFactory().startPrefixMapping( prefix, uri ) );
- }
-
protected Optional resolveRelativePath( Path relativePath )
{
Optional mappedProject =
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilter.java
similarity index 90%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilter.java
index fa8b1e533352..b37092f6b9e6 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -21,10 +21,9 @@
import java.util.function.Function;
-import org.apache.maven.xml.SAXEventUtils;
+import org.apache.maven.xml.sax.SAXEventUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
-import org.xml.sax.helpers.XMLFilterImpl;
/**
* Will apply the version if the dependency is part of the reactor
@@ -32,7 +31,7 @@
* @author Robert Scholte
* @since 3.7.0
*/
-public class ReactorDependencyXMLFilter extends XMLFilterImpl
+public class ReactorDependencyXMLFilter extends AbstractEventXMLFilter
{
private boolean parsingDependency;
@@ -109,11 +108,14 @@ public void endElement( String uri, final String localName, String qName )
if ( version != null )
{
String versionQName = SAXEventUtils.renameQName( qName, "version" );
+
super.startElement( uri, "version", versionQName, null );
super.characters( version.toCharArray(), 0, version.length() );
super.endElement( uri, "version", versionQName );
}
}
+ super.executeEvents();
+
parsingDependency = false;
// reset
@@ -136,5 +138,17 @@ private String getVersion()
{
return reactorVersionMapper.apply( new DependencyKey( groupId, artifactId ) );
}
+
+ @Override
+ protected boolean isParsing()
+ {
+ return parsingDependency;
+ }
+
+ @Override
+ protected String getState()
+ {
+ return state;
+ }
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/RelativePathXMLFilter.java
similarity index 57%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/RelativePathXMLFilter.java
index 5dc367fa993e..ebbc890347c2 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/RelativePathXMLFilter.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -22,7 +22,7 @@
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
+import org.xml.sax.ext.LexicalHandler;
/**
* Remove content from relativePath
@@ -33,67 +33,78 @@
* @since 3.7.0
*/
class RelativePathXMLFilter
- extends XMLFilterImpl
+ extends AbstractEventXMLFilter
{
- /**
- * Using 3 to also remove whitespace-block after closing tag
- * -1 none
- * 1 started
- * 2 ended
- */
- int relativePathStatus = -1;
+ private boolean parsingParent;
+
+ private String state;
RelativePathXMLFilter()
{
super();
}
- RelativePathXMLFilter( XMLReader parent )
+ RelativePathXMLFilter( T parent )
{
super( parent );
}
-
+
@Override
- public void startElement( String uri, String localName, String qName, Attributes atts )
+ public void startElement( String uri, final String localName, String qName, Attributes atts )
throws SAXException
{
-
- if ( relativePathStatus == -1 && "relativePath".equals( localName ) )
+ if ( !parsingParent && "parent".equals( localName ) )
{
- relativePathStatus = 1;
+ parsingParent = true;
}
- else if ( relativePathStatus == 2 )
+
+ if ( parsingParent )
{
- relativePathStatus = -1;
+ state = localName;
}
-
+
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 )
+ if ( parsingParent )
{
- relativePathStatus = -1;
+ switch ( localName )
+ {
+ case "parent":
+ executeEvents();
+
+ parsingParent = false;
+ break;
+ default:
+ break;
+ }
}
super.endElement( uri, localName, qName );
+
+ // for this simple structure resetting to parent it sufficient
+ state = "parent";
}
@Override
- public void characters( char[] ch, int start, int length )
- throws SAXException
+ protected boolean isParsing()
{
- if ( relativePathStatus != 1 )
- {
- super.characters( ch, start, length );
- }
+ return parsingParent;
}
+ @Override
+ protected String getState()
+ {
+ return state;
+ }
+
+ @Override
+ protected boolean acceptEvent( String state )
+ {
+ return !"relativePath".equals( state );
+ }
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/RelativeProject.java
similarity index 97%
rename from maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
rename to maven-xml/src/main/java/org/apache/maven/xml/sax/filter/RelativeProject.java
index a158d38ee215..067e170b5a05 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativeProject.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/RelativeProject.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
deleted file mode 100644
index 4ed4ab682bdf..000000000000
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-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 java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Optional;
-import java.util.function.Function;
-
-import javax.inject.Provider;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.Test;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-
-public class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests
-{
- @Override
- protected XMLFilter getFilter() throws SAXException, ParserConfigurationException
- {
- final BuildPomXMLFilterFactory buildPomXMLFilterFactory = new BuildPomXMLFilterFactory()
- {
- @Override
- protected Optional getSha1()
- {
- return Optional.empty();
- }
-
- @Override
- protected Optional getRevision()
- {
- return Optional.empty();
- }
-
- @Override
- protected Optional getChangelist()
- {
- return Optional.of( "CL" );
- }
-
- @Override
- protected Function> getRelativePathMapper()
- {
- return null;
- }
-
- @Override
- protected Function getDependencyKeyToVersionMapper()
- {
- return null;
- }
- };
-
- Provider provider = new Provider()
- {
-
- @Override
- public BuildPomXMLFilterFactory get()
- {
- return buildPomXMLFilterFactory;
- }
- };
-
- XMLFilter filter = new ConsumerPomXMLFilterFactory( provider )
- {
- }.get( Paths.get( "pom.xml" ) );
- filter.setFeature( "http://xml.org/sax/features/namespaces", true );
- return filter;
- }
-
- @Test
- public void testAllFilters() throws Exception {
- String input = "\n"
- + " \n"
- + " GROUPID\n"
- + " PARENT\n"
- + " VERSION\n"
- + " ../pom.xml\n"
- + " \n"
- + " PROJECT\n"
- + " \n"
- + " ab\n"
- + " ../cd\n"
- + " \n"
- + "";
- String expected = "\n"
- + " \n"
- + " GROUPID\n"
- + " PARENT\n"
- + " VERSION\n"
- + " \n"
- + " \n"
- + " PROJECT\n"
- + "";
- String actual = transform( input );
- assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical();
- }
-
- @Test
- public void testMe() throws Exception {
- String input = "\r\n" +
- "\r\n" +
- " 4.0.0\r\n" +
- " org.sonatype.mavenbook.multispring\r\n" +
- " parent\r\n" +
- " 0.9-${changelist}-SNAPSHOT\r\n" +
- " pom\r\n" +
- " Multi-Spring Chapter Parent Project\r\n" +
- " \r\n" +
- " simple-parent\r\n" +
- " \r\n" +
- " \r\n" +
- " \r\n" +
- " \r\n" +
- " apache.snapshots\r\n" +
- " http://repository.apache.org/snapshots/\r\n" +
- " \r\n" +
- " \r\n" +
- "";
- String expected = "\r\n" +
- "\r\n" +
- " 4.0.0\r\n" +
- " org.sonatype.mavenbook.multispring\r\n" +
- " parent\r\n" +
- " 0.9-CL-SNAPSHOT\r\n" +
- " pom\r\n" +
- " Multi-Spring Chapter Parent Project\r\n" +
- " \r\n" +
- " \r\n" +
- " \r\n" +
- " apache.snapshots\r\n" +
- " http://repository.apache.org/snapshots/\r\n" +
- " \r\n" +
- " \r\n" +
- "";
- String actual = transform( input );
- assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical();
- }
-
-
-
-}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java
new file mode 100644
index 000000000000..49eb7729c6eb
--- /dev/null
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java
@@ -0,0 +1,277 @@
+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 java.util.Arrays;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Source;
+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 javax.xml.transform.stream.StreamSource;
+
+import org.apache.maven.xml.Factories;
+import org.apache.maven.xml.sax.filter.AbstractSAXFilter;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLFilter;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+/**
+ * Some tests to help understand the chain of events regarding XMLFilters, XMLReaders, LexicalHandlers and Transformers
+ *
+ * @author Robert Scholte
+ *
+ */
+public class LexicalHandlerVerifier
+{
+ private static final String SAX_PROPERTIES_LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler";
+
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
+ @Test
+ public void parseXmlReader() throws Exception
+ {
+ expectedException.expect( UnsupportedOperationException.class );
+ expectedException.expectMessage( "LexicalHandlerVerifier" );
+
+ XMLReader reader = Factories.newXMLReader();
+ reader.setProperty( SAX_PROPERTIES_LEXICAL_HANDLER, new UnsupportedOperationExceptionLexicalHandler() );
+
+ InputSource inputSource = new InputSource( new StringReader( "" ) );
+ reader.parse( inputSource );
+ }
+
+ @Test
+ public void parseXmlFilter() throws Exception
+ {
+ expectedException.expect( UnsupportedOperationException.class );
+ expectedException.expectMessage( "LexicalHandlerVerifier" );
+
+ XMLReader reader = Factories.newXMLReader();
+ reader.setProperty( SAX_PROPERTIES_LEXICAL_HANDLER, new UnsupportedOperationExceptionLexicalHandler() );
+
+ XMLFilter filter = new XMLFilterImpl( reader );
+
+ InputSource inputSource = new InputSource( new StringReader( "" ) );
+ filter.parse( inputSource );
+ }
+
+ @Test
+ public void transformXmlReader() throws Exception
+ {
+ Writer writer = new StringWriter();
+ StreamResult result = new StreamResult( writer );
+
+ SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory();
+ TransformerHandler transformerHandler = transformerFactory.newTransformerHandler();
+ transformerHandler.setResult( result );
+ Transformer transformer = transformerFactory.newTransformer();
+ transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
+
+ Source xmlSource = new StreamSource( new StringReader( "" ) );
+
+ SAXResult transformResult = new SAXResult( transformerHandler );
+ transformResult.setLexicalHandler( new SortCommentLexicalHandler( transformerHandler ) );
+ transformer.transform( xmlSource, transformResult );
+
+ assertThat( writer.toString() ).and( ""
+ + "" ).areIdentical();
+ }
+
+ @Test
+ public void transformXmlFilter() throws Exception
+ {
+ Writer writer = new StringWriter();
+ StreamResult result = new StreamResult( writer );
+
+ SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory();
+ TransformerHandler transformerHandler = transformerFactory.newTransformerHandler();
+ transformerHandler.getTransformer().setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
+ transformerHandler.setResult( result );
+ Transformer transformer = transformerFactory.newTransformer();
+
+ XMLReader reader = Factories.newXMLReader();
+ // in wrong order result will be CONNENT -->
+ AbstractSAXFilter filter2 = new M2NLexicalXMLFilter();
+ filter2.setParent( reader );
+ filter2.setLexicalHandler( transformerHandler );
+
+ AbstractSAXFilter filter1 = new N2CLexicalXMLFilter( filter2 );
+
+ SAXSource transformSource = new SAXSource( filter1, new InputSource( new StringReader( "" ) ) );
+
+ SAXResult transformResult = new SAXResult( transformerHandler );
+ transformResult.setLexicalHandler( filter1 );
+ transformer.transform( transformSource, transformResult );
+
+ assertThat( writer.toString() ).and( "" ).areIdentical();
+ }
+
+ /**
+ * A LexicalHandler that'll throw an UnsupportedOperationException on every call.
+ *
+ * @author Robert Scholte
+ */
+ static class UnsupportedOperationExceptionLexicalHandler implements LexicalHandler
+ {
+ @Override
+ public void startDTD( String name, String publicId, String systemId )
+ throws SAXException
+ {
+ throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
+ }
+
+ @Override
+ public void endDTD()
+ throws SAXException
+ {
+ throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
+ }
+
+ @Override
+ public void startEntity( String name )
+ throws SAXException
+ {
+ throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
+ }
+
+ @Override
+ public void endEntity( String name )
+ throws SAXException
+ {
+ throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
+ }
+
+ @Override
+ public void startCDATA()
+ throws SAXException
+ {
+ throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
+ }
+
+ @Override
+ public void endCDATA()
+ throws SAXException
+ {
+ throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
+ }
+
+ @Override
+ public void comment( char[] ch, int start, int length )
+ throws SAXException
+ {
+ throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
+ }
+ }
+
+ /**
+ * Sorts the comment chars,will throw an UnsupportedOperationException on every other method
+ *
+ * @author Robert Scholte
+ *
+ */
+ static class SortCommentLexicalHandler extends UnsupportedOperationExceptionLexicalHandler
+ {
+ private final LexicalHandler lexicalHandler;
+
+ public SortCommentLexicalHandler( LexicalHandler lexicalHandler )
+ {
+ this.lexicalHandler = lexicalHandler;
+ }
+
+
+ @Override
+ public void comment( char[] ch, int start, int length )
+ throws SAXException
+ {
+ char[] chars = new String( ch, start, length ).toCharArray();
+ Arrays.sort(chars);
+ lexicalHandler.comment( chars, 0, chars.length );
+ }
+ }
+
+ /**
+ * AbstractSAXFilter implements both XMLReader and LexicalHandler
+ *
+ * @author Robert Scholte
+ *
+ */
+ static class N2CLexicalXMLFilter extends AbstractSAXFilter
+ {
+ public N2CLexicalXMLFilter()
+ {
+ super( null );
+ }
+
+ public N2CLexicalXMLFilter( T parent )
+ {
+ super( parent );
+ }
+
+ @Override
+ public void comment( char[] ch, int start, int length )
+ throws SAXException
+ {
+ super.comment( new String( ch, start, length ).replace( 'N', 'C' ).toCharArray(), start, length );
+ }
+ }
+
+ /**
+ * AbstractSAXFilter implements both XMLReader and LexicalHandler
+ *
+ * @author Robert Scholte
+ *
+ */
+ static class M2NLexicalXMLFilter extends AbstractSAXFilter
+ {
+ public M2NLexicalXMLFilter()
+ {
+ super( null );
+ }
+
+ public M2NLexicalXMLFilter( T parent )
+ {
+ super( parent );
+ }
+
+ @Override
+ public void comment( char[] ch, int start, int length )
+ throws SAXException
+ {
+ super.comment( new String( ch, start, length ).replace( 'M', 'N' ).toCharArray(), start, length );
+ }
+ }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/SAXEventUtilsTest.java
similarity index 63%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
rename to maven-xml/src/test/java/org/apache/maven/xml/sax/SAXEventUtilsTest.java
index 60f0c4951d32..02e55dc5991d 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/SAXEventUtilsTest.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -19,26 +19,25 @@
* under the License.
*/
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
+import static org.junit.Assert.assertThat;
-/**
- * Filter to adjust pom on filesystem before being processed for effective pom.
- *
- * @author Robert Scholte
- * @since 3.7.0
- */
-public class BuildPomXMLFilter extends XMLFilterImpl
+import org.apache.maven.xml.sax.SAXEventUtils;
+
+import static org.hamcrest.CoreMatchers.is;
+
+import org.junit.Test;
+
+public class SAXEventUtilsTest
{
- public BuildPomXMLFilter()
+ @Test
+ public void replaceWithNamespace()
{
- super();
+ assertThat( SAXEventUtils.renameQName( "org:bar", "com" ), is( "org:com" ) );
}
- public BuildPomXMLFilter( XMLReader parent )
+ @Test
+ public void replaceWithoutNamespace()
{
- super( parent );
+ assertThat( SAXEventUtils.renameQName( "bar", "com" ), is( "com" ) );
}
-
-
}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/AbstractXMLFilterTests.java
similarity index 57%
rename from maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
rename to maven-xml/src/test/java/org/apache/maven/xml/sax/filter/AbstractXMLFilterTests.java
index 0d9b7791e398..4fa3b0d63919 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/AbstractXMLFilterTests.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -28,14 +28,17 @@
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.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.xml.sax.InputSource;
import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
+import org.xml.sax.XMLReader;
public abstract class AbstractXMLFilterTests
{
@@ -44,16 +47,26 @@ public AbstractXMLFilterTests()
super();
}
- protected abstract XMLFilter getFilter() throws TransformerException, SAXException, ParserConfigurationException;
+ protected abstract AbstractSAXFilter getFilter() throws TransformerException, SAXException, ParserConfigurationException;
- private void setParent( XMLFilter filter ) throws SAXException, ParserConfigurationException
+ private void setParent( AbstractSAXFilter filter ) throws SAXException, ParserConfigurationException
{
if( filter.getParent() == null )
{
- filter.setParent( Factories.newXMLReader() );
+ XMLReader r = Factories.newXMLReader();
+
+ filter.setParent( r );
filter.setFeature( "http://xml.org/sax/features/namespaces", true );
}
}
+
+ protected String omitXmlDeclaration() {
+ return "yes";
+ }
+
+ protected String indentAmount() {
+ return null;
+ }
protected String transform( String input )
throws TransformerException, SAXException, ParserConfigurationException
@@ -63,32 +76,43 @@ protected String transform( String input )
protected String transform( Reader input ) throws TransformerException, SAXException, ParserConfigurationException
{
- XMLFilter filter = getFilter();
+ AbstractSAXFilter filter = getFilter();
setParent( filter );
+
return transform( input, filter );
}
- protected String transform( String input, XMLFilter filter )
+ protected String transform( String input, AbstractSAXFilter filter )
throws TransformerException, SAXException, ParserConfigurationException
{
setParent( filter );
return transform( new StringReader( input ), filter );
}
- protected String transform( Reader input, XMLFilter filter )
+ protected String transform( Reader input, AbstractSAXFilter filter )
throws TransformerException, SAXException, ParserConfigurationException
{
-
Writer writer = new StringWriter();
StreamResult result = new StreamResult( writer );
- TransformerFactory transformerFactory = Factories.newTransformerFactory();
+ SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory();
+ TransformerHandler transformerHandler = transformerFactory.newTransformerHandler();
+ filter.setLexicalHandler( transformerHandler );
+ 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() );
+ }
+ transformerHandler.setResult( result );
Transformer transformer = transformerFactory.newTransformer();
- transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
SAXSource transformSource = new SAXSource( filter, new InputSource( input ) );
- transformer.transform( transformSource, result );
+ SAXResult transformResult = new SAXResult( transformerHandler );
+ transformResult.setLexicalHandler( filter );
+ transformer.transform( transformSource, transformResult );
return writer.toString();
}
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
new file mode 100644
index 000000000000..50abfc8ff0dd
--- /dev/null
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ConsumerPomXMLFilterTest.java
@@ -0,0 +1,252 @@
+package org.apache.maven.xml.sax.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 java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Optional;
+import java.util.function.Function;
+
+import javax.inject.Provider;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerConfigurationException;
+
+import org.apache.maven.xml.sax.filter.AbstractSAXFilter;
+import org.apache.maven.xml.sax.filter.BuildPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.ConsumerPomXMLFilter;
+import org.apache.maven.xml.sax.filter.ConsumerPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.DependencyKey;
+import org.apache.maven.xml.sax.filter.RelativeProject;
+import org.junit.Test;
+import org.xml.sax.SAXException;
+
+public class ConsumerPomXMLFilterTest extends AbstractXMLFilterTests
+{
+ @Override
+ protected String omitXmlDeclaration()
+ {
+ return "no";
+ }
+
+ @Override
+ protected AbstractSAXFilter getFilter() throws SAXException, ParserConfigurationException, TransformerConfigurationException
+ {
+ final BuildPomXMLFilterFactory buildPomXMLFilterFactory = new BuildPomXMLFilterFactory()
+ {
+ @Override
+ protected Optional getSha1()
+ {
+ return Optional.empty();
+ }
+
+ @Override
+ protected Optional getRevision()
+ {
+ return Optional.empty();
+ }
+
+ @Override
+ protected Optional getChangelist()
+ {
+ return Optional.of( "CL" );
+ }
+
+ @Override
+ protected Function> getRelativePathMapper()
+ {
+ return null;
+ }
+
+ @Override
+ protected Function getDependencyKeyToVersionMapper()
+ {
+ return null;
+ }
+ };
+
+ Provider provider = new Provider()
+ {
+
+ @Override
+ public BuildPomXMLFilterFactory get()
+ {
+ return buildPomXMLFilterFactory;
+ }
+ };
+
+ ConsumerPomXMLFilter filter = new ConsumerPomXMLFilterFactory( provider )
+ {
+ }.get( Paths.get( "pom.xml" ) );
+ filter.setFeature( "http://xml.org/sax/features/namespaces", true );
+ return filter;
+ }
+
+ @Test
+ public void aggregatorWithParent() throws Exception {
+ String input = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " ../pom.xml\n"
+ + " \n"
+ + " PROJECT\n"
+ + " \n"
+ + " ab\n"
+ + " ../cd\n"
+ + " \n"
+ + "";
+ String expected = "\n"
+ + " \n"
+ + " GROUPID\n"
+ + " PARENT\n"
+ + " VERSION\n"
+ + " \n"
+ + " PROJECT\n"
+ + "";
+ String actual = transform( input );
+ assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical();
+ }
+
+ @Test
+ public void aggregatorWithCliFriendlyVersion() throws Exception {
+ String input = "\n" +
+ "\n" +
+ " 4.0.0\n" +
+ " org.sonatype.mavenbook.multispring\n" +
+ " parent\n" +
+ " 0.9-${changelist}-SNAPSHOT\n" +
+ " pom\n" +
+ " Multi-Spring Chapter Parent Project\n" +
+ " \n" +
+ " simple-parent\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " apache.snapshots\n" +
+ " http://repository.apache.org/snapshots/\n" +
+ " \n" +
+ " \n" +
+ "";
+ String expected = "\n" +
+ "\n" +
+ " 4.0.0\n" +
+ " org.sonatype.mavenbook.multispring\n" +
+ " parent\n" +
+ " 0.9-CL-SNAPSHOT\n" +
+ " pom\n" +
+ " Multi-Spring Chapter Parent Project\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " apache.snapshots\n" +
+ " http://repository.apache.org/snapshots/\n" +
+ " \n" +
+ " \n" +
+ "";
+ String actual = transform( input );
+ assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical();
+ }
+
+ @Test
+ public void licenseHeader() throws Exception {
+ String input = "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ " 4.0.0\n" +
+ " \n" +
+ " org.apache.maven\n" +
+ " maven\n" +
+ " 3.7.0-SNAPSHOT\n" +
+ " \n" +
+ " maven-xml\n" +
+ " Maven XML\n" +
+ " \n" +
+ " \n" +
+ " 1.8\n" +
+ " 1.8\n" +
+ " \n" +
+ "\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " org.codehaus.mojo\n" +
+ " animal-sniffer-maven-plugin\n" +
+ " \n" +
+ " \n" +
+ " org.codehaus.mojo.signature\n" +
+ " java18\n" +
+ " 1.0\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " javax.inject\n" +
+ " javax.inject\n" +
+ " true\n" +
+ " \n" +
+ " \n" +
+ " org.xmlunit\n" +
+ " xmlunit-assertj\n" +
+ " test\n" +
+ " \n" +
+ " \n" +
+ "";
+ String expected = input;
+
+ String actual = transform( input );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
+
+}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ModulesXMLFilterTest.java
similarity index 67%
rename from maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ModulesXMLFilterTest.java
index 63880ed27008..a3477dfffc71 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ModulesXMLFilterTest.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -21,32 +21,19 @@
import static org.xmlunit.assertj.XmlAssert.assertThat;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.junit.Before;
+import org.apache.maven.xml.sax.filter.ModulesXMLFilter;
import org.junit.Test;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.XMLReader;
public class ModulesXMLFilterTest extends AbstractXMLFilterTests {
- private ModulesXMLFilter filter;
-
@Override
- protected XMLFilter getFilter()
+ protected ModulesXMLFilter getFilter()
{
return new ModulesXMLFilter();
}
- @Before
- public void setup() throws Exception {
- XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
- filter = new ModulesXMLFilter( xmlReader );
- filter.setFeature( "http://xml.org/sax/features/namespaces", true );
- }
-
@Test
- public void testEmptyModules() throws Exception {
+ public void emptyModules() throws Exception {
String input = "";
String expected = "";
String actual = transform( input );
@@ -54,7 +41,7 @@ public void testEmptyModules() throws Exception {
}
@Test
- public void testSetOfModules() throws Exception {
+ public void setOfModules() throws Exception {
String input = ""
+ "ab"
+ "../cd"
@@ -65,10 +52,25 @@ public void testSetOfModules() throws Exception {
}
@Test
- public void testNoModules() throws Exception {
+ public void noModules() throws Exception {
String input = "NAME";
String expected = input;
String actual = transform( input );
assertThat( actual ).and( expected ).areIdentical();
}
+
+ @Test
+ public void comment() throws Exception {
+
+ String input = ""
+ + ""
+ + "ab"
+ + "../cd"
+ + ""
+ + ""
+ + "";
+ String expected = "";
+ String actual = transform( input );
+ assertThat( actual ).and( expected ).areIdentical();
+ }
}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ParentXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java
similarity index 86%
rename from maven-xml/src/test/java/org/apache/maven/xml/filter/ParentXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java
index aa70b0db9a97..8f25c102b371 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ParentXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ParentXMLFilterTest.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -27,14 +27,15 @@
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.XMLFilter;
public class ParentXMLFilterTest extends AbstractXMLFilterTests
{
@Override
- protected XMLFilter getFilter()
+ protected ParentXMLFilter getFilter()
throws TransformerException, SAXException, ParserConfigurationException
{
ParentXMLFilter filter = new ParentXMLFilter( x -> Optional.of( new RelativeProject( "GROUPID",
@@ -162,24 +163,27 @@ public void testWithWeirdNamespace() throws Exception
assertEquals( expected, actual );
}
-
@Test
- public void testIndent() throws Exception
+ public void comment() throws Exception
{
- String input = "\n"
- + " GROUPID\n"
- + " ARTIFACTID\n"
- + " ";
- // transformer is responsible for line separator and indents
- String expected = "" + System.lineSeparator()
- + " GROUPID" + System.lineSeparator()
- + " ARTIFACTID" + System.lineSeparator()
- + " 1.0.0" + System.lineSeparator()
- + "";
+ String input = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + ""
+ + ""
+ + "";
+ String expected = ""
+ + "GROUPID"
+ + "ARTIFACTID"
+ + ""
+ + "1.0.0"
+ + ""
+ + "";
String actual = transform( input );
assertEquals( expected, actual );
}
+
}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilterTest.java
similarity index 66%
rename from maven-xml/src/test/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilterTest.java
index 6a5998ed7ac6..9cf713c40ff7 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/ReactorDependencyXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/ReactorDependencyXMLFilterTest.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -19,19 +19,19 @@
* under the License.
*/
-import static org.junit.Assert.*;
+import static org.xmlunit.assertj.XmlAssert.*;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
+import org.apache.maven.xml.sax.filter.ReactorDependencyXMLFilter;
import org.junit.Test;
import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
public class ReactorDependencyXMLFilterTest extends AbstractXMLFilterTests
{
@Override
- protected XMLFilter getFilter()
+ protected ReactorDependencyXMLFilter getFilter()
throws TransformerException, SAXException, ParserConfigurationException
{
return new ReactorDependencyXMLFilter( r -> "1.0.0" );
@@ -49,13 +49,13 @@ public void testDefaultDependency() throws Exception
String actual = transform( input );
- assertEquals( expected, actual );
+ assertThat( actual ).isEqualTo( expected );
}
@Test
public void testManagedDependency() throws Exception
{
- XMLFilter filter = new ReactorDependencyXMLFilter( r -> null );
+ ReactorDependencyXMLFilter filter = new ReactorDependencyXMLFilter( r -> null );
String input = ""
+ "GROUPID"
@@ -65,7 +65,7 @@ public void testManagedDependency() throws Exception
String actual = transform( input, filter );
- assertEquals( expected, actual );
+ assertThat( actual ).isEqualTo( expected );
}
@Test
@@ -83,7 +83,27 @@ public void testReactorDependency() throws Exception
String actual = transform( input );
- assertEquals( expected, actual );
+ assertThat( actual ).isEqualTo( expected );
+ }
+
+ @Test
+ public void testReactorDependencyLF() throws Exception
+ {
+ String input = "\n"
+ + " GROUPID\n"
+ + " ARTIFACTID\n"
+ + " "
+ + "";
+ String expected = "\n"
+ + " GROUPID\n"
+ + " ARTIFACTID\n"
+ + " \n"
+ + " 1.0.0\n"
+ + "";
+
+ String actual = transform( input );
+
+ assertThat( actual ).and( expected ).ignoreWhitespace().areIdentical();
}
}
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/RelativePathXMLFilterTest.java
similarity index 95%
rename from maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/sax/filter/RelativePathXMLFilterTest.java
index 1fed1cadf500..00655b38f721 100644
--- a/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
+++ b/maven-xml/src/test/java/org/apache/maven/xml/sax/filter/RelativePathXMLFilterTest.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml.sax.filter;
/*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -21,13 +21,13 @@
import static org.xmlunit.assertj.XmlAssert.assertThat;
+import org.apache.maven.xml.sax.filter.RelativePathXMLFilter;
import org.junit.Test;
-import org.xml.sax.XMLFilter;
public class RelativePathXMLFilterTest extends AbstractXMLFilterTests
{
@Override
- protected XMLFilter getFilter()
+ protected RelativePathXMLFilter getFilter()
{
return new RelativePathXMLFilter();
}
@@ -49,7 +49,6 @@ public void testRelativePath() throws Exception
+ " GROUPID\n"
+ " PARENT\n"
+ " VERSION\n"
- + " \n"
+ " \n"
+ " PROJECT\n"
+ "";
@@ -78,7 +77,6 @@ public void testRelativePathNS() throws Exception
+ " GROUPID\n"
+ " PARENT\n"
+ " VERSION\n"
- + " \n"
+ " \n"
+ " PROJECT\n"
+ "
* Transforms relativePath to version.
* We could decide to simply allow {@code }, but let's require the GA for now for checking
+ * This filter does NOT remove the relativePath (which is done by {@link RelativePathXMLFilter}, it will only
+ * optionally include the version based on the path
*
*
* @author Robert Scholte
@@ -87,12 +89,6 @@ protected String getState()
{
return state;
}
-
- @Override
- protected boolean acceptEvent( String eventState )
- {
- return !( "relativePath".equals( eventState ) && resolvedParent.isPresent() );
- }
@Override
public void startElement( String uri, final String localName, String qName, Attributes atts )
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 8f25c102b371..f98f4ddbed7d 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
@@ -99,6 +99,7 @@ public void testNoVersion() throws Exception
String expected = ""
+ "GROUPID"
+ "ARTIFACTID"
+ + "RELATIVEPATH"
+ "1.0.0"
+ "";
@@ -137,6 +138,7 @@ public void testRelativePathAndVersion() throws Exception
String expected = ""
+ "GROUPID"
+ "ARTIFACTID"
+ + "RELATIVEPATH"
+ "1.0.0"
+ "";
@@ -156,6 +158,7 @@ public void testWithWeirdNamespace() throws Exception
String expected = ""
+ "GROUPID"
+ "ARTIFACTID"
+ + "RELATIVEPATH"
+ "1.0.0"
+ "";
From 3ef3fa1dab989f9ccf4f52601d13c5624ebb9429 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Wed, 16 Oct 2019 22:56:37 +0200
Subject: [PATCH 21/52] [MNG-6656] Clean up code based on reviews
---
.../maven/project/DefaultProjectBuilder.java | 2 -
.../model/building/DefaultModelBuilder.java | 56 ++++++++++++-------
.../building/DefaultModelBuilderFactory.java | 2 +
.../building/DefaultModelBuildingRequest.java | 17 ------
.../building/FilterModelBuildingRequest.java | 13 -----
.../model/building/ModelBuildingRequest.java | 4 --
.../apache/maven/xml/sax/SAXEventUtils.java | 6 +-
.../sax/filter/AbstractEventXMLFilter.java | 8 ---
.../xml/sax/filter/BuildPomXMLFilter.java | 3 +
.../sax/filter/BuildPomXMLFilterFactory.java | 31 +++++++---
.../sax/filter/BuildPomXMLFilterListener.java | 40 +++++++++++++
11 files changed, 110 insertions(+), 72 deletions(-)
create mode 100644 maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java
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 ce6c9dced9e9..7e18f1ef3ce2 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
@@ -164,7 +164,6 @@ private ProjectBuildingResult build( File pomFile, ModelSource modelSource, Inte
request.setModelBuildingListener( listener );
request.setPomFile( pomFile );
- request.setTransformPom( pomFile != null );
request.setModelSource( modelSource );
request.setLocationTracking( true );
@@ -438,7 +437,6 @@ private boolean build( List results, List
request.setPomFile( pomFile );
request.setTwoPhaseBuilding( true );
request.setLocationTracking( true );
- request.setTransformPom( true );
DefaultModelBuildingListener listener =
new DefaultModelBuildingListener( project, projectBuildingHelper, config.request );
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index fe3904b4b4d0..0e50073f75b1 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -27,8 +27,10 @@
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -91,6 +93,7 @@
import org.apache.maven.model.validation.ModelValidator;
import org.apache.maven.xml.Factories;
import org.apache.maven.xml.sax.filter.BuildPomXMLFilterFactory;
+import org.apache.maven.xml.sax.filter.BuildPomXMLFilterListener;
import org.codehaus.plexus.interpolation.MapBasedValueSource;
import org.codehaus.plexus.interpolation.StringSearchInterpolator;
import org.eclipse.sisu.Nullable;
@@ -156,13 +159,17 @@ public class DefaultModelBuilder
@Inject
private ReportingConverter reportingConverter;
+ // Using provider so MavenSession can be used in the constructor
@Inject
- @Nullable
private Provider buildPomXMLFilterFactory;
@Inject
@Nullable
private ModelCacheManager modelCacheManager;
+
+ @Inject
+ @Nullable
+ private BuildPomXMLFilterListener xmlFilterListener;
public DefaultModelBuilder setModelProcessor( ModelProcessor modelProcessor )
{
@@ -265,6 +272,12 @@ public DefaultModelBuilder setReportingConverter( ReportingConverter reportingCo
this.reportingConverter = reportingConverter;
return this;
}
+
+ public DefaultModelBuilder setBuildPomXMLFilterFactory( BuildPomXMLFilterFactory buildPomXMLFilterFactory )
+ {
+ this.buildPomXMLFilterFactory = () -> buildPomXMLFilterFactory;
+ return this;
+ }
@SuppressWarnings( "checkstyle:methodlength" )
@Override
@@ -302,11 +315,11 @@ public ModelBuildingResult build( ModelBuildingRequest request )
{
inputModel = readModel( request.getModelSource(), request.getPomFile(), request, problems );
- if ( Features.buildConsumer().isActive() && request.isTransformPom() )
+ if ( Features.buildConsumer().isActive() && request.getPomFile() != null )
{
try
{
- inputModel = modelProcessor.read( transformData( request.getPomFile() ), null );
+ inputModel = modelProcessor.read( transformData( request.getPomFile().toPath() ), null );
inputModel.setPomFile( request.getPomFile() );
}
@@ -782,36 +795,41 @@ private void assembleInheritance( List lineage, ModelBuildingRequest
}
}
- private InputStream transformData( File pomFile )
+ private InputStream transformData( final Path pomFile )
throws IOException, TransformerException, SAXException, ParserConfigurationException
{
-// return modelData.getSource().getInputStream();
final TransformerFactory transformerFactory = Factories.newTransformerFactory() ;
final PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream );
// Should always be FileSource for reactor poms
-// FileSource source = (FileSource) modelData.getSource();
-
-// System.out.println( "transforming " + source.getFile() );
+ // System.out.println( "transforming " + pomFile );
final SAXSource transformSource =
- new SAXSource( buildPomXMLFilterFactory.get().get( pomFile.toPath() ),
- new org.xml.sax.InputSource( new FileInputStream( pomFile ) ) );
+ new SAXSource( buildPomXMLFilterFactory.get().get( pomFile ),
+ new org.xml.sax.InputSource( new FileInputStream( pomFile.toFile() ) ) );
- FilterOutputStream fos = new FilterOutputStream( pipedOutputStream )
+ OutputStream out;
+ if ( xmlFilterListener != null )
{
- @Override
- public void write( byte[] b, int off, int len )
- throws IOException
+ out = new FilterOutputStream( pipedOutputStream )
{
- System.out.write( b, off, len );
- super.write( b, off, len );
- }
+ @Override
+ public void write( byte[] b, int off, int len )
+ throws IOException
+ {
+ super.write( b, off, len );
+ xmlFilterListener.write( pomFile, b, off, len );
+ }
+ };
}
- ;
- final StreamResult result = new StreamResult( fos );
+ else
+ {
+ out = pipedOutputStream;
+ }
+
+ final StreamResult result = new StreamResult( out );
//// final Callable callable = () ->
//// {
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java
index 4240574ff214..cd499ebc49d1 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java
@@ -64,6 +64,7 @@
import org.apache.maven.model.superpom.SuperPomProvider;
import org.apache.maven.model.validation.DefaultModelValidator;
import org.apache.maven.model.validation.ModelValidator;
+import org.apache.maven.xml.sax.filter.BuildPomXMLFilterFactory;
/**
* A factory to create model builder instances when no dependency injection is available. Note: This class is
@@ -225,6 +226,7 @@ public DefaultModelBuilder newInstance()
modelBuilder.setPluginConfigurationExpander( newPluginConfigurationExpander() );
modelBuilder.setReportConfigurationExpander( newReportConfigurationExpander() );
modelBuilder.setReportingConverter( newReportingConverter() );
+ modelBuilder.setBuildPomXMLFilterFactory( new BuildPomXMLFilterFactory() );
return modelBuilder;
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
index 06128a8ec64c..b7b54d8d0a79 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
@@ -72,8 +72,6 @@ public class DefaultModelBuildingRequest
private ModelCache modelCache;
private WorkspaceModelResolver workspaceResolver;
-
- private boolean transformPom;
/**
* Creates an empty request.
@@ -103,7 +101,6 @@ public DefaultModelBuildingRequest( ModelBuildingRequest request )
setModelResolver( request.getModelResolver() );
setModelBuildingListener( request.getModelBuildingListener() );
setModelCache( request.getModelCache() );
- setTransformPom( request.isTransformPom() );
}
@Override
@@ -410,18 +407,4 @@ public ModelBuildingRequest setWorkspaceModelResolver( WorkspaceModelResolver wo
this.workspaceResolver = workspaceResolver;
return this;
}
-
- @Override
- public boolean isTransformPom()
- {
- return transformPom;
- }
-
- @Override
- public ModelBuildingRequest setTransformPom( boolean transformPom )
- {
- this.transformPom = transformPom;
- return this;
- }
-
}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
index a9012a176030..527a257a6d17 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
@@ -281,17 +281,4 @@ public ModelBuildingRequest setWorkspaceModelResolver( WorkspaceModelResolver wo
request.setWorkspaceModelResolver( workspaceResolver );
return this;
}
-
- @Override
- public boolean isTransformPom()
- {
- return request.isTransformPom();
- }
-
- @Override
- public ModelBuildingRequest setTransformPom( boolean transform )
- {
- request.setTransformPom( transform );
- return this;
- }
}
\ No newline at end of file
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
index 10aedc103e65..b8ae4f8a398c 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
@@ -334,8 +334,4 @@ public interface ModelBuildingRequest
WorkspaceModelResolver getWorkspaceModelResolver();
ModelBuildingRequest setWorkspaceModelResolver( WorkspaceModelResolver workspaceResolver );
-
- boolean isTransformPom();
-
- ModelBuildingRequest setTransformPom( boolean transform );
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventUtils.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventUtils.java
index 483bb7d8b7fc..237ec44cb3a6 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventUtils.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/SAXEventUtils.java
@@ -19,6 +19,8 @@
* under the License.
*/
+import java.util.regex.Pattern;
+
/**
* Utility class for SAXEvents
*
@@ -27,6 +29,8 @@
*/
public final class SAXEventUtils
{
+ private static final Pattern PATTERN = Pattern.compile( "[^:]+$" );
+
private SAXEventUtils()
{
}
@@ -40,6 +44,6 @@ private SAXEventUtils()
*/
public static String renameQName( String oldQName, String newLocalName )
{
- return oldQName.replaceFirst( "[^:]+$", newLocalName );
+ return PATTERN.matcher( oldQName ).replaceFirst( newLocalName );
}
}
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 e56303242adf..f718103b7080 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
@@ -60,14 +60,6 @@ protected boolean acceptEvent( String state )
return true;
}
-// protected final void applyCharacters() throws SAXException
-// {
-// if ( characters != null )
-// {
-// processEvent( characters );
-// }
-// }
-
AbstractEventXMLFilter()
{
super();
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilter.java
index 041d5c18bccf..14bcf704e384 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilter.java
@@ -44,6 +44,9 @@ BuildPomXMLFilter( T parent )
super( parent );
}
+ /**
+ * Don't allow overwriting parent
+ */
@Override
public final void setParent( XMLReader parent )
{
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 d1156739e251..66c5fc942d25 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
@@ -41,7 +41,7 @@
*
* @since 3.7.0
*/
-public abstract class BuildPomXMLFilterFactory
+public class BuildPomXMLFilterFactory
{
public final BuildPomXMLFilter get( Path projectFile )
throws SAXException, ParserConfigurationException, TransformerConfigurationException
@@ -83,14 +83,14 @@ public final BuildPomXMLFilter get( Path projectFile )
return new BuildPomXMLFilter( parent );
}
- protected XMLReader getXMLReader() throws SAXException, ParserConfigurationException
+ private XMLReader getXMLReader() throws SAXException, ParserConfigurationException
{
XMLReader xmlReader = Factories.newXMLReader();
xmlReader.setFeature( "http://xml.org/sax/features/namespaces", true );
return xmlReader;
}
- protected LexicalHandler getLexicalHander() throws TransformerConfigurationException
+ private LexicalHandler getLexicalHander() throws TransformerConfigurationException
{
TransformerFactory transformerFactory = Factories.newTransformerFactory();
if ( transformerFactory instanceof SAXTransformerFactory )
@@ -104,16 +104,31 @@ protected LexicalHandler getLexicalHander() throws TransformerConfigurationExcep
// getters for the 3 magic properties of CIFriendly versions ( https://maven.apache.org/maven-ci-friendly.html )
- protected abstract Optional getChangelist();
+ protected Optional getChangelist()
+ {
+ return Optional.empty();
+ }
- protected abstract Optional getRevision();
+ protected Optional getRevision()
+ {
+ return Optional.empty();
+ }
- protected abstract Optional getSha1();
+ protected Optional getSha1()
+ {
+ return Optional.empty();
+ }
/**
* @return the mapper or {@code null} if relativePaths don't need to be mapped
*/
- protected abstract Function> getRelativePathMapper();
+ protected Function> getRelativePathMapper()
+ {
+ return null;
+ }
- protected abstract Function getDependencyKeyToVersionMapper();
+ protected Function getDependencyKeyToVersionMapper()
+ {
+ return null;
+ }
}
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java
new file mode 100644
index 000000000000..e984640594d0
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java
@@ -0,0 +1,40 @@
+package org.apache.maven.xml.sax.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.nio.file.Path;
+
+/**
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public interface BuildPomXMLFilterListener
+{
+ /**
+ * Captures the result of the XML transformation
+ *
+ * @param pomFile the original to being transformed
+ * @param b the byte array
+ * @param off the offset
+ * @param len the length
+ */
+ void write( Path pomFile, byte[] b, int off, int len );
+}
From 729c93c6154fbf0d852ebd89613e3be1bd9c20f3 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 19 Oct 2019 14:08:10 +0200
Subject: [PATCH 22/52] [MNG-6656] Fix deadlock
---
...DefaultRepositorySystemSessionFactory.java | 23 +++++++------------
1 file changed, 8 insertions(+), 15 deletions(-)
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 94b2e353de3d..526ed011d092 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
@@ -31,8 +31,6 @@
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -41,6 +39,7 @@
import javax.inject.Provider;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
@@ -311,24 +310,18 @@ public InputStream transformData( File file )
final StreamResult result = new StreamResult( pipedOutputStream );
- final Callable callable = () ->
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ executorService.execute( () ->
{
try ( PipedOutputStream out = pipedOutputStream )
{
transformerFactory.newTransformer().transform( transformSource, result );
}
- return null;
- };
-
- ExecutorService executorService = Executors.newSingleThreadExecutor();
- try
- {
- executorService.submit( callable ).get();
- }
- catch ( InterruptedException | ExecutionException e )
- {
- throw new TransformException( "Failed to transform pom", e );
- }
+ catch ( TransformerException | IOException e )
+ {
+ throw new RuntimeException( e );
+ }
+ } );
return pipedInputStream;
}
From 61a3761537df98839c28a47b388b7e467ad242e4 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Mon, 25 Nov 2019 08:30:40 +0100
Subject: [PATCH 23/52] [MNG-6656] Move post-processing of file to rawmodel to
proper method
---
.../model/building/DefaultModelBuilder.java | 28 +++++++++----------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 0e50073f75b1..deb790e9e207 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -314,20 +314,6 @@ public ModelBuildingResult build( ModelBuildingRequest request )
if ( inputModel == null )
{
inputModel = readModel( request.getModelSource(), request.getPomFile(), request, problems );
-
- if ( Features.buildConsumer().isActive() && request.getPomFile() != null )
- {
- try
- {
- inputModel = modelProcessor.read( transformData( request.getPomFile().toPath() ), null );
-
- inputModel.setPomFile( request.getPomFile() );
- }
- catch ( IOException | TransformerException | SAXException | ParserConfigurationException e )
- {
- problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V37 ).setException( e ) );
- }
- }
}
problems.setRootModel( inputModel );
@@ -680,6 +666,20 @@ private Model readModel( ModelSource modelSource, File pomFile, ModelBuildingReq
{
throw problems.newModelBuildingException();
}
+
+ if ( Features.buildConsumer().isActive() && pomFile != null )
+ {
+ try
+ {
+ model = modelProcessor.read( transformData( pomFile.toPath() ), null );
+
+ model.setPomFile( pomFile );
+ }
+ catch ( IOException | TransformerException | SAXException | ParserConfigurationException e )
+ {
+ problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V37 ).setException( e ) );
+ }
+ }
return model;
}
From 21be0b1f8c781ec2600c7e85816c94f2dd249e2e Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Fri, 29 Nov 2019 10:20:43 +0100
Subject: [PATCH 24/52] [MNG-6656] Don't post-process when model has errors
---
.../org/apache/maven/model/building/DefaultModelBuilder.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index deb790e9e207..8a46aed04c26 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -667,7 +667,7 @@ private Model readModel( ModelSource modelSource, File pomFile, ModelBuildingReq
throw problems.newModelBuildingException();
}
- if ( Features.buildConsumer().isActive() && pomFile != null )
+ if ( !hasModelErrors( problems ) && Features.buildConsumer().isActive() && pomFile != null )
{
try
{
From d373d3a3d4419c0e15a8c37f28a92f3920fc61f6 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Fri, 13 Dec 2019 15:10:01 +0100
Subject: [PATCH 25/52] MNG-6656: Keep xml version + encoding after
transformation
---
...DefaultRepositorySystemSessionFactory.java | 82 +++++++++++++++++--
1 file changed, 73 insertions(+), 9 deletions(-)
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 526ed011d092..77581d6068b2 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
@@ -20,7 +20,8 @@
*/
import java.io.File;
-import java.io.FileReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PipedInputStream;
@@ -38,10 +39,18 @@
import javax.inject.Named;
import javax.inject.Provider;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.FactoryConfigurationError;
+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.TransformerException;
-import javax.xml.transform.TransformerFactory;
+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.RepositoryUtils;
@@ -59,6 +68,7 @@
import org.apache.maven.settings.crypto.SettingsDecrypter;
import org.apache.maven.settings.crypto.SettingsDecryptionResult;
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.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.logging.Logger;
@@ -285,8 +295,9 @@ public Collection getTransformersForArtifact( final Artifact ar
Collection transformers = new ArrayList<>();
if ( "pom".equals( artifact.getExtension() ) )
{
- final TransformerFactory transformerFactory = Factories.newTransformerFactory();
-
+ final SAXTransformerFactory transformerFactory =
+ (SAXTransformerFactory) Factories.newTransformerFactory();
+
transformers.add( new FileTransformer()
{
@Override
@@ -296,26 +307,33 @@ public InputStream transformData( File file )
final PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream pipedInputStream = new PipedInputStream( pipedOutputStream );
+ final TransformerHandler transformerHandler =
+ getTransformerHandler( transformerFactory, file );
+
final SAXSource transformSource;
try
{
+ AbstractSAXFilter filter = consumerPomXMLFilterFactory.get().get( file.toPath() );
+ filter.setLexicalHandler( transformerHandler );
+
transformSource =
- new SAXSource( consumerPomXMLFilterFactory.get().get( file.toPath() ),
- new InputSource( new FileReader( file ) ) );
+ new SAXSource( filter, new InputSource( new FileInputStream( file ) ) );
}
catch ( SAXException | ParserConfigurationException | TransformerConfigurationException e )
{
throw new TransformException( "Failed to create a consumerPomXMLFilter", e );
}
- final StreamResult result = new StreamResult( pipedOutputStream );
+ transformerHandler.setResult( new StreamResult( pipedOutputStream ) );
+
+ SAXResult transformResult = new SAXResult( transformerHandler );
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute( () ->
{
try ( PipedOutputStream out = pipedOutputStream )
{
- transformerFactory.newTransformer().transform( transformSource, result );
+ transformerFactory.newTransformer().transform( transformSource, transformResult );
}
catch ( TransformerException | IOException e )
{
@@ -325,7 +343,7 @@ public InputStream transformData( File file )
return pipedInputStream;
}
-
+
@Override
public Artifact transformArtifact( Artifact artifact )
{
@@ -338,6 +356,52 @@ public Artifact transformArtifact( Artifact artifact )
};
}
+ private static TransformerHandler getTransformerHandler( SAXTransformerFactory transformerFactory,
+ File file )
+ throws IOException, FileNotFoundException, TransformException
+ {
+ final TransformerHandler transformerHandler;
+
+ // Keep same encoding+version
+ try ( FileInputStream input = new FileInputStream( file ) )
+ {
+ 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
+ | FactoryConfigurationError
+ | TransformerConfigurationException e )
+ {
+ throw new TransformException( "Failed to detect XML encoding and version", e );
+ }
+ return transformerHandler;
+ }
+
+
private String getUserAgent()
{
return "Apache-Maven/" + getMavenVersion() + " (Java " + System.getProperty( "java.version" ) + "; "
From d9cc0e475952bc88f1187e00a0f0ff142f4c6f2a Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Wed, 18 Dec 2019 23:00:34 +0100
Subject: [PATCH 26/52] [MNG-6656] Improve ModelValidator
---
.../maven/project/ProjectBuilderTest.java | 2 ++
.../model/building/DefaultModelBuilder.java | 4 +++
.../building/DefaultModelBuildingRequest.java | 14 +++++++++
.../building/FilterModelBuildingRequest.java | 13 ++++++++
.../model/building/ModelBuildingRequest.java | 15 +++++++++
.../validation/DefaultModelValidator.java | 31 ++++++++++++++-----
.../model/validation/ModelValidator.java | 16 ++++++++--
.../validation/DefaultModelValidatorTest.java | 31 ++++++++++---------
8 files changed, 101 insertions(+), 25 deletions(-)
diff --git a/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java b/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
index efa8a4ca1d70..d402f96cf0d3 100644
--- a/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
+++ b/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
@@ -240,6 +240,7 @@ public void testReadInvalidPom()
try
{
projectBuilder.build( pomFile, configuration );
+ fail();
}
catch ( InvalidArtifactRTException iarte )
{
@@ -250,6 +251,7 @@ public void testReadInvalidPom()
try
{
projectBuilder.build( Collections.singletonList( pomFile ), false, configuration );
+ fail();
}
catch ( ProjectBuildingException ex )
{
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 8a46aed04c26..5bfe617f9258 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -660,6 +660,10 @@ private Model readModel( ModelSource modelSource, File pomFile, ModelBuildingReq
model.setPomFile( pomFile );
problems.setSource( model );
+
+ modelValidator.validateFileModel( model, request, problems );
+ request.setFileModel( model );
+
modelValidator.validateRawModel( model, request, problems );
if ( hasFatalErrors( problems ) )
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
index b7b54d8d0a79..3cf3a896ad01 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
@@ -38,6 +38,7 @@
public class DefaultModelBuildingRequest
implements ModelBuildingRequest
{
+ private transient Model fileModel;
private Model rawModel;
@@ -382,6 +383,19 @@ public DefaultModelBuildingRequest setModelCache( ModelCache modelCache )
return this;
}
+ @Override
+ public Model getFileModel()
+ {
+ return fileModel;
+ }
+
+ @Override
+ public ModelBuildingRequest setFileModel( Model fileModel )
+ {
+ this.fileModel = fileModel;
+ return this;
+ }
+
@Override
public Model getRawModel()
{
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
index 527a257a6d17..fb38f167232b 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java
@@ -256,6 +256,19 @@ public FilterModelBuildingRequest setModelCache( ModelCache modelCache )
return this;
}
+ @Override
+ public Model getFileModel()
+ {
+ return request.getFileModel();
+ }
+
+ @Override
+ public ModelBuildingRequest setFileModel( Model fileModel )
+ {
+ request.setFileModel( fileModel );
+ return this;
+ }
+
@Override
public Model getRawModel()
{
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
index b8ae4f8a398c..1e0b3dad60af 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java
@@ -63,6 +63,21 @@ public interface ModelBuildingRequest
* Denotes strict validation as recommended by the current Maven version.
*/
int VALIDATION_LEVEL_STRICT = VALIDATION_LEVEL_MAVEN_3_0;
+
+ /**
+ *
+ * @return the file model
+ * @since 3.7.0
+ */
+ Model getFileModel();
+
+ /**
+ *
+ * @param fileModel
+ * @return This request, never {@code null}.
+ * @since 3.7.0
+ */
+ ModelBuildingRequest setFileModel( Model fileModel );
/**
* Gets the raw model to build. If not set, model source will be used to load raw model.
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
index 86670eb47f11..862c8ecf7b86 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
@@ -88,7 +88,7 @@ public class DefaultModelValidator
private final Set validIds = new HashSet<>();
@Override
- public void validateRawModel( Model m, ModelBuildingRequest request, ModelProblemCollector problems )
+ public void validateFileModel( Model m, ModelBuildingRequest request, ModelProblemCollector problems )
{
Parent parent = m.getParent();
if ( parent != null )
@@ -99,13 +99,6 @@ public void validateRawModel( Model m, ModelBuildingRequest request, ModelProble
validateStringNotEmpty( "parent.artifactId", problems, Severity.FATAL, Version.BASE, parent.getArtifactId(),
parent );
- // resolvedModel will assign version based on relativePath
- if ( !Features.buildConsumer().isActive() )
- {
- validateStringNotEmpty( "parent.version", problems, Severity.FATAL, Version.BASE, parent.getVersion(),
- parent );
- }
-
if ( equals( parent.getGroupId(), m.getGroupId() ) && equals( parent.getArtifactId(), m.getArtifactId() ) )
{
addViolation( problems, Severity.FATAL, Version.BASE, "parent.artifactId", null,
@@ -225,6 +218,28 @@ public void validateRawModel( Model m, ModelBuildingRequest request, ModelProble
}
}
}
+
+ @Override
+ public void validateRawModel( Model m, ModelBuildingRequest request, ModelProblemCollector problems )
+ {
+ Parent parent = m.getParent();
+
+ if ( parent != null )
+ {
+ InputLocationTracker locationTracker;
+ if ( Features.buildConsumer().isActive() )
+ {
+ locationTracker = request.getFileModel().getParent();
+ }
+ else
+ {
+ locationTracker = parent;
+ }
+
+ validateStringNotEmpty( "parent.version", problems, Severity.FATAL, Version.BASE, parent.getVersion(),
+ locationTracker );
+ }
+ }
private void validate30RawProfileActivation( ModelProblemCollector problems, Activation activation,
String sourceHint, String prefix, String fieldName,
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java b/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java
index 84e3faddc5cd..198ba5ac5238 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java
@@ -30,15 +30,27 @@
*/
public interface ModelValidator
{
-
/**
- * Checks the specified (raw) model for missing or invalid values. The raw model is directly created from the POM
+ * Checks the specified file model for missing or invalid values. This model is directly created from the POM
* file and has not been subjected to inheritance, interpolation or profile/default injection.
*
* @param model The model to validate, must not be {@code null}.
* @param request The model building request that holds further settings, must not be {@code null}.
* @param problems The container used to collect problems that were encountered, must not be {@code null}.
*/
+ default void validateFileModel( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
+ {
+ // do nothing
+ }
+
+ /**
+ * Checks the specified (raw) model for missing or invalid values. The raw model is the file model + buildpom filter
+ * transformation and has not been subjected to inheritance, interpolation or profile/default injection.
+ *
+ * @param model The model to validate, must not be {@code null}.
+ * @param request The model building request that holds further settings, must not be {@code null}.
+ * @param problems The container used to collect problems that were encountered, must not be {@code null}.
+ */
void validateRawModel( Model model, ModelBuildingRequest request, ModelProblemCollector problems );
/**
diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
index bf6b0888cee0..b90fcc6a7131 100644
--- a/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
+++ b/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
@@ -22,7 +22,6 @@
import java.io.InputStream;
import java.util.List;
-import org.apache.maven.feature.Features;
import org.apache.maven.model.Model;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.ModelBuildingRequest;
@@ -65,10 +64,14 @@ private SimpleProblemCollector validateEffective( String pom, int level )
throws Exception
{
ModelBuildingRequest request = new DefaultModelBuildingRequest().setValidationLevel( level );
+
+ Model model = read( pom );
- SimpleProblemCollector problems = new SimpleProblemCollector( read( pom ) );
+ SimpleProblemCollector problems = new SimpleProblemCollector( model );
+
+ request.setFileModel( model );
- validator.validateEffectiveModel( problems.getModel(), request, problems );
+ validator.validateEffectiveModel( model, request, problems );
return problems;
}
@@ -78,9 +81,15 @@ private SimpleProblemCollector validateRaw( String pom, int level )
{
ModelBuildingRequest request = new DefaultModelBuildingRequest().setValidationLevel( level );
- SimpleProblemCollector problems = new SimpleProblemCollector( read( pom ) );
+ Model model = read( pom );
+
+ SimpleProblemCollector problems = new SimpleProblemCollector( model );
- validator.validateRawModel( problems.getModel(), request, problems );
+ validator.validateFileModel( model, request, problems );
+
+ request.setFileModel( model );
+
+ validator.validateRawModel( model, request, problems );
return problems;
}
@@ -416,18 +425,10 @@ public void testIncompleteParent()
{
SimpleProblemCollector result = validateRaw( "incomplete-parent.xml" );
- if ( Features.buildConsumer().isActive() )
- {
- assertViolations( result, 2, 0, 0 );
- }
- else
- {
- assertViolations( result, 3, 0, 0 );
- assertTrue( result.getFatals().get( 2 ).contains( "parent.version" ) );
- }
-
+ assertViolations( result, 3, 0, 0 );
assertTrue( result.getFatals().get( 0 ).contains( "parent.groupId" ) );
assertTrue( result.getFatals().get( 1 ).contains( "parent.artifactId" ) );
+ assertTrue( result.getFatals().get( 2 ).contains( "parent.version" ) );
}
public void testHardCodedSystemPath()
From 3d453bf25df69fecd645561f1d4b39732d52c5b1 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Mon, 30 Dec 2019 15:23:16 +0100
Subject: [PATCH 27/52] [MNG-6656] Introduce custom ModelMerger to keep
inputLocationTracker from fileModel in rawModel
---
.../model/building/DefaultModelBuilder.java | 196 ++++++++++++++++--
.../building/DefaultModelBuilderFactory.java | 1 +
.../validation/DefaultModelValidator.java | 35 ++--
.../building/FileToRawModelMergerTest.java | 82 ++++++++
.../validation/DefaultModelValidatorTest.java | 2 +-
5 files changed, 279 insertions(+), 37 deletions(-)
create mode 100644 maven-model-builder/src/test/java/org/apache/maven/model/building/FileToRawModelMergerTest.java
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 5bfe617f9258..0e2f10a6bd01 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -57,15 +57,21 @@
import org.apache.maven.feature.Features;
import org.apache.maven.model.Activation;
import org.apache.maven.model.Build;
+import org.apache.maven.model.BuildBase;
+import org.apache.maven.model.CiManagement;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.InputLocation;
import org.apache.maven.model.InputSource;
import org.apache.maven.model.Model;
+import org.apache.maven.model.ModelBase;
import org.apache.maven.model.Parent;
import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginContainer;
import org.apache.maven.model.PluginManagement;
import org.apache.maven.model.Profile;
+import org.apache.maven.model.ReportPlugin;
+import org.apache.maven.model.Reporting;
import org.apache.maven.model.Repository;
import org.apache.maven.model.building.ModelProblem.Severity;
import org.apache.maven.model.building.ModelProblem.Version;
@@ -75,6 +81,7 @@
import org.apache.maven.model.io.ModelParseException;
import org.apache.maven.model.management.DependencyManagementInjector;
import org.apache.maven.model.management.PluginManagementInjector;
+import org.apache.maven.model.merge.ModelMerger;
import org.apache.maven.model.normalization.ModelNormalizer;
import org.apache.maven.model.path.ModelPathTranslator;
import org.apache.maven.model.path.ModelUrlNormalizer;
@@ -124,7 +131,7 @@ public class DefaultModelBuilder
@Inject
private ModelUrlNormalizer modelUrlNormalizer;
-
+
@Inject
private SuperPomProvider superPomProvider;
@@ -164,12 +171,13 @@ public class DefaultModelBuilder
private Provider buildPomXMLFilterFactory;
@Inject
- @Nullable
private ModelCacheManager modelCacheManager;
@Inject
@Nullable
private BuildPomXMLFilterListener xmlFilterListener;
+
+ private ModelMerger modelMerger = new FileToRawModelMerger();
public DefaultModelBuilder setModelProcessor( ModelProcessor modelProcessor )
{
@@ -278,6 +286,11 @@ public DefaultModelBuilder setBuildPomXMLFilterFactory( BuildPomXMLFilterFactory
this.buildPomXMLFilterFactory = () -> buildPomXMLFilterFactory;
return this;
}
+
+ public void setModelCacheManager( ModelCacheManager modelCacheManager )
+ {
+ this.modelCacheManager = modelCacheManager;
+ }
@SuppressWarnings( "checkstyle:methodlength" )
@Override
@@ -451,7 +464,7 @@ else if ( !parentIds.add( parentData.getId() ) )
result.setEffectiveModel( resultModel );
- if ( modelCacheManager != null && request.getPomFile() != null )
+ if ( request.getPomFile() != null )
{
modelCacheManager.put( request.getPomFile().toPath(), resultModel );
}
@@ -664,27 +677,33 @@ private Model readModel( ModelSource modelSource, File pomFile, ModelBuildingReq
modelValidator.validateFileModel( model, request, problems );
request.setFileModel( model );
- modelValidator.validateRawModel( model, request, problems );
-
- if ( hasFatalErrors( problems ) )
- {
- throw problems.newModelBuildingException();
- }
-
- if ( !hasModelErrors( problems ) && Features.buildConsumer().isActive() && pomFile != null )
+ if ( Features.buildConsumer().isActive() && pomFile != null )
{
try
{
- model = modelProcessor.read( transformData( pomFile.toPath() ), null );
+ Model rawModel = modelProcessor.read( transformData( pomFile.toPath() ), null );
model.setPomFile( pomFile );
+
+ // model with locationTrackers, required for proper feedback during validations
+ model = request.getFileModel().clone();
+
+ // Apply enriched data
+ modelMerger.merge( model, rawModel, false, null );
}
catch ( IOException | TransformerException | SAXException | ParserConfigurationException e )
{
- problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V37 ).setException( e ) );
+ problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.V37 ).setException( e ) );
}
}
+ modelValidator.validateRawModel( model, request, problems );
+
+ if ( hasFatalErrors( problems ) )
+ {
+ throw problems.newModelBuildingException();
+ }
+
return model;
}
@@ -1537,4 +1556,155 @@ protected boolean hasFatalErrors( ModelProblemCollectorExt problems )
}
}
+ /**
+ * As long is Maven controls the BuildPomXMLFilter, the entities that need merging is known.
+ * All others can simply be copied from source to target to restore the locationTracker
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+ class FileToRawModelMerger extends ModelMerger
+ {
+ @Override
+ protected void mergeBuild_Extensions( Build target, Build source, boolean sourceDominant,
+ Map
\ 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 000000000000..3ae19a46a0d1
--- /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 000000000000..b6bc381c7b87
--- /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 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 );
+ }
+}
From 2717ebce2ea11343674a76b34dcff34a07da06e9 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 6 Jun 2020 13:44:04 +0200
Subject: [PATCH 41/52] Fix Jenkinsfile
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 278a19df1f9f..111b5dedd606 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -60,7 +60,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
]) {
// For now: maven-wrapper contains 2 poms sharing the same outputDirectory, so separate clean
sh "mvn clean"
- sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -P versionlessMavenDist"
+ sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -DdistributionFileName=${project.artifactId}"
}
dir ('apache-maven/target') {
stash includes: 'apache-maven-bin.zip,apache-maven-wrapper-*.zip', name: 'maven-dist'
From d0a3b92b4eb231c4d23241e814e7c2c7a4a1f6e1 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 6 Jun 2020 13:48:04 +0200
Subject: [PATCH 42/52] Don't try to resolve ${project.artifactId}
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 111b5dedd606..ec19bd8accd7 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -60,7 +60,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
]) {
// For now: maven-wrapper contains 2 poms sharing the same outputDirectory, so separate clean
sh "mvn clean"
- sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -DdistributionFileName=${project.artifactId}"
+ sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true" + ' -DdistributionFileName=${project.artifactId}'
}
dir ('apache-maven/target') {
stash includes: 'apache-maven-bin.zip,apache-maven-wrapper-*.zip', name: 'maven-dist'
From 3fda5cc0744662819886c21a0a057bf92341fd26 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 6 Jun 2020 13:51:50 +0200
Subject: [PATCH 43/52] trying to escape $
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index ec19bd8accd7..6237825ca54a 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -60,7 +60,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
]) {
// For now: maven-wrapper contains 2 poms sharing the same outputDirectory, so separate clean
sh "mvn clean"
- sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true" + ' -DdistributionFileName=${project.artifactId}'
+ sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -DdistributionFileName=\${project.artifactId}"
}
dir ('apache-maven/target') {
stash includes: 'apache-maven-bin.zip,apache-maven-wrapper-*.zip', name: 'maven-dist'
From ee27a044cb9d728049d5f2bb6e865fb9caea2a9a Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 6 Jun 2020 13:55:43 +0200
Subject: [PATCH 44/52] trying with triple double quotes
---
Jenkinsfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 6237825ca54a..9a5e7d5fd511 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -60,7 +60,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
]) {
// For now: maven-wrapper contains 2 poms sharing the same outputDirectory, so separate clean
sh "mvn clean"
- sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -DdistributionFileName=\${project.artifactId}"
+ sh """mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -DdistributionFileName=${project.artifactId}"""
}
dir ('apache-maven/target') {
stash includes: 'apache-maven-bin.zip,apache-maven-wrapper-*.zip', name: 'maven-dist'
From 5101ea0388569e9ab84d0bc34b19c222abf9776d Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 6 Jun 2020 14:08:47 +0200
Subject: [PATCH 45/52] try as system property
---
Jenkinsfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 9a5e7d5fd511..02bbfdd7b5d6 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -49,7 +49,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
stage('Build / Unit Test') {
String jdkName = jenkinsEnv.jdkFromVersion(buildOs, buildJdk)
String mvnName = jenkinsEnv.mvnFromVersion(buildOs, buildMvn)
- withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/.repository", options:[
+ withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/.repository", mavenOpts:'-DdistributionFileName=${project.artifactId}', options:[
artifactsPublisher(disabled: false),
junitPublisher(ignoreAttachments: false),
findbugsPublisher(disabled: false),
@@ -60,7 +60,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
]) {
// For now: maven-wrapper contains 2 poms sharing the same outputDirectory, so separate clean
sh "mvn clean"
- sh """mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -DdistributionFileName=${project.artifactId}"""
+ sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true"
}
dir ('apache-maven/target') {
stash includes: 'apache-maven-bin.zip,apache-maven-wrapper-*.zip', name: 'maven-dist'
From 82bc06d49f86e3cadf7ac9a8e363cb783fcdfb92 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 6 Jun 2020 15:17:42 +0200
Subject: [PATCH 46/52] Restore Jenkins file
---
Jenkinsfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Jenkinsfile b/Jenkinsfile
index 02bbfdd7b5d6..278a19df1f9f 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -49,7 +49,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
stage('Build / Unit Test') {
String jdkName = jenkinsEnv.jdkFromVersion(buildOs, buildJdk)
String mvnName = jenkinsEnv.mvnFromVersion(buildOs, buildMvn)
- withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/.repository", mavenOpts:'-DdistributionFileName=${project.artifactId}', options:[
+ withMaven(jdk: jdkName, maven: mvnName, mavenLocalRepo:"${WORK_DIR}/.repository", options:[
artifactsPublisher(disabled: false),
junitPublisher(ignoreAttachments: false),
findbugsPublisher(disabled: false),
@@ -60,7 +60,7 @@ node(jenkinsEnv.nodeSelection(osNode)) {
]) {
// For now: maven-wrapper contains 2 poms sharing the same outputDirectory, so separate clean
sh "mvn clean"
- sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true"
+ sh "mvn ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore=true -P versionlessMavenDist"
}
dir ('apache-maven/target') {
stash includes: 'apache-maven-bin.zip,apache-maven-wrapper-*.zip', name: 'maven-dist'
From 8b3f47a4f5ac0e857fd1be8a7c90a56879943508 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sat, 6 Jun 2020 21:58:31 +0200
Subject: [PATCH 47/52] Pass sessionData
---
.../aether/DefaultRepositorySystemSessionFactory.java | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
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 928d200277da..acd1fce51403 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
@@ -40,6 +40,7 @@
import org.eclipse.aether.ConfigurationProperties;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.SessionData;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
import org.eclipse.aether.repository.RepositoryPolicy;
@@ -247,8 +248,7 @@ else if ( request.isUpdateSnapshots() )
if ( Features.buildConsumer().isActive() )
{
- session.setFileTransformerManager( a -> getTransformersForArtifact( a,
- (TransformerContext) session.getData().get( TransformerContext.KEY ) ) );
+ session.setFileTransformerManager( a -> getTransformersForArtifact( a, session.getData() ) );
}
return session;
@@ -281,8 +281,9 @@ private String getMavenVersion()
}
private Collection getTransformersForArtifact( final org.eclipse.aether.artifact.Artifact artifact,
- TransformerContext context )
+ final SessionData sessionData )
{
+ TransformerContext context = (TransformerContext) sessionData.get( TransformerContext.KEY );
Collection transformers = new ArrayList<>();
if ( "pom".equals( artifact.getExtension() ) )
{
From be5d23d8d6cd4d51a98a87ef473b70cdb9205de2 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sun, 7 Jun 2020 14:25:50 +0200
Subject: [PATCH 48/52] Prevent NPE
---
.../aether/DefaultRepositorySystemSessionFactory.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
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 acd1fce51403..d90c1d8a0aa3 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
@@ -285,7 +285,9 @@ private Collection getTransformersForArtifact( final org.eclips
{
TransformerContext context = (TransformerContext) sessionData.get( TransformerContext.KEY );
Collection transformers = new ArrayList<>();
- if ( "pom".equals( artifact.getExtension() ) )
+
+ // In case of install:install-file there's no transformer context, as the goal is unrelated to the lifecycle.
+ if ( "pom".equals( artifact.getExtension() ) && context != null )
{
transformers.add( new FileTransformer()
{
From 020b5037d513d69c4daadc1118dbc408d3bc3089 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Sun, 7 Jun 2020 19:47:27 +0200
Subject: [PATCH 49/52] Adjust apache-maven-wrapper pom for IT
---
apache-maven/maven-wrapper.pom | 5 -----
1 file changed, 5 deletions(-)
diff --git a/apache-maven/maven-wrapper.pom b/apache-maven/maven-wrapper.pom
index fc6755cff306..f2bcc7fc141b 100644
--- a/apache-maven/maven-wrapper.pom
+++ b/apache-maven/maven-wrapper.pom
@@ -33,12 +33,7 @@ under the License.
Apache Maven Wrapper DistributionThe Apache Maven Wrapper distribution in zip and tar.gz formats.
-
- ${artifactId}-${project.version}
-
-
- ${distributionFileName}
From cc620d2f0cea7cd40aee60b3a72582c5c4fde3f1 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Tue, 16 Jun 2020 21:39:50 +0200
Subject: [PATCH 50/52] Adjust code based on review comments
---
.../ConsumerModelSourceTransformer.java | 3 +-
...DefaultRepositorySystemSessionFactory.java | 9 +-
.../maven/project/DefaultProjectBuilder.java | 10 +-
.../maven/project/ProjectModelResolver.java | 6 +-
.../maven/project/ReactorModelPool.java | 3 -
.../DefaultConsumerPomXMLFilterFactory.java | 2 +
.../AbstractModelSourceTransformer.java | 2 +
....java => BuildModelSourceTransformer.java} | 3 +-
.../building/DefaultModelBuildingRequest.java | 2 +-
.../model/building/TransformerContext.java | 26 +-
.../DefaultInheritanceAssemblerTest.java | 21 +-
.../sax/filter/BuildPomXMLFilterFactory.java | 4 +-
.../sax/filter/BuildPomXMLFilterListener.java | 2 +
.../maven/xml/sax/LexicalHandlerVerifier.java | 277 ------------------
14 files changed, 66 insertions(+), 304 deletions(-)
rename maven-model-builder/src/main/java/org/apache/maven/model/building/{DefaultModelSourceTransformer.java => BuildModelSourceTransformer.java} (95%)
delete mode 100644 maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java
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 8ca0ca667a1f..728c78e7eb0a 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
@@ -55,9 +55,8 @@ protected AbstractSAXFilter getSAXFilter( Path pomFile, TransformerContext conte
* This transformer will ensure that encoding and version are kept.
* However, it cannot prevent:
*
- *
line-endings will be unix-style(LF)
*
attributes will be on one line
- *
Unnecessary whitespace before the rootelement will be remove
+ *
Unnecessary whitespace before the rootelement will be removed
*
*/
@Override
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 d90c1d8a0aa3..28f75cdce81e 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
@@ -26,6 +26,7 @@
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.feature.Features;
import org.apache.maven.model.building.TransformerContext;
+import org.apache.maven.model.building.TransformerException;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
@@ -41,6 +42,7 @@
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.SessionData;
+import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
import org.eclipse.aether.repository.RepositoryPolicy;
@@ -280,7 +282,7 @@ private String getMavenVersion()
return props.getProperty( "version", "unknown-version" );
}
- private Collection getTransformersForArtifact( final org.eclipse.aether.artifact.Artifact artifact,
+ private Collection getTransformersForArtifact( final Artifact artifact,
final SessionData sessionData )
{
TransformerContext context = (TransformerContext) sessionData.get( TransformerContext.KEY );
@@ -299,15 +301,14 @@ public InputStream transformData( File pomFile )
{
return new ConsumerModelSourceTransformer().transform( pomFile.toPath(), context );
}
- catch ( org.apache.maven.model.building.TransformerException e )
+ catch ( TransformerException e )
{
throw new TransformException( e );
}
}
@Override
- public org.eclipse.aether.artifact.Artifact transformArtifact(
- org.eclipse.aether.artifact.Artifact artifact )
+ public Artifact transformArtifact( Artifact artifact )
{
return artifact;
}
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 f09941b1f238..624f6ade9d90 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
@@ -161,7 +161,7 @@ private ProjectBuildingResult build( File pomFile, ModelSource modelSource, Inte
if ( project == null )
{
- ModelBuildingRequest request = getModelBuildingRequest( config, pomFile );
+ ModelBuildingRequest request = getModelBuildingRequest( config );
project = new MavenProject();
project.setFile( pomFile );
@@ -273,7 +273,7 @@ private List getProfileIds( List profiles )
return ids;
}
- private ModelBuildingRequest getModelBuildingRequest( InternalConfig config, File pomFile )
+ private ModelBuildingRequest getModelBuildingRequest( InternalConfig config )
{
ProjectBuildingRequest configuration = config.request;
@@ -444,7 +444,7 @@ public Model getRawModel( String groupId, String artifactId )
@SuppressWarnings( "checkstyle:parameternumber" )
private boolean build( List results, List interimResults,
Map projectIndex, List pomFiles, Set aggregatorFiles,
- boolean isRoot, boolean recursive, InternalConfig config,
+ boolean root, boolean recursive, InternalConfig config,
ReactorModelPool.Builder poolBuilder )
{
boolean noErrors = true;
@@ -453,7 +453,7 @@ private boolean build( List results, List
{
aggregatorFiles.add( pomFile );
- if ( !build( results, interimResults, projectIndex, pomFile, aggregatorFiles, isRoot, recursive, config,
+ if ( !build( results, interimResults, projectIndex, pomFile, aggregatorFiles, root, recursive, config,
poolBuilder ) )
{
noErrors = false;
@@ -473,7 +473,7 @@ private boolean build( List results, List
{
boolean noErrors = true;
- ModelBuildingRequest request = getModelBuildingRequest( config, pomFile );
+ ModelBuildingRequest request = getModelBuildingRequest( config );
MavenProject project = new MavenProject();
project.setFile( pomFile );
diff --git a/maven-core/src/main/java/org/apache/maven/project/ProjectModelResolver.java b/maven-core/src/main/java/org/apache/maven/project/ProjectModelResolver.java
index 3b027e5063c7..bcc3730e72bb 100644
--- a/maven-core/src/main/java/org/apache/maven/project/ProjectModelResolver.java
+++ b/maven-core/src/main/java/org/apache/maven/project/ProjectModelResolver.java
@@ -24,7 +24,6 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import java.util.Optional;
import java.util.Set;
import org.apache.maven.model.Dependency;
@@ -278,8 +277,9 @@ public ModelSource resolveModel( final Dependency dependency )
if ( modelPool != null )
{
- Model model = Optional.ofNullable( modelPool.get( dependency.getGroupId(), dependency.getArtifactId(),
- dependency.getVersion() ) ).orElse( null );
+ Model model =
+ modelPool.get( dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
+
if ( model != null )
{
return new FileModelSource( model.getPomFile() );
diff --git a/maven-core/src/main/java/org/apache/maven/project/ReactorModelPool.java b/maven-core/src/main/java/org/apache/maven/project/ReactorModelPool.java
index 3a788e6e8579..b96b14b7fed5 100644
--- a/maven-core/src/main/java/org/apache/maven/project/ReactorModelPool.java
+++ b/maven-core/src/main/java/org/apache/maven/project/ReactorModelPool.java
@@ -25,7 +25,6 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
-import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
@@ -52,10 +51,8 @@ class ReactorModelPool
* @param version, can be {@code null}
* @return the matching model or {@code null}
* @throws IllegalStateException if version was null and multiple modules share the same groupId + artifactId
- * @throws NoSuchElementException if model could not be found
*/
public Model get( String groupId, String artifactId, String version )
- throws IllegalStateException, NoSuchElementException
{
return modelsByGa.getOrDefault( new GAKey( groupId, artifactId ), Collections.emptySet() ).stream()
.filter( m -> version == null || version.equals( getVersion( m ) ) )
diff --git a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
index f686ac2d2f24..f49e62d32b0b 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/xml/internal/DefaultConsumerPomXMLFilterFactory.java
@@ -26,6 +26,8 @@
import org.apache.maven.xml.sax.filter.ConsumerPomXMLFilterFactory;
/**
+ * The default implementation of the {@link ConsumerPomXMLFilterFactory}
+ * It will provide several values for the consumer pom based on its context.
*
* @author Robert Scholte
* @since 3.7.0
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 6fedadaf6a4b..0cf6f7a9abac 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
@@ -44,6 +44,8 @@
import org.xml.sax.SAXException;
/**
+ * Offers a transformation implementation based on PipelineStreams.
+ * Subclasses are responsible for providing the right SAXFilter.
*
* @author Robert Scholte
* @since 3.7.0
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelSourceTransformer.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/BuildModelSourceTransformer.java
similarity index 95%
rename from maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelSourceTransformer.java
rename to maven-model-builder/src/main/java/org/apache/maven/model/building/BuildModelSourceTransformer.java
index f410551df199..dbf9211e9ee6 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelSourceTransformer.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/BuildModelSourceTransformer.java
@@ -37,13 +37,14 @@
import org.xml.sax.SAXException;
/**
+ * ModelSourceTransformer for the build pom
*
* @author Robert Scholte
* @since 3.7.0
*/
@Named
@Singleton
-public class DefaultModelSourceTransformer extends AbstractModelSourceTransformer
+class BuildModelSourceTransformer extends AbstractModelSourceTransformer
{
@Inject
@Nullable
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
index b347eb41bda0..2012bb1a578f 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java
@@ -38,7 +38,7 @@
public class DefaultModelBuildingRequest
implements ModelBuildingRequest
{
- private transient Model fileModel;
+ private Model fileModel;
private Model rawModel;
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 f0122201e894..2f763a2a9001 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
@@ -24,17 +24,41 @@
import org.apache.maven.model.Model;
/**
+ * Context used to transform a pom file.
+ *
*
* @author Robert Scholte
* @since 3.7.0
*/
public interface TransformerContext
{
+ /**
+ * Key to get the TransformerContext from the SessionData
+ */
Object KEY = TransformerContext.class;
+ /**
+ * Get the value of the commandline argument {@code -Dkey=value}
+ * @param key
+ * @return
+ */
String getUserProperty( String key );
+ /**
+ * Get the model based on the path, will be used to resolve the parent based on relativePath
+ *
+ * @param p the path
+ * @return the model, otherwise {@code null}
+ */
Model getRawModel( Path p );
- Model getRawModel( String groupId, String artifactId );
+ /**
+ * Get the model from the reactor based on the groupId and artifactId, will be used for reactor dependencies
+ *
+ * @param groupId the groupId
+ * @param artifactId the artifactId
+ * @return the model, otherwise {@code null}
+ * @throws IllegalStateException if multiple versions of the same GA are part of the reactor
+ */
+ Model getRawModel( String groupId, String artifactId ) throws IllegalStateException;
}
diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java
index 54c178e024d7..992447180c3b 100644
--- a/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java
+++ b/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java
@@ -20,19 +20,24 @@
*/
import org.apache.maven.model.Model;
-import org.apache.maven.model.building.DefaultModelSourceTransformer;
+import org.apache.maven.model.building.AbstractModelSourceTransformer;
import org.apache.maven.model.building.SimpleProblemCollector;
+import org.apache.maven.model.building.TransformerContext;
import org.apache.maven.model.io.DefaultModelReader;
import org.apache.maven.model.io.DefaultModelWriter;
-import org.apache.maven.model.io.ModelReader;
import org.apache.maven.model.io.ModelWriter;
-
+import org.apache.maven.xml.sax.filter.AbstractSAXFilter;
+import org.xml.sax.SAXException;
import org.xmlunit.matchers.CompareMatcher;
import junit.framework.TestCase;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Path;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerConfigurationException;
import static org.junit.Assert.assertThat;
@@ -55,7 +60,15 @@ protected void setUp()
super.setUp();
reader = new DefaultModelReader();
- reader.setTransformer( new DefaultModelSourceTransformer() );
+ reader.setTransformer( new AbstractModelSourceTransformer()
+ {
+ @Override
+ protected AbstractSAXFilter getSAXFilter( Path pomFile, TransformerContext context )
+ throws TransformerConfigurationException, SAXException, ParserConfigurationException
+ {
+ return null;
+ }
+ } );
writer = new DefaultModelWriter();
assembler = new DefaultInheritanceAssembler();
}
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 910bc1603a0f..6f3f3198c9a1 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
@@ -35,11 +35,9 @@
import org.xml.sax.ext.LexicalHandler;
/**
- * Base class for third parties to extend. When annotating it with Named("somecustomname"),
- * Maven will pick this up as instead of the DefaultBuildPomXMLFilterFactory
+ * Base implementation for providing the BuildPomXML.
*
* @author Robert Scholte
- *
* @since 3.7.0
*/
public class BuildPomXMLFilterFactory
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java
index e984640594d0..b97c757330dd 100644
--- a/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/sax/filter/BuildPomXMLFilterListener.java
@@ -22,10 +22,12 @@
import java.nio.file.Path;
/**
+ * Listener can be used to capture the result of the build pom
*
* @author Robert Scholte
* @since 3.7.0
*/
+@FunctionalInterface
public interface BuildPomXMLFilterListener
{
/**
diff --git a/maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java b/maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java
deleted file mode 100644
index 49eb7729c6eb..000000000000
--- a/maven-xml/src/test/java/org/apache/maven/xml/sax/LexicalHandlerVerifier.java
+++ /dev/null
@@ -1,277 +0,0 @@
-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 java.util.Arrays;
-
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Source;
-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 javax.xml.transform.stream.StreamSource;
-
-import org.apache.maven.xml.Factories;
-import org.apache.maven.xml.sax.filter.AbstractSAXFilter;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.XMLReader;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.XMLFilterImpl;
-
-/**
- * Some tests to help understand the chain of events regarding XMLFilters, XMLReaders, LexicalHandlers and Transformers
- *
- * @author Robert Scholte
- *
- */
-public class LexicalHandlerVerifier
-{
- private static final String SAX_PROPERTIES_LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler";
-
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- @Test
- public void parseXmlReader() throws Exception
- {
- expectedException.expect( UnsupportedOperationException.class );
- expectedException.expectMessage( "LexicalHandlerVerifier" );
-
- XMLReader reader = Factories.newXMLReader();
- reader.setProperty( SAX_PROPERTIES_LEXICAL_HANDLER, new UnsupportedOperationExceptionLexicalHandler() );
-
- InputSource inputSource = new InputSource( new StringReader( "" ) );
- reader.parse( inputSource );
- }
-
- @Test
- public void parseXmlFilter() throws Exception
- {
- expectedException.expect( UnsupportedOperationException.class );
- expectedException.expectMessage( "LexicalHandlerVerifier" );
-
- XMLReader reader = Factories.newXMLReader();
- reader.setProperty( SAX_PROPERTIES_LEXICAL_HANDLER, new UnsupportedOperationExceptionLexicalHandler() );
-
- XMLFilter filter = new XMLFilterImpl( reader );
-
- InputSource inputSource = new InputSource( new StringReader( "" ) );
- filter.parse( inputSource );
- }
-
- @Test
- public void transformXmlReader() throws Exception
- {
- Writer writer = new StringWriter();
- StreamResult result = new StreamResult( writer );
-
- SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory();
- TransformerHandler transformerHandler = transformerFactory.newTransformerHandler();
- transformerHandler.setResult( result );
- Transformer transformer = transformerFactory.newTransformer();
- transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
-
- Source xmlSource = new StreamSource( new StringReader( "" ) );
-
- SAXResult transformResult = new SAXResult( transformerHandler );
- transformResult.setLexicalHandler( new SortCommentLexicalHandler( transformerHandler ) );
- transformer.transform( xmlSource, transformResult );
-
- assertThat( writer.toString() ).and( ""
- + "" ).areIdentical();
- }
-
- @Test
- public void transformXmlFilter() throws Exception
- {
- Writer writer = new StringWriter();
- StreamResult result = new StreamResult( writer );
-
- SAXTransformerFactory transformerFactory = (SAXTransformerFactory) Factories.newTransformerFactory();
- TransformerHandler transformerHandler = transformerFactory.newTransformerHandler();
- transformerHandler.getTransformer().setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" );
- transformerHandler.setResult( result );
- Transformer transformer = transformerFactory.newTransformer();
-
- XMLReader reader = Factories.newXMLReader();
- // in wrong order result will be CONNENT -->
- AbstractSAXFilter filter2 = new M2NLexicalXMLFilter();
- filter2.setParent( reader );
- filter2.setLexicalHandler( transformerHandler );
-
- AbstractSAXFilter filter1 = new N2CLexicalXMLFilter( filter2 );
-
- SAXSource transformSource = new SAXSource( filter1, new InputSource( new StringReader( "" ) ) );
-
- SAXResult transformResult = new SAXResult( transformerHandler );
- transformResult.setLexicalHandler( filter1 );
- transformer.transform( transformSource, transformResult );
-
- assertThat( writer.toString() ).and( "" ).areIdentical();
- }
-
- /**
- * A LexicalHandler that'll throw an UnsupportedOperationException on every call.
- *
- * @author Robert Scholte
- */
- static class UnsupportedOperationExceptionLexicalHandler implements LexicalHandler
- {
- @Override
- public void startDTD( String name, String publicId, String systemId )
- throws SAXException
- {
- throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
- }
-
- @Override
- public void endDTD()
- throws SAXException
- {
- throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
- }
-
- @Override
- public void startEntity( String name )
- throws SAXException
- {
- throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
- }
-
- @Override
- public void endEntity( String name )
- throws SAXException
- {
- throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
- }
-
- @Override
- public void startCDATA()
- throws SAXException
- {
- throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
- }
-
- @Override
- public void endCDATA()
- throws SAXException
- {
- throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
- }
-
- @Override
- public void comment( char[] ch, int start, int length )
- throws SAXException
- {
- throw new UnsupportedOperationException( "LexicalHandlerVerifier" );
- }
- }
-
- /**
- * Sorts the comment chars,will throw an UnsupportedOperationException on every other method
- *
- * @author Robert Scholte
- *
- */
- static class SortCommentLexicalHandler extends UnsupportedOperationExceptionLexicalHandler
- {
- private final LexicalHandler lexicalHandler;
-
- public SortCommentLexicalHandler( LexicalHandler lexicalHandler )
- {
- this.lexicalHandler = lexicalHandler;
- }
-
-
- @Override
- public void comment( char[] ch, int start, int length )
- throws SAXException
- {
- char[] chars = new String( ch, start, length ).toCharArray();
- Arrays.sort(chars);
- lexicalHandler.comment( chars, 0, chars.length );
- }
- }
-
- /**
- * AbstractSAXFilter implements both XMLReader and LexicalHandler
- *
- * @author Robert Scholte
- *
- */
- static class N2CLexicalXMLFilter extends AbstractSAXFilter
- {
- public N2CLexicalXMLFilter()
- {
- super( null );
- }
-
- public N2CLexicalXMLFilter( T parent )
- {
- super( parent );
- }
-
- @Override
- public void comment( char[] ch, int start, int length )
- throws SAXException
- {
- super.comment( new String( ch, start, length ).replace( 'N', 'C' ).toCharArray(), start, length );
- }
- }
-
- /**
- * AbstractSAXFilter implements both XMLReader and LexicalHandler
- *
- * @author Robert Scholte
- *
- */
- static class M2NLexicalXMLFilter extends AbstractSAXFilter
- {
- public M2NLexicalXMLFilter()
- {
- super( null );
- }
-
- public M2NLexicalXMLFilter( T parent )
- {
- super( parent );
- }
-
- @Override
- public void comment( char[] ch, int start, int length )
- throws SAXException
- {
- super.comment( new String( ch, start, length ).replace( 'M', 'N' ).toCharArray(), start, length );
- }
- }
-}
From 1737d23574f7361450c2a94dd135f085c9bf8e45 Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Tue, 16 Jun 2020 21:40:35 +0200
Subject: [PATCH 51/52] ReAdd DefaultModelSourceTransformer
---
.../DefaultModelSourceTransformer.java | 43 +++++++++++++++++++
1 file changed, 43 insertions(+)
create mode 100644 maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelSourceTransformer.java
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelSourceTransformer.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelSourceTransformer.java
new file mode 100644
index 000000000000..50ad04b572e5
--- /dev/null
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelSourceTransformer.java
@@ -0,0 +1,43 @@
+package org.apache.maven.model.building;
+
+/*
+ * 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.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/**
+ * Default ModelSourceTransformer, provides pomFile as inputStream and ignores the context
+ *
+ * @author Robert Scholte
+ * @since 3.7.0
+ */
+public class DefaultModelSourceTransformer implements ModelSourceTransformer
+{
+
+ @Override
+ public InputStream transform( Path pomFile, TransformerContext context )
+ throws IOException, TransformerException
+ {
+ return Files.newInputStream( pomFile );
+ }
+
+}
From e082e6efa87355889120bbf5dd852b4d915e030f Mon Sep 17 00:00:00 2001
From: rfscholte
Date: Wed, 17 Jun 2020 09:00:53 +0200
Subject: [PATCH 52/52] Adjust code based on review comments
---
.../maven/model/building/AbstractModelSourceTransformer.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
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 0cf6f7a9abac..31b88bfa7d7a 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
@@ -168,7 +168,8 @@ public void close()
}
catch ( Throwable t )
{
- throw new AssertionError( "Failed to transform pom", t );
+ // Any checked exception
+ throw new RuntimeException( "Failed to transform pom", t );
}
}
}