#!/bin/sh
# This script reads filenames from STDIN and outputs any relevant requires
# information that needs to be included in the package.
#
# Based on rpm-4.4.2/scripts/find-req.pl
# Authors: Elan Ruusamäe <glen@pld-linux.org>

export PATH="/sbin:/usr/sbin:/bin:/usr/bin"

# Set the prefix, unless it is overriden
: ${RPM_LIBDIR=/usr/lib/rpm}

# Enable debug: JAVADEPS_DEBUG=true
: ${JAVADEPS_DEBUG=false}

# xsltproc for eclipse feature.xml
: ${xsltproc=/usr/bin/xsltproc}

# "%define java_min_classdataversion 51.0" in spec to minimum version to be 51.0
: ${MIN_CLASSDATAVERSION=}

# save $- state, to enable in functions
debug=$-

javaclassversionfilter() {
	if [ "$MIN_CLASSDATAVERSION" ]; then
		set -- $* "$MIN_CLASSDATAVERSION"
	fi

	local v
	for v in $*; do
		echo "java(ClassDataVersion) >= $v"
	done | sort -V | tail -n 1
}

javaclassversion() {
	set -$debug
	local mode=$1; shift
	[ $# -gt 0 ] || return 1
	$JAVADEPS_DEBUG && echo >&2 ">> javaclassversion($mode): $*"

	# process only requires
	[ "$mode" = requires ] || return $ret

	local classver=$(echo "$@" | xargs -r file | grep -o 'compiled Java class data, version [0-9.]*' | awk '{print $NF}' | sort -u)
	if [ -z "$classver" ]; then
		return 1
	fi

	javaclassversionfilter $classver
	return 0
}

javajarversion() {
	set -$debug
	local mode=$1; shift
	local jar=$1
	local tmp ret=0
	$JAVADEPS_DEBUG && echo >&2 ">> javajarversion($mode): $jar"

	# check only files, symlinks could point outside buildroot
	[ -f "$jar" -a ! -L "$jar" ] || return $ret

	tmp=$(mktemp -d)
	unzip -q -n -d $tmp $jar >&2
	# workaround for .jar files with stupid permissions
	chmod -R u+rwX $tmp

	# find .jar and .class files
	find_javadeps $mode $(find $tmp -type f -regextype posix-extended  -regex '^.+\.(class|jar)$') || ret=1
	rm -rf $tmp
	return $ret
}

eclipse_feature() {
	set -$debug
	local mode=$1; shift
	local file=$1
	local ret=0

	$JAVADEPS_DEBUG && echo >&2 ">> eclipse_feature($mode): $file"

	if [ ! -x $xsltproc ]; then
		return 0
	fi

	$xsltproc --stringparam mode $mode ${RPM_LIBDIR}/eclipse-feature.xslt $file
}

find_javadeps() {
	set -$debug
	local mode=$1; shift
	local ret=0

	$JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): $*"
	for file in $@; do
		case $file in
		*.jar)
			javajarversion $mode "$file" || ret=1
		;;
		*.class)
			javaclassversion $mode "$file" || {
				echo >&2 "ERROR: Class version could not be extracted from $file"
				ret=1
			}
		;;
		*/feature.xml)
			eclipse_feature $mode "$file" || ret=1
		;;
		*)
			$JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): no handle: $file"
		;;
		esac
	done
	return $ret
}

ret=0
# default mode to requires for backward compat
mode=requires
case $1 in
-P|--provides)
	mode=provides
	shift
	;;
-R|--requires)
	mode=requires
	shift
	;;
esac

t=$(mktemp)
find_javadeps $mode $(cat -) > $t || ret=1
sort -u $t
rm -f $t

exit $ret
