#!/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.


# set the current working dir as the PROJECT_HOME variable

cygwin=false;
darwin=false;
case `uname` in
  CYGWIN*) cygwin=true ;;
  Darwin*) darwin=true
           if [ -z "$JAVA_HOME" ] ; then
             if [ -x '/usr/libexec/java_home' ] ; then
               JAVA_HOME=`/usr/libexec/java_home`
             elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
               JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
             fi
           fi
           ;;
esac

if [ "$cygwin" = "true" ] ; then
  PROJECT_HOME=`cygpath -w "$PWD"`
else
  PROJECT_HOME=`pwd`
fi

if [ -z "$FORREST_HOME" ] ; then
  # use the location of this script to infer $FORREST_HOME

  thisprg="$0"

  # Resolve links - $thisprg may be a symbolic link

  while [ -h "$thisprg" ] ; do
    ls=`ls -ld "$thisprg"`
    link=`expr "$ls" : '.*-> \(.*\)$'`

    if expr "$link" : '/.*' > /dev/null; then
      thisprg="$link"
    else
      thisprg=`dirname "$thisprg"`/"$link"
    fi
  done

  FORREST_HOME=`dirname "$thisprg"`/..

  # Make it fully qualified

  FORREST_HOME=`cd "$FORREST_HOME" && pwd`
fi

# Save old JAVA_TOOL_OPTIONS
OLD_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS"
unset OLD_TOOL_OPTIONS
JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"

# Save old ANT_HOME
OLD_ANT_HOME="$ANT_HOME"
unset ANT_HOME
ANT_HOME="$FORREST_HOME/tools/ant"

# ----- Set Up The Runtime Classpath ------------------------------------------

if [ "$cygwin" = "true" ] ; then
  S=';'
  FORREST_DOT_HOME=`cygpath -w "$FORREST_HOME"`
  FORREST_SHELL_HOME=`cygpath -u "$FORREST_HOME"`
else
  S=':'
  FORREST_DOT_HOME=$FORREST_HOME
  FORREST_SHELL_HOME=$FORREST_HOME
fi

# set the ant file to use
ANTFILE="$FORREST_DOT_HOME/main/forrest.build.xml"

CP="$CLASSPATH"
export CP
unset CLASSPATH

for i in $FORREST_SHELL_HOME/lib/endorsed/*.jar; do
  if [ "$cygwin" = "true" ] ; then
    LIB=`cygpath -w $i`
  else
    LIB=$i
  fi

  CLASSPATH=$CLASSPATH$S$LIB
done

export CLASSPATH

echo "Apache Forrest.  Run 'forrest -projecthelp' to list options"
echo
export FORREST_HOME
"$ANT_HOME/bin/ant" --noconfig -buildfile "$ANTFILE" -Dbasedir="$PROJECT_HOME" -emacs "$@"
RESULT=$?

# ---- Restore Classpath
unset CLASSPATH
CLASSPATH=$CP
export CLASSPATH

# ---- Restore ANT_HOME
# Restore old ANT_HOME
ANT_HOME="$OLD_ANT_HOME"
export ANT_HOME

# ---- Restore JAVA_TOOL_OPTIONS
JAVA_TOOL_OPTIONS="$OLD_TOOL_OPTIONS"
export JAVA_TOOL_OPTIONS

exit $RESULT
