diff options
Diffstat (limited to 'eclass/java-webapp.eclass')
-rw-r--r-- | eclass/java-webapp.eclass | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/eclass/java-webapp.eclass b/eclass/java-webapp.eclass new file mode 100644 index 0000000..c7a3cdd --- /dev/null +++ b/eclass/java-webapp.eclass @@ -0,0 +1,200 @@ +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +# +# Original Author: nelchael +# Purpose: contains common functions for Java web applications +# + +inherit java-utils-2 + +DEPENDS="app-arch/zip + app-arch/unzip" + +# TODO: documentation +# TODO: list of supported servers? + +# Keep this list sorted! +SUPPORTED_WEB_SERVERS=" + www-servers/jboss + www-servers/jetty + www-servers/resin + www-servers/tomcat +" + +EXPORT_FUNCTIONS pkg_postinst + +function _resolve_symlink() { + + debug-print-function ${FUNCNAME} $* + + [[ -z "${1}" ]] && die "Missing symlink name" + + local fn="$(find "${S}" -type l -name "${1}")" + [[ -z "${fn}" ]] && return + readlink "${fn}" || die "readlink failed" + +} + +function _get_owning_package() { + + debug-print-function ${FUNCNAME} $* + + [[ -z "${1}" ]] && die "Missing jar name" + grep "^${1}@" "${T}/java-pkg-depend" | cut -d '@' -f 2 + +} + +function _ensure_owner() { + + debug-print-function ${FUNCNAME} $* + + [[ -z "${1}" ]] && die "Missing package name" + [[ -n "$(grep -E "@?${1}" "${T}/java-pkg-depend")" ]] + +} + +function _postprocess_war() { + + debug-print-function ${FUNCNAME} $* + + [[ ${#} != 1 ]] && die "Missing argument!" + + if [[ -z "$(unzip -t "${1}" | grep WEB-INF/lib/)" ]]; then + ewarn 'No WEB-INF/lib found in archive!' + return + fi + + echo ">>> Post processing $(basename "${1}") ..." + + local extract_dir="java-webapp-unpacked-${PN}-${SLOT}-${PV}" + + mkdir -p "${T}/${extract_dir}" || die "failed to create ${T}/${extract_dir}" + + cd "${T}/${extract_dir}/" + unzip -qq "${1}" || die "failed to unpack war" + + cd WEB-INF/lib + local unknown= + + for i in *.jar; do + + # Check if this jar is owned by package: + if hasq "${i}" ${WEBAPP_OWNED_JARS}; then + echo ">>> Package owned jar: ${i}, skipping" + continue + fi + + local destname="${i}" + local owner=$(_get_owning_package "${i}") + + if [[ -z "${owner}" ]]; then + + # No owner -> try to find the original symlink in ${S} + local original="$(_resolve_symlink "${i}")" + if [[ -z "${original}" ]]; then + unknown="${unknown} ${i}" + echo ">>> No package owns ${i}, skipping" + continue + fi + + destname="$(basename "${original}")" + owner="$(echo "${original}" | cut -d / -f 4)" + + fi + + _ensure_owner "${owner}" || die "Package ${owner} not recorded" + + rm -f "${i}" || die "rm \"${i}\" failed" + echo ">>> Symlinking ${i} (${owner}) to WEB-INF/lib/" + ln -s "/usr/share/${owner}/lib/${destname}" "${i}" || \ + die "failed to create symlink to \"${i}\"" + + done + + local tmp_war="${T}/tmp-$(basename "${1}")" + cd "${T}/${extract_dir}/" + echo ">>> Recreating $(basename "${1}")" + zip -qyr9 "${tmp_war}" * || die "zip failed" + + cd "${T}" + rm -rf "${extract_dir}" + + rm -f "${1}" || die "failed to remove original war" + mv "${tmp_war}" "${1}" || die "failed to move recreated war file" + + if [[ -n "${unknown}" ]]; then + + ewarn "Following java archives not owned by any installed package were" + ewarn "found in web archive $(basename "${2}"):" + ewarn + for i in ${unknown}; do + ewarn " ${i}" + done + ewarn + ewarn "If the archives above were built by ${CATEGORY}/${P} they should" + ewarn "be added to WEBAPP_OWNED_JARS in ebuild, if these are" + ewarn "a third-party libraries then this is a bug, please report" + ewarn "this to http://bugs.gentoo.org/" + + fi + +} + +function java-webapp_newwar() { + + debug-print-function ${FUNCNAME} $* + + [[ -z "${1}" ]] && die "Missing old war file name" + [[ -z "${2}" ]] && die "Missing new war file name" + + local newname="$(basename "${2}")" + + java-pkg_init_paths_ + + dodir "${JAVA_PKG_WARDEST}" + insinto "${JAVA_PKG_WARDEST}" + newins "${1}" "${newname}" + +} + +function java-webapp_dowar() { + + [[ -z "${1}" ]] && die "Missing war file name" + java-webapp_newwar "${1}" "$(basename "${1}")" + +} + +function post_src_install() { + + java-pkg_init_paths_ + + for i in $(find "${D}/${JAVA_PKG_WARDEST}" -name '*.war' | sort); do + _postprocess_war "${i}" + done + +} + +function java-webapp_pkg_postinst() { + + elog "To use this web application create a symlink to installed .war file" + elog "in server webapps directory." + + local foundServer=no + for i in ${SUPPORTED_WEB_SERVERS}; do + has_version "${i}" && foundServer=yes + done + + if [[ "${foundServer}" = "no" ]]; then + + elog + elog "It looks like you don't have any supported web server installed," + elog "please emerge one of:" + for i in ${SUPPORTED_WEB_SERVERS}; do + elog " ${i}" + done + + fi + +} |