<?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.
-->

<!--
    This integration build tests the examples that are bundled with
    the OpenJPA distribution.

    The examples will only be run if you have the 'examples-profile' enabled:

        mvn integration-test -Pexamples-profile
-->
<!--
    Please keep the project tag on one line to avoid confusing
    the release plugin.
-->
<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.openjpa</groupId>
        <artifactId>openjpa-integration</artifactId>
        <version>3.2.0-SNAPSHOT</version>
    </parent>

    <artifactId>openjpa-integration-examples</artifactId>
    <packaging>pom</packaging>
    <name>OpenJPA Integration Tests - Examples</name>
    <description>OpenJPA Integration Tests - Examples</description>

    <profiles>
    <profile>
    <id>examples-profile</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>run-examples</id>
                        <phase>integration-test</phase>
                        <configuration>
                        <target>
                            <echo>Running OpenJPA Examples</echo>

                            <property name="examples.base" value="${basedir}/target/examples" />
                            <delete dir="${examples.base}" quiet="true" />
                            <mkdir dir="${examples.base}" />

                            <unzip overwrite="false" dest="${examples.base}" src="${settings.localRepository}/org/apache/openjpa/apache-openjpa/${project.version}/apache-openjpa-${project.version}-binary.zip" />

                            <path id="assembly.classpath">
                                <fileset dir="${examples.base}">
                                    <include name="**/openjpa-all-${project.version}.jar" />
                                </fileset>
                            </path>
                            <available classname="org.apache.openjpa.conf.OpenJPAVersion" classpathref="assembly.classpath" property="unzip.success" />
                            <fail unless="unzip.success">
                                Could not extract assembly.
                            </fail>

                            <!-- FIXME: Only tests simple examples for now -->
                            <subant inheritAll="false" failonerror="true">
                                <fileset dir="${examples.base}" includes="*/examples/simple/*/build.xml" />
                            </subant>
                        </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    </profile>
    </profiles>

    <dependencies>
        <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa-all</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>
