#!/bin/sh
THIS="/usr/bin/javaenv"
CPMGR="/usr/bin/javacpmgr"
ACTION=""
JAVACFGDIR="/etc/sysconfig/java"
JAVACONF="/etc/sysconfig/java.conf"
LIBDIR="/usr/lib"
JEDIR="$LIBDIR/java-env"

if [ -z "$CONFIG_DIR" ]; then
    CFGDIR="$HOME/.java"
    HOMECONF="$CFGDIR/java.conf"
else
    CFGDIR="$HOME/etc/java"
    HOMECONF="$CFGDIR/java.conf"
fi

UID=`id -u`
USAGE="false"
OLDJAVA=""
DEFAULT_JAVA=""

no_other_action() {
    if [ ! -z "$ACTION" ]; then 
    	echo "Do not use $1 with other action!"
    	exit 1
    fi
}

other_option() {
    if [ "$1" -eq 0 ]; then 
    	echo "$2 require another option!"
    	exit 1
    fi
}

root_req() {
    if [ "$UID" -ne "0" ]; then
	echo "You must be root to use $1"
	exit 1
    fi
}

# get command line options
while test $# -gt 0; do
    case "$1" in
	--setjava)
	    no_other_action "$1"; root_req "$1"; shift
	    ACTION="SETJAVA"
	    ;;
	--setnewjava)
	    no_other_action "$1"; root_req "$1"; shift
	    other_option "$#" "--setnewjava"; NEWJAVA="$1"; shift
    	    ACTION="SETNEWJAVA"
	    ;;
	--erasejava)
	    no_other_action "$1"; root_req; shift
	    ACTION="ERASEJAVA"
	    ;;
	--erasejavaif)
	    no_other_action "$1"; root_req; shift
	    other_option "$#" "--erasejavaif"; OLDJAVA="$1"; shift
	    ACTION="ERASEJAVAIF"
	    ;;
	--listjava)
	    no_other_action "$1"; shift;
	    ACTION="LISTJAVA"
	    ;;
	--getjavahome)
	    no_other_action "$1"; shift;
	    ACTION="GETJAVAHOME"
	    ;;
	-h | --help) 
	    USAGE="true"; shift;;
	*)
	    USAGE="true"; shift;;
    esac    
done

[ -z "$ACTION" ] && USAGE="true"
if [ "$USAGE" == "true" ]; then
    cat "$JEDIR/javaenv.usage.txt"
    exit 0
fi

create_config_file() {
    if [ ! -f "$JAVACONF" ]; then
	install -m 644 -o root -g root "$JEDIR/java.conf.header" $JAVACONF
    else
        cat "$JEDIR/java.conf.header" > $JAVACONF
    fi
    
    echo "DEFAULT_JAVA=$DEFAULT_JAVA" >> $JAVACONF
}

del_links() {
    FILES=`cat "$1" | grep -v "#"`
    for FILE in $FILES; do
	if [ -L "$FILE" ]; then
	    rm -f "$FILE"
	else
	    if [ -e "$FILE" ]; then
		echo "Plik: $FILE istnieje ale nie jest dowizaniem! Nie kasuj..."
	    else
		echo "Plik: $FILE juz nie istnieje! Nie kasuj..."
	    fi
	fi
    done
}

set_link() {
    if [ ! -e "$1" ]; then
	    echo "Plik: $1, do ktrego ma sie odnosic dowizanie $2 nie istnieje! Pomijam..."
    elif [ -e "$2" ]; then
	    echo "Plik: $2, ktry mia by dowizaniem do $1 juz istnieje! Pomijam..."
    else 
	ln -sf "$1" "$2"
	echo "$2" >> "$3"
    fi
}

set_links() {
    if [ ! -f "$1" ]; then
	"set_links(): $1 file does not exist!"
	exit 1
    fi

    FILES=`cat "$1" | grep -v "#"`

    L=""
    for FILE in $FILES; do
	if [ -z "$L" ]; then
	    L="$FILE"
	else
	    set_link "$L" "$FILE" "$2"
	    L=""
	fi
    done
}

set_new_java() {
    echo "Setting Java to: $1"
    echo "# Do not edit or remove this file! It's autogenerated!" > "$JAVACFGDIR/.java_links"
    
    . "$JAVACFGDIR/$1"

    set_links "$JAVACFGDIR/links.$1" "$JAVACFGDIR/.java_links"
    DEFAULT_JAVA="$1"
}

erase_java() {
    echo "Erasing Java: $DEFAULT_JAVA"
    if [ ! -f "$JAVACFGDIR/.java_links" ]; then
	echo "DEFAULT_JAVA is set but $JAVACFGDIR/.java_links file does not found!" 
	echo "Trying to coutinue..."
    else
	del_links "$JAVACFGDIR/.java_links"
    fi

    DEFAULT_JAVA=""
    rm -f "$JAVACFGDIR/.java_links"
}

case "$ACTION" in
    GETJAVAHOME)
	G=""; L=""
	[ -f "$JAVACONF" ] && . $JAVACONF && G="$DEFAULT_JAVA"
	[ -f "$HOMECONF" ] && . $HOMECONF && L="$DEFAULT_JAVA"
	[ ! -z "$L" ] && [ "$G" != "$L" ] && . $JAVACFGDIR/$L && \
	    echo "/usr/lib/$MAINDIR" && exit 0
	[ ! -z "$G" ] && echo "/usr/lib/java"
	;;
    SETJAVA)
        [ ! -d "$JAVACFGDIR" ] && install -d "$JAVACFGDIR"
	[ ! -f "$JAVACONF" ] && create_config_file
	. $JAVACONF
	[ ! -z "$DEFAULT_JAVA" ] && exit 0
	cd /etc/sysconfig/java
	NEWJAVA=""
	NEWJRE=`ls jre.* 2>/dev/null | sort -r | head -n 1`
	NEWJDK=`ls jdk.* 2>/dev/null | sort -r | head -n 1`
	NEWJAVA="$NEWJDK"
	[ -z "$NEWJAVA" ] && NEWJAVA="$NEWJRE"
	[ ! -z "$NEWJAVA" ] && $THIS --setnewjava $NEWJAVA
	;;
    SETNEWJAVA)
	if [ ! -f "$JAVACFGDIR/$NEWJAVA" ]; then
	    echo "Required $JAVACFGDIR/$NEWJAVA file does not exist!"
	    exit 1
	fi

	. $JAVACONF
	$THIS --erasejava
	set_new_java $NEWJAVA
	create_config_file
	;;
    ERASEJAVA)
	. $JAVACONF
	
	[ -z "$DEFAULT_JAVA" ] && exit 0
	if [ ! -f "$JAVACFGDIR/$DEFAULT_JAVA" ]; then
	    echo "Required $JAVACFGDIR/$DEFAULT_JAVA file does not exist!"
	    exit 1
	fi
	erase_java
	create_config_file
	;;
    ERASEJAVAIF)
	. $JAVACONF
	[ "$DEFAULT_JAVA" != "$OLDJAVA" ] && exit 0
	erase_java
	create_config_file
	;;    
    LISTJAVA)
	cd $JAVACFGDIR
	
	JRENUM=`ls jre.* 2>/dev/null | sort -r | wc -l`
	JDKNUM=`ls jdk.* 2>/dev/null | sort -r | wc -l`
	
	echo "Available JREs: $JRENUM" 
	    ls jre.* 2>/dev/null | sort -r
	echo "Available JDKs: $JDKNUM"
	    ls jdk.* 2>/dev/null | sort -r
	;;
    *)
	echo -e "How this could happen!?\nCall the police!"
	exit 1
	;;
esac

exit 0
