 ------
 Introduction
 ------
 Olivier Lamy
 ------
 2013-07-24
 ------

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

${project.name}

  This component has been built from the filtering process/code in Maven Resources Plugin.

  The goal is to provide a shared component for all plugins that needs to filter resources.


* MavenResourcesExecution

** POM Interpolation
  
  POM values will be interpolated <<only>> with expressions starting with <<<pom>>> or <<<project>>> (it's configurable).
  In previous versions something like $\{foo.version\} or $\{version\} was interpolated with the current POM version, but
  it won't be interpolated with a POM value any more.
  
** Escaping Interpolation 

  It's possible now to define a String which will escape interpolation.
  \$\{java.home\} will be interpolated to $\{java.home\}.

** <<<targetPath>>> parameter

  It also accepts absolute paths.

** <<<overwrite>>> parameter

  The parameter <<<overwrite>>> forces file copy even if the destination file is newer.


* MavenResourcesFiltering

  This component will apply filtering on a <<<List>>> of <<<org.apache.maven.model.Resource>>>s.

  If you want to use the default <<<List>>> of <<<FileUtils.FilterWrapper>>> (see below)
  you should use the method without the <<<filterWrappers>>> parameter.

  The component will not filter a predefined set of file extensions (jpg, jpeg, gif, bmp, png).

  <<Note:>> You can easily add extra file extensions.


* MavenFileFilter

  This component has a method which returns the default <<<FileUtils.FilterWrapper>>>s.
  These are:

  * Interpolation with token $\{ \} and values from properties files, <<<\<project\>>>>/<<<\<build\>>>>/<<<\<filters>>>, <<<project.properties>>>
    and <<<mavenSession.executionProperties>>>

  * Interpolation with token @ @ and values from properties files, <<<\<project\>>>>/<<<\<build\>>>>/<<<\<filters>>>, <<<project.properties>>>
    and <<<mavenSession.executionProperties>>>

  * Interpolation with token $\{ \} and values from <<<mavenProject>>> interpolation

  * Interpolation with token @ @ and values from <<<mavenProject>>> interpolation

  []

  The values used for interpolation are stored in a <<<Properties>>> object
  and are loaded in the following order:

  * A <<<List>>> of properties files, provided as a parameter to the method

  * Filters defined in the <<<\<build\>>>>/<<<\<filters\>>>> section of the POM

  * Properties defined in the <<<\<properties\>>>> section of the POM

  * The <<<executionProperties>>> from the current <<<MavenSession>>>

  []

  <<Note:>> As it's a <<<Properties>>> object, the last defined key/value pair wins.

  <<Note:>> When building the <<<Properties>>> object and reading the properties files that defines the different filters,
  interpolation with the token $\{ \} is supported for these filters with limited properties values coming from
  <<<project.properties>>> and <<<mavenSession.executionProperties>>>. The last wins here too.
