#!/bin/bash
#
# Description: The script installs Oracle JDK 7 from tar.gz file.
# JDK 7 tar.gz file is supposed to be in current directory.
# Script relies on format of archive name, it should be
# jdk-7u<update>-linux-<architecture>.tar.gz, and the directory inside
# is supposed to be jdk1.7.0_<update>.
#
# Related info: http://sukharevd.net/install-oracle-jdk-7-in-3-simple-steps.html
#
# Supported distributions: Debian, Ubuntu, CentOS.
#
#
# Usage: $ sudo bash oracle-jdk-7-update.sh
# Author: Dmitriy Sukharev

INSTALL_DIR=/usr/lib/jvm
JDK7_DIR=$INSTALL_DIR/java-7-oracle

echo "The script installs Oracle JDK 7 from tar.gz file."

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root."
   exit 1
fi

echo "Looking for JDK archive..."
LATEST_JDK_ARCHIVE=`ls jdk-7u*-linux-*.tar.gz | sort | tail -1`
UPDATE=`echo $LATEST_JDK_ARCHIVE | awk -F '-' '{print $2}' | awk -F '7u' '{print $2}'`
if [ -z "$LATEST_JDK_ARCHIVE" ] || [ -z "$UPDATE" ]; then
    echo "JDK archive wasn't found. It should be in the current directory."
    exit 1
fi
echo "Found archive: $LATEST_JDK_ARCHIVE"

echo "Extracting archive..."
tar -xzf $LATEST_JDK_ARCHIVE
if [ $? -ne 0 ]; then
    echo "Error while extraction archive."
    exit 1
fi
if [ ! -d jdk1.7.0_$UPDATE ]; then
    echo "Unexpected archive content."
    exit 1
fi

echo "Moving content to installation directory..."
[ ! -e $INSTALL_DIR ] && mkdir -p $INSTALL_DIR
[ -e $INSTALL_DIR/jdk1.7.0_$UPDATE ] && rm -r $INSTALL_DIR/jdk1.7.0_$UPDATE/
[ -e $JDK7_DIR ] && rm $JDK7_DIR
mv jdk1.7.0_$UPDATE/ $INSTALL_DIR
ln -sf $INSTALL_DIR/jdk1.7.0_$UPDATE/ $JDK7_DIR
ln -sf $INSTALL_DIR/jdk1.7.0_$UPDATE/ $INSTALL_DIR/default-java


echo "Updating alternatives..."
# The following part has been taken from script
# http://webupd8.googlecode.com/files/update-java-0.5b
# and modified to make it work without X-server.

gzip -9 $JDK7_DIR/man/man1/*.1 >/dev/null 2>&1 &

LATEST=$((`update-alternatives --query java|grep Priority:|awk '{print $2}'|sort -n|tail -1`+1));

if [ -d "$JDK7_DIR/man/man1" ];then
  for f in $JDK7_DIR/man/man1/*; do
    name=`basename $f .1.gz`;
    #some files, like jvisualvm might not be links. Further assume this for corresponding man page
    if [ ! -f "/usr/bin/$name" -o -L "/usr/bin/$name" ]; then  
      if [ ! -f "$JDK7_DIR/man/man1/$name.1.gz" ]; then
        name=`basename $f .1`;          #handle any legacy uncompressed pages
      fi
      update-alternatives --install /usr/bin/$name $name $JDK7_DIR/bin/$name $LATEST \
      --slave /usr/share/man/man1/$name.1.gz $name.1.gz $JDK7_DIR/man/man1/$name.1.gz
    fi
  done
  #File links without man pages
  [ -f $JDK7_DIR/bin/java_vm ]  && update-alternatives --install /usr/bin/java_vm \
    java_vm  $JDK7_DIR/jre/bin/java_vm $LATEST
  [ -f $JDK7_DIR/bin/jcontrol ] && update-alternatives --install /usr/bin/jcontrol \
    jcontrol $JDK7_DIR/bin/jcontrol    $LATEST
else  #no man pages available
  for f in $JDK7_DIR/bin/*; do
    name=`basename $f`;
    #some files, like jvisualvm might not be links
    if [ ! -f "/usr/bin/$name" -o -L "/usr/bin/$name" ]; then
      update-alternatives --install /usr/bin/$name $name $JDK7_DIR/bin/$name $LATEST
    fi
  done
fi

echo "Setting up Mozilla plugin..."
#File links that apt-get misses
[ -f $JDK7_DIR/bin/libnpjp2.so ] && update-alternatives --install \
  /usr/lib/mozilla/plugins/libnpjp2.so libnpjp2.so $JDK7_DIR/jre/lib/i386/libnpjp2.so $LATEST

echo "Setting up env. variable JAVA_HOME..."
cat > /etc/profile.d/java-home.sh << "EOF"
export JAVA_HOME="/usr/lib/jvm/java-7-oracle"
export PATH="$JAVA_HOME/bin:$PATH"
EOF

echo "Checking version..."
java -version
echo "Done."
