diff --git a/pom.xml b/pom.xml index 1a30a4bf..de951bb5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,4 @@ - - + - 4.0.0 - maven-plugins org.apache.maven.plugins - 37 + maven-plugins + 39 @@ -34,10 +32,8 @@ under the License. maven-plugin Apache Maven Invoker Plugin - - The Maven Invoker Plugin is used to run a set of Maven projects. The plugin can determine whether each project - execution is successful, and optionally can verify the output generated from a given project execution. - + The Maven Invoker Plugin is used to run a set of Maven projects. The plugin can determine whether each project + execution is successful, and optionally can verify the output generated from a given project execution. ${mavenVersion} @@ -46,8 +42,8 @@ under the License. scm:git:https://gitbox.apache.org/repos/asf/maven-invoker-plugin.git scm:git:https://gitbox.apache.org/repos/asf/maven-invoker-plugin.git - https://github.com/apache/maven-invoker-plugin/tree/${project.scm.tag} HEAD + https://github.com/apache/maven-invoker-plugin/tree/${project.scm.tag} jira @@ -268,8 +264,8 @@ under the License. test - plexus-container-default org.codehaus.plexus + plexus-container-default @@ -330,6 +326,12 @@ under the License. org.codehaus.modello modello-maven-plugin + + + src/main/mdo/invocation.mdo + + 1.0.0 + standard @@ -344,18 +346,12 @@ under the License. site-docs - pre-site xdoc + pre-site - - - src/main/mdo/invocation.mdo - - 1.0.0 - org.apache.maven.plugins diff --git a/src/main/java/org/apache/maven/plugins/invoker/AbstractInvokerMojo.java b/src/main/java/org/apache/maven/plugins/invoker/AbstractInvokerMojo.java index f8518c42..68d81bdc 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/AbstractInvokerMojo.java +++ b/src/main/java/org/apache/maven/plugins/invoker/AbstractInvokerMojo.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -111,9 +129,7 @@ * @author Stephen Connolly * @since 15-Aug-2009 09:09:29 */ -public abstract class AbstractInvokerMojo - extends AbstractMojo -{ +public abstract class AbstractInvokerMojo extends AbstractMojo { /** * The zero-based column index where to print the invoker result. */ @@ -124,7 +140,7 @@ public abstract class AbstractInvokerMojo * * @since 1.1 */ - @Parameter( property = "invoker.skip", defaultValue = "false" ) + @Parameter(property = "invoker.skip", defaultValue = "false") private boolean skipInvocation; /** @@ -135,7 +151,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( defaultValue = "false" ) + @Parameter(defaultValue = "false") protected boolean suppressSummaries; /** @@ -143,7 +159,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.streamLogs", defaultValue = "false" ) + @Parameter(property = "invoker.streamLogs", defaultValue = "false") private boolean streamLogs; /** @@ -153,7 +169,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.localRepositoryPath", defaultValue = "${settings.localRepository}" ) + @Parameter(property = "invoker.localRepositoryPath", defaultValue = "${settings.localRepository}") private File localRepositoryPath; /** @@ -161,7 +177,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.projectsDirectory", defaultValue = "${basedir}/src/it/" ) + @Parameter(property = "invoker.projectsDirectory", defaultValue = "${basedir}/src/it/") private File projectsDirectory; /** @@ -171,7 +187,7 @@ public abstract class AbstractInvokerMojo * * @since 1.4 */ - @Parameter( property = "invoker.reportsDirectory", defaultValue = "${project.build.directory}/invoker-reports" ) + @Parameter(property = "invoker.reportsDirectory", defaultValue = "${project.build.directory}/invoker-reports") private File reportsDirectory; /** @@ -179,7 +195,7 @@ public abstract class AbstractInvokerMojo * * @since 1.4 */ - @Parameter( property = "invoker.disableReports", defaultValue = "false" ) + @Parameter(property = "invoker.disableReports", defaultValue = "false") private boolean disableReports; /** @@ -191,7 +207,7 @@ public abstract class AbstractInvokerMojo * * @since 1.1 */ - @Parameter( property = "invoker.cloneProjectsTo" ) + @Parameter(property = "invoker.cloneProjectsTo") private File cloneProjectsTo; // CHECKSTYLE_OFF: LineLength @@ -205,7 +221,7 @@ public abstract class AbstractInvokerMojo * * @since 1.2 */ - @Parameter( defaultValue = "false" ) + @Parameter(defaultValue = "false") private boolean cloneAllFiles; // CHECKSTYLE_ON: LineLength @@ -214,7 +230,7 @@ public abstract class AbstractInvokerMojo * * @since 1.6 */ - @Parameter( defaultValue = "true" ) + @Parameter(defaultValue = "true") private boolean cloneClean; /** @@ -222,7 +238,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.pom" ) + @Parameter(property = "invoker.pom") private File pom; /** @@ -238,7 +254,7 @@ public abstract class AbstractInvokerMojo * @since 1.0 */ @Parameter - private List pomIncludes = Collections.singletonList( "*/pom.xml" ); + private List pomIncludes = Collections.singletonList("*/pom.xml"); /** * Exclude patterns for searching the integration test directory. This parameter is meant to be set from the POM. By @@ -260,7 +276,7 @@ public abstract class AbstractInvokerMojo * @since 1.3 */ @Parameter - private List setupIncludes = Collections.singletonList( "setup*/pom.xml" ); + private List setupIncludes = Collections.singletonList("setup*/pom.xml"); /** * The list of goals to execute on each project. Default value is: package. @@ -268,7 +284,7 @@ public abstract class AbstractInvokerMojo * @since 1.0 */ @Parameter - private List goals = Collections.singletonList( "package" ); + private List goals = Collections.singletonList("package"); /** * Relative path of a selector script to run prior in order to decide if the build should be executed. This script @@ -282,7 +298,7 @@ public abstract class AbstractInvokerMojo * * @since 1.5 */ - @Parameter( property = "invoker.selectorScript", defaultValue = "selector" ) + @Parameter(property = "invoker.selectorScript", defaultValue = "selector") private String selectorScript; /** @@ -295,7 +311,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.preBuildHookScript", defaultValue = "prebuild" ) + @Parameter(property = "invoker.preBuildHookScript", defaultValue = "prebuild") private String preBuildHookScript; /** @@ -307,7 +323,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.postBuildHookScript", defaultValue = "postbuild" ) + @Parameter(property = "invoker.postBuildHookScript", defaultValue = "postbuild") private String postBuildHookScript; /** @@ -315,7 +331,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.testPropertiesFile", defaultValue = "test.properties" ) + @Parameter(property = "invoker.testPropertiesFile", defaultValue = "test.properties") private String testPropertiesFile; /** @@ -331,7 +347,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.showErrors", defaultValue = "false" ) + @Parameter(property = "invoker.showErrors", defaultValue = "false") private boolean showErrors; /** @@ -339,7 +355,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.debug", defaultValue = "false" ) + @Parameter(property = "invoker.debug", defaultValue = "false") private boolean debug; /** @@ -347,7 +363,7 @@ public abstract class AbstractInvokerMojo * * @since 3.3.0 */ - @Parameter( property = "invoker.quiet", defaultValue = "false" ) + @Parameter(property = "invoker.quiet", defaultValue = "false") private boolean quiet; /** @@ -355,7 +371,7 @@ public abstract class AbstractInvokerMojo * * @since 1.0 */ - @Parameter( property = "invoker.noLog", defaultValue = "false" ) + @Parameter(property = "invoker.noLog", defaultValue = "false") private boolean noLog; /** @@ -394,7 +410,7 @@ public abstract class AbstractInvokerMojo * * @since 1.1 (exclusion since 1.8) */ - @Parameter( property = "invoker.test" ) + @Parameter(property = "invoker.test") private String invokerTest; /** @@ -404,7 +420,7 @@ public abstract class AbstractInvokerMojo * * @since 1.2 */ - @Parameter( property = "invoker.settingsFile" ) + @Parameter(property = "invoker.settingsFile") private File settingsFile; /** @@ -413,7 +429,7 @@ public abstract class AbstractInvokerMojo * * @since 1.2 */ - @Parameter( property = "invoker.mavenOpts" ) + @Parameter(property = "invoker.mavenOpts") private String mavenOpts; /** @@ -422,7 +438,7 @@ public abstract class AbstractInvokerMojo * * @since 1.3 */ - @Parameter( property = "invoker.mavenHome" ) + @Parameter(property = "invoker.mavenHome") private File mavenHome; /** @@ -431,7 +447,7 @@ public abstract class AbstractInvokerMojo * * @since 1.8 */ - @Parameter( property = "invoker.mavenExecutable" ) + @Parameter(property = "invoker.mavenExecutable") private File mavenExecutable; /** @@ -440,7 +456,7 @@ public abstract class AbstractInvokerMojo * * @since 1.3 */ - @Parameter( property = "invoker.javaHome" ) + @Parameter(property = "invoker.javaHome") private File javaHome; /** @@ -448,7 +464,7 @@ public abstract class AbstractInvokerMojo * * @since 1.2 */ - @Parameter( property = "encoding", defaultValue = "${project.build.sourceEncoding}" ) + @Parameter(property = "encoding", defaultValue = "${project.build.sourceEncoding}") private String encoding; /** @@ -460,7 +476,7 @@ public abstract class AbstractInvokerMojo * * @since 1.2 */ - @Parameter( property = "invoker.addTestClassPath", defaultValue = "false" ) + @Parameter(property = "invoker.addTestClassPath", defaultValue = "false") private boolean addTestClassPath; /** @@ -604,7 +620,7 @@ public abstract class AbstractInvokerMojo * * @since 1.2 */ - @Parameter( property = "invoker.invokerPropertiesFile", defaultValue = "invoker.properties" ) + @Parameter(property = "invoker.invokerPropertiesFile", defaultValue = "invoker.properties") private String invokerPropertiesFile; /** @@ -612,7 +628,7 @@ public abstract class AbstractInvokerMojo * * @since 1.4 */ - @Parameter( property = "invoker.showVersion", defaultValue = "false" ) + @Parameter(property = "invoker.showVersion", defaultValue = "false") private boolean showVersion; /** @@ -624,7 +640,7 @@ public abstract class AbstractInvokerMojo * * @since 1.6 */ - @Parameter( property = "invoker.parallelThreads", defaultValue = "1" ) + @Parameter(property = "invoker.parallelThreads", defaultValue = "1") private String parallelThreads; /** @@ -633,7 +649,7 @@ public abstract class AbstractInvokerMojo * * @since 1.6 */ - @Parameter( property = "invoker.mergeUserSettings", defaultValue = "false" ) + @Parameter(property = "invoker.mergeUserSettings", defaultValue = "false") private boolean mergeUserSettings; /** @@ -656,30 +672,30 @@ public abstract class AbstractInvokerMojo * * @since 3.0.2 */ - @Parameter( defaultValue = "0", property = "invoker.timeoutInSeconds" ) + @Parameter(defaultValue = "0", property = "invoker.timeoutInSeconds") private int timeoutInSeconds; /** * Write test result in junit format. * @since 3.1.2 */ - @Parameter( defaultValue = "false", property = "invoker.writeJunitReport" ) + @Parameter(defaultValue = "false", property = "invoker.writeJunitReport") private boolean writeJunitReport; /** * The package name use in junit report * @since 3.1.2 */ - @Parameter( defaultValue = "maven.invoker.it", property = "invoker.junitPackageName" ) + @Parameter(defaultValue = "maven.invoker.it", property = "invoker.junitPackageName") private String junitPackageName = "maven.invoker.it"; /** * Only invoke maven projects if their sources have been modified since * they were last built. Only works in conjunction with cloneProjectsTo. - + * * @since 3.2.2 */ - @Parameter( defaultValue = "false", property = "invoker.updateOnly" ) + @Parameter(defaultValue = "false", property = "invoker.updateOnly") private boolean updateOnly = false; /** @@ -688,7 +704,7 @@ public abstract class AbstractInvokerMojo * * @since 3.4.0 */ - @Parameter( defaultValue = "false", property = "invoker.updateSnapshots" ) + @Parameter(defaultValue = "false", property = "invoker.updateSnapshots") private boolean updateSnapshots; // internal state variables @@ -708,7 +724,7 @@ public abstract class AbstractInvokerMojo /** * The format for elapsed build time. */ - private final DecimalFormat secFormat = new DecimalFormat( "(0.0 s)", new DecimalFormatSymbols( Locale.ENGLISH ) ); + private final DecimalFormat secFormat = new DecimalFormat("(0.0 s)", new DecimalFormatSymbols(Locale.ENGLISH)); /** * The version of Maven which is used to run the builds @@ -717,22 +733,22 @@ public abstract class AbstractInvokerMojo // used components - readonly parameters - @Parameter( property = "plugin.artifacts", required = true, readonly = true ) + @Parameter(property = "plugin.artifacts", required = true, readonly = true) private List pluginArtifacts; - @Parameter( defaultValue = "${project.testClasspathElements}", readonly = true ) + @Parameter(defaultValue = "${project.testClasspathElements}", readonly = true) private List testClassPath; - @Parameter( defaultValue = "${mojoExecution}", readonly = true, required = true ) + @Parameter(defaultValue = "${mojoExecution}", readonly = true, required = true) private MojoExecution mojoExecution; - @Parameter( defaultValue = "${project}", readonly = true, required = true ) + @Parameter(defaultValue = "${project}", readonly = true, required = true) private MavenProject project; - @Parameter( defaultValue = "${session}", readonly = true, required = true ) + @Parameter(defaultValue = "${session}", readonly = true, required = true) private MavenSession session; - @Parameter( defaultValue = "${settings}", readonly = true, required = true ) + @Parameter(defaultValue = "${settings}", readonly = true, required = true) private Settings settings; @Component @@ -750,61 +766,49 @@ public abstract class AbstractInvokerMojo * @throws org.apache.maven.plugin.MojoExecutionException If the goal encountered severe errors. * @throws org.apache.maven.plugin.MojoFailureException If any of the Maven builds failed. */ - public void execute() - throws MojoExecutionException, MojoFailureException - { - if ( skipInvocation ) - { - getLog().info( "Skipping invocation per configuration." - + " If this is incorrect, ensure the skipInvocation parameter is not set to true." ); + public void execute() throws MojoExecutionException, MojoFailureException { + if (skipInvocation) { + getLog().info("Skipping invocation per configuration." + + " If this is incorrect, ensure the skipInvocation parameter is not set to true."); return; } - if ( StringUtils.isEmpty( encoding ) ) - { - getLog().warn( "File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING - + ", i.e. build is platform dependent!" ); + if (StringUtils.isEmpty(encoding)) { + getLog().warn("File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING + + ", i.e. build is platform dependent!"); } // done it here to prevent issues with concurrent access in case of parallel run - if ( !disableReports ) - { + if (!disableReports) { setupReportsFolder(); } List buildJobs; - if ( pom == null ) - { - try - { + if (pom == null) { + try { buildJobs = getBuildJobs(); - } - catch ( final IOException e ) - { - throw new MojoExecutionException( "Error retrieving POM list from includes, " - + "excludes, and projects directory. Reason: " + e.getMessage(), e ); - } - } - else - { - try - { + } catch (final IOException e) { + throw new MojoExecutionException( + "Error retrieving POM list from includes, " + "excludes, and projects directory. Reason: " + + e.getMessage(), + e); + } + } else { + try { projectsDirectory = pom.getCanonicalFile().getParentFile(); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to discover projectsDirectory from " - + "pom File parameter. Reason: " + e.getMessage(), e ); + } catch (IOException e) { + throw new MojoExecutionException( + "Failed to discover projectsDirectory from " + "pom File parameter. Reason: " + e.getMessage(), + e); } - buildJobs = Collections.singletonList( new BuildJob( pom.getName() ) ); + buildJobs = Collections.singletonList(new BuildJob(pom.getName())); } - if ( buildJobs.isEmpty() ) - { + if (buildJobs.isEmpty()) { doFailIfNoProjects(); - getLog().info( "No projects were selected for execution." ); + getLog().info("No projects were selected for execution."); return; } @@ -813,98 +817,74 @@ public void execute() handleScriptRunnerWithScriptClassPath(); Collection collectedProjects = new LinkedHashSet<>(); - for ( BuildJob buildJob : buildJobs ) - { - collectProjects( projectsDirectory, buildJob.getProject(), collectedProjects, true ); + for (BuildJob buildJob : buildJobs) { + collectProjects(projectsDirectory, buildJob.getProject(), collectedProjects, true); } File projectsDir = projectsDirectory; - if ( cloneProjectsTo == null && "maven-plugin".equals( project.getPackaging() ) ) - { - cloneProjectsTo = new File( project.getBuild().getDirectory(), "its" ); + if (cloneProjectsTo == null && "maven-plugin".equals(project.getPackaging())) { + cloneProjectsTo = new File(project.getBuild().getDirectory(), "its"); } - if ( updateOnly ) - { - if ( cloneProjectsTo == null ) - { - getLog().warn( "updateOnly functionality is not supported without cloning the projects" ); - } - else if ( lastModifiedRecursive( projectsDirectory ) <= lastModifiedRecursive( cloneProjectsTo ) ) - { - getLog().debug( "Skipping invocation as cloned projects are up-to-date " - + "and updateOnly parameter is set to true." ); + if (updateOnly) { + if (cloneProjectsTo == null) { + getLog().warn("updateOnly functionality is not supported without cloning the projects"); + } else if (lastModifiedRecursive(projectsDirectory) <= lastModifiedRecursive(cloneProjectsTo)) { + getLog().debug("Skipping invocation as cloned projects are up-to-date " + + "and updateOnly parameter is set to true."); return; - } - else - { - getLog().debug( "Cloned projects are out of date" ); + } else { + getLog().debug("Cloned projects are out of date"); } } - if ( cloneProjectsTo != null ) - { - cloneProjects( collectedProjects ); + if (cloneProjectsTo != null) { + cloneProjects(collectedProjects); projectsDir = cloneProjectsTo; - } - else - { - getLog().warn( "Filtering of parent/child POMs is not supported without cloning the projects" ); + } else { + getLog().warn("Filtering of parent/child POMs is not supported without cloning the projects"); } // First run setup jobs. - List setupBuildJobs = getSetupJobs( buildJobs ); + List setupBuildJobs = getSetupJobs(buildJobs); - if ( !setupBuildJobs.isEmpty() ) - { + if (!setupBuildJobs.isEmpty()) { // Run setup jobs in single thread mode. // // Jobs are ordered according to ordinal value from invoker.properties - getLog().info( "Running " + setupBuildJobs.size() + " setup job" - + ( ( setupBuildJobs.size() < 2 ) ? "" : "s" ) + ":" ); - runBuilds( projectsDir, setupBuildJobs, 1 ); - getLog().info( "Setup done." ); + getLog().info("Running " + setupBuildJobs.size() + " setup job" + ((setupBuildJobs.size() < 2) ? "" : "s") + + ":"); + runBuilds(projectsDir, setupBuildJobs, 1); + getLog().info("Setup done."); } + List nonSetupBuildJobs = getNonSetupJobs(buildJobs); - List nonSetupBuildJobs = getNonSetupJobs( buildJobs ); - - if ( setupBuildJobs.isEmpty() || setupBuildJobs.stream().allMatch( BuildJob::isNotError ) ) - { + if (setupBuildJobs.isEmpty() || setupBuildJobs.stream().allMatch(BuildJob::isNotError)) { // We will run the non setup jobs with the configured // parallelThreads number. - runBuilds( projectsDir, nonSetupBuildJobs, getParallelThreadsCount() ); - } - else - { - for ( BuildJob buildJob : nonSetupBuildJobs ) - { - buildJob.setResult( BuildJob.Result.SKIPPED ); - buildJob.setFailureMessage( "Skipped due to setup job(s) failure" ); - writeBuildReport( buildJob ); + runBuilds(projectsDir, nonSetupBuildJobs, getParallelThreadsCount()); + } else { + for (BuildJob buildJob : nonSetupBuildJobs) { + buildJob.setResult(BuildJob.Result.SKIPPED); + buildJob.setFailureMessage("Skipped due to setup job(s) failure"); + writeBuildReport(buildJob); } } - writeSummaryFile( buildJobs ); - processResults( new InvokerSession( buildJobs ) ); + writeSummaryFile(buildJobs); + processResults(new InvokerSession(buildJobs)); } - private void setupActualMavenVersion() throws MojoExecutionException - { - if ( mavenHome != null ) - { - try - { - actualMavenVersion = SelectorUtils.getMavenVersion( mavenHome ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( e.getMessage(), e ); + private void setupActualMavenVersion() throws MojoExecutionException { + if (mavenHome != null) { + try { + actualMavenVersion = SelectorUtils.getMavenVersion(mavenHome); + } catch (IOException e) { + throw new MojoExecutionException(e.getMessage(), e); } - } - else - { + } else { actualMavenVersion = SelectorUtils.getMavenVersion(); } } @@ -915,17 +895,14 @@ private void setupActualMavenVersion() throws MojoExecutionException * @param file the root file to check. * @return the latest lastModified time found. */ - private long lastModifiedRecursive( File file ) - { + private long lastModifiedRecursive(File file) { long lastModified = file.lastModified(); final File[] entries = file.listFiles(); - if ( entries != null ) - { - for ( File entry : entries ) - { - lastModified = Math.max( lastModified, lastModifiedRecursive( entry ) ); + if (entries != null) { + for (File entry : entries) { + lastModified = Math.max(lastModified, lastModifiedRecursive(entry)); } } @@ -937,102 +914,77 @@ private long lastModifiedRecursive( File file ) * * @throws MojoExecutionException in case of failure during creation of the reports folder. */ - private void setupReportsFolder() - throws MojoExecutionException - { + private void setupReportsFolder() throws MojoExecutionException { // If it exists from previous run... - if ( reportsDirectory.exists() ) - { - try - { - FileUtils.deleteDirectory( reportsDirectory ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failure while trying to delete " - + reportsDirectory.getAbsolutePath(), e ); + if (reportsDirectory.exists()) { + try { + FileUtils.deleteDirectory(reportsDirectory); + } catch (IOException e) { + throw new MojoExecutionException( + "Failure while trying to delete " + reportsDirectory.getAbsolutePath(), e); } } - if ( !reportsDirectory.mkdirs() ) - { - throw new MojoExecutionException( "Failure while creating the " + reportsDirectory.getAbsolutePath() ); + if (!reportsDirectory.mkdirs()) { + throw new MojoExecutionException("Failure while creating the " + reportsDirectory.getAbsolutePath()); } } - private List getSetupJobs( List buildJobs ) - { - return buildJobs.stream(). - filter( buildJob -> buildJob.getType().equals( BuildJob.Type.SETUP ) ). - collect( Collectors.toList() ); + private List getSetupJobs(List buildJobs) { + return buildJobs.stream() + .filter(buildJob -> buildJob.getType().equals(BuildJob.Type.SETUP)) + .collect(Collectors.toList()); } - private List getNonSetupJobs( List buildJobs ) - { - return buildJobs.stream(). - filter( buildJob -> !buildJob.getType().equals( BuildJob.Type.SETUP ) ). - collect( Collectors.toList() ); + private List getNonSetupJobs(List buildJobs) { + return buildJobs.stream() + .filter(buildJob -> !buildJob.getType().equals(BuildJob.Type.SETUP)) + .collect(Collectors.toList()); } - private void handleScriptRunnerWithScriptClassPath() - { + private void handleScriptRunnerWithScriptClassPath() { final List scriptClassPath; - if ( addTestClassPath ) - { - scriptClassPath = new ArrayList<>( testClassPath ); - for ( Artifact pluginArtifact : pluginArtifacts ) - { - scriptClassPath.remove( pluginArtifact.getFile().getAbsolutePath() ); + if (addTestClassPath) { + scriptClassPath = new ArrayList<>(testClassPath); + for (Artifact pluginArtifact : pluginArtifacts) { + scriptClassPath.remove(pluginArtifact.getFile().getAbsolutePath()); } - } - else - { + } else { scriptClassPath = null; } - scriptRunner = new ScriptRunner( ); - scriptRunner.setScriptEncoding( encoding ); - scriptRunner.setGlobalVariable( "localRepositoryPath", localRepositoryPath ); - scriptRunner.setGlobalVariable( "mavenVersion", actualMavenVersion ); - if ( scriptVariables != null ) - { - scriptVariables.forEach( ( key, value ) -> scriptRunner.setGlobalVariable( key, value ) ); + scriptRunner = new ScriptRunner(); + scriptRunner.setScriptEncoding(encoding); + scriptRunner.setGlobalVariable("localRepositoryPath", localRepositoryPath); + scriptRunner.setGlobalVariable("mavenVersion", actualMavenVersion); + if (scriptVariables != null) { + scriptVariables.forEach((key, value) -> scriptRunner.setGlobalVariable(key, value)); } - scriptRunner.setClassPath( scriptClassPath ); + scriptRunner.setClassPath(scriptClassPath); } - private void writeSummaryFile( List buildJobs ) - throws MojoExecutionException - { - - File summaryReportFile = new File( reportsDirectory, "invoker-summary.txt" ); - - try ( Writer writer = new BufferedWriter( new FileWriter( summaryReportFile ) ) ) - { - for ( BuildJob buildJob : buildJobs ) - { - if ( !BuildJob.Result.SUCCESS.equals( buildJob.getResult() ) ) - { - writer.append( buildJob.getResult() ); - writer.append( " [" ); - writer.append( buildJob.getProject() ); - writer.append( "] " ); - if ( buildJob.getFailureMessage() != null ) - { - writer.append( " " ); - writer.append( buildJob.getFailureMessage() ); + private void writeSummaryFile(List buildJobs) throws MojoExecutionException { + + File summaryReportFile = new File(reportsDirectory, "invoker-summary.txt"); + + try (Writer writer = new BufferedWriter(new FileWriter(summaryReportFile))) { + for (BuildJob buildJob : buildJobs) { + if (!BuildJob.Result.SUCCESS.equals(buildJob.getResult())) { + writer.append(buildJob.getResult()); + writer.append(" ["); + writer.append(buildJob.getProject()); + writer.append("] "); + if (buildJob.getFailureMessage() != null) { + writer.append(" "); + writer.append(buildJob.getFailureMessage()); } - writer.append( "\n" ); + writer.append("\n"); } } - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to write summary report " + summaryReportFile, e ); + } catch (IOException e) { + throw new MojoExecutionException("Failed to write summary report " + summaryReportFile, e); } } - protected void doFailIfNoProjects() - throws MojoFailureException - { + protected void doFailIfNoProjects() throws MojoFailureException { // should only be used during run and verify } @@ -1043,8 +995,7 @@ protected void doFailIfNoProjects() * @throws MojoFailureException If the mojo had failed as a result of invoking the build jobs. * @since 1.4 */ - abstract void processResults( InvokerSession invokerSession ) - throws MojoFailureException; + abstract void processResults(InvokerSession invokerSession) throws MojoFailureException; /** * Collects all projects locally reachable from the specified project. The method will as such try to read the POM @@ -1060,74 +1011,59 @@ abstract void processResults( InvokerSession invokerSession ) * corresponding POM. * @throws org.apache.maven.plugin.MojoExecutionException If the project tree could not be traversed. */ - private void collectProjects( File projectsDir, String projectPath, Collection projectPaths, - boolean included ) - throws MojoExecutionException - { - projectPath = projectPath.replace( '\\', '/' ); - File pomFile = new File( projectsDir, projectPath ); - if ( pomFile.isDirectory() ) - { - pomFile = new File( pomFile, "pom.xml" ); - if ( !pomFile.exists() ) - { - if ( included ) - { - projectPaths.add( projectPath ); + private void collectProjects( + File projectsDir, String projectPath, Collection projectPaths, boolean included) + throws MojoExecutionException { + projectPath = projectPath.replace('\\', '/'); + File pomFile = new File(projectsDir, projectPath); + if (pomFile.isDirectory()) { + pomFile = new File(pomFile, "pom.xml"); + if (!pomFile.exists()) { + if (included) { + projectPaths.add(projectPath); } return; } - if ( !projectPath.endsWith( "/" ) ) - { + if (!projectPath.endsWith("/")) { projectPath += '/'; } projectPath += "pom.xml"; - } - else if ( !pomFile.isFile() ) - { + } else if (!pomFile.isFile()) { return; } - if ( !projectPaths.add( projectPath ) ) - { + if (!projectPaths.add(projectPath)) { return; } - getLog().debug( "Collecting parent/child projects of " + projectPath ); + getLog().debug("Collecting parent/child projects of " + projectPath); - Model model = PomUtils.loadPom( pomFile ); + Model model = PomUtils.loadPom(pomFile); - try - { + try { String projectsRoot = projectsDir.getCanonicalPath(); String projectDir = pomFile.getParent(); String parentPath = "../pom.xml"; - if ( model.getParent() != null && StringUtils.isNotEmpty( model.getParent().getRelativePath() ) ) - { + if (model.getParent() != null + && StringUtils.isNotEmpty(model.getParent().getRelativePath())) { parentPath = model.getParent().getRelativePath(); } - String parent = relativizePath( new File( projectDir, parentPath ), projectsRoot ); - if ( parent != null ) - { - collectProjects( projectsDir, parent, projectPaths, false ); + String parent = relativizePath(new File(projectDir, parentPath), projectsRoot); + if (parent != null) { + collectProjects(projectsDir, parent, projectPaths, false); } - Collection modulePaths = new LinkedHashSet<>( model.getModules() ); - - model.getProfiles().forEach( profile -> modulePaths.addAll( profile.getModules() ) ); + Collection modulePaths = new LinkedHashSet<>(model.getModules()); + model.getProfiles().forEach(profile -> modulePaths.addAll(profile.getModules())); - for ( String modulePath : modulePaths ) - { - String module = relativizePath( new File( projectDir, modulePath ), projectsRoot ); - if ( module != null ) - { - collectProjects( projectsDir, module, projectPaths, false ); + for (String modulePath : modulePaths) { + String module = relativizePath(new File(projectDir, modulePath), projectsRoot); + if (module != null) { + collectProjects(projectsDir, module, projectPaths, false); } } - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to analyze POM: " + pomFile, e ); + } catch (IOException e) { + throw new MojoExecutionException("Failed to analyze POM: " + pomFile, e); } } @@ -1139,113 +1075,91 @@ else if ( !pomFile.isFile() ) * null nor contain null elements. * @throws org.apache.maven.plugin.MojoExecutionException If the the projects could not be copied/filtered. */ - private void cloneProjects( Collection projectPaths ) - throws MojoExecutionException - { - if ( !cloneProjectsTo.mkdirs() && cloneClean ) - { - try - { - FileUtils.cleanDirectory( cloneProjectsTo ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Could not clean the cloneProjectsTo directory. Reason: " - + e.getMessage(), e ); + private void cloneProjects(Collection projectPaths) throws MojoExecutionException { + if (!cloneProjectsTo.mkdirs() && cloneClean) { + try { + FileUtils.cleanDirectory(cloneProjectsTo); + } catch (IOException e) { + throw new MojoExecutionException( + "Could not clean the cloneProjectsTo directory. Reason: " + e.getMessage(), e); } } // determine project directories to clone Collection dirs = new LinkedHashSet<>(); - for ( String projectPath : projectPaths ) - { - if ( !new File( projectsDirectory, projectPath ).isDirectory() ) - { - projectPath = getParentPath( projectPath ); + for (String projectPath : projectPaths) { + if (!new File(projectsDirectory, projectPath).isDirectory()) { + projectPath = getParentPath(projectPath); } - dirs.add( projectPath ); + dirs.add(projectPath); } boolean filter; // clone project directories - try - { - filter = !cloneProjectsTo.getCanonicalFile().equals( projectsDirectory.getCanonicalFile() ); + try { + filter = !cloneProjectsTo.getCanonicalFile().equals(projectsDirectory.getCanonicalFile()); List clonedSubpaths = new ArrayList<>(); - for ( String subpath : dirs ) - { + for (String subpath : dirs) { // skip this project if its parent directory is also scheduled for cloning - if ( !".".equals( subpath ) && dirs.contains( getParentPath( subpath ) ) ) - { + if (!".".equals(subpath) && dirs.contains(getParentPath(subpath))) { continue; } // avoid copying subdirs that are already cloned. - if ( !alreadyCloned( subpath, clonedSubpaths ) ) - { + if (!alreadyCloned(subpath, clonedSubpaths)) { // avoid creating new files that point to dir/. - if ( ".".equals( subpath ) ) - { - String cloneSubdir = relativizePath( cloneProjectsTo, projectsDirectory.getCanonicalPath() ); + if (".".equals(subpath)) { + String cloneSubdir = relativizePath(cloneProjectsTo, projectsDirectory.getCanonicalPath()); // avoid infinite recursion if the cloneTo path is a subdirectory. - if ( cloneSubdir != null ) - { - File temp = Files.createTempDirectory( "pre-invocation-clone." ).toFile(); + if (cloneSubdir != null) { + File temp = Files.createTempDirectory("pre-invocation-clone.") + .toFile(); - copyDirectoryStructure( projectsDirectory, temp ); + copyDirectoryStructure(projectsDirectory, temp); - FileUtils.deleteDirectory( new File( temp, cloneSubdir ) ); + FileUtils.deleteDirectory(new File(temp, cloneSubdir)); - copyDirectoryStructure( temp, cloneProjectsTo ); - } - else - { - copyDirectoryStructure( projectsDirectory, cloneProjectsTo ); + copyDirectoryStructure(temp, cloneProjectsTo); + } else { + copyDirectoryStructure(projectsDirectory, cloneProjectsTo); } - } - else - { - File srcDir = new File( projectsDirectory, subpath ); - File dstDir = new File( cloneProjectsTo, subpath ); - copyDirectoryStructure( srcDir, dstDir ); + } else { + File srcDir = new File(projectsDirectory, subpath); + File dstDir = new File(cloneProjectsTo, subpath); + copyDirectoryStructure(srcDir, dstDir); } - clonedSubpaths.add( subpath ); + clonedSubpaths.add(subpath); } } - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to clone projects from: " + projectsDirectory + " to: " - + cloneProjectsTo + ". Reason: " + e.getMessage(), e ); + } catch (IOException e) { + throw new MojoExecutionException( + "Failed to clone projects from: " + projectsDirectory + " to: " + cloneProjectsTo + ". Reason: " + + e.getMessage(), + e); } // filter cloned POMs - if ( filter ) - { - for ( String projectPath : projectPaths ) - { - File pomFile = new File( cloneProjectsTo, projectPath ); - if ( pomFile.isFile() ) - { - buildInterpolatedFile( pomFile, pomFile ); + if (filter) { + for (String projectPath : projectPaths) { + File pomFile = new File(cloneProjectsTo, projectPath); + if (pomFile.isFile()) { + buildInterpolatedFile(pomFile, pomFile); } // MINVOKER-186 // The following is a temporary solution to support Maven 3.3.1 (.mvn/extensions.xml) filtering // Will be replaced by MINVOKER-117 with general filtering mechanism File baseDir = pomFile.getParentFile(); - File mvnDir = new File( baseDir, ".mvn" ); - if ( mvnDir.isDirectory() ) - { - File extensionsFile = new File( mvnDir, "extensions.xml" ); - if ( extensionsFile.isFile() ) - { - buildInterpolatedFile( extensionsFile, extensionsFile ); + File mvnDir = new File(baseDir, ".mvn"); + if (mvnDir.isDirectory()) { + File extensionsFile = new File(mvnDir, "extensions.xml"); + if (extensionsFile.isFile()) { + buildInterpolatedFile(extensionsFile, extensionsFile); } } // END MINVOKER-186 @@ -1260,10 +1174,9 @@ private void cloneProjects( Collection projectPaths ) * @param path The relative path whose parent should be retrieved, must not be null. * @return The parent path or "." if the specified path has no parent, never null. */ - private String getParentPath( String path ) - { - int lastSep = Math.max( path.lastIndexOf( '/' ), path.lastIndexOf( '\\' ) ); - return ( lastSep < 0 ) ? "." : path.substring( 0, lastSep ); + private String getParentPath(String path) { + int lastSep = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')); + return (lastSep < 0) ? "." : path.substring(0, lastSep); } /** @@ -1273,13 +1186,10 @@ private String getParentPath( String path ) * @param destDir The target directory to copy to, must not be null. * @throws java.io.IOException If the directory structure could not be copied. */ - private void copyDirectoryStructure( File sourceDir, File destDir ) - throws IOException - { + private void copyDirectoryStructure(File sourceDir, File destDir) throws IOException { DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir( sourceDir ); - if ( !cloneAllFiles ) - { + scanner.setBasedir(sourceDir); + if (!cloneAllFiles) { scanner.addDefaultExcludes(); } scanner.scan(); @@ -1289,16 +1199,15 @@ private void copyDirectoryStructure( File sourceDir, File destDir ) */ destDir.mkdirs(); // Create all the directories, including any symlinks present in source - FileUtils.mkDirs( sourceDir, scanner.getIncludedDirectories(), destDir ); + FileUtils.mkDirs(sourceDir, scanner.getIncludedDirectories(), destDir); - for ( String includedFile : scanner.getIncludedFiles() ) - { - File sourceFile = new File( sourceDir, includedFile ); - File destFile = new File( destDir, includedFile ); - FileUtils.copyFile( sourceFile, destFile ); + for (String includedFile : scanner.getIncludedFiles()) { + File sourceFile = new File(sourceDir, includedFile); + File destFile = new File(destDir, includedFile); + FileUtils.copyFile(sourceFile, destFile); // ensure clone project must be writable for additional changes - destFile.setWritable( true ); + destFile.setWritable(true); } } @@ -1311,12 +1220,9 @@ private void copyDirectoryStructure( File sourceDir, File destDir ) * null elements. * @return true if the specified path has already been cloned, false otherwise. */ - static boolean alreadyCloned( String subpath, List clonedSubpaths ) - { - for ( String path : clonedSubpaths ) - { - if ( ".".equals( path ) || subpath.equals( path ) || subpath.startsWith( path + File.separator ) ) - { + static boolean alreadyCloned(String subpath, List clonedSubpaths) { + for (String path : clonedSubpaths) { + if (".".equals(path) || subpath.equals(path) || subpath.startsWith(path + File.separator)) { return true; } } @@ -1331,11 +1237,9 @@ static boolean alreadyCloned( String subpath, List clonedSubpaths ) * @param buildJobs The build jobs to run must not be null nor contain null elements. * @throws org.apache.maven.plugin.MojoExecutionException If any build could not be launched. */ - private void runBuilds( final File projectsDir, List buildJobs, int runWithParallelThreads ) - throws MojoExecutionException - { - if ( !localRepositoryPath.exists() ) - { + private void runBuilds(final File projectsDir, List buildJobs, int runWithParallelThreads) + throws MojoExecutionException { + if (!localRepositoryPath.exists()) { localRepositoryPath.mkdirs(); } @@ -1343,132 +1247,107 @@ private void runBuilds( final File projectsDir, List buildJobs, int ru // interpolate settings file // ----------------------------------------------- - File interpolatedSettingsFile = interpolateSettings( settingsFile ); + File interpolatedSettingsFile = interpolateSettings(settingsFile); - final File mergedSettingsFile = mergeSettings( interpolatedSettingsFile ); + final File mergedSettingsFile = mergeSettings(interpolatedSettingsFile); final CharSequence actualJreVersion; // @todo if ( javaVersions ) ... to be picked up from toolchains - if ( javaHome != null ) - { + if (javaHome != null) { actualJreVersion = resolveExternalJreVersion(); - } - else - { + } else { actualJreVersion = SelectorUtils.getJreVersion(); } final Path projectsPath = this.projectsDirectory.toPath(); Set folderGroupSet = new HashSet<>(); - folderGroupSet.add( Paths.get( "." ) ); - for ( BuildJob buildJob : buildJobs ) - { - Path p = Paths.get( buildJob.getProject() ); + folderGroupSet.add(Paths.get(".")); + for (BuildJob buildJob : buildJobs) { + Path p = Paths.get(buildJob.getProject()); - if ( Files.isRegularFile( projectsPath.resolve( p ) ) ) - { + if (Files.isRegularFile(projectsPath.resolve(p))) { p = p.getParent(); } - if ( p != null ) - { + if (p != null) { p = p.getParent(); } - while ( p != null && folderGroupSet.add( p ) ) - { + while (p != null && folderGroupSet.add(p)) { p = p.getParent(); } } - List folderGroup = new ArrayList<>( folderGroupSet ); - Collections.sort( folderGroup ); + List folderGroup = new ArrayList<>(folderGroupSet); + Collections.sort(folderGroup); final Map globalInvokerProperties = new HashMap<>(); - for ( Path path : folderGroup ) - { - Properties ancestorProperties = globalInvokerProperties.get( projectsPath.resolve( path ).getParent() ); + for (Path path : folderGroup) { + Properties ancestorProperties = + globalInvokerProperties.get(projectsPath.resolve(path).getParent()); - Path currentInvokerProperties = projectsPath.resolve( path ).resolve( invokerPropertiesFile ); + Path currentInvokerProperties = projectsPath.resolve(path).resolve(invokerPropertiesFile); Properties currentProperties; - if ( Files.isRegularFile( currentInvokerProperties ) ) - { - if ( ancestorProperties != null ) - { - currentProperties = new Properties( ancestorProperties ); + if (Files.isRegularFile(currentInvokerProperties)) { + if (ancestorProperties != null) { + currentProperties = new Properties(ancestorProperties); - } - else - { + } else { currentProperties = new Properties(); } - } - else - { + } else { currentProperties = ancestorProperties; } - if ( Files.isRegularFile( currentInvokerProperties ) ) - { - try ( InputStream in = new FileInputStream( currentInvokerProperties.toFile() ) ) - { - currentProperties.load( in ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to read invoker properties: " - + currentInvokerProperties ); + if (Files.isRegularFile(currentInvokerProperties)) { + try (InputStream in = new FileInputStream(currentInvokerProperties.toFile())) { + currentProperties.load(in); + } catch (IOException e) { + throw new MojoExecutionException("Failed to read invoker properties: " + currentInvokerProperties); } } - if ( currentProperties != null ) - { - globalInvokerProperties.put( projectsPath.resolve( path ).normalize(), currentProperties ); + if (currentProperties != null) { + globalInvokerProperties.put(projectsPath.resolve(path).normalize(), currentProperties); } } - try - { - if ( runWithParallelThreads > 1 ) - { - getLog().info( "use parallelThreads " + runWithParallelThreads ); + try { + if (runWithParallelThreads > 1) { + getLog().info("use parallelThreads " + runWithParallelThreads); } - JobExecutor jobExecutor = new JobExecutor( buildJobs, runWithParallelThreads ); - jobExecutor.forEach( job -> - { - Path ancestorFolder = getAncestorFolder( projectsPath.resolve( job.getProject() ) ); + JobExecutor jobExecutor = new JobExecutor(buildJobs, runWithParallelThreads); + jobExecutor.forEach(job -> { + Path ancestorFolder = getAncestorFolder(projectsPath.resolve(job.getProject())); - runBuild( projectsDir, job, mergedSettingsFile, javaHome, actualJreVersion, - globalInvokerProperties.get( ancestorFolder ) ); - - } ); - } - finally - { - if ( interpolatedSettingsFile != null && cloneProjectsTo == null ) - { + runBuild( + projectsDir, + job, + mergedSettingsFile, + javaHome, + actualJreVersion, + globalInvokerProperties.get(ancestorFolder)); + }); + } finally { + if (interpolatedSettingsFile != null && cloneProjectsTo == null) { interpolatedSettingsFile.delete(); } - if ( mergedSettingsFile != null && mergedSettingsFile.exists() ) - { + if (mergedSettingsFile != null && mergedSettingsFile.exists()) { mergedSettingsFile.delete(); } } } - private Path getAncestorFolder( Path p ) - { + private Path getAncestorFolder(Path p) { Path ancestor = p; - if ( Files.isRegularFile( ancestor ) ) - { + if (Files.isRegularFile(ancestor)) { ancestor = ancestor.getParent(); } - if ( ancestor != null ) - { + if (ancestor != null) { ancestor = ancestor.getParent(); } return ancestor; @@ -1481,22 +1360,16 @@ private Path getAncestorFolder( Path p ) * @return The interpolated settings.xml file. * @throws MojoExecutionException in case of a problem. */ - private File interpolateSettings( File settingsFile ) - throws MojoExecutionException - { + private File interpolateSettings(File settingsFile) throws MojoExecutionException { File interpolatedSettingsFile = null; - if ( settingsFile != null ) - { - if ( cloneProjectsTo != null ) - { - interpolatedSettingsFile = new File( cloneProjectsTo, "interpolated-" + settingsFile.getName() ); - } - else - { + if (settingsFile != null) { + if (cloneProjectsTo != null) { + interpolatedSettingsFile = new File(cloneProjectsTo, "interpolated-" + settingsFile.getName()); + } else { interpolatedSettingsFile = - new File( settingsFile.getParentFile(), "interpolated-" + settingsFile.getName() ); + new File(settingsFile.getParentFile(), "interpolated-" + settingsFile.getName()); } - buildInterpolatedFile( settingsFile, interpolatedSettingsFile ); + buildInterpolatedFile(settingsFile, interpolatedSettingsFile); } return interpolatedSettingsFile; } @@ -1508,136 +1381,105 @@ private File interpolateSettings( File settingsFile ) * @return The merged settings file. * @throws MojoExecutionException Fail the build in case the merged settings file can't be created. */ - private File mergeSettings( File interpolatedSettingsFile ) - throws MojoExecutionException - { + private File mergeSettings(File interpolatedSettingsFile) throws MojoExecutionException { File mergedSettingsFile; Settings mergedSettings = this.settings; - if ( mergeUserSettings ) - { - if ( interpolatedSettingsFile != null ) - { + if (mergeUserSettings) { + if (interpolatedSettingsFile != null) { // Have to merge the specified settings file (dominant) and the one of the invoking Maven process - try - { + try { SettingsBuildingRequest request = new DefaultSettingsBuildingRequest(); - request.setGlobalSettingsFile( interpolatedSettingsFile ); + request.setGlobalSettingsFile(interpolatedSettingsFile); - Settings dominantSettings = settingsBuilder.build( request ).getEffectiveSettings(); + Settings dominantSettings = settingsBuilder.build(request).getEffectiveSettings(); Settings recessiveSettings = cloneSettings(); - SettingsUtils.merge( dominantSettings, recessiveSettings, TrackableBase.USER_LEVEL ); + SettingsUtils.merge(dominantSettings, recessiveSettings, TrackableBase.USER_LEVEL); mergedSettings = dominantSettings; - getLog().debug( "Merged specified settings file with settings of invoking process" ); - } - catch ( SettingsBuildingException e ) - { - throw new MojoExecutionException( "Could not read specified settings file", e ); + getLog().debug("Merged specified settings file with settings of invoking process"); + } catch (SettingsBuildingException e) { + throw new MojoExecutionException("Could not read specified settings file", e); } } } - if ( this.settingsFile != null && !mergeUserSettings ) - { + if (this.settingsFile != null && !mergeUserSettings) { mergedSettingsFile = interpolatedSettingsFile; - } - else - { - try - { - mergedSettingsFile = writeMergedSettingsFile( mergedSettings ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Could not create temporary file for invoker settings.xml", e ); + } else { + try { + mergedSettingsFile = writeMergedSettingsFile(mergedSettings); + } catch (IOException e) { + throw new MojoExecutionException("Could not create temporary file for invoker settings.xml", e); } } return mergedSettingsFile; } - private File writeMergedSettingsFile( Settings mergedSettings ) - throws IOException - { + private File writeMergedSettingsFile(Settings mergedSettings) throws IOException { File mergedSettingsFile; - mergedSettingsFile = File.createTempFile( "invoker-settings", ".xml" ); + mergedSettingsFile = File.createTempFile("invoker-settings", ".xml"); SettingsXpp3Writer settingsWriter = new SettingsXpp3Writer(); - - try ( FileWriter fileWriter = new FileWriter( mergedSettingsFile ) ) - { - settingsWriter.write( fileWriter, mergedSettings ); + try (FileWriter fileWriter = new FileWriter(mergedSettingsFile)) { + settingsWriter.write(fileWriter, mergedSettings); } - if ( getLog().isDebugEnabled() ) - { - getLog().debug( "Created temporary file for invoker settings.xml: " - + mergedSettingsFile.getAbsolutePath() ); + if (getLog().isDebugEnabled()) { + getLog().debug("Created temporary file for invoker settings.xml: " + mergedSettingsFile.getAbsolutePath()); } return mergedSettingsFile; } - private Settings cloneSettings() - { - Settings recessiveSettings = SettingsUtils.copySettings( this.settings ); + private Settings cloneSettings() { + Settings recessiveSettings = SettingsUtils.copySettings(this.settings); // MINVOKER-133: reset sourceLevelSet - resetSourceLevelSet( recessiveSettings ); - for ( org.apache.maven.settings.Mirror mirror : recessiveSettings.getMirrors() ) - { - resetSourceLevelSet( mirror ); + resetSourceLevelSet(recessiveSettings); + for (org.apache.maven.settings.Mirror mirror : recessiveSettings.getMirrors()) { + resetSourceLevelSet(mirror); } - for ( org.apache.maven.settings.Server server : recessiveSettings.getServers() ) - { - resetSourceLevelSet( server ); + for (org.apache.maven.settings.Server server : recessiveSettings.getServers()) { + resetSourceLevelSet(server); } - for ( org.apache.maven.settings.Proxy proxy : recessiveSettings.getProxies() ) - { - resetSourceLevelSet( proxy ); + for (org.apache.maven.settings.Proxy proxy : recessiveSettings.getProxies()) { + resetSourceLevelSet(proxy); } - for ( org.apache.maven.settings.Profile profile : recessiveSettings.getProfiles() ) - { - resetSourceLevelSet( profile ); + for (org.apache.maven.settings.Profile profile : recessiveSettings.getProfiles()) { + resetSourceLevelSet(profile); } return recessiveSettings; } - private void resetSourceLevelSet( org.apache.maven.settings.TrackableBase trackable ) - { - try - { - ReflectionUtils.setVariableValueInObject( trackable, "sourceLevelSet", Boolean.FALSE ); - getLog().debug( "sourceLevelSet: " - + ReflectionUtils.getValueIncludingSuperclasses( "sourceLevelSet", trackable ) ); - } - catch ( IllegalAccessException e ) - { + private void resetSourceLevelSet(org.apache.maven.settings.TrackableBase trackable) { + try { + ReflectionUtils.setVariableValueInObject(trackable, "sourceLevelSet", Boolean.FALSE); + getLog().debug("sourceLevelSet: " + + ReflectionUtils.getValueIncludingSuperclasses("sourceLevelSet", trackable)); + } catch (IllegalAccessException e) { // noop } } - private CharSequence resolveExternalJreVersion() - { - Artifact pluginArtifact = mojoExecution.getMojoDescriptor().getPluginDescriptor().getPluginArtifact(); + private CharSequence resolveExternalJreVersion() { + Artifact pluginArtifact = + mojoExecution.getMojoDescriptor().getPluginDescriptor().getPluginArtifact(); pluginArtifact.getFile(); Commandline commandLine = new Commandline(); - commandLine.setExecutable( new File( javaHome, "bin/java" ).getAbsolutePath() ); - commandLine.createArg().setValue( "-cp" ); - commandLine.createArg().setFile( pluginArtifact.getFile() ); - commandLine.createArg().setValue( SystemPropertyPrinter.class.getName() ); - commandLine.createArg().setValue( "java.version" ); + commandLine.setExecutable(new File(javaHome, "bin/java").getAbsolutePath()); + commandLine.createArg().setValue("-cp"); + commandLine.createArg().setFile(pluginArtifact.getFile()); + commandLine.createArg().setValue(SystemPropertyPrinter.class.getName()); + commandLine.createArg().setValue("java.version"); final StringBuilder actualJreVersion = new StringBuilder(); StreamConsumer consumer = actualJreVersion::append; - try - { - CommandLineUtils.executeCommandLine( commandLine, consumer, null ); - } - catch ( CommandLineException e ) - { - getLog().warn( e.getMessage() ); + try { + CommandLineUtils.executeCommandLine(commandLine, consumer, null); + } catch (CommandLineException e) { + getLog().warn(e.getMessage()); } return actualJreVersion; } @@ -1651,19 +1493,13 @@ private CharSequence resolveExternalJreVersion() * will be returned. * @throws MojoExecutionException */ - private File interpolatePomFile( File pomFile, File basedir ) - throws MojoExecutionException - { + private File interpolatePomFile(File pomFile, File basedir) throws MojoExecutionException { File interpolatedPomFile = null; - if ( pomFile != null ) - { - if ( StringUtils.isNotEmpty( filteredPomPrefix ) ) - { - interpolatedPomFile = new File( basedir, filteredPomPrefix + pomFile.getName() ); - buildInterpolatedFile( pomFile, interpolatedPomFile ); - } - else - { + if (pomFile != null) { + if (StringUtils.isNotEmpty(filteredPomPrefix)) { + interpolatedPomFile = new File(basedir, filteredPomPrefix + pomFile.getName()); + buildInterpolatedFile(pomFile, interpolatedPomFile); + } else { interpolatedPomFile = pomFile; } } @@ -1680,176 +1516,141 @@ private File interpolatePomFile( File pomFile, File basedir ) * @param globalInvokerProperties * @throws org.apache.maven.plugin.MojoExecutionException If the project could not be launched. */ - private void runBuild( File projectsDir, BuildJob buildJob, File settingsFile, File actualJavaHome, - CharSequence actualJreVersion, Properties globalInvokerProperties ) - throws MojoExecutionException - { + private void runBuild( + File projectsDir, + BuildJob buildJob, + File settingsFile, + File actualJavaHome, + CharSequence actualJreVersion, + Properties globalInvokerProperties) + throws MojoExecutionException { // FIXME: Think about the following code part -- START - File pomFile = new File( projectsDir, buildJob.getProject() ); + File pomFile = new File(projectsDir, buildJob.getProject()); File basedir; - if ( pomFile.isDirectory() ) - { + if (pomFile.isDirectory()) { basedir = pomFile; - pomFile = new File( basedir, "pom.xml" ); - if ( !pomFile.exists() ) - { + pomFile = new File(basedir, "pom.xml"); + if (!pomFile.exists()) { pomFile = null; + } else { + buildJob.setProject(buildJob.getProject() + File.separator + "pom.xml"); } - else - { - buildJob.setProject( buildJob.getProject() + File.separator + "pom.xml" ); - } - } - else - { + } else { basedir = pomFile.getParentFile(); } - File interpolatedPomFile = interpolatePomFile( pomFile, basedir ); + File interpolatedPomFile = interpolatePomFile(pomFile, basedir); // FIXME: Think about the following code part -- ^^^^^^^ END - getLog().info( buffer().a( "Building: " ).strong( buildJob.getProject() ).toString() ); + getLog().info(buffer().a("Building: ").strong(buildJob.getProject()).toString()); - InvokerProperties invokerProperties = getInvokerProperties( basedir, globalInvokerProperties ); + InvokerProperties invokerProperties = getInvokerProperties(basedir, globalInvokerProperties); // let's set what details we can - buildJob.setName( invokerProperties.getJobName() ); - buildJob.setDescription( invokerProperties.getJobDescription() ); - - try - { - int selection = getSelection( invokerProperties, actualJreVersion ); - if ( selection == 0 ) - { + buildJob.setName(invokerProperties.getJobName()); + buildJob.setDescription(invokerProperties.getJobDescription()); + + try { + int selection = getSelection(invokerProperties, actualJreVersion); + if (selection == 0) { long milliseconds = System.currentTimeMillis(); boolean executed; - FileLogger buildLogger = setupBuildLogFile( basedir ); - if ( buildLogger != null ) - { - buildJob.setBuildlog( buildLogger.getOutputFile().getAbsolutePath() ); + FileLogger buildLogger = setupBuildLogFile(basedir); + if (buildLogger != null) { + buildJob.setBuildlog(buildLogger.getOutputFile().getAbsolutePath()); } - try - { - executed = runBuild( basedir, interpolatedPomFile, settingsFile, actualJavaHome, - invokerProperties, buildLogger ); - } - finally - { + try { + executed = runBuild( + basedir, interpolatedPomFile, settingsFile, actualJavaHome, invokerProperties, buildLogger); + } finally { milliseconds = System.currentTimeMillis() - milliseconds; - buildJob.setTime( milliseconds / 1000.0 ); + buildJob.setTime(milliseconds / 1000.0); - if ( buildLogger != null ) - { + if (buildLogger != null) { buildLogger.close(); } } - if ( executed ) - { - buildJob.setResult( BuildJob.Result.SUCCESS ); + if (executed) { + buildJob.setResult(BuildJob.Result.SUCCESS); - if ( !suppressSummaries ) - { - getLog().info( pad( buildJob ).success( "SUCCESS" ).a( ' ' ) - + formatTime( buildJob.getTime() ) ); + if (!suppressSummaries) { + getLog().info(pad(buildJob).success("SUCCESS").a(' ') + formatTime(buildJob.getTime())); } - } - else - { - buildJob.setResult( BuildJob.Result.SKIPPED ); - - if ( !suppressSummaries ) - { - getLog().info( pad( buildJob ).warning( "SKIPPED" ).a( ' ' ) - + formatTime( buildJob.getTime() ) ); + } else { + buildJob.setResult(BuildJob.Result.SKIPPED); + + if (!suppressSummaries) { + getLog().info(pad(buildJob).warning("SKIPPED").a(' ') + formatTime(buildJob.getTime())); } } - } - else - { - buildJob.setResult( BuildJob.Result.SKIPPED ); + } else { + buildJob.setResult(BuildJob.Result.SKIPPED); List messages = new ArrayList<>(); - if ( selection == Selector.SELECTOR_MULTI ) - { - messages.add( "non-matching selectors" ); - } - else - { - if ( ( selection & Selector.SELECTOR_MAVENVERSION ) != 0 ) - { - messages.add( "Maven version" ); + if (selection == Selector.SELECTOR_MULTI) { + messages.add("non-matching selectors"); + } else { + if ((selection & Selector.SELECTOR_MAVENVERSION) != 0) { + messages.add("Maven version"); } - if ( ( selection & Selector.SELECTOR_JREVERSION ) != 0 ) - { - messages.add( "JRE version" ); + if ((selection & Selector.SELECTOR_JREVERSION) != 0) { + messages.add("JRE version"); } - if ( ( selection & Selector.SELECTOR_OSFAMILY ) != 0 ) - { - messages.add( "OS" ); + if ((selection & Selector.SELECTOR_OSFAMILY) != 0) { + messages.add("OS"); } - if ( ( selection & Selector.SELECTOR_TOOLCHAIN ) != 0 ) - { - messages.add( "Toolchain" ); + if ((selection & Selector.SELECTOR_TOOLCHAIN) != 0) { + messages.add("Toolchain"); } } - String message = String.join( ", ", messages ); - if ( !suppressSummaries ) - { - getLog().info( pad( buildJob ).warning( "SKIPPED" ) + " due to " + message ); + String message = String.join(", ", messages); + if (!suppressSummaries) { + getLog().info(pad(buildJob).warning("SKIPPED") + " due to " + message); } // Abuse failureMessage, the field in the report which should contain the reason for skipping // Consider skipCode + I18N - buildJob.setFailureMessage( "Skipped due to " + message ); + buildJob.setFailureMessage("Skipped due to " + message); } - } - catch ( RunFailureException e ) - { - buildJob.setResult( e.getType() ); - buildJob.setFailureMessage( e.getMessage() ); + } catch (RunFailureException e) { + buildJob.setResult(e.getType()); + buildJob.setFailureMessage(e.getMessage()); - if ( !suppressSummaries ) - { - getLog().info( " " + e.getMessage() ); - getLog().info( pad( buildJob ).failure( "FAILED" ).a( ' ' ) + formatTime( buildJob.getTime() ) ); + if (!suppressSummaries) { + getLog().info(" " + e.getMessage()); + getLog().info(pad(buildJob).failure("FAILED").a(' ') + formatTime(buildJob.getTime())); } - } - finally - { - deleteInterpolatedPomFile( interpolatedPomFile ); - writeBuildReport( buildJob ); + } finally { + deleteInterpolatedPomFile(interpolatedPomFile); + writeBuildReport(buildJob); } } - private MessageBuilder pad( BuildJob buildJob ) - { - MessageBuilder buffer = buffer( 128 ); + private MessageBuilder pad(BuildJob buildJob) { + MessageBuilder buffer = buffer(128); - buffer.a( " " ); - buffer.a( buildJob.getProject() ); + buffer.a(" "); + buffer.a(buildJob.getProject()); int l = 10 + buildJob.getProject().length(); - if ( l < RESULT_COLUMN ) - { - buffer.a( ' ' ); + if (l < RESULT_COLUMN) { + buffer.a(' '); l++; - if ( l < RESULT_COLUMN ) - { - for ( int i = RESULT_COLUMN - l; i > 0; i-- ) - { - buffer.a( '.' ); + if (l < RESULT_COLUMN) { + for (int i = RESULT_COLUMN - l; i > 0; i--) { + buffer.a('.'); } } } - return buffer.a( ' ' ); + return buffer.a(' '); } /** @@ -1857,10 +1658,8 @@ private MessageBuilder pad( BuildJob buildJob ) * * @param interpolatedPomFile The interpolated pom file. */ - private void deleteInterpolatedPomFile( File interpolatedPomFile ) - { - if ( interpolatedPomFile != null && StringUtils.isNotEmpty( filteredPomPrefix ) ) - { + private void deleteInterpolatedPomFile(File interpolatedPomFile) { + if (interpolatedPomFile != null && StringUtils.isNotEmpty(filteredPomPrefix)) { interpolatedPomFile.delete(); } } @@ -1872,15 +1671,13 @@ private void deleteInterpolatedPomFile( File interpolatedPomFile ) * @return 0 if the job corresponding to the properties should be run, otherwise a bitwise value * representing the reason why it should be skipped. */ - private int getSelection( InvokerProperties invokerProperties, CharSequence actualJreVersion ) - { - return new Selector( actualMavenVersion, actualJreVersion.toString(), - getToolchainPrivateManager() ).getSelection( invokerProperties ); + private int getSelection(InvokerProperties invokerProperties, CharSequence actualJreVersion) { + return new Selector(actualMavenVersion, actualJreVersion.toString(), getToolchainPrivateManager()) + .getSelection(invokerProperties); } - private ToolchainPrivateManager getToolchainPrivateManager() - { - return new ToolchainPrivateManager( toolchainManagerPrivate, session ); + private ToolchainPrivateManager getToolchainPrivateManager() { + return new ToolchainPrivateManager(toolchainManagerPrivate, session); } /** @@ -1889,109 +1686,90 @@ private ToolchainPrivateManager getToolchainPrivateManager() * @param buildJob The build job whose report should be written, must not be null. * @throws org.apache.maven.plugin.MojoExecutionException If the report could not be written. */ - private void writeBuildReport( BuildJob buildJob ) - throws MojoExecutionException - { - if ( disableReports ) - { + private void writeBuildReport(BuildJob buildJob) throws MojoExecutionException { + if (disableReports) { return; } - String safeFileName = buildJob.getProject().replace( '/', '_' ).replace( '\\', '_' ).replace( ' ', '_' ); - if ( safeFileName.endsWith( "_pom.xml" ) ) - { - safeFileName = safeFileName.substring( 0, safeFileName.length() - "_pom.xml".length() ); + String safeFileName = + buildJob.getProject().replace('/', '_').replace('\\', '_').replace(' ', '_'); + if (safeFileName.endsWith("_pom.xml")) { + safeFileName = safeFileName.substring(0, safeFileName.length() - "_pom.xml".length()); } - File reportFile = new File( reportsDirectory, "BUILD-" + safeFileName + ".xml" ); - try ( FileOutputStream fos = new FileOutputStream( reportFile ); - Writer osw = new OutputStreamWriter( fos, buildJob.getModelEncoding() ) ) - { + File reportFile = new File(reportsDirectory, "BUILD-" + safeFileName + ".xml"); + try (FileOutputStream fos = new FileOutputStream(reportFile); + Writer osw = new OutputStreamWriter(fos, buildJob.getModelEncoding())) { BuildJobXpp3Writer writer = new BuildJobXpp3Writer(); - writer.write( osw, buildJob ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to write build report " + reportFile, e ); + writer.write(osw, buildJob); + } catch (IOException e) { + throw new MojoExecutionException("Failed to write build report " + reportFile, e); } - if ( writeJunitReport ) - { - writeJunitReport( buildJob, safeFileName ); + if (writeJunitReport) { + writeJunitReport(buildJob, safeFileName); } } - private void writeJunitReport( BuildJob buildJob, String safeFileName ) - throws MojoExecutionException - { - File reportFile = new File( reportsDirectory, "TEST-" + safeFileName + ".xml" ); - Xpp3Dom testsuite = new Xpp3Dom( "testsuite" ); - testsuite.setAttribute( "name", junitPackageName + "." + safeFileName ); - testsuite.setAttribute( "time", Double.toString( buildJob.getTime() ) ); + private void writeJunitReport(BuildJob buildJob, String safeFileName) throws MojoExecutionException { + File reportFile = new File(reportsDirectory, "TEST-" + safeFileName + ".xml"); + Xpp3Dom testsuite = new Xpp3Dom("testsuite"); + testsuite.setAttribute("name", junitPackageName + "." + safeFileName); + testsuite.setAttribute("time", Double.toString(buildJob.getTime())); // set default value for required attributes - testsuite.setAttribute( "tests", "1" ); - testsuite.setAttribute( "errors", "0" ); - testsuite.setAttribute( "skipped", "0" ); - testsuite.setAttribute( "failures", "0" ); - - Xpp3Dom testcase = new Xpp3Dom( "testcase" ); - testsuite.addChild( testcase ); - switch ( buildJob.getResult() ) - { + testsuite.setAttribute("tests", "1"); + testsuite.setAttribute("errors", "0"); + testsuite.setAttribute("skipped", "0"); + testsuite.setAttribute("failures", "0"); + + Xpp3Dom testcase = new Xpp3Dom("testcase"); + testsuite.addChild(testcase); + switch (buildJob.getResult()) { case BuildJob.Result.SUCCESS: break; case BuildJob.Result.SKIPPED: - testsuite.setAttribute( "skipped", "1" ); + testsuite.setAttribute("skipped", "1"); // adding the failure element - Xpp3Dom skipped = new Xpp3Dom( "skipped" ); - testcase.addChild( skipped ); - skipped.setValue( buildJob.getFailureMessage() ); + Xpp3Dom skipped = new Xpp3Dom("skipped"); + testcase.addChild(skipped); + skipped.setValue(buildJob.getFailureMessage()); break; case BuildJob.Result.ERROR: - testsuite.setAttribute( "errors", "1" ); + testsuite.setAttribute("errors", "1"); break; default: - testsuite.setAttribute( "failures", "1" ); + testsuite.setAttribute("failures", "1"); // adding the failure element - Xpp3Dom failure = new Xpp3Dom( "failure" ); - testcase.addChild( failure ); - failure.setAttribute( "message", buildJob.getFailureMessage() ); + Xpp3Dom failure = new Xpp3Dom("failure"); + testcase.addChild(failure); + failure.setAttribute("message", buildJob.getFailureMessage()); } - testcase.setAttribute( "classname", junitPackageName + "." + safeFileName ); - testcase.setAttribute( "name", safeFileName ); - testcase.setAttribute( "time", Double.toString( buildJob.getTime() ) ); - Xpp3Dom systemOut = new Xpp3Dom( "system-out" ); - testcase.addChild( systemOut ); - + testcase.setAttribute("classname", junitPackageName + "." + safeFileName); + testcase.setAttribute("name", safeFileName); + testcase.setAttribute("time", Double.toString(buildJob.getTime())); + Xpp3Dom systemOut = new Xpp3Dom("system-out"); + testcase.addChild(systemOut); - File buildLogFile = buildJob.getBuildlog() != null ? new File( buildJob.getBuildlog() ) : null; + File buildLogFile = buildJob.getBuildlog() != null ? new File(buildJob.getBuildlog()) : null; - if ( buildLogFile != null && buildLogFile.exists() ) - { - getLog().debug( "fileLogger:" + buildLogFile ); - try - { - systemOut.setValue( FileUtils.fileRead( buildLogFile ) ); + if (buildLogFile != null && buildLogFile.exists()) { + getLog().debug("fileLogger:" + buildLogFile); + try { + systemOut.setValue(FileUtils.fileRead(buildLogFile)); + } catch (IOException e) { + throw new MojoExecutionException("Failed to read logfile " + buildLogFile, e); } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to read logfile " + buildLogFile, e ); - } - } - else - { - getLog().debug( safeFileName + "not exists buildLogFile = " + buildLogFile ); + } else { + getLog().debug(safeFileName + "not exists buildLogFile = " + buildLogFile); } - try ( FileOutputStream fos = new FileOutputStream( reportFile ); - Writer osw = new OutputStreamWriter( fos, buildJob.getModelEncoding() ) ) - { - Xpp3DomWriter.write( osw, testsuite ); - } catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to write JUnit build report " + reportFile, e ); + try (FileOutputStream fos = new FileOutputStream(reportFile); + Writer osw = new OutputStreamWriter(fos, buildJob.getModelEncoding())) { + Xpp3DomWriter.write(osw, testsuite); + } catch (IOException e) { + throw new MojoExecutionException("Failed to write JUnit build report " + reportFile, e); } } @@ -2001,9 +1779,8 @@ private void writeJunitReport( BuildJob buildJob, String safeFileName ) * @param seconds The duration of the build. * @return The formatted time, never null. */ - private String formatTime( double seconds ) - { - return secFormat.format( seconds ); + private String formatTime(double seconds) { + return secFormat.format(seconds); } /** @@ -2021,18 +1798,20 @@ private String formatTime( double seconds ) * @throws RunFailureException If either a hook script or the build itself * failed. */ - private boolean runBuild( File basedir, File pomFile, File settingsFile, File actualJavaHome, - InvokerProperties invokerProperties, FileLogger logger ) - throws MojoExecutionException, RunFailureException - { - if ( getLog().isDebugEnabled() && !invokerProperties.getProperties().isEmpty() ) - { + private boolean runBuild( + File basedir, + File pomFile, + File settingsFile, + File actualJavaHome, + InvokerProperties invokerProperties, + FileLogger logger) + throws MojoExecutionException, RunFailureException { + if (getLog().isDebugEnabled() && !invokerProperties.getProperties().isEmpty()) { Properties props = invokerProperties.getProperties(); - getLog().debug( "Using invoker properties:" ); - for ( String key : new TreeSet<>( props.stringPropertyNames() ) ) - { - String value = props.getProperty( key ); - getLog().debug( " " + key + " = " + value ); + getLog().debug("Using invoker properties:"); + for (String key : new TreeSet<>(props.stringPropertyNames())) { + String value = props.getProperty(key); + getLog().debug(" " + key + " = " + value); } } @@ -2040,148 +1819,111 @@ private boolean runBuild( File basedir, File pomFile, File settingsFile, File ac boolean selectorResult = true; - try - { - try - { - scriptRunner.run( "selector script", basedir, selectorScript, context, logger ); - } - catch ( ScriptReturnException e ) - { + try { + try { + scriptRunner.run("selector script", basedir, selectorScript, context, logger); + } catch (ScriptReturnException e) { selectorResult = false; return false; - } - catch ( ScriptException e ) - { - throw new RunFailureException( BuildJob.Result.ERROR, e ); + } catch (ScriptException e) { + throw new RunFailureException(BuildJob.Result.ERROR, e); } - try - { - scriptRunner.run( "pre-build script", basedir, preBuildHookScript, context, logger ); - } - catch ( ScriptException e ) - { - throw new RunFailureException( BuildJob.Result.FAILURE_PRE_HOOK, e ); + try { + scriptRunner.run("pre-build script", basedir, preBuildHookScript, context, logger); + } catch (ScriptException e) { + throw new RunFailureException(BuildJob.Result.FAILURE_PRE_HOOK, e); } - for ( int invocationIndex = 1;; invocationIndex++ ) - { - if ( invocationIndex > 1 && !invokerProperties.isInvocationDefined( invocationIndex ) ) - { + for (int invocationIndex = 1; ; invocationIndex++) { + if (invocationIndex > 1 && !invokerProperties.isInvocationDefined(invocationIndex)) { break; } final InvocationRequest request = new DefaultInvocationRequest(); - request.setBatchMode( true ); + request.setBatchMode(true); // values only from Mojo configurations - request.setLocalRepositoryDirectory( localRepositoryPath ); - request.setShowErrors( showErrors ); - request.setShowVersion( showVersion ); - request.setJavaHome( actualJavaHome ); - request.setMavenHome( mavenHome ); - setupLoggerForBuildJob( logger, request ); - - request.setBaseDirectory( basedir ); - request.setPomFile( pomFile ); - - String customSettingsFile = invokerProperties.getSettingsFile( invocationIndex ); - if ( customSettingsFile != null ) - { - File interpolateSettingsFile = interpolateSettings( new File( customSettingsFile ) ); - File mergeSettingsFile = mergeSettings( interpolateSettingsFile ); - - request.setUserSettingsFile( mergeSettingsFile ); - } - else - { - request.setUserSettingsFile( settingsFile ); + request.setLocalRepositoryDirectory(localRepositoryPath); + request.setShowErrors(showErrors); + request.setShowVersion(showVersion); + request.setJavaHome(actualJavaHome); + request.setMavenHome(mavenHome); + setupLoggerForBuildJob(logger, request); + + request.setBaseDirectory(basedir); + request.setPomFile(pomFile); + + String customSettingsFile = invokerProperties.getSettingsFile(invocationIndex); + if (customSettingsFile != null) { + File interpolateSettingsFile = interpolateSettings(new File(customSettingsFile)); + File mergeSettingsFile = mergeSettings(interpolateSettingsFile); + + request.setUserSettingsFile(mergeSettingsFile); + } else { + request.setUserSettingsFile(settingsFile); } Properties systemProperties = - getSystemProperties( basedir, invokerProperties.getSystemPropertiesFile( invocationIndex ) ); - request.setProperties( systemProperties ); + getSystemProperties(basedir, invokerProperties.getSystemPropertiesFile(invocationIndex)); + request.setProperties(systemProperties); - invokerProperties.configureInvocation( request, invocationIndex ); + invokerProperties.configureInvocation(request, invocationIndex); - if ( getLog().isDebugEnabled() ) - { - try - { - getLog().debug( "Using MAVEN_OPTS: " + request.getMavenOpts() ); - getLog().debug( "Executing: " + new MavenCommandLineBuilder().build( request ) ); - } - catch ( CommandLineConfigurationException e ) - { - getLog().debug( "Failed to display command line: " + e.getMessage() ); + if (getLog().isDebugEnabled()) { + try { + getLog().debug("Using MAVEN_OPTS: " + request.getMavenOpts()); + getLog().debug("Executing: " + new MavenCommandLineBuilder().build(request)); + } catch (CommandLineConfigurationException e) { + getLog().debug("Failed to display command line: " + e.getMessage()); } } - try - { - InvocationResult result = invoker.execute( request ); - verify( result, invocationIndex, invokerProperties, logger ); - } - catch ( final MavenInvocationException e ) - { - getLog().debug( "Error invoking Maven: " + e.getMessage(), e ); - throw new RunFailureException( "Maven invocation failed. " + e.getMessage(), - BuildJob.Result.FAILURE_BUILD ); + try { + InvocationResult result = invoker.execute(request); + verify(result, invocationIndex, invokerProperties, logger); + } catch (final MavenInvocationException e) { + getLog().debug("Error invoking Maven: " + e.getMessage(), e); + throw new RunFailureException( + "Maven invocation failed. " + e.getMessage(), BuildJob.Result.FAILURE_BUILD); } } - } - catch ( IOException e ) - { - throw new MojoExecutionException( e.getMessage(), e ); - } - finally - { - if ( selectorResult ) - { - runPostBuildHook( basedir, context, logger ); + } catch (IOException e) { + throw new MojoExecutionException(e.getMessage(), e); + } finally { + if (selectorResult) { + runPostBuildHook(basedir, context, logger); } } return true; } - int getParallelThreadsCount() - { - if ( parallelThreads.endsWith( "C" ) ) - { - double parallelThreadsMultiple = Double.parseDouble( - parallelThreads.substring( 0, parallelThreads.length() - 1 ) ); - return (int) ( parallelThreadsMultiple * Runtime.getRuntime().availableProcessors() ); - } - else - { - return Integer.parseInt( parallelThreads ); + int getParallelThreadsCount() { + if (parallelThreads.endsWith("C")) { + double parallelThreadsMultiple = + Double.parseDouble(parallelThreads.substring(0, parallelThreads.length() - 1)); + return (int) (parallelThreadsMultiple * Runtime.getRuntime().availableProcessors()); + } else { + return Integer.parseInt(parallelThreads); } } - private void runPostBuildHook( File basedir, Map context, FileLogger logger ) - throws MojoExecutionException, RunFailureException - { - try - { - scriptRunner.run( "post-build script", basedir, postBuildHookScript, context, logger ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( e.getMessage(), e ); - } - catch ( ScriptException e ) - { - throw new RunFailureException( e.getMessage(), BuildJob.Result.FAILURE_POST_HOOK, e ); + private void runPostBuildHook(File basedir, Map context, FileLogger logger) + throws MojoExecutionException, RunFailureException { + try { + scriptRunner.run("post-build script", basedir, postBuildHookScript, context, logger); + } catch (IOException e) { + throw new MojoExecutionException(e.getMessage(), e); + } catch (ScriptException e) { + throw new RunFailureException(e.getMessage(), BuildJob.Result.FAILURE_POST_HOOK, e); } } - private void setupLoggerForBuildJob( final FileLogger logger, final InvocationRequest request ) - { - if ( logger != null ) - { - request.setErrorHandler( logger ); - request.setOutputHandler( logger ); + + private void setupLoggerForBuildJob(final FileLogger logger, final InvocationRequest request) { + if (logger != null) { + request.setErrorHandler(logger); + request.setOutputHandler(logger); } } @@ -2193,45 +1935,33 @@ private void setupLoggerForBuildJob( final FileLogger logger, final InvocationRe * @return The build logger or null if logging has been disabled. * @throws org.apache.maven.plugin.MojoExecutionException If the log file could not be created. */ - private FileLogger setupBuildLogFile( File basedir ) - throws MojoExecutionException - { + private FileLogger setupBuildLogFile(File basedir) throws MojoExecutionException { FileLogger logger = null; - if ( !noLog ) - { + if (!noLog) { Path projectLogDirectory; - if ( logDirectory == null ) - { + if (logDirectory == null) { projectLogDirectory = basedir.toPath(); - } - else if ( cloneProjectsTo != null ) - { + } else if (cloneProjectsTo != null) { projectLogDirectory = - logDirectory.toPath().resolve( cloneProjectsTo.toPath().relativize( basedir.toPath() ) ); - } - else - { + logDirectory.toPath().resolve(cloneProjectsTo.toPath().relativize(basedir.toPath())); + } else { projectLogDirectory = - logDirectory.toPath().resolve( projectsDirectory.toPath().relativize( basedir.toPath() ) ); + logDirectory.toPath().resolve(projectsDirectory.toPath().relativize(basedir.toPath())); } - try - { - if ( streamLogs ) - { - logger = new FileLogger( projectLogDirectory.resolve( "build.log" ).toFile(), getLog() ); - } - else - { - logger = new FileLogger( projectLogDirectory.resolve( "build.log" ).toFile() ); + try { + if (streamLogs) { + logger = new FileLogger( + projectLogDirectory.resolve("build.log").toFile(), getLog()); + } else { + logger = new FileLogger( + projectLogDirectory.resolve("build.log").toFile()); } - getLog().debug( "Build log initialized in: " + projectLogDirectory ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Error initializing build logfile in: " + projectLogDirectory, e ); + getLog().debug("Build log initialized in: " + projectLogDirectory); + } catch (IOException e) { + throw new MojoExecutionException("Error initializing build logfile in: " + projectLogDirectory, e); } } @@ -2247,45 +1977,33 @@ else if ( cloneProjectsTo != null ) * @return The system properties to use, may be empty but never null. * @throws org.apache.maven.plugin.MojoExecutionException If the properties file exists but could not be read. */ - private Properties getSystemProperties( final File basedir, final String filename ) - throws MojoExecutionException - { + private Properties getSystemProperties(final File basedir, final String filename) throws MojoExecutionException { Properties collectedTestProperties = new Properties(); - if ( properties != null ) - { + if (properties != null) { // MINVOKER-118: property can have empty value, which is not accepted by collectedTestProperties - for ( Map.Entry entry : properties.entrySet() ) - { - if ( entry.getValue() != null ) - { - collectedTestProperties.put( entry.getKey(), entry.getValue() ); + for (Map.Entry entry : properties.entrySet()) { + if (entry.getValue() != null) { + collectedTestProperties.put(entry.getKey(), entry.getValue()); } } } File propertiesFile = null; - if ( filename != null ) - { - propertiesFile = new File( basedir, filename ); - } - else if ( testPropertiesFile != null ) - { - propertiesFile = new File( basedir, testPropertiesFile ); + if (filename != null) { + propertiesFile = new File(basedir, filename); + } else if (testPropertiesFile != null) { + propertiesFile = new File(basedir, testPropertiesFile); } - if ( propertiesFile != null && propertiesFile.isFile() ) - { + if (propertiesFile != null && propertiesFile.isFile()) { - try ( InputStream fin = new FileInputStream( propertiesFile ) ) - { + try (InputStream fin = new FileInputStream(propertiesFile)) { Properties loadedProperties = new Properties(); - loadedProperties.load( fin ); - collectedTestProperties.putAll( loadedProperties ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Error reading system properties from " + propertiesFile ); + loadedProperties.load(fin); + collectedTestProperties.putAll(loadedProperties); + } catch (IOException e) { + throw new MojoExecutionException("Error reading system properties from " + propertiesFile); } } @@ -2300,84 +2018,69 @@ else if ( testPropertiesFile != null ) * @param invokerProperties The invoker properties used to check the exit code, must not be null. * @param logger The build logger, may be null if logging is disabled. */ - private void verify( InvocationResult result, int invocationIndex, InvokerProperties invokerProperties, - FileLogger logger ) - throws RunFailureException - { - if ( result.getExecutionException() != null ) - { - throw new RunFailureException( "The Maven invocation failed. " - + result.getExecutionException().getMessage(), BuildJob.Result.ERROR ); - } - else if ( !invokerProperties.isExpectedResult( result.getExitCode(), invocationIndex ) ) - { - StringBuilder buffer = new StringBuilder( 256 ); - buffer.append( "The build exited with code " ).append( result.getExitCode() ).append( ". " ); - if ( logger != null ) - { - buffer.append( "See " ); - buffer.append( logger.getOutputFile().getAbsolutePath() ); - buffer.append( " for details." ); - } - else - { - buffer.append( "See console output for details." ); - } - throw new RunFailureException( buffer.toString(), BuildJob.Result.FAILURE_BUILD ); + private void verify( + InvocationResult result, int invocationIndex, InvokerProperties invokerProperties, FileLogger logger) + throws RunFailureException { + if (result.getExecutionException() != null) { + throw new RunFailureException( + "The Maven invocation failed. " + + result.getExecutionException().getMessage(), + BuildJob.Result.ERROR); + } else if (!invokerProperties.isExpectedResult(result.getExitCode(), invocationIndex)) { + StringBuilder buffer = new StringBuilder(256); + buffer.append("The build exited with code ") + .append(result.getExitCode()) + .append(". "); + if (logger != null) { + buffer.append("See "); + buffer.append(logger.getOutputFile().getAbsolutePath()); + buffer.append(" for details."); + } else { + buffer.append("See console output for details."); + } + throw new RunFailureException(buffer.toString(), BuildJob.Result.FAILURE_BUILD); } } - private List calculateIncludes() - { - if ( invokerTest != null ) - { - String[] testRegexes = StringUtils.split( invokerTest, "," ); - return Arrays.stream( testRegexes ) - .map( String::trim ) - .filter( s -> !s.isEmpty() ) - .filter( s -> !s.startsWith( "!" ) ) - .collect( Collectors.toList() ); - } - else - { + private List calculateIncludes() { + if (invokerTest != null) { + String[] testRegexes = StringUtils.split(invokerTest, ","); + return Arrays.stream(testRegexes) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .filter(s -> !s.startsWith("!")) + .collect(Collectors.toList()); + } else { Set uniqueIncludes = new HashSet<>(); - uniqueIncludes.addAll( pomIncludes ); - uniqueIncludes.addAll( setupIncludes ); - return new ArrayList<>( uniqueIncludes ); + uniqueIncludes.addAll(pomIncludes); + uniqueIncludes.addAll(setupIncludes); + return new ArrayList<>(uniqueIncludes); } } - private List calculateExcludes() - throws IOException - { + private List calculateExcludes() throws IOException { List excludes; - if ( invokerTest != null ) - { - String[] testRegexes = StringUtils.split( invokerTest, "," ); - excludes = Arrays.stream( testRegexes ) - .map( String::trim ) - .filter( s -> !s.isEmpty() ) - .filter( s -> s.startsWith( "!" ) ) - .map( s -> s.substring( 1 ) ) - .collect( Collectors.toList() ); - } - else - { - excludes = pomExcludes != null ? new ArrayList<>( pomExcludes ) : new ArrayList<>(); - } - - if ( this.settingsFile != null ) - { - String exclude = relativizePath( this.settingsFile, projectsDirectory.getCanonicalPath() ); - if ( exclude != null ) - { - excludes.add( exclude.replace( '\\', '/' ) ); - getLog().debug( "Automatically excluded " + exclude + " from project scanning" ); + if (invokerTest != null) { + String[] testRegexes = StringUtils.split(invokerTest, ","); + excludes = Arrays.stream(testRegexes) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .filter(s -> s.startsWith("!")) + .map(s -> s.substring(1)) + .collect(Collectors.toList()); + } else { + excludes = pomExcludes != null ? new ArrayList<>(pomExcludes) : new ArrayList<>(); + } + + if (this.settingsFile != null) { + String exclude = relativizePath(this.settingsFile, projectsDirectory.getCanonicalPath()); + if (exclude != null) { + excludes.add(exclude.replace('\\', '/')); + getLog().debug("Automatically excluded " + exclude + " from project scanning"); } } return excludes; - } /** @@ -2386,33 +2089,26 @@ private List calculateExcludes() * @return The build jobs to process, may be empty but never null. * @throws java.io.IOException If the projects directory could not be scanned. */ - List getBuildJobs() - throws IOException, MojoExecutionException - { + List getBuildJobs() throws IOException, MojoExecutionException { List includes = calculateIncludes(); List excludes = calculateExcludes(); - List buildJobsAll = scanProjectsDirectory( includes, excludes ); - List buildJobsSetup = scanProjectsDirectory( setupIncludes, excludes ); + List buildJobsAll = scanProjectsDirectory(includes, excludes); + List buildJobsSetup = scanProjectsDirectory(setupIncludes, excludes); - List setupProjects = buildJobsSetup.stream() - .map( BuildJob::getProject ) - .collect( Collectors.toList() ); + List setupProjects = + buildJobsSetup.stream().map(BuildJob::getProject).collect(Collectors.toList()); - - for ( BuildJob job : buildJobsAll ) - { - if ( setupProjects.contains( job.getProject() ) ) - { - job.setType( BuildJob.Type.SETUP ); + for (BuildJob job : buildJobsAll) { + if (setupProjects.contains(job.getProject())) { + job.setType(BuildJob.Type.SETUP); } InvokerProperties invokerProperties = - getInvokerProperties( new File( projectsDirectory, job.getProject() ).getParentFile(), - null ); - job.setOrdinal( invokerProperties.getOrdinal() ); + getInvokerProperties(new File(projectsDirectory, job.getProject()).getParentFile(), null); + job.setOrdinal(invokerProperties.getOrdinal()); } - relativizeProjectPaths( buildJobsAll ); + relativizeProjectPaths(buildJobsAll); return buildJobsAll; } @@ -2428,53 +2124,42 @@ List getBuildJobs() * @return The build jobs matching the patterns, never null. * @throws java.io.IOException If the project directory could not be scanned. */ - private List scanProjectsDirectory( List includes, List excludes ) - throws IOException - { - if ( !projectsDirectory.isDirectory() ) - { + private List scanProjectsDirectory(List includes, List excludes) throws IOException { + if (!projectsDirectory.isDirectory()) { return Collections.emptyList(); } DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir( projectsDirectory.getCanonicalFile() ); - scanner.setFollowSymlinks( false ); - if ( includes != null ) - { - scanner.setIncludes( includes.toArray( new String[0] ) ); - } - if ( excludes != null ) - { - if ( ( includes == null || includes.isEmpty() ) && !excludes.isEmpty() ) - { - scanner.setIncludes( new String[] { "*" } ); + scanner.setBasedir(projectsDirectory.getCanonicalFile()); + scanner.setFollowSymlinks(false); + if (includes != null) { + scanner.setIncludes(includes.toArray(new String[0])); + } + if (excludes != null) { + if ((includes == null || includes.isEmpty()) && !excludes.isEmpty()) { + scanner.setIncludes(new String[] {"*"}); } - scanner.setExcludes( excludes.toArray( new String[0] ) ); + scanner.setExcludes(excludes.toArray(new String[0])); } scanner.addDefaultExcludes(); scanner.scan(); Map matches = new LinkedHashMap<>(); - for ( String includedFile : scanner.getIncludedFiles() ) - { - matches.put( includedFile, new BuildJob( includedFile ) ); + for (String includedFile : scanner.getIncludedFiles()) { + matches.put(includedFile, new BuildJob(includedFile)); } - for ( String includedDir : scanner.getIncludedDirectories() ) - { + for (String includedDir : scanner.getIncludedDirectories()) { String includedFile = includedDir + File.separatorChar + "pom.xml"; - if ( new File( scanner.getBasedir(), includedFile ).isFile() ) - { - matches.put( includedFile, new BuildJob( includedFile ) ); - } - else - { - matches.put( includedDir, new BuildJob( includedDir ) ); + if (new File(scanner.getBasedir(), includedFile).isFile()) { + matches.put(includedFile, new BuildJob(includedFile)); + } else { + matches.put(includedDir, new BuildJob(includedDir)); } } - return new ArrayList<>( matches.values() ); + return new ArrayList<>(matches.values()); } /** @@ -2486,30 +2171,25 @@ private List scanProjectsDirectory( List includes, Listnull elements. * @throws java.io.IOException If any path could not be relativized. */ - private void relativizeProjectPaths( List buildJobs ) - throws IOException - { + private void relativizeProjectPaths(List buildJobs) throws IOException { String projectsDirPath = projectsDirectory.getCanonicalPath(); - for ( BuildJob buildJob : buildJobs ) - { + for (BuildJob buildJob : buildJobs) { String projectPath = buildJob.getProject(); - File file = new File( projectPath ); + File file = new File(projectPath); - if ( !file.isAbsolute() ) - { - file = new File( projectsDirectory, projectPath ); + if (!file.isAbsolute()) { + file = new File(projectsDirectory, projectPath); } - String relativizedPath = relativizePath( file, projectsDirPath ); + String relativizedPath = relativizePath(file, projectsDirPath); - if ( relativizedPath == null ) - { + if (relativizedPath == null) { relativizedPath = projectPath; } - buildJob.setProject( relativizedPath ); + buildJob.setProject(relativizedPath); } } @@ -2523,23 +2203,17 @@ private void relativizeProjectPaths( List buildJobs ) * base directory. * @throws java.io.IOException If the path could not be relativized. */ - private String relativizePath( File path, String basedir ) - throws IOException - { + private String relativizePath(File path, String basedir) throws IOException { String relativizedPath = path.getCanonicalPath(); - if ( relativizedPath.startsWith( basedir ) ) - { - relativizedPath = relativizedPath.substring( basedir.length() ); - if ( relativizedPath.startsWith( File.separator ) ) - { - relativizedPath = relativizedPath.substring( File.separator.length() ); + if (relativizedPath.startsWith(basedir)) { + relativizedPath = relativizedPath.substring(basedir.length()); + if (relativizedPath.startsWith(File.separator)) { + relativizedPath = relativizedPath.substring(File.separator.length()); } return relativizedPath; - } - else - { + } else { return null; } } @@ -2552,23 +2226,20 @@ private String relativizePath( File path, String basedir ) * * @return The map-based value source for interpolation, never null. */ - private Map getInterpolationValueSource( final boolean escapeXml ) - { + private Map getInterpolationValueSource(final boolean escapeXml) { Map props = new HashMap<>(); - if ( filterProperties != null ) - { - props.putAll( filterProperties ); + if (filterProperties != null) { + props.putAll(filterProperties); } - props.put( "basedir", this.project.getBasedir().getAbsolutePath() ); - props.put( "baseurl", toUrl( this.project.getBasedir().getAbsolutePath() ) ); - if ( settings.getLocalRepository() != null ) - { - props.put( "localRepository", settings.getLocalRepository() ); - props.put( "localRepositoryUrl", toUrl( settings.getLocalRepository() ) ); + props.put("basedir", this.project.getBasedir().getAbsolutePath()); + props.put("baseurl", toUrl(this.project.getBasedir().getAbsolutePath())); + if (settings.getLocalRepository() != null) { + props.put("localRepository", settings.getLocalRepository()); + props.put("localRepositoryUrl", toUrl(settings.getLocalRepository())); } - return new CompositeMap( this.project, props, escapeXml ); + return new CompositeMap(this.project, props, escapeXml); } /** @@ -2578,16 +2249,14 @@ private Map getInterpolationValueSource( final boolean escapeXml * @param filename The filesystem path to convert, must not be null. * @return The file: URL for the specified path, never null. */ - private static String toUrl( String filename ) - { + private static String toUrl(String filename) { /* * NOTE: Maven fails to properly handle percent-encoded "file:" URLs (WAGON-111) so don't use File.toURI() here * as-is but use the decoded path component in the URL. */ - String url = "file://" + new File( filename ).toURI().getPath(); - if ( url.endsWith( "/" ) ) - { - url = url.substring( 0, url.length() - 1 ); + String url = "file://" + new File(filename).toURI().getPath(); + if (url.endsWith("/")) { + url = url.substring(0, url.length() - 1); } return url; } @@ -2605,34 +2274,27 @@ private static String toUrl( String filename ) * * @throws org.apache.maven.plugin.MojoExecutionException If the target file could not be created. */ - void buildInterpolatedFile( File originalFile, File interpolatedFile ) - throws MojoExecutionException - { - getLog().debug( "Interpolate " + originalFile.getPath() + " to " + interpolatedFile.getPath() ); + void buildInterpolatedFile(File originalFile, File interpolatedFile) throws MojoExecutionException { + getLog().debug("Interpolate " + originalFile.getPath() + " to " + interpolatedFile.getPath()); - try - { + try { String xml; - Map composite = getInterpolationValueSource( true ); + Map composite = getInterpolationValueSource(true); // interpolation with token @...@ - try ( Reader reader = - new InterpolationFilterReader( ReaderFactory.newXmlReader( originalFile ), composite, "@", "@" ) ) - { - xml = IOUtil.toString( reader ); + try (Reader reader = + new InterpolationFilterReader(ReaderFactory.newXmlReader(originalFile), composite, "@", "@")) { + xml = IOUtil.toString(reader); } - try ( Writer writer = WriterFactory.newXmlWriter( interpolatedFile ) ) - { + try (Writer writer = WriterFactory.newXmlWriter(interpolatedFile)) { interpolatedFile.getParentFile().mkdirs(); - writer.write( xml ); + writer.write(xml); } - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to interpolate file " + originalFile.getPath(), e ); + } catch (IOException e) { + throw new MojoExecutionException("Failed to interpolate file " + originalFile.getPath(), e); } } @@ -2643,82 +2305,65 @@ void buildInterpolatedFile( File originalFile, File interpolatedFile ) * @return The invoker properties, may be empty but never null. * @throws org.apache.maven.plugin.MojoExecutionException If an I/O error occurred during reading the properties. */ - private InvokerProperties getInvokerProperties( final File projectDirectory, Properties globalInvokerProperties ) - throws MojoExecutionException - { + private InvokerProperties getInvokerProperties(final File projectDirectory, Properties globalInvokerProperties) + throws MojoExecutionException { Properties props; - if ( globalInvokerProperties != null ) - { - props = new Properties( globalInvokerProperties ); - } - else - { + if (globalInvokerProperties != null) { + props = new Properties(globalInvokerProperties); + } else { props = new Properties(); } - File propertiesFile = new File( projectDirectory, invokerPropertiesFile ); - if ( propertiesFile.isFile() ) - { - try ( InputStream in = new FileInputStream( propertiesFile ) ) - { - props.load( in ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to read invoker properties: " + propertiesFile, e ); + File propertiesFile = new File(projectDirectory, invokerPropertiesFile); + if (propertiesFile.isFile()) { + try (InputStream in = new FileInputStream(propertiesFile)) { + props.load(in); + } catch (IOException e) { + throw new MojoExecutionException("Failed to read invoker properties: " + propertiesFile, e); } } Interpolator interpolator = new RegexBasedInterpolator(); - interpolator.addValueSource( new MapBasedValueSource( getInterpolationValueSource( false ) ) ); + interpolator.addValueSource(new MapBasedValueSource(getInterpolationValueSource(false))); // CHECKSTYLE_OFF: LineLength - for ( String key : props.stringPropertyNames() ) - { - String value = props.getProperty( key ); - try - { - value = interpolator.interpolate( value, "" ); - } - catch ( InterpolationException e ) - { - throw new MojoExecutionException( "Failed to interpolate invoker properties: " + propertiesFile, - e ); + for (String key : props.stringPropertyNames()) { + String value = props.getProperty(key); + try { + value = interpolator.interpolate(value, ""); + } catch (InterpolationException e) { + throw new MojoExecutionException("Failed to interpolate invoker properties: " + propertiesFile, e); } - props.setProperty( key, value ); + props.setProperty(key, value); } - InvokerProperties invokerProperties = new InvokerProperties( props ); + InvokerProperties invokerProperties = new InvokerProperties(props); // set default value for Invoker - it will be used if not present in properties - invokerProperties.setDefaultDebug( debug ); - invokerProperties.setDefaultQuiet( quiet ); - invokerProperties.setDefaultGoals( goals ); - invokerProperties.setDefaultProfiles( profiles ); - invokerProperties.setDefaultMavenExecutable( mavenExecutable ); - invokerProperties.setDefaultMavenOpts( mavenOpts ); - invokerProperties.setDefaultTimeoutInSeconds( timeoutInSeconds ); - invokerProperties.setDefaultEnvironmentVariables( environmentVariables ); - invokerProperties.setDefaultUpdateSnapshots( updateSnapshots ); - + invokerProperties.setDefaultDebug(debug); + invokerProperties.setDefaultQuiet(quiet); + invokerProperties.setDefaultGoals(goals); + invokerProperties.setDefaultProfiles(profiles); + invokerProperties.setDefaultMavenExecutable(mavenExecutable); + invokerProperties.setDefaultMavenOpts(mavenOpts); + invokerProperties.setDefaultTimeoutInSeconds(timeoutInSeconds); + invokerProperties.setDefaultEnvironmentVariables(environmentVariables); + invokerProperties.setDefaultUpdateSnapshots(updateSnapshots); return invokerProperties; } - static class ToolchainPrivateManager - { + static class ToolchainPrivateManager { private ToolchainManagerPrivate manager; private MavenSession session; - ToolchainPrivateManager( ToolchainManagerPrivate manager, MavenSession session ) - { + ToolchainPrivateManager(ToolchainManagerPrivate manager, MavenSession session) { this.manager = manager; this.session = session; } - ToolchainPrivate[] getToolchainPrivates( String type ) throws MisconfiguredToolchainException - { - return manager.getToolchainsForType( type, session ); + ToolchainPrivate[] getToolchainPrivates(String type) throws MisconfiguredToolchainException { + return manager.getToolchainsForType(type, session); } } } diff --git a/src/main/java/org/apache/maven/plugins/invoker/CompositeMap.java b/src/main/java/org/apache/maven/plugins/invoker/CompositeMap.java index 28282013..a4918090 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/CompositeMap.java +++ b/src/main/java/org/apache/maven/plugins/invoker/CompositeMap.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -33,9 +51,7 @@ * @author Olivier Lamy * @since 1.1 */ -class CompositeMap - implements Map -{ +class CompositeMap implements Map { /** * The Maven project from which to extract interpolated values, never null. @@ -60,11 +76,9 @@ class CompositeMap * null. * @param escapeXml {@code true}, to escape any XML special characters; {@code false}, to not perform any escaping. */ - protected CompositeMap( MavenProject mavenProject, Map properties, boolean escapeXml ) - { - if ( mavenProject == null ) - { - throw new IllegalArgumentException( "no project specified" ); + protected CompositeMap(MavenProject mavenProject, Map properties, boolean escapeXml) { + if (mavenProject == null) { + throw new IllegalArgumentException("no project specified"); } this.mavenProject = mavenProject; this.properties = properties == null ? new HashMap() : properties; @@ -76,8 +90,7 @@ protected CompositeMap( MavenProject mavenProject, Map propertie * * @see java.util.Map#clear() */ - public void clear() - { + public void clear() { // nothing here } @@ -86,31 +99,24 @@ public void clear() * * @see java.util.Map#containsKey(java.lang.Object) */ - public boolean containsKey( Object key ) - { - if ( !( key instanceof String ) ) - { + public boolean containsKey(Object key) { + if (!(key instanceof String)) { return false; } String expression = (String) key; - if ( expression.startsWith( "project." ) || expression.startsWith( "pom." ) ) - { - try - { - Object evaluated = ReflectionValueExtractor.evaluate( expression, this.mavenProject ); - if ( evaluated != null ) - { + if (expression.startsWith("project.") || expression.startsWith("pom.")) { + try { + Object evaluated = ReflectionValueExtractor.evaluate(expression, this.mavenProject); + if (evaluated != null) { return true; } - } - catch ( Exception e ) - { + } catch (Exception e) { // uhm do we have to throw a RuntimeException here ? } } - return properties.containsKey( key ) || mavenProject.getProperties().containsKey( key ); + return properties.containsKey(key) || mavenProject.getProperties().containsKey(key); } /** @@ -118,8 +124,7 @@ public boolean containsKey( Object key ) * * @see java.util.Map#containsValue(java.lang.Object) */ - public boolean containsValue( Object value ) - { + public boolean containsValue(Object value) { throw new UnsupportedOperationException(); } @@ -128,8 +133,7 @@ public boolean containsValue( Object value ) * * @see java.util.Map#entrySet() */ - public Set> entrySet() - { + public Set> entrySet() { throw new UnsupportedOperationException(); } @@ -138,49 +142,38 @@ public Set> entrySet() * * @see java.util.Map#get(java.lang.Object) */ - public Object get( Object key ) - { - if ( !( key instanceof String ) ) - { + public Object get(Object key) { + if (!(key instanceof String)) { return null; } Object value = null; String expression = (String) key; - if ( expression.startsWith( "project." ) || expression.startsWith( "pom." ) ) - { - try - { - Object evaluated = ReflectionValueExtractor.evaluate( expression, this.mavenProject ); - if ( evaluated != null ) - { + if (expression.startsWith("project.") || expression.startsWith("pom.")) { + try { + Object evaluated = ReflectionValueExtractor.evaluate(expression, this.mavenProject); + if (evaluated != null) { value = evaluated; } - } - catch ( Exception e ) - { + } catch (Exception e) { // uhm do we have to throw a RuntimeException here ? } } - if ( value == null ) - { - value = properties.get( key ); + if (value == null) { + value = properties.get(key); } - if ( value == null ) - { - value = this.mavenProject.getProperties().get( key ); + if (value == null) { + value = this.mavenProject.getProperties().get(key); } - if ( value != null && this.escapeXml ) - { - value = value.toString(). - replaceAll( "\"", """ ). - replaceAll( "<", "<" ). - replaceAll( ">", ">" ). - replaceAll( "&", "&" ); - + if (value != null && this.escapeXml) { + value = value.toString() + .replaceAll("\"", """) + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll("&", "&"); } return value; @@ -191,8 +184,7 @@ public Object get( Object key ) * * @see java.util.Map#isEmpty() */ - public boolean isEmpty() - { + public boolean isEmpty() { return this.mavenProject.getProperties().isEmpty() && this.properties.isEmpty(); } @@ -201,8 +193,7 @@ public boolean isEmpty() * * @see java.util.Map#keySet() */ - public Set keySet() - { + public Set keySet() { throw new UnsupportedOperationException(); } @@ -211,8 +202,7 @@ public Set keySet() * * @see java.util.Map#put(java.lang.Object, java.lang.Object) */ - public Object put( String key, Object value ) - { + public Object put(String key, Object value) { throw new UnsupportedOperationException(); } @@ -221,8 +211,7 @@ public Object put( String key, Object value ) * * @see java.util.Map#putAll(java.util.Map) */ - public void putAll( Map t ) - { + public void putAll(Map t) { throw new UnsupportedOperationException(); } @@ -231,8 +220,7 @@ public void putAll( Map t ) * * @see java.util.Map#remove(java.lang.Object) */ - public Object remove( Object key ) - { + public Object remove(Object key) { throw new UnsupportedOperationException(); } @@ -241,8 +229,7 @@ public Object remove( Object key ) * * @see java.util.Map#size() */ - public int size() - { + public int size() { throw new UnsupportedOperationException(); } @@ -251,8 +238,7 @@ public int size() * * @see java.util.Map#values() */ - public Collection values() - { + public Collection values() { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/org/apache/maven/plugins/invoker/FileLogger.java b/src/main/java/org/apache/maven/plugins/invoker/FileLogger.java index 4a7d3cb0..059788bf 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/FileLogger.java +++ b/src/main/java/org/apache/maven/plugins/invoker/FileLogger.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -28,10 +46,7 @@ /** * */ -class FileLogger - extends org.apache.maven.shared.scriptinterpreter.FileLogger - implements InvocationOutputHandler -{ +class FileLogger extends org.apache.maven.shared.scriptinterpreter.FileLogger implements InvocationOutputHandler { /** * Creates a new logger that writes to the specified file. @@ -39,10 +54,8 @@ class FileLogger * @param outputFile The path to the output file, must not be null. * @throws IOException If the output file could not be created. */ - FileLogger( File outputFile ) - throws IOException - { - super( outputFile ); + FileLogger(File outputFile) throws IOException { + super(outputFile); } /** @@ -52,10 +65,7 @@ class FileLogger * @param log The mojo logger to additionally output messages to, may be null if not used. * @throws IOException If the output file could not be created. */ - FileLogger( File outputFile, final Log log ) - throws IOException - { - super( outputFile, log::info ); + FileLogger(File outputFile, final Log log) throws IOException { + super(outputFile, log::info); } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java b/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java index c00e41be..af82d458 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java +++ b/src/main/java/org/apache/maven/plugins/invoker/InstallMojo.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -19,7 +37,6 @@ * under the License. */ - import java.io.File; import java.io.IOException; import java.util.Collection; @@ -63,11 +80,13 @@ * */ // CHECKSTYLE_OFF: LineLength -@Mojo( name = "install", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST, requiresDependencyResolution = ResolutionScope.RUNTIME, threadSafe = true ) +@Mojo( + name = "install", + defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST, + requiresDependencyResolution = ResolutionScope.RUNTIME, + threadSafe = true) // CHECKSTYLE_ON: LineLength -public class InstallMojo - extends AbstractMojo -{ +public class InstallMojo extends AbstractMojo { /** * Maven artifact install component to copy artifacts to the local repository. @@ -86,7 +105,7 @@ public class InstallMojo /** */ - @Parameter( property = "localRepository", required = true, readonly = true ) + @Parameter(property = "localRepository", required = true, readonly = true) private ArtifactRepository localRepository; /** @@ -95,23 +114,25 @@ public class InstallMojo * possibly broken artifacts, it is strongly recommended to use an isolated repository for the integration tests * (e.g. ${project.build.directory}/it-repo). */ - @Parameter( property = "invoker.localRepositoryPath", - defaultValue = "${session.localRepository.basedir}", required = true ) + @Parameter( + property = "invoker.localRepositoryPath", + defaultValue = "${session.localRepository.basedir}", + required = true) private File localRepositoryPath; /** * The current Maven project. */ - @Parameter( defaultValue = "${project}", readonly = true, required = true ) + @Parameter(defaultValue = "${project}", readonly = true, required = true) private MavenProject project; - @Parameter( defaultValue = "${session}", readonly = true, required = true ) + @Parameter(defaultValue = "${session}", readonly = true, required = true) private MavenSession session; /** * The set of Maven projects in the reactor build. */ - @Parameter( defaultValue = "${reactorProjects}", readonly = true ) + @Parameter(defaultValue = "${reactorProjects}", readonly = true) private Collection reactorProjects; /** @@ -120,7 +141,7 @@ public class InstallMojo * * @since 1.4 */ - @Parameter( property = "invoker.skip", defaultValue = "false" ) + @Parameter(property = "invoker.skip", defaultValue = "false") private boolean skipInstallation; /** @@ -161,13 +182,12 @@ public class InstallMojo @Component private DependencyResolver resolver; - /** * if the local repository is not used as test repo, the parameter can force get artifacts from local repo * if available instead of download the artifacts again. * @since 3.2.1 */ - @Parameter( property = "invoker.useLocalRepository", defaultValue = "false" ) + @Parameter(property = "invoker.useLocalRepository", defaultValue = "false") private boolean useLocalRepository; private ProjectBuildingRequest projectBuildingRequest; @@ -177,12 +197,9 @@ public class InstallMojo * * @throws MojoExecutionException If the artifacts could not be installed. */ - public void execute() - throws MojoExecutionException - { - if ( skipInstallation ) - { - getLog().info( "Skipping artifact installation per configuration." ); + public void execute() throws MojoExecutionException { + if (skipInstallation) { + getLog().info("Skipping artifact installation per configuration."); return; } @@ -191,11 +208,11 @@ public void execute() installedArtifacts = new HashSet<>(); copiedArtifacts = new HashSet<>(); - installProjectDependencies( project, reactorProjects ); - installProjectParents( project ); - installProjectArtifacts( project ); + installProjectDependencies(project, reactorProjects); + installProjectParents(project); + installProjectArtifacts(project); - installExtraArtifacts( extraArtifacts ); + installExtraArtifacts(extraArtifacts); } /** @@ -206,16 +223,13 @@ public void execute() * * @throws MojoExecutionException If the repository could not be created. */ - private void createTestRepository() - throws MojoExecutionException - { + private void createTestRepository() throws MojoExecutionException { - if ( !localRepositoryPath.exists() && !localRepositoryPath.mkdirs() ) - { - throw new MojoExecutionException( "Failed to create directory: " + localRepositoryPath ); + if (!localRepositoryPath.exists() && !localRepositoryPath.mkdirs()) { + throw new MojoExecutionException("Failed to create directory: " + localRepositoryPath); } projectBuildingRequest = - repositoryManager.setLocalRepositoryBasedir( session.getProjectBuildingRequest(), localRepositoryPath ); + repositoryManager.setLocalRepositoryBasedir(session.getProjectBuildingRequest(), localRepositoryPath); } /** @@ -230,34 +244,23 @@ private void createTestRepository() * @param artifact The artifact to install, must not be null. * @throws MojoExecutionException If the artifact could not be installed (e.g. has no associated file). */ - private void installArtifact( File file, Artifact artifact ) - throws MojoExecutionException - { - try - { - if ( file == null ) - { - throw new IllegalStateException( "Artifact has no associated file: " + artifact.getId() ); + private void installArtifact(File file, Artifact artifact) throws MojoExecutionException { + try { + if (file == null) { + throw new IllegalStateException("Artifact has no associated file: " + artifact.getId()); } - if ( !file.isFile() ) - { - throw new IllegalStateException( "Artifact is not fully assembled: " + file ); + if (!file.isFile()) { + throw new IllegalStateException("Artifact is not fully assembled: " + file); } - if ( installedArtifacts.add( artifact.getId() ) ) - { - artifact.setFile( file ); - installer.install( projectBuildingRequest, localRepositoryPath, - Collections.singletonList( artifact ) ); - } - else - { - getLog().debug( "Not re-installing " + artifact + ", " + file ); + if (installedArtifacts.add(artifact.getId())) { + artifact.setFile(file); + installer.install(projectBuildingRequest, localRepositoryPath, Collections.singletonList(artifact)); + } else { + getLog().debug("Not re-installing " + artifact + ", " + file); } - } - catch ( Exception e ) - { - throw new MojoExecutionException( "Failed to install artifact: " + artifact, e ); + } catch (Exception e) { + throw new MojoExecutionException("Failed to install artifact: " + artifact, e); } } @@ -272,50 +275,37 @@ private void installArtifact( File file, Artifact artifact ) * @param artifact The artifact to install, must not be null. * @throws MojoExecutionException If the artifact could not be installed (e.g. has no associated file). */ - private void copyArtifact( File file, Artifact artifact ) - throws MojoExecutionException - { - try - { - if ( file == null ) - { - throw new IllegalStateException( "Artifact has no associated file: " + artifact.getId() ); + private void copyArtifact(File file, Artifact artifact) throws MojoExecutionException { + try { + if (file == null) { + throw new IllegalStateException("Artifact has no associated file: " + artifact.getId()); } - if ( !file.isFile() ) - { - throw new IllegalStateException( "Artifact is not fully assembled: " + file ); + if (!file.isFile()) { + throw new IllegalStateException("Artifact is not fully assembled: " + file); } - if ( copiedArtifacts.add( artifact.getId() ) ) - { - File destination = - new File( localRepositoryPath, - repositoryManager.getPathForLocalArtifact( projectBuildingRequest, artifact ) ); + if (copiedArtifacts.add(artifact.getId())) { + File destination = new File( + localRepositoryPath, + repositoryManager.getPathForLocalArtifact(projectBuildingRequest, artifact)); - getLog().debug( "Installing " + file + " to " + destination ); + getLog().debug("Installing " + file + " to " + destination); - copyFileIfDifferent( file, destination ); + copyFileIfDifferent(file, destination); - MetadataUtils.createMetadata( destination, artifact ); + MetadataUtils.createMetadata(destination, artifact); + } else { + getLog().debug("Not re-installing " + artifact + ", " + file); } - else - { - getLog().debug( "Not re-installing " + artifact + ", " + file ); - } - } - catch ( Exception e ) - { - throw new MojoExecutionException( "Failed to stage artifact: " + artifact, e ); + } catch (Exception e) { + throw new MojoExecutionException("Failed to stage artifact: " + artifact, e); } } - private void copyFileIfDifferent( File src, File dst ) - throws IOException - { - if ( src.lastModified() != dst.lastModified() || src.length() != dst.length() ) - { - FileUtils.copyFile( src, dst ); - dst.setLastModified( src.lastModified() ); + private void copyFileIfDifferent(File src, File dst) throws IOException { + if (src.lastModified() != dst.lastModified() || src.length() != dst.length()) { + FileUtils.copyFile(src, dst); + dst.setLastModified(src.lastModified()); } } @@ -325,31 +315,24 @@ private void copyFileIfDifferent( File src, File dst ) * @param mvnProject The project whose artifacts should be installed, must not be null. * @throws MojoExecutionException If any artifact could not be installed. */ - private void installProjectArtifacts( MavenProject mvnProject ) - throws MojoExecutionException - { - try - { + private void installProjectArtifacts(MavenProject mvnProject) throws MojoExecutionException { + try { // Install POM (usually attached as metadata but that happens only as a side effect of the Install Plugin) - installProjectPom( mvnProject ); + installProjectPom(mvnProject); // Install the main project artifact (if the project has one, e.g. has no "pom" packaging) Artifact mainArtifact = mvnProject.getArtifact(); - if ( mainArtifact.getFile() != null ) - { - installArtifact( mainArtifact.getFile(), mainArtifact ); + if (mainArtifact.getFile() != null) { + installArtifact(mainArtifact.getFile(), mainArtifact); } // Install any attached project artifacts Collection attachedArtifacts = mvnProject.getAttachedArtifacts(); - for ( Artifact attachedArtifact : attachedArtifacts ) - { - installArtifact( attachedArtifact.getFile(), attachedArtifact ); + for (Artifact attachedArtifact : attachedArtifacts) { + installArtifact(attachedArtifact.getFile(), attachedArtifact); } - } - catch ( Exception e ) - { - throw new MojoExecutionException( "Failed to install project artifacts: " + mvnProject, e ); + } catch (Exception e) { + throw new MojoExecutionException("Failed to install project artifacts: " + mvnProject, e); } } @@ -360,24 +343,17 @@ private void installProjectArtifacts( MavenProject mvnProject ) * @param mvnProject The project whose parent POMs should be installed, must not be null. * @throws MojoExecutionException If any POM could not be installed. */ - private void installProjectParents( MavenProject mvnProject ) - throws MojoExecutionException - { - try - { - for ( MavenProject parent = mvnProject.getParent(); parent != null; parent = parent.getParent() ) - { - if ( parent.getFile() == null ) - { - copyParentPoms( parent.getGroupId(), parent.getArtifactId(), parent.getVersion() ); + private void installProjectParents(MavenProject mvnProject) throws MojoExecutionException { + try { + for (MavenProject parent = mvnProject.getParent(); parent != null; parent = parent.getParent()) { + if (parent.getFile() == null) { + copyParentPoms(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()); break; } - installProjectPom( parent ); + installProjectPom(parent); } - } - catch ( Exception e ) - { - throw new MojoExecutionException( "Failed to install project parents: " + mvnProject, e ); + } catch (Exception e) { + throw new MojoExecutionException("Failed to install project parents: " + mvnProject, e); } } @@ -387,27 +363,19 @@ private void installProjectParents( MavenProject mvnProject ) * @param mvnProject The project whose POM should be installed, must not be null. * @throws MojoExecutionException If the POM could not be installed. */ - private void installProjectPom( MavenProject mvnProject ) - throws MojoExecutionException - { - try - { + private void installProjectPom(MavenProject mvnProject) throws MojoExecutionException { + try { Artifact pomArtifact = null; - if ( "pom".equals( mvnProject.getPackaging() ) ) - { + if ("pom".equals(mvnProject.getPackaging())) { pomArtifact = mvnProject.getArtifact(); } - if ( pomArtifact == null ) - { - pomArtifact = - artifactFactory.createProjectArtifact( mvnProject.getGroupId(), mvnProject.getArtifactId(), - mvnProject.getVersion() ); + if (pomArtifact == null) { + pomArtifact = artifactFactory.createProjectArtifact( + mvnProject.getGroupId(), mvnProject.getArtifactId(), mvnProject.getVersion()); } - installArtifact( mvnProject.getFile(), pomArtifact ); - } - catch ( Exception e ) - { - throw new MojoExecutionException( "Failed to install POM: " + mvnProject, e ); + installArtifact(mvnProject.getFile(), pomArtifact); + } catch (Exception e) { + throw new MojoExecutionException("Failed to install POM: " + mvnProject, e); } } @@ -419,21 +387,22 @@ private void installProjectPom( MavenProject mvnProject ) * @param reactorProjects The set of projects in the reactor build, must not be null. * @throws MojoExecutionException If any dependency could not be installed. */ - private void installProjectDependencies( MavenProject mvnProject, Collection reactorProjects ) - throws MojoExecutionException - { + private void installProjectDependencies(MavenProject mvnProject, Collection reactorProjects) + throws MojoExecutionException { // ... into dependencies that were resolved from reactor projects ... Collection dependencyProjects = new LinkedHashSet<>(); - collectAllProjectReferences( mvnProject, dependencyProjects ); + collectAllProjectReferences(mvnProject, dependencyProjects); // index available reactor projects - Map projects = new HashMap<>( reactorProjects.size() ); - for ( MavenProject reactorProject : reactorProjects ) - { - String projectId = - reactorProject.getGroupId() + ':' + reactorProject.getArtifactId() + ':' + reactorProject.getVersion(); - - projects.put( projectId, reactorProject ); + Map projects = new HashMap<>(reactorProjects.size()); + for (MavenProject reactorProject : reactorProjects) { + String projectId = reactorProject.getGroupId() + + ':' + + reactorProject.getArtifactId() + + ':' + + reactorProject.getVersion(); + + projects.put(projectId, reactorProject); } // group transitive dependencies (even those that don't contribute to the class path like POMs) ... @@ -441,88 +410,76 @@ private void installProjectDependencies( MavenProject mvnProject, Collection dependencyArtifacts = new LinkedHashSet<>(); - for ( Artifact artifact : artifacts ) - { + for (Artifact artifact : artifacts) { // workaround for MNG-2961 to ensure the base version does not contain a timestamp artifact.isSnapshot(); String projectId = artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getBaseVersion(); - if ( !projects.containsKey( projectId ) ) - { - dependencyArtifacts.add( artifact ); + if (!projects.containsKey(projectId)) { + dependencyArtifacts.add(artifact); } } // install dependencies - try - { + try { // copy dependencies that where resolved from the local repo - for ( Artifact artifact : dependencyArtifacts ) - { - copyArtifact( artifact ); + for (Artifact artifact : dependencyArtifacts) { + copyArtifact(artifact); } // install dependencies that were resolved from the reactor - for ( String projectId : dependencyProjects ) - { - MavenProject dependencyProject = projects.get( projectId ); - if ( dependencyProject == null ) - { - getLog().warn( "skip dependencyProject null for projectId=" + projectId ); + for (String projectId : dependencyProjects) { + MavenProject dependencyProject = projects.get(projectId); + if (dependencyProject == null) { + getLog().warn("skip dependencyProject null for projectId=" + projectId); continue; } - installProjectArtifacts( dependencyProject ); - installProjectParents( dependencyProject ); + installProjectArtifacts(dependencyProject); + installProjectParents(dependencyProject); } - } - catch ( Exception e ) - { - throw new MojoExecutionException( "Failed to install project dependencies: " + mvnProject, e ); + } catch (Exception e) { + throw new MojoExecutionException("Failed to install project dependencies: " + mvnProject, e); } } - protected void collectAllProjectReferences( MavenProject project, Collection dependencyProjects ) - { - for ( MavenProject reactorProject : project.getProjectReferences().values() ) - { - String projectId = - reactorProject.getGroupId() + ':' + reactorProject.getArtifactId() + ':' + reactorProject.getVersion(); - if ( dependencyProjects.add( projectId ) ) - { - collectAllProjectReferences( reactorProject, dependencyProjects ); + protected void collectAllProjectReferences(MavenProject project, Collection dependencyProjects) { + for (MavenProject reactorProject : project.getProjectReferences().values()) { + String projectId = reactorProject.getGroupId() + + ':' + + reactorProject.getArtifactId() + + ':' + + reactorProject.getVersion(); + if (dependencyProjects.add(projectId)) { + collectAllProjectReferences(reactorProject, dependencyProjects); } } } - private void copyArtifact( Artifact artifact ) - throws MojoExecutionException - { - copyPoms( artifact ); + private void copyArtifact(Artifact artifact) throws MojoExecutionException { + copyPoms(artifact); - Artifact depArtifact = - artifactFactory.createArtifactWithClassifier( artifact.getGroupId(), artifact.getArtifactId(), - artifact.getBaseVersion(), artifact.getType(), - artifact.getClassifier() ); + Artifact depArtifact = artifactFactory.createArtifactWithClassifier( + artifact.getGroupId(), + artifact.getArtifactId(), + artifact.getBaseVersion(), + artifact.getType(), + artifact.getClassifier()); File artifactFile = artifact.getFile(); - copyArtifact( artifactFile, depArtifact ); + copyArtifact(artifactFile, depArtifact); } - private void copyPoms( Artifact artifact ) - throws MojoExecutionException - { - Artifact pomArtifact = - artifactFactory.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(), - artifact.getBaseVersion() ); + private void copyPoms(Artifact artifact) throws MojoExecutionException { + Artifact pomArtifact = artifactFactory.createProjectArtifact( + artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion()); - File pomFile = new File( localRepository.getBasedir(), localRepository.pathOf( pomArtifact ) ); + File pomFile = new File(localRepository.getBasedir(), localRepository.pathOf(pomArtifact)); - if ( pomFile.isFile() ) - { - copyArtifact( pomFile, pomArtifact ); - copyParentPoms( pomFile ); + if (pomFile.isFile()) { + copyArtifact(pomFile, pomArtifact); + copyParentPoms(pomFile); } } @@ -532,14 +489,11 @@ private void copyPoms( Artifact artifact ) * @param pomFile The path to the POM file whose parents should be installed, must not be null. * @throws MojoExecutionException If any (existing) parent POM could not be installed. */ - private void copyParentPoms( File pomFile ) - throws MojoExecutionException - { - Model model = PomUtils.loadPom( pomFile ); + private void copyParentPoms(File pomFile) throws MojoExecutionException { + Model model = PomUtils.loadPom(pomFile); Parent parent = model.getParent(); - if ( parent != null ) - { - copyParentPoms( parent.getGroupId(), parent.getArtifactId(), parent.getVersion() ); + if (parent != null) { + copyParentPoms(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()); } } @@ -551,39 +505,30 @@ private void copyParentPoms( File pomFile ) * @param version The version of the POM which should be installed, must not be null. * @throws MojoExecutionException If any (existing) parent POM could not be installed. */ - private void copyParentPoms( String groupId, String artifactId, String version ) - throws MojoExecutionException - { - Artifact pomArtifact = artifactFactory.createProjectArtifact( groupId, artifactId, version ); - - if ( installedArtifacts.contains( pomArtifact.getId() ) || copiedArtifacts.contains( pomArtifact.getId() ) ) - { - getLog().debug( "Not re-installing " + pomArtifact ); + private void copyParentPoms(String groupId, String artifactId, String version) throws MojoExecutionException { + Artifact pomArtifact = artifactFactory.createProjectArtifact(groupId, artifactId, version); + + if (installedArtifacts.contains(pomArtifact.getId()) || copiedArtifacts.contains(pomArtifact.getId())) { + getLog().debug("Not re-installing " + pomArtifact); return; } - File pomFile = new File( localRepository.getBasedir(), localRepository.pathOf( pomArtifact ) ); - if ( pomFile.isFile() ) - { - copyArtifact( pomFile, pomArtifact ); - copyParentPoms( pomFile ); + File pomFile = new File(localRepository.getBasedir(), localRepository.pathOf(pomArtifact)); + if (pomFile.isFile()) { + copyArtifact(pomFile, pomArtifact); + copyParentPoms(pomFile); } } - private void installExtraArtifacts( String[] extraArtifacts ) - throws MojoExecutionException - { - if ( extraArtifacts == null ) - { + private void installExtraArtifacts(String[] extraArtifacts) throws MojoExecutionException { + if (extraArtifacts == null) { return; } - for ( String extraArtifact : extraArtifacts ) - { - String[] gav = extraArtifact.split( ":" ); - if ( gav.length < 3 || gav.length > 5 ) - { - throw new MojoExecutionException( "Invalid artifact " + extraArtifact ); + for (String extraArtifact : extraArtifacts) { + String[] gav = extraArtifact.split(":"); + if (gav.length < 3 || gav.length > 5) { + throw new MojoExecutionException("Invalid artifact " + extraArtifact); } String groupId = gav[0]; @@ -591,56 +536,44 @@ private void installExtraArtifacts( String[] extraArtifacts ) String version = gav[2]; String type = "jar"; - if ( gav.length > 3 ) - { + if (gav.length > 3) { type = gav[3]; } String classifier = null; - if ( gav.length == 5 ) - { + if (gav.length == 5) { classifier = gav[4]; } DefaultDependableCoordinate coordinate = new DefaultDependableCoordinate(); - try - { - coordinate.setGroupId( groupId ); - coordinate.setArtifactId( artifactId ); - coordinate.setVersion( version ); - coordinate.setType( type ); - coordinate.setClassifier( classifier ); - - - if ( !localRepository.getBasedir().equals( localRepositoryPath.getPath() ) && useLocalRepository ) - { + try { + coordinate.setGroupId(groupId); + coordinate.setArtifactId(artifactId); + coordinate.setVersion(version); + coordinate.setType(type); + coordinate.setClassifier(classifier); + + if (!localRepository.getBasedir().equals(localRepositoryPath.getPath()) && useLocalRepository) { String previousId = localRepository.getId(); - try - { + try { // using another request with the correct target repo - ProjectBuildingRequest projectBuildingRequest = repositoryManager - .setLocalRepositoryBasedir( session.getProjectBuildingRequest(), - localRepositoryPath ); - projectBuildingRequest.setRemoteRepositories( Collections.singletonList( localRepository ) ); - resolver.resolveDependencies( projectBuildingRequest, coordinate, - new PatternExclusionsFilter( Collections.emptyList() ) ); + ProjectBuildingRequest projectBuildingRequest = repositoryManager.setLocalRepositoryBasedir( + session.getProjectBuildingRequest(), localRepositoryPath); + projectBuildingRequest.setRemoteRepositories(Collections.singletonList(localRepository)); + resolver.resolveDependencies( + projectBuildingRequest, + coordinate, + new PatternExclusionsFilter(Collections.emptyList())); + } finally { + localRepository.setId(previousId); } - finally - { - localRepository.setId( previousId ); - } - } - else - { - resolver.resolveDependencies( projectBuildingRequest, coordinate, - new PatternExclusionsFilter( Collections.emptyList() ) ); + } else { + resolver.resolveDependencies( + projectBuildingRequest, coordinate, new PatternExclusionsFilter(Collections.emptyList())); } - } - catch ( DependencyResolverException e ) - { - throw new MojoExecutionException( "Unable to resolve dependencies for: " + coordinate, e ); + } catch (DependencyResolverException e) { + throw new MojoExecutionException("Unable to resolve dependencies for: " + coordinate, e); } } } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/IntegrationTestMojo.java b/src/main/java/org/apache/maven/plugins/invoker/IntegrationTestMojo.java index 1765f43f..d645696b 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/IntegrationTestMojo.java +++ b/src/main/java/org/apache/maven/plugins/invoker/IntegrationTestMojo.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -32,16 +50,15 @@ * @author Stephen Connolly */ // CHECKSTYLE_OFF: LineLength -@Mojo( name = "integration-test", defaultPhase = LifecyclePhase.INTEGRATION_TEST, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true ) -public class IntegrationTestMojo - extends AbstractInvokerMojo -{ +@Mojo( + name = "integration-test", + defaultPhase = LifecyclePhase.INTEGRATION_TEST, + requiresDependencyResolution = ResolutionScope.TEST, + threadSafe = true) +public class IntegrationTestMojo extends AbstractInvokerMojo { - void processResults( InvokerSession invokerSession ) - throws MojoFailureException - { + void processResults(InvokerSession invokerSession) throws MojoFailureException { // do nothing } - } // CHECKSTYLE_ON: LineLength diff --git a/src/main/java/org/apache/maven/plugins/invoker/InvokerMojo.java b/src/main/java/org/apache/maven/plugins/invoker/InvokerMojo.java index af5d70ef..c58ac2c1 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/InvokerMojo.java +++ b/src/main/java/org/apache/maven/plugins/invoker/InvokerMojo.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -34,11 +52,13 @@ * @author John Casey */ // CHECKSTYLE_OFF: LineLength -@Mojo( name = "run", defaultPhase = LifecyclePhase.INTEGRATION_TEST, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true ) +@Mojo( + name = "run", + defaultPhase = LifecyclePhase.INTEGRATION_TEST, + requiresDependencyResolution = ResolutionScope.TEST, + threadSafe = true) // CHECKSTYLE_ON: LineLength -public class InvokerMojo - extends AbstractInvokerMojo -{ +public class InvokerMojo extends AbstractInvokerMojo { /** * A flag controlling whether failures of the sub builds should fail the main build, too. If set to @@ -46,7 +66,7 @@ public class InvokerMojo * * @since 1.3 */ - @Parameter( property = "maven.test.failure.ignore", defaultValue = "false" ) + @Parameter(property = "maven.test.failure.ignore", defaultValue = "false") private boolean ignoreFailures; /** @@ -54,7 +74,7 @@ public class InvokerMojo * * @since 1.9 */ - @Parameter( property = "invoker.failIfNoProjects" ) + @Parameter(property = "invoker.failIfNoProjects") private Boolean failIfNoProjects; /** @@ -62,33 +82,25 @@ public class InvokerMojo * * @since 3.2.2 */ - @Parameter( property = "invoker.streamLogsOnFailures", defaultValue = "false" ) + @Parameter(property = "invoker.streamLogsOnFailures", defaultValue = "false") private boolean streamLogsOnFailures; - void processResults( InvokerSession invokerSession ) - throws MojoFailureException - { - if ( streamLogsOnFailures ) - { - invokerSession.logFailedBuildLog( getLog(), ignoreFailures ); + void processResults(InvokerSession invokerSession) throws MojoFailureException { + if (streamLogsOnFailures) { + invokerSession.logFailedBuildLog(getLog(), ignoreFailures); } - if ( !suppressSummaries ) - { - invokerSession.logSummary( getLog(), ignoreFailures ); + if (!suppressSummaries) { + invokerSession.logSummary(getLog(), ignoreFailures); } - invokerSession.handleFailures( getLog(), ignoreFailures ); + invokerSession.handleFailures(getLog(), ignoreFailures); } @Override - protected void doFailIfNoProjects() - throws MojoFailureException - { - if ( Boolean.TRUE.equals( failIfNoProjects ) ) - { - throw new MojoFailureException( "No projects to invoke!" ); + protected void doFailIfNoProjects() throws MojoFailureException { + if (Boolean.TRUE.equals(failIfNoProjects)) { + throw new MojoFailureException("No projects to invoke!"); } } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/InvokerProperties.java b/src/main/java/org/apache/maven/plugins/invoker/InvokerProperties.java index 048a8ac6..4c5d30e0 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/InvokerProperties.java +++ b/src/main/java/org/apache/maven/plugins/invoker/InvokerProperties.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -40,12 +58,11 @@ * * @author Benjamin Bentmann */ -class InvokerProperties -{ +class InvokerProperties { private static final String SELECTOR_PREFIX = "selector."; private static final Pattern ENVIRONMENT_VARIABLES_PATTERN = - Pattern.compile( "invoker\\.environmentVariables\\.([A-Za-z][^.]+)(\\.([0-9]+))?" ); + Pattern.compile("invoker\\.environmentVariables\\.([A-Za-z][^.]+)(\\.([0-9]+))?"); // default values from Mojo configuration private Boolean defaultDebug; @@ -58,54 +75,48 @@ class InvokerProperties private File defaultMavenExecutable; private Boolean defaultUpdateSnapshots; - private enum InvocationProperty - { - PROJECT( "invoker.project" ), - BUILD_RESULT( "invoker.buildResult" ), - GOALS( "invoker.goals" ), - PROFILES( "invoker.profiles" ), - MAVEN_EXECUTABLE( "invoker.mavenExecutable" ), - MAVEN_OPTS( "invoker.mavenOpts" ), - FAILURE_BEHAVIOR( "invoker.failureBehavior" ), - NON_RECURSIVE( "invoker.nonRecursive" ), - OFFLINE( "invoker.offline" ), - SYSTEM_PROPERTIES_FILE( "invoker.systemPropertiesFile" ), - DEBUG( "invoker.debug" ), - QUIET( "invoker.quiet" ), - SETTINGS_FILE( "invoker.settingsFile" ), - TIMEOUT_IN_SECONDS( "invoker.timeoutInSeconds" ), - UPDATE_SNAPSHOTS( "invoker.updateSnapshots" ); + private enum InvocationProperty { + PROJECT("invoker.project"), + BUILD_RESULT("invoker.buildResult"), + GOALS("invoker.goals"), + PROFILES("invoker.profiles"), + MAVEN_EXECUTABLE("invoker.mavenExecutable"), + MAVEN_OPTS("invoker.mavenOpts"), + FAILURE_BEHAVIOR("invoker.failureBehavior"), + NON_RECURSIVE("invoker.nonRecursive"), + OFFLINE("invoker.offline"), + SYSTEM_PROPERTIES_FILE("invoker.systemPropertiesFile"), + DEBUG("invoker.debug"), + QUIET("invoker.quiet"), + SETTINGS_FILE("invoker.settingsFile"), + TIMEOUT_IN_SECONDS("invoker.timeoutInSeconds"), + UPDATE_SNAPSHOTS("invoker.updateSnapshots"); private final String key; - InvocationProperty( final String s ) - { + InvocationProperty(final String s) { this.key = s; } @Override - public String toString() - { + public String toString() { return key; } } - private enum SelectorProperty - { - JAVA_VERSION( ".java.version" ), - MAVEN_VERSION( ".maven.version" ), - OS_FAMLY( ".os.family" ); + private enum SelectorProperty { + JAVA_VERSION(".java.version"), + MAVEN_VERSION(".maven.version"), + OS_FAMLY(".os.family"); private final String suffix; - SelectorProperty( String suffix ) - { + SelectorProperty(String suffix) { this.suffix = suffix; } @Override - public String toString() - { + public String toString() { return suffix; } } @@ -121,17 +132,15 @@ public String toString() * * @param properties The invoker properties to wrap, may be null if none. */ - InvokerProperties( Properties properties ) - { - this.properties = ( properties != null ) ? properties : new Properties(); + InvokerProperties(Properties properties) { + this.properties = (properties != null) ? properties : new Properties(); } /** * Default value for debug * @param defaultDebug a default value */ - public void setDefaultDebug( boolean defaultDebug ) - { + public void setDefaultDebug(boolean defaultDebug) { this.defaultDebug = defaultDebug; } @@ -139,8 +148,7 @@ public void setDefaultDebug( boolean defaultDebug ) * Default value for quiet * @param defaultQuiet a default value */ - public void setDefaultQuiet( boolean defaultQuiet ) - { + public void setDefaultQuiet(boolean defaultQuiet) { this.defaultQuiet = defaultQuiet; } @@ -148,8 +156,7 @@ public void setDefaultQuiet( boolean defaultQuiet ) * Default value for goals * @param defaultGoals a default value */ - public void setDefaultGoals( List defaultGoals ) - { + public void setDefaultGoals(List defaultGoals) { this.defaultGoals = defaultGoals; } @@ -157,17 +164,15 @@ public void setDefaultGoals( List defaultGoals ) * Default value for profiles * @param defaultProfiles a default value */ - public void setDefaultProfiles( List defaultProfiles ) - { - this.defaultProfiles = defaultProfiles; + public void setDefaultProfiles(List defaultProfiles) { + this.defaultProfiles = defaultProfiles; } /** * Default value for mavenExecutable * @param defaultMavenExecutable a default value */ - public void setDefaultMavenExecutable( File defaultMavenExecutable ) - { + public void setDefaultMavenExecutable(File defaultMavenExecutable) { this.defaultMavenExecutable = defaultMavenExecutable; } @@ -175,8 +180,7 @@ public void setDefaultMavenExecutable( File defaultMavenExecutable ) * Default value for mavenOpts * @param defaultMavenOpts a default value */ - public void setDefaultMavenOpts( String defaultMavenOpts ) - { + public void setDefaultMavenOpts(String defaultMavenOpts) { this.defaultMavenOpts = defaultMavenOpts; } @@ -184,8 +188,7 @@ public void setDefaultMavenOpts( String defaultMavenOpts ) * Default value for timeoutInSeconds * @param defaultTimeoutInSeconds a default value */ - public void setDefaultTimeoutInSeconds( int defaultTimeoutInSeconds ) - { + public void setDefaultTimeoutInSeconds(int defaultTimeoutInSeconds) { this.defaultTimeoutInSeconds = defaultTimeoutInSeconds; } @@ -193,8 +196,7 @@ public void setDefaultTimeoutInSeconds( int defaultTimeoutInSeconds ) * Default value for environmentVariables * @param defaultEnvironmentVariables a default value */ - public void setDefaultEnvironmentVariables( Map defaultEnvironmentVariables ) - { + public void setDefaultEnvironmentVariables(Map defaultEnvironmentVariables) { this.defaultEnvironmentVariables = defaultEnvironmentVariables; } @@ -202,8 +204,7 @@ public void setDefaultEnvironmentVariables( Map defaultEnvironme * Default value for updateSnapshots * @param defaultUpdateSnapshots a default value */ - public void setDefaultUpdateSnapshots( boolean defaultUpdateSnapshots ) - { + public void setDefaultUpdateSnapshots(boolean defaultUpdateSnapshots) { this.defaultUpdateSnapshots = defaultUpdateSnapshots; } @@ -212,8 +213,7 @@ public void setDefaultUpdateSnapshots( boolean defaultUpdateSnapshots ) * * @return The invoker properties being wrapped, never null. */ - public Properties getProperties() - { + public Properties getProperties() { return this.properties; } @@ -222,9 +222,8 @@ public Properties getProperties() * * @return The name of the build job or an empty string if not set. */ - public String getJobName() - { - return this.properties.getProperty( "invoker.name", "" ); + public String getJobName() { + return this.properties.getProperty("invoker.name", ""); } /** @@ -232,9 +231,8 @@ public String getJobName() * * @return The description of the build job or an empty string if not set. */ - public String getJobDescription() - { - return this.properties.getProperty( "invoker.description", "" ); + public String getJobDescription() { + return this.properties.getProperty("invoker.description", ""); } /** @@ -242,9 +240,8 @@ public String getJobDescription() * * @return The ordinal value */ - public int getOrdinal() - { - return Integer.parseInt( this.properties.getProperty( "invoker.ordinal", "0" ) ); + public int getOrdinal() { + return Integer.parseInt(this.properties.getProperty("invoker.ordinal", "0")); } /** @@ -252,9 +249,8 @@ public int getOrdinal() * * @return The specification of JRE versions or an empty string if not set. */ - public String getJreVersion() - { - return this.properties.getProperty( "invoker.java.version", "" ); + public String getJreVersion() { + return this.properties.getProperty("invoker.java.version", ""); } /** @@ -262,10 +258,8 @@ public String getJreVersion() * * @return The specification of JRE versions or an empty string if not set. */ - public String getJreVersion( int index ) - { - return this.properties.getProperty( SELECTOR_PREFIX + index + SelectorProperty.JAVA_VERSION, - getJreVersion() ); + public String getJreVersion(int index) { + return this.properties.getProperty(SELECTOR_PREFIX + index + SelectorProperty.JAVA_VERSION, getJreVersion()); } /** @@ -274,9 +268,8 @@ public String getJreVersion( int index ) * @return The specification of Maven versions on which this build job should be run. * @since 1.5 */ - public String getMavenVersion() - { - return this.properties.getProperty( "invoker.maven.version", "" ); + public String getMavenVersion() { + return this.properties.getProperty("invoker.maven.version", ""); } /** @@ -284,10 +277,8 @@ public String getMavenVersion() * @return The specification of Maven versions on which this build job should be run. * @since 3.0.0 */ - public String getMavenVersion( int index ) - { - return this.properties.getProperty( SELECTOR_PREFIX + index + SelectorProperty.MAVEN_VERSION, - getMavenVersion() ); + public String getMavenVersion(int index) { + return this.properties.getProperty(SELECTOR_PREFIX + index + SelectorProperty.MAVEN_VERSION, getMavenVersion()); } /** @@ -295,9 +286,8 @@ public String getMavenVersion( int index ) * * @return The specification of OS families or an empty string if not set. */ - public String getOsFamily() - { - return this.properties.getProperty( "invoker.os.family", "" ); + public String getOsFamily() { + return this.properties.getProperty("invoker.os.family", ""); } /** @@ -307,40 +297,33 @@ public String getOsFamily() * @return The specification of OS families or an empty string if not set. * @since 3.0.0 */ - public String getOsFamily( int index ) - { - return this.properties.getProperty( SELECTOR_PREFIX + index + SelectorProperty.OS_FAMLY, getOsFamily() ); + public String getOsFamily(int index) { + return this.properties.getProperty(SELECTOR_PREFIX + index + SelectorProperty.OS_FAMLY, getOsFamily()); } - public Collection getToolchains() - { - return getToolchains( Pattern.compile( "invoker\\.toolchain\\.([^.]+)\\.(.+)" ) ); + public Collection getToolchains() { + return getToolchains(Pattern.compile("invoker\\.toolchain\\.([^.]+)\\.(.+)")); } - public Collection getToolchains( int index ) - { - return getToolchains( Pattern.compile( "selector\\." + index + "\\.invoker\\.toolchain\\.([^.]+)\\.(.+)" ) ); + public Collection getToolchains(int index) { + return getToolchains(Pattern.compile("selector\\." + index + "\\.invoker\\.toolchain\\.([^.]+)\\.(.+)")); } - private Collection getToolchains( Pattern p ) - { + private Collection getToolchains(Pattern p) { Map toolchains = new HashMap<>(); - for ( Map.Entry entry : this.properties.entrySet() ) - { - Matcher m = p.matcher( entry.getKey().toString() ); - if ( m.matches() ) - { - String type = m.group( 1 ); - String providesKey = m.group( 2 ); + for (Map.Entry entry : this.properties.entrySet()) { + Matcher m = p.matcher(entry.getKey().toString()); + if (m.matches()) { + String type = m.group(1); + String providesKey = m.group(2); String providesValue = entry.getValue().toString(); - InvokerToolchain tc = toolchains.get( type ); - if ( tc == null ) - { - tc = new InvokerToolchain( type ); - toolchains.put( type, tc ); + InvokerToolchain tc = toolchains.get(type); + if (tc == null) { + tc = new InvokerToolchain(type); + toolchains.put(type, tc); } - tc.addProvides( providesKey, providesValue ); + tc.addProvides(providesKey, providesValue); } } return toolchains.values(); @@ -353,29 +336,22 @@ private Collection getToolchains( Pattern p ) * @param index index to lookup * @return map of environment name and value */ - - private Map getEnvironmentVariables( int index ) - { + private Map getEnvironmentVariables(int index) { Map envItems = new HashMap<>(); - for ( Map.Entry entry : properties.entrySet() ) - { - Matcher matcher = ENVIRONMENT_VARIABLES_PATTERN.matcher( entry.getKey().toString() ); - if ( matcher.matches() ) - { + for (Map.Entry entry : properties.entrySet()) { + Matcher matcher = + ENVIRONMENT_VARIABLES_PATTERN.matcher(entry.getKey().toString()); + if (matcher.matches()) { - if ( String.valueOf( index ).equals( matcher.group( 3 ) ) ) - { + if (String.valueOf(index).equals(matcher.group(3))) { // variables with index has higher priority, so override - envItems.put( matcher.group( 1 ), entry.getValue().toString() ); - } - else if ( matcher.group( 3 ) == null ) - { + envItems.put(matcher.group(1), entry.getValue().toString()); + } else if (matcher.group(3) == null) { // variables without index has lower priority, so check if exist - if ( !envItems.containsKey( matcher.group( 1 ) ) ) - { - envItems.put( matcher.group( 1 ), entry.getValue().toString() ); + if (!envItems.containsKey(matcher.group(1))) { + envItems.put(matcher.group(1), entry.getValue().toString()); } } } @@ -389,12 +365,11 @@ else if ( matcher.group( 3 ) == null ) * @param index The one-based index of the invocation to check for, must not be negative. * @return true if the invocation with the specified index is defined, false otherwise. */ - public boolean isInvocationDefined( int index ) - { - return Arrays.stream( InvocationProperty.values() ) - .map( InvocationProperty::toString ) - .map( v -> properties.getProperty( v + '.' + index ) ) - .anyMatch( Objects::nonNull ); + public boolean isInvocationDefined(int index) { + return Arrays.stream(InvocationProperty.values()) + .map(InvocationProperty::toString) + .map(v -> properties.getProperty(v + '.' + index)) + .anyMatch(Objects::nonNull); } /** @@ -404,19 +379,16 @@ public boolean isInvocationDefined( int index ) * @return true if the selector with the specified index is defined, false otherwise. * @since 3.0.0 */ - public boolean isSelectorDefined( int index ) - { - return Arrays.stream( SelectorProperty.values() ) - .map( v -> v.suffix ) - .map( v -> properties.getProperty( SELECTOR_PREFIX + index + v ) ) - .anyMatch( Objects::nonNull ); - } - - private void setIfNotNull( Consumer consumer, T value ) - { - if ( value != null ) - { - consumer.accept( value ); + public boolean isSelectorDefined(int index) { + return Arrays.stream(SelectorProperty.values()) + .map(v -> v.suffix) + .map(v -> properties.getProperty(SELECTOR_PREFIX + index + v)) + .anyMatch(Objects::nonNull); + } + + private void setIfNotNull(Consumer consumer, T value) { + if (value != null) { + consumer.accept(value); } } @@ -427,75 +399,75 @@ private void setIfNotNull( Consumer consumer, T value ) * @param request The invocation request to configure, must not be null. * @param index The one-based index of the invocation to configure, must not be negative. */ - public void configureInvocation( InvocationRequest request, int index ) - { - get( InvocationProperty.PROJECT, index ).ifPresent( project -> - { - File file = new File( request.getBaseDirectory(), project ); - if ( file.isFile() ) - { - request.setBaseDirectory( file.getParentFile() ); - request.setPomFile( file ); - } - else - { - request.setBaseDirectory( file ); - request.setPomFile( null ); + public void configureInvocation(InvocationRequest request, int index) { + get(InvocationProperty.PROJECT, index).ifPresent(project -> { + File file = new File(request.getBaseDirectory(), project); + if (file.isFile()) { + request.setBaseDirectory(file.getParentFile()); + request.setPomFile(file); + } else { + request.setBaseDirectory(file); + request.setPomFile(null); } - } ); + }); - setIfNotNull( request::setGoals, get( InvocationProperty.GOALS, index ) - .map( s -> StringUtils.split( s, ", \t\n\r\f" ) ) - .map( Arrays::asList ) - .filter( l -> !l.isEmpty() ) - .orElse( defaultGoals ) ); + setIfNotNull( + request::setGoals, + get(InvocationProperty.GOALS, index) + .map(s -> StringUtils.split(s, ", \t\n\r\f")) + .map(Arrays::asList) + .filter(l -> !l.isEmpty()) + .orElse(defaultGoals)); - setIfNotNull( request::setProfiles, get( InvocationProperty.PROFILES, index ) - .map( s -> StringUtils.split( s, ", \t\n\r\f" ) ) - .map( Arrays::asList ) - .filter( l -> !l.isEmpty() ) - .orElse( defaultProfiles ) ); + setIfNotNull( + request::setProfiles, + get(InvocationProperty.PROFILES, index) + .map(s -> StringUtils.split(s, ", \t\n\r\f")) + .map(Arrays::asList) + .filter(l -> !l.isEmpty()) + .orElse(defaultProfiles)); - setIfNotNull( request::setMavenExecutable, get( InvocationProperty.MAVEN_EXECUTABLE, index ) - .map( File::new ) - .orElse( defaultMavenExecutable ) ); + setIfNotNull( + request::setMavenExecutable, + get(InvocationProperty.MAVEN_EXECUTABLE, index).map(File::new).orElse(defaultMavenExecutable)); - setIfNotNull( request::setMavenOpts, get( InvocationProperty.MAVEN_OPTS, index ).orElse( defaultMavenOpts ) ); + setIfNotNull( + request::setMavenOpts, get(InvocationProperty.MAVEN_OPTS, index).orElse(defaultMavenOpts)); - get( InvocationProperty.FAILURE_BEHAVIOR, index ) - .map( InvocationRequest.ReactorFailureBehavior::valueOfByLongOption ) - .ifPresent( request::setReactorFailureBehavior ); + get(InvocationProperty.FAILURE_BEHAVIOR, index) + .map(InvocationRequest.ReactorFailureBehavior::valueOfByLongOption) + .ifPresent(request::setReactorFailureBehavior); - get( InvocationProperty.NON_RECURSIVE, index ) - .map( Boolean::parseBoolean ) - .map( b -> !b ) - .ifPresent( request::setRecursive ); + get(InvocationProperty.NON_RECURSIVE, index) + .map(Boolean::parseBoolean) + .map(b -> !b) + .ifPresent(request::setRecursive); - get( InvocationProperty.OFFLINE, index ) - .map( Boolean::parseBoolean ) - .ifPresent( request::setOffline ); + get(InvocationProperty.OFFLINE, index).map(Boolean::parseBoolean).ifPresent(request::setOffline); - setIfNotNull( request::setDebug, get( InvocationProperty.DEBUG, index ) - .map( Boolean::parseBoolean ) - .orElse( defaultDebug ) ); + setIfNotNull( + request::setDebug, + get(InvocationProperty.DEBUG, index).map(Boolean::parseBoolean).orElse(defaultDebug)); - setIfNotNull( request::setQuiet, get( InvocationProperty.QUIET, index ) - .map( Boolean::parseBoolean ) - .orElse( defaultQuiet ) ); + setIfNotNull( + request::setQuiet, + get(InvocationProperty.QUIET, index).map(Boolean::parseBoolean).orElse(defaultQuiet)); - setIfNotNull( request::setTimeoutInSeconds, get( InvocationProperty.TIMEOUT_IN_SECONDS, index ) - .map( Integer::parseInt ) - .orElse( defaultTimeoutInSeconds ) ); + setIfNotNull( + request::setTimeoutInSeconds, + get(InvocationProperty.TIMEOUT_IN_SECONDS, index) + .map(Integer::parseInt) + .orElse(defaultTimeoutInSeconds)); - setIfNotNull( request::setUpdateSnapshots, get( InvocationProperty.UPDATE_SNAPSHOTS, index ) - .map( Boolean::parseBoolean ) - .orElse( defaultUpdateSnapshots ) ); + setIfNotNull( + request::setUpdateSnapshots, + get(InvocationProperty.UPDATE_SNAPSHOTS, index) + .map(Boolean::parseBoolean) + .orElse(defaultUpdateSnapshots)); - Optional.ofNullable( defaultEnvironmentVariables ) - .ifPresent( evn -> evn.forEach( request::addShellEnvironment ) ); + Optional.ofNullable(defaultEnvironmentVariables).ifPresent(evn -> evn.forEach(request::addShellEnvironment)); - getEnvironmentVariables( index ) - .forEach( request::addShellEnvironment ); + getEnvironmentVariables(index).forEach(request::addShellEnvironment); } /** @@ -506,11 +478,10 @@ public void configureInvocation( InvocationRequest request, int index ) * @return true if the exit code is zero and a success was expected or if the exit code is non-zero and * a failue was expected, false otherwise. */ - public boolean isExpectedResult( int exitCode, int index ) - { - boolean nonZeroExit = "failure".equalsIgnoreCase( - get( InvocationProperty.BUILD_RESULT, index ).orElse( null ) ); - return ( exitCode != 0 ) == nonZeroExit; + public boolean isExpectedResult(int exitCode, int index) { + boolean nonZeroExit = "failure" + .equalsIgnoreCase(get(InvocationProperty.BUILD_RESULT, index).orElse(null)); + return (exitCode != 0) == nonZeroExit; } /** @@ -519,9 +490,8 @@ public boolean isExpectedResult( int exitCode, int index ) * @param index The index of the invocation, must not be negative. * @return The path to the properties file or null if not set. */ - public String getSystemPropertiesFile( int index ) - { - return get( InvocationProperty.SYSTEM_PROPERTIES_FILE, index ).orElse( null ); + public String getSystemPropertiesFile(int index) { + return get(InvocationProperty.SYSTEM_PROPERTIES_FILE, index).orElse(null); } /** @@ -530,9 +500,8 @@ public String getSystemPropertiesFile( int index ) * @param index The index of the invocation, must not be negative. * @return the value for the settings file or null if not set. */ - public String getSettingsFile( int index ) - { - return get( InvocationProperty.SETTINGS_FILE, index ).orElse( null ); + public String getSettingsFile(int index) { + return get(InvocationProperty.SETTINGS_FILE, index).orElse(null); } /** @@ -545,24 +514,19 @@ public String getSettingsFile( int index ) * @param index The index of the invocation for which to retrieve the value, must not be negative. * @return The value for the requested invoker property or null if not defined. */ - Optional get( String key, int index ) - { - if ( index < 0 ) - { - throw new IllegalArgumentException( "invalid invocation index: " + index ); + Optional get(String key, int index) { + if (index < 0) { + throw new IllegalArgumentException("invalid invocation index: " + index); } // lookup in properties - String value = Optional.ofNullable( properties.getProperty( key + '.' + index ) ) - .orElseGet( () -> properties.getProperty( key ) ); + String value = Optional.ofNullable(properties.getProperty(key + '.' + index)) + .orElseGet(() -> properties.getProperty(key)); - return Optional.ofNullable( value ) - .map( String::trim ) - .filter( s -> !s.isEmpty() ); + return Optional.ofNullable(value).map(String::trim).filter(s -> !s.isEmpty()); } - private Optional get( InvocationProperty prop, int index ) - { - return get( prop.toString(), index ); + private Optional get(InvocationProperty prop, int index) { + return get(prop.toString(), index); } } diff --git a/src/main/java/org/apache/maven/plugins/invoker/InvokerReport.java b/src/main/java/org/apache/maven/plugins/invoker/InvokerReport.java index 71fff65f..fb3b224a 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/InvokerReport.java +++ b/src/main/java/org/apache/maven/plugins/invoker/InvokerReport.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -30,11 +48,11 @@ import java.util.Locale; import org.apache.maven.doxia.sink.Sink; -import org.apache.maven.plugins.invoker.model.BuildJob; -import org.apache.maven.plugins.invoker.model.io.xpp3.BuildJobXpp3Reader; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.invoker.model.BuildJob; +import org.apache.maven.plugins.invoker.model.io.xpp3.BuildJobXpp3Reader; import org.apache.maven.reporting.AbstractMavenReport; import org.apache.maven.reporting.MavenReportException; import org.codehaus.plexus.i18n.I18N; @@ -51,10 +69,8 @@ * @author Olivier Lamy * @since 1.4 */ -@Mojo( name = "report", threadSafe = true ) -public class InvokerReport - extends AbstractMavenReport -{ +@Mojo(name = "report", threadSafe = true) +public class InvokerReport extends AbstractMavenReport { /** * Internationalization component. @@ -65,7 +81,7 @@ public class InvokerReport /** * Base directory where all build reports have been written to. */ - @Parameter( defaultValue = "${project.build.directory}/invoker-reports", property = "invoker.reportsDirectory" ) + @Parameter(defaultValue = "${project.build.directory}/invoker-reports", property = "invoker.reportsDirectory") private File reportsDirectory; /** @@ -83,21 +99,18 @@ public class InvokerReport */ private MessageFormat nameAndDescriptionFormat; - protected void executeReport( Locale locale ) - throws MavenReportException - { - DecimalFormatSymbols symbols = new DecimalFormatSymbols( locale ); - percentFormat = new DecimalFormat( getText( locale, "report.invoker.format.percent" ), symbols ); - secondsFormat = new DecimalFormat( getText( locale, "report.invoker.format.seconds" ), symbols ); - nameAndDescriptionFormat = - new MessageFormat( getText( locale, "report.invoker.format.name_with_description" ) ); + protected void executeReport(Locale locale) throws MavenReportException { + DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale); + percentFormat = new DecimalFormat(getText(locale, "report.invoker.format.percent"), symbols); + secondsFormat = new DecimalFormat(getText(locale, "report.invoker.format.seconds"), symbols); + nameAndDescriptionFormat = new MessageFormat(getText(locale, "report.invoker.format.name_with_description")); Sink sink = getSink(); sink.head(); sink.title(); - sink.text( getText( locale, "report.invoker.result.title" ) ); + sink.text(getText(locale, "report.invoker.result.title")); sink.title_(); sink.head_(); @@ -106,39 +119,32 @@ protected void executeReport( Locale locale ) sink.section1(); sink.sectionTitle1(); - sink.text( getText( locale, "report.invoker.result.title" ) ); + sink.text(getText(locale, "report.invoker.result.title")); sink.sectionTitle1_(); sink.paragraph(); - sink.text( getText( locale, "report.invoker.result.description" ) ); + sink.text(getText(locale, "report.invoker.result.description")); sink.paragraph_(); sink.section1_(); // ---------------------------------- // build buildJob beans // ---------------------------------- - File[] reportFiles = ReportUtils.getReportFiles( reportsDirectory ); - if ( reportFiles.length <= 0 ) - { - getLog().info( "no invoker report files found, skip report generation" ); + File[] reportFiles = ReportUtils.getReportFiles(reportsDirectory); + if (reportFiles.length <= 0) { + getLog().info("no invoker report files found, skip report generation"); return; } BuildJobXpp3Reader buildJobReader = new BuildJobXpp3Reader(); - List buildJobs = new ArrayList<>( reportFiles.length ); - for ( File reportFile : reportFiles ) - { - try ( XmlStreamReader xmlReader = ReaderFactory.newXmlReader( reportFile ) ) - { - buildJobs.add( buildJobReader.read( xmlReader ) ); - } - catch ( XmlPullParserException e ) - { - throw new MavenReportException( "Failed to parse report file: " + reportFile, e ); - } - catch ( IOException e ) - { - throw new MavenReportException( "Failed to read report file: " + reportFile, e ); + List buildJobs = new ArrayList<>(reportFiles.length); + for (File reportFile : reportFiles) { + try (XmlStreamReader xmlReader = ReaderFactory.newXmlReader(reportFile)) { + buildJobs.add(buildJobReader.read(xmlReader)); + } catch (XmlPullParserException e) { + throw new MavenReportException("Failed to parse report file: " + reportFile, e); + } catch (IOException e) { + throw new MavenReportException("Failed to read report file: " + reportFile, e); } } @@ -146,7 +152,7 @@ protected void executeReport( Locale locale ) // summary // ---------------------------------- - constructSummarySection( buildJobs, locale ); + constructSummarySection(buildJobs, locale); // ---------------------------------- // per file/it detail @@ -155,7 +161,7 @@ protected void executeReport( Locale locale ) sink.section2(); sink.sectionTitle2(); - sink.text( getText( locale, "report.invoker.detail.title" ) ); + sink.text(getText(locale, "report.invoker.detail.title")); sink.sectionTitle2_(); @@ -163,22 +169,21 @@ protected void executeReport( Locale locale ) // detail tests table header sink.table(); - sink.tableRows( null, false ); + sink.tableRows(null, false); sink.tableRow(); // ------------------------------------------- // name | Result | time | message // ------------------------------------------- - sinkTableHeader( sink, getText( locale, "report.invoker.detail.name" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.detail.result" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.detail.time" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.detail.message" ) ); + sinkTableHeader(sink, getText(locale, "report.invoker.detail.name")); + sinkTableHeader(sink, getText(locale, "report.invoker.detail.result")); + sinkTableHeader(sink, getText(locale, "report.invoker.detail.time")); + sinkTableHeader(sink, getText(locale, "report.invoker.detail.message")); sink.tableRow_(); - for ( BuildJob buildJob : buildJobs ) - { - renderBuildJob( buildJob ); + for (BuildJob buildJob : buildJobs) { + renderBuildJob(buildJob); } sink.tableRows_(); @@ -190,14 +195,13 @@ protected void executeReport( Locale locale ) sink.close(); } - private void constructSummarySection( List buildJobs, Locale locale ) - { + private void constructSummarySection(List buildJobs, Locale locale) { Sink sink = getSink(); sink.section2(); sink.sectionTitle2(); - sink.text( getText( locale, "report.invoker.summary.title" ) ); + sink.text(getText(locale, "report.invoker.summary.title")); sink.sectionTitle2_(); sink.section2_(); @@ -208,17 +212,17 @@ private void constructSummarySection( List buildJobs, Locale // ------------------------------------------------------------------------ sink.table(); - sink.tableRows( null, false ); + sink.tableRows(null, false); sink.tableRow(); - sinkTableHeader( sink, getText( locale, "report.invoker.summary.number" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.summary.success" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.summary.failed" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.summary.skipped" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.summary.success.rate" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.summary.time.total" ) ); - sinkTableHeader( sink, getText( locale, "report.invoker.summary.time.avg" ) ); + sinkTableHeader(sink, getText(locale, "report.invoker.summary.number")); + sinkTableHeader(sink, getText(locale, "report.invoker.summary.success")); + sinkTableHeader(sink, getText(locale, "report.invoker.summary.failed")); + sinkTableHeader(sink, getText(locale, "report.invoker.summary.skipped")); + sinkTableHeader(sink, getText(locale, "report.invoker.summary.success.rate")); + sinkTableHeader(sink, getText(locale, "report.invoker.summary.time.total")); + sinkTableHeader(sink, getText(locale, "report.invoker.summary.time.avg")); int number = buildJobs.size(); int success = 0; @@ -226,18 +230,12 @@ private void constructSummarySection( List buildJobs, Locale int skipped = 0; double totalTime = 0; - for ( BuildJob buildJob : buildJobs ) - { - if ( BuildJob.Result.SUCCESS.equals( buildJob.getResult() ) ) - { + for (BuildJob buildJob : buildJobs) { + if (BuildJob.Result.SUCCESS.equals(buildJob.getResult())) { success++; - } - else if ( BuildJob.Result.SKIPPED.equals( buildJob.getResult() ) ) - { + } else if (BuildJob.Result.SKIPPED.equals(buildJob.getResult())) { skipped++; - } - else - { + } else { failed++; } totalTime += buildJob.getTime(); @@ -246,118 +244,96 @@ else if ( BuildJob.Result.SKIPPED.equals( buildJob.getResult() ) ) sink.tableRow_(); sink.tableRow(); - sinkCell( sink, Integer.toString( number ) ); - sinkCell( sink, Integer.toString( success ) ); - sinkCell( sink, Integer.toString( failed ) ); - sinkCell( sink, Integer.toString( skipped ) ); + sinkCell(sink, Integer.toString(number)); + sinkCell(sink, Integer.toString(success)); + sinkCell(sink, Integer.toString(failed)); + sinkCell(sink, Integer.toString(skipped)); - if ( success + failed > 0 ) - { - sinkCell( sink, percentFormat.format( (double) success / ( success + failed ) ) ); - } - else - { - sinkCell( sink, "" ); + if (success + failed > 0) { + sinkCell(sink, percentFormat.format((double) success / (success + failed))); + } else { + sinkCell(sink, ""); } - sinkCell( sink, secondsFormat.format( totalTime ) ); + sinkCell(sink, secondsFormat.format(totalTime)); - sinkCell( sink, secondsFormat.format( totalTime / number ) ); + sinkCell(sink, secondsFormat.format(totalTime / number)); sink.tableRow_(); sink.tableRows_(); sink.table_(); - } - private void renderBuildJob( BuildJob buildJob ) - { + private void renderBuildJob(BuildJob buildJob) { Sink sink = getSink(); sink.tableRow(); - sinkCell( sink, getBuildJobReportName( buildJob ) ); + sinkCell(sink, getBuildJobReportName(buildJob)); // FIXME image - sinkCell( sink, buildJob.getResult() ); - sinkCell( sink, secondsFormat.format( buildJob.getTime() ) ); - sinkCell( sink, buildJob.getFailureMessage() ); + sinkCell(sink, buildJob.getResult()); + sinkCell(sink, secondsFormat.format(buildJob.getTime())); + sinkCell(sink, buildJob.getFailureMessage()); sink.tableRow_(); } - private String getBuildJobReportName( BuildJob buildJob ) - { + private String getBuildJobReportName(BuildJob buildJob) { String buildJobName = buildJob.getName(); String buildJobDescription = buildJob.getDescription(); - boolean emptyJobName = StringUtils.isEmpty( buildJobName ); - boolean emptyJobDescription = StringUtils.isEmpty( buildJobDescription ); + boolean emptyJobName = StringUtils.isEmpty(buildJobName); + boolean emptyJobDescription = StringUtils.isEmpty(buildJobDescription); boolean isReportJobNameComplete = !emptyJobName && !emptyJobDescription; - if ( isReportJobNameComplete ) - { - return getFormattedName( buildJobName, buildJobDescription ); - } - else - { + if (isReportJobNameComplete) { + return getFormattedName(buildJobName, buildJobDescription); + } else { String buildJobProject = buildJob.getProject(); - if ( !emptyJobName ) - { - getLog().warn( incompleteNameWarning( "description", buildJobProject ) ); - } - else if ( !emptyJobDescription ) - { - getLog().warn( incompleteNameWarning( "name", buildJobProject ) ); + if (!emptyJobName) { + getLog().warn(incompleteNameWarning("description", buildJobProject)); + } else if (!emptyJobDescription) { + getLog().warn(incompleteNameWarning("name", buildJobProject)); } return buildJobProject; } } - private static String incompleteNameWarning( String missing, String pom ) - { - return String.format( "Incomplete job name-description: %s is missing. " - + "POM (%s) will be used in place of job name.", - missing, pom ); + private static String incompleteNameWarning(String missing, String pom) { + return String.format( + "Incomplete job name-description: %s is missing. " + "POM (%s) will be used in place of job name.", + missing, pom); } - private String getFormattedName( String name, String description ) - { - return nameAndDescriptionFormat.format( new Object[] { name, description } ); + private String getFormattedName(String name, String description) { + return nameAndDescriptionFormat.format(new Object[] {name, description}); } - public String getDescription( Locale locale ) - { - return getText( locale, "report.invoker.result.description" ); + public String getDescription(Locale locale) { + return getText(locale, "report.invoker.result.description"); } - public String getName( Locale locale ) - { - return getText( locale, "report.invoker.result.name" ); + public String getName(Locale locale) { + return getText(locale, "report.invoker.result.name"); } - public String getOutputName() - { + public String getOutputName() { return "invoker-report"; } - public boolean canGenerateReport() - { - return ReportUtils.getReportFiles( reportsDirectory ).length > 0; + public boolean canGenerateReport() { + return ReportUtils.getReportFiles(reportsDirectory).length > 0; } - private String getText( Locale locale, String key ) - { - return i18n.getString( "invoker-report", locale, key ); + private String getText(Locale locale, String key) { + return i18n.getString("invoker-report", locale, key); } - private void sinkTableHeader( Sink sink, String header ) - { + private void sinkTableHeader(Sink sink, String header) { sink.tableHeaderCell(); - sink.text( header ); + sink.text(header); sink.tableHeaderCell_(); } - private void sinkCell( Sink sink, String text ) - { + private void sinkCell(Sink sink, String text) { sink.tableCell(); - sink.text( text ); + sink.text(text); sink.tableCell_(); } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/InvokerSession.java b/src/main/java/org/apache/maven/plugins/invoker/InvokerSession.java index 27eb3210..7b5b295c 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/InvokerSession.java +++ b/src/main/java/org/apache/maven/plugins/invoker/InvokerSession.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -19,8 +37,6 @@ * under the License. */ -import static org.apache.maven.shared.utils.logging.MessageUtils.buffer; - import java.io.File; import java.io.FileReader; import java.io.IOException; @@ -28,19 +44,20 @@ import java.util.List; import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.invoker.model.BuildJob; import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugins.invoker.model.BuildJob; import org.apache.maven.shared.utils.io.IOUtil; +import static org.apache.maven.shared.utils.logging.MessageUtils.buffer; + /** * Tracks a set of build jobs and their results. * * @author Benjamin Bentmann */ -class InvokerSession -{ - private static final String SEPARATOR = buffer().strong( - "-------------------------------------------------" ).toString(); +class InvokerSession { + private static final String SEPARATOR = + buffer().strong("-------------------------------------------------").toString(); private List buildJobs; @@ -55,8 +72,7 @@ class InvokerSession /** * Creates a new empty session. */ - InvokerSession() - { + InvokerSession() { buildJobs = new ArrayList<>(); } @@ -65,9 +81,8 @@ class InvokerSession * * @param buildJobs The build jobs to set, must not be null. */ - InvokerSession( List buildJobs ) - { - this.buildJobs = new ArrayList<>( buildJobs ); + InvokerSession(List buildJobs) { + this.buildJobs = new ArrayList<>(buildJobs); } /** @@ -75,9 +90,8 @@ class InvokerSession * * @param buildJob The build job to add, must not be null. */ - public void addJob( BuildJob buildJob ) - { - buildJobs.add( buildJob ); + public void addJob(BuildJob buildJob) { + buildJobs.add(buildJob); resetStats(); } @@ -87,9 +101,8 @@ public void addJob( BuildJob buildJob ) * * @param buildJobs The build jobs to set, must not be null. */ - public void setJobs( List buildJobs ) - { - this.buildJobs = new ArrayList<>( buildJobs ); + public void setJobs(List buildJobs) { + this.buildJobs = new ArrayList<>(buildJobs); resetStats(); } @@ -99,8 +112,7 @@ public void setJobs( List buildJobs ) * * @return The build jobs in this session, can be empty but never null. */ - public List getJobs() - { + public List getJobs() { return buildJobs; } @@ -109,8 +121,7 @@ public List getJobs() * * @return The successful build jobs in this session, can be empty but never null. */ - public List getSuccessfulJobs() - { + public List getSuccessfulJobs() { updateStats(); return successfulJobs; @@ -121,8 +132,7 @@ public List getSuccessfulJobs() * * @return The failed build jobs in this session, can be empty but never null. */ - public List getFailedJobs() - { + public List getFailedJobs() { updateStats(); return failedJobs; @@ -133,8 +143,7 @@ public List getFailedJobs() * * @return The build jobs in error for this session, can be empty but never null. */ - public List getErrorJobs() - { + public List getErrorJobs() { updateStats(); return errorJobs; @@ -145,25 +154,21 @@ public List getErrorJobs() * * @return The skipped build jobs in this session, can be empty but never null. */ - public List getSkippedJobs() - { + public List getSkippedJobs() { updateStats(); return skippedJobs; } - private void resetStats() - { + private void resetStats() { successfulJobs = null; failedJobs = null; skippedJobs = null; errorJobs = null; } - private void updateStats() - { - if ( successfulJobs != null && skippedJobs != null && failedJobs != null && errorJobs != null ) - { + private void updateStats() { + if (successfulJobs != null && skippedJobs != null && failedJobs != null && errorJobs != null) { return; } @@ -172,23 +177,15 @@ private void updateStats() skippedJobs = new ArrayList<>(); errorJobs = new ArrayList<>(); - for ( BuildJob buildJob : buildJobs ) - { - if ( BuildJob.Result.SUCCESS.equals( buildJob.getResult() ) ) - { - successfulJobs.add( buildJob ); - } - else if ( BuildJob.Result.SKIPPED.equals( buildJob.getResult() ) ) - { - skippedJobs.add( buildJob ); - } - else if ( BuildJob.Result.ERROR.equals( buildJob.getResult() ) ) - { - errorJobs.add( buildJob ); - } - else if ( buildJob.getResult() != null ) - { - failedJobs.add( buildJob ); + for (BuildJob buildJob : buildJobs) { + if (BuildJob.Result.SUCCESS.equals(buildJob.getResult())) { + successfulJobs.add(buildJob); + } else if (BuildJob.Result.SKIPPED.equals(buildJob.getResult())) { + skippedJobs.add(buildJob); + } else if (BuildJob.Result.ERROR.equals(buildJob.getResult())) { + errorJobs.add(buildJob); + } else if (buildJob.getResult() != null) { + failedJobs.add(buildJob); } } } @@ -199,67 +196,57 @@ else if ( buildJob.getResult() != null ) * @param logger The mojo logger to output messages to, must not be null. * @param ignoreFailures A flag whether failures should be ignored or whether a build failure should be signaled. */ - public void logSummary( Log logger, boolean ignoreFailures ) - { + public void logSummary(Log logger, boolean ignoreFailures) { updateStats(); - logger.info( SEPARATOR ); - logger.info( "Build Summary:" ); - logger.info( " Passed: " + successfulJobs.size() + logger.info(SEPARATOR); + logger.info("Build Summary:"); + logger.info(" Passed: " + successfulJobs.size() + ", Failed: " + failedJobs.size() + ", Errors: " + errorJobs.size() - + ", Skipped: " + skippedJobs.size() ); - logger.info( SEPARATOR ); + + ", Skipped: " + skippedJobs.size()); + logger.info(SEPARATOR); - logBuildJobList( logger, ignoreFailures, "The following builds failed:", failedJobs ); - logBuildJobList( logger, ignoreFailures, "The following builds finished with error:", errorJobs ); - logBuildJobList( logger, true, "The following builds were skipped:", skippedJobs ); + logBuildJobList(logger, ignoreFailures, "The following builds failed:", failedJobs); + logBuildJobList(logger, ignoreFailures, "The following builds finished with error:", errorJobs); + logBuildJobList(logger, true, "The following builds were skipped:", skippedJobs); } - public void logFailedBuildLog( Log logger, boolean ignoreFailures ) - throws MojoFailureException - { + public void logFailedBuildLog(Log logger, boolean ignoreFailures) throws MojoFailureException { updateStats(); - List jobToLogs = new ArrayList<>( failedJobs ); - jobToLogs.addAll( errorJobs ); + List jobToLogs = new ArrayList<>(failedJobs); + jobToLogs.addAll(errorJobs); - for ( BuildJob buildJob: jobToLogs ) - { - File buildLogFile = buildJob.getBuildlog() != null ? new File( buildJob.getBuildlog() ) : null; - if ( buildLogFile != null && buildLogFile.exists() ) - { - try - { + for (BuildJob buildJob : jobToLogs) { + File buildLogFile = buildJob.getBuildlog() != null ? new File(buildJob.getBuildlog()) : null; + if (buildLogFile != null && buildLogFile.exists()) { + try { // prepare message with build.log in one string to omit begin [ERROR], [WARN] // so whole log will be displayed without decoration - StringBuilder buildLogMessage = new StringBuilder( ); - buildLogMessage.append( System.lineSeparator() ); - buildLogMessage.append( System.lineSeparator() ); - buildLogMessage.append( "*** begin build.log for: " + buildJob.getProject() + " ***" ); - buildLogMessage.append( System.lineSeparator() ); - try ( FileReader buildLogReader = new FileReader( buildLogFile ) ) - { - buildLogMessage.append( IOUtil.toString( buildLogReader ) ); + StringBuilder buildLogMessage = new StringBuilder(); + buildLogMessage.append(System.lineSeparator()); + buildLogMessage.append(System.lineSeparator()); + buildLogMessage.append("*** begin build.log for: " + buildJob.getProject() + " ***"); + buildLogMessage.append(System.lineSeparator()); + try (FileReader buildLogReader = new FileReader(buildLogFile)) { + buildLogMessage.append(IOUtil.toString(buildLogReader)); } - buildLogMessage.append( "*** end build.log for: " + buildJob.getProject() + " ***" ); - buildLogMessage.append( System.lineSeparator() ); + buildLogMessage.append("*** end build.log for: " + buildJob.getProject() + " ***"); + buildLogMessage.append(System.lineSeparator()); - logWithLevel( logger, ignoreFailures, SEPARATOR ); - logWithLevel( logger, ignoreFailures, buildLogMessage.toString() ); - logWithLevel( logger, ignoreFailures, SEPARATOR ); - logWithLevel( logger, ignoreFailures, "" ); + logWithLevel(logger, ignoreFailures, SEPARATOR); + logWithLevel(logger, ignoreFailures, buildLogMessage.toString()); + logWithLevel(logger, ignoreFailures, SEPARATOR); + logWithLevel(logger, ignoreFailures, ""); - } - catch ( IOException e ) - { - throw new MojoFailureException( e.getMessage(), e ); + } catch (IOException e) { + throw new MojoFailureException(e.getMessage(), e); } } } } - /** * Handles the build failures in this session. * @@ -267,36 +254,26 @@ public void logFailedBuildLog( Log logger, boolean ignoreFailures ) * @param ignoreFailures A flag whether failures should be ignored or whether a build failure should be signaled. * @throws MojoFailureException If failures are present and not ignored. */ - public void handleFailures( Log logger, boolean ignoreFailures ) - throws MojoFailureException - { + public void handleFailures(Log logger, boolean ignoreFailures) throws MojoFailureException { updateStats(); - if ( !failedJobs.isEmpty() ) - { - String message = failedJobs.size() + " build" + ( failedJobs.size() == 1 ? "" : "s" ) + " failed."; + if (!failedJobs.isEmpty()) { + String message = failedJobs.size() + " build" + (failedJobs.size() == 1 ? "" : "s") + " failed."; - if ( ignoreFailures ) - { - logger.warn( "Ignoring that " + message ); - } - else - { - throw new MojoFailureException( message + " See console output above for details." ); + if (ignoreFailures) { + logger.warn("Ignoring that " + message); + } else { + throw new MojoFailureException(message + " See console output above for details."); } } - if ( !errorJobs.isEmpty() ) - { - String message = errorJobs.size() + " build" + ( errorJobs.size() == 1 ? "" : "s" ) + " in error."; + if (!errorJobs.isEmpty()) { + String message = errorJobs.size() + " build" + (errorJobs.size() == 1 ? "" : "s") + " in error."; - if ( ignoreFailures ) - { - logger.warn( "Ignoring that " + message ); - } - else - { - throw new MojoFailureException( message + " See console output above for details." ); + if (ignoreFailures) { + logger.warn("Ignoring that " + message); + } else { + throw new MojoFailureException(message + " See console output above for details."); } } } @@ -308,21 +285,18 @@ public void handleFailures( Log logger, boolean ignoreFailures ) * @param warn flag indicate log level * @param buildJobs jobs to list */ - private void logBuildJobList( Log logger, boolean warn, String header, List buildJobs ) - { - if ( buildJobs.isEmpty() ) - { + private void logBuildJobList(Log logger, boolean warn, String header, List buildJobs) { + if (buildJobs.isEmpty()) { return; } - logWithLevel( logger, warn, header ); + logWithLevel(logger, warn, header); - for ( BuildJob buildJob : buildJobs ) - { - logWithLevel( logger, warn, "* " + buildJob.getProject() ); + for (BuildJob buildJob : buildJobs) { + logWithLevel(logger, warn, "* " + buildJob.getProject()); } - logger.info( SEPARATOR ); + logger.info(SEPARATOR); } /** @@ -332,16 +306,12 @@ private void logBuildJobList( Log logger, boolean warn, String header, List provides = new HashMap<>(); - public InvokerToolchain( String type ) - { + public InvokerToolchain(String type) { this.type = type; } - public String getType() - { + public String getType() { return type; } - public void addProvides( String key, String value ) - { - provides.put( key, value ); + public void addProvides(String key, String value) { + provides.put(key, value); } - public Map getProvides() - { + public Map getProvides() { return provides; } } diff --git a/src/main/java/org/apache/maven/plugins/invoker/JobExecutor.java b/src/main/java/org/apache/maven/plugins/invoker/JobExecutor.java index 71ea13c8..1badddd6 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/JobExecutor.java +++ b/src/main/java/org/apache/maven/plugins/invoker/JobExecutor.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -34,58 +52,48 @@ * * @author Slawomir Jaranowski */ -class JobExecutor -{ - interface ThrowableJobConsumer - { - void accept( BuildJob t ) throws Throwable; +class JobExecutor { + interface ThrowableJobConsumer { + void accept(BuildJob t) throws Throwable; } private final List jobs; private final int threadsCount; - JobExecutor( List jobs, int threadsCount ) - { + JobExecutor(List jobs, int threadsCount) { this.jobs = jobs; this.threadsCount = threadsCount; } - public void forEach( ThrowableJobConsumer jobConsumer ) - { + public void forEach(ThrowableJobConsumer jobConsumer) { // group and sort jobs by ordinal Map> groupedJobs = jobs.stream() - .sorted( ( j1, j2 ) -> Integer.compare( j2.getOrdinal(), j1.getOrdinal() ) ) - .collect( Collectors.groupingBy( BuildJob::getOrdinal, LinkedHashMap::new, Collectors.toList() ) ); + .sorted((j1, j2) -> Integer.compare(j2.getOrdinal(), j1.getOrdinal())) + .collect(Collectors.groupingBy(BuildJob::getOrdinal, LinkedHashMap::new, Collectors.toList())); - ExecutorService executorService = Executors.newFixedThreadPool( threadsCount ); + ExecutorService executorService = Executors.newFixedThreadPool(threadsCount); - groupedJobs.forEach( ( key, value ) -> - { + groupedJobs.forEach((key, value) -> { // prepare list of callable tasks - List> callableJobs = value.stream().map( buildJob -> (Callable) () -> - { - try - { - jobConsumer.accept( buildJob ); - } - catch ( Throwable e ) - { - buildJob.setResult( BuildJob.Result.ERROR ); - buildJob.setFailureMessage( String.valueOf( e ) ); - } - return null; - } ).collect( Collectors.toList() ); + List> callableJobs = value.stream() + .map(buildJob -> (Callable) () -> { + try { + jobConsumer.accept(buildJob); + } catch (Throwable e) { + buildJob.setResult(BuildJob.Result.ERROR); + buildJob.setFailureMessage(String.valueOf(e)); + } + return null; + }) + .collect(Collectors.toList()); - try - { - executorService.invokeAll( callableJobs ); - } - catch ( InterruptedException e ) - { + try { + executorService.invokeAll(callableJobs); + } catch (InterruptedException e) { Thread.currentThread().interrupt(); - throw new RuntimeException( e ); + throw new RuntimeException(e); } - } ); + }); // all task are finished here executorService.shutdownNow(); diff --git a/src/main/java/org/apache/maven/plugins/invoker/MetadataUtils.java b/src/main/java/org/apache/maven/plugins/invoker/MetadataUtils.java index 6588b978..a5762bec 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/MetadataUtils.java +++ b/src/main/java/org/apache/maven/plugins/invoker/MetadataUtils.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -44,8 +62,7 @@ * * @author Benjamin Bentmann */ -class MetadataUtils -{ +class MetadataUtils { /** * Creates local metadata files for the specified artifact. The goal is to simulate the installation of the artifact @@ -56,113 +73,93 @@ class MetadataUtils * @param artifact The artifact to create metadata for, must not be null. * @throws IOException If the metadata could not be created. */ - public static void createMetadata( File file, Artifact artifact ) - throws IOException - { - TimeZone tz = java.util.TimeZone.getTimeZone( "UTC" ); - SimpleDateFormat fmt = new SimpleDateFormat( "yyyyMMddHHmmss" ); - fmt.setTimeZone( tz ); - String timestamp = fmt.format( new Date() ); - - if ( artifact.isSnapshot() ) - { - File metadataFile = new File( file.getParentFile(), "maven-metadata-local.xml" ); - - Xpp3Dom metadata = new Xpp3Dom( "metadata" ); - addChild( metadata, "groupId", artifact.getGroupId() ); - addChild( metadata, "artifactId", artifact.getArtifactId() ); - addChild( metadata, "version", artifact.getBaseVersion() ); - Xpp3Dom versioning = new Xpp3Dom( "versioning" ); - versioning.addChild( addChild( new Xpp3Dom( "snapshot" ), "localCopy", "true" ) ); - addChild( versioning, "lastUpdated", timestamp ); - metadata.addChild( versioning ); - - writeMetadata( metadataFile, metadata ); + public static void createMetadata(File file, Artifact artifact) throws IOException { + TimeZone tz = java.util.TimeZone.getTimeZone("UTC"); + SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss"); + fmt.setTimeZone(tz); + String timestamp = fmt.format(new Date()); + + if (artifact.isSnapshot()) { + File metadataFile = new File(file.getParentFile(), "maven-metadata-local.xml"); + + Xpp3Dom metadata = new Xpp3Dom("metadata"); + addChild(metadata, "groupId", artifact.getGroupId()); + addChild(metadata, "artifactId", artifact.getArtifactId()); + addChild(metadata, "version", artifact.getBaseVersion()); + Xpp3Dom versioning = new Xpp3Dom("versioning"); + versioning.addChild(addChild(new Xpp3Dom("snapshot"), "localCopy", "true")); + addChild(versioning, "lastUpdated", timestamp); + metadata.addChild(versioning); + + writeMetadata(metadataFile, metadata); } - File metadataFile = new File( file.getParentFile().getParentFile(), "maven-metadata-local.xml" ); + File metadataFile = new File(file.getParentFile().getParentFile(), "maven-metadata-local.xml"); Set allVersions = new LinkedHashSet<>(); - Xpp3Dom metadata = readMetadata( metadataFile ); - - if ( metadata != null ) - { - Xpp3Dom versioning = metadata.getChild( "versioning" ); - if ( versioning != null ) - { - Xpp3Dom versions = versioning.getChild( "versions" ); - if ( versions != null ) - { - - Xpp3Dom[] children = versions.getChildren( "version" ); - for ( Xpp3Dom aChildren : children ) - { - allVersions.add( aChildren.getValue() ); + Xpp3Dom metadata = readMetadata(metadataFile); + + if (metadata != null) { + Xpp3Dom versioning = metadata.getChild("versioning"); + if (versioning != null) { + Xpp3Dom versions = versioning.getChild("versions"); + if (versions != null) { + + Xpp3Dom[] children = versions.getChildren("version"); + for (Xpp3Dom aChildren : children) { + allVersions.add(aChildren.getValue()); } } } } - allVersions.add( artifact.getBaseVersion() ); + allVersions.add(artifact.getBaseVersion()); - metadata = new Xpp3Dom( "metadata" ); - addChild( metadata, "groupId", artifact.getGroupId() ); - addChild( metadata, "artifactId", artifact.getArtifactId() ); - Xpp3Dom versioning = new Xpp3Dom( "versioning" ); - versioning.addChild( addChildren( new Xpp3Dom( "versions" ), "version", allVersions ) ); - addChild( versioning, "lastUpdated", timestamp ); - metadata.addChild( versioning ); + metadata = new Xpp3Dom("metadata"); + addChild(metadata, "groupId", artifact.getGroupId()); + addChild(metadata, "artifactId", artifact.getArtifactId()); + Xpp3Dom versioning = new Xpp3Dom("versioning"); + versioning.addChild(addChildren(new Xpp3Dom("versions"), "version", allVersions)); + addChild(versioning, "lastUpdated", timestamp); + metadata.addChild(versioning); - metadata = Xpp3DomUtils.mergeXpp3Dom( metadata, readMetadata( metadataFile ) ); + metadata = Xpp3DomUtils.mergeXpp3Dom(metadata, readMetadata(metadataFile)); - writeMetadata( metadataFile, metadata ); + writeMetadata(metadataFile, metadata); } - private static Xpp3Dom addChild( Xpp3Dom parent, String childName, String childValue ) - { - Xpp3Dom child = new Xpp3Dom( childName ); - child.setValue( childValue ); - parent.addChild( child ); + private static Xpp3Dom addChild(Xpp3Dom parent, String childName, String childValue) { + Xpp3Dom child = new Xpp3Dom(childName); + child.setValue(childValue); + parent.addChild(child); return parent; } - private static Xpp3Dom addChildren( Xpp3Dom parent, String childName, Collection childValues ) - { - for ( String childValue : childValues ) - { - addChild( parent, childName, childValue ); + private static Xpp3Dom addChildren(Xpp3Dom parent, String childName, Collection childValues) { + for (String childValue : childValues) { + addChild(parent, childName, childValue); } return parent; } - private static Xpp3Dom readMetadata( File metadataFile ) - throws IOException - { - if ( !metadataFile.isFile() ) - { + private static Xpp3Dom readMetadata(File metadataFile) throws IOException { + if (!metadataFile.isFile()) { return null; } - try ( Reader reader = ReaderFactory.newXmlReader( metadataFile ) ) - { - return Xpp3DomBuilder.build( reader ); - } - catch ( XmlPullParserException e ) - { - throw new IOException( e.getMessage(), e ); + try (Reader reader = ReaderFactory.newXmlReader(metadataFile)) { + return Xpp3DomBuilder.build(reader); + } catch (XmlPullParserException e) { + throw new IOException(e.getMessage(), e); } } - private static void writeMetadata( File metadataFile, Xpp3Dom metadata ) - throws IOException - { + private static void writeMetadata(File metadataFile, Xpp3Dom metadata) throws IOException { metadataFile.getParentFile().mkdirs(); - try ( Writer writer = WriterFactory.newXmlWriter( metadataFile ) ) - { - Xpp3DomWriter.write( writer, metadata ); + try (Writer writer = WriterFactory.newXmlWriter(metadataFile)) { + Xpp3DomWriter.write(writer, metadata); } } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/PomUtils.java b/src/main/java/org/apache/maven/plugins/invoker/PomUtils.java index 7ebc02d4..32952d4b 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/PomUtils.java +++ b/src/main/java/org/apache/maven/plugins/invoker/PomUtils.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -34,8 +52,7 @@ * * @author Benjamin Bentmann */ -class PomUtils -{ +class PomUtils { /** * Loads the (raw) model from the specified POM file. @@ -44,21 +61,13 @@ class PomUtils * @return The raw model, never null. * @throws MojoExecutionException If the POM file could not be loaded. */ - public static Model loadPom( File pomFile ) - throws MojoExecutionException - { - try ( Reader reader = ReaderFactory.newXmlReader( pomFile ) ) - { - return new MavenXpp3Reader().read( reader, false ); - } - catch ( XmlPullParserException e ) - { - throw new MojoExecutionException( "Failed to parse POM: " + pomFile, e ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to read POM: " + pomFile, e ); + public static Model loadPom(File pomFile) throws MojoExecutionException { + try (Reader reader = ReaderFactory.newXmlReader(pomFile)) { + return new MavenXpp3Reader().read(reader, false); + } catch (XmlPullParserException e) { + throw new MojoExecutionException("Failed to parse POM: " + pomFile, e); + } catch (IOException e) { + throw new MojoExecutionException("Failed to read POM: " + pomFile, e); } } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/ReportUtils.java b/src/main/java/org/apache/maven/plugins/invoker/ReportUtils.java index e0bf6514..48d1fd9f 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/ReportUtils.java +++ b/src/main/java/org/apache/maven/plugins/invoker/ReportUtils.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -27,18 +45,13 @@ * * @author Benjamin Bentmann */ -class ReportUtils -{ +class ReportUtils { - private static class FileFilterOnlyXmlFile - implements FilenameFilter - { + private static class FileFilterOnlyXmlFile implements FilenameFilter { - public boolean accept( File dir, String name ) - { - return name.startsWith( "BUILD-" ) && name.endsWith( ".xml" ); + public boolean accept(File dir, String name) { + return name.startsWith("BUILD-") && name.endsWith(".xml"); } - } /** @@ -47,17 +60,14 @@ public boolean accept( File dir, String name ) * @param reportsDirectory The base directory where the invoker reports are located in, may be null. * @return The paths to the invoker reports, can be empty but never null. */ - public static File[] getReportFiles( File reportsDirectory ) - { + public static File[] getReportFiles(File reportsDirectory) { File[] reportFiles = - ( reportsDirectory != null ) ? reportsDirectory.listFiles( new FileFilterOnlyXmlFile() ) : null; + (reportsDirectory != null) ? reportsDirectory.listFiles(new FileFilterOnlyXmlFile()) : null; - if ( reportFiles == null ) - { + if (reportFiles == null) { reportFiles = new File[0]; } return reportFiles; } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/RunFailureException.java b/src/main/java/org/apache/maven/plugins/invoker/RunFailureException.java index 1966fc66..6241970a 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/RunFailureException.java +++ b/src/main/java/org/apache/maven/plugins/invoker/RunFailureException.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -24,32 +42,26 @@ * * @author Slawomir Jaranowski */ -public class RunFailureException extends Exception -{ +public class RunFailureException extends Exception { private final String type; - public RunFailureException( String message, String type ) - { - super( message ); + public RunFailureException(String message, String type) { + super(message); this.type = type; } - public RunFailureException( String type, Throwable cause ) - { - super( cause ); + public RunFailureException(String type, Throwable cause) { + super(cause); this.type = type; - } - public RunFailureException( String message, String type, Throwable cause ) - { - super( message, cause ); + public RunFailureException(String message, String type, Throwable cause) { + super(message, cause); this.type = type; } - public String getType() - { + public String getType() { return type; } } diff --git a/src/main/java/org/apache/maven/plugins/invoker/Selector.java b/src/main/java/org/apache/maven/plugins/invoker/Selector.java index 6f6cfbab..03c71995 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/Selector.java +++ b/src/main/java/org/apache/maven/plugins/invoker/Selector.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -26,8 +44,7 @@ * @author Robert Scholte * */ -class Selector -{ +class Selector { static final int SELECTOR_MAVENVERSION = 1; static final int SELECTOR_JREVERSION = 2; @@ -44,52 +61,40 @@ class Selector private final ToolchainPrivateManager toolchainPrivateManager; - Selector( String actualMavenVersion, String actualJavaVersion, ToolchainPrivateManager toolchainPrivateManager ) - { + Selector(String actualMavenVersion, String actualJavaVersion, ToolchainPrivateManager toolchainPrivateManager) { this.actualMavenVersion = actualMavenVersion; this.actualJavaVersion = actualJavaVersion; this.toolchainPrivateManager = toolchainPrivateManager; } - public int getSelection( InvokerProperties invokerProperties ) - { - if ( !invokerProperties.isSelectorDefined( 1 ) ) - { - return getGlobal( invokerProperties ); + public int getSelection(InvokerProperties invokerProperties) { + if (!invokerProperties.isSelectorDefined(1)) { + return getGlobal(invokerProperties); } - for ( int selectorIndex = 1;; selectorIndex++ ) - { - if ( selectorIndex > 1 && !invokerProperties.isSelectorDefined( selectorIndex ) ) - { + for (int selectorIndex = 1; ; selectorIndex++) { + if (selectorIndex > 1 && !invokerProperties.isSelectorDefined(selectorIndex)) { break; } int selection = 0; - if ( !SelectorUtils.isMavenVersion( invokerProperties.getMavenVersion( selectorIndex ), - actualMavenVersion ) ) - { + if (!SelectorUtils.isMavenVersion(invokerProperties.getMavenVersion(selectorIndex), actualMavenVersion)) { selection |= SELECTOR_MAVENVERSION; } - if ( !SelectorUtils.isJreVersion( invokerProperties.getJreVersion( selectorIndex ), actualJavaVersion ) ) - { + if (!SelectorUtils.isJreVersion(invokerProperties.getJreVersion(selectorIndex), actualJavaVersion)) { selection |= SELECTOR_JREVERSION; } - if ( !SelectorUtils.isOsFamily( invokerProperties.getOsFamily( selectorIndex ) ) ) - { + if (!SelectorUtils.isOsFamily(invokerProperties.getOsFamily(selectorIndex))) { selection |= SELECTOR_OSFAMILY; } - if ( !SelectorUtils.isToolchain( toolchainPrivateManager, - invokerProperties.getToolchains( selectorIndex ) ) ) - { + if (!SelectorUtils.isToolchain(toolchainPrivateManager, invokerProperties.getToolchains(selectorIndex))) { selection |= SELECTOR_TOOLCHAIN; } - if ( selection == 0 ) - { + if (selection == 0) { return 0; } } @@ -103,26 +108,21 @@ public int getSelection( InvokerProperties invokerProperties ) * @return 0 if the job corresponding to the properties should be run, otherwise a bitwise value * representing the reason why it should be skipped. */ - private int getGlobal( InvokerProperties invokerProperties ) - { + private int getGlobal(InvokerProperties invokerProperties) { int selection = 0; - if ( !SelectorUtils.isMavenVersion( invokerProperties.getMavenVersion(), actualMavenVersion ) ) - { + if (!SelectorUtils.isMavenVersion(invokerProperties.getMavenVersion(), actualMavenVersion)) { selection |= SELECTOR_MAVENVERSION; } - if ( !SelectorUtils.isJreVersion( invokerProperties.getJreVersion(), actualJavaVersion ) ) - { + if (!SelectorUtils.isJreVersion(invokerProperties.getJreVersion(), actualJavaVersion)) { selection |= SELECTOR_JREVERSION; } - if ( !SelectorUtils.isOsFamily( invokerProperties.getOsFamily() ) ) - { + if (!SelectorUtils.isOsFamily(invokerProperties.getOsFamily())) { selection |= SELECTOR_OSFAMILY; } - if ( !SelectorUtils.isToolchain( toolchainPrivateManager, invokerProperties.getToolchains() ) ) - { + if (!SelectorUtils.isToolchain(toolchainPrivateManager, invokerProperties.getToolchains())) { selection |= SELECTOR_TOOLCHAIN; } diff --git a/src/main/java/org/apache/maven/plugins/invoker/SelectorUtils.java b/src/main/java/org/apache/maven/plugins/invoker/SelectorUtils.java index 2503bfb9..3d472534 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/SelectorUtils.java +++ b/src/main/java/org/apache/maven/plugins/invoker/SelectorUtils.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -45,53 +63,40 @@ * * @author Benjamin Bentmann */ -class SelectorUtils -{ +class SelectorUtils { - static void parseList( String list, Collection includes, Collection excludes ) - { - String[] tokens = ( list != null ) ? StringUtils.split( list, "," ) : new String[0]; + static void parseList(String list, Collection includes, Collection excludes) { + String[] tokens = (list != null) ? StringUtils.split(list, ",") : new String[0]; - for ( String token1 : tokens ) - { + for (String token1 : tokens) { String token = token1.trim(); - if ( token.startsWith( "!" ) ) - { - excludes.add( token.substring( 1 ) ); - } - else - { - includes.add( token ); + if (token.startsWith("!")) { + excludes.add(token.substring(1)); + } else { + includes.add(token); } } } - static boolean isOsFamily( String osSpec ) - { + static boolean isOsFamily(String osSpec) { List includes = new ArrayList<>(); List excludes = new ArrayList<>(); - parseList( osSpec, includes, excludes ); + parseList(osSpec, includes, excludes); - return isOsFamily( includes, true ) && !isOsFamily( excludes, false ); + return isOsFamily(includes, true) && !isOsFamily(excludes, false); } - static boolean isOsFamily( List families, boolean defaultMatch ) - { - if ( families != null && !families.isEmpty() ) - { - for ( String family : families ) - { - if ( Os.isFamily( family ) ) - { + static boolean isOsFamily(List families, boolean defaultMatch) { + if (families != null && !families.isEmpty()) { + for (String family : families) { + if (Os.isFamily(family)) { return true; } } return false; - } - else - { + } else { return defaultMatch; } } @@ -101,178 +106,143 @@ static boolean isOsFamily( List families, boolean defaultMatch ) * * @return The current Maven version. */ - static String getMavenVersion() - { - try - { + static String getMavenVersion() { + try { // This relies on the fact that MavenProject is the in core classloader // and that the core classloader is for the maven-core artifact // and that should have a pom.properties file // if this ever changes, we will have to revisit this code. Properties properties = new Properties(); // CHECKSTYLE_OFF: LineLength - properties.load( MavenProject.class.getClassLoader() - .getResourceAsStream( "META-INF/maven/org.apache.maven/maven-core/pom.properties" ) ); + properties.load(MavenProject.class + .getClassLoader() + .getResourceAsStream("META-INF/maven/org.apache.maven/maven-core/pom.properties")); // CHECKSTYLE_ON: LineLength - return StringUtils.trim( properties.getProperty( "version" ) ); - } - catch ( Exception e ) - { + return StringUtils.trim(properties.getProperty("version")); + } catch (Exception e) { return null; } } - static String getMavenVersion( File mavenHome ) throws IOException - { - File mavenLib = new File( mavenHome, "lib" ); - File[] jarFiles = mavenLib.listFiles( ( dir, name ) -> name.endsWith( ".jar" ) ); + static String getMavenVersion(File mavenHome) throws IOException { + File mavenLib = new File(mavenHome, "lib"); + File[] jarFiles = mavenLib.listFiles((dir, name) -> name.endsWith(".jar")); - if ( jarFiles == null ) - { - throw new IllegalArgumentException( "Invalid Maven home installation directory: " + mavenHome ); + if (jarFiles == null) { + throw new IllegalArgumentException("Invalid Maven home installation directory: " + mavenHome); } - for ( File file : jarFiles ) - { - try - { - URL url = new URL( "jar:" + file.toURI().toURL().toExternalForm() - + "!/META-INF/maven/org.apache.maven/maven-core/pom.properties" ); + for (File file : jarFiles) { + try { + URL url = new URL("jar:" + file.toURI().toURL().toExternalForm() + + "!/META-INF/maven/org.apache.maven/maven-core/pom.properties"); - try ( InputStream in = url.openStream() ) - { + try (InputStream in = url.openStream()) { Properties properties = new Properties(); - properties.load( in ); - String version = StringUtils.trim( properties.getProperty( "version" ) ); - if ( version != null ) - { + properties.load(in); + String version = StringUtils.trim(properties.getProperty("version")); + if (version != null) { return version; } } - } - catch ( FileNotFoundException | MalformedURLException e ) - { + } catch (FileNotFoundException | MalformedURLException e) { // ignore } } return null; } - static boolean isMavenVersion( String mavenSpec ) - { - return isMavenVersion( mavenSpec, getMavenVersion() ); + static boolean isMavenVersion(String mavenSpec) { + return isMavenVersion(mavenSpec, getMavenVersion()); } - static boolean isMavenVersion( String mavenSpec, String actualVersion ) - { + static boolean isMavenVersion(String mavenSpec, String actualVersion) { List includes = new ArrayList<>(); List excludes = new ArrayList<>(); - parseList( mavenSpec, includes, excludes ); + parseList(mavenSpec, includes, excludes); - List mavenVersionList = parseVersion( actualVersion ); + List mavenVersionList = parseVersion(actualVersion); - return isJreVersion( mavenVersionList, includes, true ) && !isJreVersion( mavenVersionList, excludes, false ); + return isJreVersion(mavenVersionList, includes, true) && !isJreVersion(mavenVersionList, excludes, false); } - static String getJreVersion() - { - return System.getProperty( "java.version", "" ); + static String getJreVersion() { + return System.getProperty("java.version", ""); } - static String getJreVersion( File javaHome ) - { + static String getJreVersion(File javaHome) { // @todo detect actual version return null; } - static boolean isJreVersion( String jreSpec ) - { - return isJreVersion( jreSpec, getJreVersion() ); + static boolean isJreVersion(String jreSpec) { + return isJreVersion(jreSpec, getJreVersion()); } - static boolean isJreVersion( String jreSpec, String actualJreVersion ) - { + static boolean isJreVersion(String jreSpec, String actualJreVersion) { List includes = new ArrayList<>(); List excludes = new ArrayList<>(); - parseList( jreSpec, includes, excludes ); + parseList(jreSpec, includes, excludes); - List jreVersion = parseVersion( actualJreVersion ); + List jreVersion = parseVersion(actualJreVersion); - return isJreVersion( jreVersion, includes, true ) && !isJreVersion( jreVersion, excludes, false ); + return isJreVersion(jreVersion, includes, true) && !isJreVersion(jreVersion, excludes, false); } - static boolean isJreVersion( List jreVersion, List versionPatterns, boolean defaultMatch ) - { - if ( versionPatterns != null && !versionPatterns.isEmpty() ) - { - for ( String versionPattern : versionPatterns ) - { - if ( isJreVersion( jreVersion, versionPattern ) ) - { + static boolean isJreVersion(List jreVersion, List versionPatterns, boolean defaultMatch) { + if (versionPatterns != null && !versionPatterns.isEmpty()) { + for (String versionPattern : versionPatterns) { + if (isJreVersion(jreVersion, versionPattern)) { return true; } } return false; - } - else - { + } else { return defaultMatch; } } - static boolean isJreVersion( List jreVersion, String versionPattern ) - { - List checkVersion = parseVersion( versionPattern ); + static boolean isJreVersion(List jreVersion, String versionPattern) { + List checkVersion = parseVersion(versionPattern); - if ( versionPattern.endsWith( "+" ) ) - { + if (versionPattern.endsWith("+")) { // 1.5+ <=> [1.5,) - return compareVersions( jreVersion, checkVersion ) >= 0; - } - else if ( versionPattern.endsWith( "-" ) ) - { + return compareVersions(jreVersion, checkVersion) >= 0; + } else if (versionPattern.endsWith("-")) { // 1.5- <=> (,1.5) - return compareVersions( jreVersion, checkVersion ) < 0; - } - else - { + return compareVersions(jreVersion, checkVersion) < 0; + } else { // 1.5 <=> [1.5,1.6) return checkVersion.size() <= jreVersion.size() - && checkVersion.equals( jreVersion.subList( 0, checkVersion.size() ) ); + && checkVersion.equals(jreVersion.subList(0, checkVersion.size())); } } - static List parseVersion( String version ) - { - version = version.replaceAll( "[^0-9]", "." ); + static List parseVersion(String version) { + version = version.replaceAll("[^0-9]", "."); - String[] tokens = StringUtils.split( version, "." ); + String[] tokens = StringUtils.split(version, "."); - List numbers = Arrays.stream( tokens ).map( Integer::valueOf ).collect( Collectors.toList() ); + List numbers = Arrays.stream(tokens).map(Integer::valueOf).collect(Collectors.toList()); return numbers; } - static int compareVersions( List version1, List version2 ) - { - for ( Iterator it1 = version1.iterator(), it2 = version2.iterator(); ; ) - { - if ( !it1.hasNext() ) - { + static int compareVersions(List version1, List version2) { + for (Iterator it1 = version1.iterator(), it2 = version2.iterator(); ; ) { + if (!it1.hasNext()) { return it2.hasNext() ? -1 : 0; } - if ( !it2.hasNext() ) - { + if (!it2.hasNext()) { return it1.hasNext() ? 1 : 0; } Integer num1 = it1.next(); Integer num2 = it2.next(); - int rel = num1.compareTo( num2 ); - if ( rel != 0 ) - { + int rel = num1.compareTo(num2); + if (rel != 0) { return rel; } } @@ -283,36 +253,27 @@ static int compareVersions( List version1, List version2 ) * @param invokerToolchains * @return {@code true} if all invokerToolchains are available, otherwise {@code false} */ - static boolean isToolchain( ToolchainPrivateManager toolchainPrivateManager, - Collection invokerToolchains ) - { - for ( InvokerToolchain invokerToolchain : invokerToolchains ) - { + static boolean isToolchain( + ToolchainPrivateManager toolchainPrivateManager, Collection invokerToolchains) { + for (InvokerToolchain invokerToolchain : invokerToolchains) { boolean found = false; - try - { - for ( ToolchainPrivate tc : toolchainPrivateManager.getToolchainPrivates( invokerToolchain.getType() ) ) - { - if ( !invokerToolchain.getType().equals( tc.getType() ) ) - { + try { + for (ToolchainPrivate tc : toolchainPrivateManager.getToolchainPrivates(invokerToolchain.getType())) { + if (!invokerToolchain.getType().equals(tc.getType())) { // useful because of MNG-5716 continue; } - if ( tc.matchesRequirements( invokerToolchain.getProvides() ) ) - { + if (tc.matchesRequirements(invokerToolchain.getProvides())) { found = true; continue; } } - } - catch ( MisconfiguredToolchainException e ) - { + } catch (MisconfiguredToolchainException e) { return false; } - if ( !found ) - { + if (!found) { return false; } } diff --git a/src/main/java/org/apache/maven/plugins/invoker/SystemPropertyPrinter.java b/src/main/java/org/apache/maven/plugins/invoker/SystemPropertyPrinter.java index 6ee237f3..594357eb 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/SystemPropertyPrinter.java +++ b/src/main/java/org/apache/maven/plugins/invoker/SystemPropertyPrinter.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -26,17 +44,13 @@ * @author Robert Scholte * @since 1.8 */ -public class SystemPropertyPrinter -{ +public class SystemPropertyPrinter { /** * @param args system properties to print */ - public static void main( String[] args ) - { - for ( String arg : args ) - { - System.out.println( System.getProperty( arg, "" ) ); + public static void main(String[] args) { + for (String arg : args) { + System.out.println(System.getProperty(arg, "")); } } - } diff --git a/src/main/java/org/apache/maven/plugins/invoker/VerifyMojo.java b/src/main/java/org/apache/maven/plugins/invoker/VerifyMojo.java index 66ab7625..1ae19041 100644 --- a/src/main/java/org/apache/maven/plugins/invoker/VerifyMojo.java +++ b/src/main/java/org/apache/maven/plugins/invoker/VerifyMojo.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -19,37 +37,35 @@ * under the License. */ +import java.io.File; +import java.io.IOException; +import java.io.Reader; + import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.invoker.model.io.xpp3.BuildJobXpp3Reader; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.invoker.model.io.xpp3.BuildJobXpp3Reader; import org.codehaus.plexus.util.ReaderFactory; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; -import java.io.File; -import java.io.IOException; -import java.io.Reader; - /** * Checks the results of maven-invoker-plugin based integration tests and fails the build if any tests failed. * * @author Olivier Lamy * @since 1.4 */ -@Mojo( name = "verify", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true ) -public class VerifyMojo - extends AbstractMojo -{ +@Mojo(name = "verify", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true) +public class VerifyMojo extends AbstractMojo { /** * Flag used to suppress certain invocations. This is useful in tailoring the build using profiles. * * @since 1.1 */ - @Parameter( property = "invoker.skip", defaultValue = "false" ) + @Parameter(property = "invoker.skip", defaultValue = "false") private boolean skipInvocation; /** @@ -57,7 +73,7 @@ public class VerifyMojo * * @since 1.4 */ - @Parameter( property = "invoker.reportsDirectory", defaultValue = "${project.build.directory}/invoker-reports" ) + @Parameter(property = "invoker.reportsDirectory", defaultValue = "${project.build.directory}/invoker-reports") private File reportsDirectory; /** @@ -66,7 +82,7 @@ public class VerifyMojo * * @since 1.3 */ - @Parameter( property = "maven.test.failure.ignore", defaultValue = "false" ) + @Parameter(property = "maven.test.failure.ignore", defaultValue = "false") private boolean ignoreFailures; /** @@ -74,7 +90,7 @@ public class VerifyMojo * only indication of the build's success or failure will be the effect it has on the main build (if it fails, the * main build should fail as well). */ - @Parameter( defaultValue = "false" ) + @Parameter(defaultValue = "false") private boolean suppressSummaries; /** @@ -82,7 +98,7 @@ public class VerifyMojo * * @since 1.9 */ - @Parameter( property = "invoker.failIfNoProjects" ) + @Parameter(property = "invoker.failIfNoProjects") private Boolean failIfNoProjects; /** @@ -90,7 +106,7 @@ public class VerifyMojo * * @since 3.2.2 */ - @Parameter( property = "invoker.streamLogsOnFailures", defaultValue = "false" ) + @Parameter(property = "invoker.streamLogsOnFailures", defaultValue = "false") private boolean streamLogsOnFailures; /** @@ -99,24 +115,19 @@ public class VerifyMojo * @throws org.apache.maven.plugin.MojoExecutionException If the goal encountered severe errors. * @throws org.apache.maven.plugin.MojoFailureException If any of the Maven builds failed. */ - public void execute() - throws MojoExecutionException, MojoFailureException - { - if ( skipInvocation ) - { - getLog().info( "Skipping invocation per configuration." - + " If this is incorrect, ensure the skipInvocation parameter is not set to true." ); + public void execute() throws MojoExecutionException, MojoFailureException { + if (skipInvocation) { + getLog().info("Skipping invocation per configuration." + + " If this is incorrect, ensure the skipInvocation parameter is not set to true."); return; } - File[] reportFiles = ReportUtils.getReportFiles( reportsDirectory ); - if ( reportFiles.length <= 0 ) - { - if ( Boolean.TRUE.equals( failIfNoProjects ) ) - { - throw new MojoFailureException( "No projects to invoke!" ); + File[] reportFiles = ReportUtils.getReportFiles(reportsDirectory); + if (reportFiles.length <= 0) { + if (Boolean.TRUE.equals(failIfNoProjects)) { + throw new MojoFailureException("No projects to invoke!"); } - getLog().info( "No invoker report files found, nothing to check." ); + getLog().info("No invoker report files found, nothing to check."); return; } @@ -124,33 +135,24 @@ public void execute() InvokerSession invokerSession = new InvokerSession(); - for ( File reportFile : reportFiles ) - { - try ( Reader xmlReader = ReaderFactory.newXmlReader( reportFile ) ) - { - invokerSession.addJob( reader.read( xmlReader ) ); - } - catch ( XmlPullParserException e ) - { - throw new MojoExecutionException( "Failed to parse report file: " + reportFile, e ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Failed to read report file: " + reportFile, e ); + for (File reportFile : reportFiles) { + try (Reader xmlReader = ReaderFactory.newXmlReader(reportFile)) { + invokerSession.addJob(reader.read(xmlReader)); + } catch (XmlPullParserException e) { + throw new MojoExecutionException("Failed to parse report file: " + reportFile, e); + } catch (IOException e) { + throw new MojoExecutionException("Failed to read report file: " + reportFile, e); } } - if ( streamLogsOnFailures ) - { - invokerSession.logFailedBuildLog( getLog(), ignoreFailures ); + if (streamLogsOnFailures) { + invokerSession.logFailedBuildLog(getLog(), ignoreFailures); } - if ( !suppressSummaries ) - { - invokerSession.logSummary( getLog(), ignoreFailures ); + if (!suppressSummaries) { + invokerSession.logSummary(getLog(), ignoreFailures); } - invokerSession.handleFailures( getLog(), ignoreFailures ); + invokerSession.handleFailures(getLog(), ignoreFailures); } - } diff --git a/src/test/java/org/apache/maven/plugins/invoker/ExtendedMavenProjectStub.java b/src/test/java/org/apache/maven/plugins/invoker/ExtendedMavenProjectStub.java index 0f3aeaf4..c0271d48 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/ExtendedMavenProjectStub.java +++ b/src/test/java/org/apache/maven/plugins/invoker/ExtendedMavenProjectStub.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -19,39 +37,33 @@ * under the License. */ +import java.util.Properties; + import org.apache.maven.model.Scm; import org.apache.maven.plugin.testing.stubs.MavenProjectStub; -import java.util.Properties; - /** * @author Olivier Lamy * @since 22 nov. 07 */ -public class ExtendedMavenProjectStub - extends MavenProjectStub -{ +public class ExtendedMavenProjectStub extends MavenProjectStub { private Scm scm; private Properties properties; - public Scm getScm() - { + public Scm getScm() { return scm; } - public void setScm( Scm scm ) - { + public void setScm(Scm scm) { this.scm = scm; } - public Properties getProperties() - { + public Properties getProperties() { return properties; } - public void setProperties( Properties properties ) - { + public void setProperties(Properties properties) { this.properties = properties; } } diff --git a/src/test/java/org/apache/maven/plugins/invoker/InterpolationTest.java b/src/test/java/org/apache/maven/plugins/invoker/InterpolationTest.java index 8f96fb95..40d2495d 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/InterpolationTest.java +++ b/src/test/java/org/apache/maven/plugins/invoker/InterpolationTest.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -35,74 +53,66 @@ * @author Olivier Lamy * @since 22 nov. 07 */ -public class InterpolationTest - extends AbstractMojoTestCase -{ +public class InterpolationTest extends AbstractMojoTestCase { - protected MavenProjectStub buildMavenProjectStub() - { + protected MavenProjectStub buildMavenProjectStub() { ExtendedMavenProjectStub project = new ExtendedMavenProjectStub(); - project.setVersion( "1.0-SNAPSHOT" ); - project.setArtifactId( "foo" ); - project.setGroupId( "bar" ); + project.setVersion("1.0-SNAPSHOT"); + project.setArtifactId("foo"); + project.setGroupId("bar"); Properties properties = new Properties(); - properties.put( "fooOnProject", "barOnProject" ); - project.setProperties( properties ); + properties.put("fooOnProject", "barOnProject"); + project.setProperties(properties); Scm scm = new Scm(); - scm.setConnection( "http://blabla" ); - project.setScm( scm ); + scm.setConnection("http://blabla"); + project.setScm(scm); return project; } - public void testCompositeMap() - { + public void testCompositeMap() { Properties properties = new Properties(); - properties.put( "foo", "bar" ); - properties.put( "version", "2.0-SNAPSHOT" ); - CompositeMap compositeMap = new CompositeMap( buildMavenProjectStub(), (Map) properties, false ); - assertEquals( "1.0-SNAPSHOT", compositeMap.get( "pom.version" ) ); - assertEquals( "bar", compositeMap.get( "foo" ) ); - assertEquals( "bar", compositeMap.get( "pom.groupId" ) ); - assertEquals( "http://blabla", compositeMap.get( "pom.scm.connection" ) ); - assertEquals( "barOnProject", compositeMap.get( "fooOnProject" ) ); + properties.put("foo", "bar"); + properties.put("version", "2.0-SNAPSHOT"); + CompositeMap compositeMap = new CompositeMap(buildMavenProjectStub(), (Map) properties, false); + assertEquals("1.0-SNAPSHOT", compositeMap.get("pom.version")); + assertEquals("bar", compositeMap.get("foo")); + assertEquals("bar", compositeMap.get("pom.groupId")); + assertEquals("http://blabla", compositeMap.get("pom.scm.connection")); + assertEquals("barOnProject", compositeMap.get("fooOnProject")); } - public void testPomInterpolation() - throws Exception - { + public void testPomInterpolation() throws Exception { Reader reader = null; File interpolatedPomFile; - try - { + try { InvokerMojo invokerMojo = new InvokerMojo(); - setVariableValueToObject( invokerMojo, "project", buildMavenProjectStub() ); - setVariableValueToObject( invokerMojo, "settings", new Settings() ); + setVariableValueToObject(invokerMojo, "project", buildMavenProjectStub()); + setVariableValueToObject(invokerMojo, "settings", new Settings()); Properties properties = new Properties(); - properties.put( "foo", "bar" ); - properties.put( "version", "2.0-SNAPSHOT" ); - setVariableValueToObject( invokerMojo, "filterProperties", properties ); - String dirPath = getBasedir() + File.separatorChar + "src" + File.separatorChar + "test" - + File.separatorChar + "resources" + File.separatorChar + "unit" + File.separatorChar + "interpolation"; + properties.put("foo", "bar"); + properties.put("version", "2.0-SNAPSHOT"); + setVariableValueToObject(invokerMojo, "filterProperties", properties); + String dirPath = + getBasedir() + File.separatorChar + "src" + File.separatorChar + "test" + File.separatorChar + + "resources" + File.separatorChar + "unit" + File.separatorChar + "interpolation"; - interpolatedPomFile = new File( getBasedir(), "target/interpolated-pom.xml" ); - invokerMojo.buildInterpolatedFile( new File( dirPath, "pom.xml" ), interpolatedPomFile ); - reader = ReaderFactory.newXmlReader( interpolatedPomFile ); - String content = IOUtil.toString( reader ); - assertTrue( content.indexOf( "bar" ) > 0 ); + interpolatedPomFile = new File(getBasedir(), "target/interpolated-pom.xml"); + invokerMojo.buildInterpolatedFile(new File(dirPath, "pom.xml"), interpolatedPomFile); + reader = ReaderFactory.newXmlReader(interpolatedPomFile); + String content = IOUtil.toString(reader); + assertTrue(content.indexOf("bar") > 0); reader.close(); reader = null; // recreate it to test delete if exists before creation - invokerMojo.buildInterpolatedFile( new File( dirPath, "pom.xml" ), interpolatedPomFile ); - reader = ReaderFactory.newXmlReader( interpolatedPomFile ); - content = IOUtil.toString( reader ); - assertTrue( content.indexOf( "bar" ) > 0 ); + invokerMojo.buildInterpolatedFile(new File(dirPath, "pom.xml"), interpolatedPomFile); + reader = ReaderFactory.newXmlReader(interpolatedPomFile); + content = IOUtil.toString(reader); + assertTrue(content.indexOf("bar") > 0); reader.close(); reader = null; - } - finally - { - IOUtil.close( reader ); + } finally { + IOUtil.close(reader); } } } diff --git a/src/test/java/org/apache/maven/plugins/invoker/InvokerMojoTest.java b/src/test/java/org/apache/maven/plugins/invoker/InvokerMojoTest.java index b1f704b7..eaf704f0 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/InvokerMojoTest.java +++ b/src/test/java/org/apache/maven/plugins/invoker/InvokerMojoTest.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -19,108 +37,97 @@ * under the License. */ -import static org.assertj.core.api.Assertions.assertThat; +import java.io.File; +import java.util.Collections; +import java.util.List; import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.apache.maven.plugins.invoker.model.BuildJob; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; -import java.io.File; -import java.util.Collections; -import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; /** * @author Olivier Lamy * @since 18 nov. 07 */ -public class InvokerMojoTest extends AbstractMojoTestCase -{ +public class InvokerMojoTest extends AbstractMojoTestCase { private static final String DUMMY_PROJECT = "dummy" + File.separator + "pom.xml"; private static final String WITH_POM_DIR_PROJECT = "with-pom-project-dir" + File.separator + "pom.xml"; private static final String INTERPOLATION_PROJECT = "interpolation" + File.separator + "pom.xml"; private static final String WITHOUT_POM_PROJECT = "without-pom-project-dir"; - private MavenProject getMavenProject() - { + private MavenProject getMavenProject() { MavenProject mavenProject = new MavenProject(); - mavenProject.setFile( new File( "target/foo.txt" ) ); + mavenProject.setFile(new File("target/foo.txt")); return mavenProject; } - public void testSingleInvokerTest() throws Exception - { + public void testSingleInvokerTest() throws Exception { // given InvokerMojo invokerMojo = new InvokerMojo(); String dirPath = getBasedir() + "/src/test/resources/unit"; - setVariableValueToObject( invokerMojo, "projectsDirectory", new File( dirPath ) ); - setVariableValueToObject( invokerMojo, "invokerPropertiesFile", "invoker.properties" ); - setVariableValueToObject( invokerMojo, "project", getMavenProject() ); - setVariableValueToObject( invokerMojo, "invokerTest", "*dummy*" ); - setVariableValueToObject( invokerMojo, "settings", new Settings() ); + setVariableValueToObject(invokerMojo, "projectsDirectory", new File(dirPath)); + setVariableValueToObject(invokerMojo, "invokerPropertiesFile", "invoker.properties"); + setVariableValueToObject(invokerMojo, "project", getMavenProject()); + setVariableValueToObject(invokerMojo, "invokerTest", "*dummy*"); + setVariableValueToObject(invokerMojo, "settings", new Settings()); // when List jobs = invokerMojo.getBuildJobs(); // then - assertThat( jobs ) - .map( BuildJob::getProject ) - .containsExactlyInAnyOrder( DUMMY_PROJECT ); + assertThat(jobs).map(BuildJob::getProject).containsExactlyInAnyOrder(DUMMY_PROJECT); } - public void testMultiInvokerTest() throws Exception - { + public void testMultiInvokerTest() throws Exception { // given InvokerMojo invokerMojo = new InvokerMojo(); String dirPath = getBasedir() + "/src/test/resources/unit"; - setVariableValueToObject( invokerMojo, "projectsDirectory", new File( dirPath ) ); - setVariableValueToObject( invokerMojo, "invokerPropertiesFile", "invoker.properties" ); - setVariableValueToObject( invokerMojo, "project", getMavenProject() ); - setVariableValueToObject( invokerMojo, "invokerTest", "*dummy*,*terpolatio*" ); - setVariableValueToObject( invokerMojo, "settings", new Settings() ); + setVariableValueToObject(invokerMojo, "projectsDirectory", new File(dirPath)); + setVariableValueToObject(invokerMojo, "invokerPropertiesFile", "invoker.properties"); + setVariableValueToObject(invokerMojo, "project", getMavenProject()); + setVariableValueToObject(invokerMojo, "invokerTest", "*dummy*,*terpolatio*"); + setVariableValueToObject(invokerMojo, "settings", new Settings()); // when List jobs = invokerMojo.getBuildJobs(); // then - assertThat( jobs ) - .map( BuildJob::getProject ) - .containsExactlyInAnyOrder( DUMMY_PROJECT, INTERPOLATION_PROJECT ); + assertThat(jobs).map(BuildJob::getProject).containsExactlyInAnyOrder(DUMMY_PROJECT, INTERPOLATION_PROJECT); } - public void testFullPatternInvokerTest() throws Exception - { + public void testFullPatternInvokerTest() throws Exception { // given InvokerMojo invokerMojo = new InvokerMojo(); String dirPath = getBasedir() + "/src/test/resources/unit"; - setVariableValueToObject( invokerMojo, "projectsDirectory", new File( dirPath ) ); - setVariableValueToObject( invokerMojo, "invokerPropertiesFile", "invoker.properties" ); - setVariableValueToObject( invokerMojo, "project", getMavenProject() ); - setVariableValueToObject( invokerMojo, "invokerTest", "*" ); - setVariableValueToObject( invokerMojo, "settings", new Settings() ); + setVariableValueToObject(invokerMojo, "projectsDirectory", new File(dirPath)); + setVariableValueToObject(invokerMojo, "invokerPropertiesFile", "invoker.properties"); + setVariableValueToObject(invokerMojo, "project", getMavenProject()); + setVariableValueToObject(invokerMojo, "invokerTest", "*"); + setVariableValueToObject(invokerMojo, "settings", new Settings()); // when List jobs = invokerMojo.getBuildJobs(); // then - assertThat( jobs ) - .map( BuildJob::getProject ) + assertThat(jobs) + .map(BuildJob::getProject) .containsExactlyInAnyOrder( - DUMMY_PROJECT, WITH_POM_DIR_PROJECT, WITHOUT_POM_PROJECT, - INTERPOLATION_PROJECT ); + DUMMY_PROJECT, WITH_POM_DIR_PROJECT, WITHOUT_POM_PROJECT, INTERPOLATION_PROJECT); } - public void testSetupInProjectList() throws Exception - { + public void testSetupInProjectList() throws Exception { // given InvokerMojo invokerMojo = new InvokerMojo(); String dirPath = getBasedir() + "/src/test/resources/unit"; - setVariableValueToObject( invokerMojo, "projectsDirectory", new File( dirPath ) ); - setVariableValueToObject( invokerMojo, "invokerPropertiesFile", "invoker.properties" ); - setVariableValueToObject( invokerMojo, "project", getMavenProject() ); - setVariableValueToObject( invokerMojo, "settings", new Settings() ); - setVariableValueToObject( invokerMojo, "setupIncludes", Collections.singletonList( "dum*/pom.xml" ) ); + setVariableValueToObject(invokerMojo, "projectsDirectory", new File(dirPath)); + setVariableValueToObject(invokerMojo, "invokerPropertiesFile", "invoker.properties"); + setVariableValueToObject(invokerMojo, "project", getMavenProject()); + setVariableValueToObject(invokerMojo, "settings", new Settings()); + setVariableValueToObject(invokerMojo, "setupIncludes", Collections.singletonList("dum*/pom.xml")); // when List jobs = invokerMojo.getBuildJobs(); @@ -128,30 +135,27 @@ public void testSetupInProjectList() throws Exception // then // we have all projects with pom.xml - assertThat( jobs ) - .map( BuildJob::getProject ) - .containsExactlyInAnyOrder( - DUMMY_PROJECT, WITH_POM_DIR_PROJECT, INTERPOLATION_PROJECT ); + assertThat(jobs) + .map(BuildJob::getProject) + .containsExactlyInAnyOrder(DUMMY_PROJECT, WITH_POM_DIR_PROJECT, INTERPOLATION_PROJECT); // and we have one setup project - assertThat( jobs ) - .filteredOn( job -> BuildJob.Type.SETUP.equals( job.getType() ) ) - .map( BuildJob::getProject ) - .containsExactlyInAnyOrder( DUMMY_PROJECT ); + assertThat(jobs) + .filteredOn(job -> BuildJob.Type.SETUP.equals(job.getType())) + .map(BuildJob::getProject) + .containsExactlyInAnyOrder(DUMMY_PROJECT); } - public void testSetupProjectIsFiltered() throws Exception - { + public void testSetupProjectIsFiltered() throws Exception { // given InvokerMojo invokerMojo = new InvokerMojo(); String dirPath = getBasedir() + "/src/test/resources/unit"; - setVariableValueToObject( invokerMojo, "projectsDirectory", new File( dirPath ) ); - setVariableValueToObject( invokerMojo, "invokerPropertiesFile", "invoker.properties" ); - setVariableValueToObject( invokerMojo, "project", getMavenProject() ); - setVariableValueToObject( invokerMojo, "settings", new Settings() ); - setVariableValueToObject( invokerMojo, "setupIncludes", Collections.singletonList( "dum*/pom.xml" ) ); - setVariableValueToObject( invokerMojo, "invokerTest", "*project-dir*" ); - + setVariableValueToObject(invokerMojo, "projectsDirectory", new File(dirPath)); + setVariableValueToObject(invokerMojo, "invokerPropertiesFile", "invoker.properties"); + setVariableValueToObject(invokerMojo, "project", getMavenProject()); + setVariableValueToObject(invokerMojo, "settings", new Settings()); + setVariableValueToObject(invokerMojo, "setupIncludes", Collections.singletonList("dum*/pom.xml")); + setVariableValueToObject(invokerMojo, "invokerTest", "*project-dir*"); // when List jobs = invokerMojo.getBuildJobs(); @@ -159,44 +163,37 @@ public void testSetupProjectIsFiltered() throws Exception // then // we have filtered projects - assertThat( jobs ) - .map( BuildJob::getProject ) - .containsExactlyInAnyOrder( - WITH_POM_DIR_PROJECT, WITHOUT_POM_PROJECT ); + assertThat(jobs).map(BuildJob::getProject).containsExactlyInAnyOrder(WITH_POM_DIR_PROJECT, WITHOUT_POM_PROJECT); // and we don't have a setup project - assertThat( jobs ) - .filteredOn( job -> BuildJob.Type.SETUP.equals( job.getType() ) ) + assertThat(jobs) + .filteredOn(job -> BuildJob.Type.SETUP.equals(job.getType())) .isEmpty(); } - public void testAlreadyCloned() - { - assertFalse( AbstractInvokerMojo.alreadyCloned( "dir", Collections.emptyList() ) ); - assertTrue( AbstractInvokerMojo.alreadyCloned( "dir", Collections.singletonList( "dir" ) ) ); - assertTrue( AbstractInvokerMojo.alreadyCloned( "dir" + File.separator + "sub", - Collections.singletonList( "dir" ) ) ); - assertFalse( AbstractInvokerMojo.alreadyCloned( "dirs", Collections.singletonList( "dir" ) ) ); + public void testAlreadyCloned() { + assertFalse(AbstractInvokerMojo.alreadyCloned("dir", Collections.emptyList())); + assertTrue(AbstractInvokerMojo.alreadyCloned("dir", Collections.singletonList("dir"))); + assertTrue(AbstractInvokerMojo.alreadyCloned("dir" + File.separator + "sub", Collections.singletonList("dir"))); + assertFalse(AbstractInvokerMojo.alreadyCloned("dirs", Collections.singletonList("dir"))); } - public void testParallelThreadsSettings() throws IllegalAccessException - { + public void testParallelThreadsSettings() throws IllegalAccessException { Object[][] testValues = { - {"4", 4}, - {"1C", Runtime.getRuntime().availableProcessors()}, - {"2.5C", (int) ( Double.parseDouble( "2.5" ) * Runtime.getRuntime().availableProcessors() )} + {"4", 4}, + {"1C", Runtime.getRuntime().availableProcessors()}, + {"2.5C", (int) (Double.parseDouble("2.5") * Runtime.getRuntime().availableProcessors())} }; InvokerMojo invokerMojo = new InvokerMojo(); - for ( Object[] testValue : testValues ) - { + for (Object[] testValue : testValues) { String parallelThreads = (String) testValue[0]; int expectedParallelThreads = (Integer) testValue[1]; - setVariableValueToObject( invokerMojo, "parallelThreads", parallelThreads ); + setVariableValueToObject(invokerMojo, "parallelThreads", parallelThreads); - assertEquals( expectedParallelThreads, invokerMojo.getParallelThreadsCount() ); + assertEquals(expectedParallelThreads, invokerMojo.getParallelThreadsCount()); } } } diff --git a/src/test/java/org/apache/maven/plugins/invoker/InvokerPropertiesTest.java b/src/test/java/org/apache/maven/plugins/invoker/InvokerPropertiesTest.java index 1694e1d8..c656f002 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/InvokerPropertiesTest.java +++ b/src/test/java/org/apache/maven/plugins/invoker/InvokerPropertiesTest.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -48,534 +66,501 @@ * * @author Benjamin Bentmann */ -@RunWith( MockitoJUnitRunner.class ) -public class InvokerPropertiesTest -{ +@RunWith(MockitoJUnitRunner.class) +public class InvokerPropertiesTest { @Mock private InvocationRequest request; @Test - public void testConstructorNullSafe() - { - InvokerProperties facade = new InvokerProperties( null ); - assertThat( facade.getProperties() ).isNotNull(); + public void testConstructorNullSafe() { + InvokerProperties facade = new InvokerProperties(null); + assertThat(facade.getProperties()).isNotNull(); } @Test - public void testGetInvokerProperty() - { + public void testGetInvokerProperty() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - assertThat( facade.get( "undefined-key", 0 ) ).isEmpty(); + assertThat(facade.get("undefined-key", 0)).isEmpty(); - props.setProperty( "key", "value" ); - assertThat( facade.get( "key", 1 ) ).hasValue( "value" ); + props.setProperty("key", "value"); + assertThat(facade.get("key", 1)).hasValue("value"); - props.setProperty( "key.1", "another-value" ); - assertThat( facade.get( "key", 1 ) ).hasValue( "another-value" ); - assertThat( facade.get( "key", 2 ) ).hasValue( "value" ); + props.setProperty("key.1", "another-value"); + assertThat(facade.get("key", 1)).hasValue("another-value"); + assertThat(facade.get("key", 2)).hasValue("value"); } @Test - public void testGetJobName() - { + public void testGetJobName() { Properties props = new Properties(); final String jobName = "Build Job name"; - props.put( "invoker.name", jobName ); - InvokerProperties facade = new InvokerProperties( props ); + props.put("invoker.name", jobName); + InvokerProperties facade = new InvokerProperties(props); - assertThat( facade.getJobName() ).isEqualTo( jobName ); + assertThat(facade.getJobName()).isEqualTo(jobName); } @Test - public void testIsExpectedResult() - { + public void testIsExpectedResult() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - assertThat( facade.isExpectedResult( 0, 0 ) ).isTrue(); - assertThat( facade.isExpectedResult( 1, 0 ) ).isFalse(); + assertThat(facade.isExpectedResult(0, 0)).isTrue(); + assertThat(facade.isExpectedResult(1, 0)).isFalse(); - props.setProperty( "invoker.buildResult", "success" ); - assertThat( facade.isExpectedResult( 0, 0 ) ).isTrue(); - assertThat( facade.isExpectedResult( 1, 0 ) ).isFalse(); + props.setProperty("invoker.buildResult", "success"); + assertThat(facade.isExpectedResult(0, 0)).isTrue(); + assertThat(facade.isExpectedResult(1, 0)).isFalse(); - props.setProperty( "invoker.buildResult", "failure" ); - assertThat( facade.isExpectedResult( 0, 0 ) ).isFalse(); - assertThat( facade.isExpectedResult( 1, 0 ) ).isTrue(); + props.setProperty("invoker.buildResult", "failure"); + assertThat(facade.isExpectedResult(0, 0)).isFalse(); + assertThat(facade.isExpectedResult(1, 0)).isTrue(); } @Test - public void testConfigureRequestEmptyProperties() - { + public void testConfigureRequestEmptyProperties() { - InvokerProperties facade = new InvokerProperties( null ); + InvokerProperties facade = new InvokerProperties(null); - facade.configureInvocation( request, 0 ); - verifyNoInteractions( request ); + facade.configureInvocation(request, 0); + verifyNoInteractions(request); } @Test - public void testConfigureRequestGoals() - { + public void testConfigureRequestGoals() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - - props.setProperty( "invoker.goals", "verify" ); - facade.configureInvocation( request, 0 ); - verify( request ).setGoals( Collections.singletonList( "verify" ) ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.goals", " " ); - facade.configureInvocation( request, 0 ); - verify( request, never() ).setGoals( anyList() ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.goals", "" ); - facade.configureInvocation( request, 0 ); - verify( request, never() ).setGoals( anyList() ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.goals", " clean , test verify " ); - facade.configureInvocation( request, 0 ); - verify( request ).setGoals( Arrays.asList( "clean", "test", "verify" ) ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + InvokerProperties facade = new InvokerProperties(props); + + props.setProperty("invoker.goals", "verify"); + facade.configureInvocation(request, 0); + verify(request).setGoals(Collections.singletonList("verify")); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.goals", " "); + facade.configureInvocation(request, 0); + verify(request, never()).setGoals(anyList()); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.goals", ""); + facade.configureInvocation(request, 0); + verify(request, never()).setGoals(anyList()); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.goals", " clean , test verify "); + facade.configureInvocation(request, 0); + verify(request).setGoals(Arrays.asList("clean", "test", "verify")); + verifyNoMoreInteractions(request); + clearInvocations(request); props.clear(); - facade.setDefaultGoals( Arrays.asList( "clean", "test" ) ); - facade.configureInvocation( request, 0 ); - verify( request ).setGoals( Arrays.asList( "clean", "test" ) ); - verifyNoMoreInteractions( request ); + facade.setDefaultGoals(Arrays.asList("clean", "test")); + facade.configureInvocation(request, 0); + verify(request).setGoals(Arrays.asList("clean", "test")); + verifyNoMoreInteractions(request); } @Test - public void testConfigureRequestProfiles() - { + public void testConfigureRequestProfiles() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - - props.setProperty( "invoker.profiles", "verify" ); - facade.configureInvocation( request, 0 ); - verify( request ).setProfiles( Collections.singletonList( "verify" ) ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.profiles", " " ); - facade.configureInvocation( request, 0 ); - verify( request, never() ).setProfiles( anyList() ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.profiles", "" ); - facade.configureInvocation( request, 0 ); - verify( request, never() ).setProfiles( anyList() ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.profiles", " clean , test verify ," ); - facade.configureInvocation( request, 0 ); - verify( request ).setProfiles( Arrays.asList( "clean", "test", "verify" ) ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + InvokerProperties facade = new InvokerProperties(props); + + props.setProperty("invoker.profiles", "verify"); + facade.configureInvocation(request, 0); + verify(request).setProfiles(Collections.singletonList("verify")); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.profiles", " "); + facade.configureInvocation(request, 0); + verify(request, never()).setProfiles(anyList()); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.profiles", ""); + facade.configureInvocation(request, 0); + verify(request, never()).setProfiles(anyList()); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.profiles", " clean , test verify ,"); + facade.configureInvocation(request, 0); + verify(request).setProfiles(Arrays.asList("clean", "test", "verify")); + verifyNoMoreInteractions(request); + clearInvocations(request); props.clear(); - facade.setDefaultProfiles( Arrays.asList( "profile1", "profile2" ) ); - facade.configureInvocation( request, 0 ); - verify( request ).setProfiles( Arrays.asList( "profile1", "profile2" ) ); - verifyNoMoreInteractions( request ); - + facade.setDefaultProfiles(Arrays.asList("profile1", "profile2")); + facade.configureInvocation(request, 0); + verify(request).setProfiles(Arrays.asList("profile1", "profile2")); + verifyNoMoreInteractions(request); } @Test - public void testConfigureRequestProject() throws Exception - { + public void testConfigureRequestProject() throws Exception { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - File tempPom = File.createTempFile( "maven-invoker-plugin-test", ".pom" ); - try - { + File tempPom = File.createTempFile("maven-invoker-plugin-test", ".pom"); + try { File tempDir = tempPom.getParentFile(); - when( request.getBaseDirectory() ).thenReturn( tempDir ); - - props.setProperty( "invoker.project", tempPom.getName() ); - facade.configureInvocation( request, 0 ); - verify( request ).getBaseDirectory(); - verify( request ).setBaseDirectory( tempDir ); - verify( request ).setPomFile( tempPom ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.project", "" ); - facade.configureInvocation( request, 0 ); - verifyNoInteractions( request ); - } - finally - { + when(request.getBaseDirectory()).thenReturn(tempDir); + + props.setProperty("invoker.project", tempPom.getName()); + facade.configureInvocation(request, 0); + verify(request).getBaseDirectory(); + verify(request).setBaseDirectory(tempDir); + verify(request).setPomFile(tempPom); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.project", ""); + facade.configureInvocation(request, 0); + verifyNoInteractions(request); + } finally { tempPom.delete(); } } @Test - public void testConfigureRequestMavenExecutable() - { + public void testConfigureRequestMavenExecutable() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - File aDefExecutable = new File( "defExecutable" ); - facade.setDefaultMavenExecutable( aDefExecutable ); + InvokerProperties facade = new InvokerProperties(props); + File aDefExecutable = new File("defExecutable"); + facade.setDefaultMavenExecutable(aDefExecutable); - props.setProperty( "invoker.mavenExecutable", "aPropExecutable" ); - facade.configureInvocation( request, 0 ); - verify( request ).setMavenExecutable( new File( "aPropExecutable" ) ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + props.setProperty("invoker.mavenExecutable", "aPropExecutable"); + facade.configureInvocation(request, 0); + verify(request).setMavenExecutable(new File("aPropExecutable")); + verifyNoMoreInteractions(request); + clearInvocations(request); props.clear(); - facade.configureInvocation( request, 0 ); - verify( request ).setMavenExecutable( aDefExecutable ); - verifyNoMoreInteractions( request ); + facade.configureInvocation(request, 0); + verify(request).setMavenExecutable(aDefExecutable); + verifyNoMoreInteractions(request); } @Test - public void testConfigureRequestMavenOpts() - { + public void testConfigureRequestMavenOpts() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - facade.setDefaultMavenOpts( "-XxxDef" ); + InvokerProperties facade = new InvokerProperties(props); + facade.setDefaultMavenOpts("-XxxDef"); - props.setProperty( "invoker.mavenOpts", "-Xmx512m" ); - facade.configureInvocation( request, 0 ); - verify( request ).setMavenOpts( "-Xmx512m" ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + props.setProperty("invoker.mavenOpts", "-Xmx512m"); + facade.configureInvocation(request, 0); + verify(request).setMavenOpts("-Xmx512m"); + verifyNoMoreInteractions(request); + clearInvocations(request); props.clear(); - facade.configureInvocation( request, 0 ); - verify( request ).setMavenOpts( "-XxxDef" ); - verifyNoMoreInteractions( request ); + facade.configureInvocation(request, 0); + verify(request).setMavenOpts("-XxxDef"); + verifyNoMoreInteractions(request); } @Test - public void testConfigureRequestFailureBehavior() - { + public void testConfigureRequestFailureBehavior() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - props.setProperty( "invoker.failureBehavior", ReactorFailureBehavior.FailNever.getLongOption() ); - facade.configureInvocation( request, 0 ); - verify( request ).setReactorFailureBehavior( eq( ReactorFailureBehavior.FailNever ) ); + props.setProperty("invoker.failureBehavior", ReactorFailureBehavior.FailNever.getLongOption()); + facade.configureInvocation(request, 0); + verify(request).setReactorFailureBehavior(eq(ReactorFailureBehavior.FailNever)); - verifyNoMoreInteractions( request ); + verifyNoMoreInteractions(request); } @Test - public void testConfigureRequestFailureBehaviorUnKnownName() - { + public void testConfigureRequestFailureBehaviorUnKnownName() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - props.setProperty( "invoker.failureBehavior", "xxxUnKnown" ); + props.setProperty("invoker.failureBehavior", "xxxUnKnown"); - assertThatCode( () -> facade.configureInvocation( request, 0 ) ) - .isExactlyInstanceOf( IllegalArgumentException.class ) - .hasMessage( "The string 'xxxUnKnown' can not be converted to enumeration." ); + assertThatCode(() -> facade.configureInvocation(request, 0)) + .isExactlyInstanceOf(IllegalArgumentException.class) + .hasMessage("The string 'xxxUnKnown' can not be converted to enumeration."); - verifyNoInteractions( request ); + verifyNoInteractions(request); } - @Test - public void testConfigureRequestRecursion() - { + public void testConfigureRequestRecursion() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - - props.setProperty( "invoker.nonRecursive", "true" ); - facade.configureInvocation( request, 0 ); - verify( request ).setRecursive( false ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.nonRecursive", "false" ); - facade.configureInvocation( request, 0 ); - verify( request ).setRecursive( true ); - verifyNoMoreInteractions( request ); + InvokerProperties facade = new InvokerProperties(props); + + props.setProperty("invoker.nonRecursive", "true"); + facade.configureInvocation(request, 0); + verify(request).setRecursive(false); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.nonRecursive", "false"); + facade.configureInvocation(request, 0); + verify(request).setRecursive(true); + verifyNoMoreInteractions(request); } @Test - public void testConfigureRequestOffline() - { + public void testConfigureRequestOffline() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - - props.setProperty( "invoker.offline", "true" ); - facade.configureInvocation( request, 0 ); - verify( request ).setOffline( true ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - props.setProperty( "invoker.offline", "false" ); - facade.configureInvocation( request, 0 ); - verify( request ).setOffline( false ); - verifyNoMoreInteractions( request ); + InvokerProperties facade = new InvokerProperties(props); + + props.setProperty("invoker.offline", "true"); + facade.configureInvocation(request, 0); + verify(request).setOffline(true); + verifyNoMoreInteractions(request); + clearInvocations(request); + + props.setProperty("invoker.offline", "false"); + facade.configureInvocation(request, 0); + verify(request).setOffline(false); + verifyNoMoreInteractions(request); } @Test - public void testConfigureRequestDebug() - { + public void testConfigureRequestDebug() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - props.setProperty( "invoker.debug", "true" ); - facade.configureInvocation( request, 0 ); - verify( request ).setDebug( true ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + props.setProperty("invoker.debug", "true"); + facade.configureInvocation(request, 0); + verify(request).setDebug(true); + verifyNoMoreInteractions(request); + clearInvocations(request); - props.setProperty( "invoker.debug", "false" ); - facade.configureInvocation( request, 0 ); - verify( request ).setDebug( false ); - verifyNoMoreInteractions( request ); + props.setProperty("invoker.debug", "false"); + facade.configureInvocation(request, 0); + verify(request).setDebug(false); + verifyNoMoreInteractions(request); props.clear(); - facade.setDefaultDebug( true ); - facade.configureInvocation( request, 0 ); - verify( request ).setDebug( true ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - facade.setDefaultDebug( false ); - facade.configureInvocation( request, 0 ); - verify( request ).setDebug( false ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + facade.setDefaultDebug(true); + facade.configureInvocation(request, 0); + verify(request).setDebug(true); + verifyNoMoreInteractions(request); + clearInvocations(request); + + facade.setDefaultDebug(false); + facade.configureInvocation(request, 0); + verify(request).setDebug(false); + verifyNoMoreInteractions(request); + clearInvocations(request); } @Test - public void testConfigureRequestQuiet() - { + public void testConfigureRequestQuiet() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - props.setProperty( "invoker.quiet", "true" ); - facade.configureInvocation( request, 0 ); - verify( request ).setQuiet( true ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + props.setProperty("invoker.quiet", "true"); + facade.configureInvocation(request, 0); + verify(request).setQuiet(true); + verifyNoMoreInteractions(request); + clearInvocations(request); - props.setProperty( "invoker.quiet", "false" ); - facade.configureInvocation( request, 0 ); - verify( request ).setQuiet( false ); - verifyNoMoreInteractions( request ); + props.setProperty("invoker.quiet", "false"); + facade.configureInvocation(request, 0); + verify(request).setQuiet(false); + verifyNoMoreInteractions(request); props.clear(); - facade.setDefaultQuiet( true ); - facade.configureInvocation( request, 0 ); - verify( request ).setQuiet( true ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); - - facade.setDefaultQuiet( false ); - facade.configureInvocation( request, 0 ); - verify( request ).setQuiet( false ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + facade.setDefaultQuiet(true); + facade.configureInvocation(request, 0); + verify(request).setQuiet(true); + verifyNoMoreInteractions(request); + clearInvocations(request); + + facade.setDefaultQuiet(false); + facade.configureInvocation(request, 0); + verify(request).setQuiet(false); + verifyNoMoreInteractions(request); + clearInvocations(request); } @Test - public void testConfigureRequestTimeoutInSeconds() - { + public void testConfigureRequestTimeoutInSeconds() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - props.setProperty( "invoker.timeoutInSeconds", "5" ); - facade.configureInvocation( request, 0 ); - verify( request ).setTimeoutInSeconds( 5 ); - verifyNoMoreInteractions( request ); - clearInvocations( request ); + props.setProperty("invoker.timeoutInSeconds", "5"); + facade.configureInvocation(request, 0); + verify(request).setTimeoutInSeconds(5); + verifyNoMoreInteractions(request); + clearInvocations(request); props.clear(); - facade.setDefaultTimeoutInSeconds( 3 ); - facade.configureInvocation( request, 0 ); - verify( request ).setTimeoutInSeconds( 3 ); - verifyNoMoreInteractions( request ); - + facade.setDefaultTimeoutInSeconds(3); + facade.configureInvocation(request, 0); + verify(request).setTimeoutInSeconds(3); + verifyNoMoreInteractions(request); } @Test - public void testConfigureEnvironmentVariables() - { + public void testConfigureEnvironmentVariables() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - - props.setProperty( "invoker.abcdef", "abcdf" ); - props.setProperty( "invoker.environmentVariables.KEY1.1", "value1.1" ); - props.setProperty( "invoker.environmentVariables.KEY1", "value1" ); - props.setProperty( "invoker.environmentVariables.KEY2", "value2" ); - props.setProperty( "invoker.environmentVariables.KEY2.1", "value2.1" ); - props.setProperty( "invoker.environmentVariables.KEY3", "value3" ); - facade.configureInvocation( request, 0 ); - verify( request ).addShellEnvironment( "KEY1", "value1" ); - verify( request ).addShellEnvironment( "KEY2", "value2" ); - verify( request ).addShellEnvironment( "KEY3", "value3" ); - verifyNoMoreInteractions( request ); + InvokerProperties facade = new InvokerProperties(props); + + props.setProperty("invoker.abcdef", "abcdf"); + props.setProperty("invoker.environmentVariables.KEY1.1", "value1.1"); + props.setProperty("invoker.environmentVariables.KEY1", "value1"); + props.setProperty("invoker.environmentVariables.KEY2", "value2"); + props.setProperty("invoker.environmentVariables.KEY2.1", "value2.1"); + props.setProperty("invoker.environmentVariables.KEY3", "value3"); + facade.configureInvocation(request, 0); + verify(request).addShellEnvironment("KEY1", "value1"); + verify(request).addShellEnvironment("KEY2", "value2"); + verify(request).addShellEnvironment("KEY3", "value3"); + verifyNoMoreInteractions(request); } @Test - public void testConfigureEnvironmentVariablesWithIndex() - { + public void testConfigureEnvironmentVariablesWithIndex() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - - props.setProperty( "invoker.abcdef", "abcdf" ); - props.setProperty( "invoker.environmentVariables.KEY1.1", "value1.1" ); - props.setProperty( "invoker.environmentVariables.KEY1", "value1" ); - props.setProperty( "invoker.environmentVariables.KEY2", "value2" ); - props.setProperty( "invoker.environmentVariables.KEY2.1", "value2.1" ); - props.setProperty( "invoker.environmentVariables.KEY3", "value3" ); - facade.configureInvocation( request, 1 ); - verify( request ).addShellEnvironment( "KEY1", "value1.1" ); - verify( request ).addShellEnvironment( "KEY2", "value2.1" ); - verify( request ).addShellEnvironment( "KEY3", "value3" ); - verifyNoMoreInteractions( request ); + InvokerProperties facade = new InvokerProperties(props); + + props.setProperty("invoker.abcdef", "abcdf"); + props.setProperty("invoker.environmentVariables.KEY1.1", "value1.1"); + props.setProperty("invoker.environmentVariables.KEY1", "value1"); + props.setProperty("invoker.environmentVariables.KEY2", "value2"); + props.setProperty("invoker.environmentVariables.KEY2.1", "value2.1"); + props.setProperty("invoker.environmentVariables.KEY3", "value3"); + facade.configureInvocation(request, 1); + verify(request).addShellEnvironment("KEY1", "value1.1"); + verify(request).addShellEnvironment("KEY2", "value2.1"); + verify(request).addShellEnvironment("KEY3", "value3"); + verifyNoMoreInteractions(request); } @Test - public void testConfigureUpdateSnapshots() - { + public void testConfigureUpdateSnapshots() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - props.setProperty( "invoker.updateSnapshots", "true" ); - facade.configureInvocation( request, 1 ); - verify( request ).setUpdateSnapshots( true ); - clearInvocations( request ); + props.setProperty("invoker.updateSnapshots", "true"); + facade.configureInvocation(request, 1); + verify(request).setUpdateSnapshots(true); + clearInvocations(request); props.clear(); - props.setProperty( "invoker.updateSnapshots", "false" ); - facade.configureInvocation( request , 1 ); - verify( request ).setUpdateSnapshots( false ); + props.setProperty("invoker.updateSnapshots", "false"); + facade.configureInvocation(request, 1); + verify(request).setUpdateSnapshots(false); - verifyNoMoreInteractions( request ); + verifyNoMoreInteractions(request); } @Test - public void testConfigureUpdateSnapshotsDefault() - { + public void testConfigureUpdateSnapshotsDefault() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - facade.setDefaultUpdateSnapshots( true ); - facade.configureInvocation( request, 1 ); - verify( request ).setUpdateSnapshots( true ); - clearInvocations( request ); + facade.setDefaultUpdateSnapshots(true); + facade.configureInvocation(request, 1); + verify(request).setUpdateSnapshots(true); + clearInvocations(request); - facade.setDefaultUpdateSnapshots( false ); - facade.configureInvocation( request, 1 ); - verify( request ).setUpdateSnapshots( false ); + facade.setDefaultUpdateSnapshots(false); + facade.configureInvocation(request, 1); + verify(request).setUpdateSnapshots(false); - verifyNoMoreInteractions( request ); + verifyNoMoreInteractions(request); } @Test - public void testIsInvocationDefined() - { + public void testIsInvocationDefined() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); - assertThat( facade.isInvocationDefined( 1 ) ).isFalse(); + assertThat(facade.isInvocationDefined(1)).isFalse(); - props.setProperty( "invoker.goals", "install" ); - assertThat( facade.isInvocationDefined( 1 ) ).isFalse(); + props.setProperty("invoker.goals", "install"); + assertThat(facade.isInvocationDefined(1)).isFalse(); - props.setProperty( "invoker.goals.2", "install" ); - assertThat( facade.isInvocationDefined( 1 ) ).isFalse(); - assertThat( facade.isInvocationDefined( 2 ) ).isTrue(); - assertThat( facade.isInvocationDefined( 3 ) ).isFalse(); + props.setProperty("invoker.goals.2", "install"); + assertThat(facade.isInvocationDefined(1)).isFalse(); + assertThat(facade.isInvocationDefined(2)).isTrue(); + assertThat(facade.isInvocationDefined(3)).isFalse(); - props.setProperty( "invoker.goals.3", "install" ); - assertThat( facade.isInvocationDefined( 1 ) ).isFalse(); - assertThat( facade.isInvocationDefined( 2 ) ).isTrue(); - assertThat( facade.isInvocationDefined( 3 ) ).isTrue(); - assertThat( facade.isInvocationDefined( 4 ) ).isFalse(); + props.setProperty("invoker.goals.3", "install"); + assertThat(facade.isInvocationDefined(1)).isFalse(); + assertThat(facade.isInvocationDefined(2)).isTrue(); + assertThat(facade.isInvocationDefined(3)).isTrue(); + assertThat(facade.isInvocationDefined(4)).isFalse(); } @Test - public void testIsSelectedDefined() - { + public void testIsSelectedDefined() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); - - assertThat( facade.isSelectorDefined( 1 ) ).isFalse(); - - props.setProperty( "invoker.java.version", "1.6+" ); - props.setProperty( "invoker.maven.version", "3.0+" ); - props.setProperty( "invoker.os.family", "windows" ); - assertThat( facade.isSelectorDefined( 1 ) ).isFalse(); - - props.setProperty( "selector.2.java.version", "1.6+" ); - props.setProperty( "selector.3.maven.version", "3.0+" ); - props.setProperty( "selector.4.os.family", "windows" ); - assertThat( facade.isSelectorDefined( 1 ) ).isFalse(); - assertThat( facade.isSelectorDefined( 2 ) ).isTrue(); - assertThat( facade.isSelectorDefined( 3 ) ).isTrue(); - assertThat( facade.isSelectorDefined( 4 ) ).isTrue(); - assertThat( facade.isSelectorDefined( 5 ) ).isFalse(); + InvokerProperties facade = new InvokerProperties(props); + + assertThat(facade.isSelectorDefined(1)).isFalse(); + + props.setProperty("invoker.java.version", "1.6+"); + props.setProperty("invoker.maven.version", "3.0+"); + props.setProperty("invoker.os.family", "windows"); + assertThat(facade.isSelectorDefined(1)).isFalse(); + + props.setProperty("selector.2.java.version", "1.6+"); + props.setProperty("selector.3.maven.version", "3.0+"); + props.setProperty("selector.4.os.family", "windows"); + assertThat(facade.isSelectorDefined(1)).isFalse(); + assertThat(facade.isSelectorDefined(2)).isTrue(); + assertThat(facade.isSelectorDefined(3)).isTrue(); + assertThat(facade.isSelectorDefined(4)).isTrue(); + assertThat(facade.isSelectorDefined(5)).isFalse(); } @Test - public void testGetToolchainsForEmptyProperties() - { + public void testGetToolchainsForEmptyProperties() { Properties props = new Properties(); - InvokerProperties facade = new InvokerProperties( props ); + InvokerProperties facade = new InvokerProperties(props); Collection toolchains = facade.getToolchains(); - assertThat( toolchains ).isEmpty(); + assertThat(toolchains).isEmpty(); - toolchains = facade.getToolchains( 1 ); - assertThat( toolchains ).isEmpty(); + toolchains = facade.getToolchains(1); + assertThat(toolchains).isEmpty(); } @Test - public void testGetToolchains() - { + public void testGetToolchains() { Properties props = new Properties(); - props.put( "invoker.toolchain.jdk.version", "11" ); - InvokerProperties facade = new InvokerProperties( props ); + props.put("invoker.toolchain.jdk.version", "11"); + InvokerProperties facade = new InvokerProperties(props); Collection toolchains = facade.getToolchains(); - assertThat( toolchains ).hasSize( 1 ); + assertThat(toolchains).hasSize(1); InvokerToolchain toolchain = toolchains.iterator().next(); - assertThat( toolchain.getType() ).isEqualTo( "jdk" ); - assertThat( toolchain.getProvides() ).containsExactlyEntriesOf( Collections.singletonMap( "version", "11" ) ); + assertThat(toolchain.getType()).isEqualTo("jdk"); + assertThat(toolchain.getProvides()).containsExactlyEntriesOf(Collections.singletonMap("version", "11")); } @Test - public void testGetToolchainsWithIndex() - { + public void testGetToolchainsWithIndex() { Properties props = new Properties(); - props.put( "selector.1.invoker.toolchain.jdk.version", "11" ); - InvokerProperties facade = new InvokerProperties( props ); + props.put("selector.1.invoker.toolchain.jdk.version", "11"); + InvokerProperties facade = new InvokerProperties(props); - Collection toolchains = facade.getToolchains( 1 ); - assertThat( toolchains ).hasSize( 1 ); + Collection toolchains = facade.getToolchains(1); + assertThat(toolchains).hasSize(1); InvokerToolchain toolchain = toolchains.iterator().next(); - assertThat( toolchain.getType() ).isEqualTo( "jdk" ); - assertThat( toolchain.getProvides() ).containsExactlyEntriesOf( Collections.singletonMap( "version", "11" ) ); + assertThat(toolchain.getType()).isEqualTo("jdk"); + assertThat(toolchain.getProvides()).containsExactlyEntriesOf(Collections.singletonMap("version", "11")); } } diff --git a/src/test/java/org/apache/maven/plugins/invoker/InvokerSessionTest.java b/src/test/java/org/apache/maven/plugins/invoker/InvokerSessionTest.java index 89606700..da04638c 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/InvokerSessionTest.java +++ b/src/test/java/org/apache/maven/plugins/invoker/InvokerSessionTest.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -19,36 +37,33 @@ * under the License. */ -import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - import java.util.Collections; import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugins.invoker.model.BuildJob; import org.junit.Test; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + /** * Unittest for {@link InvokerSession} */ -public class InvokerSessionTest -{ +public class InvokerSessionTest { @Test - public void skipSummary() - { - Log logger = mock( Log.class ); - BuildJob skippedBuildJob = new BuildJob( "minvoker-279" ); - skippedBuildJob.setResult( BuildJob.Result.SKIPPED ); - InvokerSession session = new InvokerSession( Collections.singletonList( skippedBuildJob ) ); - - session.logSummary( logger, false ); - - verify( logger ).warn( "The following builds were skipped:" ); - verify( logger ).warn( "* minvoker-279" ); - verify( logger, never() ).error( anyString() ); - } + public void skipSummary() { + Log logger = mock(Log.class); + BuildJob skippedBuildJob = new BuildJob("minvoker-279"); + skippedBuildJob.setResult(BuildJob.Result.SKIPPED); + InvokerSession session = new InvokerSession(Collections.singletonList(skippedBuildJob)); + + session.logSummary(logger, false); + verify(logger).warn("The following builds were skipped:"); + verify(logger).warn("* minvoker-279"); + verify(logger, never()).error(anyString()); + } } diff --git a/src/test/java/org/apache/maven/plugins/invoker/JobExecutorTest.java b/src/test/java/org/apache/maven/plugins/invoker/JobExecutorTest.java index abcc0284..66aeef63 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/JobExecutorTest.java +++ b/src/test/java/org/apache/maven/plugins/invoker/JobExecutorTest.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -37,121 +55,108 @@ * * @author Slawomir Jaranowski */ -public class JobExecutorTest -{ +public class JobExecutorTest { @Test - public void emptyJobList() - { - JobExecutor jobExecutor = new JobExecutor( Collections.emptyList(), 1 ); + public void emptyJobList() { + JobExecutor jobExecutor = new JobExecutor(Collections.emptyList(), 1); - jobExecutor.forEach( job -> fail( "fail" ) ); + jobExecutor.forEach(job -> fail("fail")); } @Test - public void failedJob() - { - BuildJob job = aJob( "job1", 100 ); + public void failedJob() { + BuildJob job = aJob("job1", 100); - JobExecutor jobExecutor = new JobExecutor( Collections.singletonList( job ), 1 ); + JobExecutor jobExecutor = new JobExecutor(Collections.singletonList(job), 1); - jobExecutor.forEach( j -> fail( "fail " + j.getProject() ) ); + jobExecutor.forEach(j -> fail("fail " + j.getProject())); - assertThat( job.getResult() ).isEqualTo( BuildJob.Result.ERROR ); - assertThat( job.getFailureMessage() ).isEqualTo( "java.lang.AssertionError: fail job1" ); + assertThat(job.getResult()).isEqualTo(BuildJob.Result.ERROR); + assertThat(job.getFailureMessage()).isEqualTo("java.lang.AssertionError: fail job1"); } @Test - public void jobsShouldBeGroupedAndExecutedInProperOrder() - { + public void jobsShouldBeGroupedAndExecutedInProperOrder() { Map jobsCounter = new HashMap<>(); - jobsCounter.put( 100, new AtomicInteger( 3 ) ); - jobsCounter.put( 10, new AtomicInteger( 2 ) ); - jobsCounter.put( 1, new AtomicInteger( 1 ) ); + jobsCounter.put(100, new AtomicInteger(3)); + jobsCounter.put(10, new AtomicInteger(2)); + jobsCounter.put(1, new AtomicInteger(1)); - BuildJob job1 = aJob( "job1-100", 100 ); - BuildJob job2 = aJob( "job2-100", 100 ); - BuildJob job3 = aJob( "job3-100", 100 ); + BuildJob job1 = aJob("job1-100", 100); + BuildJob job2 = aJob("job2-100", 100); + BuildJob job3 = aJob("job3-100", 100); - BuildJob job4 = aJob( "job4-10", 10 ); - BuildJob job5 = aJob( "job5-10", 10 ); + BuildJob job4 = aJob("job4-10", 10); + BuildJob job5 = aJob("job5-10", 10); - BuildJob job6 = aJob( "job6-1", 1 ); + BuildJob job6 = aJob("job6-1", 1); // put jobs in wrong order - List jobs = Arrays.asList( - job4, job5, - job1, job2, - job6, - job3 - ); + List jobs = Arrays.asList(job4, job5, job1, job2, job6, job3); - JobExecutor jobExecutor = new JobExecutor( jobs, 10 ); + JobExecutor jobExecutor = new JobExecutor(jobs, 10); - jobExecutor.forEach( job -> - { - jobsCounter.get( job.getOrdinal() ).decrementAndGet(); + jobExecutor.forEach(job -> { + jobsCounter.get(job.getOrdinal()).decrementAndGet(); - switch ( job.getOrdinal() ) - { + switch (job.getOrdinal()) { case 100: - assertThat( jobsCounter.get( 10 ).get() ) - .as( "Jobs-10 must not be executed before 100" ) - .isEqualTo( 2 ); + assertThat(jobsCounter.get(10).get()) + .as("Jobs-10 must not be executed before 100") + .isEqualTo(2); - assertThat( jobsCounter.get( 1 ).get() ) - .as( "Jobs-1 must not be executed before 100" ) - .isEqualTo( 1 ); + assertThat(jobsCounter.get(1).get()) + .as("Jobs-1 must not be executed before 100") + .isEqualTo(1); break; case 10: - assertThat( jobsCounter.get( 100 ).get() ) - .as( "Jobs-100 must be executed before 10" ) - .isZero(); + assertThat(jobsCounter.get(100).get()) + .as("Jobs-100 must be executed before 10") + .isZero(); - assertThat( jobsCounter.get( 1 ).get() ) - .as( "Jobs-1 must not be executed before 10" ) - .isEqualTo( 1 ); + assertThat(jobsCounter.get(1).get()) + .as("Jobs-1 must not be executed before 10") + .isEqualTo(1); break; case 1: - assertThat( jobsCounter.get( 100 ).get() ) - .as( "Jobs-100 must be executed before 1" ) - .isZero(); + assertThat(jobsCounter.get(100).get()) + .as("Jobs-100 must be executed before 1") + .isZero(); - assertThat( jobsCounter.get( 10 ).get() ) - .as( "Jobs-10 must be executed before 1" ) - .isZero(); + assertThat(jobsCounter.get(10).get()) + .as("Jobs-10 must be executed before 1") + .isZero(); break; default: - fail( "invalid job ordinal value %d", job.getOrdinal() ); + fail("invalid job ordinal value %d", job.getOrdinal()); break; } - job.setResult( BuildJob.Result.SUCCESS ); - job.setDescription( Thread.currentThread().getName() ); - } ); + job.setResult(BuildJob.Result.SUCCESS); + job.setDescription(Thread.currentThread().getName()); + }); // all jobs have success status - assertThat( jobs ).allSatisfy( job -> - { - assertThat( job.getDescription() ).isNotBlank(); - assertThat( job.getResult() ).as( job.getFailureMessage() ).isEqualTo( BuildJob.Result.SUCCESS ); - } ); + assertThat(jobs).allSatisfy(job -> { + assertThat(job.getDescription()).isNotBlank(); + assertThat(job.getResult()).as(job.getFailureMessage()).isEqualTo(BuildJob.Result.SUCCESS); + }); // jobs run on separate thread - assertThat( job1.getDescription() ).isNotEqualTo( job2.getDescription() ); - assertThat( job1.getDescription() ).isNotEqualTo( job3.getDescription() ); - assertThat( job2.getDescription() ).isNotEqualTo( job3.getDescription() ); + assertThat(job1.getDescription()).isNotEqualTo(job2.getDescription()); + assertThat(job1.getDescription()).isNotEqualTo(job3.getDescription()); + assertThat(job2.getDescription()).isNotEqualTo(job3.getDescription()); - assertThat( job4.getDescription() ).isNotEqualTo( job5.getDescription() ); + assertThat(job4.getDescription()).isNotEqualTo(job5.getDescription()); } - private BuildJob aJob( String name, int ordinal ) - { - BuildJob buildJob = new BuildJob( name ); - buildJob.setOrdinal( ordinal ); + private BuildJob aJob(String name, int ordinal) { + BuildJob buildJob = new BuildJob(name); + buildJob.setOrdinal(ordinal); return buildJob; } } diff --git a/src/test/java/org/apache/maven/plugins/invoker/SelectorTest.java b/src/test/java/org/apache/maven/plugins/invoker/SelectorTest.java index 7c927d38..b87e72dc 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/SelectorTest.java +++ b/src/test/java/org/apache/maven/plugins/invoker/SelectorTest.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -19,63 +37,59 @@ * under the License. */ -import static org.junit.Assert.assertEquals; import java.util.Properties; import org.junit.Test; +import static org.junit.Assert.assertEquals; + /** * Test for {@link Selector}. */ -public class SelectorTest -{ +public class SelectorTest { @Test - public void testGlobalMatch() - { - Selector selector = new Selector( "3.2.5", "1.7", null ); + public void testGlobalMatch() { + Selector selector = new Selector("3.2.5", "1.7", null); Properties props = new Properties(); - props.setProperty( "invoker.maven.version", "3.0+" ); - InvokerProperties invokerProperties = new InvokerProperties( props ); - assertEquals( 0, selector.getSelection( invokerProperties ) ); + props.setProperty("invoker.maven.version", "3.0+"); + InvokerProperties invokerProperties = new InvokerProperties(props); + assertEquals(0, selector.getSelection(invokerProperties)); } @Test - public void testSelectorMatch() - { - Selector selector = new Selector( "3.2.5", "1.7", null ); + public void testSelectorMatch() { + Selector selector = new Selector("3.2.5", "1.7", null); Properties props = new Properties(); - props.setProperty( "selector.1.maven.version", "3.0+" ); - InvokerProperties invokerProperties = new InvokerProperties( props ); - assertEquals( 0, selector.getSelection( invokerProperties ) ); + props.setProperty("selector.1.maven.version", "3.0+"); + InvokerProperties invokerProperties = new InvokerProperties(props); + assertEquals(0, selector.getSelection(invokerProperties)); - props.setProperty( "selector.1.maven.version", "3.3.1+" ); - assertEquals( Selector.SELECTOR_MULTI, selector.getSelection( invokerProperties ) ); + props.setProperty("selector.1.maven.version", "3.3.1+"); + assertEquals(Selector.SELECTOR_MULTI, selector.getSelection(invokerProperties)); } @Test - public void testSelectorWithGlobalMatch() - { - Selector selector = new Selector( "3.2.5", "1.7", null ); + public void testSelectorWithGlobalMatch() { + Selector selector = new Selector("3.2.5", "1.7", null); Properties props = new Properties(); // invoker.maven.version is used by all selectors - props.setProperty( "invoker.maven.version", "3.0+" ); - props.setProperty( "selector.1.java.version", "1.4+" ); - props.setProperty( "selector.2.os.family", "myos" ); - InvokerProperties invokerProperties = new InvokerProperties( props ); - assertEquals( 0, selector.getSelection( invokerProperties ) ); + props.setProperty("invoker.maven.version", "3.0+"); + props.setProperty("selector.1.java.version", "1.4+"); + props.setProperty("selector.2.os.family", "myos"); + InvokerProperties invokerProperties = new InvokerProperties(props); + assertEquals(0, selector.getSelection(invokerProperties)); - props.setProperty( "invoker.maven.version", "3.3.1+" ); - assertEquals( Selector.SELECTOR_MULTI, selector.getSelection( invokerProperties ) ); + props.setProperty("invoker.maven.version", "3.3.1+"); + assertEquals(Selector.SELECTOR_MULTI, selector.getSelection(invokerProperties)); - props.setProperty( "invoker.maven.version", "3.0+" ); - props.setProperty( "selector.1.maven.version", "3.3.1+" ); - assertEquals( Selector.SELECTOR_MULTI, selector.getSelection( invokerProperties ) ); + props.setProperty("invoker.maven.version", "3.0+"); + props.setProperty("selector.1.maven.version", "3.3.1+"); + assertEquals(Selector.SELECTOR_MULTI, selector.getSelection(invokerProperties)); - props.setProperty( "selector.2.os.family", "!myos" ); - assertEquals( 0, selector.getSelection( invokerProperties ) ); + props.setProperty("selector.2.os.family", "!myos"); + assertEquals(0, selector.getSelection(invokerProperties)); } - } diff --git a/src/test/java/org/apache/maven/plugins/invoker/SelectorUtilsTest.java b/src/test/java/org/apache/maven/plugins/invoker/SelectorUtilsTest.java index 7b855ebd..0297027c 100644 --- a/src/test/java/org/apache/maven/plugins/invoker/SelectorUtilsTest.java +++ b/src/test/java/org/apache/maven/plugins/invoker/SelectorUtilsTest.java @@ -1,3 +1,21 @@ +/* + * 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. + */ package org.apache.maven.plugins.invoker; /* @@ -45,124 +63,111 @@ * * @author Benjamin Bentmann */ -public class SelectorUtilsTest -{ +public class SelectorUtilsTest { @Test - public void testParseList() - { + public void testParseList() { List includes = new ArrayList<>(); List excludes = new ArrayList<>(); - SelectorUtils.parseList( null, includes, excludes ); + SelectorUtils.parseList(null, includes, excludes); - SelectorUtils.parseList( " 1.5, !1.4, 1.6+ ", includes, excludes ); - assertEquals( Arrays.asList( "1.5", "1.6+" ), includes ); - assertEquals( Collections.singletonList( "1.4" ), excludes ); + SelectorUtils.parseList(" 1.5, !1.4, 1.6+ ", includes, excludes); + assertEquals(Arrays.asList("1.5", "1.6+"), includes); + assertEquals(Collections.singletonList("1.4"), excludes); } @Test - public void testParseVersion() - { - assertEquals( Arrays.asList( 1, 6, 0, 12 ), SelectorUtils.parseVersion( "1.6.0_12" ) ); + public void testParseVersion() { + assertEquals(Arrays.asList(1, 6, 0, 12), SelectorUtils.parseVersion("1.6.0_12")); - assertEquals( Arrays.asList( 1, 6, 0, 12 ), SelectorUtils.parseVersion( "1.6.0_12+" ) ); - assertEquals( Arrays.asList( 1, 6, 0, 12 ), SelectorUtils.parseVersion( "1.6.0_12-" ) ); + assertEquals(Arrays.asList(1, 6, 0, 12), SelectorUtils.parseVersion("1.6.0_12+")); + assertEquals(Arrays.asList(1, 6, 0, 12), SelectorUtils.parseVersion("1.6.0_12-")); } @Test - public void testCompareVersions() - { - assertTrue( SelectorUtils.compareVersions( Arrays.asList( 1, 6 ), Arrays.asList( 1, 6 ) ) == 0 ); + public void testCompareVersions() { + assertTrue(SelectorUtils.compareVersions(Arrays.asList(1, 6), Arrays.asList(1, 6)) == 0); - assertTrue( SelectorUtils.compareVersions( Arrays.asList( 1, 5 ), Arrays.asList( 1, 6 ) ) < 0 ); - assertTrue( SelectorUtils.compareVersions( Arrays.asList( 1, 6 ), Arrays.asList( 1, 5 ) ) > 0 ); + assertTrue(SelectorUtils.compareVersions(Arrays.asList(1, 5), Arrays.asList(1, 6)) < 0); + assertTrue(SelectorUtils.compareVersions(Arrays.asList(1, 6), Arrays.asList(1, 5)) > 0); - assertTrue( SelectorUtils.compareVersions( Collections.singletonList( 1 ), Arrays.asList( 1, 6 ) ) < 0 ); - assertTrue( SelectorUtils.compareVersions( Arrays.asList( 1, 6 ), Collections.singletonList( 1 ) ) > 0 ); + assertTrue(SelectorUtils.compareVersions(Collections.singletonList(1), Arrays.asList(1, 6)) < 0); + assertTrue(SelectorUtils.compareVersions(Arrays.asList(1, 6), Collections.singletonList(1)) > 0); } @Test - public void testIsMatchingJre() - { - - assertFalse( SelectorUtils.isJreVersion( Arrays.asList( 1, 4, 2, 8 ), "1.5" ) ); - assertTrue( SelectorUtils.isJreVersion( Arrays.asList( 1, 5 ), "1.5" ) ); - assertTrue( SelectorUtils.isJreVersion( Arrays.asList( 1, 5, 9 ), "1.5" ) ); - assertFalse( SelectorUtils.isJreVersion( Arrays.asList( 1, 6 ), "1.5" ) ); - - assertFalse( SelectorUtils.isJreVersion( Arrays.asList( 1, 4, 2, 8 ), "1.5+" ) ); - assertTrue( SelectorUtils.isJreVersion( Arrays.asList( 1, 5 ), "1.5+" ) ); - assertTrue( SelectorUtils.isJreVersion( Arrays.asList( 1, 5, 9 ), "1.5+" ) ); - assertTrue( SelectorUtils.isJreVersion( Arrays.asList( 1, 6 ), "1.5+" ) ); - - assertTrue( SelectorUtils.isJreVersion( Arrays.asList( 1, 4, 2, 8 ), "1.5-" ) ); - assertFalse( SelectorUtils.isJreVersion( Arrays.asList( 1, 5 ), "1.5-" ) ); - assertFalse( SelectorUtils.isJreVersion( Arrays.asList( 1, 5, 9 ), "1.5-" ) ); - assertFalse( SelectorUtils.isJreVersion( Arrays.asList( 1, 6 ), "1.5-" ) ); - - assertTrue( SelectorUtils.isJreVersion( (String) null, "1.5" ) ); - assertTrue( SelectorUtils.isJreVersion( "", "1.5" ) ); + public void testIsMatchingJre() { + + assertFalse(SelectorUtils.isJreVersion(Arrays.asList(1, 4, 2, 8), "1.5")); + assertTrue(SelectorUtils.isJreVersion(Arrays.asList(1, 5), "1.5")); + assertTrue(SelectorUtils.isJreVersion(Arrays.asList(1, 5, 9), "1.5")); + assertFalse(SelectorUtils.isJreVersion(Arrays.asList(1, 6), "1.5")); + + assertFalse(SelectorUtils.isJreVersion(Arrays.asList(1, 4, 2, 8), "1.5+")); + assertTrue(SelectorUtils.isJreVersion(Arrays.asList(1, 5), "1.5+")); + assertTrue(SelectorUtils.isJreVersion(Arrays.asList(1, 5, 9), "1.5+")); + assertTrue(SelectorUtils.isJreVersion(Arrays.asList(1, 6), "1.5+")); + + assertTrue(SelectorUtils.isJreVersion(Arrays.asList(1, 4, 2, 8), "1.5-")); + assertFalse(SelectorUtils.isJreVersion(Arrays.asList(1, 5), "1.5-")); + assertFalse(SelectorUtils.isJreVersion(Arrays.asList(1, 5, 9), "1.5-")); + assertFalse(SelectorUtils.isJreVersion(Arrays.asList(1, 6), "1.5-")); + + assertTrue(SelectorUtils.isJreVersion((String) null, "1.5")); + assertTrue(SelectorUtils.isJreVersion("", "1.5")); } @Test - public void testIsMatchingToolchain() throws Exception - { - InvokerToolchain openJdk9 = new InvokerToolchain( "jdk" ); - openJdk9.addProvides( "version", "9" ); - openJdk9.addProvides( "vendor", "openJDK" ); - - InvokerToolchain maven360 = new InvokerToolchain( "maven" ); - openJdk9.addProvides( "version", "3.6.0" ); - - ToolchainPrivateManager toolchainPrivateManager = mock( ToolchainPrivateManager.class ); - ToolchainPrivate jdkMatching = mock( ToolchainPrivate.class ); - when( jdkMatching.matchesRequirements( isA( Map.class ) ) ).thenReturn( true ); - when( jdkMatching.getType() ).thenReturn( "jdk" ); - - ToolchainPrivate jdkMismatch = mock( ToolchainPrivate.class ); - when( jdkMismatch.getType() ).thenReturn( "jdk" ); - - when( toolchainPrivateManager.getToolchainPrivates( "jdk" ) ) - .thenReturn( new ToolchainPrivate[] {jdkMatching} ); - assertTrue( SelectorUtils.isToolchain( toolchainPrivateManager, Collections.singleton( openJdk9 ) ) ); - - when( toolchainPrivateManager.getToolchainPrivates( "jdk" ) ) - .thenReturn( new ToolchainPrivate[] {jdkMismatch} ); - assertFalse( SelectorUtils.isToolchain( toolchainPrivateManager, Collections.singleton( openJdk9 ) ) ); - - when( toolchainPrivateManager.getToolchainPrivates( "jdk" ) ) - .thenReturn( new ToolchainPrivate[] {jdkMatching, jdkMismatch, jdkMatching} ); - assertTrue( SelectorUtils.isToolchain( toolchainPrivateManager, Collections.singleton( openJdk9 ) ) ); - - when( toolchainPrivateManager.getToolchainPrivates( "jdk" ) ) - .thenReturn( new ToolchainPrivate[0] ); - assertFalse( SelectorUtils.isToolchain( toolchainPrivateManager, Collections.singleton( openJdk9 ) ) ); - - when( toolchainPrivateManager.getToolchainPrivates( "jdk" ) ) - .thenReturn( new ToolchainPrivate[] {jdkMatching} ); - when( toolchainPrivateManager.getToolchainPrivates( "maven" ) ) - .thenReturn( new ToolchainPrivate[0] ); - assertFalse( SelectorUtils.isToolchain( toolchainPrivateManager, Arrays.asList( openJdk9, maven360 ) ) ); + public void testIsMatchingToolchain() throws Exception { + InvokerToolchain openJdk9 = new InvokerToolchain("jdk"); + openJdk9.addProvides("version", "9"); + openJdk9.addProvides("vendor", "openJDK"); + + InvokerToolchain maven360 = new InvokerToolchain("maven"); + openJdk9.addProvides("version", "3.6.0"); + + ToolchainPrivateManager toolchainPrivateManager = mock(ToolchainPrivateManager.class); + ToolchainPrivate jdkMatching = mock(ToolchainPrivate.class); + when(jdkMatching.matchesRequirements(isA(Map.class))).thenReturn(true); + when(jdkMatching.getType()).thenReturn("jdk"); + + ToolchainPrivate jdkMismatch = mock(ToolchainPrivate.class); + when(jdkMismatch.getType()).thenReturn("jdk"); + + when(toolchainPrivateManager.getToolchainPrivates("jdk")).thenReturn(new ToolchainPrivate[] {jdkMatching}); + assertTrue(SelectorUtils.isToolchain(toolchainPrivateManager, Collections.singleton(openJdk9))); + + when(toolchainPrivateManager.getToolchainPrivates("jdk")).thenReturn(new ToolchainPrivate[] {jdkMismatch}); + assertFalse(SelectorUtils.isToolchain(toolchainPrivateManager, Collections.singleton(openJdk9))); + + when(toolchainPrivateManager.getToolchainPrivates("jdk")) + .thenReturn(new ToolchainPrivate[] {jdkMatching, jdkMismatch, jdkMatching}); + assertTrue(SelectorUtils.isToolchain(toolchainPrivateManager, Collections.singleton(openJdk9))); + + when(toolchainPrivateManager.getToolchainPrivates("jdk")).thenReturn(new ToolchainPrivate[0]); + assertFalse(SelectorUtils.isToolchain(toolchainPrivateManager, Collections.singleton(openJdk9))); + + when(toolchainPrivateManager.getToolchainPrivates("jdk")).thenReturn(new ToolchainPrivate[] {jdkMatching}); + when(toolchainPrivateManager.getToolchainPrivates("maven")).thenReturn(new ToolchainPrivate[0]); + assertFalse(SelectorUtils.isToolchain(toolchainPrivateManager, Arrays.asList(openJdk9, maven360))); } @Test - public void mavenVersionForNotExistingMavenHomeThrowException() - { - File mavenHome = new File( "not-existing-path" ); + public void mavenVersionForNotExistingMavenHomeThrowException() { + File mavenHome = new File("not-existing-path"); - assertThatCode( () -> SelectorUtils.getMavenVersion( mavenHome ) ) - .isExactlyInstanceOf( IllegalArgumentException.class ) - .hasMessage( "Invalid Maven home installation directory: not-existing-path" ); + assertThatCode(() -> SelectorUtils.getMavenVersion(mavenHome)) + .isExactlyInstanceOf(IllegalArgumentException.class) + .hasMessage("Invalid Maven home installation directory: not-existing-path"); } @Test - public void mavenVersionFromMavenHome() throws IOException - { - File mavenHome = new File( System.getProperty( "maven.home" ) ); + public void mavenVersionFromMavenHome() throws IOException { + File mavenHome = new File(System.getProperty("maven.home")); - String mavenVersion = SelectorUtils.getMavenVersion( mavenHome ); + String mavenVersion = SelectorUtils.getMavenVersion(mavenHome); - assertThat( mavenVersion ).isNotBlank(); + assertThat(mavenVersion).isNotBlank(); } }