<!-- Copyright (c) 2015-2016 Apcera Inc. All rights reserved. This program 
    and the accompanying materials are made available under the terms of the 
    MIT License (MIT) which accompanies this distribution, and is available at 
    http://opensource.org/licenses/MIT -->
<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>io.nats</groupId>
        <artifactId>nats-parent</artifactId>
        <version>1.4</version>
    </parent>

    <groupId>io.nats</groupId>
    <artifactId>java-nats-streaming</artifactId>
    <version>0.3.0</version>
    <packaging>bundle</packaging>

    <name>java-nats-streaming</name>
    <description>Java client library for NATS Streaming</description>
    <url>https://github.com/nats-io/java-nats-streaming</url>
    <inceptionYear>2016</inceptionYear>
    <organization>
        <url>http://nats.io</url>
        <name>Apcera, Inc.</name>
    </organization>
    <licenses>
        <license>
            <name>MIT License</name>
            <url>http://www.opensource.org/licenses/mit-license.php</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <scm>
        <url>https://github.com/nats-io/java-nats-streaming</url>
        <connection>scm:git:git://github.com/nats-io/java-nats-streaming.git</connection>
        <developerConnection>scm:git:git@github.com:nats-io/java-nats-streaming.git</developerConnection>
        <tag>0.3.0</tag>
    </scm>
    <issueManagement>
        <url>https://github.com/nats-io/java-nats-streaming/issues/</url>
        <system>GitHub Issues</system>
    </issueManagement>
    <ciManagement>
        <system>Travis</system>
        <url>https://travis-ci.org/nats-io/java-nats-streaming/</url>
    </ciManagement>

    <properties>
        <!-- Used to locate the profile specific configuration file. -->
        <build.profile.id>dev</build.profile.id>
        <jacoco.it.execution.data.file>${project.build.directory}/coverage-reports/jacoco-it.exec</jacoco.it.execution.data.file>
        <jacoco.ut.execution.data.file>${project.build.directory}/coverage-reports/jacoco-ut.exec</jacoco.ut.execution.data.file>
        <!-- Only unit tests are run by default. -->
        <skip.integration.tests>true</skip.integration.tests>
        <skip.unit.tests>false</skip.unit.tests>

        <!-- protobuf paths -->
        <protobuf.input.directory>${project.basedir}/src/main/proto</protobuf.input.directory>
        <protobuf.output.directory>${project.build.directory}/generated-sources</protobuf.output.directory>

        <!-- plugin configuration -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        <!-- project-specific plugin versions -->
        <jnats-version>0.5.3</jnats-version>

        <!-- Used for downloading and installing a server binary for tests -->
        <server.version>0.2.2</server.version>
        <server.exec.name>nats-streaming-server</server.exec.name>
        <server.exec.pkg>${server.exec.name}-${nats.os}-${nats.arch}</server.exec.pkg>
        <server.exec.pkg.url>https://github.com/nats-io/${server.exec.name}/releases/download/v${server.version}/${server.exec.pkg}.zip</server.exec.pkg.url>

    </properties>

    <dependencyManagement />
    <dependencies>
        <!-- COMPILE -->
        <dependency>
            <groupId>io.nats</groupId>
            <artifactId>jnats</artifactId>
            <version>${jnats-version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <!-- TEST -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- This plugin takes care of packaging the artifact as 
                    an OSGi Bundle -->
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
            </plugin>
            <!-- copy protoc binary artifact -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-protoc</id>
                        <!-- have to use initialize phase to ensure ordering -->
                        <phase>initialize</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>com.google.protobuf</groupId>
                                    <artifactId>protoc</artifactId>
                                    <version>${protobuf-java-version}</version>
                                    <classifier>${os.detected.classifier}</classifier>
                                    <type>exe</type>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>${project.build.directory}</outputDirectory>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
            </plugin>
            <!-- compile proto buffer files using copied protoc binary -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>exec-protoc</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <target>
                                <property name="protoc.filename" value="protoc-${protobuf-java-version}-${os.detected.classifier}.exe" />
                                <property name="protoc.filepath" value="${project.build.directory}/${protoc.filename}" />
                                <chmod file="${protoc.filepath}" perm="ugo+rx" />
                                <mkdir dir="${protobuf.output.directory}" />
                                <path id="protobuf.input.filepaths.path">
                                    <fileset dir="${protobuf.input.directory}">
                                        <include name="*.proto" />
                                    </fileset>
                                </path>
                                <pathconvert pathsep=" " property="protobuf.input.filepaths" refid="protobuf.input.filepaths.path" />
                                <exec executable="${protoc.filepath}" failonerror="true">
                                    <arg value="-I" />
                                    <arg value="${protobuf.input.directory}" />
                                    <arg value="--proto_path" />
                                    <arg value="/usr/local/include" />
                                    <arg value="--java_out" />
                                    <arg value="${protobuf.output.directory}" />
                                    <arg line="${protobuf.input.filepaths}" />
                                </exec>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>copy-server</id>
                        <phase>pre-integration-test</phase>
                        <configuration>
                            <target xmlns:unless="ant:unless" xmlns:if="ant:if" name="copy-server-exec" unless:true="${server.installed}">
                                <condition property="server.installed" else="false">
                                    <available file="${server.exec.name}" filepath="${project.build.directory}" type="file" />
                                </condition>
                                <echo if:true="${server.installed}" message="${server.exec.name} is already installed. Skipping download..." />
                                <echo unless:true="${server.installed}" message="Installing ${server.exec.pkg} as ${project.build.directory}/${server.exec.name}..." />
                                <get unless:true="${server.installed}" src="${server.exec.pkg.url}" dest="${project.build.directory}" skipexisting="true" />
                                <unzip unless:true="${server.installed}" src="${project.build.directory}/${server.exec.pkg}.zip" dest="${project.build.directory}" overwrite="false" />
                                <move unless:true="${server.installed}" file="${project.build.directory}/${server.exec.pkg}/${server.exec.name}" tofile="${project.build.directory}/${server.exec.name}" overwrite="false" />
                                <chmod perm="+x" file="${project.build.directory}/${server.exec.name}" />
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- add generated proto buffer classes into the package -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>add-classes</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${protobuf.output.directory}</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <executions>
                    <!-- Prepares the property pointing to the JaCoCo runtime 
                        agent which is passed as VM argument when Maven the Surefire plugin is executed. -->
                    <execution>
                        <id>pre-unit-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <!-- Sets the path to the file which contains 
                                the execution data. -->
                            <destFile>${jacoco.ut.execution.data.file}</destFile>
                            <!-- Sets the name of the property containing 
                                the settings for JaCoCo runtime agent. -->
                            <propertyName>surefireArgLine</propertyName>
                        </configuration>
                    </execution>
                    <!-- Ensures that the code coverage report for unit tests 
                        is created after unit tests have been run. -->
                    <execution>
                        <id>post-unit-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <!-- Sets the path to the file which contains 
                                the execution data. -->
                            <dataFile>${jacoco.ut.execution.data.file}</dataFile>
                            <!-- Sets the output directory for the code coverage 
                                report. -->
                            <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                            <!-- Exclude protobuf-generated sources -->
                            <excludes>
                                <exclude>io/nats/stan/protobuf/*.class</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                    <!-- Prepares the property pointing to the JaCoCo runtime 
                        agent which is passed as VM argument when Maven the Failsafe plugin is executed. -->
                    <execution>
                        <id>pre-integration-test</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <!-- Sets the path to the file which contains 
                                the execution data. -->
                            <destFile>${jacoco.it.execution.data.file}</destFile>
                            <!-- Sets the name of the property containing 
                                the settings for JaCoCo runtime agent. -->
                            <propertyName>failsafeArgLine</propertyName>
                        </configuration>
                    </execution>
                    <!-- Ensures that the code coverage report for integration 
                        tests after integration tests have been run. -->
                    <execution>
                        <id>post-integration-test</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <!-- Sets the path to the file which contains 
                                the execution data. -->
                            <dataFile>${jacoco.it.execution.data.file}</dataFile>
                            <!-- Sets the output directory for the code coverage 
                                report. -->
                            <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
                            <!-- Exclude protobuf-generated sources -->
                            <excludes>
                                <exclude>io/nats/stan/protobuf/*.class</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- Used for unit tests -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <!-- Sets the VM argument line used when unit tests are 
                        run. -->
                    <argLine>${surefireArgLine}</argLine>
                    <!-- Skips unit tests if the value of skip.unit.tests 
                        property is true -->
                    <skipTests>${skip.unit.tests}</skipTests>
                    <!-- Excludes integration tests when unit tests are run. -->
                    <excludes>
                        <exclude>**/IT*.java</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>default-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <skip>${skip.unit.tests}</skip>
                            <groups>io.nats.stan.UnitTest</groups>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- Used for integration tests -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <executions>
                    <!-- Ensures that both integration-test and verify goals 
                        of the Failsafe Maven plugin are executed. -->
                    <execution>
                        <id>integration-tests</id>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                        <configuration>
                            <!-- Sets the VM argument line used when integration 
                                tests are run. -->
                            <argLine>${failsafeArgLine}</argLine>

                            <!-- Skips integration tests if the value of 
                                skip.integration.tests property is true -->
                            <skipTests>${skip.integration.tests}</skipTests>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.eluder.coveralls</groupId>
                <artifactId>coveralls-maven-plugin</artifactId>
                <configuration>
                    <jacocoFile>${jacoco.ut.execution.data.file}</jacocoFile>
                    <jacocoReports>
                        <param>
                            ${project.reporting.outputDirectory}/jacoco-ut/jacoco.xml
                        </param>
                    </jacocoReports>
                    <coverageFile>${jacoco.ut.execution.data.file}</coverageFile>
                    <sourceEncoding>${project.reporting.sourceEncoding}</sourceEncoding>
                </configuration>
                <!-- <executions> <execution> <id>travis-after-success</id> 
                    <goals> <goal>report</goal> </goals> <configuration> <jacocoFile>${jacoco.ut.execution.data.file}</jacocoFile> 
                    <jacocoReports>${jacoco.ut.execution.data.file}</jacocoReports> <coverageFile>${jacoco.ut.execution.data.file}</coverageFile> 
                    <sourceEncoding>${project.reporting.sourceEncoding}</sourceEncoding> </configuration> 
                    </execution> </executions> -->
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <header>java-nats-streaming:${project.version}</header>
                    <footer>java-nats-streaming:${project.version}</footer>
                    <author>false</author>
                    <doctitle>${project.name} (${project.version})</doctitle>
                    <!-- <stylesheetfile>${basedir}/src/main/javadoc/kenai-stylesheet.css</stylesheetfile> 
                        <javadocDirectory>${basedir}/src/main/javadoc</javadocDirectory> -->
                    <docfilessubdirs>true</docfilessubdirs>
                    <additionalJOption>-J-Xmx1024m</additionalJOption>
                    <excludePackageNames>io.nats.stan.protobuf</excludePackageNames>
                </configuration>
                <executions>
                    <execution>
                        <id>attach-javadocs</id>
                        <goals>
                            <goal>jar</goal>
                            <goal>aggregate</goal>
                        </goals>
                        <configuration>
                            <failOnError>true</failOnError>
                            <show>public</show>
                            <nohelp>true</nohelp>
                            <header>java-nats-streaming:${project.version}</header>
                            <footer>java-nats-streaming:${project.version}</footer>
                            <doctitle>java-nats-streaming
                                (${project.version})</doctitle>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArgs>
                        <!-- <arg>-verbose</arg>  -->
                        <arg>-Xlint:all,-options,-path</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>ossrh</id>
            <properties>
                <gpg.executable>gpg2</gpg.executable>
                <gpg.keyname>${env.GPG_KEYNAME}</gpg.keyname>
                <gpg.passphrase>${env.GPG_PASSPHRASE}</gpg.passphrase>
                <gpg.defaultKeyring>false</gpg.defaultKeyring>
                <gpg.publicKeyring>${env.GPG_DIR}/pubring.gpg</gpg.publicKeyring>
                <gpg.secretKeyring>${env.GPG_DIR}/secring.gpg</gpg.secretKeyring>
            </properties>
            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>sign-artifacts</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.sonatype.plugins</groupId>
                        <artifactId>nexus-staging-maven-plugin</artifactId>
                        <extensions>true</extensions>
                        <configuration>
                            <serverId>ossrh</serverId>
                            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                            <autoReleaseAfterClose>true</autoReleaseAfterClose>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>benchTests</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <groups>io.nats.stan.BenchmarkTest</groups>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>all-tests</id>
            <properties>
                <build.profile.id>all-tests</build.profile.id>
                <!-- All tests are run. -->
                <skip.integration.tests>false</skip.integration.tests>
                <skip.unit.tests>false</skip.unit.tests>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
        </profile>
        <profile>
            <id>integration-test</id>
            <properties>
                <!-- Used to locate the profile specific configuration file. -->
                <build.profile.id>integration-test</build.profile.id>
                <!-- Only integration tests are run. -->
                <skip.integration.tests>false</skip.integration.tests>
                <skip.unit.tests>true</skip.unit.tests>
            </properties>
        </profile>
    </profiles>
</project>
