#! /bin/sh
# 
# Copyright 2001-2002 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License, v2 or later
# Maintainer: Tools Team <tools@gentoo.org>
# Author: Karl Trygve Kalleberg <karltk@gentoo.org>
# $Header: /var/cvsroot/gentoo-x86/dev-java/java-config/files/0.2.8/java-config,v 1.2 2003/04/01 21:34:01 drobbins Exp $

version="0.2.8"
all_params="$*"

SYSTEM_ARCH=`echo $ARCH |\
	sed -e s/[i]*.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/`

if [ -z "$SYSTEM_ARCH" ] ; then
	SYSTEM_ARCH=`uname -m |\
	sed -e s/[i]*.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/`
fi 

PFORM="i386"

case $SYSTEM_ARCH in
	ppc)	PFORM="ppc";;
	i386)	PFORM="i386";;
	sparc64)PFORM="sparc64";;
	sparc)  PFORM="sparc";;
	arm)    PFORM="arm";;
esac

if [ $UID != 0 ] && [ -f $HOME/.gentoo/java-env ] ; then
	. $HOME/.gentoo/java-env
elif  [ -f /etc/env.d/20java ] ; then
	oldpath=$PATH
	. /etc/env.d/20java
	PATH=$oldpath:$PATH
fi

function eerror() {
	echo "!!! $1" 1>&2
}
svm=`echo $1|egrep "\-\-(set-(system|user)-vm|list-available-vms)"`
if [ -z "$JAVA_HOME" ] && [ -z "$svm" ] && [ "$1" != "--help" ]; then
	eerror "No Java installation found"
	eerror "Use --set-system-vm to select default system JVM"
	eerror "Alternatively, use --set-user-vm to select default user JVM"
	exit 1
fi

usage() {
        cat <<EOF
Usage: java-config [OPTIONS] [LIBRARIES]
Options:
	[--javac]
	[--java]
	[--jar]
	[--jdk-home]
	[--jre-home]
	[--java-version]
	[--classpath[=package1,package2,...]]
	[--full-classpath=package1,package2,...]
	[--exec=filename]
	[--list-available-packages]
	[--list-available-vms]
	[--set-system-vm=<vm-id>]
	[--set-user-vm=<vm-id>]
	[--set-system-classpath=package1,package2,...]
	[--set-user-classpath=package1,package2,...]
	[--clean-system-classpath]
EOF
	echo "Using ${JAVA_HOME}"
	exit $1
}

find_exec() {
	if [ -f ${JAVA_HOME}/bin/$1 ] ; then
		echo ${JAVA_HOME}/bin/$1
	elif [ -f ${JAVA_HOME}/jre/bin/$1 ] ; then
		echo ${JAVA_HOME}/jre/bin/$1
	else
		eerror "$1 not found" 
		exit 1
	fi
}                                                                       

classpathfor()
{
	local pkgs=`echo $1 | sed "s/,/ /g"`
	local total=""
	for i in $pkgs ; do
		if [ -f /usr/share/${i}/classpath.env ] ; then
			total="${total}`cat /usr/share/${i}/classpath.env`"
		elif [ -f /usr/share/${i}/package.env ] ; then
			pf=/usr/share/${i}/package.env
			addcp=`grep "CLASSPATH=" $pf | sed "s/CLASSPATH=//"`
			total="${total}:${addcp}"
		else
			eerror "Package ${i} not found"
			exit 1
		fi
	done
	echo $total | sed "s/::/:/g"
}

normalise_classpath() {
	local iter=`echo $1|sed "s/::/:/g"|sed "s/^://"`
	local result
	oldifs=${IFS}
	IFS=":"
	set -f -- ${iter}
	while [ "$1" != "" ] ; do
        	found=`false`
	        for i in ${result} ; do
        	        if [ "$i" == "$1" ] ; then
               			found=1
	                fi
	        done
	        if [ ! $found ] && [ $1 != "." ] ; then
			result="${result}:$1"
	        fi
	        shift
	done
	IFS="${oldifs}"
	echo ${result} | sed "s/^://"
}

findpluginpath() {

	# This covers Sun and Blackdown

	rootpath=${JAVA_HOME}/jre/plugin/${PFORM}
	
	if [ $1 == "ns4" ] || [ $1 == "netscape4" ] ; then
		for i in ${rootpath}/{ns4,netscape4}/javaplugin.so ; do
			if [ -e $i ] ; then
				echo $i
				break
			fi
		done
	elif [ $1 == "ns6" ] || [ $1 == "netscape6" ] || [ $1 == "moz" ] || [ $1 == "mozilla" ] ; then
		for i in ${rootpath}/{mozilla,ns600,netscape6}/{libjavaplugin_oji,javaplugin_oji}.so ; do
			if [ -e $i ] ; then
				echo $i
				break
			fi
		done
	else
		eerror "Browser [$1] unknown"
	fi

	# This covers IBM

	rootpath=${JAVA_HOME}
	if [ $1 == "ns4" ] || [ $1 == "netscape4" ] ; then
		for i in ${rootpath}/{,jre}/bin/javaplugin.so ; do
			if [ -e $i ] ; then
				echo $i
				break
			fi
		done
	elif [ $1 == "ns6" ] || [ $1 == "netscape6" ] || [ $1 == "moz" ] || [ $1 == "mozilla" ] ; then
		for i in ${rootpath}/{,jre}/bin/libjavaplugin_oji.so ; do
			if [ -e $i ] ; then
				echo $i
				break
			fi
		done
	fi
}

function env_update() {
	echo -e "\033[01;37m * \033[01;32m You should login again to make your java-config changes available"
	if [ $UID == 0 ]; then
		env-update
		echo -e "\033[01;37m * \033[01;32m Or, you can type 'source /etc/profile' in your current session."
	else
		echo -e "\033[01;37m * \033[01;32m Or, you can type 'source ~/.gentoo/java-env' in your current session."
	fi
}

#WE NEED TO FIX THIS BECAUSE I DONT KNOW
#IF ALWAYS THE VMs GET INSTALLED IN /opt
function vm_shortname_path_opt_only() {
        basename $1 | sed -e "s/\/opt\///"
}

function vm_shortname() {
	basename $1 | sed -e "s/20//" #-e "s/-[0-9]\..*//"
}

function vm_version()  {
	( . $1 ; echo "$VERSION ($i)" )
}

function vm_exists() {
	( . $i ; export TMP_JAVA_HOME=$JAVA_HOME 
	if [ -d $TMP_JAVA_HOME ]; then
		echo true
		unset TMP_JAVA_HOME
	else
		echo false
		unset TMP_JAVA_HOME
	fi )
}

function vm_envvars() {
	local file=$1
	local system="$2"

	( . $file ;
  	for i in $ENV_VARS ; do
		if [ $i == "ADDPATH" ] && [ -z "$system" ]; then
			echo "PATH=\${PATH}:${!i}"
		elif [ $i == "ADDPATH" ] && [ "$system" ]; then
			echo "PATH=${!i}"
			echo "ROOTPATH=${!i}"
		elif [ $i == "ADDLDPATH" ] ; then
			if [ "$system" ]; then
				echo "LDPATH=${!i}"
			fi
		elif [ $i == "CLASSPATH" ] ; then
			echo "${i}=`normalise_classpath ${!i}`"	
		else
			echo "${i}=${!i}"
		fi
	done
	)
}

function source_java_classpath() {
	echo "if [ -f $HOME/.gentoo/java-env-classpath ] ; then"
	echo "	. $HOME/.gentoo/java-env-classpath"
	echo "fi"
}

function set_vm() {
	local vm=$1
	local cfgpath=$2
	local cfgfile=$3
	local system=""
	if [ "$cfgpath" == "/etc/env.d" ] ; then
		system="yes"
	fi
	local found=""

	for i in /etc/env.d/java/20*-* ; do
		if [ $vm == `vm_shortname $i` ] ; then
			echo "Now using `vm_version $i`"
			mkdir -p $cfgpath
			echo "# Autogenerated by java-config $version" > ${cfgpath}/${cfgfile}
			echo "# Cmd: $0 $all_params" >> ${cfgpath}/${cfgfile}
			vm_envvars $i $system >> ${cfgpath}/${cfgfile}
			if [ -z $system ] ; then
				source_java_classpath >> $HOME/.gentoo/java-env
			fi
			found="yes"
		fi
	done
	if [ -z "$found" ] ; then
		echo "$vm not found"
	fi
}

function calc_full_classpath() {
	local foo=`classpathfor $1`
	local bar=`normalise_classpath "${foo}"`
	echo "${bar}"
}

if [ $# == 0 ] ; then
	echo "Usage: java-config [OPTIONS] [LIBRARIES]"
	exit 1
fi

while test $# -gt 0; do

	case "$1" in
	-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
	*) optarg= ;;
	esac
       
	case $1 in
		--debug)
			set -x
		;;
		--browser-plugin=*)
			pluginpath=`findpluginpath $optarg`
			if [ -n "$pluginpath" ] ; then
				echo `basename $pluginpath`
			else
				eerror "Plugin not found"
			fi
		;;
		--full-browser-plugin-path=*)
			findpluginpath $optarg
		;;
		--classpath)
			normalise_classpath ${CLASSPATH}
		;;
		--classpath=*)
			normalise_classpath `classpathfor $optarg`
		;;
		--full-classpath=*)
			calc_full_classpath $optarg
		;;
		--jdk-home)
			echo ${JDK_HOME}
		;;
		--jre-home)
			echo ${JRE_HOME}
		;;
		--javac)
			find_exec javac
		;;
		--java)
			find_exec java
		;;
		--jar)
			find_exec jar
		;;
		--java-version)
			`find_exec java` -version
		;;
		--exec=*)
			find_exec $optarg
		;;
		--version)
			echo java-config $version
		;;
		--list-available-packages)
			# Old env var file
			for i in /usr/share/*/classpath.env ; do
				if [ ! -f $i ] ; then continue ; fi
				dn=`dirname $i`
				echo "[`basename $dn`] No description ($i)"
			done
			# New env var file
			for i in /usr/share/*/package.env ; do
				if [ ! -f $i ] ; then continue ; fi
				dn=`dirname $i`
				id=`basename $dn`
				desc=`grep DESC $i | sed "s/DESCRIPTION=//"`
				echo "[${id}] ${desc} ($i)"
			done
			
		;;
		--list-available-vms)
			if [ -d /etc/env.d/java ] ; then 
				for i in `find /etc/env.d/java/ -name "20*-*"` ; do
					if [ "`vm_exists $i`" == "true" ]; then
						if [ "`vm_shortname_path_opt_only $JAVA_HOME`" == "`vm_shortname $i`" ]; then
							echo -e "\033[01;33m [`vm_shortname $i`] `vm_version $i` (*)"
						else
							echo -e "\033[01;37m [`vm_shortname $i`] `vm_version $i` ()"
						fi	
					fi
				done
			fi
		;;
		--set-system-classpath=*)
			if [ "$optarg" == "" ] ; then
				 eerror "If you want to clean the classpath, please use --clean-system-classpath"
			else
				echo "CLASSPATH=`calc_full_classpath $optarg`" > \
					/etc/env.d/21java-classpath
			fi
		;;
		--clean-system-classpath)
			if [ -f /etc/env.d/21java-classpath ]; then
				rm -f /etc/env.d/21java-classpath
			fi
		;;
		--set-user-classpath=*)
			mkdir -p $HOME/.gentoo
			echo "CLASSPATH=\${CLASSPATH}:`calc_full_classpath $optarg`" > \
				$HOME/.gentoo/java-env-classpath
			if [ ! -f $HOME/.gentoo/java-env ] ; then
				source_java_classpath > $HOME/.gentoo/java-env
			fi
		;;
		--set-system-vm=*)
			set_vm $optarg /etc/env.d 20java
			env_update
		;;
		--set-user-vm=*)
			if [ $UID == 0 ] ; then
				eerror "ERROR: root should _always_ use the system-vm"
				eerror "NOTE : user-vm for root not set."
			else 
				set_vm $optarg $HOME/.gentoo java-env
				env_update
			fi
		;;
		*)
			usage
		;;
	esac
	shift
done
