<?xml version="1.0" encoding="UTF-8"?>
<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>

  <groupId>org.opencypher</groupId>
  <artifactId>okapi</artifactId>
  <version>0.2.3</version>

  <name>Okapi - openCypher query compilation API and pipeline</name>
  <packaging>pom</packaging>

  <description>
    Okapi is a compiler pipeline for Cypher queries, including a consumer API, which translates Cypher query strings
    into a declarative intermediate representation, into a logical execution plan, into a execution plan in relational
    algebra.
  </description>

  <url>https://www.opencypher.org</url>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0</url>
    </license>
  </licenses>

  <scm>
    <url>https://github.com/opencypher/cypher-for-apache-spark</url>
  </scm>

  <developers>
    <developer>
      <id>caps</id>
      <name>The CAPS team</name>
      <email>opencypher@neo4j.com</email>
      <url>https://www.opencypher.org/</url>
    </developer>
  </developers>

  <properties>
    <!-- Encoding -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- Project settings -->
    <project.build.encoding>UTF-8</project.build.encoding>
    <project.java.version>1.8</project.java.version>
    <project.scala.binary.version>2.11</project.scala.binary.version>
    <project.scala.version>${project.scala.binary.version}.12</project.scala.version>
    <project.rootdir>${project.basedir}</project.rootdir>
    <project.artifact.classifier>cluster</project.artifact.classifier>
    <java9.exports></java9.exports>

    <!-- Used plugins -->
    <plugin.exec-maven.version>1.4.0</plugin.exec-maven.version>
    <plugin.license-maven.version>3.0</plugin.license-maven.version>
    <plugin.maven-compiler.version>3.5.1</plugin.maven-compiler.version>
    <plugin.maven-jar.version>3.0.2</plugin.maven-jar.version>
    <plugin.maven-resources.version>2.7</plugin.maven-resources.version>
    <plugin.maven-scala.version>3.2.1</plugin.maven-scala.version>
    <plugin.maven-scalastyle.version>0.8.0</plugin.maven-scalastyle.version>
    <plugin.maven-shade.version>3.1.1</plugin.maven-shade.version>
    <plugin.maven-surefire.version>2.20.1</plugin.maven-surefire.version>

    <!-- Used dependencies -->
    <dep.cats.version>1.0.1</dep.cats.version>
    <dep.eff.version>5.0.0</dep.eff.version>
    <dep.fastparse.version>1.0.0</dep.fastparse.version>
    <dep.hadoop.version>2.7.0</dep.hadoop.version>
    <dep.neo4j.version>3.4.10</dep.neo4j.version>
    <dep.neo4j.driver.version>1.7.2</dep.neo4j.driver.version>
    <dep.opencypher.front-end.version>9.0.20181030</dep.opencypher.front-end.version>
    <dep.spark.version>2.2.2</dep.spark.version>
    <dep.upickle.version>0.6.6</dep.upickle.version>
    <dep.log4j.core.version>2.11.0</dep.log4j.core.version>
    <dep.log4j.scala.api.version>11.0</dep.log4j.scala.api.version>

    <!-- Test scope dependencies -->
    <dep.bouncycastle.version>1.59</dep.bouncycastle.version>
    <dep.h2.version>1.4.196</dep.h2.version>
    <dep.junit.version>4.12</dep.junit.version>
    <dep.junit.platform.version>1.0.2</dep.junit.platform.version>
    <dep.mockito.version>1.10.19</dep.mockito.version>
    <dep.scalatest.version>3.0.5</dep.scalatest.version>
    <dep.scalacheck.version>1.13.5</dep.scalacheck.version>
    <dep.spark-measure.version>0.11</dep.spark-measure.version>

  </properties>

  <modules>
    <module>licensecheck-config</module>
    <module>okapi-api</module>
    <module>okapi-testing</module>
    <module>okapi-neo4j-io</module>
    <module>okapi-neo4j-io-testing</module>
    <module>okapi-ir</module>
    <module>okapi-neo4j-procedures</module>
    <module>okapi-logical</module>
    <module>okapi-relational</module>
    <module>okapi-tck</module>
    <module>okapi-trees</module>
    <module>spark-cypher</module>
    <module>spark-cypher-examples</module>
    <module>spark-cypher-tck</module>
    <module>spark-cypher-testing</module>
    <module>graph-ddl</module>
  </modules>

  <build>
    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>false</filtering>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${basedir}/src/test/resources</directory>
        <filtering>false</filtering>
      </testResource>
    </testResources>

    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.neo4j.build.plugins</groupId>
          <artifactId>licensing-maven-plugin</artifactId>
          <version>1.7.6</version>
          <configuration>
            <failIfDisliked>true</failIfDisliked>
            <failIfMissing>true</failIfMissing>
            <plainTextReport>true</plainTextReport>
            <prependText>NOTICE-header.txt</prependText>
            <includedScopes>compile</includedScopes>
            <excludedScopes>test provided</excludedScopes>
            <!-- A bunch of dependencies that come from neo4j-harness -->
            <excludedGroups>^((com.sun.jersey){1}|(org.apache.xbean){1}|(org.neo4j(.*)?){1})$</excludedGroups>
            <excludedArtifacts>
              <!-- Dependencies that come from test scope -->
              ^((jersey-guice)|(jaxb-impl)|(jaxb-api)|(stax-api))$
            </excludedArtifacts>
          </configuration>
          <executions>
            <execution>
              <id>list-all-licenses</id>
              <phase>compile</phase>
              <goals>
                <goal>check</goal>
              </goals>
              <configuration>
                <licensingRequirementFiles>
                  <licensingRequirementFile>
                    licensing-config.xml
                  </licensingRequirementFile>
                </licensingRequirementFiles>
                <thirdPartyLicensingFilename>
                  ${project.artifactId}-${project.version}-NOTICE.txt
                </thirdPartyLicensingFilename>
                <checkExistingNoticeFile>
                  ${project.build.directory}/../NOTICE.txt
                </checkExistingNoticeFile>
                <listPrependText>LICENSES-header.txt</listPrependText>
                <listReport>${project.artifactId}-${project.version}-LICENSES.txt</listReport>
                <checkExistingLicensesFile>
                  ${project.build.directory}/../LICENSES.txt
                </checkExistingLicensesFile>
              </configuration>
            </execution>
          </executions>
          <dependencies>
            <dependency>
              <groupId>org.opencypher</groupId>
              <artifactId>okapi-licensecheck-config</artifactId>
              <version>${project.version}</version>
            </dependency>
          </dependencies>
        </plugin>

        <!-- License header checking -->
        <plugin>
          <groupId>com.mycila</groupId>
          <artifactId>license-maven-plugin</artifactId>
          <version>${plugin.license-maven.version}</version>
          <configuration>
            <header>${project.rootdir}/licensecheck-config/src/main/resources/NOTICE-header.txt</header>
            <basedir>${basedir}/src</basedir>
            <mapping>
              <scala>SLASHSTAR_STYLE</scala>
            </mapping>
            <excludes>
              <exclude>test/resources/**</exclude>
              <exclude>main/resources/**</exclude>
            </excludes>
          </configuration>
          <executions>
            <execution>
              <id>check-license-headers</id>
              <phase>validate</phase>
              <goals>
                <goal>check</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <!-- javac settings -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${plugin.maven-compiler.version}</version>
        <configuration>
          <source>${project.java.version}</source>
          <target>${project.java.version}</target>
        </configuration>
      </plugin>

      <!-- Builds a source JAR -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <!-- scalac settings -->
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>${plugin.maven-scala.version}</version>
        <configuration>
          <!--<recompileMode>incremental</recompileMode>-->
          <scalaVersion>${project.scala.version}</scalaVersion>
          <scalaCompatVersion>${project.scala.binary.version}</scalaCompatVersion>
          <encoding>${project.build.encoding}</encoding>
          <args combine.children="append">
            <!-- need to pass encoding to scalac manually -->
            <arg>-encoding</arg>
            <arg>${project.build.encoding}</arg>
            <arg>-target:jvm-${project.java.version}</arg>
            <arg>-unchecked</arg>
            <arg>-deprecation</arg>
            <arg>-feature</arg>
            <arg>-Xfatal-warnings</arg>
            <arg>-Xfuture</arg>
            <!--<arg>-Ytyper-debug</arg>-->
            <arg>-Ywarn-adapted-args</arg>
            <arg>-Yopt-warnings:at-inline-failed</arg>
            <arg>-Yopt:l:project</arg>
            <arg>-Ypartial-unification</arg>
          </args>
          <jvmArgs>
            <!-- Workaround for Scala compiler error: https://github.com/freechipsproject/firrtl/issues/66 -->
            <jvmArg>-Xss512m</jvmArg>
          </jvmArgs>
        </configuration>

        <!-- This is needed to mix scala and java code in the same module -->
        <executions>
          <execution>
            <id>scala-compile</id>
            <phase>process-resources</phase>
            <goals>
              <goal>add-source</goal>
              <goal>compile</goal>
              <goal>doc-jar</goal>
            </goals>
          </execution>
          <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <!-- scalastyle) -->
      <plugin>
        <groupId>org.scalastyle</groupId>
        <artifactId>scalastyle-maven-plugin</artifactId>
        <version>${plugin.maven-scalastyle.version}</version>
        <configuration>
          <verbose>false</verbose>
          <failOnViolation>true</failOnViolation>
          <includeTestSourceDirectory>true</includeTestSourceDirectory>
          <failOnWarning>false</failOnWarning>
          <inputEncoding>${project.build.encoding}</inputEncoding>
          <sourceDirectory>${basedir}/src/main/scala</sourceDirectory>
          <testSourceDirectory>${basedir}/src/test/scala</testSourceDirectory>
          <configLocation>${project.rootdir}/etc/scalastyle_config.xml</configLocation>
          <outputFile>${basedir}/target/scalastyle-output.xml</outputFile>
          <outputEncoding>${project.build.encoding}</outputEncoding>
        </configuration>
        <executions>
          <execution>
            <phase>test</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <!-- add version information to jar -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>${plugin.maven-jar.version}</version>
        <executions>
          <execution>
            <goals>
              <goal>test-jar</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <archive>
            <index>true</index>
            <addMavenDescriptor>true</addMavenDescriptor>
            <manifest>
              <addClasspath>true</addClasspath>
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
          </archive>
        </configuration>
      </plugin>

      <!-- We run tests with surefire -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>${plugin.maven-surefire.version}</version>
      </plugin>

      <!-- License header checking -->
      <plugin>
        <groupId>com.mycila</groupId>
        <artifactId>license-maven-plugin</artifactId>
      </plugin>

    </plugins>

  </build>

  <profiles>
    <profile>
      <!-- Disable plugin for parent module -->
      <id>no-license-listing-for-parent-module</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <file>
          <exists>src/main/scala</exists>
        </file>
      </activation>

      <build>
        <plugins>
          <!-- License file checking-->
          <plugin>
            <groupId>org.neo4j.build.plugins</groupId>
            <artifactId>licensing-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

  <dependencies>
    <!-- Scala -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${project.scala.version}</version>
    </dependency>

    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-reflect</artifactId>
      <version>${project.scala.version}</version>
    </dependency>

    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-compiler</artifactId>
      <version>${project.scala.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>${dep.log4j.core.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>${dep.log4j.core.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api-scala_2.11</artifactId>
      <version>${dep.log4j.scala.api.version}</version>
    </dependency>

    <dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest_${project.scala.binary.version}</artifactId>
      <version>${dep.scalatest.version}</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.junit.platform</groupId>
      <artifactId>junit-platform-runner</artifactId>
      <version>${dep.junit.platform.version}</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.scalacheck</groupId>
      <artifactId>scalacheck_${project.scala.binary.version}</artifactId>
      <version>${dep.scalacheck.version}</version>
      <scope>test</scope>
    </dependency>

  </dependencies>
</project>
