#!/bin/ksh
PROGRAM_NAME=$0

INTF_NAME=TxnServer
IMPL_NAME="$INTF_NAME"Impl
PKG0=examples
PKG1=txn

JDK_BASE=jdk1.2

# -----------------------------------------------------------------------------
# begin parseArgs
USAGE="usage: $PROGRAM_NAME [-usage] [-help] [-src home] [-jdk jdk] [-policy level] [-host hostname] [-port port] [-jit] [-sec] [-nojar] [-groups g0 g1 ...]"

ARG_LIST="-src -jdk -policy -host -port -groups"

SRC_HOME=$HOME
JDK_HOME=$SRC_HOME/$JDK_BASE
POLICY_LEVEL=2
HTTP_SERVER_HOST=`hostname`:
PORT=8081
JIT=
SEC=
USE_JAR_EXE=true
GROUPS=`hostname`
SET_GROUPS=false

for arg in $*
do
  if [ "$arg" = -usage ]
  then
    echo
    echo $USAGE
    echo
    exit 
  fi
done

for arg in $*
do
  if [ "$arg" = -help ]
  then
    echo 
    echo $USAGE
    echo "where options include:"
    echo 
    echo " -src    <base directory of example source, class and jar files>"
    echo "         Example: enter /export/home, then"
    echo "                  source files assumed in /export/home/src,"
    echo "                  class files assumed in /export/home/classes,"
    echo "                  jar files assumed in /export/home/jars"
    echo "         (Default = $SRC_HOME)."
    echo " -jdk    <base directory of JDK bin>"
    echo "         Example: enter /java/jdk1.2, bin assumed in /java/jdk1.2/bin"
    echo "         (Default = $JDK_HOME)."
    echo " -policy <security policy level -- 0,1,2>"
    echo "         level = 0 -- all codebases granted all permissions"
    echo "         level = 1 -- all codebases granted minimum permissions"
    echo "         level = 2 -- minimum codebases granted minimum permissions"
    echo "         (Default = $POLICY_LEVEL)."
    echo " -host   <hostname of HTTP server -- for RMI codebase>"
    echo "         (Default = $HTTP_SERVER_HOST)"
    echo " -port   <port number on which the HTTP server listens>"
    echo "         (Default = $PORT)."
    echo " -jit    <disable the JIT>"
    echo "         (Default = enabled)."
    echo " -sec    <enable security debugging>"
    echo "         (Default = disabled)."
    echo " -nojar  <disable the JAR execution mechanism>"
    echo "         the recommended method for initiating execution of this"
    echo "         program is with the JAR execution mechanism. But if"
    echo "         the class files were built on a windows system, and will"
    echo "         be executed on a unix system, then the manifest of the"
    echo "         JAR file that was generated at build time will"
    echo "         reference download extension JAR files through a"
    echo "         windows-style file URL (having a drive letter). Because"
    echo "         of the mismatch in file system notations, executing the"
    echo "         program using JAR execution will result in a"
    echo "         NoClassFoundFoundError. In this case, initiating"
    echo "         execution through the program package and class name,"
    echo "         with the -classpath property set, is advisable."
    echo "         (Default = JAR execution mechanism enabled)."
    echo " -groups <set of lookup groups to join>"
    echo "         (Default = $GROUPS)."
    echo 
    exit
  fi
done

# Step through the argument list, extracting the appropriate values
while [ "$#" -gt 0 ]
do
  ARG=$1
  for f in $ARG_LIST
  do
    if [ "$ARG" = "$f" ]
    then
      shift
      break
    fi
  done
  # test for all expected single-item args
  if [ "$ARG" = -jit ]
  then
    JIT="-Djava.compiler="
    SET_GROUPS=false
  fi
  if [ "$ARG" = -sec ]
  then
    SEC="-Djava.security.debug=access,failure"
    SET_GROUPS=false
  fi
  if [ "$ARG" = -nojar ]
  then
    USE_JAR_EXE=false
    SET_GROUPS=false
  fi
  # if there are no args left, then exit loop
  if [ "$#" -eq 0 ]
  then
    break
  fi
  # test for all expected double-item args
  if [ "$ARG" = -src ]
  then
    SRC_HOME=$1
    SET_GROUPS=false
  fi

  if [ "$ARG" = -jdk ]
  then
    JDK_HOME=$1
    SET_GROUPS=false
  fi
  if [ "$ARG" = -policy ]
  then
    POLICY_LEVEL=$1
    SET_GROUPS=false
  fi
  if [ "$ARG" = -host ]
  then
    HTTP_SERVER_HOST="$1":
    SET_GROUPS=false
  fi
  if [ "$ARG" = -port ]
  then
    PORT=$1
    SET_GROUPS=false
  fi
  if [ "$SET_GROUPS" = true ]
  then
    GROUPS="$GROUPS,$1"
  fi
  if [ "$ARG" = -groups ]
  then
    GROUPS=$1
    SET_GROUPS=true
  fi

  shift
done
#end parseArgs
# -----------------------------------------------------------------------------
echo
echo --- $PROGRAM_NAME ---
# -----------------------------------------------------------------------------
# Set variables that are dependent on the arguments input to this script
EXE_JAR=$SRC_HOME/jars/$INTF_NAME.jar
EXPORT_CODEBASE="http://localhost:8080/sun-util.jar http://""$HTTP_SERVER_HOST""$PORT/$INTF_NAME-srvc-dl.jar http://""$HTTP_SERVER_HOST""$PORT/$INTF_NAME-attr-dl.jar" 
POLICY_FILE="$SRC_HOME/src/$PKG0/$PKG1/policy$INTF_NAME"
POLICY_CODEBASE_LOCAL="file:$EXE_JAR"
POLICY_CODEBASE_JINI="file:$SRC_HOME/jars/jini-ext.jar"
POLICY_CODEBASE_SUN_UTIL="file:$SRC_HOME/jars/sun-util.jar"
POLICY_CODEBASE_MAHALO="file:$SRC_HOME/jars/mahalo.jar"

# Build the policy file according to the policy level
# (0,1,2 - least,middle,most restrictive)
# Create the default policy file first

echo grant codebase '"'$POLICY_CODEBASE_LOCAL'"' { > $POLICY_FILE
echo "     permission java.io.FilePermission" '"'./*'"', '"read,write,execute,delete";' >> $POLICY_FILE
echo "     permission java.lang.RuntimePermission" '"modifyThreadGroup";' >> $POLICY_FILE
echo "     permission java.lang.RuntimePermission" '"modifyThread";' >> $POLICY_FILE
echo "     permission java.net.SocketPermission" '"*:1024-", "connect,accept";' >> $POLICY_FILE
echo "     permission net.jini.discovery.DiscoveryPermission "'"*"'";" >> $POLICY_FILE
echo '};' >> $POLICY_FILE
echo "" >> $POLICY_FILE
echo grant codebase '"'$POLICY_CODEBASE_JINI'"' { >> $POLICY_FILE
echo "     permission java.lang.RuntimePermission" '"modifyThreadGroup";' >> $POLICY_FILE
echo "     permission java.lang.RuntimePermission" '"modifyThread";' >> $POLICY_FILE
echo "     permission java.net.SocketPermission" '"*:1024-", "connect,accept";' >> $POLICY_FILE
echo "     permission java.net.SocketPermission" '"224.0.1.84", "connect,accept";' >> $POLICY_FILE
echo "     permission java.net.SocketPermission" '"224.0.1.85", "connect,accept";' >> $POLICY_FILE
echo "     permission java.util.PropertyPermission" '"net.jini.discovery.*", "read";' >> $POLICY_FILE
echo "     permission net.jini.discovery.DiscoveryPermission "'"*"'";" >> $POLICY_FILE
echo '};' >> $POLICY_FILE
echo "" >> $POLICY_FILE
echo grant codebase '"'$POLICY_CODEBASE_SUN_UTIL'"' { >> $POLICY_FILE
echo "     permission java.net.SocketPermission" '"*:1024-", "connect,accept";' >> $POLICY_FILE
echo '};' >> $POLICY_FILE

if [ "$POLICY_LEVEL" = 1 ]
then
  echo grant { > $POLICY_FILE
  echo "     permission java.lang.RuntimePermission" '"modifyThreadGroup";' >> $POLICY_FILE
  echo "     permission java.lang.RuntimePermission" '"modifyThread";' >> $POLICY_FILE
  echo "     permission java.net.SocketPermission" '"*:1024-", "connect,accept";' >> $POLICY_FILE
  echo "     permission java.net.SocketPermission" '"224.0.1.84", "connect,accept";' >> $POLICY_FILE
  echo "     permission java.net.SocketPermission" '"224.0.1.85", "connect,accept";' >> $POLICY_FILE
  echo "     permission java.util.PropertyPermission" '"net.jini.discovery.*", "read";' >> $POLICY_FILE
  echo "     permission net.jini.discovery.DiscoveryPermission "'"*"'";" >> $POLICY_FILE
  echo '};' >> $POLICY_FILE
elif [ "$POLICY_LEVEL" = 0 ]
then
  echo grant { > $POLICY_FILE
  echo "     permission java.security.AllPermission" '"", "";' >> $POLICY_FILE
  echo '};' >> $POLICY_FILE
fi

CLASSPATH=
export CLASSPATH

if [ "$JDK_HOME" != "" ]
then
  PATH="$JDK_HOME"/bin:$PATH
  export PATH
fi
echo 
java -version
echo

# Use the 'jar mechanism' to execute the program.
SYS_PROPS="$JIT $SEC -Djava.security.policy=$POLICY_FILE"
if [ "$USE_JAR_EXE" = true ]
then
  echo   java $SYS_PROPS -Djava.rmi.server.codebase="$EXPORT_CODEBASE" -jar $EXE_JAR $GROUPS

  java $SYS_PROPS -Djava.rmi.server.codebase="$EXPORT_CODEBASE" -jar $EXE_JAR $GROUPS
else
  CP=$SRC_HOME/jars/jini-core.jar:$SRC_HOME/jars/jini-ext.jar:$SRC_HOME/jars/sun-util.jar:$EXE_JAR
  EXE_CLASS=$PKG0.$PKG1.$IMPL_NAME
  echo   java -cp $CP $SYS_PROPS -Djava.rmi.server.codebase="$EXPORT_CODEBASE" $EXE_CLASS $GROUPS

  java -cp $CP $SYS_PROPS -Djava.rmi.server.codebase="$EXPORT_CODEBASE" $EXE_CLASS $GROUPS
fi
# -----------------------------------------------------------------------------
