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

# @ECLASS: java-utils-2.eclass
# @MAINTAINER:
# java@gentoo.org
# @AUTHOR:
# Thomas Matthijs <axxo@gentoo.org>, Karl Trygve Kalleberg <karltk@gentoo.org>
# @BLURB: Base eclass for Java packages
# @DESCRIPTION:
# This eclass provides functionality which is used by java-pkg-2.eclass,
# java-pkg-opt-2.eclass and java-ant-2 eclass, as well as from ebuilds.
#
# This eclass should not be inherited this directly from an ebuild. Instead,
# you should inherit java-pkg-2 for Java packages or java-pkg-opt-2 for packages
# that have optional Java support. In addition you can inherit java-ant-2 for
# Ant-based packages.
inherit eutils versionator multilib

IUSE="elibc_FreeBSD"

# Make sure we use java-config-2
export WANT_JAVA_CONFIG="2"

# @VARIABLE: JAVA_PKG_PORTAGE_DEP
# @INTERNAL
# @DESCRIPTION:
# The version of portage we need to function properly. Previously it was
# portage with phase hooks support but now we use a version with proper env
# saving. For EAPI 2 we have new enough stuff so let's have cleaner deps.
has "${EAPI}" 0 1 && JAVA_PKG_PORTAGE_DEP=">=sys-apps/portage-2.1.2.7"

# @VARIABLE: JAVA_PKG_E_DEPEND
# @INTERNAL
# @DESCRIPTION:
# This is a convience variable to be used from the other java eclasses. This is
# the version of java-config we want to use. Usually the latest stable version
# so that ebuilds can use new features without depending on specific versions.
JAVA_PKG_E_DEPEND=">=dev-java/java-config-2.2.0 ${JAVA_PKG_PORTAGE_DEP}"
has source ${JAVA_PKG_IUSE} && JAVA_PKG_E_DEPEND="${JAVA_PKG_E_DEPEND} source? ( app-arch/zip )"

# @ECLASS-VARIABLE: JAVA_PKG_WANT_BOOTCLASSPATH
# @DEFAULT_UNSET
# @DESCRIPTION:
# The version of bootclasspath the package needs to work. Translates to a proper
# dependency. The bootclasspath can then be obtained by java-ant_rewrite-bootclasspath
if [[ -n "${JAVA_PKG_WANT_BOOTCLASSPATH}" ]]; then
	if [[ "${JAVA_PKG_WANT_BOOTCLASSPATH}" == "1.5" ]]; then
		JAVA_PKG_E_DEPEND="${JAVA_PKG_E_DEPEND} >=dev-java/gnu-classpath-0.98-r1:0.98"
	else
		eerror "Unknown value of JAVA_PKG_WANT_BOOTCLASSPATH"
		# since die in global scope doesn't work, this will make repoman fail
		JAVA_PKG_E_DEPEND="${JAVA_PKG_E_DEPEND} BAD_JAVA_PKG_WANT_BOOTCLASSPATH"
	fi
fi

# @ECLASS-VARIABLE: JAVA_PKG_ALLOW_VM_CHANGE
# @DESCRIPTION:
# Allow this eclass to change the active VM?
# If your system VM isn't sufficient for the package, the build will fail
# instead of trying to switch to another VM.
#
# Overriding the default can be useful for testing specific VMs locally, but
# should not be used in the final ebuild.
JAVA_PKG_ALLOW_VM_CHANGE=${JAVA_PKG_ALLOW_VM_CHANGE:="yes"}

# @ECLASS-VARIABLE: JAVA_PKG_FORCE_VM
# @DEFAULT_UNSET
# @DESCRIPTION:
# Explicitly set a particular VM to use. If its not valid, it'll fall back to
# whatever /etc/java-config-2/build/jdk.conf would elect to use.
#
# Should only be used for testing and debugging.
#
# Example: use sun-jdk-1.5 to emerge foo:
# @CODE
#	JAVA_PKG_FORCE_VM=sun-jdk-1.5 emerge foo
# @CODE

# @ECLASS-VARIABLE: JAVA_PKG_WANT_BUILD_VM
# @DEFAULT_UNSET
# @DESCRIPTION:
# A list of VM handles to choose a build VM from. If the list contains the
# currently active VM use that one, otherwise step through the list till a
# usable/installed VM is found.
#
# This allows to use an explicit list of JDKs in DEPEND instead of a virtual.
# Users of this variable must make sure at least one of the listed handles is
# covered by DEPEND.
# Requires JAVA_PKG_WANT_SOURCE and JAVA_PKG_WANT_TARGET to be set as well.

# @ECLASS-VARIABLE: JAVA_PKG_WANT_SOURCE
# @DEFAULT_UNSET
# @DESCRIPTION:
# Specify a non-standard Java source version for compilation (via javac -source
# parameter or Ant equivalent via build.xml rewriting done by java-ant-2 eclass).
# Normally this is determined from the jdk version specified in DEPEND.
# See java-pkg_get-source function below.
#
# Should generally only be used for testing and debugging.
#
# Use 1.4 source to emerge baz
# @CODE
#	JAVA_PKG_WANT_SOURCE=1.4 emerge baz
# @CODE

# @ECLASS-VARIABLE: JAVA_PKG_WANT_TARGET
# @DEFAULT_UNSET
# @DESCRIPTION:
# Same as JAVA_PKG_WANT_SOURCE (see above) but for javac -target parameter,
# which affects the version of generated bytecode.
# Normally this is determined from the jre/jdk version specified in RDEPEND.
# See java-pkg_get-target function below.
#
# Should generallyonly be used for testing and debugging.
#
# emerge bar to be compatible with 1.3
# @CODE
#	JAVA_PKG_WANT_TARGET=1.3 emerge bar
# @CODE

# @ECLASS-VARIABLE: JAVA_PKG_DEBUG
# @DEFAULT_UNSET
# @DESCRIPTION:
# A variable to be set with "yes" or "y", or ANY string of length non equal to
# zero. When set, verbosity across java eclasses is increased and extra
# logging is displayed.
# @CODE
#	JAVA_PKG_DEBUG="yes"
# @CODE

# @ECLASS-VARIABLE: JAVA_RM_FILES
# @DEFAULT_UNSET
# @DESCRIPTION:
# An array containing a list of files to remove. If defined, this array will be
# automatically handed over to java-pkg_rm_files for processing during the
# src_prepare phase.
#
# @CODE
#	JAVA_RM_FILES=(
#		path/to/File1.java
#		DELETEME.txt
#	)
# @CODE

# @VARIABLE: JAVA_PKG_COMPILER_DIR
# @INTERNAL
# @DESCRIPTION:
# Directory where compiler settings are saved, without trailing slash.
# You probably shouldn't touch this variable except local testing.
JAVA_PKG_COMPILER_DIR=${JAVA_PKG_COMPILER_DIR:="/usr/share/java-config-2/compiler"}

# @VARIABLE: JAVA_PKG_COMPILERS_CONF
# @INTERNAL
# @DESCRIPTION:
# Path to file containing information about which compiler to use.
# Can be overloaded, but it should be overloaded only for local testing.
JAVA_PKG_COMPILERS_CONF=${JAVA_PKG_COMPILERS_CONF:="/etc/java-config-2/build/compilers.conf"}

# @ECLASS-VARIABLE: JAVA_PKG_FORCE_COMPILER
# @INTERNAL
# @DEFAULT_UNSET
# @DESCRIPTION:
# Explicitly set a list of compilers to choose from. This is normally read from
# JAVA_PKG_COMPILERS_CONF.
#
# Useful for local testing.
#
# Use jikes and javac, in that order
# @CODE
#	JAVA_PKG_FORCE_COMPILER="jikes javac"
# @CODE

# @ECLASS-VARIABLE: JAVA_PKG_FORCE_ANT_TASKS
# @DEFAULT_UNSET
# @DESCRIPTION:
# An $IFS separated list of ant tasks. Can be set in environment before calling
# emerge/ebuild to override variables set in ebuild, mainly for testing before
# putting the resulting (WANT_)ANT_TASKS into ebuild. Affects only ANT_TASKS in
# eant() call, not the dependencies specified in WANT_ANT_TASKS.
#
# @CODE
# JAVA_PKG_FORCE_ANT_TASKS="ant-junit ant-trax" \
# 	ebuild foo.ebuild compile
# @CODE

# TODO document me
JAVA_PKG_QA_VIOLATIONS=0

# @FUNCTION: java-pkg_doexamples
# @USAGE: [--subdir <subdir>] <file1/dir1> [<file2> ...]
# @DESCRIPTION:
# Installs given arguments to /usr/share/doc/${PF}/examples
# If you give it only one parameter and it is a directory it will install
# everything in that directory to the examples directory.
#
# @CODE
# Parameters:
# --subdir - If the examples need a certain directory structure
# $* - list of files to install
#
# Examples:
#	java-pkg_doexamples demo
#	java-pkg_doexamples demo/* examples/*
# @CODE
java-pkg_doexamples() {
	debug-print-function ${FUNCNAME} $*

	[[ ${#} -lt 1 ]] && die "At least one argument needed"

	java-pkg_check-phase install
	java-pkg_init_paths_

	local dest=/usr/share/doc/${PF}/examples
	if [[ ${1} == --subdir ]]; then
		local dest=${dest}/${2}
		dodir ${dest}
		shift 2
	fi

	if [[ ${#} = 1 && -d ${1} ]]; then
		( # dont want to pollute calling env
			insinto "${dest}"
			doins -r ${1}/*
		) || die "Installing examples failed"
	else
		( # dont want to pollute calling env
			insinto "${dest}"
			doins -r "$@"
		) || die "Installing examples failed"
	fi

	# Let's make a symlink to the directory we have everything else under
	dosym "${dest}" "${JAVA_PKG_SHAREPATH}/examples" || die
}

# @FUNCTION: java-pkg_addres
# @USAGE: <jar> <dir> [<find arguments> ...]
# @DESCRIPTION:
# Adds resource files to an existing jar.
# It is important that the directory given is actually the root of the
# corresponding resource tree. The target directory as well as
# sources.lst, MANIFEST.MF, *.class, *.jar, and *.java files are
# automatically excluded. Symlinks are always followed. Additional
# arguments are passed through to find.
#
# @CODE
#	java-pkg_addres ${PN}.jar resources ! -name "*.html"
# @CODE
#
# @param $1 - jar file
# @param $2 - resource tree directory
# @param $* - arguments to pass to find
java-pkg_addres() {
	debug-print-function ${FUNCNAME} $*

	[[ ${#} -lt 2 ]] && die "at least two arguments needed"

	local jar=$(realpath "$1" || die "realpath $1 failed")
	local dir="$2"
	shift 2

	pushd "${dir}" > /dev/null || die "pushd ${dir} failed"
	find -L -type f ! -path "./target/*" ! -path "./sources.lst" ! -name "MANIFEST.MF" ! -regex ".*\.\(class\|jar\|java\)" "${@}" -print0 | xargs -0 jar uf "${jar}" || die "jar failed"
	popd > /dev/null || die "popd failed"
}

# @FUNCTION: java-pkg_rm_files
# @USAGE: java-pkg_rm_files File1.java File2.java ...
# @DESCRIPTION:
# Remove unneeded files in ${S}.
#
# Every now and then, you'll run into situations whereby a file needs removing,
# be it a unit test or a regular java class.
#
# You can use this function by either:
# - calling it yourself in java_prepare() and feeding java-pkg_rm_files with
# the list of files you wish to remove.
# - defining an array in the ebuild named JAVA_RM_FILES with the list of files
# you wish to remove.
#
# Both way work and it is left to the developer's preferences. If the
# JAVA_RM_FILES array is defined, it will be automatically handed over to
# java-pkg_rm_files during the src_prepare phase.
#
# See java-utils-2_src_prepare.
#
# @CODE
#	java-pkg_rm_files File1.java File2.java
# @CODE
#
# @param $* - list of files to remove.
java-pkg_rm_files() {
	debug-print-function ${FUNCNAME} $*
	local IFS="\n"
	for filename in "$@"; do
		[[ ! -f "${filename}" ]] && die "${filename} is not a regular file. Aborting."
		einfo "Removing unneeded file ${filename}"
		rm -f "${S}/${filename}" || die "cannot remove ${filename}"
		eend $?
	done
}

# @FUNCTION: java-pkg_dojar
# @USAGE: <jar1> [<jar2> ...]
# @DESCRIPTION:
# Installs any number of jars.
# Jar's will be installed into /usr/share/${PN}(-${SLOT})/lib/ by default.
# You can use java-pkg_jarinto to change this path.
# You should never install a jar with a package version in the filename.
# Instead, use java-pkg_newjar defined below.
#
# @CODE
#	java-pkg_dojar dist/${PN}.jar dist/${PN}-core.jar
# @CODE
#
# @param $* - list of jars to install
java-pkg_dojar() {
	debug-print-function ${FUNCNAME} $*

	[[ ${#} -lt 1 ]] && die "At least one argument needed"

	java-pkg_check-phase install
	java-pkg_init_paths_

	# Create JARDEST if it doesn't exist
	dodir ${JAVA_PKG_JARDEST}

	local jar
	# for each jar
	for jar in "${@}"; do
		local jar_basename=$(basename "${jar}")

		java-pkg_check-versioned-jar ${jar_basename}

		# check if it exists
		if [[ -e "${jar}" ]] ; then
			# Don't overwrite if jar has already been installed with the same
			# name
			local dest="${D}${JAVA_PKG_JARDEST}/${jar_basename}"
			if [[ -e "${dest}" ]]; then
				ewarn "Overwriting ${dest}"
			fi

			# install it into JARDEST if it's a non-symlink
			if [[ ! -L "${jar}" ]] ; then
				#but first check class version when in strict mode.
				is-java-strict && java-pkg_verify-classes "${jar}"

				INSDESTTREE="${JAVA_PKG_JARDEST}" \
					doins "${jar}" || die "failed to install ${jar}"
				java-pkg_append_ JAVA_PKG_CLASSPATH "${JAVA_PKG_JARDEST}/${jar_basename}"
				debug-print "installed ${jar} to ${D}${JAVA_PKG_JARDEST}"
			# make a symlink to the original jar if it's symlink
			else
				# TODO use dosym, once we find something that could use it
				# -nichoj
				ln -s "$(readlink "${jar}")" "${D}${JAVA_PKG_JARDEST}/${jar_basename}"
				debug-print "${jar} is a symlink, linking accordingly"
			fi
		else
			die "${jar} does not exist"
		fi
	done

	# Extra logging if enabled.
	if [[ -n ${JAVA_PKG_DEBUG} ]]; then
		einfo "Verbose logging for \"${FUNCNAME}\" function"
		einfo "Jar file(s) destination: ${JAVA_PKG_JARDEST}"
		einfo "Jar file(s) created: ${@}"
		einfo "Complete command:"
		einfo "${FUNCNAME} ${@}"
	fi

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_regjar
# @USAGE: </path/to/installed/jar>
# @DESCRIPTION:
# Records an already installed (in ${D}) jar in the package.env
# This would mostly be used if the package has make or a custom script to
# install things.
#
# WARNING:
# if you want to use shell expansion, you have to use ${D}/... as the for in
# this function will not be able to expand the path, here's an example:
#
# @CODE
#   java-pkg_regjar ${D}/opt/my-java/lib/*.jar
# @CODE
#

# TODO should we be making sure the jar is present on ${D} or wherever?
java-pkg_regjar() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_check-phase install

	[[ ${#} -lt 1 ]] && die "at least one argument needed"

	java-pkg_init_paths_

	local jar jar_dir jar_file
	for jar in "${@}"; do
		# TODO use java-pkg_check-versioned-jar
		if [[ -e "${jar}" || -e "${D}${jar}" ]]; then
			[[ -d "${jar}" || -d "${D}${jar}" ]] \
				&& die "Called ${FUNCNAME} on a	directory $*"

			#check that class version correct when in strict mode
			is-java-strict && java-pkg_verify-classes "${jar}"

			# nelchael: we should strip ${D} in this case too, here's why:
			# imagine such call:
			#    java-pkg_regjar ${D}/opt/java/*.jar
			# such call will fall into this case (-e ${jar}) and will
			# record paths with ${D} in package.env
			java-pkg_append_ JAVA_PKG_CLASSPATH	"${jar#${D}}"
		else
			if [[ ${jar} = *\** ]]; then
				eerror "The argument ${jar} to ${FUNCNAME}"
				eerror "has * in it. If you want it to glob in"
				eerror '${D} add ${D} to the argument.'
			fi
			debug-print "${jar} or ${D}${jar} not found"
			die "${jar} does not exist"
		fi
	done

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_newjar
# @USAGE: <path/to/oldname.jar> [<newname.jar>]
# @DESCRIPTION:
# Installs a jar with a new name (defaults to $PN.jar)
#
# For example, installs a versioned jar without the version
java-pkg_newjar() {
	debug-print-function ${FUNCNAME} $*

	local original_jar="${1}"
	local new_jar="${2:-${PN}.jar}"
	local new_jar_dest="${T}/${new_jar}"

	[[ -z ${original_jar} ]] && die "Must specify a jar to install"
	[[ ! -f ${original_jar} ]] \
		&& die "${original_jar} does not exist or is not a file!"

	rm -f "${new_jar_dest}" || die "Failed to remove ${new_jar_dest}"
	cp "${original_jar}" "${new_jar_dest}" \
		|| die "Failed to copy ${original_jar} to ${new_jar_dest}"
	java-pkg_dojar "${new_jar_dest}"
}

# @FUNCTION: java-pkg_addcp
# @USAGE: <classpath>
# @DESCRIPTION:
# Add something to the package's classpath. For jars, you should use dojar,
# newjar, or regjar. This is typically used to add directories to the classpath.
# The parameters of this function are appended to JAVA_PKG_CLASSPATH
java-pkg_addcp() {
	java-pkg_append_ JAVA_PKG_CLASSPATH "${@}"
	java-pkg_do_write_
}

# @FUNCTION: java-pkg_doso
# @USAGE: <path/to/file1.so> [...]
# @DESCRIPTION:
# Installs any number of JNI libraries
# They will be installed into /usr/lib by default, but java-pkg_sointo
# can be used change this path
#
# @CODE
# Example:
#	java-pkg_doso *.so
# @CODE
java-pkg_doso() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_check-phase install

	[[ ${#} -lt 1 ]] && die "${FUNCNAME} requires at least one argument"

	java-pkg_init_paths_

	local lib
	# for each lib
	for lib in "$@" ; do
		# if the lib exists...
		if [[ -e "${lib}" ]] ; then
			# install if it isn't a symlink
			if [[ ! -L "${lib}" ]] ; then
				INSDESTTREE="${JAVA_PKG_LIBDEST}" \
					INSOPTIONS="-m0755" \
					doins "${lib}" || die "failed to install ${lib}"
				java-pkg_append_ JAVA_PKG_LIBRARY "${JAVA_PKG_LIBDEST}"
				debug-print "Installing ${lib} to ${JAVA_PKG_LIBDEST}"
			# otherwise make a symlink to the symlink's origin
			else
				dosym "$(readlink "${lib}")" "${JAVA_PKG_LIBDEST}/${lib##*/}"
				debug-print "${lib} is a symlink, linking accordantly"
			fi
		# otherwise die
		else
			die "${lib} does not exist"
		fi
	done

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_regso
# @USAGE: <file1.so> [...]
# @DESCRIPTION:
# Registers an already installed JNI library in package.env.
#
# @CODE
# Parameters:
# $@ - JNI libraries to register
#
# Example:
#	java-pkg_regso *.so /path/*.so
# @CODE
java-pkg_regso() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_check-phase install

	[[ ${#} -lt 1 ]] && die "${FUNCNAME} requires at least one argument"

	java-pkg_init_paths_

	local lib target_dir
	for lib in "$@" ; do
		# Check the absolute path of the lib
		if [[ -e "${lib}" ]] ; then
			target_dir="$(java-pkg_expand_dir_ ${lib})"
			java-pkg_append_ JAVA_PKG_LIBRARY "/${target_dir#${D}}"
		# Check the path of the lib relative to ${D}
		elif [[ -e "${D}${lib}" ]]; then
			target_dir="$(java-pkg_expand_dir_ ${D}${lib})"
			java-pkg_append_ JAVA_PKG_LIBRARY "${target_dir}"
		else
			die "${lib} does not exist"
		fi
	done

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_jarinto
# @USAGE: </path/to/install/jars/into>
# @DESCRIPTION:
# Changes the path jars are installed into via subsequent java-pkg_dojar calls.
java-pkg_jarinto() {
	debug-print-function ${FUNCNAME} $*

	JAVA_PKG_JARDEST="${1}"
}

# @FUNCTION: java-pkg_sointo
# @USAGE: </path/to/install/sofiles/into>
# @DESCRIPTION:
# Changes the path that JNI libraries are installed into via subsequent
# java-pkg_doso calls.
java-pkg_sointo() {
	debug-print-function ${FUNCNAME} $*

	JAVA_PKG_LIBDEST="${1}"
}

# @FUNCTION: java-pkg_dohtml
# @USAGE: <path/to/javadoc/documentation> [...]
# @DESCRIPTION:
# Install Javadoc HTML documentation. Usage of java-pkg_dojavadoc is preferred.
#
# @CODE
#	java-pkg_dohtml dist/docs/
# @CODE
java-pkg_dohtml() {
	debug-print-function ${FUNCNAME} $*

	[[ ${#} -lt 1 ]] &&  die "At least one argument required for ${FUNCNAME}"

	# from /usr/lib/portage/bin/dohtml -h
	#  -f   Set list of allowed extensionless file names.
	dohtml -f package-list "$@"

	# this probably shouldn't be here but it provides
	# a reasonable way to catch # docs for all of the
	# old ebuilds.
	java-pkg_recordjavadoc
}

# @FUNCTION: java-pkg_dojavadoc
# @USAGE: [--symlink destination] <path/to/javadocs/root>
# @DESCRIPTION:
# Installs javadoc documentation. This should be controlled by the doc use flag.
#
# @CODE
# Parameters:
# $1: optional --symlink creates to symlink like this for html
#            documentation bundles.
# $2: - The javadoc root directory.
#
# Examples:
#	java-pkg_dojavadoc docs/api
#	java-pkg_dojavadoc --symlink apidocs docs/api
# @CODE
java-pkg_dojavadoc() {
	debug-print-function ${FUNCNAME} $*

	# For html documentation bundles that link to Javadoc
	local symlink
	if [[ ${1} = --symlink ]]; then
		symlink=${2}
		shift 2
	fi

	local dir="$1"
	local dest=/usr/share/doc/${PF}/html

	# QA checks

	java-pkg_check-phase install
	java-pkg_init_paths_

	[[ -z "${dir}" ]] && die "Must specify a directory!"
	[[ ! -d "${dir}" ]] && die "${dir} does not exist, or isn't a directory!"
	if [[ ! -e "${dir}/index.html" ]]; then
		local msg="No index.html in javadoc directory"
		ewarn "${msg}"
		is-java-strict && die "${msg}"
	fi

	if [[ -e ${D}/${dest}/api ]]; then
		eerror "${dest} already exists. Will not overwrite."
		die "${dest}"
	fi

	# Renaming to match our directory layout

	local dir_to_install="${dir}"
	if [[ "$(basename "${dir}")" != "api" ]]; then
		dir_to_install="${T}/api"
		# TODO use doins
		cp -r "${dir}" "${dir_to_install}" || die "cp failed"
	fi

	# Actual installation
	java-pkg_dohtml -r "${dir_to_install}"

	# Let's make a symlink to the directory we have everything else under
	dosym ${dest}/api "${JAVA_PKG_SHAREPATH}/api" || die

	if [[ ${symlink} ]]; then
		debug-print "symlinking ${dest}/{api,${symlink}}"
		dosym ${dest}/{api,${symlink}} || die
	fi

	# Extra logging if enabled.
	if [[ -n ${JAVA_PKG_DEBUG} ]]; then
		einfo "Verbose logging for \"${FUNCNAME}\" function"
		einfo "Documentation destination: ${dest}"
		einfo "Directory to install: ${dir_to_install}"
		einfo "Complete command:"
		einfo "${FUNCNAME} ${@}"
	fi
}

# @FUNCTION: java-pkg_dosrc
# @USAGE: <path/to/sources> [...]
# @DESCRIPTION:
# Installs a zip containing the source for a package, so it can used in
# from IDEs like eclipse and netbeans.
# Ebuild needs to DEPEND on app-arch/zip to use this. It also should be controlled by USE=source.
#
# @CODE
# Example:
# java-pkg_dosrc src/*
# @CODE

# TODO change so it the arguments it takes are the base directories containing
# source -nichoj
#
# TODO should we be able to handle multiple calls to dosrc? -nichoj
#
# TODO maybe we can take an existing zip/jar? -nichoj
#
# FIXME apparently this fails if you give it an empty directories
java-pkg_dosrc() {
	debug-print-function ${FUNCNAME} $*

	[ ${#} -lt 1 ] && die "At least one argument needed"

	java-pkg_check-phase install

	[[ ${#} -lt 1 ]] && die "At least one argument needed"

	if ! [[ ${DEPEND} = *app-arch/zip* ]]; then
		local msg="${FUNCNAME} called without app-arch/zip in DEPEND"
		java-pkg_announce-qa-violation ${msg}
	fi

	java-pkg_init_paths_

	local zip_name="${PN}-src.zip"
	local zip_path="${T}/${zip_name}"
	local dir
	for dir in "${@}"; do
		local dir_parent=$(dirname "${dir}")
		local dir_name=$(basename "${dir}")
		pushd ${dir_parent} > /dev/null || die "problem entering ${dir_parent}"
		zip -q -r ${zip_path} ${dir_name} -i '*.java'
		local result=$?
		# 12 means zip has nothing to do
		if [[ ${result} != 12 && ${result} != 0 ]]; then
			die "failed to zip ${dir_name}"
		fi
		popd >/dev/null || die
	done

	# Install the zip
	INSDESTTREE=${JAVA_PKG_SOURCESPATH} \
		doins ${zip_path} || die "Failed to install source"

	JAVA_SOURCES="${JAVA_PKG_SOURCESPATH}/${zip_name}"

	# Extra logging if enabled.
	if [[ -n ${JAVA_PKG_DEBUG} ]]; then
		einfo "Verbose logging for \"${FUNCNAME}\" function"
		einfo "Zip filename created: ${zip_name}"
		einfo "Zip file destination: ${JAVA_PKG_SOURCESPATH}"
		einfo "Directories zipped: ${@}"
		einfo "Complete command:"
		einfo "${FUNCNAME} ${@}"
	fi

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_dolauncher
# @USAGE: <filename> [options]
# @DESCRIPTION:
# Make a wrapper script to lauch/start this package
# If necessary, the wrapper will switch to the appropriate VM.
#
# Can be called without parameters if the package installs only one jar
# that has the Main-class attribute set. The wrapper will be named ${PN}.
#
# @CODE
# Parameters:
# $1 - filename of launcher to create
# $2 - options, as follows:
#  --main the.main.class.to.start
#  --jar /the/jar/too/launch.jar or just <name>.jar
#  --java_args 'Extra arguments to pass to java'
#  --pkg_args 'Extra arguments to pass to the package'
#  --pwd Directory the launcher changes to before executing java
#  -into Directory to install the launcher to, instead of /usr/bin
#  -pre Prepend contents of this file to the launcher
# @CODE
java-pkg_dolauncher() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_check-phase install
	java-pkg_init_paths_

	if [[ ${#} = 0 ]]; then
		local name="${PN}"
	else
		local name="${1}"
		shift
	fi

	# TODO rename to launcher
	local target="${T}/${name}"
	local var_tmp="${T}/launcher_variables_tmp"
	local target_dir pre

	# Process the other the rest of the arguments
	while [[ -n "${1}" && -n "${2}" ]]; do
		local var="${1}" value="${2}"
		if [[ "${var:0:2}" == "--" ]]; then
			local var=${var:2}
			echo "gjl_${var}=\"${value}\"" >> "${var_tmp}"
			local gjl_${var}="${value}"
		elif [[ "${var}" == "-into" ]]; then
			target_dir="${value}"
		elif [[ "${var}" == "-pre" ]]; then
			pre="${value}"
		fi
		shift 2
	done

	# Test if no --jar and --main arguments were given and
	# in that case check if the package only installs one jar
	# and use that jar.
	if [[ -z "${gjl_jar}" && -z "${gjl_main}" ]]; then
		local cp="${JAVA_PKG_CLASSPATH}"
		if [[ "${cp/:}" = "${cp}" && "${cp%.jar}" != "${cp}" ]]; then
			echo "gjl_jar=\"${JAVA_PKG_CLASSPATH}\"" >> "${var_tmp}"
		else
			local msg="Not enough information to create a launcher given."
			msg="${msg} Please give --jar or --main argument to ${FUNCNAME}."
			die "${msg}"
		fi
	fi

	# Write the actual script
	echo "#!/bin/bash" > "${target}"
	if [[ -n "${pre}" ]]; then
		if [[ -f "${pre}" ]]; then
			cat "${pre}" >> "${target}"
		else
			die "-pre specified file '${pre}' does not exist"
		fi
	fi
	echo "gjl_package=${JAVA_PKG_NAME}" >> "${target}"
	cat "${var_tmp}" >> "${target}"
	rm -f "${var_tmp}"
	echo "source /usr/share/java-config-2/launcher/launcher.bash" >> "${target}"

	if [[ -n "${target_dir}" ]]; then
		DESTTREE="${target_dir}" dobin "${target}"
		local ret=$?
		return ${ret}
	else
		dobin "${target}"
	fi
}

# @FUNCTION: java-pkg_dowar
# @DESCRIPTION:
# Install war files.
# TODO document
java-pkg_dowar() {
	debug-print-function ${FUNCNAME} $*

	# Check for arguments
	[[ ${#} -lt 1 ]] && die "At least one argument needed"
	java-pkg_check-phase install

	java-pkg_init_paths_

	local war
	for war in $* ; do
		local warpath
		# TODO evaluate if we want to handle symlinks differently -nichoj
		# Check for symlink
		if [[ -L "${war}" ]] ; then
			cp "${war}" "${T}"
			warpath="${T}$(basename "${war}")"
		# Check for directory
		# TODO evaluate if we want to handle directories differently -nichoj
		elif [[ -d "${war}" ]] ; then
			echo "dowar: warning, skipping directory ${war}"
			continue
		else
			warpath="${war}"
		fi

		# Install those files like you mean it
		INSOPTIONS="-m 0644" \
			INSDESTTREE=${JAVA_PKG_WARDEST} \
			doins ${warpath}
	done
}

# @FUNCTION: java-pkg_recordjavadoc
# @INTERNAL
# @DESCRIPTION:
# Scan for JavaDocs, and record their existence in the package.env file

# TODO make sure this in the proper section
java-pkg_recordjavadoc()
{
	debug-print-function ${FUNCNAME} $*
	# the find statement is important
	# as some packages include multiple trees of javadoc
	JAVADOC_PATH="$(find ${D}/usr/share/doc/ -name allclasses-frame.html -printf '%h:')"
	# remove $D - TODO: check this is ok with all cases of the above
	JAVADOC_PATH="${JAVADOC_PATH//${D}}"
	if [[ -n "${JAVADOC_PATH}" ]] ; then
		debug-print "javadocs found in ${JAVADOC_PATH%:}"
		java-pkg_do_write_
	else
		debug-print "No javadocs found"
	fi
}


# @FUNCTION: java-pkg_jar-from
# @USAGE: [--build-only] [--with-dependencies] [--virtual] [--into dir] <package> [<package.jar>] [<destination.jar>]
# @DESCRIPTION:
# Makes a symlink to a jar from a certain package
# A lot of java packages include dependencies in a lib/ directory
# You can use this function to replace these bundled dependencies.
# The dependency is recorded into package.env DEPEND line, unless "--build-only"
# is passed as the very first argument, for jars that have to be present only
# at build time and are not needed on runtime (junit testing etc).
#
# @CODE
# Example: get all jars from xerces slot 2
#	java-pkg_jar-from xerces-2
#
# Example: get a specific jar from xerces slot 2
# 	java-pkg_jar-from xerces-2 xml-apis.jar
#
# Example: get a specific jar from xerces slot 2, and name it diffrently
# 	java-pkg_jar-from xerces-2 xml-apis.jar xml.jar
#
# Example: get junit.jar which is needed only for building
#	java-pkg_jar-from --build-only junit junit.jar
# @CODE
#
# @CODE
# Parameters
#	--build-only - makes the jar(s) not added into package.env DEPEND line.
#	  (assumed automatically when called inside src_test)
#	--with-dependencies - get jars also from requested package's dependencies
#	  transitively.
#	--virtual - Packages passed to this function are to be handled as virtuals
#	  and will not have individual jar dependencies recorded.
#	--into $dir - symlink jar(s) into $dir (must exist) instead of .
# $1 - Package to get jars from, or comma-separated list of packages in
#	case other parameters are not used.
# $2 - jar from package. If not specified, all jars will be used.
# $3 - When a single jar is specified, destination filename of the
#	symlink. Defaults to the name of the jar.
# @CODE

# TODO could probably be cleaned up a little
java-pkg_jar-from() {
	debug-print-function ${FUNCNAME} $*

	local build_only=""
	local destdir="."
	local deep=""
	local virtual=""
	local record_jar=""

	[[ "${EBUILD_PHASE}" == "test" ]] && build_only="build"

	while [[ "${1}" == --* ]]; do
		if [[ "${1}" = "--build-only" ]]; then
			build_only="build"
		elif [[ "${1}" = "--with-dependencies" ]]; then
			deep="--with-dependencies"
		elif [[ "${1}" = "--virtual" ]]; then
			virtual="true"
		elif [[ "${1}" = "--into" ]]; then
			destdir="${2}"
			shift
		else
			die "java-pkg_jar-from called with unknown parameter: ${1}"
		fi
		shift
	done

	local target_pkg="${1}" target_jar="${2}" destjar="${3}"

	[[ -z ${target_pkg} ]] && die "Must specify a package"

	if [[ "${EAPI}" == "1" ]]; then
		target_pkg="${target_pkg//:/-}"
	fi

	# default destjar to the target jar
	[[ -z "${destjar}" ]] && destjar="${target_jar}"

	local error_msg="There was a problem getting the classpath for ${target_pkg}."
	local classpath
	classpath="$(java-config ${deep} --classpath=${target_pkg})"
	[[ $? != 0 ]] && die ${error_msg}

	# When we have commas this functions is called to bring jars from multiple
	# packages. This affects recording of dependencencies performed later
	# which expects one package only, so we do it here.
	if [[ ${target_pkg} = *,* ]]; then
		for pkg in ${target_pkg//,/ }; do
			java-pkg_ensure-dep "${build_only}" "${pkg}"
			[[ -z "${build_only}" ]] && java-pkg_record-jar_ "${pkg}"
		done
		# setting this disables further record-jar_ calls later
		record_jar="true"
	else
		java-pkg_ensure-dep "${build_only}" "${target_pkg}"
	fi

	# Record the entire virtual as a dependency so that
	# no jars are missed.
	if [[ -z "${build_only}" && -n "${virtual}" ]]; then
		java-pkg_record-jar_ "${target_pkg}"
		# setting this disables further record-jars_ calls later
		record_jar="true"
	fi

	pushd ${destdir} > /dev/null \
		|| die "failed to change directory to ${destdir}"

	local jar
	for jar in ${classpath//:/ }; do
		local jar_name=$(basename "${jar}")
		if [[ ! -f "${jar}" ]] ; then
			debug-print "${jar} from ${target_pkg} does not exist"
			die "Installation problems with jars in ${target_pkg} - is it installed?"
		fi
		# If no specific target jar was indicated, link it
		if [[ -z "${target_jar}" ]] ; then
			[[ -f "${target_jar}" ]]  && rm "${target_jar}"
			ln -snf "${jar}" \
				|| die "Failed to make symlink from ${jar} to ${jar_name}"
			if [[ -z "${record_jar}" ]]; then
				if [[ -z "${build_only}" ]]; then
					java-pkg_record-jar_ "${target_pkg}" "${jar}"
				else
					java-pkg_record-jar_ --build-only "${target_pkg}" "${jar}"
				fi
			fi
		# otherwise, if the current jar is the target jar, link it
		elif [[ "${jar_name}" == "${target_jar}" ]] ; then
			[[ -f "${destjar}" ]]  && rm "${destjar}"
			ln -snf "${jar}" "${destjar}" \
				|| die "Failed to make symlink from ${jar} to ${destjar}"
			if [[ -z "${record_jar}" ]]; then
				if [[ -z "${build_only}" ]]; then
					java-pkg_record-jar_ "${target_pkg}" "${jar}"
				else
					java-pkg_record-jar_ --build-only "${target_pkg}" "${jar}"
				fi
			fi
			popd > /dev/null || die
			return 0
		fi
	done
	popd > /dev/null || die
	# if no target was specified, we're ok
	if [[ -z "${target_jar}" ]] ; then
		return 0
	# otherwise, die bitterly
	else
		die "Failed to find ${target_jar:-jar} in ${target_pkg}"
	fi
}

# @FUNCTION: java-pkg_jarfrom
# @DESCRIPTION:
# See java-pkg_jar-from
java-pkg_jarfrom() {
	java-pkg_jar-from "$@"
}

# @FUNCTION: java-pkg_getjars
# @USAGE: [--build-only] [--with-dependencies] <package1>[,<package2>...]
# @DESCRIPTION:
# Get the classpath provided by any number of packages
# Among other things, this can be passed to 'javac -classpath' or 'ant -lib'.
# The providing packages are recorded as dependencies into package.env DEPEND
# line, unless "--build-only" is passed as the very first argument, for jars
# that have to be present only at build time and are not needed on runtime
# (junit testing etc).
#
# @CODE
# Example: Get the classpath for xerces-2 and xalan,
#	java-pkg_getjars xerces-2,xalan
#
# Example Return:
#	/usr/share/xerces-2/lib/xml-apis.jar:/usr/share/xerces-2/lib/xmlParserAPIs.jar:/usr/share/xalan/lib/xalan.jar
#
#
# Parameters:
#	--build-only - makes the jar(s) not added into package.env DEPEND line.
#	  (assumed automatically when called inside src_test)
#	--with-dependencies - get jars also from requested package's dependencies
#	  transitively.
# $1 - list of packages to get jars from
#   (passed to java-config --classpath)
# @CODE
java-pkg_getjars() {
	debug-print-function ${FUNCNAME} $*

	local build_only=""
	local deep=""

	[[ "${EBUILD_PHASE}" == "test" ]] && build_only="build"

	while [[ "${1}" == --* ]]; do
		if [[ "${1}" = "--build-only" ]]; then
			build_only="build"
		elif [[ "${1}" = "--with-dependencies" ]]; then
			deep="--with-dependencies"
		else
			die "java-pkg_jar-from called with unknown parameter: ${1}"
		fi
		shift
	done

	[[ ${#} -ne 1 ]] && die "${FUNCNAME} takes only one argument besides --*"


	local pkgs="${1}"

	if [[ "${EAPI}" == "1" ]]; then
		pkgs="${pkgs//:/-}"
	fi

	jars="$(java-config ${deep} --classpath=${pkgs})"
	[[ $? != 0 ]] && die "java-config --classpath=${pkgs} failed"
	debug-print "${pkgs}:${jars}"

	for pkg in ${pkgs//,/ }; do
		java-pkg_ensure-dep "${build_only}" "${pkg}"
	done

	for pkg in ${pkgs//,/ }; do
		if [[ -z "${build_only}" ]]; then
			java-pkg_record-jar_ "${pkg}"
		else
			java-pkg_record-jar_ --build-only "${pkg}"
		fi
	done

	echo "${jars}"
}

# @FUNCTION: java-pkg_getjar
# @USAGE: [--build-only] [--virtual] <package> <jarfile>
# @DESCRIPTION:
# Get the complete path of a single jar from a package
# The providing package is recorded as runtime dependency into package.env
# DEPEND line, unless "--build-only" is passed as the very first argument, for
# jars that have to be present only at build time and are not needed on runtime
# (junit testing etc).
#
# @CODE
# Example:
#	java-pkg_getjar xerces-2 xml-apis.jar
# returns
#	/usr/share/xerces-2/lib/xml-apis.jar
#
# Parameters:
#	--build-only - makes the jar not added into package.env DEPEND line.
#	--virtual - Packages passed to this function are to be handled as virtuals
#	  and will not have individual jar dependencies recorded.
# $1 - package to use
# $2 - jar to get
# @CODE
java-pkg_getjar() {
	debug-print-function ${FUNCNAME} $*

	local build_only=""
	local virtual=""
	local record_jar=""

	[[ "${EBUILD_PHASE}" == "test" ]] && build_only="build"

	while [[ "${1}" == --* ]]; do
		if [[ "${1}" = "--build-only" ]]; then
			build_only="build"
		elif [[ "${1}" == "--virtual" ]]; then
			virtual="true"
		else
			die "java-pkg_getjar called with unknown parameter: ${1}"
		fi
		shift
	done

	[[ ${#} -ne 2 ]] && die "${FUNCNAME} takes only two arguments besides --*"

	local pkg="${1}" target_jar="${2}" jar

	if [[ "${EAPI}" == "1" ]]; then
		pkg="${pkg//:/-}"
	fi

	[[ -z ${pkg} ]] && die "Must specify package to get a jar from"
	[[ -z ${target_jar} ]] && die "Must specify jar to get"

	local error_msg="Could not find classpath for ${pkg}. Are you sure its installed?"
	local classpath
	classpath=$(java-config --classpath=${pkg})
	[[ $? != 0 ]] && die ${error_msg}

	java-pkg_ensure-dep "${build_only}" "${pkg}"

	# Record the package(Virtual) as a dependency and then set build_only
	# So that individual jars are not recorded.
	if [[ -n "${virtual}" ]]; then
		if [[ -z "${build_only}" ]]; then
			java-pkg_record-jar_ "${pkg}"
		else
			java-pkg_record-jar_ --build-only "${pkg}"
		fi
		record_jar="true"
	fi

	for jar in ${classpath//:/ }; do
		if [[ ! -f "${jar}" ]] ; then
			die "Installation problem with jar ${jar} in ${pkg} - is it installed?"
		fi

		if [[ "$(basename ${jar})" == "${target_jar}" ]] ; then
			# Only record jars that aren't build-only
			if [[ -z "${record_jar}" ]]; then
				if [[ -z "${build_only}" ]]; then
					java-pkg_record-jar_ "${pkg}" "${jar}"
				else
					java-pkg_record-jar_ --build-only "${pkg}" "${jar}"
				fi
			fi
			echo "${jar}"
			return 0
		fi
	done

	die "Could not find ${target_jar} in ${pkg}"
	return 1
}

# @FUNCTION: java-pkg_register-dependency
# @USAGE: <package>[,<package2>...] [<jarfile>]
# @DESCRIPTION:
# Registers runtime dependency on a package, list of packages, or a single jar
# from a package, into package.env DEPEND line. Can only be called in
# src_install phase.
# Intended for binary packages where you don't need to symlink the jars or get
# their classpath during build. As such, the dependencies only need to be
# specified in ebuild's RDEPEND, and should be omitted in DEPEND.
#
# @CODE
# Parameters:
# $1 - comma-separated list of packages, or a single package
# $2 - if param $1 is a single package, optionally specify the jar
#   to depend on
#
# Examples:
# Record the dependency on whole xerces-2 and xalan,
#	java-pkg_register-dependency xerces-2,xalan
#
# Record the dependency on ant.jar from ant-core
#	java-pkg_register-dependency ant-core ant.jar
# @CODE
#
# Note: Passing both list of packages as the first parameter AND specifying the
# jar as the second is not allowed and will cause the function to die. We assume
# that there's more chance one passes such combination as a mistake, than that
# there are more packages providing identically named jar without class
# collisions.
java-pkg_register-dependency() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_check-phase install

	[[ ${#} -gt 2 ]] && die "${FUNCNAME} takes at most two arguments"

	local pkgs="${1}"
	local jar="${2}"

	[[ -z "${pkgs}" ]] && die "${FUNCNAME} called with no package(s) specified"

	if [[ "${EAPI}" == "1" ]]; then
		pkgs="${pkgs//:/-}"
	fi

	if [[ -z "${jar}" ]]; then
		for pkg in ${pkgs//,/ }; do
			java-pkg_ensure-dep runtime "${pkg}"
			java-pkg_record-jar_ "${pkg}"
		done
	else
		[[ ${pkgs} == *,* ]] && \
			die "${FUNCNAME} called with both package list and jar name"
		java-pkg_ensure-dep runtime "${pkgs}"
		java-pkg_record-jar_ "${pkgs}" "${jar}"
	fi

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_register-optional-dependency
# @USAGE: <package>[,<package2>...] [<jarfile>]
# @DESCRIPTION:
# Registers optional runtime dependency on a package, list of packages, or a
# single jar from a package, into package.env OPTIONAL_DEPEND line. Can only be
# called in src_install phase.
# Intended for packages that can use other packages when those are in classpath.
# Will be put on classpath by launcher if they are installed. Typical case is
# JDBC implementations for various databases. It's better than having USE flag
# for each implementation triggering hard dependency.
#
# @CODE
# Parameters:
# $1 - comma-separated list of packages, or a single package
# $2 - if param $1 is a single package, optionally specify the jar to depend on
#
# Example:
# Record the optional dependency on some jdbc providers
#	java-pkg_register-optional-dependency jdbc-jaybird,jtds-1.2,jdbc-mysql
# @CODE
#
# Note: Passing both list of packages as the first parameter AND specifying the
# jar as the second is not allowed and will cause the function to die. We assume
# that there's more chance one passes such combination as a mistake, than that
# there are more packages providing identically named jar without class
# collisions.
java-pkg_register-optional-dependency() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_check-phase install

	[[ ${#} -gt 2 ]] && die "${FUNCNAME} takes at most two arguments"

	local pkgs="${1}"
	local jar="${2}"

	[[ -z "${pkgs}" ]] && die "${FUNCNAME} called with no package(s) specified"

	if [[ "${EAPI}" == "1" ]]; then
		pkgs="${pkgs//:/-}"
	fi

	if [[ -z "${jar}" ]]; then
		for pkg in ${pkgs//,/ }; do
			java-pkg_record-jar_ --optional "${pkg}"
		done
	else
		[[ ${pkgs} == *,* ]] && \
			die "${FUNCNAME} called with both package list and jar name"
		java-pkg_record-jar_ --optional "${pkgs}" "${jar}"
	fi

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_register-environment-variable
# @USAGE: <name> <value>
# @DESCRIPTION:
# Register an arbitrary environment variable into package.env. The gjl launcher
# for this package or any package depending on this will export it into
# environement before executing java command.
# Must only be called in src_install phase.
JAVA_PKG_EXTRA_ENV="${T}/java-pkg-extra-env"
JAVA_PKG_EXTRA_ENV_VARS=""
java-pkg_register-environment-variable() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_check-phase install

	[[ ${#} != 2 ]] && die "${FUNCNAME} takes two arguments"

	echo "${1}=\"${2}\"" >> ${JAVA_PKG_EXTRA_ENV}
	JAVA_PKG_EXTRA_ENV_VARS="${JAVA_PKG_EXTRA_ENV_VARS} ${1}"

	java-pkg_do_write_
}

# @FUNCTION: java-pkg_get-bootclasspath
# @USAGE: <version>
# @DESCRIPTION:
# Returns classpath of a given bootclasspath-providing package version.
#
# @param $1 - the version of bootclasspath (e.g. 1.5), 'auto' for bootclasspath
#             of the current JDK
java-pkg_get-bootclasspath() {
	local version="${1}"

	local bcp
	case "${version}" in
		auto)
			bcp="$(java-config -g BOOTCLASSPATH)"
			;;
		1.5)
			bcp="$(java-pkg_getjars --build-only gnu-classpath-0.98)"
			;;
		*)
			eerror "unknown parameter of java-pkg_get-bootclasspath"
			die "unknown parameter of java-pkg_get-bootclasspath"
			;;
	esac

	echo "${bcp}"
}


# This function reads stdin, and based on that input, figures out how to
# populate jars from the filesystem.
# Need to figure out a good way of making use of this, ie be able to use a
# string that was built instead of stdin
# NOTE: this isn't quite ready for primetime.
#java-pkg_populate-jars() {
#	local line
#
#	read line
#	while [[ -n "${line}" ]]; do
#		# Ignore comments
#		[[ ${line%%#*} == "" ]] && continue
#
#		# get rid of any spaces
#		line="${line// /}"
#
#		# format: path=jarinfo
#		local path=${line%%=*}
#		local jarinfo=${line##*=}
#
#		# format: jar@package
#		local jar=${jarinfo%%@*}.jar
#		local package=${jarinfo##*@}
#		if [[ -n ${replace_only} ]]; then
#			[[ ! -f $path ]] && die "No jar exists at ${path}"
#		fi
#		if [[ -n ${create_parent} ]]; then
#			local parent=$(dirname ${path})
#			mkdir -p "${parent}"
#		fi
#		java-pkg_jar-from "${package}" "${jar}" "${path}"
#
#		read line
#	done
#}

# @FUNCTION: java-pkg_find-normal-jars
# @USAGE: [<path/to/directory>]
# @DESCRIPTION:
# Find the files with suffix .jar file in the given directory (default: $WORKDIR)
java-pkg_find-normal-jars() {
	local dir=$1
	[[ "${dir}" ]] || dir="${WORKDIR}"
	local found
	for jar in $(find "${dir}" -name "*.jar" -type f); do
		echo "${jar}"
		found="true"
	done
	[[ "${found}" ]]
	return $?
}

# @FUNCTION: java-pkg_ensure-no-bundled-jars
# @DESCRIPTION:
# Try to locate bundled jar files in ${WORKDIR} and die if found.
# This function should be called after WORKDIR has been populated with symlink
# to system jar files or bundled jars removed.
java-pkg_ensure-no-bundled-jars() {
	debug-print-function ${FUNCNAME} $*

	local bundled_jars=$(java-pkg_find-normal-jars)
	if [[ -n ${bundled_jars} ]]; then
		echo "Bundled jars found:"
		local jar
		for jar in ${bundled_jars}; do
			echo $(pwd)${jar/./}
		done
		die "Bundled jars found!"
	fi
}

# @FUNCTION: java-pkg_ensure-vm-version-sufficient
# @INTERNAL
# @DESCRIPTION:
# Checks if we have a sufficient VM and dies if we don't.
java-pkg_ensure-vm-version-sufficient() {
	debug-print-function ${FUNCNAME} $*

	if ! java-pkg_is-vm-version-sufficient; then
		debug-print "VM is not suffient"
		eerror "Current Java VM cannot build this package"
		einfo "Please use java-config -S to set the correct one"
		die "Active Java VM cannot build this package"
	fi
}

# @FUNCTION: java-pkg_is-vm-version-sufficient
# @INTERNAL
# @DESCRIPTION:
# @RETURN: zero - VM is sufficient; non-zero - VM is not sufficient
java-pkg_is-vm-version-sufficient() {
	debug-print-function ${FUNCNAME} $*

	depend-java-query --is-sufficient "${DEPEND}" > /dev/null
	return $?
}

# @FUNCTION: java-pkg_ensure-vm-version-eq
# @INTERNAL
# @DESCRIPTION:
# Die if the current VM is not equal to the argument passed.
#
# @param $@ - Desired VM version to ensure
java-pkg_ensure-vm-version-eq() {
	debug-print-function ${FUNCNAME} $*

	if ! java-pkg_is-vm-version-eq $@ ; then
		debug-print "VM is not suffient"
		eerror "This package requires a Java VM version = $@"
		einfo "Please use java-config -S to set the correct one"
		die "Active Java VM too old"
	fi
}

# @FUNCTION: java-pkg_is-vm-version-eq
# @USAGE: <version>
# @INTERNAL
# @RETURN: zero - VM versions are equal; non-zero - VM version are not equal
java-pkg_is-vm-version-eq() {
	debug-print-function ${FUNCNAME} $*

	local needed_version="$@"

	[[ -z "${needed_version}" ]] && die "need an argument"

	local vm_version="$(java-pkg_get-vm-version)"

	vm_version="$(get_version_component_range 1-2 "${vm_version}")"
	needed_version="$(get_version_component_range 1-2 "${needed_version}")"

	if [[ -z "${vm_version}" ]]; then
		debug-print "Could not get JDK version from DEPEND"
		return 1
	else
		if [[ "${vm_version}" == "${needed_version}" ]]; then
			debug-print "Detected a JDK(${vm_version}) = ${needed_version}"
			return 0
		else
			debug-print "Detected a JDK(${vm_version}) != ${needed_version}"
			return 1
		fi
	fi
}

# @FUNCTION: java-pkg_ensure-vm-version-ge
# @INTERNAL
# @DESCRIPTION:
# Die if the current VM is not greater than the desired version
#
# @param $@ - VM version to compare current to
java-pkg_ensure-vm-version-ge() {
	debug-print-function ${FUNCNAME} $*

	if ! java-pkg_is-vm-version-ge "$@" ; then
		debug-print "vm is not suffient"
		eerror "This package requires a Java VM version >= $@"
		einfo "Please use java-config -S to set the correct one"
		die "Active Java VM too old"
	fi
}

# @FUNCTION: java-pkg_is-vm-version-ge
# @INTERNAL
# @DESCRIPTION:
# @CODE
# Parameters:
# $@ - VM version to compare current VM to
# @CODE
# @RETURN: zero - current VM version is greater than checked version;
# 	non-zero - current VM version is not greater than checked version
java-pkg_is-vm-version-ge() {
	debug-print-function ${FUNCNAME} $*

	local needed_version=$@
	local vm_version=$(java-pkg_get-vm-version)
	if [[ -z "${vm_version}" ]]; then
		debug-print "Could not get JDK version from DEPEND"
		return 1
	else
		if version_is_at_least "${needed_version}" "${vm_version}"; then
			debug-print "Detected a JDK(${vm_version}) >= ${needed_version}"
			return 0
		else
			debug-print "Detected a JDK(${vm_version}) < ${needed_version}"
			return 1
		fi
	fi
}

java-pkg_set-current-vm() {
	export GENTOO_VM=${1}
}

java-pkg_get-current-vm() {
	echo ${GENTOO_VM}
}

java-pkg_current-vm-matches() {
	has $(java-pkg_get-current-vm) ${@}
	return $?
}

# @FUNCTION: java-pkg_get-source
# @DESCRIPTION:
# Determines what source version should be used, for passing to -source.
# Unless you want to break things you probably shouldn't set _WANT_SOURCE
#
# @RETURN: string - Either the lowest possible source, or JAVA_PKG_WANT_SOURCE
java-pkg_get-source() {
	echo ${JAVA_PKG_WANT_SOURCE:-$(depend-java-query --get-lowest "${DEPEND} ${RDEPEND}")}
}

# @FUNCTION: java-pkg_get-target
# @DESCRIPTION:
# Determines what target version should be used, for passing to -target.
# If you don't care about lower versions, you can set _WANT_TARGET to the
# version of your JDK.
#
# @RETURN: string - Either the lowest possible target, or JAVA_PKG_WANT_TARGET
java-pkg_get-target() {
	echo ${JAVA_PKG_WANT_TARGET:-$(depend-java-query --get-lowest "${DEPEND} ${RDEPEND}")}
}

# @FUNCTION: java-pkg_get-javac
# @DESCRIPTION:
# Returns the compiler executable
java-pkg_get-javac() {
	debug-print-function ${FUNCNAME} $*

	java-pkg_init-compiler_
	local compiler="${GENTOO_COMPILER}"

	local compiler_executable
	if [[ "${compiler}" = "javac" ]]; then
		# nothing fancy needs to be done for javac
		compiler_executable="javac"
	else
		# for everything else, try to determine from an env file

		local compiler_env="/usr/share/java-config-2/compiler/${compiler}"
		if [[ -f ${compiler_env} ]]; then
			local old_javac=${JAVAC}
			unset JAVAC
			# try to get value of JAVAC
			compiler_executable="$(source ${compiler_env} 1>/dev/null 2>&1; echo ${JAVAC})"
			export JAVAC=${old_javac}

			if [[ -z ${compiler_executable} ]]; then
				die "JAVAC is empty or undefined in ${compiler_env}"
			fi

			# check that it's executable
			if [[ ! -x ${compiler_executable} ]]; then
				die "${compiler_executable} doesn't exist, or isn't executable"
			fi
		else
			die "Could not find environment file for ${compiler}"
		fi
	fi
	echo ${compiler_executable}
}

# @FUNCTION: java-pkg_javac-args
# @DESCRIPTION:
# If an ebuild uses javac directly, instead of using ejavac, it should call this
# to know what -source/-target to use.
#
# @RETURN: string - arguments to pass to javac, complete with -target and -source
java-pkg_javac-args() {
	debug-print-function ${FUNCNAME} $*

	local want_source="$(java-pkg_get-source)"
	local want_target="$(java-pkg_get-target)"

	local source_str="-source ${want_source}"
	local target_str="-target ${want_target}"

	debug-print "want source: ${want_source}"
	debug-print "want target: ${want_target}"

	if [[ -z "${want_source}" || -z "${want_target}" ]]; then
		die "Could not find valid -source/-target values for javac"
	else
		echo "${source_str} ${target_str}"
	fi
}

# @FUNCTION: java-pkg_get-jni-cflags
# @DESCRIPTION:
# Echos the CFLAGS for JNI compilations
java-pkg_get-jni-cflags() {
	local flags="-I${JAVA_HOME}/include"

	local platform="linux"
	use elibc_FreeBSD && platform="freebsd"

	# TODO do a check that the directories are valid
	flags="${flags} -I${JAVA_HOME}/include/${platform}"

	echo ${flags}
}

java-pkg_ensure-gcj() {
	# was enforcing sys-devel/gcc[gcj]
	die "${FUNCNAME} was removed. Use use-deps available as of EAPI 2 instead. #261562"
}

java-pkg_ensure-test() {
	# was enforcing USE=test if FEATURES=test
	die "${FUNCNAME} was removed. Package mangers handle this already. #278965"
}

# @FUNCTION: java-pkg_register-ant-task
# @USAGE: [--version x.y] [<name>]
# @DESCRIPTION:
# Register this package as ant task, so that ant will load it when no specific
# ANT_TASKS are specified. Note that even without this registering, all packages
# specified in ANT_TASKS will be loaded. Mostly used by the actual ant tasks
# packages, but can be also used by other ebuilds that used to symlink their
# .jar into /usr/share/ant-core/lib to get autoloaded, for backwards
# compatibility.
#
# @CODE
# Parameters
# --version x.y Register only for ant version x.y (otherwise for any ant
#		version). Used by the ant-* packages to prevent loading of mismatched
#		ant-core ant tasks after core was updated, before the tasks are updated,
#		without a need for blockers.
# $1 Name to register as. Defaults to JAVA_PKG_NAME ($PN[-$SLOT])
# @CODE
java-pkg_register-ant-task() {
	local TASKS_DIR="tasks"

	# check for --version x.y parameters
	while [[ -n "${1}" && -n "${2}" ]]; do
		local var="${1#--}"
		local val="${2}"
		if [[ "${var}" == "version" ]]; then
			TASKS_DIR="tasks-${val}"
		else
			die "Unknown parameter passed to java-pkg_register-ant-tasks: ${1} ${2}"
		fi
		shift 2
	done

	local TASK_NAME="${1:-${JAVA_PKG_NAME}}"

	dodir /usr/share/ant/${TASKS_DIR}
	touch "${D}/usr/share/ant/${TASKS_DIR}/${TASK_NAME}"
}

# @FUNCTION: java-pkg_ant-tasks-depend
# @INTERNAL
# @DESCRIPTION:
# Translates the WANT_ANT_TASKS variable into valid dependencies.
java-pkg_ant-tasks-depend() {
	debug-print-function ${FUNCNAME} ${WANT_ANT_TASKS}

	if [[ -n "${WANT_ANT_TASKS}" ]]; then
		local DEP=""
		for i in ${WANT_ANT_TASKS}
		do
			if [[ ${i} = ant-* ]]; then
				DEP="${DEP}dev-java/${i} "
			elif [[ ${i} = */*:* ]]; then
				DEP="${DEP}${i} "
			else
				echo "Invalid atom in WANT_ANT_TASKS: ${i}"
				return 1
			fi
		done
		echo ${DEP}
		return 0
	else
		return 0
	fi
}


# @FUNCTION: ejunit_
# @INTERNAL
# @DESCRIPTION:
# Internal Junit wrapper function. Makes it easier to run the tests and checks for
# dev-java/junit in DEPEND. Launches the tests using junit.textui.TestRunner.
# @CODE
# Parameters:
# $1 - junit package (junit or junit-4)
# $2 - -cp or -classpath
# $3 - classpath; junit and recorded dependencies get appended
# $@ - the rest of the parameters are passed to java
# @CODE
ejunit_() {
	debug-print-function ${FUNCNAME} $*

	local pkgs
	if [[ -f ${JAVA_PKG_DEPEND_FILE} ]]; then
		for atom in $(cat ${JAVA_PKG_DEPEND_FILE} | tr : ' '); do
			pkgs=${pkgs},$(echo ${atom} | sed -re "s/^.*@//")
		done
	fi

	local junit=${1}
	shift 1

	local cp=$(java-pkg_getjars --with-dependencies ${junit}${pkgs})
	if [[ ${1} = -cp || ${1} = -classpath ]]; then
		cp="${2}:${cp}"
		shift 2
	else
		cp=".:${cp}"
	fi

	local runner=junit.textui.TestRunner
	if [[ "${junit}" == "junit-4" ]] ; then
		runner=org.junit.runner.JUnitCore
	fi
	debug-print "Calling: java -cp \"${cp}\" -Djava.io.tmpdir=\"${T}\" -Djava.awt.headless=true ${runner} ${@}"
	java -cp "${cp}" -Djava.io.tmpdir="${T}/" -Djava.awt.headless=true ${runner} "${@}" || die "Running junit failed"
}

# @FUNCTION: ejunit
# @DESCRIPTION:
# Junit wrapper function. Makes it easier to run the tests and checks for
# dev-java/junit in DEPEND. Launches the tests using org.junit.runner.JUnitCore.
#
# @CODE
# Parameters:
# $1 - -cp or -classpath
# $2 - classpath; junit and recorded dependencies get appended
# $@ - the rest of the parameters are passed to java
#
# Examples:
# ejunit -cp build/classes org.blinkenlights.jid3.test.AllTests
# ejunit org.blinkenlights.jid3.test.AllTests
# ejunit org.blinkenlights.jid3.test.FirstTest org.blinkenlights.jid3.test.SecondTest
# @CODE
ejunit() {
	debug-print-function ${FUNCNAME} $*

	ejunit_ "junit" "${@}"
}

# @FUNCTION: ejunit4
# @DESCRIPTION:
# Junit4 wrapper function. Makes it easier to run the tests and checks for
# dev-java/junit:4 in DEPEND. Launches the tests using junit.textui.TestRunner.
#
# @CODE
# Parameters:
# $1 - -cp or -classpath
# $2 - classpath; junit and recorded dependencies get appended
# $@ - the rest of the parameters are passed to java
#
# Examples:
# ejunit4 -cp build/classes org.blinkenlights.jid3.test.AllTests
# ejunit4 org.blinkenlights.jid3.test.AllTests
# ejunit4 org.blinkenlights.jid3.test.FirstTest \
#         org.blinkenlights.jid3.test.SecondTest
# @CODE
ejunit4() {
	debug-print-function ${FUNCNAME} $*

	ejunit_ "junit-4" "${@}"
}

# @FUNCTION: java-utils-2_src_prepare
# @DESCRIPTION:
# src_prepare Searches for bundled jars
# Don't call directly, but via java-pkg-2_src_prepare!
java-utils-2_src_prepare() {
	java-pkg_func-exists java_prepare && java_prepare

	# Check for files in JAVA_RM_FILES array.
	if [[ ${JAVA_RM_FILES[@]} ]]; then
		debug-print "$FUNCNAME: removing unneeded files"
		java-pkg_rm_files "${JAVA_RM_FILES[@]}"
	fi

	if is-java-strict; then
		echo "Searching for bundled jars:"
		java-pkg_find-normal-jars || echo "None found."
		echo "Searching for bundled classes (no output if none found):"
		find "${WORKDIR}" -name "*.class"
		echo "Search done."
	fi
}

# @FUNCTION: java-utils-2_pkg_preinst
# @DESCRIPTION:
# pkg_preinst Searches for missing and unneeded dependencies
# Don't call directly, but via java-pkg-2_pkg_preinst!
java-utils-2_pkg_preinst() {
	if is-java-strict; then
		if [[ ! -e "${JAVA_PKG_ENV}" ]] || has ant-tasks ${INHERITED}; then
			return
		fi

		if has_version dev-java/java-dep-check; then
			local output=$(GENTOO_VM= java-dep-check --image "${D}" "${JAVA_PKG_ENV}")
			[[ ${output} ]] && ewarn "${output}"
		else
			eerror "Install dev-java/java-dep-check for dependency checking"
		fi
	fi
}

# @FUNCTION: eant
# @USAGE: <ant_build_target(s)>
# @DESCRIPTION:
# Ant wrapper function. Will use the appropriate compiler, based on user-defined
# compiler. Will also set proper ANT_TASKS from the variable ANT_TASKS,
# variables:
#
# @CODE
# Variables:
# EANT_GENTOO_CLASSPATH - calls java-pkg_getjars for the value and adds to the
# 		gentoo.classpath property. Be sure to call java-ant_rewrite-classpath in src_unpack.
# EANT_NEEDS_TOOLS - add tools.jar to the gentoo.classpath. Should only be used
# 		for build-time purposes, the dependency is not recorded to
# 		package.env!
# ANT_TASKS - used to determine ANT_TASKS before calling Ant.
# @CODE
eant() {
	debug-print-function ${FUNCNAME} $*

	if [[ ${EBUILD_PHASE} = compile ]]; then
		java-ant-2_src_configure
	fi

	if ! has java-ant-2 ${INHERITED}; then
		local msg="You should inherit java-ant-2 when using eant"
		java-pkg_announce-qa-violation "${msg}"
	fi

	local antflags="-Dnoget=true -Dmaven.mode.offline=true -Dbuild.sysclasspath=ignore"

	java-pkg_init-compiler_
	local compiler="${GENTOO_COMPILER}"

	local compiler_env="${JAVA_PKG_COMPILER_DIR}/${compiler}"
	local build_compiler="$(source ${compiler_env} 1>/dev/null 2>&1; echo ${ANT_BUILD_COMPILER})"
	if [[ "${compiler}" != "javac" && -z "${build_compiler}" ]]; then
		die "ANT_BUILD_COMPILER undefined in ${compiler_env}"
	fi

	if [[ ${compiler} != "javac" ]]; then
		antflags="${antflags} -Dbuild.compiler=${build_compiler}"
		# Figure out any extra stuff to put on the classpath for compilers aside
		# from javac
		# ANT_BUILD_COMPILER_DEPS should be something that could be passed to
		# java-config -p
		local build_compiler_deps="$(source ${JAVA_PKG_COMPILER_DIR}/${compiler} 1>/dev/null 2>&1; echo ${ANT_BUILD_COMPILER_DEPS})"
		if [[ -n ${build_compiler_deps} ]]; then
			antflags="${antflags} -lib $(java-config -p ${build_compiler_deps})"
		fi
	fi

	for arg in "${@}"; do
		if [[ ${arg} = -lib ]]; then
			if is-java-strict; then
				eerror "You should not use the -lib argument to eant because it will fail"
				eerror "with JAVA_PKG_STRICT. Please use for example java-pkg_jar-from"
				eerror "or ant properties to make dependencies available."
				eerror "For ant tasks use WANT_ANT_TASKS or ANT_TASKS from."
				eerror "split ant (>=dev-java/ant-core-1.7)."
				die "eant -lib is deprecated/forbidden"
			else
				echo "eant -lib is deprecated. Turn JAVA_PKG_STRICT on for"
				echo "more info."
			fi
		fi
	done

	# parse WANT_ANT_TASKS for atoms
	local want_ant_tasks
	for i in ${WANT_ANT_TASKS}; do
		if [[ ${i} = */*:* ]]; then
			i=${i#*/}
			i=${i%:0}
			want_ant_tasks+="${i/:/-} "
		else
			want_ant_tasks+="${i} "
		fi
	done
	# default ANT_TASKS to WANT_ANT_TASKS, if ANT_TASKS is not set explicitly
	ANT_TASKS="${ANT_TASKS:-${want_ant_tasks% }}"

	# override ANT_TASKS with JAVA_PKG_FORCE_ANT_TASKS if it's set
	ANT_TASKS="${JAVA_PKG_FORCE_ANT_TASKS:-${ANT_TASKS}}"

	# if ant-tasks is not set by ebuild or forced, use none
	ANT_TASKS="${ANT_TASKS:-none}"

	# at this point, ANT_TASKS should be "all", "none" or explicit list
	if [[ "${ANT_TASKS}" == "all" ]]; then
		einfo "Using all available ANT_TASKS"
	elif [[ "${ANT_TASKS}" == "none" ]]; then
		einfo "Disabling all optional ANT_TASKS"
	else
		einfo "Using following ANT_TASKS: ${ANT_TASKS}"
	fi

	export ANT_TASKS

	[[ -n ${JAVA_PKG_DEBUG} ]] && antflags="${antflags} --execdebug -debug"
	[[ -n ${PORTAGE_QUIET} ]] && antflags="${antflags} -q"

	local gcp="${EANT_GENTOO_CLASSPATH}"
	local getjarsarg=""

	if [[ ${EBUILD_PHASE} = "test" ]]; then
		antflags="${antflags} -DJunit.present=true"
		getjarsarg="--with-dependencies"

		local re="\bant-junit4?([-:]\S+)?\b"
		[[ ${ANT_TASKS} =~ ${re} ]] && gcp+=" ${BASH_REMATCH[0]}"
	else
		antflags="${antflags} -Dmaven.test.skip=true"
	fi

	local cp

	for atom in ${gcp}; do
		cp+=":$(java-pkg_getjars ${getjarsarg} ${atom})"
	done

	[[ ${EANT_NEEDS_TOOLS} ]] && cp+=":$(java-config --tools)"
	[[ ${EANT_GENTOO_CLASSPATH_EXTRA} ]] && cp+=":${EANT_GENTOO_CLASSPATH_EXTRA}"

	if [[ ${cp#:} ]]; then
		# It seems ant does not like single quotes around ${cp}
		antflags="${antflags} -Dgentoo.classpath=\"${cp#:}\""
	fi

	[[ -n ${JAVA_PKG_DEBUG} ]] && echo ant ${antflags} "${@}"
	debug-print "Calling ant (GENTOO_VM: ${GENTOO_VM}): ${antflags} ${@}"
	ant ${antflags} "${@}" || die "eant failed"
}

# @FUNCTION: ejavac
# @USAGE: <javac_arguments>
# @DESCRIPTION:
# Javac wrapper function. Will use the appropriate compiler, based on
# /etc/java-config/compilers.conf
ejavac() {
	debug-print-function ${FUNCNAME} $*

	local compiler_executable
	compiler_executable=$(java-pkg_get-javac)

	local javac_args
	javac_args="$(java-pkg_javac-args)"

	if [[ -n ${JAVA_PKG_DEBUG} ]]; then
		einfo "Verbose logging for \"${FUNCNAME}\" function"
		einfo "Compiler executable: ${compiler_executable}"
		einfo "Extra arguments: ${javac_args}"
		einfo "Complete command:"
		einfo "${compiler_executable} ${javac_args} ${@}"
	fi

	ebegin "Compiling"
	${compiler_executable} ${javac_args} "${@}" || die "ejavac failed"
}

# @FUNCTION: ejavadoc
# @USAGE: <javadoc_arguments>
# @DESCRIPTION:
# javadoc wrapper function. Will set some flags based on the VM version
# due to strict javadoc rules in 1.8.
ejavadoc() {
	debug-print-function ${FUNCNAME} $*

	local javadoc_args=""

	if java-pkg_is-vm-version-ge "1.8" ; then
		javadoc_args="-Xdoclint:none"
	fi

	if [[ -n ${JAVA_PKG_DEBUG} ]]; then
		einfo "Verbose logging for \"${FUNCNAME}\" function"
		einfo "Javadoc executable: javadoc"
		einfo "Extra arguments: ${javadoc_args}"
		einfo "Complete command:"
		einfo "javadoc ${javadoc_args} ${@}"
	fi

	ebegin "Generating JavaDoc"
	javadoc ${javadoc_args} "${@}" || die "ejavadoc failed"
}

# @FUNCTION: java-pkg_filter-compiler
# @USAGE: <compiler(s)_to_filter>
# @DESCRIPTION:
# Used to prevent the use of some compilers. Should be used in src_compile.
# Basically, it just appends onto JAVA_PKG_FILTER_COMPILER
java-pkg_filter-compiler() {
	JAVA_PKG_FILTER_COMPILER="${JAVA_PKG_FILTER_COMPILER} $@"
}

# @FUNCTION: java-pkg_force-compiler
# @USAGE: <compiler(s)_to_force>
# @DESCRIPTION:
# Used to force the use of particular compilers. Should be used in src_compile.
# A common use of this would be to force ecj-3.1 to be used on amd64, to avoid
# OutOfMemoryErrors that may come up.
java-pkg_force-compiler() {
	JAVA_PKG_FORCE_COMPILER="$@"
}

# @FUNCTION: use_doc
# @DESCRIPTION:
#
# Helper function for getting ant to build javadocs. If the user has USE=doc,
# then 'javadoc' or the argument are returned. Otherwise, there is no return.
#
# The output of this should be passed to ant.
# @CODE
# Parameters:
# $@ - Option value to return. Defaults to 'javadoc'
#
# Examples:
# build javadocs by calling 'javadoc' target
#	eant $(use_doc)
#
# build javadocs by calling 'apidoc' target
#	eant $(use_doc apidoc)
# @CODE
# @RETURN string - Name of the target to create javadocs
use_doc() {
	use doc && echo ${@:-javadoc}
}


# @FUNCTION: java-pkg_init
# @INTERNAL
# @DESCRIPTION:
# The purpose of this function, as the name might imply, is to initialize the
# Java environment. It ensures that that there aren't any environment variables
# that'll muss things up. It initializes some variables, which are used
# internally. And most importantly, it'll switch the VM if necessary.
#
# This shouldn't be used directly. Instead, java-pkg and java-pkg-opt will
# call it during each of the phases of the merge process.
java-pkg_init() {
	debug-print-function ${FUNCNAME} $*

	# Don't set up build environment if installing from binary. #206024 #258423
	[[ "${MERGE_TYPE}" == "binary" ]] && return
	# Also try Portage's nonstandard EMERGE_FROM for old EAPIs, if it doesn't
	# work nothing is lost.
	has ${EAPI:-0} 0 1 2 3 && [[ "${EMERGE_FROM}" == "binary" ]] && return

	unset JAVAC
	unset JAVA_HOME

	java-config --help >/dev/null || {
		eerror ""
		eerror "Can't run java-config --help"
		eerror "Have you upgraded python recently but haven't"
		eerror "run python-updater yet?"
		die "Can't run java-config --help"
	}

	# People do all kinds of weird things.
	# https://forums.gentoo.org/viewtopic-p-3943166.html
	local silence="${SILENCE_JAVA_OPTIONS_WARNING}"
	local accept="${I_WANT_GLOBAL_JAVA_OPTIONS}"
	if [[ -n ${_JAVA_OPTIONS} && -z ${accept} && -z ${silence} ]]; then
		ewarn "_JAVA_OPTIONS changes what java -version outputs at least for"
		ewarn "sun-jdk vms and and as such break configure scripts that"
		ewarn "use it (for example app-office/openoffice) so we filter it out."
		ewarn "Use SILENCE_JAVA_OPTIONS_WARNING=true in the environment (use"
		ewarn "make.conf for example) to silence this warning or"
		ewarn "I_WANT_GLOBAL_JAVA_OPTIONS to not filter it."
	fi

	if [[ -z ${accept} ]]; then
		# export _JAVA_OPTIONS= doesn't work because it will show up in java
		# -version output
		unset _JAVA_OPTIONS
		# phase hooks make this run many times without this
		I_WANT_GLOBAL_JAVA_OPTIONS="true"
	fi

	if java-pkg_func-exists ant_src_unpack; then
		java-pkg_announce-qa-violation "Using old ant_src_unpack. Should be src_unpack"
	fi

	java-pkg_switch-vm
	PATH=${JAVA_HOME}/bin:${PATH}

	# TODO we will probably want to set JAVAC and JAVACFLAGS

	# Do some QA checks
	java-pkg_check-jikes

	# Can't use unset here because Portage does not save the unset
	# see https://bugs.gentoo.org/show_bug.cgi?id=189417#c11

	# When users have crazy classpaths some packages can fail to compile.
	# and everything should work with empty CLASSPATH.
	# This also helps prevent unexpected dependencies on random things
	# from the CLASSPATH.
	export CLASSPATH=

	# Unset external ANT_ stuff
	export ANT_TASKS=
	export ANT_OPTS=
	export ANT_RESPECT_JAVA_HOME=
}

# @FUNCTION: java-pkg-init-compiler_
# @INTERNAL
# @DESCRIPTION:
# This function attempts to figure out what compiler should be used. It does
# this by reading the file at JAVA_PKG_COMPILERS_CONF, and checking the
# COMPILERS variable defined there.
# This can be overridden by a list in JAVA_PKG_FORCE_COMPILER
#
# It will go through the list of compilers, and verify that it supports the
# target and source that are needed. If it is not suitable, then the next
# compiler is checked. When JAVA_PKG_FORCE_COMPILER is defined, this checking
# isn't done.
#
# Once the which compiler to use has been figured out, it is set to
# GENTOO_COMPILER.
#
# If you hadn't guessed, JAVA_PKG_FORCE_COMPILER is for testing only.
#
# If the user doesn't defined anything in JAVA_PKG_COMPILERS_CONF, or no
# suitable compiler was found there, then the default is to use javac provided
# by the current VM.
#
#
# @RETURN name of the compiler to use
java-pkg_init-compiler_() {
	debug-print-function ${FUNCNAME} $*

	if [[ -n ${GENTOO_COMPILER} ]]; then
		debug-print "GENTOO_COMPILER already set"
		return
	fi

	local compilers;
	if [[ -z ${JAVA_PKG_FORCE_COMPILER} ]]; then
		compilers="$(source ${JAVA_PKG_COMPILERS_CONF} 1>/dev/null 2>&1; echo	${COMPILERS})"
	else
		compilers=${JAVA_PKG_FORCE_COMPILER}
	fi

	debug-print "Read \"${compilers}\" from ${JAVA_PKG_COMPILERS_CONF}"

	# Figure out if we should announce what compiler we're using
	local compiler
	for compiler in ${compilers}; do
		debug-print "Checking ${compiler}..."
		# javac should always be alright
		if [[ ${compiler} = "javac" ]]; then
			debug-print "Found javac... breaking"
			export GENTOO_COMPILER="javac"
			break
		fi

		if has ${compiler} ${JAVA_PKG_FILTER_COMPILER}; then
			if [[ -z ${JAVA_PKG_FORCE_COMPILER} ]]; then
				einfo "Filtering ${compiler}" >&2
				continue
			fi
		fi

		# for non-javac, we need to make sure it supports the right target and
		# source
		local compiler_env="${JAVA_PKG_COMPILER_DIR}/${compiler}"
		if [[ -f ${compiler_env} ]]; then
			local desired_target="$(java-pkg_get-target)"
			local desired_source="$(java-pkg_get-source)"


			# Verify that the compiler supports target
			local supported_target=$(source ${compiler_env} 1>/dev/null 2>&1; echo ${SUPPORTED_TARGET})
			if ! has ${desired_target} ${supported_target}; then
				ewarn "${compiler} does not support -target ${desired_target},	skipping"
				continue
			fi

			# Verify that the compiler supports source
			local supported_source=$(source ${compiler_env} 1>/dev/null 2>&1; echo ${SUPPORTED_SOURCE})
			if ! has ${desired_source} ${supported_source}; then
				ewarn "${compiler} does not support -source ${desired_source}, skipping"
				continue
			fi

			# if you get here, then the compiler should be good to go
			export GENTOO_COMPILER="${compiler}"
			break
		else
			ewarn "Could not find configuration for ${compiler}, skipping"
			ewarn "Perhaps it is not installed?"
			continue
		fi
	done

	# If it hasn't been defined already, default to javac
	if [[ -z ${GENTOO_COMPILER} ]]; then
		if [[ -n ${compilers} ]]; then
			einfo "No suitable compiler found: defaulting to JDK default for compilation" >&2
		else
			# probably don't need to notify users about the default.
			:;#einfo "Defaulting to javac for compilation" >&2
		fi
		if java-config -g GENTOO_COMPILER 2> /dev/null; then
			export GENTOO_COMPILER=$(java-config -g GENTOO_COMPILER)
		else
			export GENTOO_COMPILER=javac
		fi
	else
		einfo "Using ${GENTOO_COMPILER} for compilation" >&2
	fi

}

# @FUNCTION: init_paths_
# @INTERNAL
# @DESCRIPTION:
# Initializes some variables that will be used. These variables are mostly used
# to determine where things will eventually get installed.
java-pkg_init_paths_() {
	debug-print-function ${FUNCNAME} $*

	local pkg_name
	if [[ "${SLOT%/*}" == "0" ]] ; then
		JAVA_PKG_NAME="${PN}"
	else
		JAVA_PKG_NAME="${PN}-${SLOT%/*}"
	fi

	JAVA_PKG_SHAREPATH="${DESTTREE}/share/${JAVA_PKG_NAME}"
	JAVA_PKG_SOURCESPATH="${JAVA_PKG_SHAREPATH}/sources/"
	JAVA_PKG_ENV="${D}${JAVA_PKG_SHAREPATH}/package.env"
	JAVA_PKG_VIRTUALS_PATH="${DESTTREE}/share/java-config-2/virtuals"
	JAVA_PKG_VIRTUAL_PROVIDER="${D}/${JAVA_PKG_VIRTUALS_PATH}/${JAVA_PKG_NAME}"

	[[ -z "${JAVA_PKG_JARDEST}" ]] && JAVA_PKG_JARDEST="${JAVA_PKG_SHAREPATH}/lib"
	[[ -z "${JAVA_PKG_LIBDEST}" ]] && JAVA_PKG_LIBDEST="${DESTTREE}/$(get_libdir)/${JAVA_PKG_NAME}"
	[[ -z "${JAVA_PKG_WARDEST}" ]] && JAVA_PKG_WARDEST="${JAVA_PKG_SHAREPATH}/webapps"

	# TODO maybe only print once?
	debug-print "JAVA_PKG_SHAREPATH: ${JAVA_PKG_SHAREPATH}"
	debug-print "JAVA_PKG_ENV: ${JAVA_PKG_ENV}"
	debug-print "JAVA_PKG_JARDEST: ${JAVA_PKG_JARDEST}"
	debug-print "JAVA_PKG_LIBDEST: ${JAVA_PKG_LIBDEST}"
	debug-print "JAVA_PKG_WARDEST: ${JAVA_PKG_WARDEST}"
}

# @FUNCTION: java-pkg_do_write_
# @INTERNAL
# @DESCRIPTION:
# Writes the package.env out to disk.
#
# TODO change to do-write, to match everything else
java-pkg_do_write_() {
	debug-print-function ${FUNCNAME} $*
	java-pkg_init_paths_
	# Create directory for package.env
	dodir "${JAVA_PKG_SHAREPATH}"
	if [[ -n "${JAVA_PKG_CLASSPATH}" || -n "${JAVA_PKG_LIBRARY}" || -f \
			"${JAVA_PKG_DEPEND_FILE}" || -f \
			"${JAVA_PKG_OPTIONAL_DEPEND_FILE}" ]]; then
		# Create package.env
		(
			echo "DESCRIPTION=\"${DESCRIPTION}\""
			echo "GENERATION=\"2\""
			echo "SLOT=\"${SLOT}\""
			echo "CATEGORY=\"${CATEGORY}\""
			echo "PVR=\"${PVR}\""

			[[ -n "${JAVA_PKG_CLASSPATH}" ]] && echo "CLASSPATH=\"${JAVA_PKG_CLASSPATH}\""
			[[ -n "${JAVA_PKG_LIBRARY}" ]] && echo "LIBRARY_PATH=\"${JAVA_PKG_LIBRARY}\""
			[[ -n "${JAVA_PROVIDE}" ]] && echo "PROVIDES=\"${JAVA_PROVIDE}\""
			[[ -f "${JAVA_PKG_DEPEND_FILE}" ]] \
				&& echo "DEPEND=\"$(sort -u "${JAVA_PKG_DEPEND_FILE}" | tr '\n' ':')\""
			[[ -f "${JAVA_PKG_OPTIONAL_DEPEND_FILE}" ]] \
				&& echo "OPTIONAL_DEPEND=\"$(sort -u "${JAVA_PKG_OPTIONAL_DEPEND_FILE}" | tr '\n' ':')\""
			echo "VM=\"$(echo ${RDEPEND} ${DEPEND} | sed -e 's/ /\n/g' | sed -n -e '/virtual\/\(jre\|jdk\)/ { p;q }')\"" # TODO cleanup !
			[[ -f "${JAVA_PKG_BUILD_DEPEND_FILE}" ]] \
				&& echo "BUILD_DEPEND=\"$(sort -u "${JAVA_PKG_BUILD_DEPEND_FILE}" | tr '\n' ':')\""
		) > "${JAVA_PKG_ENV}"

		# register target/source
		local target="$(java-pkg_get-target)"
		local source="$(java-pkg_get-source)"
		[[ -n ${target} ]] && echo "TARGET=\"${target}\"" >> "${JAVA_PKG_ENV}"
		[[ -n ${source} ]] && echo "SOURCE=\"${source}\"" >> "${JAVA_PKG_ENV}"

		# register javadoc info
		[[ -n ${JAVADOC_PATH} ]] && echo "JAVADOC_PATH=\"${JAVADOC_PATH}\"" \
			>> ${JAVA_PKG_ENV}
		# register source archives
		[[ -n ${JAVA_SOURCES} ]] && echo "JAVA_SOURCES=\"${JAVA_SOURCES}\"" \
			>> ${JAVA_PKG_ENV}


		echo "MERGE_VM=\"${GENTOO_VM}\"" >> "${JAVA_PKG_ENV}"
		[[ -n ${GENTOO_COMPILER} ]] && echo "MERGE_COMPILER=\"${GENTOO_COMPILER}\"" >> "${JAVA_PKG_ENV}"

		# extra env variables
		if [[ -n "${JAVA_PKG_EXTRA_ENV_VARS}" ]]; then
			cat "${JAVA_PKG_EXTRA_ENV}" >> "${JAVA_PKG_ENV}" || die
			# nested echo to remove leading/trailing spaces
			echo "ENV_VARS=\"$(echo ${JAVA_PKG_EXTRA_ENV_VARS})\"" \
				>> "${JAVA_PKG_ENV}" || die
		fi

		# Strip unnecessary leading and trailing colons
		# TODO try to cleanup if possible
		sed -e "s/=\":/=\"/" -e "s/:\"$/\"/" -i "${JAVA_PKG_ENV}" || die "Did you forget to call java_init ?"
	else
		debug-print "JAVA_PKG_CLASSPATH, JAVA_PKG_LIBRARY, JAVA_PKG_DEPEND_FILE"
		debug-print "or JAVA_PKG_OPTIONAL_DEPEND_FILE not defined so can't"
		debug-print "write package.env."
	fi
}

# @FUNCTION: java-pkg_record-jar_
# @INTERNAL
# @DESCRIPTION:
# Record an (optional) dependency to the package.env
# @CODE
# Parameters:
# --optional - record dependency as optional
# --build - record dependency as build_only
# $1 - package to record
# $2 - (optional) jar of package to record
# @CODE
JAVA_PKG_DEPEND_FILE="${T}/java-pkg-depend"
JAVA_PKG_OPTIONAL_DEPEND_FILE="${T}/java-pkg-optional-depend"
JAVA_PKG_BUILD_DEPEND_FILE="${T}/java-pkg-build-depend"

java-pkg_record-jar_() {
	debug-print-function ${FUNCNAME} $*

	local depend_file="${JAVA_PKG_DEPEND_FILE}"
	case "${1}" in
		"--optional") depend_file="${JAVA_PKG_OPTIONAL_DEPEND_FILE}"; shift;;
		"--build-only") depend_file="${JAVA_PKG_BUILD_DEPEND_FILE}"; shift;;
	esac

	local pkg=${1} jar=${2} append
	if [[ -z "${jar}" ]]; then
		append="${pkg}"
	else
		append="$(basename ${jar})@${pkg}"
	fi

	echo "${append}" >> "${depend_file}"
}

# @FUNCTION: java-pkg_append_
# @INTERNAL
# @DESCRIPTION:
# Appends a value to a variable
#
# @CODE
# Parameters:
# $1 variable name to modify
# $2 value to append
#
# Examples:
#	java-pkg_append_ CLASSPATH foo.jar
# @CODE
java-pkg_append_() {
	debug-print-function ${FUNCNAME} $*

	local var="${1}" value="${2}"
	if [[ -z "${!var}" ]] ; then
		export ${var}="${value}"
	else
		local oldIFS=${IFS} cur haveit
		IFS=':'
		for cur in ${!var}; do
			if [[ ${cur} == ${value} ]]; then
				haveit="yes"
				break
			fi
		done
		[[ -z ${haveit} ]] && export ${var}="${!var}:${value}"
		IFS=${oldIFS}
	fi
}

# @FUNCTION: java-pkg_expand_dir_
# @INTERNAL
# @DESCRIPTION:
# Gets the full path of the file/directory's parent.
# @CODE
# Parameters:
# $1 - file/directory to find parent directory for
# @CODE
# @RETURN: path to $1's parent directory
java-pkg_expand_dir_() {
	pushd "$(dirname "${1}")" >/dev/null 2>&1 || die
	pwd
	popd >/dev/null 2>&1 || die
}

# @FUNCTION: java-pkg_func-exists
# @INTERNAL
# @DESCRIPTION:
# Does the indicated function exist?
# @RETURN: 0 - function is declared, 1 - function is undeclared
java-pkg_func-exists() {
	declare -F ${1} > /dev/null
}

# @FUNCTION: java-pkg_setup-vm
# @INTERNAL
# @DESCRIPTION:
# Sets up the environment for a specific VM
java-pkg_setup-vm() {
	debug-print-function ${FUNCNAME} $*

	local vendor="$(java-pkg_get-vm-vendor)"
	if [[ "${vendor}" == "sun" ]] && java-pkg_is-vm-version-ge "1.5" ; then
		addpredict "/dev/random"
	elif [[ "${vendor}" == "ibm" ]]; then
		addpredict "/proc/self/maps"
		addpredict "/proc/cpuinfo"
		addpredict "/proc/self/coredump_filter"
	elif [[ "${vendor}" == "oracle" ]]; then
		addpredict "/dev/random"
		addpredict "/proc/self/coredump_filter"
	elif [[ "${vendor}" == icedtea* ]] && java-pkg_is-vm-version-ge "1.7" ; then
		addpredict "/dev/random"
		addpredict "/proc/self/coredump_filter"
	elif [[ "${vendor}" == "jrockit" ]]; then
		addpredict "/proc/cpuinfo"
	fi
}

# @FUNCTION: java-pkg_needs-vm
# @INTERNAL
# @DESCRIPTION:
# Does the current package depend on virtual/jdk or does it set
# JAVA_PKG_WANT_BUILD_VM?
#
# @RETURN: 0 - Package depends on virtual/jdk; 1 - Package does not depend on virtual/jdk
java-pkg_needs-vm() {
	debug-print-function ${FUNCNAME} $*

	if [[ -n "$(echo ${JAVA_PKG_NV_DEPEND:-${DEPEND}} | sed -e '\:virtual/jdk:!d')" ]]; then
		return 0
	fi

	[[ -n "${JAVA_PKG_WANT_BUILD_VM}" ]] && return 0

	return 1
}

# @FUNCTION: java-pkg_get-current-vm
# @INTERNAL
# @RETURN - The current VM being used
java-pkg_get-current-vm() {
	java-config -f
}

# @FUNCTION: java-pkg_get-vm-vendor
# @INTERNAL
# @RETURN - The vendor of the current VM
java-pkg_get-vm-vendor() {
	debug-print-function ${FUNCNAME} $*

	local vm="$(java-pkg_get-current-vm)"
	vm="${vm/-*/}"
	echo "${vm}"
}

# @FUNCTION: java-pkg_get-vm-version
# @INTERNAL
# @RETURN - The version of the current VM
java-pkg_get-vm-version() {
	debug-print-function ${FUNCNAME} $*

	java-config -g PROVIDES_VERSION
}

# @FUNCTION: java-pkg_build-vm-from-handle
# @INTERNAL
# @DESCRIPTION:
# Selects a build vm from a list of vm handles. First checks for the system-vm
# beeing usable, then steps through the listed handles till a suitable vm is
# found.
#
# @RETURN - VM handle of an available JDK
java-pkg_build-vm-from-handle() {
	debug-print-function ${FUNCNAME} "$*"

	local vm
	vm=$(java-pkg_get-current-vm 2>/dev/null)
	if [[ $? -eq 0 ]]; then
		if has ${vm} ${JAVA_PKG_WANT_BUILD_VM}; then
			echo ${vm}
			return 0
		fi
	fi

	for vm in ${JAVA_PKG_WANT_BUILD_VM}; do
		if java-config-2 --select-vm=${vm} 2>/dev/null; then
			echo ${vm}
			return 0
		fi
	done

	eerror "${FUNCNAME}: No vm found for handles: ${JAVA_PKG_WANT_BUILD_VM}"
	return 1
}

# @FUNCTION: java-pkg_switch-vm
# @INTERNAL
# @DESCRIPTION:
# Switch VM if we're allowed to (controlled by JAVA_PKG_ALLOW_VM_CHANGE), and
# verify that the current VM is sufficient.
# Setup the environment for the VM being used.
java-pkg_switch-vm() {
	debug-print-function ${FUNCNAME} $*

	if java-pkg_needs-vm; then
		# Use the VM specified by JAVA_PKG_FORCE_VM
		if [[ -n "${JAVA_PKG_FORCE_VM}" ]]; then
			# If you're forcing the VM, I hope you know what your doing...
			debug-print "JAVA_PKG_FORCE_VM used: ${JAVA_PKG_FORCE_VM}"
			export GENTOO_VM="${JAVA_PKG_FORCE_VM}"
		# if we're allowed to switch the vm...
		elif [[ "${JAVA_PKG_ALLOW_VM_CHANGE}" == "yes" ]]; then
			# if there is an explicit list of handles to choose from
			if [[ -n "${JAVA_PKG_WANT_BUILD_VM}" ]]; then
				debug-print "JAVA_PKG_WANT_BUILD_VM used: ${JAVA_PKG_WANT_BUILD_VM}"
				GENTOO_VM=$(java-pkg_build-vm-from-handle)
				if [[ $? != 0 ]]; then
					eerror "${FUNCNAME}: No VM found for handles: ${JAVA_PKG_WANT_BUILD_VM}"
					die "${FUNCNAME}: Failed to determine VM for building"
				fi
				# JAVA_PKG_WANT_SOURCE and JAVA_PKG_WANT_TARGET are required as
				# they can't be deduced from handles.
				if [[ -z "${JAVA_PKG_WANT_SOURCE}" ]]; then
					eerror "JAVA_PKG_WANT_BUILD_VM specified but not JAVA_PKG_WANT_SOURCE"
					die "Specify JAVA_PKG_WANT_SOURCE"
				fi
				if [[ -z "${JAVA_PKG_WANT_TARGET}" ]]; then
					eerror "JAVA_PKG_WANT_BUILD_VM specified but not JAVA_PKG_WANT_TARGET"
					die "Specify JAVA_PKG_WANT_TARGET"
				fi
			# otherwise determine a vm from dep string
			else
				debug-print "depend-java-query:  NV_DEPEND:	${JAVA_PKG_NV_DEPEND:-${DEPEND}}"
				GENTOO_VM="$(depend-java-query --get-vm "${JAVA_PKG_NV_DEPEND:-${DEPEND}}")"
				if [[ -z "${GENTOO_VM}" || "${GENTOO_VM}" == "None" ]]; then
					eerror "Unable to determine VM for building from dependencies:"
					echo "NV_DEPEND: ${JAVA_PKG_NV_DEPEND:-${DEPEND}}"
					die "Failed to determine VM for building."
				fi
			fi
			export GENTOO_VM
		# otherwise just make sure the current VM is sufficient
		else
			java-pkg_ensure-vm-version-sufficient
		fi
		debug-print "Using: $(java-config -f)"

		java-pkg_setup-vm

		export JAVA=$(java-config --java)
		export JAVAC=$(java-config --javac)
		JAVACFLAGS="$(java-pkg_javac-args)"
		[[ -n ${JAVACFLAGS_EXTRA} ]] && JAVACFLAGS="${JAVACFLAGS_EXTRA} ${JAVACFLAGS}"
		export JAVACFLAGS

		export JAVA_HOME="$(java-config -g JAVA_HOME)"
		export JDK_HOME=${JAVA_HOME}

		#TODO If you know a better solution let us know.
		java-pkg_append_ LD_LIBRARY_PATH "$(java-config -g LDPATH)"

		local tann="${T}/announced-vm"
		# With the hooks we should only get here once from pkg_setup but better safe than sorry
		# if people have for example modified eclasses some where
		if [[ -n "${JAVA_PKG_DEBUG}" ]] || [[ ! -f "${tann}" ]] ; then
			einfo "Using: $(java-config -f)"
			[[ ! -f "${tann}" ]] && touch "${tann}"
		fi

	else
		[[ -n "${JAVA_PKG_DEBUG}" ]] && ewarn "!!! This package inherits java-pkg but doesn't depend on a JDK. -bin or broken dependency!!!"
	fi
}

# @FUNCTION: java-pkg_die
# @INTERNAL
# @DESCRIPTION:
# Enhanced die for Java packages, which displays some information that may be
# useful for debugging bugs on bugzilla.
#register_die_hook java-pkg_die
if ! has java-pkg_die ${EBUILD_DEATH_HOOKS}; then
	EBUILD_DEATH_HOOKS="${EBUILD_DEATH_HOOKS} java-pkg_die"
fi

java-pkg_die() {
	echo "!!! When you file a bug report, please include the following information:" >&2
	echo "GENTOO_VM=${GENTOO_VM}  CLASSPATH=\"${CLASSPATH}\" JAVA_HOME=\"${JAVA_HOME}\"" >&2
	echo "JAVACFLAGS=\"${JAVACFLAGS}\" COMPILER=\"${GENTOO_COMPILER}\"" >&2
	echo "and of course, the output of emerge --info =${P}" >&2
}


# TODO document
# List jars in the source directory, ${S}
java-pkg_jar-list() {
	if [[ -n "${JAVA_PKG_DEBUG}" ]]; then
		einfo "Linked Jars"
		find "${S}" -type l -name '*.jar' -print0 | xargs -0 -r -n 500 ls -ald | sed -e "s,${WORKDIR},\${WORKDIR},"
		einfo "Jars"
		find "${S}" -type f -name '*.jar' -print0 | xargs -0 -r -n 500 ls -ald | sed -e "s,${WORKDIR},\${WORKDIR},"
		einfo "Classes"
		find "${S}" -type f -name '*.class' -print0 | xargs -0 -r -n 500 ls -ald | sed -e "s,${WORKDIR},\${WORKDIR},"
	fi
}

# @FUNCTION: java-pkg_verify-classes
# @INTERNAL
# @DESCRIPTION:
# Verify that the classes were compiled for the right source / target. Dies if
# not.
# @CODE
# $1 (optional) - the file to check, otherwise checks whole ${D}
# @CODE
java-pkg_verify-classes() {
	#$(find ${D} -type f -name '*.jar' -o -name '*.class')

	local version_verify="/usr/bin/class-version-verify.py"

	if [[ ! -x "${version_verify}" ]]; then
		version_verify="/usr/$(get_libdir)/javatoolkit/bin/class-version-verify.py"
	fi

	if [[ ! -x "${version_verify}" ]]; then
		ewarn "Unable to perform class version checks as"
		ewarn "class-version-verify.py is unavailable"
		ewarn "Please install dev-java/javatoolkit."
		return
	fi

	local target=$(java-pkg_get-target)
	local result
	local log="${T}/class-version-verify.log"
	if [[ -n "${1}" ]]; then
		${version_verify} -v -t ${target} "${1}" > "${log}"
		result=$?
	else
		ebegin "Verifying java class versions (target: ${target})"
		${version_verify} -v -t ${target} -r "${D}" > "${log}"
		result=$?
		eend ${result}
	fi
	[[ -n ${JAVA_PKG_DEBUG} ]] && cat "${log}"
	if [[ ${result} != 0 ]]; then
		eerror "Incorrect bytecode version found"
		[[ -n "${1}" ]] && eerror "in file: ${1}"
		eerror "See ${log} for more details."
		die "Incorrect bytecode found"
	fi
}

# @FUNCTION: java-pkg_ensure-dep
# @INTERNAL
# @DESCRIPTION:
# Check that a package being used in jarfrom, getjars and getjar is contained
# within DEPEND or RDEPEND with the correct SLOT. See this mail for details:
# https://archives.gentoo.org/gentoo-dev/message/dcb644f89520f4bbb61cc7bbe45fdf6e
# @CODE
# Parameters:
# $1 - empty - check both vars; "runtime" or "build" - check only
#	RDEPEND, resp. DEPEND
# $2 - Package name and slot.
# @CODE
java-pkg_ensure-dep() {
	debug-print-function ${FUNCNAME} $*

	local limit_to="${1}"
	local target_pkg="${2}"
	local dev_error=""

	# Transform into a regular expression to look for a matching package
	# and SLOT. SLOTs don't have to be numeric so foo-bar could either
	# mean foo-bar:0 or foo:bar. So you want to get your head around the
	# line below?
	#
	# * The target package first has any dots escaped, e.g. foo-1.2
	#   becomes foo-1\.2.
	#
	# * sed then looks at the component following the last - or :
	#   character, or the whole string if there is no - or :
	#   character. It uses this to build a new regexp with two
	#   significant branches.
	#
	# * The first checks for the whole target package string, optionally
	#   followed by a version number, and then :0.
	#
	# * The second checks for the first part of the target package
	#   string, optionally followed by a version number, followed by the
	#   aforementioned component, treating that as a SLOT.
	#
	local stripped_pkg=/$(sed -r 's/[-:]?([^-:]+)$/(\0(-[^:]+)?:0|(-[^:]+)?:\1)/' <<< "${target_pkg//./\\.}")\\b

	debug-print "Matching against: ${stripped_pkg}"

	# Uncomment the lines below once we've dealt with more of these
	# otherwise we'll be tempted to turn JAVA_PKG_STRICT off while
	# getting hit with a wave of bug reports. :(

	if [[ ${limit_to} != runtime && ! ( "${DEPEND}" =~ $stripped_pkg ) ]]; then
		dev_error="The ebuild is attempting to use ${target_pkg}, which is not "
		dev_error+="declared with a SLOT in DEPEND."
#		if is-java-strict; then
#			die "${dev_error}"
#		else
			eqawarn "java-pkg_ensure-dep: ${dev_error}"
#			eerror "Because you have ${target_pkg} installed,"
#			eerror "the package will build without problems, but please"
#			eerror "report this to https://bugs.gentoo.org."
#		fi
	elif [[ ${limit_to} != build && ! ( "${RDEPEND}${PDEPEND}" =~ ${stripped_pkg} ) ]]; then
		dev_error="The ebuild is attempting to use ${target_pkg}, which is not "
		dev_error+="declared with a SLOT in [RP]DEPEND and --build-only wasn't given."
#		if is-java-strict; then
#			die "${dev_error}"
#		else
			eqawarn "java-pkg_ensure-dep: ${dev_error}"
#			eerror "The package will build without problems, but may fail to run"
#			eerror "if you don't have ${target_pkg} installed,"
#			eerror "so please report this to https://bugs.gentoo.org."
#		fi
	fi
}

java-pkg_check-phase() {
	local phase=${1}
	local funcname=${FUNCNAME[1]}
	if [[ ${EBUILD_PHASE} != ${phase} ]]; then
		local msg="${funcname} used outside of src_${phase}"
		java-pkg_announce-qa-violation "${msg}"
	fi
}

java-pkg_check-versioned-jar() {
	local jar=${1}

	if [[ ${jar} =~ ${PV} ]]; then
		java-pkg_announce-qa-violation "installing versioned jar '${jar}'"
	fi
}

java-pkg_check-jikes() {
	if has jikes ${IUSE}; then
		java-pkg_announce-qa-violation "deprecated USE flag 'jikes' in IUSE"
	fi
}

java-pkg_announce-qa-violation() {
	local nodie
	if [[ ${1} == "--nodie" ]]; then
		nodie="true"
		shift
	fi
	echo "Java QA Notice: $@" >&2
	increment-qa-violations
	[[ -z "${nodie}" ]] && is-java-strict && die "${@}"
}

increment-qa-violations() {
	let "JAVA_PKG_QA_VIOLATIONS+=1"
	export JAVA_PKG_QA_VIOLATIONS
}

is-java-strict() {
	[[ -n ${JAVA_PKG_STRICT} ]]
	return $?
}

# @FUNCTION: java-pkg_clean
# @DESCRIPTION:
# Java package cleaner function. This will remove all *.class and *.jar
# files, removing any bundled dependencies.
java-pkg_clean() {
	if [[ -z "${JAVA_PKG_NO_CLEAN}" ]]; then
		find "${@}" '(' -name '*.class' -o -name '*.jar' ')' -type f -delete -print || die
	fi
}
