<?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.
-->
<!--
    Maven release plugin requires the project tag to be on a single line.
-->
<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-parent</artifactId>
        <version>3.1.1-SNAPSHOT</version>
    </parent>

    <artifactId>openjpa-persistence-locking</artifactId>
    <packaging>jar</packaging>
    <name>OpenJPA Persistence Locking Tests</name>
    <description>OpenJPA Persistence Locking Tests</description>

    <properties>
        <!-- have to use a larger waitTimeout to avoid lockmgr test failures -->
        <derby.locks.waitTimeout>60</derby.locks.waitTimeout>
        <derby.locks.deadlockTimeout>5</derby.locks.deadlockTimeout>
        <!-- set this =** on cmdline to skip all tests -->
        <surefire.excludes.locking />
    </properties>

    <profiles>
        <!-- Profile for testing with test-dynamic-enhancer -->
        <profile>
            <id>test-dynamic-enhancer</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <build.enhance>false</build.enhance>
                <openjpa.DynamicEnhancementAgent>true</openjpa.DynamicEnhancementAgent>
                <surefire.jvm.args>-Dopenjpa.RuntimeUnenhancedClasses=unsupported ${test.jvm.arguments}</surefire.jvm.args>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <includes>
                                <include>org/apache/openjpa/persistence/enhance/DynamicEnhancementSuite.java</include>
                            </includes>
                            <excludes>
                                <exclude>${surefire.excludes.locking}</exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>


    </profiles>

    <dependencies>
        <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa-persistence-jdbc</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa-persistence-jdbc</artifactId>
            <version>${project.version}</version>
            <type>test-jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>jakarta-regexp</groupId>
            <artifactId>jakarta-regexp</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- disable creating javadoc for this module -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>

            <!-- Extract the common test support files from o-p-j-tests.jar -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>org.apache.openjpa</groupId>
                                    <artifactId>openjpa-persistence-jdbc</artifactId>
                                    <version>${project.version}</version>
                                    <type>test-jar</type>
                                    <outputDirectory>${project.build.testOutputDirectory}</outputDirectory>
                                    <includes>org/apache/openjpa/persistence/test/*.class</includes>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>process-test-classes</phase>
                        <configuration>
                            <target>
                                <ant antfile="src/test/ant/enhancer.xml" target="enhance" inheritRefs="true">
                                    <property name="maven.test.skip" value="${maven.test.skip}" />
                                    <property name="test" value="${test}" />
                                    <property name="outdir" value="${project.build.outputDirectory}" />
                                    <property name="project.build.testOutputDirectory" value="${project.build.testOutputDirectory}" />
                                    <property name="openjpa.Log" value="${openjpa.Log}" />
                                    <property name="build.enhance" value="${build.enhance}" />
                                </ant>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <argLine>${surefire.jvm.args}</argLine>
                    <excludes>
                        <!--
                            exclude classes that end with 'Test'; these are not test cases per OpenJPA standards
                        -->
                        <exclude>org/apache/openjpa/**/*Test.java</exclude>
                        <exclude>${surefire.excludes.locking}</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
