#!/bin/bash --

MINJARWRAPPERVER=0.5

. /usr/share/javahelper/jh_lib.sh

set -e

syntax()
{
   echo -e "Usage: jh_depends [options]"
   echo -e "Options:"
   echo -e "\t-h --help: show this text"
   echo -e "\t-V --version: print the version"
   echo -e "\t-p<package> --package=<package>: package to act on (default=all)"  
   echo -e "\t-P<packagedir> --tmpdir=<package>: package directory (default=\$CWD/debian/package)"  
   echo -e "\t-v --verbose: show more information while running"
   echo -e "\t-i --indep: work on all indep packages"
   echo -e "\t-a --arch: work on all arch-specific packages"
   echo -e "\t-n --no-act: don't actually do anything, just print the results"
   echo -e "\t-j[<jvm>] --jvm[=<jvm>]: Options are: default, headless, gcj, open, sun, sun5, sun6. Can be a space-separated list."
   echo -e "\t-X<package> --exclude=<package>: don't add this package to depends"  
   exit 1
}

# getclassversion <current> <path to classes>
# returns the max of <current> and <all the classes under the path>
getclassversion()
{
	current=$1
	classes="$2"
	for i in `find "$classes" -name "*.class"`; do
		new=`hd -s 7 -n 1 -d "$i" | sed -n '2s/.*\([^ ][^ ]\) *$/\1/p'`
		if (( $current < $new )); then
			current=$new
		fi
	done
	echo $current
}

# getalternatedepends <version>
getalternatedepends()
{
	if (( $1 < 48 )); then
		echo "| java-runtime | java2-runtime | java5-runtime | java6-runtime" 
	elif [ "$1" == "48" ]; then
		echo "| java2-runtime | java5-runtime | java6-runtime" 
	elif [ "$1" == "49" ]; then
		echo "| java5-runtime | java6-runtime"
	elif [ "$1" == "50" ]; then
		echo "| java6-runtime" 
	else
		echo "Warning: Class version too new to recognise ($1), might not run with any JVMs" 1>&2
	fi
}

function home-to-jvm()
{
	JHOME="$1"
	if echo $JHOME | grep headless >/dev/null; then
		JVM="$JVM headless"
	fi
	if echo $JHOME | grep default >/dev/null; then
		JVM="$JVM default"
	fi
	if echo $JHOME | grep gcj >/dev/null; then
		JVM="$JVM gcj"
	fi
	if echo $JHOME | grep 6-openjdk >/dev/null; then
		JVM="$JVM open"
	fi
	if echo $JHOME | grep 6-sun >/dev/null; then
		JVM="$JVM sun6"
	fi
	if echo $JHOME | grep 1.5.0-sun >/dev/null; then
		JVM="$JVM sun5"
	fi
	echo "$JVM"
}

ARGS="X exclude p package P tmpdir v verbose i indep a arch n no-act j jvm" parseargs "$@"

VERBOSE="`getarg v verbose`"

dh_testdir

TEMPDIR=`mktemp -d`
OLDDIR=`pwd`

WRAPPER=

EXCLUDES="`getarg X exclude`"

PACKAGES=`findpackages`
for p in $PACKAGES; do

   PACKAGEDIR="`getarg P tmpdir`"
   if [ -z "$PACKAGEDIR" ]; then
      PACKAGEDIR="`pwd`/debian/$p"
   else
      PACKAGEDIR="`realpath $PACKAGEDIR`"
   fi

   if [ ! -d "$PACKAGEDIR" ]; then
      continue
   fi

   if [ -n "$VERBOSE" ]; then
      echo "Searching $PACKAGEDIR for $p"
   fi

   JARS=`find $PACKAGEDIR -name '*.jar'`

   if [ -n "$VERBOSE" ]; then
      echo "Searching" $JARS
   fi

	[ -n "$TEMPDIR" ] && rm -rf "$TEMPDIR/"*
	cd "$TEMPDIR"

   JARDEPS=""
	classversion=0
   for i in $JARS; do
      if [ -x "$i" ]; then
         WRAPPER="true"
      fi
      jar xf "$i"
		classversion=`getclassversion $classversion .`
      JARDEPS="$JARDEPS `extractline META-INF/MANIFEST.MF Class-Path`"
      if grep ^Main-Class META-INF/MANIFEST.MF >/dev/null; then 
         JHOME="`extractline META-INF/MANIFEST.MF Debian-Java-Home`"
			JVM="`home-to-jvm "$JHOME"`"
      fi
      [ -n "$TEMPDIR" ] && rm -rf "$TEMPDIR/"*
   done
   JARDEPS=`echo $JARDEPS | xargs -n1 | sort -u`

   if [ -n "$VERBOSE" ]; then
      echo "Found Jars:" $JARDEPS
   fi

   LOCALDEBDEPS=""
   DEBDEPS=""
	NEWJARDEPS=""
   for i in $JARDEPS; do
		if [ -e "$i" ]; then 
			realjar="`readlink -f "$i"`"
		else
			realjar="$i"
		fi
      for j in $PACKAGES; do
			if ! grep "$j" <<< "$EXCLUDES" > /dev/null; then
				if [ -n "$VERBOSE" ]; then
					echo "Checking: " $OLDDIR/debian/$j$realjar
				fi
				if [ -f $OLDDIR/debian/$j$realjar ]; then
					LOCALDEBDEPS="$LOCALDEBDEPS $j (= \${binary:Version})"
				else 
					NEWJARDEPS="$NEWJARDEPS $realjar"
				fi
			else
				if [ -n "$VERBOSE" ]; then
					echo "Excluding package $j from depends"
				fi
			fi
      done
   done

   if [ -n "$NEWJARDEPS" ]; then
      DEBDEPS="$DEBDEPS `dpkg -S $NEWJARDEPS 2>/dev/null | grep -v ^$p: | cut -d: -f1 | sort -u`"
   fi

	REALDEBDEPS=""
	for d in $DEBDEPS; do
		if grep "$d" <<< "$EXCLUDES" > /dev/null; then
			echo "Excluding package $d from depends"
		else
			REALDEBDEPS="$REALDEBDEPS $d"
		fi
	done
	DEBDEPS="$LOCALDEBDEPS $REALDEBDEPS"
		
	
   if [ -n "$VERBOSE" ]; then
      echo "Found Debs:" $DEBDEPS
   fi
   if [ -n "$WRAPPER" ]; then
      DEBDEPS="jarwrapper (>=0.5) $DEBDEPS"
   fi
   JVMDEPS=
   if [ -n "`getarg j jvm`" ] && [ -z "$JVM" ]; then
      JVM="`getarg j jvm`"
   fi

	if [ -n "$WRAPPER" ] && [ -z "$JVM" ]; then
		if [ -n "$JAVA_HOME" ]; then
			JVM="`home-to-jvm "$JAVA_HOME"`"
		else
			JVM="default"
		fi
	fi

   if [ -n "$JVM" ]; then
      for j in $JVM; do
			alternateversiondeps=`getalternatedepends $classversion`
         if [ -n "$JVMDEPS" ]; then
            JVMDEPS="$JVMDEPS |"
         fi
         case "$j" in
            "default"|"true")
               JVMDEPS="default-jre $alternateversiondeps "
               break
               ;;
            "headless")
               JVMDEPS="default-jre-headless $alternateversiondeps "
               break
               ;;
            "gcj")
               JVMDEPS="$JVMDEPS java-gcj-compat $alternateversiondeps "
               ;;
            "sun")
               JVMDEPS="$JVMDEPS sun-java5-jre | sun-java6-jre  "
               ;;
            "sun5")
               JVMDEPS="$JVMDEPS sun-java5-jre "
               ;;
            "sun6")
               JVMDEPS="$JVMDEPS sun-java6-jre "
               ;;
            "open")
               JVMDEPS="$JVMDEPS openjdk-6-jre "
               ;;
            *)
               echo "Warning: unknown JVM type: $j"
               ;;
         esac
      done
      if [ -n "$JVMDEPS" ]; then
         JVMDEPS="$JVMDEPS, "
      fi
   fi

   cd "$OLDDIR"
   if [ -n "$VERBOSE" ]; then
      echo "Adding substvars:" "java:Depends=$JVMDEPS`echo $DEBDEPS | sed 's/\([a-zA-Z0-9_.+-]*\( *([^)]*)\)\{0,1\}\)/\1, /g;s/, *$//'`"
   fi

   if [ -z "`getarg n no-act`" ]; then
      echo "java:Depends=$JVMDEPS`echo $DEBDEPS | sed 's/\([a-zA-Z0-9_.+-]*\( *([^)]*)\)\{0,1\}\)/\1, /g;s/, *$//'`" >> debian/$p.substvars
   else
      echo "java:Depends=$JVMDEPS`echo $DEBDEPS | sed 's/\([a-zA-Z0-9_.+-]*\( *([^)]*)\)\{0,1\}\)/\1, /g;s/, *$//'`"
   fi

   unset PACKAGEDIR

done
rm -rf "$TEMPDIR"

