<!--
    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>
    <groupId>org.apache.qpid</groupId>
    <artifactId>qpid-client-java14</artifactId>
    <packaging>jar</packaging>
    <version>1.0-incubating-M2-SNAPSHOT</version>
    <name>Qpid Client for Java 1.4</name>
    <url>http://cwiki.apache.org/confluence/display/qpid</url>

    <parent>
        <groupId>org.apache.qpid</groupId>
        <artifactId>qpid</artifactId>
        <version>1.0-incubating-M2-SNAPSHOT</version>
    </parent>

    <properties>
        <topDirectoryLocation>..</topDirectoryLocation>
        <java.source.version>1.4</java.source.version>
        <qpid.version>${pom.version}</qpid.version>
        <qpid.targetDir>${project.build.directory}</qpid.targetDir>
        <qpid.root>${basedir}/..</qpid.root>
        <sasl.properties>${basedir}/etc/sasl.properties</sasl.properties>
        <jvm.1.4.bin>path/to/java1.4</jvm.1.4.bin>
    </properties>

    <dependencies>

        <!-- Use the java 1.4 retrotranslated client. -->
        <dependency>
            <groupId>org.apache.qpid</groupId>
            <artifactId>qpid-client</artifactId>
            <type>jar</type>
            <version>${pom.version}</version>
            <classifier>java14</classifier>
        </dependency>

        <!-- Use the java 1.4 retrotranslated common library. -->
        <dependency>
            <groupId>org.apache.qpid</groupId>
            <artifactId>qpid-common</artifactId>
            <type>jar</type>
            <version>${pom.version}</version>
            <classifier>java14</classifier>
        </dependency>

        <dependency>
            <groupId>net.sf.retrotranslator</groupId>
            <artifactId>retrotranslator-runtime</artifactId>
            <scope>package</scope>
        </dependency>

        <!-- Test dependencies. -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <!-- Sets up the compiler plugin to compile on 1.4 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.source.version}</source>
                    <target>${java.source.version}</target>
                </configuration>
            </plugin>

            <!-- Sets up the assembly plugin to use the assembly directions to build a 1.4 compatable client. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>${assembly.version}</version>
                <goals>
                    <goal>single</goal>
                </goals>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/client-java14-bin.xml</descriptor>
                    </descriptors>
                    <finalName>qpid-${pom.version}</finalName>
                    <outputDirectory>${qpid.targetDir}</outputDirectory>
                    <tarLongFileMode>gnu</tarLongFileMode>
                </configuration>
            </plugin>

            <!-- Sets up surefire to run during the integration-test phase instead of the test phase. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>surefire-it</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <skip>false</skip>
                            <forkMode>once</forkMode>
                            <jvm>${jvm.1.4.bin}</jvm>
                            <systemProperties>
                                <property>
                                    <name>amqj.logging.level</name>
                                    <value>${amqj.logging.level}</value>
                                </property>
                                <property>
                                    <name>log4j.configuration</name>
                                    <value>${log4j.configuration}</value>
                                </property>
                                <property>
                                    <name>amq.dynamicsaslregistrar.properties</name>
                                    <value>${sasl.properties}</value>
                                </property>
                            </systemProperties>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>
</project>
