<?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>3.15.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>
		<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>3.15.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-remote</artifactId>
			<version>3.15.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-tdb</artifactId>
			<version>3.15.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>3.15.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-remote</artifactId>
			<version>3.15.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-tdb</artifactId>
			<version>3.15.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-core</artifactId>
			<version>3.15.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-fuseki-main</artifactId>
			<version>3.15.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>
					<quiet>true</quiet>
					<encoding>UTF-8</encoding>
					<charset>UTF-8</charset>
					<docencoding>UTF-8</docencoding>

					<additionalDependencies>
						<additionalDependency>
							<groupId>log4j</groupId>
							<artifactId>log4j</artifactId>
							<version>${ver.log4j1}</version>
						</additionalDependency>
					</additionalDependencies>
					<!-- 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>
