#!/bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

## Create a self contained application specific tar bundle that can be
## brought to a system, unpacked and run.
##
## Requires that maven (mvn) be installed and on the PATH
##
## Run from the Application project's top level directory.

USAGE="usage: `basename $0` [--platform {java8|java7|android}] [--mainClass classname] [--appjar jarname] [--add csv-paths]"

## --platform the platform the app was built for (default: java8. options: java7, android)
##   This controls which Edgent platform jars are collected.
##   E.g., use "--platform java7" when the app is built using
##   the profile "-Pplatform-java7".
## --mainClass the main class name (default: com.mycompany.app.App)
## --appjar the application jar name (default: my-app-1.0-SNAPSHOT.jar)
## --add additional csv paths to include in the tarball (default: none)
##   Works best for paths in/under the App's project dir.
##   NOTE: anything in the App's src/main/resources dir generally
##   gets included in the App's jar.

set -e

MAIN_CLASS=com.mycompany.app.App
APP_JAR=my-app-1.0-SNAPSHOT.jar
ADD_PATHS=
PLATFORM=

if [ "${1}" = "--platform" -a $# -gt 1 ] ; then
  PLATFORM=${2}; shift; shift
  if [ "${PLATFORM}" = "java8" ] ; then
      PLATFORM=
  fi
fi
if [ "${1}" = "--mainClass" -a $# -gt 1 ] ; then
  MAIN_CLASS=${2}; shift; shift
fi
if [ "${1}" = "--appjar" -a $# -gt 1 ] ; then
  APP_JAR=${2}; shift; shift
fi
if [ "${1}" = "--add" -a $# -gt 1 ] ; then
  ADD_PATHS=${2}; shift; shift
  ADD_PATHS=`echo ${ADD_PATHS} | sed -e 's/,/ /g'`
fi
if [ $# != 0 ]; then
    echo "$USAGE"
    exit 1
fi

echo
echo "##### get the app specific dependencies..."
PROFILES=
if [ "${PLATFORM}" ] ; then
  PROFILES="-Pplatform-${PLATFORM}"
fi
rm -rf target/dependency
mvn dependency:copy-dependencies -DincludeScope=runtime ${PROFILES}

echo
echo "##### create target/app-run.sh..."
cat >target/app-run.sh <<EOF
#!/bin/sh

set -e

USAGE="usage: \`basename \$0\` [ args ... ]"

CP=${APP_JAR}
for i in dependency/\*; do
  CP=\${CP}:\${i}
done

export CLASSPATH=\${CP}
java ${MAIN_CLASS} "\$@"
EOF
chmod +x target/app-run.sh

echo
echo "##### create target/app-pkg.tar..."
D=`pwd`
tar cf target/app-pkg.tar -C target app-run.sh ${APP_JAR} dependency -C ${D} ${ADD_PATHS}

echo
echo "##### Copy target/app-pkg.tar to the destination system"
echo "##### To run the app:"
echo "#####     mkdir app-pkg"
echo "#####     tar xf app-pkg.tar -C app-pkg"
echo "#####     (cd app-pkg; ./app-run.sh)"
