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

EAPI="5"

JAVA_PKG_IUSE="doc source test"
WANT_ANT_TASKS="ant-trax"

inherit java-pkg-2 java-ant-2

MY_P="${P}-src"

DESCRIPTION="A powerful Model View Controller Framework for JSP/Servlets"
SRC_URI="mirror://apache/struts/source/${MY_P}.zip
	https://dev.gentoo.org/~tomwij/files/dist/${PN}-build.xml-${PV}.tar.xz"
HOMEPAGE="http://struts.apache.org/index.html"

LICENSE="Apache-2.0"
SLOT="2"
KEYWORDS="~amd64"

COMMON_DEPS="
	dev-java/felix-shell:0
	dev-java/osgi-core-api:0
	dev-java/struts-core:${SLOT}
	dev-java/struts-plugins:${SLOT}
	dev-java/struts-xwork:${SLOT}
	java-virtuals/servlet-api:2.3"

RDEPEND=">=virtual/jre-1.5
	${COMMON_DEPS}"

DEPEND=">=virtual/jdk-1.5
	test? ( dev-java/ant-junit:0 )
	${COMMON_DEPS}"

S="${WORKDIR}/${P}/src"

JAVA_ANT_REWRITE_CLASSPATH="true"
EANT_GENTOO_CLASSPATH="struts-core-${SLOT},struts-plugins-${SLOT},struts-xwork-${SLOT}"
EANT_TEST_GENTOO_CLASSPATH="${EANT_GENTOO_CLASSPATH}"
EANT_BUILD_TARGET="package"
EANT_TEST_TARGET="test"

# TODO: Incompatible with newer junit; we either need to patch it or slot junit.
RESTRICT="test"

src_unpack() {
	unpack ${MY_P}.zip
	cd "${S}" || die
	unpack ${PN}-build.xml-${PV}.tar.xz
}

java_prepare() {
	find . -name '*.jar' -print -delete || die

	epatch "${FILESDIR}"/${P}-build.xml-remove-core-and-plugins.patch
	epatch "${FILESDIR}"/${P}-build.xml-classpath.patch
	epatch "${FILESDIR}"/${P}-build.xml-manifest.patch
	epatch "${FILESDIR}"/${P}-build.xml-apps-package.patch
	epatch "${FILESDIR}"/${P}-build.xml-remove-apps-portlet.patch

	java-pkg_getjars felix-shell,osgi-core-api,servlet-api-2.3
}

src_install() {
	insinto /usr/share/${PN}-${SLOT}/

	# Misses apps/portlet.
	for dir in apps/{blank,mailreader,rest-showcase,showcase} bundles/{admin,demo} ; do
		if [[ ${dir} == "apps/"* ]] ; then
			doins ${dir}/target/${PN}2-${dir/apps\//}.war
		else
			java-pkg_newjar ${dir}/target/${PN}2-osgi-*-bundle-${PV}.jar ${dir/bundles\//}.jar
		fi

		if use doc ; then
			java-pkg_dojavadoc ${dir}/target/site/apidocs
			mkdir "${D}"/usr/share/doc/${P}/${dir/*\//} || die
			mv "${D}"/usr/share/doc/${P}/{html,${dir/*\//}/html} || die
		fi

		if [[ ${dir} == *"mailreader"* ]] ; then
			use source && java-pkg_dosrc ${dir}/src/main/java/mailreader2
		else
			use source && java-pkg_dosrc ${dir}/src/main/java/org
		fi
	done

	if use doc ; then
		rm "${D}"/usr/share/${PN}-${SLOT}/api || die
	fi
}

src_test() {
	EANT_TEST_EXTRA_ARGS="-Dgentoo.test.classpath=$(java-pkg_getjars ${EANT_TEST_GENTOO_CLASSPATH})"
	EANT_TEST_EXTRA_ARGS+=" -Djunit.present=true"

	java-pkg-2_src_test
}

pkg_postinst() {
	elog "The application 'portlet' is not in this release because it doesn't build."
}
