This is an automated email from the ASF dual-hosted git repository.

sjaranowski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-invoker.git


The following commit(s) were added to refs/heads/master by this push:
     new 1841a8e  [MSHARED-1007] Add MavenHome and MavenExecutable options to 
InvocationRequest
1841a8e is described below

commit 1841a8e9e30fd35f8aa079e08a75070cece6c9d1
Author: Slawomir Jaranowski <[email protected]>
AuthorDate: Wed Dec 29 21:23:27 2021 +0100

    [MSHARED-1007] Add MavenHome and MavenExecutable options to 
InvocationRequest
---
 .../shared/invoker/DefaultInvocationRequest.java   |  42 ++++++++
 .../maven/shared/invoker/InvocationRequest.java    |  41 ++++++++
 .../shared/invoker/MavenCommandLineBuilder.java    | 106 ++++++++++-----------
 .../invoker/MavenCommandLineBuilderTest.java       |  75 +++++++++++++--
 4 files changed, 197 insertions(+), 67 deletions(-)

diff --git 
a/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java 
b/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java
index 93be2ba..0f6d516 100644
--- 
a/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java
+++ 
b/src/main/java/org/apache/maven/shared/invoker/DefaultInvocationRequest.java
@@ -107,6 +107,10 @@ public class DefaultInvocationRequest
 
     private boolean quiet;
 
+    private File mavenHome;
+
+    private File mavenExecutable;
+
     /**
      * <p>getBaseDirectory.</p>
      *
@@ -724,4 +728,42 @@ public class DefaultInvocationRequest
         this.quiet = quiet;
         return this;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getMavenHome()
+    {
+        return mavenHome;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public InvocationRequest setMavenHome( File mavenHome )
+    {
+        this.mavenHome = mavenHome;
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getMavenExecutable()
+    {
+        return mavenExecutable;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public InvocationRequest setMavenExecutable( File mavenExecutable )
+    {
+        this.mavenExecutable = mavenExecutable;
+        return this;
+    }
 }
diff --git 
a/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java 
b/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java
index 91c98d3..fd603a2 100644
--- a/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java
+++ b/src/main/java/org/apache/maven/shared/invoker/InvocationRequest.java
@@ -763,4 +763,45 @@ public interface InvocationRequest
      */
     void setTimeoutInSeconds( int timeoutInSeconds );
 
+    /**
+     * Gets the path to the base directory of the Maven installation used to 
invoke Maven.
+     *
+     * @return The path to the base directory of the Maven installation or 
<code>null</code> if using the default
+     *         Maven installation.
+     *
+     * @since 3.1.1
+     */
+    File getMavenHome();
+
+    /**
+     * Sets the path to the base directory of the Maven installation used to 
invoke Maven. This parameter may be left
+     * unspecified to use the default Maven installation which will be 
discovered by evaluating the system property
+     * <code>maven.home</code> and the environment variable 
<code>M2_HOME</code>.
+     *
+     * @param mavenHome The path to the base directory of the Maven 
installation, may be <code>null</code> to use the
+     *            default Maven installation.
+     * @return This invocation request
+     *
+     * @since 3.1.1
+     */
+    InvocationRequest setMavenHome( File mavenHome );
+
+    /**
+     * Get the customized File of the Maven executable.
+     *
+     * @return the custom Maven executable, otherwise {@code null}
+     *
+     * @since 3.1.1
+     */
+    File getMavenExecutable();
+
+    /**
+     * {@code mavenExecutable} can either be a file relative to 
${maven.home}/bin/ or an absolute file.
+     *
+     * @param mavenExecutable the executable
+     * @return This invocation request
+     *
+     * @since 3.1.1
+     */
+    InvocationRequest setMavenExecutable( File mavenExecutable );
 }
diff --git 
a/src/main/java/org/apache/maven/shared/invoker/MavenCommandLineBuilder.java 
b/src/main/java/org/apache/maven/shared/invoker/MavenCommandLineBuilder.java
index 205ed05..5767a4b 100644
--- a/src/main/java/org/apache/maven/shared/invoker/MavenCommandLineBuilder.java
+++ b/src/main/java/org/apache/maven/shared/invoker/MavenCommandLineBuilder.java
@@ -64,26 +64,22 @@ public class MavenCommandLineBuilder
     public Commandline build( InvocationRequest request )
         throws CommandLineConfigurationException
     {
+
+        setupMavenHome( request );
+        checkRequiredState();
+
         try
         {
-            checkRequiredState();
-        }
-        catch ( IOException e )
-        {
-            throw new CommandLineConfigurationException( e.getMessage(), e );
-        }
-        File mvn;
-        try
-        {
-            mvn = findMavenExecutable();
+           setupMavenExecutable( request );
         }
         catch ( IOException e )
         {
             throw new CommandLineConfigurationException( e.getMessage(), e );
         }
+
         Commandline cli = new Commandline();
 
-        cli.setExecutable( mvn.getAbsolutePath() );
+        cli.setExecutable( mavenExecutable.getAbsolutePath() );
 
         // handling for OS-level envars
         setShellEnvironment( request, cli );
@@ -119,28 +115,13 @@ public class MavenCommandLineBuilder
 
     /**
      * <p>checkRequiredState.</p>
-     *
-     * @throws java.io.IOException if any.
      */
     protected void checkRequiredState()
-        throws IOException
     {
         if ( logger == null )
         {
             throw new IllegalStateException( "A logger instance is required." 
);
         }
-
-        if ( ( mavenHome == null ) && ( System.getProperty( "maven.home" ) == 
null ) )
-        // can be restored with 1.5
-        // && ( System.getenv( "M2_HOME" ) != null ) )
-        {
-            if ( !getSystemEnvVars().containsKey( "M2_HOME" ) )
-            {
-                throw new IllegalStateException( "Maven application directory 
was not "
-                    + "specified, and ${maven.home} is not provided in the 
system "
-                    + "properties. Specify at least one of these." );
-            }
-        }
     }
 
     /**
@@ -221,10 +202,8 @@ public class MavenCommandLineBuilder
      *
      * @param request a {@link 
org.apache.maven.shared.invoker.InvocationRequest} object.
      * @param cli a {@link org.apache.maven.shared.utils.cli.Commandline} 
object.
-     * @throws 
org.apache.maven.shared.invoker.CommandLineConfigurationException if any.
      */
     protected void setShellEnvironment( InvocationRequest request, Commandline 
cli )
-        throws CommandLineConfigurationException
     {
         if ( request.isShellEnvironmentInherited() )
         {
@@ -600,46 +579,61 @@ public class MavenCommandLineBuilder
 
     }
 
-    /**
-     * <p>findMavenExecutable.</p>
-     *
-     * @return a {@link java.io.File} object.
-     * @throws 
org.apache.maven.shared.invoker.CommandLineConfigurationException if any.
-     * @throws java.io.IOException if any.
-     */
-    protected File findMavenExecutable()
-        throws CommandLineConfigurationException, IOException
+    void setupMavenHome( InvocationRequest request )
     {
+        if ( request.getMavenHome() != null )
+        {
+            mavenHome = request.getMavenHome();
+        }
+
         if ( mavenHome == null )
         {
             String mavenHomeProperty = System.getProperty( "maven.home" );
+            if ( mavenHomeProperty == null && getSystemEnvVars().getProperty( 
"M2_HOME" ) != null )
+            {
+                mavenHomeProperty = getSystemEnvVars().getProperty( "M2_HOME" 
);
+            }
+
             if ( mavenHomeProperty != null )
             {
                 mavenHome = new File( mavenHomeProperty );
-                if ( !mavenHome.isDirectory() )
-                {
-                    File binDir = mavenHome.getParentFile();
-                    if ( binDir != null && "bin".equals( binDir.getName() ) )
-                    {
-                        // ah, they specified the mvn
-                        // executable instead...
-                        mavenHome = binDir.getParentFile();
-                    }
-                    else
-                    {
-                        throw new IllegalStateException( "${maven.home} is not 
specified as a directory: '"
-                            + mavenHomeProperty + "'." );
-                    }
-                }
             }
+        }
 
-            if ( ( mavenHome == null ) && ( getSystemEnvVars().getProperty( 
"M2_HOME" ) != null ) )
+        if ( mavenHome != null && !mavenHome.isDirectory() )
+        {
+            File binDir = mavenHome.getParentFile();
+            if ( binDir != null && "bin".equals( binDir.getName() ) )
             {
-                mavenHome = new File( getSystemEnvVars().getProperty( 
"M2_HOME" ) );
+                // ah, they specified the mvn
+                // executable instead...
+                mavenHome = binDir.getParentFile();
             }
         }
 
-        logger.debug( "Using ${maven.home} of: '" + mavenHome + "'." );
+        if ( mavenHome != null && !mavenHome.isDirectory() )
+        {
+            throw new IllegalStateException( "maven home is not specified as a 
directory: '" + mavenHome + "'." );
+        }
+
+        logger.debug( "Using maven.home of: '" + mavenHome + "'." );
+    }
+
+
+    /**
+     * <p>setupMavenExecutable.</p>
+     *
+     * @param request a Invoker request
+     * @throws 
org.apache.maven.shared.invoker.CommandLineConfigurationException if any.
+     * @throws java.io.IOException if any.
+     */
+    protected void setupMavenExecutable( InvocationRequest request )
+        throws CommandLineConfigurationException, IOException
+    {
+        if ( request.getMavenExecutable() != null )
+        {
+            mavenExecutable = request.getMavenExecutable();
+        }
 
         if ( mavenExecutable == null || !mavenExecutable.isAbsolute() )
         {
@@ -680,8 +674,6 @@ public class MavenCommandLineBuilder
                 throw new CommandLineConfigurationException( "Maven executable 
not found at: " + mavenExecutable );
             }
         }
-
-        return mavenExecutable;
     }
 
     private Properties getSystemEnvVars()
diff --git 
a/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
 
b/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
index 32fcdc6..f7b2b0c 100644
--- 
a/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
+++ 
b/src/test/java/org/apache/maven/shared/invoker/MavenCommandLineBuilderTest.java
@@ -45,7 +45,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeThat;
+import static org.junit.Assume.assumeTrue;
 
 public class MavenCommandLineBuilderTest
 {
@@ -228,7 +228,7 @@ public class MavenCommandLineBuilderTest
     }
 
     @Test
-    public void testShouldFailIfLoggerSetToNull() throws Exception
+    public void testShouldFailIfLoggerSetToNull()
     {
         mclb.setLogger( null );
 
@@ -259,10 +259,32 @@ public class MavenCommandLineBuilderTest
         }
 
         mclb.setMavenHome( dummyMavenHomeBin.getParentFile() );
+        mclb.setupMavenExecutable( newRequest() );
 
-        File mavenExe = mclb.findMavenExecutable();
+        assertEquals( check.getCanonicalPath(), 
mclb.getMavenExecutable().getCanonicalPath() );
+    }
+
+    @Test
+    public void testShouldFindDummyMavenExecutableWithMavenHomeFromRequest()
+        throws Exception
+    {
+        File dummyMavenHomeBin = temporaryFolder.newFolder( "invoker-tests", 
"dummy-maven-home", "bin" );
+
+        File check;
+        if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
+        {
+            check = createDummyFile( dummyMavenHomeBin, "mvn.bat" );
+        }
+        else
+        {
+            check = createDummyFile( dummyMavenHomeBin, "mvn" );
+        }
 
-        assertEquals( check.getCanonicalPath(), mavenExe.getCanonicalPath() );
+        // default value should be not used
+        mclb.setMavenHome( new File( "not-present-1234" ) );
+        mclb.build( newRequest().setMavenHome( 
dummyMavenHomeBin.getParentFile() ) );
+
+        assertEquals( check.getCanonicalPath(), 
mclb.getMavenExecutable().getCanonicalPath() );
     }
 
     @Test
@@ -869,16 +891,49 @@ public class MavenCommandLineBuilderTest
     }
 
     @Test
-    public void testMvnCommand()
+    public void testMvnExecutableFromInvoker()
         throws Exception
     {
-        assumeThat( "Test only works when called with surefire", 
System.getProperty( "maven.home" ),
-                    is( notNullValue() ) );
+        assumeTrue( "Test only works when maven home can be assigned",
+            System.getProperty( "maven.home" ) != null || System.getenv( 
"M2_HOME" ) != null );
+
         File mavenExecutable = new File( "mvnDebug" );
+
         mclb.setMavenExecutable( mavenExecutable );
-        File executable = mclb.findMavenExecutable();
-        assertTrue( "Expected executable to exist", executable.exists() );
-        assertTrue( "Expected executable to be absolute", 
executable.isAbsolute() );
+        mclb.build( newRequest() );
+
+        assertTrue( "Expected executable to exist", 
mclb.getMavenExecutable().exists() );
+        assertTrue( "Expected executable to be absolute", 
mclb.getMavenExecutable().isAbsolute() );
+        assertTrue( "Expected mvnDebug as command mvnDebug", 
mclb.getMavenExecutable().getName().contains( "mvnDebug" ) );
+    }
+
+    @Test
+    public void testMvnExecutableFormRequest()
+        throws Exception
+    {
+        assumeTrue( "Test only works when maven home can be assigned",
+            System.getProperty( "maven.home" ) != null || System.getenv( 
"M2_HOME" ) != null );
+
+        File mavenExecutable = new File( "mvnDebug" );
+
+        mclb.build( newRequest().setMavenExecutable( mavenExecutable ) );
+
+        assertTrue( "Expected executable to exist", 
mclb.getMavenExecutable().exists() );
+        assertTrue( "Expected executable to be absolute", 
mclb.getMavenExecutable().isAbsolute() );
+        assertTrue( "Expected mvnDebug as command", 
mclb.getMavenExecutable().getName().contains( "mvnDebug" ) );
+    }
+
+    @Test
+    public void testDefaultMavenCommand()
+        throws Exception
+    {
+        assumeTrue( "Test only works when maven home can be assigned",
+            System.getProperty( "maven.home" ) != null || System.getenv( 
"M2_HOME" ) != null );
+
+        mclb.build( newRequest() );
+
+        assertTrue( "Expected executable to exist", 
mclb.getMavenExecutable().exists() );
+        assertTrue( "Expected executable to be absolute", 
mclb.getMavenExecutable().isAbsolute() );
     }
 
     @Test

Reply via email to