All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scoverage.plugin.SCoverageForkedLifecycleConfigurator Maven / Gradle / Ivy

/*
 * Copyright 2014-2024 Grzegorz Slowikowski (gslowikowski at gmail dot com)
 *
 * Licensed 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.
 */

package org.scoverage.plugin;

import java.io.File;
import java.util.List;
import java.util.Map;

import org.apache.maven.project.MavenProject;

/**
 * Configures project and dependent modules in multi-module project when entering forked {@code scoverage}
 * life cycle and restores original configuration after leaving it.
 * 
* In default life cycle modules use: *
    *
  • * {@code ${project.build.directory}/classes} as {@code project.outputDirectory} property value, *
  • *
  • * {@code ${project.build.directory}/${project.finalName}.jar} as {@code project.artifact.file} property value. *
  • *
*
* In forked {@code scoverage} life cycle modules use: *
    *
  • * {@code ${project.build.directory}/scoverage-classes} as {@code project.outputDirectory} property value, *
  • *
  • * {@code ${project.build.directory}/scoverage-${project.finalName}.jar} as {@code project.artifact.file} property value. *
  • *
* * @author Grzegorz Slowikowski */ public class SCoverageForkedLifecycleConfigurator { private final static String PROP_ORIG_OUTPUT_DIRECTORY = "_scoverage.original.outputDirectory"; private final static String PROP_ORIG_ARTIFACT_FILE = "_scoverage.original.artifactFile"; private final static String PROP_FORKED_OUTPUT_DIRECTORY = "_scoverage.forked.outputDirectory"; private final static String PROP_FORKED_ARTIFACT_FILE = "_scoverage.forked.artifactFile"; /** * Configures project and dependent modules in multi-module project when entering forked {@code scoverage} * life cycle. * * @param project Maven project in {@code scoverage} forked life cycle. * @param reactorProjects all reactor Maven projects. * @param additionalProjectPropertiesMap additional project properties to set. */ public static void afterForkedLifecycleEnter( MavenProject project, List reactorProjects, Map additionalProjectPropertiesMap ) { File classesDirectory = new File( project.getBuild().getOutputDirectory() ); File scoverageClassesDirectory = new File( classesDirectory.getParentFile(), "scoverage-" + classesDirectory.getName() ); project.getArtifact().setFile( null ); project.getBuild().setOutputDirectory( scoverageClassesDirectory.getAbsolutePath() ); if ( additionalProjectPropertiesMap != null ) { for ( Map.Entry entry: additionalProjectPropertiesMap.entrySet() ) { project.getProperties().put( entry.getKey(), entry.getValue() ); } } for ( MavenProject reactorProject : reactorProjects ) { if ( reactorProject != project ) { if ( reactorProject.getProperties().containsKey( PROP_FORKED_OUTPUT_DIRECTORY ) ) { String forkedOutputDirectory = (String) reactorProject.getProperties().remove/* get */( PROP_FORKED_OUTPUT_DIRECTORY ); reactorProject.getProperties().put( PROP_ORIG_OUTPUT_DIRECTORY, reactorProject.getBuild().getOutputDirectory() ); reactorProject.getBuild().setOutputDirectory( forkedOutputDirectory ); } if ( reactorProject.getProperties().containsKey( PROP_FORKED_ARTIFACT_FILE ) ) { String forkedArtifactFilePath = (String) reactorProject.getProperties().remove/* get */( PROP_FORKED_ARTIFACT_FILE ); File originalArtifactFile = reactorProject.getArtifact().getFile(); reactorProject.getProperties().put( PROP_ORIG_ARTIFACT_FILE, originalArtifactFile == null ? "" : originalArtifactFile.getAbsolutePath() ); reactorProject.getArtifact().setFile( "".equals( forkedArtifactFilePath ) ? null : new File( forkedArtifactFilePath ) ); } } } } /** * Restores original configuration after leaving forked {@code scoverage} life cycle. *
* {@code project} is a project in default life cycle, {@code project.getExecutionProject()} * is a project in just finished forked {@code scoverage} life cycle. * * @param project Maven project in default life cycle. * @param reactorProjects all reactor Maven projects. */ public static void afterForkedLifecycleExit( MavenProject project, List reactorProjects ) { String forkedOutputDirectory = project.getExecutionProject().getBuild().getOutputDirectory(); project.getProperties().put( PROP_FORKED_OUTPUT_DIRECTORY, forkedOutputDirectory ); File forkedArtifactFile = project.getExecutionProject().getArtifact().getFile(); project.getProperties().put( PROP_FORKED_ARTIFACT_FILE, forkedArtifactFile != null ? forkedArtifactFile.getAbsolutePath() : "" ); // Restore changed outputDirectory and artifact.file in other reactor projects for ( MavenProject reactorProject : reactorProjects ) { if ( reactorProject != project ) { if ( reactorProject.getProperties().containsKey( PROP_ORIG_OUTPUT_DIRECTORY ) ) { String originalOutputDirectory = (String) reactorProject.getProperties().remove( PROP_ORIG_OUTPUT_DIRECTORY ); forkedOutputDirectory = reactorProject.getBuild().getOutputDirectory(); reactorProject.getProperties().put( PROP_FORKED_OUTPUT_DIRECTORY, forkedOutputDirectory ); reactorProject.getBuild().setOutputDirectory( originalOutputDirectory ); } if ( reactorProject.getProperties().containsKey( PROP_ORIG_ARTIFACT_FILE ) ) { String originalArtifactFilePath = (String) reactorProject.getProperties().remove/* get */( PROP_ORIG_ARTIFACT_FILE ); forkedArtifactFile = reactorProject.getArtifact().getFile(); reactorProject.getProperties().put( PROP_FORKED_ARTIFACT_FILE, forkedArtifactFile == null ? "" : forkedArtifactFile.getAbsolutePath() ); reactorProject.getArtifact().setFile( "".equals( originalArtifactFilePath ) ? null : new File( originalArtifactFilePath ) ); } } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy