#!/bin/sh

########################################################## 
#               Gridworks Control System                 #
##########################################################

fail () {
   cat <<EOF
ERROR: $1
Type '$0 -h' for usage information.
EOF
exit 1
}

error() {
    echo "$1"
    exit 1
}

usage() {
    cat <<EOF
Usage: $0 [options] <action>
where [options] include:

  -h print this message and exit
  
  -p <port> the port that gridworks will listen to
     default: 3333

  -i <interface> the host interface gridworks should bind to
     default: 127.0.0.1

  -w <path> path to the webapp
     default: src/main/webapp
     
  -d enable JVM debugging (on port 8000)
       
  -x enable JMX monitoring (for jconsole)
  
and <action> is one of

   build ..................... Build Gridworks      
   run ....................... Run Gridworks
   
   make_dmg <version> ........ Make MacOSX DMG distribution
   make_exe <version> ........ Make Windows EXE distribution
   
   clean ..................... Clean compiled classes
   distclean ................. Remove all generated files
                
EOF
    exit 1
}

add_option() {
  OPTS="$OPTS $1"
}

OPTS="$GRIDWORKS_OPTS"

SYSTEM=`uname`

if [ "$SYSTEM" == "Darwin" ] && [ "$JAVA_HOME" == "" ] ; then
    export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home"
fi
        
# ----- actions -------------------------------------------------

check_macosx() {
    if [ "$SYSTEM" != 'Darwin' ] ; then
        error "This action can only run on MacOSX"
    fi
}
    
ant_prepare() {
    if [ ! -d $GRIDWORKS_BUILD_DIR ] ; then 
        mkdir $GRIDWORKS_BUILD_DIR || exit 1
    fi
    
    ANT=`which ant`
    if [ "$ANT" = "" ] ; then
        ANT_TAR=`find thirdparty | grep apache-ant | grep -v svn`
        ANT_DIR=`echo $ANT_TAR | sed 's/.tar.gz//'`
        if [ ! -d $ANT_DIR ] ; then
            tar xzf $ANT_TAR -C $GRIDWORKS_BUILD_DIR || exit 1
        fi
        ANT="$ANT_DIR/bin/ant"
    fi
}

ant() {
    ant_prepare    
    $ANT -f build.xml -Dbuild.dir="$GRIDWORKS_BUILD_DIR" -Ddist.dir="$GRIDWORKS_DIST_DIR" -Dversion="$VERSION" -Dnum_version="$NUM_VERSION" -Djava.options="$JAVA_OPTIONS" $1 || exit 1
}

dist_prepare() {
    if [ ! -d $GRIDWORKS_DIST_DIR ] ; then 
        mkdir $GRIDWORKS_DIST_DIR || exit 1
    fi
}
       
launch4j_prepare() {
    LAUNCH4J_TAR=`find thirdparty | grep launch4j | grep -v svn`
    LAUNCH4J_DIR="thirdparty/launch4j"
    if [ ! -d "$LAUNCH4J_DIR" ] ; then
        tar xzf $LAUNCH4J_TAR -C thirdparty || exit 1
    fi
}

get_version() {
    VERSION=$1        
    
    if [ "$VERSION" == "" ] ; then
        fail "Must specify a version number"
    fi
    
    NUM_VERSION=`echo $VERSION | sed 's/\a//g'`
}
    
make_exe() {
    check_macosx
    dist_prepare
    launch4j_prepare
    get_version $1
    
    ant exe
}
    
make_dmg() {
    check_macosx
    dist_prepare
    get_version $1
    
    ant bundle

    mkdir "$GRIDWORKS_BUILD_DIR/bundle/.background"
    cp src/graphics/dmg_background/dmg_background.png "$GRIDWORKS_BUILD_DIR/bundle/.background/dmg_background.png"
    
    SIZE=30
    
    TITLE="Gridworks $VERSION"
    echo "Building MacOSX DMG for $TITLE"
    hdiutil create -srcfolder "$GRIDWORKS_BUILD_DIR/bundle" -volname "$TITLE" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${SIZE}m "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg"
    DEVICE=$(hdiutil attach -readwrite -noverify -noautoopen "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg" | egrep '^/dev/' | sed 1q | awk '{print $1}')
    hdiutil attach "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg"
    
    echo '
       tell application "Finder"
         tell disk "'$TITLE'"
            open
            set current view of container window to icon view
            set toolbar visible of container window to false
            set statusbar visible of container window to false
            set the bounds of container window to {200, 100, 760, 460}
            set theViewOptions to the icon view options of container window
            set arrangement of theViewOptions to not arranged
            set icon size of theViewOptions to 100
            set background picture of theViewOptions to file ".background:'dmg_background.png'"
            make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
            set position of item "'Gridworks'" of container window to {170, 175}
            set position of item "Applications" of container window to {380, 175}
            close
            open               
            update without registering applications
            delay 2
            eject
         end tell
       end tell
    ' | osascript    
    
    chmod -Rf go-w /Volumes/Gridworks
    sync
    sync
    hdiutil detach $DEVICE
    hdiutil convert "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg" -format UDZO -imagekey zlib-level=9 -o "$GRIDWORKS_DIST_DIR/gridworks-$VERSION.dmg"
    hdiutil internet-enable -yes "$GRIDWORKS_DIST_DIR/gridworks-$VERSION.dmg"
    rm -f "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg"
}

run() {
    if [ ! -d $GRIDWORKS_BUILD_DIR/classes ] ; then
        ant build
        echo ""
    fi
    
    CLASSPATH="$GRIDWORKS_BUILD_DIR/classes:$GRIDWORKS_LIB_DIR/*"

    RUN_CMD="$JAVA -cp $CLASSPATH $OPTS -Xdock:name=Gridworks -Xdock:icon=src/graphics/icon/gridworks.icns com.metaweb.gridworks.Gridworks"
  
    echo "Starting Gridworks at 'http://${GRIDWORKS_HOST}:${GRIDWORKS_PORT}/'"
    echo ""
    #echo "$RUN_CMD"
    #echo ""

    exec $RUN_CMD
}
    
# ----- We called without arguments print the usage -------------

[ $# -gt 0 ] || usage

# ----- Normalize the current directory -------------------------

cd `dirname $0`

# ----- Make sure there is a java environment installed -------------------------
    
if [ ! -z "$JAVA_HOME" ] ; then
    JAVA="$JAVA_HOME/bin/java"
else 
    JAVA=`which java`
    if [ -z "$JAVA" ] ; then
        if [ "$SYSTEM" = 'Darwin' ] ; then
            JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
        else
            error "The 'java' command should be in your path or the 'JAVA_HOME' environment variable should be set"
        fi
    fi
fi

JAVA_VERSION=`java -version 2>&1 | grep version | cut -d ' ' -f 3 | egrep ^\"1.6`
if [ -z "$JAVA_VERSION" ] ; then
    error "Gridworks requires java version 6 or later."
fi

# ----- Parse the command line args ------------------------------------------

while [ $# -ne 0 ] ; do
  case "$1" in
    -p) shift; GRIDWORKS_PORT="$1"; shift; continue;;
    -i) shift; GRIDWORKS_HOST="$1"; shift; continue;;
    -w) shift; GRIDWORKS_WEBAPP="$1"; shift; continue;;
    -d) shift; add_option '-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n'; continue;;
    -x) shift; add_option '-Dcom.sun.management.jmxremote'; continue;;
    -*) fail "Invalid option: $1";;
    *) break;;
  esac
done

ACTION=$1; shift

# ----- Verify and Set Required Environment Variables -------------------------

if [ "$JAVA_OPTIONS" == "" ] ; then
  JAVA_OPTIONS="-Xms256M -Xmx1024M -XX:+UseLargePages -XX:+UseParallelGC"
fi
add_option "$JAVA_OPTIONS"

if [ "$GRIDWORKS_PORT" == "" ] ; then
    GRIDWORKS_PORT="3333"
fi
add_option "-Dgridworks.port=$GRIDWORKS_PORT"

if [ "$GRIDWORKS_HOST" == "" ] ; then
    GRIDWORKS_HOST="127.0.0.1"
fi
add_option "-Dgridworks.host=$GRIDWORKS_HOST"

if [ "$GRIDWORKS_WEBAPP" == "" ] ; then
    GRIDWORKS_WEBAPP="src/main/webapp"
fi
add_option "-Dgridworks.webapp=$GRIDWORKS_WEBAPP"

if [ "$GRIDWORKS_BUILD_DIR" == "" ] ; then
    GRIDWORKS_BUILD_DIR="build"
fi

if [ "$GRIDWORKS_LIB_DIR" == "" ] ; then
    GRIDWORKS_LIB_DIR="lib"
fi

if [ "$GRIDWORKS_DIST_DIR" == "" ] ; then
    GRIDWORKS_DIST_DIR="dist"
fi

# ----- Respond to the action given --------------------------------------------

case "$ACTION" in
  build)
    ant build;;

  bundle)
    ant bundle;;

  clean)
    ant clean;;

  distclean)
    ant distclean;;

  run) 
    run;;  
    
  make_dmg)
    make_dmg $1;;

  make_exe)
    make_exe $1;;
      
  *)
    usage; ;;
esac