 ~~ 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.

 ------
 Configuration files 
 ------

Configuration files (faces-config.xml, .tld, facelets taglib)

    All configuration files are generated by 
    {{{make-config-mojo.html}make-config}} goal.
    
    This goal can be seen as an equation:

-------------------------
     xmlBaseFile + templateFile( model(s) to take in consideration ) = xmlFile
-------------------------
    
    It is enought flexible to generate any file based on the model.
    Some examples can be seen below.
    
-------------------------
          ............ plugin declaration goes before ...........
          <!-- faces-config -->
          <execution>
            <id>makefacesconfig</id>
            <configuration>
                <templateFile>faces-config12.vm</templateFile>
                <xmlFile>META-INF/faces-config.xml</xmlFile>
            </configuration>
            <goals>
                <goal>make-config</goal>
            </goals>
          </execution>
          
          <!-- tld -->
          <execution>
            <id>maketomahawktld</id>
            <configuration>
                <xmlFile>META-INF/tomahawk.tld</xmlFile>
                <xmlBaseFile>src/main/conf/META-INF/tomahawk-base.tld</xmlBaseFile>
                <templateFile>tomahawk12.vm</templateFile>
                <params>
                   <shortname>t</shortname>
                   <uri>http://myfaces.apache.org/tomahawk</uri>
                   <displayname>Tomahawk tag library 1.2.</displayname>
                </params>
            </configuration>
            <goals>
                <goal>make-config</goal>
            </goals>
          </execution>
          
          <!-- facelets taglib -->        
          <execution>
            <id>maketomahawktaglib</id>
            <configuration>
                <xmlFile>META-INF/tomahawk.taglib.xml</xmlFile>
                <xmlBaseFile>src/main/conf/META-INF/facelets-taglib-base.xml</xmlBaseFile>
                <templateFile>facelets-taglib.vm</templateFile>
                <params>
                   <shortname>t</shortname>
                   <uri>http://myfaces.apache.org/tomahawk</uri>
                </params>
            </configuration>
            <goals>
                <goal>make-config</goal>
            </goals>
          </execution>
          .................
-------------------------

