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

inherit java-pkg-2 java-ant-2

MY_PN="struts"
MY_P="${MY_PN}-${PV}-src"

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

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

COMMON_DEPS="dev-java/commons-beanutils:1.7
	dev-java/commons-lang:3.1
	dev-java/commons-io:1
	dev-java/freemarker:2.3
	dev-java/juel:0
	dev-java/ognl:3.0
	dev-java/osgi-core-api:0
	dev-java/struts-core:${SLOT}
	dev-java/struts-xwork:${SLOT}
	dev-java/velocity:0
	java-virtuals/servlet-api:3.0"

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

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

S="${WORKDIR}/${MY_PN}-${PV}/src/plugins"

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

# javatemplates/maven-build.xml:149:
# Test org.apache.struts2.views.java.simple.AbstractCommonAttributesTest failed
# Cannot instantiate test case: testRenderTextFieldDynamicAttrs
RESTRICT="test"

src_unpack() {
	unpack ${MY_P}.zip
	cd "${WORKDIR}"/${MY_PN}-${PV}/src || die
	unpack ${MY_PN}-build.xml-${PV}.tar.xz
}

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

	epatch "${DISTDIR}"/${MY_PN}-${PV}-build.xml-classpath.patch
	epatch "${FILESDIR}"/${MY_PN}-${PV}-build.xml-manifest.patch
	epatch "${FILESDIR}"/${MY_PN}-${PV}-build.xml-remove-codebehind.patch
	epatch "${FILESDIR}"/${MY_PN}-${PV}-build.xml-remove-portlet.patch

	# Remove tests that don't build due to test files that aren't installed.
	rm jfreechart/src/test/java/org/apache/struts2/dispatcher/ChartResultTest.java

	java-pkg_getjars commons-beanutils-1.7,commons-io-1,commons-lang-3.1,freemarker-2.3,juel,ognl-3.0,osgi-core-api,servlet-api-3.0,velocity
}

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
}

src_install() {
	for plugin in $(find . -mindepth 1 -maxdepth 1 -type d | sed 's:./::g' | tr '\n' ' ') ; do
		[[ ! -d ${plugin}/target ]] && continue

		einfo "Installing plugin '${plugin}' ..."
		java-pkg_newjar ${plugin}/target/${MY_PN}2-${plugin}-plugin-${PV}.jar ${plugin}.jar

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

		use source && java-pkg_dosrc ${plugin}/src/main/java/org
	done

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

pkg_postinst() {
	elog "The 'codebehind' and 'portlet' plugins are not in this release because they don't build yet."
}
