 ------
 Introduction
 ------
 Dennis Lundberg
 Hervé Boutemy
 ------
 2016-03-27
 ------

 ~~ 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.

 ~~ NOTE: For help with the syntax of this file, see:
 ~~ http://maven.apache.org/doxia/references/apt-format.html


Maven Doxia Integration Tools

  This shared component has some utilities that are useful when integrating Doxia in Maven,
  mainly for site generation and report creation.
  
  The main entry point is the
  {{{./apidocs/org/apache/maven/doxia/tools/SiteTool.html}SiteTool}} Plexus component.

* Usage

  Instructions on how to use the integration of Doxia in Maven can be found {{{./usage.html}here}}.

* <<<site.xml>>> Decoration Model Interpolation

  Interpolation of {{{../doxia-decoration-model/decoration.html}<<<site.xml>>> decoration model}} injects
  Maven project's information, replacing <<<$\{...\}>>> with calculated values
  like it happens in {{{/ref/current/maven-model-builder/#Model_Interpolation}Maven model interpolation}}.

  Interpolation can be <<late>> or <<early>>:

  * with <<late>> interpolation, replacement happens <<after>> inheritance. This is the classical behaviour in Maven pom,

  * with <<early>> interpolation, replacement happens <<before>> inheritance: this was the default behaviour for <<<project.*>>>
  values until Doxia Sitetools 1.7, when these early and late interpolation definitions didn't exist.
  Since Doxia Sitetools 1.7.1, early interpolation happens for <<<this.*>>> values.

  []

  Values are evaluated in sequence from different syntaxes:

*-------------+--------------+--------------------+------------------+
|| late value || early value || evaluation result || common examples ||
*-------------+--------------+--------------------+------------------+
| <<<project.*>>>\
<<<*>>> (<deprecated>) | <<<this.*>>> | POM content (see {{{/ref/current/maven-model/maven.html}POM reference}}) | <<<$\{project.version\}>>>\
              |              |                    | <<<$\{this.url\}>>>
*-------------+--------------+--------------------+------------------+
| <<<*>>> | <<<this.*>>> | model properties, such as project properties set in the pom | <<<$\{any.key\}>>>\
              |              |                    | <<<$\{this.any.key\}>>>
*-------------+--------------+--------------------+------------------+
| <<<env.*>>>\
<<<*>>>       |              | environment variables | <<<$\{env.PATH\}>>>\
*-------------+--------------+--------------------+------------------+
