#!/bin/bash

# prints usage information and exits
function usage() {
  echo "Usage: MRGjava [-d] [-nocheck] jarFile [arg1 [, arg2 [, ...]]]";
  echo "   -d   Enable debugging lines to be output";
  echo "   -nocheck   Inhibits proof checking";
  echo;
  if [ ! -n "${MRGJVMHOME}" ]
    then
      echo "Please set environment variable MRGJVMHOME";
  fi
  echo;
  exit;
}


# Check MRGJVMHOME is set - this points to mrg.jar, bcel.jar, gf, isabelle and VCG (heapfile)
if [ ! -n "${MRGJVMHOME}" ]
  then
    usage;
fi


# Look for mrg.jar
if [ -f "${MRGJVMHOME}/mrg.jar" ]
  then
    MRG_JAR_PATH="${MRGJVMHOME}/mrg.jar"
  else
    echo "Cannot find \"mrg.jar\" in \"${MRGJVMHOME}\"";
    exit;
fi


# Look for bcel.jar
if [ -f "${MRGJVMHOME}/bcel.jar" ]
  then
    BCEL_JAR_PATH="${MRGJVMHOME}/bcel.jar"
  else
    echo "Cannot find \"bcel.jar\" in \"${MRGJVMHOME}\"";
    exit;
fi

# Look for gf
if [ ! -f "${MRGJVMHOME}/gf" ]
  then
    echo "Cannot find \"gf\" in \"${MRGJVMHOME}\"";
    exit;
fi

# Look for isabelle and VCG
if [ ! -f "${MRGJVMHOME}/isabelle" ]
  then
    echo "Cannot find \"isabelle\" in \"${MRGJVMHOME}\"";
    exit;
fi
if [ ! -f "${MRGJVMHOME}/VCG" ]
  then
    echo "Cannot fint \"VCG\" in \"${MRGJVMHOME}\"";
    exit;
fi


#defaults
CHECK="yes";

# first deal with the option arguments of form '-[d,temp=<tmpdir>,nocheck]'
while [[ $1 == -* ]]
do
    if [[ $1 == "-d" ]]
	then
	    DEBUG=1;
    elif [[ ${1:0:6} == "-temp=" ]]
        then
            TMP_DIR=${1:6};
    elif [[ $1 == "-nocheck" ]]
	then
	    CHECK="no";
    else
	usage;
    fi
    shift; # get rid of one argument
done


# there should still be AT LEAST one argument left
if [[ ! -n $1 ]]
  then
    usage;
fi


# Check validity of target .jar
if [[ -f $1 ]]
  then
    myJAR=$1;
  else
    echo "\"$1\" is not a valid .jar file";
    usage;
fi


if [ ! "${TMP_DIR}" ]
then
  TMP_DIR="/tmp/mrg";
fi
SET_TMP_DIR="-Dmrg.tmp.directory=${TMP_DIR}";


# get ClassName by removing path and extension from myJAR
myFILE=`expr match "${myJAR}" '.*[/]\([^/]*$\)'`; # FILE
if [[ ${myFILE} == "" ]]
  then
    myFILE=${myJAR};
fi
myCLASS=${myFILE%.jar};

# Alternatively
#myCLASS=`java -cp ${MRG_JAR_PATH} mrg.jarbuilder.MRGJarInspector MRG-ClassName $1`;
#myCERT=`java -cp ${MRG_JAR_PATH} mrg.jarbuilder.MRGJarInspector MRG-CertificateName $1`;

SET_MRGCLASSNAME="-Dmrg.classname=${myCLASS}"
#SET_MRGCERTIFICATENAME="-Dmrg.certificatename=${myCERT}"


# check if debugging information is required
if [ $DEBUG ]
  then
    JAVAAGENT_OPTS="=debug";
fi

# construct JVM arguments
SET_CLASSPATH="-cp ${BCEL_JAR_PATH}:${MRG_JAR_PATH}:${myJAR}"
SET_SECURITYMANAGER="-Djava.security.manager=mrg.security.MRGSecurityManager"
if [ $CHECK == "yes" ]
  then
    SET_JAVAAGENT="-javaagent:${MRG_JAR_PATH}${JAVAAGENT_OPTS}";
fi


# run the command
shift; # leave with only program arguments

COMMAND="java ${SET_CLASSPATH} ${SET_JAVAAGENT} ${SET_SECURITYMANAGER} -Dmrg.jvm.home=${MRGJVMHOME} ${SET_MRGCLASSNAME} ${SET_TMP_DIR} ${myCLASS} $*"

echo ${COMMAND};
${COMMAND}
