<?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.ws.commons.axiom</groupId>
        <artifactId>systests</artifactId>
        <version>1.2.15</version>
    </parent>

    <artifactId>eclipse-tests</artifactId>
    <packaging>pom</packaging>

    <name>Eclipse Tests</name>
    <description>Contains test cases that verify that the Axiom OSGi bundles are usable out of the box by Eclipse plug-ins.</description>

    <properties>
        <tycho-version>0.18.1</tycho-version>
    </properties>

    <dependencies>
        <!-- We declare dependencies here to guarantee that the build order is correct.
             The dependencies will be inherited by the test project (src/it/project). -->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>axiom-api</artifactId>
            <version>${project.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.geronimo.specs</groupId>
                    <artifactId>geronimo-activation_1.1_spec</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>axiom-impl</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>axiom-dom</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.gmaven</groupId>
                <artifactId>groovy-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- Need this to pass information to the hook scripts. Once maven-invoker-plugin 1.9 is released,
                             we no longer need this; see MINVOKER-119. -->
                        <id>generate-invoker-script-properties</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <inherited>false</inherited>
                        <configuration>
                            <source>
                                import java.io.*
                                import java.util.*
                                
                                dir = new File(project.build.directory, "it")
                                dir.mkdirs()
                                props = new Properties()
                                props.setProperty("version", project.version)
                                stream = new FileOutputStream(new File(dir, "script.properties"))
                                props.store(stream, null)
                                stream.close()
                            </source>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-invoker-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- Instead of executing the Tycho eclipse-test-plugin project directly, we use the invoker plugin.
                             There are multiple reasons for that:
                              * The test project depends on axiom-api, axiom-impl and axiom-dom. If they are executed
                                in the same reactor, then Tycho will fail because axiom-api, axiom-impl and axiom-dom are
                                plain Maven projects. The reason is that the P2 resolver has no way to know the packages
                                exported by these projects.
                              * In a Tycho project, the Bundle-Version in the manifest must match the POM version.
                                On the other hand, maven-release-plugin only updates the POM. That would break
                                the automated release process.
                              * It prevents maven-eclipse-plugin from messing with the test project.
                          -->
                        <id>integration-test</id>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <inherited>false</inherited>
                        <configuration>
                            <streamLogs>true</streamLogs>
                            <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
                            <goals>
                                <goal>integration-test</goal>
                            </goals>
                            <skipInvocation>${skipTests}</skipInvocation>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-jacoco-exec</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>attach-artifact</goal>
                        </goals>
                        <inherited>false</inherited>
                        <configuration>
                            <skipAttach>${skipJacoco}</skipAttach>
                            <artifacts>
                                <artifact>
                                    <file>${project.build.directory}/it/project/target/jacoco.exec</file>
                                    <classifier>jacoco</classifier>
                                    <type>exec</type>
                                </artifact>
                            </artifacts>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.rat</groupId>
                <artifactId>apache-rat-plugin</artifactId>
                <configuration>
                    <excludes>
                        <!-- Don't need license headers for Eclipse project files -->
                        <exclude>src/it/*/.project</exclude>
                        <exclude>src/it/*/.classpath</exclude>
                        <exclude>src/it/*/.settings/**</exclude>
                        <exclude>src/it/*/build.properties</exclude>
                        <!-- Manifests can't contain comments -->
                        <exclude>src/it/*/META-INF/MANIFEST.MF</exclude>
                    </excludes>
                </configuration> 
            </plugin>
        </plugins>
    </build>
</project>
