<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel</artifactId>
        <version>3.0.0-RC1</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>SLASHSTAR_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-ant</artifactId>
                        <version>${groovy-version}</version>
                        <scope>runtime</scope>
                    </dependency>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-xml</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>
