<?xml version="1.0" encoding="UTF-8"?>
<!--

    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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel</artifactId>
        <version>2.21.2</version>
    </parent>

    <artifactId>camel-buildtools</artifactId>
    <name>Camel :: Buildtools</name>
    <description>The build tools for the Apache Camel project</description>

    <properties>
        <maven.test.skip>true</maven.test.skip>
    </properties>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-remote-resources-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <plugin>
                <!--
                     This updates header-*.txt with the content of
                     header.txt and the appropriate formatting for
                     the specific style.
                     So edit header.txt (if you must) and header-*
                     files in src/main/resources will be updated.
                -->
                <groupId>com.mycila</groupId>
                <artifactId>license-maven-plugin</artifactId>
                <version>${mycila-license-version}</version>
                <executions>
                    <execution>
                        <id>default-cli</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>format</goal>
                        </goals>
                        <configuration>
                            <header>src/main/resources/header.txt</header>
                            <includes>
                                <include>**/header-java.txt</include>
                                <include>**/header-properties.txt</include>
                                <include>**/header-xml.txt</include>
                            </includes>
                            <mapping>
                                <header-java.txt>JAVADOC_STYLE</header-java.txt>
                                <header-properties.txt>CAMEL_PROPERTIES_STYLE</header-properties.txt>
                                <header-xml.txt>XML_STYLE</header-xml.txt>
                            </mapping>
                            <headerDefinitions>
                                <!-- custom style for properties files -->
                                <headerDefinition>src/main/resources/license-properties-headerdefinition.xml</headerDefinition>
                            </headerDefinitions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!--
                     This loads the content of header-*.txt into
                     header-* Maven properties to be included for
                     resource filtering below.
                -->
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>${gmavenplus-plugin-version}</version>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <scripts>
                                <script><![CDATA[
                                    import groovy.xml.XmlUtil
                                    project.properties['header-java'] = XmlUtil.escapeXml(new File(project.basedir, 'src/main/resources/header-java.txt').text.replace('\r', '').replace('\n', '\\n'))
                                    project.properties['header-properties'] = XmlUtil.escapeXml(new File(project.basedir, 'src/main/resources/header-properties.txt').text.replace('\r', '').replace('\n', '\\n'))
                                    project.properties['header-xml'] = XmlUtil.escapeXml(new File(project.basedir, 'src/main/resources/header-xml.txt').text.replace('\r', '').replaceAll('(.*)\n', '^\\\\Q$1\\\\E\\$\\\\n'))
                                    ]]></script>
                            </scripts>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-all</artifactId>
                        <version>${groovy-version}</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <!--
                     This is needed so that the camel-checkstyle.xml is
                     filltered so that the header values are updated
                     with header-* Maven properties.
                     The Maven Checkstyle plugin does not provide a way
                     to reference more than one header file, so we need
                     to put the headers as concrete values in the
                     checkstyle rules.
                -->
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <delimiters>
                        <delimiter>${*}</delimiter>
                    </delimiters>
                    <useDefaultDelimiters>false</useDefaultDelimiters>
                </configuration>
            </plugin>
       </plugins>
    </build>

</project>
