<?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.
-->
<!--
    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/xsd/maven-4.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-jmx</artifactId>
    <packaging>jar</packaging>
    <name>OpenJPA Integration Tests - JMX Platform MBeans</name>
    <description>OpenJPA Integration Tests - JMX Platform MBeans</description>

  <properties>
    <!-- Enable the JMX platform MBean provider -->
    <test.jvm.jmxprovider>com.sun.management.jmxremote</test.jvm.jmxprovider>
    <!-- Disable JMX platform MBean authentication  -->
    <test.jvm.jmxauth>com.sun.management.jmxremote.authenticate=false</test.jvm.jmxauth>
    <test.jvm.arguments>-Xmx${test.jvm.maxheapsize} -D${test.jvm.jmxprovider} -D${test.jvm.jmxauth}</test.jvm.arguments>
    <surefire.jvm.args>${test.jvm.arguments}</surefire.jvm.args>
    <automatic-module-name>org.apache.openjpa.integration.jmx</automatic-module-name>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.openjpa</groupId>
      <artifactId>openjpa-all</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>org.apache.bval</groupId>
      <artifactId>org.apache.bval.bundle</artifactId>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
    </dependency>
  </dependencies>

    <build>
        <plugins>
            <!-- 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>
                <!-- Use openjpa maven plugin to enhance the domain model classes -->
                <groupId>org.apache.openjpa</groupId>
                <artifactId>openjpa-maven-plugin</artifactId>
                <configuration>
                    <includes>org/apache/openjpa/integration/jmx/*.class</includes>
                    <addDefaultConstructor>true</addDefaultConstructor>
                    <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
                    <!-- persistenceXmlFile>${project.basedir}/src/test/resources/META-INF/persistence.xml</persistenceXmlFile-->
                </configuration>
                <executions>
                    <execution>
                        <id>enhancer</id>
                        <phase>process-test-classes</phase>
                        <goals>
                            <goal>test-enhance</goal>
                       </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.openjpa</groupId>
                        <artifactId>openjpa-all</artifactId>
                        <version>${project.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <!-- The surefire plugin is used to run the jUnit tests -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <argLine>${surefire.jvm.args}</argLine>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
