This is an automated email from the ASF dual-hosted git repository. rfscholte pushed a commit to branch MNG-6656 in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/MNG-6656 by this push: new f998d90 [MNG-6656] restore publishing valid consumer poms. Improve Exception Handling f998d90 is described below commit f998d903d346d833b16addf7dcefe02fc3bdd9f4 Author: rfscholte <rfscho...@apache.org> AuthorDate: Sun Apr 5 16:48:35 2020 +0200 [MNG-6656] restore publishing valid consumer poms. Improve Exception Handling --- .../aether/ConsumerModelSourceTransformer.java | 110 +++++++++++++++++++++ .../DefaultRepositorySystemSessionFactory.java | 50 +++++++++- .../maven/project/DefaultProjectBuilder.java | 54 ++-------- .../building/AbstractModelSourceTransformer.java | 2 +- .../building/DefaultBuildPomXMLFilterFactory.java | 18 ---- .../xml/sax/filter/BuildPomXMLFilterFactory.java | 17 ---- 6 files changed, 166 insertions(+), 85 deletions(-) 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 new file mode 100644 index 0000000..0f92f66 --- /dev/null +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/ConsumerModelSourceTransformer.java @@ -0,0 +1,110 @@ +package org.apache.maven.internal.aether; + +/* + * 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; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.sax.TransformerHandler; + +import org.apache.maven.model.building.AbstractModelSourceTransformer; +import org.apache.maven.model.building.DefaultBuildPomXMLFilterFactory; +import org.apache.maven.model.building.TransformerContext; +import org.apache.maven.xml.Factories; +import org.apache.maven.xml.internal.DefaultConsumerPomXMLFilterFactory; +import org.apache.maven.xml.sax.filter.AbstractSAXFilter; +import org.xml.sax.SAXException; + +class ConsumerModelSourceTransformer extends AbstractModelSourceTransformer +{ + @Override + protected AbstractSAXFilter getSAXFilter( Path pomFile, TransformerContext context ) + throws TransformerConfigurationException, SAXException, ParserConfigurationException + { + return new DefaultConsumerPomXMLFilterFactory( new DefaultBuildPomXMLFilterFactory( context ) ).get( pomFile ); + } + + /** + * This transformer will ensure that encoding and version are kept. + * However, it cannot prevent: + * <ul> + * <li>line-endings will be unix-style(LF)</li> + * <li>attributes will be on one line</li> + * <li>Unnecessary whitespace before the rootelement will be remove</li> + * </ul> + */ + @Override + protected TransformerHandler getTransformerHandler( Path pomFile ) + throws IOException, org.apache.maven.model.building.TransformerException + { + final TransformerHandler transformerHandler; + + final SAXTransformerFactory transformerFactory = + (SAXTransformerFactory) Factories.newTransformerFactory(); + + // Keep same encoding+version + try ( InputStream input = Files.newInputStream( pomFile ) ) + { + XMLStreamReader streamReader = + XMLInputFactory.newFactory().createXMLStreamReader( input ); + + transformerHandler = transformerFactory.newTransformerHandler(); + + final String encoding = streamReader.getCharacterEncodingScheme(); + final String version = streamReader.getVersion(); + + Transformer transformer = transformerHandler.getTransformer(); + if ( encoding == null && version == null ) + { + transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" ); + } + else + { + transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no" ); + + if ( encoding != null ) + { + transformer.setOutputProperty( OutputKeys.ENCODING, encoding ); + } + if ( version != null ) + { + transformer.setOutputProperty( OutputKeys.VERSION, version ); + } + } + } + catch ( XMLStreamException | TransformerConfigurationException e ) + { + throw new org.apache.maven.model.building.TransformerException( + "Failed to detect XML encoding and version", e ); + } + return transformerHandler; + } + +} 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 8973b20..d0dd442 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 @@ -24,6 +24,8 @@ import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.bridge.MavenRepositorySystem; import org.apache.maven.eventspy.internal.EventSpyDispatcher; import org.apache.maven.execution.MavenExecutionRequest; +import org.apache.maven.feature.Features; +import org.apache.maven.model.building.TransformerContext; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.apache.maven.settings.Mirror; import org.apache.maven.settings.Proxy; @@ -44,6 +46,8 @@ 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.TransformException; import org.eclipse.aether.util.repository.AuthenticationBuilder; import org.eclipse.aether.util.repository.DefaultAuthenticationSelector; import org.eclipse.aether.util.repository.DefaultMirrorSelector; @@ -53,8 +57,13 @@ import org.eclipse.sisu.Nullable; import javax.inject.Inject; import javax.inject.Named; + +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; @@ -96,7 +105,6 @@ public class DefaultRepositorySystemSessionFactory public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request ) { DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); - session.setCache( request.getRepositoryCache() ); Map<Object, Object> configProps = new LinkedHashMap<>(); @@ -139,7 +147,6 @@ public class DefaultRepositorySystemSessionFactory session.setLocalRepositoryManager( simpleLocalRepoMgrFactory.newInstance( session, localRepo ) ); logger.info( "Disabling enhanced local repository: using legacy is strongly discouraged to ensure" + " build reproducibility." ); - } catch ( NoLocalRepositoryManagerException e ) { @@ -238,6 +245,12 @@ public class DefaultRepositorySystemSessionFactory mavenRepositorySystem.injectProxy( session, request.getPluginArtifactRepositories() ); mavenRepositorySystem.injectAuthentication( session, request.getPluginArtifactRepositories() ); + if ( Features.buildConsumer().isActive() ) + { + session.setFileTransformerManager( a -> getTransformersForArtifact( a, + (TransformerContext) session.getData().get( TransformerContext.class ) ) ); + } + return session; } @@ -266,5 +279,38 @@ public class DefaultRepositorySystemSessionFactory return props.getProperty( "version", "unknown-version" ); } + + private Collection<FileTransformer> getTransformersForArtifact( final org.eclipse.aether.artifact.Artifact artifact, + TransformerContext context ) + { + Collection<FileTransformer> transformers = new ArrayList<>(); + if ( "pom".equals( artifact.getExtension() ) ) + { + transformers.add( new FileTransformer() + { + @Override + public InputStream transformData( File pomFile ) + throws IOException, TransformException + { + try + { + return new ConsumerModelSourceTransformer().transform( pomFile.toPath(), context ); + } + catch ( org.apache.maven.model.building.TransformerException e ) + { + throw new TransformException( e ); + } + } + + @Override + public org.eclipse.aether.artifact.Artifact transformArtifact( + org.eclipse.aether.artifact.Artifact artifact ) + { + return artifact; + } + } ); + } + return Collections.unmodifiableCollection( transformers ); + } } \ No newline at end of file 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 4b9821a..265633d 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 @@ -88,7 +88,6 @@ import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.Os; import org.codehaus.plexus.util.StringUtils; -import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.RequestTrace; import org.eclipse.aether.impl.RemoteRepositoryManager; @@ -97,8 +96,6 @@ import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.repository.WorkspaceRepository; import org.eclipse.aether.resolution.ArtifactRequest; import org.eclipse.aether.resolution.ArtifactResult; -import org.eclipse.aether.transform.FileTransformer; -import org.eclipse.aether.transform.TransformException; import org.xml.sax.SAXException; /** @@ -299,7 +296,6 @@ public class DefaultProjectBuilder RequestTrace trace = RequestTrace.newChild( null, configuration ).newChild( request ); - RepositorySystemSession repoSession; if ( Features.buildConsumer().isActive() ) { TransformerContext context = new TransformerContext() @@ -313,27 +309,24 @@ public class DefaultProjectBuilder @Override public Model getRawModel( Path p ) { - return config.modelPool.get( p ); + ReactorModelPool pool = config.modelPool; + return pool != null ? pool.get( p ) : null; } @Override public Model getRawModel( String groupId, String artifactId ) { - return config.modelPool.get( groupId, artifactId, null ); + ReactorModelPool pool = config.modelPool; + return pool != null ? pool.get( groupId, artifactId, null ) : null; } }; - request.setTransformerContext( context ); + config.session.getData().set( TransformerContext.class, context ); - repoSession = new DefaultRepositorySystemSession( config.session ) - .setFileTransformerManager( a -> getTransformersForArtifact( a, context ) ); - } - else - { - repoSession = config.session; + request.setTransformerContext( context ); } ModelResolver resolver = - new ProjectModelResolver( repoSession, trace, repoSystem, repositoryManager, config.repositories, + new ProjectModelResolver( config.session, trace, repoSystem, repositoryManager, config.repositories, configuration.getRepositoryMerging(), config.modelPool ); request.setValidationLevel( configuration.getValidationLevel() ); @@ -1104,39 +1097,6 @@ public class DefaultProjectBuilder return null; } - - private Collection<FileTransformer> getTransformersForArtifact( final org.eclipse.aether.artifact.Artifact artifact, - TransformerContext context ) - { - Collection<FileTransformer> transformers = new ArrayList<>(); - if ( "pom".equals( artifact.getExtension() ) ) - { - transformers.add( new FileTransformer() - { - @Override - public InputStream transformData( File pomFile ) - throws IOException, TransformException - { - try - { - return new ConsumerModelSourceTransformer().transform( pomFile.toPath(), context ); - } - catch ( org.apache.maven.model.building.TransformerException e ) - { - throw new TransformException( e ); - } - } - - @Override - public org.eclipse.aether.artifact.Artifact transformArtifact( - org.eclipse.aether.artifact.Artifact artifact ) - { - return artifact; - } - } ); - } - return Collections.unmodifiableCollection( transformers ); - } /** * InternalConfig 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 db26715..e0767fb 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 @@ -164,7 +164,7 @@ public abstract class AbstractModelSourceTransformer } catch ( Throwable t ) { - throw new AssertionError(); + throw new AssertionError( "Failed to transform pom", t ); } } } diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java index 9489e3b..3de90de 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultBuildPomXMLFilterFactory.java @@ -49,24 +49,6 @@ public class DefaultBuildPomXMLFilterFactory extends BuildPomXMLFilterFactory } @Override - protected Optional<String> getChangelist() - { - return Optional.ofNullable( context.getUserProperty( "changelist" ) ); - } - - @Override - protected Optional<String> getRevision() - { - return Optional.ofNullable( context.getUserProperty( "revision" ) ); - } - - @Override - protected Optional<String> getSha1() - { - return Optional.ofNullable( context.getUserProperty( "sha1" ) ); - } - - @Override protected Function<Path, Optional<RelativeProject>> getRelativePathMapper() { return p -> Optional.ofNullable( context.getRawModel( p ) ).map( m -> toRelativeProject( m ) ); 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 d86200f..910bc16 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 @@ -99,23 +99,6 @@ public class BuildPomXMLFilterFactory + " 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 Optional<String> getChangelist() - { - return Optional.empty(); - } - - protected Optional<String> getRevision() - { - return Optional.empty(); - } - - protected Optional<String> getSha1() - { - return Optional.empty(); - } - /** * @return the mapper or {@code null} if relativePaths don't need to be mapped */