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

EAPI="5"

JAVA_PKG_IUSE="source examples doc test"

inherit java-pkg-2 java-ant-2

DESCRIPTION="A low level toolset of Java components focused on HTTP and associated protocols"
HOMEPAGE="http://hc.apache.org/index.html"
SRC_URI="mirror://apache/${PN/-//http}/source/${P}-src.tar.gz"

LICENSE="Apache-2.0"
SLOT="4.5"
KEYWORDS="amd64 x86"

CDEPEND="
	dev-java/ant-junit:0
	dev-java/easymock:3.2
	dev-java/spymemcached:0
	dev-java/osgi-core-api:0
	dev-java/osgi-enterprise-api:0
	dev-java/commons-codec:0
	dev-java/commons-logging:0
	dev-java/httpcomponents-core:4.4
	dev-java/easymock-classextension:3.2
"

RDEPEND=">=virtual/jre-1.6
	${CDEPEND}"

DEPEND=">=virtual/jdk-1.6
	test? (
		dev-java/junit:4
		dev-java/mockito:0
	)
	${CDEPEND}"

JAVA_ANT_REWRITE_CLASSPATH="true"
EANT_GENTOO_CLASSPATH="
	commons-codec
	commons-logging
	spymemcached
	osgi-core-api
	osgi-enterprise-api
	httpcomponents-core-4.4
"

# List of modules to compile and test.
MODULES=(
	httpclient
	httpclient-cache
	httpmime
	fluent-hc
	httpclient-osgi
)

EANT_BUILD_TARGET="package"
EANT_GENTOO_CLASSPATH_EXTRA="${S}/${MODULES[0]}/target/${MODULES[0]}-${PV}.jar"

java_prepare() {
	# copy build.xml files to their location.
	for module in ${MODULES[@]}; do
		cd "${S}"/"${module}" || die
		cp "${FILESDIR}"/"${PN}-${module}-${PV}"-build.xml build.xml
	done

	cd "${S}" || die

	# httpclient:
	# - copy deprecated sources for compilation
	cp -r "${S}"/${MODULES[0]}/src/main/java-deprecated/* \
		"${S}"/${MODULES[0]}/src/main/java/* || die

	# - remove broken tests
	rm -v ${MODULES[0]}/src/test/java/org/apache/http/client/config/TestRequestConfig.java

	# httpclient-cache:
	# - copy deprecated sources into main repository
	cp -r "${S}"/${MODULES[1]}/src/main/java-deprecated/* \
		"${S}"/${MODULES[1]}/src/main/java || die

	# - remove broken tests
	rm -v \
		${MODULES[1]}/src/test/java/org/apache/http/impl/client/cache/TestCachingExec*

	# - disable ehcache support altogether
	# the version in Portage is very old and compilation chokes on missing imports
	rm -rf \
		"${S}"/${MODULES[1]}/src/main/java/org/apache/http/impl/client/cache/ehcache \
		"${S}"/${MODULES[1]}/src/test/java/org/apache/http/impl/client/cache/ehcache

	# httpmime:
	# - copy deprecated sources into main repository
	cp -r "${S}"/${MODULES[2]}/src/main/java-deprecated/* \
		"${S}"/${MODULES[2]}/src/main/java

	# fluent-hc:
	# remove broken tests.
	rm -v ${MODULES[3]}/src/test/java/org/apache/http/client/fluent/TestFluent.java
}

EANT_TEST_GENTOO_CLASSPATH="
	${EANT_GENTOO_CLASSPATH}
	junit-4
	mockito
	easymock-3.2
	easymock-classextension-3.2
"

src_compile() {
	for module in ${MODULES[@]}; do
		EANT_BUILD_XML="${module}/build.xml" \
			java-pkg-2_src_compile
	done
}

src_test() {
	for module in ${MODULES[@]}; do
		ANT_TASKS= \
			EANT_BUILD_XML="${module}/build.xml" \
			java-pkg-2_src_test
	done
}

src_install() {
	for module in ${MODULES[@]}; do
		java-pkg_newjar ${module}/target/${module}-${PV}.jar ${module}.jar
	done

	if use source; then

		java-pkg_dosrc {httpclient,httpclient-cache,httpmime,fluent-hc}/src/main/java/org
	fi

	if use examples; then
		for dir in $(find "${S}" -mindepth 3 -maxdepth 4 -name "examples" -type d -print); do
			java-pkg_doexamples ${dir}/*
		done
	fi

	if use doc; then
		java-pkg_dojavadoc {httpclient,httpclient-cache,httpmime,fluent-hc}/target/site/apidocs/
	fi
}
