<?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.19</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.gmavenplus</groupId>
                <artifactId>gmavenplus-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>
                            <scripts>
                                <script>
                                    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()
                                </script>
                            </scripts>
                        </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>
