<?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.
-->

<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.jena</groupId>
    <artifactId>jena-jdbc</artifactId>
    <version>4.10.0</version>
  </parent>
  <artifactId>jena-jdbc-driver-bundle</artifactId>
  <name>Apache Jena - JDBC Driver Bundle</name>
  <description>An artifact which bundles up the standard Jena JDBC drivers into a single shaded JAR file to provide a convenience dependency</description>

  <properties>
    <automatic.module.name>org.apache.jena.jdbc.driver.bundle</automatic.module.name>
    <!-- Note that we actually skip tests in this module because this module 
      simply bundles up the other modules BUT it contains a JUnit suite primarily 
      as a convenience for being able to perform code coverage analysis easily 
      on all the modules. This is essentially a compromise to work around the Eclipse 
      EMMA plugin having limited configurability and making it otherwise impossible 
      to easily analyse code coverage on a multi-module project short of running 
      the Emma plugin on your Jenkins server, however doing that loses the visual 
      benefit of being able to see in Eclipse what code is and isn't covered -->
    <skipTests>true</skipTests>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-jdbc-driver-mem</artifactId>
      <version>4.10.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-jdbc-driver-remote</artifactId>
      <version>4.10.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-jdbc-driver-tdb</artifactId>
      <version>4.10.0</version>
    </dependency>

    <!-- Test Dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-jdbc-driver-mem</artifactId>
      <version>4.10.0</version>
      <classifier>tests</classifier>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-jdbc-driver-remote</artifactId>
      <version>4.10.0</version>
      <classifier>tests</classifier>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-jdbc-driver-tdb</artifactId>
      <version>4.10.0</version>
      <classifier>tests</classifier>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-jdbc-core</artifactId>
      <version>4.10.0</version>
      <classifier>tests</classifier>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-fuseki-main</artifactId>
      <version>4.10.0</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>

      <!-- Shade Plugin -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
            <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" />
            <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
              <addHeader>false</addHeader>
            </transformer>
          </transformers>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <!-- Javadoc Plugin -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>

          <!-- Compensate for java11 issues; remove at java17 -->
          <source>8</source>
          <doclint>none</doclint>
          <detectJavaApiLink>false</detectJavaApiLink>
          <quiet>true</quiet>
          <encoding>UTF-8</encoding>
          <charset>UTF-8</charset>
          <docencoding>UTF-8</docencoding>

          <!-- Include only JDBC dependencies -->
          <includeDependencySources>true</includeDependencySources>
          <includeTransitiveDependencySources>true</includeTransitiveDependencySources>
          <dependencySourceIncludes>
            <dependencySourceInclude>org.apache.jena:jena-jdbc*</dependencySourceInclude>
          </dependencySourceIncludes>

          <groups>
            <group>
              <title>JDBC Core</title>
              <packages>org.apache.jena.jdbc*</packages>
            </group>
            <group>
              <title>In-Memory Driver</title>
              <packages>org.apache.jena.jdbc.mem*</packages>
            </group>
            <group>
              <title>TDB Driver</title>
              <packages>org.apache.jena.jdbc.tdb*</packages>
            </group>
            <group>
              <title>Remote Endpoint Driver</title>
              <packages>org.apache.jena.jdbc.remote*</packages>
            </group>
          </groups>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
