<?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.6.1</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>
		<plugin.license.headerPath>${project.parent.basedir}</plugin.license.headerPath>
		<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.6.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-remote</artifactId>
			<version>4.6.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-tdb</artifactId>
			<version>4.6.1</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.6.1</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-remote</artifactId>
			<version>4.6.1</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-tdb</artifactId>
			<version>4.6.1</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-core</artifactId>
			<version>4.6.1</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-fuseki-main</artifactId>
			<version>4.6.1</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>

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