#!/bin/sh

#+
#  Name:
#     topcat

#  Purpose:
#     Invokes the TOPCAT application on unix

#  Description:
#     This shell script invokes the TOPCAT application.
#     It's not very complicated, but performs some argument manipulation
#     prior to invoking java with the right classpath and classname.
#
#     1. if a class path is specified using either the CLASSPATH
#        environment variable or the -classpath flag to this script,
#        it will be added to the application classpath
#
#     2. any command-line arguments which look like they are destined
#        for java itself (starting with -D or -X, or prefixed with -J) will
#        be sent to java, and the others will be sent to the application

#  Requisites:
#     - java should be on the path.
#
#     - relative to the directory in which this script is installed,
#       one of the following jar files should exist and contain the
#       TOPCAT classes:
#          ./topcat-full.jar
#          ./topcat-lite.jar
#          ../../lib/topcat/topcat.jar

#  Authors:
#     MBT: Mark Taylor (Starlink)
#-

#  Find where this script is located.
scriptname="$0"
while [ -L "$scriptname" ]
do
   scriptname=`readlink "$scriptname" 2>/dev/null`
done
test -n "$scriptname" || scriptname=$0
bindir="`dirname $scriptname`"

# Set locations of acceptable jar files.
topcat_jars="$bindir/topcat-full.jar \
             $bindir/topcat-lite.jar \
             $bindir/../lib/topcat/topcat.jar"

# Mac-specific items.
javaArgs0=""
if test -x /usr/bin/sw_vers && /usr/bin/sw_vers | grep -iq 'Mac *OS'; then

   # Look for the jar in the resource bundle, since we may have been
   # installed that way.  This is a bit of a mess, because of historical
   # changes in the locations of these scripts.
   bundle_jar="Java/topcat-full.jar"
   topcat_jars="$topcat_jars \
                $bindir/../../$bundle_jar"

   # Look for an icon file and prepare to start java in such a way that
   # it gets used for the dock icon (rather than the generic java one).
   icns_files="$bindir/../Topcat.icns \
               /Applications/TOPCAT.app/Contents/Resources/Topcat.icns \
               $bindir/../lib/topcat/MacOS/Topcat.icns"
   icns_file=""
   for f in $icns_files; do
      if test -r "$f"; then
         icns_file="$f"
      fi
   done
   if test -r "$icns_file" && java -X 2>&1 | grep -q -- -Xdock:icon; then
      javaArgs0="$javaArgs0 "\'-Xdock:icon=$icns_file\'
   fi

   # Set Mac application name.
   javaArgs0="$javaArgs0 \
              -Dcom.apple.mrj.application.apple.menu.about.name=TOPCAT"
fi

#  Locate the application jar file. 
for j in $topcat_jars; do
   if test -z "$appjar" -a -f "$j"; then
      appjar="$j"
   fi
done
if test ! -f "$appjar"
then
   echo 1>&2 "Can't find topcat classes relative to ${scriptname} - looked for:"
   echo " " "$topcat_jars" | sed 1>&2 's/  */\n   /g'
   exit 1
fi

#  Divide the arguments into two parts: those destined as flags for
#  the java binary, and the rest.
javaArgs=""
appArgs=""
while test "$1"
do
   if echo $1 | grep -- '^-[XD]' >/dev/null; then
      javaArgs="$javaArgs "\'$1\'
   elif echo $1 | grep -- '^-J' >/dev/null; then
      javaArgs="$javaArgs "\'`echo $1 | sed s/^-J//`\'
   elif [ "$1" = "-classpath" -a -n "$2" ]; then
      shift
      export CLASSPATH="$1"
   else
      appArgs="$appArgs "\'$1\'
   fi
   shift
done

#  Check for Cygwin and transform paths.
case "`uname`" in
  CYGWIN*) 
    if test -n "$CLASSPATH"; then
       CLASSPATH=`cygpath --path --windows "${appjar}:$CLASSPATH"`
    else
       CLASSPATH=`cygpath --windows "${appjar}"`
    fi
  ;;
  *)
    CLASSPATH="${appjar}:${CLASSPATH}"
  ;;
esac

#  Run topcat.
cmd="java \
        $javaArgs0 \
        $javaArgs \
        -Duk.ac.starlink.topcat.cmdname=topcat \
        -classpath \${CLASSPATH} uk.ac.starlink.topcat.Driver \
        $appArgs"
eval "$cmd"
