[MTOOLCHAIN-6] added documentation on custom toolchain

git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/trunk@1637610 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainFactory.java b/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainFactory.java
index dad67a2..ad896d3 100644
--- a/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainFactory.java
+++ b/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainFactory.java
@@ -63,7 +63,7 @@
             return null;
         }
 
-        DefaultCustomToolchain customToolchain = new DefaultCustomToolchain( model, logger );
+        CustomToolchainImpl customToolchain = new CustomToolchainImpl( model, logger );
 
         // populate the provides section
         Properties provides = getProvidesProperties( model );
@@ -95,11 +95,11 @@
         // populate the configuration section
         Properties configuration = toProperties( (Xpp3Dom) model.getConfiguration() );
 
-        String toolHome = configuration.getProperty( DefaultCustomToolchain.KEY_TOOLHOME );
+        String toolHome = configuration.getProperty( CustomToolchainImpl.KEY_TOOLHOME );
         if ( toolHome == null )
         {
             throw new MisconfiguredToolchainException( "Custom toolchain without the "
-                + DefaultCustomToolchain.KEY_TOOLHOME + " configuration element." );
+                + CustomToolchainImpl.KEY_TOOLHOME + " configuration element." );
         }
 
         toolHome = FileUtils.normalize( toolHome );
diff --git a/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/DefaultCustomToolchain.java b/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainImpl.java
similarity index 95%
rename from src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/DefaultCustomToolchain.java
rename to src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainImpl.java
index 3287de9..990d9b6 100644
--- a/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/DefaultCustomToolchain.java
+++ b/src/it/custom-toolchain-plugin/src/main/java/org/apache/maven/plugins/toolchains/its/custom/CustomToolchainImpl.java
@@ -31,7 +31,7 @@
 /**
  * @author Hervé Boutemy
  */
-public class DefaultCustomToolchain
+public class CustomToolchainImpl
     extends DefaultToolchain
     implements CustomToolchain
 {
@@ -39,7 +39,7 @@
 
     public static final String KEY_TOOLHOME = "toolHome";
 
-    public DefaultCustomToolchain( ToolchainModel model, Logger logger )
+    public CustomToolchainImpl( ToolchainModel model, Logger logger )
     {
         super( model, "custom", logger );
     }
diff --git a/src/site/apt/toolchains/custom.apt b/src/site/apt/toolchains/custom.apt
new file mode 100644
index 0000000..f640094
--- /dev/null
+++ b/src/site/apt/toolchains/custom.apt
@@ -0,0 +1,124 @@
+~~ 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.
+
+  ------
+  Custom Toolchains
+  ------
+  Hervé Boutemy
+  ------
+  2014-11-08
+  ------
+
+Custom Toolchains
+
+  You can create your own custom toolchains with plugins using them.
+
+  A full working sample is included in <<<maven-toolchains-plugin>>> ITs:
+
+  * see <<<src/it/custom-toolchain-plugin>>> for the custom toolchain and plugin,
+
+  * see <<<src/it/use-custom-toolchain>>> for a sample project using the toolchain through its plugin.
+
+  []
+
+  Following instructions are explanations of key points of the sample.
+
+* Creating Custom Toolchain
+
+  A toolchain consists in:
+
+  * an interface extending {{{/ref/current/maven-core/apidocs/org/apache/maven/toolchain/Toolchain.html}<<<org.apache.maven.toolchain.Toolchain>>>}},
+
+  * an implementation of this interface, extending
+  {{{/ref/current/maven-core/apidocs/org/apache/maven/toolchain/DefaultToolchain.html}<<<org.apache.maven.toolchain.DefaultToolchain>>>}}
+  and implementing previous interface,
+
+  * a {{{/ref/current/maven-core/apidocs/org/apache/maven/toolchain/ToolchainFactory.html}<<<org.apache.maven.toolchain.ToolchainFactory>>>}},
+  provided as Plexus component: Plexus {{{http://plexus.codehaus.org/plexus-containers/plexus-component-annotations/}<<<@Component>>>}}
+  annotation in the class is extracted by {{{http://plexus.codehaus.org/plexus-containers/plexus-component-metadata/}<<<plexus-component-metadata>>>}}
+  plugin.
+
+  []
+
+* Creating a Plugin Using a Toolchain
+
+  To get a configured toolchain, a plugin uses
+  {{{/ref/current/maven-core/apidocs/org/apache/maven/toolchain/ToolchainManager.html}<<<ToolchainManager>>>}} API
+  to get epxected toolchain, then tool in the toolchain:
+
++--------+
+    @Component
+    private ToolchainManager toolchainManager;
+
+    @Parameter( defaultValue = "${session}", required = true, readonly = true )
+    private MavenSession session;
+
+    public void execute()
+        throws MojoExecutionException
+    {
+        // get the custom toolchain
+        CustomToolchain toolchain = (CustomToolchain) toolchainManager.getToolchainFromBuildContext( "custom", session );
+
+        if ( toolchain == null )
+        {
+            throw new MojoExecutionException( "Could not find 'custom' toolchain: please check maven-toolchains-plugin configuration." );
+        }
+
+        getLog().info( "Found 'custom' toolchain in build context." );
+
+        // get a tool from the toolchain
+        String path = toolchain.findTool( "tool" );
+
+        getLog().info( "Found expected tool named 'tool' at following location: " + path );
+    }
++--------+
+
+  This code uses {{{/plugin-tools/maven-plugin-plugin/examples/using-annotations.html}Maven Plugin Tool Java 5 Annotations}}.
+
+* Using the Custom Toolchain and its Plugin
+
+  The custom toolchain implementation needs to be shared between the toolchain-aware plugin and <<<maven-toolchains-plugin>>>:
+  this is done using Maven extension:
+
+  * if the toolchain is packaged with the plugin, this is done by declaring the plugin as extension:
+
++--------+
+      <plugin>
+        <groupId>...</groupId>
+        <artifactId>...</artifactId>
+        <version>...</version>
+        <extensions>true</extensions><!-- to share the custom toolchain with maven-toolchains-plugin -->
+      </plugin>
++--------+
+
+  * if the toolchain is packaged separately, to be shared by multiple plugins, it has to be declared as a build extension:
+
++--------+
+<project>
+  <build>
+    <extensions>
+      <extension>
+        <groupId>...</groupId>
+        <artifactId>...</artifactId>
+        <version>...</version>
+      </extension>
+    </extensions>
+  </build>
+</project>
++--------+
+
+  []
diff --git a/src/site/apt/toolchains/index.apt b/src/site/apt/toolchains/index.apt
index aa82d58..721fe94 100644
--- a/src/site/apt/toolchains/index.apt
+++ b/src/site/apt/toolchains/index.apt
@@ -33,4 +33,4 @@
   []
 
   You can also create and use your own custom toolchains by following the
-  {{{http://maven.apache.org/}TBD}} instructions.
+  {{{./custom.html}Custom Toolchains}} instructions.