You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2015/01/18 16:54:31 UTC

maven git commit: [MNG-5755] Access toolchains without maven-toolchain-plugin Added List getToolchains( MavenSession session, String type, Map requirements ) to ToolchainManager

Repository: maven
Updated Branches:
  refs/heads/master b6ae8ef8a -> 4b263106d


[MNG-5755] Access toolchains without maven-toolchain-plugin
Added List<Toolchain> getToolchains( MavenSession session, String type, Map<String, String> requirements ) to ToolchainManager


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/4b263106
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/4b263106
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/4b263106

Branch: refs/heads/master
Commit: 4b263106db043f5c1d7c314237ab2bc8708c0538
Parents: b6ae8ef
Author: Robert Scholte <rf...@codehaus.org>
Authored: Sun Jan 18 16:53:56 2015 +0100
Committer: Robert Scholte <rf...@codehaus.org>
Committed: Sun Jan 18 16:53:56 2015 +0100

----------------------------------------------------------------------
 .../toolchain/DefaultToolchainManager.java      |  68 +++++++--
 .../maven/toolchain/ToolchainManager.java       |  15 ++
 .../maven/toolchain/ToolchainPrivate.java       |   6 +-
 .../toolchain/DefaultToolchainManagerTest.java  | 153 +++++++++++++++++++
 4 files changed, 225 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/4b263106/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java b/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java
index 591afd8..b852f1c 100644
--- a/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java
+++ b/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java
@@ -19,7 +19,10 @@ package org.apache.maven.toolchain;
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.maven.execution.MavenSession;
@@ -42,7 +45,8 @@ public class DefaultToolchainManager
 
     @Requirement( role = ToolchainFactory.class )
     Map<String, ToolchainFactory> factories;
-
+    
+    @Override
     public Toolchain getToolchainFromBuildContext( String type, MavenSession session )
     {
         Map<String, Object> context = retrieveContext( session );
@@ -51,28 +55,60 @@ public class DefaultToolchainManager
 
         if ( model != null )
         {
-            try
-            {
-                ToolchainFactory fact = factories.get( type );
-                if ( fact != null )
-                {
-                    return fact.createToolchain( model );
-                }
-                else
-                {
-                    logger.error( "Missing toolchain factory for type: " + type
-                        + ". Possibly caused by misconfigured project." );
-                }
-            }
-            catch ( MisconfiguredToolchainException ex )
+            List<Toolchain> toolchains = selectToolchains( Collections.singletonList( model ), type, null );
+            
+            if ( !toolchains.isEmpty() )
             {
-                logger.error( "Misconfigured toolchain.", ex );
+                return toolchains.get( 0 );
             }
         }
 
         return null;
     }
 
+    @Override
+    public List<Toolchain> getToolchains( MavenSession session, String type, Map<String, String> requirements )
+    {
+        List<ToolchainModel> models = session.getRequest().getToolchains().get( type );
+
+        return selectToolchains( models, type, requirements );
+    }
+
+    private List<Toolchain> selectToolchains( List<ToolchainModel> models, String type, Map<String, String> requirements )
+    {
+        List<Toolchain> toolchains = new ArrayList<Toolchain>();
+
+        if ( models != null )
+        {
+            ToolchainFactory fact = factories.get( type );
+
+            if ( fact == null )
+            {
+                logger.error( "Missing toolchain factory for type: " + type
+                    + ". Possibly caused by misconfigured project." );
+            }
+            else
+            {
+                for ( ToolchainModel model : models )
+                {
+                    try
+                    {
+                        ToolchainPrivate toolchain = fact.createToolchain( model );
+                        if ( requirements == null || toolchain.matchesRequirements( requirements ) )
+                        {
+                            toolchains.add( toolchain );
+                        }
+                    }
+                    catch ( MisconfiguredToolchainException ex )
+                    {
+                        logger.error( "Misconfigured toolchain.", ex );
+                    }
+                }
+            }
+        }
+        return toolchains;
+    }
+    
     Map<String, Object> retrieveContext( MavenSession session )
     {
         Map<String, Object> context = null;

http://git-wip-us.apache.org/repos/asf/maven/blob/4b263106/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainManager.java b/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
index 249a1a5..fc035f4 100644
--- a/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
+++ b/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
@@ -19,6 +19,9 @@ package org.apache.maven.toolchain;
  * under the License.
  */
 
+import java.util.List;
+import java.util.Map;
+
 import org.apache.maven.execution.MavenSession;
 
 
@@ -26,6 +29,7 @@ import org.apache.maven.execution.MavenSession;
  * Public API for a toolchain-aware plugin to get expected toolchain instance.
  *
  * @author mkleint
+ * @author Robert Scholte
  * @since 2.0.9
  */
 public interface ToolchainManager
@@ -39,4 +43,15 @@ public interface ToolchainManager
      * to be used from plugins capable of working with toolchains.
      */
     Toolchain getToolchainFromBuildContext( String type, MavenSession context );
+    
+    /**
+     * Select all toolchains matching the type and requirements
+     * 
+     * @param session the maven session, must not be {@code null}
+     * @param type the type, must not be {@code null}
+     * @param requirements the requirements, may be {@code null}
+     * @return the matching toolchains, never {@code null}
+     * @since 3.2.6
+     */
+    List<Toolchain> getToolchains( MavenSession session, String type, Map<String, String> requirements );
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/4b263106/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java b/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
index b104cd0..756cd95 100644
--- a/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
+++ b/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
@@ -34,11 +34,15 @@ public interface ToolchainPrivate
     /**
      * Let the toolchain decide if it matches requirements defined
      * in the toolchain plugin configuration.
-     * @param requirements Map<String, String> key value pair
+     * @param requirements Map<String, String> key value pair, may not be {@code null}
      * @return {@code true} if the requirements match, otherwise {@code false}
      */
     boolean matchesRequirements( Map<String, String> requirements );
 
+    /**
+     * 
+     * @return the original model wrapped by this interface
+     */
     ToolchainModel getModel();
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/maven/blob/4b263106/maven-core/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java
----------------------------------------------------------------------
diff --git a/maven-core/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java b/maven-core/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java
new file mode 100644
index 0000000..d464502
--- /dev/null
+++ b/maven-core/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java
@@ -0,0 +1,153 @@
+package org.apache.maven.toolchain;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyMap;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.execution.DefaultMavenExecutionRequest;
+import org.apache.maven.execution.MavenExecutionRequest;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.toolchain.model.ToolchainModel;
+import org.codehaus.plexus.logging.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class DefaultToolchainManagerTest
+{
+     // Mocks to inject into toolchainManager
+    @Mock
+    private Logger logger;
+
+    @InjectMocks
+    private DefaultToolchainManager toolchainManager;
+
+    @Mock
+    private ToolchainFactory toolchainFactory_basicType;
+
+    @Mock
+    private ToolchainFactory toolchainFactory_rareType;
+
+    @Before
+    public void onSetup() throws Exception
+    {
+        toolchainManager = new DefaultToolchainManager();
+
+        MockitoAnnotations.initMocks( this );
+
+        toolchainManager.factories = new HashMap<String, ToolchainFactory>();
+        toolchainManager.factories.put( "basic", toolchainFactory_basicType );
+        toolchainManager.factories.put( "rare", toolchainFactory_rareType );
+    }
+
+    @Test
+    public void testNoModels()
+    {
+        MavenSession session = mock( MavenSession.class );
+        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
+        when( session.getRequest() ).thenReturn( executionRequest );
+
+        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "unknown", null );
+
+        assertEquals( 0, toolchains.size() );
+    }
+
+    @Test
+    public void testModelNoFactory()
+    {
+        MavenSession session = mock( MavenSession.class );
+        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
+        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
+        toolchainModels.put( "unknown", Collections.singletonList( new ToolchainModel() ) );
+        executionRequest.setToolchains( toolchainModels );
+        when( session.getRequest() ).thenReturn( executionRequest );
+
+        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "unknown", null );
+
+        assertEquals( 0, toolchains.size() );
+        verify( logger ).error( "Missing toolchain factory for type: unknown. Possibly caused by misconfigured project." );
+    }
+
+    @Test
+    public void testModelAndFactory()
+    {
+        MavenSession session = mock( MavenSession.class );
+        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
+        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
+        toolchainModels.put( "basic", Arrays.asList( new ToolchainModel(), new ToolchainModel() ) );
+        toolchainModels.put( "rare", Collections.singletonList( new ToolchainModel() ) );
+        executionRequest.setToolchains( toolchainModels );
+        when( session.getRequest() ).thenReturn( executionRequest );
+
+        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "rare", null );
+
+        assertEquals( 1, toolchains.size() );
+    }
+
+    @Test
+    public void testModelsAndFactory()
+    {
+        MavenSession session = mock( MavenSession.class );
+        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
+        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
+        toolchainModels.put( "basic", Arrays.asList( new ToolchainModel(), new ToolchainModel() ) );
+        toolchainModels.put( "rare", Collections.singletonList( new ToolchainModel() ) );
+        executionRequest.setToolchains( toolchainModels );
+        when( session.getRequest() ).thenReturn( executionRequest );
+
+        List<Toolchain> toolchains = toolchainManager.getToolchains( session, "basic", null );
+
+        assertEquals( 2, toolchains.size() );
+    }
+
+    @Test
+    public void testRequirements()
+        throws Exception
+    {
+        MavenSession session = mock( MavenSession.class );
+        MavenExecutionRequest executionRequest = new DefaultMavenExecutionRequest();
+        Map<String, List<ToolchainModel>> toolchainModels = new HashMap<String, List<ToolchainModel>>();
+        toolchainModels.put( "basic", Arrays.asList( new ToolchainModel(), new ToolchainModel() ) );
+        toolchainModels.put( "rare", Collections.singletonList( new ToolchainModel() ) );
+        executionRequest.setToolchains( toolchainModels );
+        when( session.getRequest() ).thenReturn( executionRequest );
+        ToolchainPrivate basicPrivate = mock( ToolchainPrivate.class );
+        when( basicPrivate.matchesRequirements( anyMap() ) ).thenReturn( false ).thenReturn( true );
+        when( toolchainFactory_basicType.createToolchain( isA( ToolchainModel.class ) ) ).thenReturn( basicPrivate );
+
+        List<Toolchain> toolchains =
+            toolchainManager.getToolchains( session, "basic", Collections.singletonMap( "key", "value" ) );
+
+        assertEquals( 1, toolchains.size() );
+    }
+}