# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI="5"

JAVA_PKG_IUSE="doc source"

inherit eutils java-pkg-2 java-ant-2

MY_PN="postgresql-jdbc"
MY_PV="${PV/_p/-}"
MY_P="${MY_PN}-${MY_PV}.src"

DESCRIPTION="JDBC Driver for PostgreSQL"
SRC_URI="http://jdbc.postgresql.org/download/${MY_P}.tar.gz"
HOMEPAGE="http://jdbc.postgresql.org/"

LICENSE="POSTGRESQL"
SLOT="0"
KEYWORDS="~amd64 ~ppc64 ~x86"
IUSE="test"

DEPEND="
	>=virtual/jdk-1.6
	doc? (
		dev-libs/libxslt
		app-text/docbook-xsl-stylesheets
	)
	test? (
		>=dev-db/postgresql-9.3[server]
		dev-java/ant-junit
		dev-java/junit:4
		dev-java/xml-commons
	)"
RDEPEND=">=virtual/jre-1.6"

RESTRICT="test" # Requires external postgresql server setup

S="${WORKDIR}/postgresql-jdbc-${MY_PV}.src"

JAVA_ANT_REWRITE_CLASSPATH="yes"
EANT_DOC_TARGET="publicapi"

java_prepare() {
	# Strip build.xml of maven deps
	sed -i -e '/<classpath.*dependency\.compile\.classpath/c\' build.xml || die
	sed -i -e '/<classpath.*dependency\.runtime\.classpath/c\' build.xml || die
	sed -i -e '/<classpath.*dependency\.test\.classpath/c\' build.xml || die
	sed -i -e '/<target name="artifact-version"/,/<[/]target>/{s/depends="maven-dependencies"//}' build.xml || die
	sed -i -e '/<target name="compile"/ s/,maven-dependencies//' build.xml || die

	# Remove SSPI, it pulls in Waffle-JNA and is only used on Windows
	sed -i -e '/<include.*sspi/c\' build.xml || die
	rm -vrf org/postgresql/sspi || die "Error removing sspi"
	epatch "${FILESDIR}"/${PN}-9.4_p1204-remove-sspi.patch

	# FIXME @someone who cares: enable through osgi flag?
	sed -i -e '/<include.*osgi/c\' build.xml || die
	sed -i -e '/<test.*osgi/c\' build.xml || die
	rm -vrf org/postgresql/osgi || die "Error removing osgi"
	rm -vrf org/postgresql/test/osgi || die "Error removing osgi tests"
	epatch "${FILESDIR}"/${PN}-9.4_p1201-remove-osgi.patch

	java-pkg_clean
}

src_compile() {
	EANT_BUILD_TARGET="release-version jar"
	java-pkg-2_src_compile

	# There is a task that creates this doc but I didn't find a way how to use system catalog
	# to lookup the stylesheet so the 'doc' target is rewritten here to use system call instead.
	if use doc; then
		mkdir -p "${S}/build/doc" || die
		xsltproc -o "${S}/build/doc/pgjdbc.html" http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl \
			"${S}/doc/pgjdbc.xml" || die
	fi
}

src_test() {
	einfo "In order to run the tests successfully, you have to have:"
	einfo "1) PostgreSQL server running"
	einfo "2) database 'test' defined with user 'test' with password 'test'"
	einfo "   as owner of the database"
	einfo "3) plpgsql support in the 'test' database"
	einfo
	einfo "You can find a general info on how to perform these steps at"
	einfo "https://wiki.gentoo.org/wiki/PostgreSQL"

	ANT_TASKS="ant-junit" eant test -Dgentoo.classpath=$(java-pkg_getjars --build-only "junit-4,xml-commons")
}

src_install() {
	java-pkg_newjar build/jars/postgresql*.jar jdbc-postgresql.jar

	if use doc ; then
		java-pkg_dojavadoc build/publicapi
		dohtml build/doc/pgjdbc.html
	fi

	use source && java-pkg_dosrc org
}
