blob: 5a6fc13238073d631b43c0071a5bb4eed29426c6 [file] [log] [blame]
#!/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.
#
ARG_JAVAHOME="--javahome"
ARG_VERBOSE="--verbose"
ARG_OUTPUT="--output"
ARG_EXTRACT="--extract"
ARG_JAVA_ARG_PREFIX="-J"
ARG_TEMPDIR="--tempdir"
ARG_CLASSPATHA="--classpath-append"
ARG_CLASSPATHP="--classpath-prepend"
ARG_HELP="--help"
ARG_SILENT="--silent"
ARG_NOSPACECHECK="--nospacecheck"
ARG_LOCALE="--locale"
USE_DEBUG_OUTPUT=0
PERFORM_FREE_SPACE_CHECK=1
SILENT_MODE=0
EXTRACT_ONLY=0
SHOW_HELP_ONLY=0
LOCAL_OVERRIDDEN=0
APPEND_CP=
PREPEND_CP=
LAUNCHER_APP_ARGUMENTS=
LAUNCHER_JVM_ARGUMENTS=
ERROR_OK=0
ERROR_TEMP_DIRECTORY=2
ERROR_TEST_JVM_FILE=3
ERROR_JVM_NOT_FOUND=4
ERROR_JVM_UNCOMPATIBLE=5
ERROR_EXTRACT_ONLY=6
ERROR_INPUTOUPUT=7
ERROR_FREESPACE=8
ERROR_INTEGRITY=9
ERROR_MISSING_RESOURCES=10
ERROR_JVM_EXTRACTION=11
ERROR_JVM_UNPACKING=12
ERROR_VERIFY_BUNDLED_JVM=13
VERIFY_OK=1
VERIFY_NOJAVA=2
VERIFY_UNCOMPATIBLE=3
MSG_ERROR_JVM_NOT_FOUND="nlu.jvm.notfoundmessage"
MSG_ERROR_USER_ERROR="nlu.jvm.usererror"
MSG_ERROR_JVM_UNCOMPATIBLE="nlu.jvm.uncompatible"
MSG_ERROR_INTEGRITY="nlu.integrity"
MSG_ERROR_FREESPACE="nlu.freespace"
MSG_ERROP_MISSING_RESOURCE="nlu.missing.external.resource"
MSG_ERROR_TMPDIR="nlu.cannot.create.tmpdir"
MSG_ERROR_EXTRACT_JVM="nlu.cannot.extract.bundled.jvm"
MSG_ERROR_UNPACK_JVM_FILE="nlu.cannot.unpack.jvm.file"
MSG_ERROR_VERIFY_BUNDLED_JVM="nlu.error.verify.bundled.jvm"
MSG_RUNNING="nlu.running"
MSG_STARTING="nlu.starting"
MSG_EXTRACTING="nlu.extracting"
MSG_PREPARE_JVM="nlu.prepare.jvm"
MSG_JVM_SEARCH="nlu.jvm.search"
MSG_ARG_JAVAHOME="nlu.arg.javahome"
MSG_ARG_VERBOSE="nlu.arg.verbose"
MSG_ARG_OUTPUT="nlu.arg.output"
MSG_ARG_EXTRACT="nlu.arg.extract"
MSG_ARG_TEMPDIR="nlu.arg.tempdir"
MSG_ARG_CPA="nlu.arg.cpa"
MSG_ARG_CPP="nlu.arg.cpp"
MSG_ARG_DISABLE_FREE_SPACE_CHECK="nlu.arg.disable.space.check"
MSG_ARG_LOCALE="nlu.arg.locale"
MSG_ARG_SILENT="nlu.arg.silent"
MSG_ARG_HELP="nlu.arg.help"
MSG_USAGE="nlu.msg.usage"
isSymlink=
entryPoint() {
initSymlinkArgument
CURRENT_DIRECTORY=`pwd`
LAUNCHER_NAME=`echo $0`
parseCommandLineArguments "$@"
initializeVariables
setLauncherLocale
debugLauncherArguments "$@"
if [ 1 -eq $SHOW_HELP_ONLY ] ; then
showHelp
fi
message "$MSG_STARTING"
createTempDirectory
checkFreeSpace "$TOTAL_BUNDLED_FILES_SIZE" "$LAUNCHER_EXTRACT_DIR"
extractJVMData
if [ 0 -eq $EXTRACT_ONLY ] ; then
searchJava
fi
extractBundledData
verifyIntegrity
if [ 0 -eq $EXTRACT_ONLY ] ; then
executeMainClass
else
exitProgram $ERROR_OK
fi
}
initSymlinkArgument() {
testSymlinkErr=`test -L / 2>&1 > /dev/null`
if [ -z "$testSymlinkErr" ] ; then
isSymlink=-L
else
isSymlink=-h
fi
}
debugLauncherArguments() {
debug "Launcher Command : $0"
argCounter=1
while [ $# != 0 ] ; do
debug "... argument [$argCounter] = $1"
argCounter=`expr "$argCounter" + 1`
shift
done
}
isLauncherCommandArgument() {
case "$1" in
$ARG_VERBOSE | $ARG_NOSPACECHECK | $ARG_OUTPUT | $ARG_HELP | $ARG_JAVAHOME | $ARG_TEMPDIR | $ARG_EXTRACT | $ARG_SILENT | $ARG_LOCALE | $ARG_CLASSPATHP | $ARG_CLASSPATHA)
echo 1
;;
*)
echo 0
;;
esac
}
parseCommandLineArguments() {
while [ $# != 0 ]
do
case "$1" in
$ARG_VERBOSE)
USE_DEBUG_OUTPUT=1;;
$ARG_NOSPACECHECK)
PERFORM_FREE_SPACE_CHECK=0
parseJvmAppArgument "$1"
;;
$ARG_OUTPUT)
if [ -n "$2" ] ; then
OUTPUT_FILE="$2"
if [ -f "$OUTPUT_FILE" ] ; then
# clear output file first
rm -f "$OUTPUT_FILE" > /dev/null 2>&1
touch "$OUTPUT_FILE"
fi
shift
fi
;;
$ARG_HELP)
SHOW_HELP_ONLY=1
;;
$ARG_JAVAHOME)
if [ -n "$2" ] ; then
LAUNCHER_JAVA="$2"
shift
fi
;;
$ARG_TEMPDIR)
if [ -n "$2" ] ; then
LAUNCHER_JVM_TEMP_DIR="$2"
shift
fi
;;
$ARG_EXTRACT)
EXTRACT_ONLY=1
if [ -n "$2" ] && [ `isLauncherCommandArgument "$2"` -eq 0 ] ; then
LAUNCHER_EXTRACT_DIR="$2"
shift
else
LAUNCHER_EXTRACT_DIR="$CURRENT_DIRECTORY"
fi
;;
$ARG_SILENT)
SILENT_MODE=1
parseJvmAppArgument "$1"
;;
$ARG_LOCALE)
SYSTEM_LOCALE="$2"
LOCAL_OVERRIDDEN=1
parseJvmAppArgument "$1"
;;
$ARG_CLASSPATHP)
if [ -n "$2" ] ; then
if [ -z "$PREPEND_CP" ] ; then
PREPEND_CP="$2"
else
PREPEND_CP="$2":"$PREPEND_CP"
fi
shift
fi
;;
$ARG_CLASSPATHA)
if [ -n "$2" ] ; then
if [ -z "$APPEND_CP" ] ; then
APPEND_CP="$2"
else
APPEND_CP="$APPEND_CP":"$2"
fi
shift
fi
;;
*)
parseJvmAppArgument "$1"
esac
shift
done
}
setLauncherLocale() {
if [ 0 -eq $LOCAL_OVERRIDDEN ] ; then
SYSTEM_LOCALE="$LANG"
debug "Setting initial launcher locale from the system : $SYSTEM_LOCALE"
else
debug "Setting initial launcher locale using command-line argument : $SYSTEM_LOCALE"
fi
LAUNCHER_LOCALE="$SYSTEM_LOCALE"
if [ -n "$LAUNCHER_LOCALE" ] ; then
# check if $LAUNCHER_LOCALE is in UTF-8
if [ 0 -eq $LOCAL_OVERRIDDEN ] ; then
removeUTFsuffix=`echo "$LAUNCHER_LOCALE" | sed "s/\.UTF-8//"`
isUTF=`ifEquals "$removeUTFsuffix" "$LAUNCHER_LOCALE"`
if [ 1 -eq $isUTF ] ; then
#set launcher locale to the default if the system locale name doesn`t containt UTF-8
LAUNCHER_LOCALE=""
fi
fi
localeChanged=0
localeCounter=0
while [ $localeCounter -lt $LAUNCHER_LOCALES_NUMBER ] ; do
localeVar="$""LAUNCHER_LOCALE_NAME_$localeCounter"
arg=`eval "echo \"$localeVar\""`
if [ -n "$arg" ] ; then
# if not a default locale
# $comp length shows the difference between $SYSTEM_LOCALE and $arg
# the less the length the less the difference and more coincedence
comp=`echo "$SYSTEM_LOCALE" | sed -e "s/^${arg}//"`
length1=`getStringLength "$comp"`
length2=`getStringLength "$LAUNCHER_LOCALE"`
if [ $length1 -lt $length2 ] ; then
# more coincidence between $SYSTEM_LOCALE and $arg than between $SYSTEM_LOCALE and $arg
compare=`ifLess "$comp" "$LAUNCHER_LOCALE"`
if [ 1 -eq $compare ] ; then
LAUNCHER_LOCALE="$arg"
localeChanged=1
debug "... setting locale to $arg"
fi
if [ -z "$comp" ] ; then
# means that $SYSTEM_LOCALE equals to $arg
break
fi
fi
else
comp="$SYSTEM_LOCALE"
fi
localeCounter=`expr "$localeCounter" + 1`
done
if [ $localeChanged -eq 0 ] ; then
#set default
LAUNCHER_LOCALE=""
fi
fi
debug "Final Launcher Locale : $LAUNCHER_LOCALE"
}
escapeBackslash() {
echo "$1" | sed "s/\\\/\\\\\\\/g"
}
ifLess() {
arg1=`escapeBackslash "$1"`
arg2=`escapeBackslash "$2"`
compare=`awk 'END { if ( a < b ) { print 1 } else { print 0 } }' a="$arg1" b="$arg2" < /dev/null`
echo $compare
}
formatVersion() {
formatted=`echo "$1" | sed "s/-ea//g;s/-rc[0-9]*//g;s/-beta[0-9]*//g;s/-preview[0-9]*//g;s/-dp[0-9]*//g;s/-alpha[0-9]*//g;s/-fcs//g;s/_/./g;s/-/\./g"`
formatted=`echo "$formatted" | sed "s/^\(\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\)\)\.b\([0-9][0-9]*\)/\1\.0\.\5/g"`
formatted=`echo "$formatted" | sed "s/\.b\([0-9][0-9]*\)/\.\1/g"`
echo "$formatted"
}
compareVersions() {
current1=`formatVersion "$1"`
current2=`formatVersion "$2"`
compresult=
#0 - equals
#-1 - less
#1 - more
while [ -z "$compresult" ] ; do
value1=`echo "$current1" | sed "s/\..*//g"`
value2=`echo "$current2" | sed "s/\..*//g"`
removeDots1=`echo "$current1" | sed "s/\.//g"`
removeDots2=`echo "$current2" | sed "s/\.//g"`
if [ 1 -eq `ifEquals "$current1" "$removeDots1"` ] ; then
remainder1=""
else
remainder1=`echo "$current1" | sed "s/^$value1\.//g"`
fi
if [ 1 -eq `ifEquals "$current2" "$removeDots2"` ] ; then
remainder2=""
else
remainder2=`echo "$current2" | sed "s/^$value2\.//g"`
fi
current1="$remainder1"
current2="$remainder2"
if [ -z "$value1" ] || [ 0 -eq `ifNumber "$value1"` ] ; then
value1=0
fi
if [ -z "$value2" ] || [ 0 -eq `ifNumber "$value2"` ] ; then
value2=0
fi
if [ "$value1" -gt "$value2" ] ; then
compresult=1
break
elif [ "$value2" -gt "$value1" ] ; then
compresult=-1
break
fi
if [ -z "$current1" ] && [ -z "$current2" ] ; then
compresult=0
break
fi
done
echo $compresult
}
ifVersionLess() {
compareResult=`compareVersions "$1" "$2"`
if [ -1 -eq $compareResult ] ; then
echo 1
else
echo 0
fi
}
ifVersionGreater() {
compareResult=`compareVersions "$1" "$2"`
if [ 1 -eq $compareResult ] ; then
echo 1
else
echo 0
fi
}
ifGreater() {
arg1=`escapeBackslash "$1"`
arg2=`escapeBackslash "$2"`
compare=`awk 'END { if ( a > b ) { print 1 } else { print 0 } }' a="$arg1" b="$arg2" < /dev/null`
echo $compare
}
ifEquals() {
arg1=`escapeBackslash "$1"`
arg2=`escapeBackslash "$2"`
compare=`awk 'END { if ( a == b ) { print 1 } else { print 0 } }' a="$arg1" b="$arg2" < /dev/null`
echo $compare
}
ifNumber()
{
result=0
if [ -n "$1" ] ; then
num=`echo "$1" | sed 's/[0-9]*//g' 2>/dev/null`
if [ -z "$num" ] ; then
result=1
fi
fi
echo $result
}
getStringLength() {
strlength=`awk 'END{ print length(a) }' a="$1" < /dev/null`
echo $strlength
}
resolveRelativity() {
if [ 1 -eq `ifPathRelative "$1"` ] ; then
echo "$CURRENT_DIRECTORY"/"$1" | sed 's/\"//g' 2>/dev/null
else
echo "$1"
fi
}
ifPathRelative() {
param="$1"
removeRoot=`echo "$param" | sed "s/^\\\///" 2>/dev/null`
echo `ifEquals "$param" "$removeRoot"` 2>/dev/null
}
initializeVariables() {
debug "Launcher name is $LAUNCHER_NAME"
systemName=`uname`
debug "System name is $systemName"
isMacOSX=`ifEquals "$systemName" "Darwin"`
isSolaris=`ifEquals "$systemName" "SunOS"`
if [ 1 -eq $isSolaris ] ; then
POSSIBLE_JAVA_EXE_SUFFIX="$POSSIBLE_JAVA_EXE_SUFFIX_SOLARIS"
else
POSSIBLE_JAVA_EXE_SUFFIX="$POSSIBLE_JAVA_EXE_SUFFIX_COMMON"
fi
if [ 1 -eq $isMacOSX ] ; then
# set default userdir and cachedir on MacOS
DEFAULT_USERDIR_ROOT="${HOME}/Library/Application Support/NetBeans"
DEFAULT_CACHEDIR_ROOT="${HOME}/Library/Caches/NetBeans"
else
# set default userdir and cachedir on unix systems
DEFAULT_USERDIR_ROOT=${HOME}/.netbeans
DEFAULT_CACHEDIR_ROOT=${HOME}/.cache/netbeans
fi
systemInfo=`uname -a 2>/dev/null`
debug "System Information:"
debug "$systemInfo"
debug ""
DEFAULT_DISK_BLOCK_SIZE=512
LAUNCHER_TRACKING_SIZE=$LAUNCHER_STUB_SIZE
LAUNCHER_TRACKING_SIZE_BYTES=`expr "$LAUNCHER_STUB_SIZE" \* "$FILE_BLOCK_SIZE"`
getLauncherLocation
}
parseJvmAppArgument() {
param="$1"
arg=`echo "$param" | sed "s/^-J//"`
argEscaped=`escapeString "$arg"`
if [ "$param" = "$arg" ] ; then
LAUNCHER_APP_ARGUMENTS="$LAUNCHER_APP_ARGUMENTS $argEscaped"
else
LAUNCHER_JVM_ARGUMENTS="$LAUNCHER_JVM_ARGUMENTS $argEscaped"
fi
}
getLauncherLocation() {
# if file path is relative then prepend it with current directory
LAUNCHER_FULL_PATH=`resolveRelativity "$LAUNCHER_NAME"`
debug "... normalizing full path"
LAUNCHER_FULL_PATH=`normalizePath "$LAUNCHER_FULL_PATH"`
debug "... getting dirname"
LAUNCHER_DIR=`dirname "$LAUNCHER_FULL_PATH"`
debug "Full launcher path = $LAUNCHER_FULL_PATH"
debug "Launcher directory = $LAUNCHER_DIR"
}
getLauncherSize() {
lsOutput=`ls -l --block-size=1 "$LAUNCHER_FULL_PATH" 2>/dev/null`
if [ $? -ne 0 ] ; then
#default block size
lsOutput=`ls -l "$LAUNCHER_FULL_PATH" 2>/dev/null`
fi
echo "$lsOutput" | awk ' { print $5 }' 2>/dev/null
}
verifyIntegrity() {
size=`getLauncherSize`
extractedSize=$LAUNCHER_TRACKING_SIZE_BYTES
if [ 1 -eq `ifNumber "$size"` ] ; then
debug "... check integrity"
debug "... minimal size : $extractedSize"
debug "... real size : $size"
if [ $size -lt $extractedSize ] ; then
debug "... integration check FAILED"
message "$MSG_ERROR_INTEGRITY" `normalizePath "$LAUNCHER_FULL_PATH"`
exitProgram $ERROR_INTEGRITY
fi
debug "... integration check OK"
fi
}
showHelp() {
msg0=`message "$MSG_USAGE"`
msg1=`message "$MSG_ARG_JAVAHOME $ARG_JAVAHOME"`
msg2=`message "$MSG_ARG_TEMPDIR $ARG_TEMPDIR"`
msg3=`message "$MSG_ARG_EXTRACT $ARG_EXTRACT"`
msg4=`message "$MSG_ARG_OUTPUT $ARG_OUTPUT"`
msg5=`message "$MSG_ARG_VERBOSE $ARG_VERBOSE"`
msg6=`message "$MSG_ARG_CPA $ARG_CLASSPATHA"`
msg7=`message "$MSG_ARG_CPP $ARG_CLASSPATHP"`
msg8=`message "$MSG_ARG_DISABLE_FREE_SPACE_CHECK $ARG_NOSPACECHECK"`
msg9=`message "$MSG_ARG_LOCALE $ARG_LOCALE"`
msg10=`message "$MSG_ARG_SILENT $ARG_SILENT"`
msg11=`message "$MSG_ARG_HELP $ARG_HELP"`
out "$msg0"
out "$msg1"
out "$msg2"
out "$msg3"
out "$msg4"
out "$msg5"
out "$msg6"
out "$msg7"
out "$msg8"
out "$msg9"
out "$msg10"
out "$msg11"
exitProgram $ERROR_OK
}
exitProgram() {
if [ 0 -eq $EXTRACT_ONLY ] ; then
if [ -n "$LAUNCHER_EXTRACT_DIR" ] && [ -d "$LAUNCHER_EXTRACT_DIR" ]; then
debug "Removing directory $LAUNCHER_EXTRACT_DIR"
rm -rf "$LAUNCHER_EXTRACT_DIR" > /dev/null 2>&1
fi
fi
debug "exitCode = $1"
exit $1
}
debug() {
if [ $USE_DEBUG_OUTPUT -eq 1 ] ; then
timestamp=`date '+%Y-%m-%d %H:%M:%S'`
out "[$timestamp]> $1"
fi
}
out() {
if [ -n "$OUTPUT_FILE" ] ; then
printf "%s\n" "$@" >> "$OUTPUT_FILE"
elif [ 0 -eq $SILENT_MODE ] ; then
printf "%s\n" "$@"
fi
}
message() {
msg=`getMessage "$@"`
out "$msg"
}
createTempDirectory() {
if [ 0 -eq $EXTRACT_ONLY ] ; then
if [ -z "$LAUNCHER_JVM_TEMP_DIR" ] ; then
if [ 0 -eq $EXTRACT_ONLY ] ; then
if [ -n "$TEMP" ] && [ -d "$TEMP" ] ; then
debug "TEMP var is used : $TEMP"
LAUNCHER_JVM_TEMP_DIR="$TEMP"
elif [ -n "$TMP" ] && [ -d "$TMP" ] ; then
debug "TMP var is used : $TMP"
LAUNCHER_JVM_TEMP_DIR="$TMP"
elif [ -n "$TEMPDIR" ] && [ -d "$TEMPDIR" ] ; then
debug "TEMPDIR var is used : $TEMPDIR"
LAUNCHER_JVM_TEMP_DIR="$TEMPDIR"
elif [ -d "/tmp" ] ; then
debug "Using /tmp for temp"
LAUNCHER_JVM_TEMP_DIR="/tmp"
else
debug "Using home dir for temp"
LAUNCHER_JVM_TEMP_DIR="$HOME"
fi
else
#extract only : to the curdir
LAUNCHER_JVM_TEMP_DIR="$CURRENT_DIRECTORY"
fi
fi
# if temp dir does not exist then try to create it
if [ ! -d "$LAUNCHER_JVM_TEMP_DIR" ] ; then
mkdir -p "$LAUNCHER_JVM_TEMP_DIR" > /dev/null 2>&1
if [ $? -ne 0 ] ; then
message "$MSG_ERROR_TMPDIR" "$LAUNCHER_JVM_TEMP_DIR"
exitProgram $ERROR_TEMP_DIRECTORY
fi
fi
debug "Launcher TEMP ROOT = $LAUNCHER_JVM_TEMP_DIR"
subDir=`date '+%u%m%M%S'`
subDir=`echo ".nbi-$subDir.tmp"`
LAUNCHER_EXTRACT_DIR="$LAUNCHER_JVM_TEMP_DIR/$subDir"
else
#extracting to the $LAUNCHER_EXTRACT_DIR
debug "Launcher Extracting ROOT = $LAUNCHER_EXTRACT_DIR"
fi
if [ ! -d "$LAUNCHER_EXTRACT_DIR" ] ; then
mkdir -p "$LAUNCHER_EXTRACT_DIR" > /dev/null 2>&1
if [ $? -ne 0 ] ; then
message "$MSG_ERROR_TMPDIR" "$LAUNCHER_EXTRACT_DIR"
exitProgram $ERROR_TEMP_DIRECTORY
fi
else
debug "$LAUNCHER_EXTRACT_DIR is directory and exist"
fi
debug "Using directory $LAUNCHER_EXTRACT_DIR for extracting data"
}
extractJVMData() {
debug "Extracting testJVM file data..."
extractTestJVMFile
debug "Extracting bundled JVMs ..."
extractJVMFiles
debug "Extracting JVM data done"
}
extractBundledData() {
message "$MSG_EXTRACTING"
debug "Extracting bundled jars data..."
extractJars
debug "Extracting other data..."
extractOtherData
debug "Extracting bundled data finished..."
}
setTestJVMClasspath() {
testjvmname=`basename "$TEST_JVM_PATH"`
removeClassSuffix=`echo "$testjvmname" | sed 's/\.class$//'`
notClassFile=`ifEquals "$testjvmname" "$removeClassSuffix"`
if [ -d "$TEST_JVM_PATH" ] ; then
TEST_JVM_CLASSPATH="$TEST_JVM_PATH"
debug "... testJVM path is a directory"
elif [ $isSymlink "$TEST_JVM_PATH" ] && [ $notClassFile -eq 1 ] ; then
TEST_JVM_CLASSPATH="$TEST_JVM_PATH"
debug "... testJVM path is a link but not a .class file"
else
if [ $notClassFile -eq 1 ] ; then
debug "... testJVM path is a jar/zip file"
TEST_JVM_CLASSPATH="$TEST_JVM_PATH"
else
debug "... testJVM path is a .class file"
TEST_JVM_CLASSPATH=`dirname "$TEST_JVM_PATH"`
fi
fi
debug "... testJVM classpath is : $TEST_JVM_CLASSPATH"
}
extractTestJVMFile() {
TEST_JVM_PATH=`resolveResourcePath "TEST_JVM_FILE"`
extractResource "TEST_JVM_FILE"
setTestJVMClasspath
}
installJVM() {
message "$MSG_PREPARE_JVM"
jvmFile=`resolveRelativity "$1"`
jvmDir=`dirname "$jvmFile"`/_jvm
debug "JVM Directory : $jvmDir"
mkdir "$jvmDir" > /dev/null 2>&1
if [ $? != 0 ] ; then
message "$MSG_ERROR_EXTRACT_JVM"
exitProgram $ERROR_JVM_EXTRACTION
fi
chmod +x "$jvmFile" > /dev/null 2>&1
jvmFileEscaped=`escapeString "$jvmFile"`
jvmDirEscaped=`escapeString "$jvmDir"`
cd "$jvmDir"
runCommand "$jvmFileEscaped"
ERROR_CODE=$?
cd "$CURRENT_DIRECTORY"
if [ $ERROR_CODE != 0 ] ; then
message "$MSG_ERROR_EXTRACT_JVM"
exitProgram $ERROR_JVM_EXTRACTION
fi
files=`find "$jvmDir" -name "*.jar.pack.gz" -print`
debug "Packed files : $files"
f="$files"
fileCounter=1;
while [ -n "$f" ] ; do
f=`echo "$files" | sed -n "${fileCounter}p" 2>/dev/null`
debug "... next file is $f"
if [ -n "$f" ] ; then
debug "... packed file = $f"
unpacked=`echo "$f" | sed s/\.pack\.gz//`
debug "... unpacked file = $unpacked"
fEsc=`escapeString "$f"`
uEsc=`escapeString "$unpacked"`
cmd="$jvmDirEscaped/bin/unpack200 -r $fEsc $uEsc"
runCommand "$cmd"
if [ $? != 0 ] ; then
message "$MSG_ERROR_UNPACK_JVM_FILE" "$f"
exitProgram $ERROR_JVM_UNPACKING
fi
fi
fileCounter=`expr "$fileCounter" + 1`
done
verifyJVM "$jvmDir"
if [ -z "$LAUNCHER_JAVA_EXE" ] ; then
message "$MSG_ERROR_VERIFY_BUNDLED_JVM"
exitProgram $ERROR_VERIFY_BUNDLED_JVM
fi
}
resolveResourcePath() {
resourcePrefix="$1"
resourceVar="$""$resourcePrefix""_PATH"
resourceName=`eval "echo \"$resourceVar\""`
resourcePath=`resolveString "$resourceName"`
echo "$resourcePath"
}
resolveResourceSize() {
resourcePrefix="$1"
resourceVar="$""$resourcePrefix""_SIZE"
resourceSize=`eval "echo \"$resourceVar\""`
echo "$resourceSize"
}
resolveResourceMd5() {
resourcePrefix="$1"
resourceVar="$""$resourcePrefix""_MD5"
resourceMd5=`eval "echo \"$resourceVar\""`
echo "$resourceMd5"
}
resolveResourceType() {
resourcePrefix="$1"
resourceVar="$""$resourcePrefix""_TYPE"
resourceType=`eval "echo \"$resourceVar\""`
echo "$resourceType"
}
extractResource() {
debug "... extracting resource"
resourcePrefix="$1"
debug "... resource prefix id=$resourcePrefix"
resourceType=`resolveResourceType "$resourcePrefix"`
debug "... resource type=$resourceType"
if [ $resourceType -eq 0 ] ; then
resourceSize=`resolveResourceSize "$resourcePrefix"`
debug "... resource size=$resourceSize"
resourcePath=`resolveResourcePath "$resourcePrefix"`
debug "... resource path=$resourcePath"
extractFile "$resourceSize" "$resourcePath"
resourceMd5=`resolveResourceMd5 "$resourcePrefix"`
debug "... resource md5=$resourceMd5"
checkMd5 "$resourcePath" "$resourceMd5"
debug "... done"
fi
debug "... extracting resource finished"
}
extractJars() {
counter=0
while [ $counter -lt $JARS_NUMBER ] ; do
extractResource "JAR_$counter"
counter=`expr "$counter" + 1`
done
}
extractOtherData() {
counter=0
while [ $counter -lt $OTHER_RESOURCES_NUMBER ] ; do
extractResource "OTHER_RESOURCE_$counter"
counter=`expr "$counter" + 1`
done
}
extractJVMFiles() {
javaCounter=0
debug "... total number of JVM files : $JAVA_LOCATION_NUMBER"
while [ $javaCounter -lt $JAVA_LOCATION_NUMBER ] ; do
extractResource "JAVA_LOCATION_$javaCounter"
javaCounter=`expr "$javaCounter" + 1`
done
}
processJarsClasspath() {
JARS_CLASSPATH=""
jarsCounter=0
while [ $jarsCounter -lt $JARS_NUMBER ] ; do
resolvedFile=`resolveResourcePath "JAR_$jarsCounter"`
debug "... adding jar to classpath : $resolvedFile"
if [ ! -f "$resolvedFile" ] && [ ! -d "$resolvedFile" ] && [ ! $isSymlink "$resolvedFile" ] ; then
message "$MSG_ERROP_MISSING_RESOURCE" "$resolvedFile"
exitProgram $ERROR_MISSING_RESOURCES
else
if [ -z "$JARS_CLASSPATH" ] ; then
JARS_CLASSPATH="$resolvedFile"
else
JARS_CLASSPATH="$JARS_CLASSPATH":"$resolvedFile"
fi
fi
jarsCounter=`expr "$jarsCounter" + 1`
done
debug "Jars classpath : $JARS_CLASSPATH"
}
extractFile() {
start=$LAUNCHER_TRACKING_SIZE
size=$1 #absolute size
name="$2" #relative part
fullBlocks=`expr $size / $FILE_BLOCK_SIZE`
fullBlocksSize=`expr "$FILE_BLOCK_SIZE" \* "$fullBlocks"`
oneBlocks=`expr $size - $fullBlocksSize`
oneBlocksStart=`expr "$start" + "$fullBlocks"`
checkFreeSpace $size "$name"
LAUNCHER_TRACKING_SIZE_BYTES=`expr "$LAUNCHER_TRACKING_SIZE" \* "$FILE_BLOCK_SIZE"`
if [ 0 -eq $diskSpaceCheck ] ; then
dir=`dirname "$name"`
message "$MSG_ERROR_FREESPACE" "$size" "$ARG_TEMPDIR"
exitProgram $ERROR_FREESPACE
fi
if [ 0 -lt "$fullBlocks" ] ; then
# file is larger than FILE_BLOCK_SIZE
dd if="$LAUNCHER_FULL_PATH" of="$name" \
bs="$FILE_BLOCK_SIZE" count="$fullBlocks" skip="$start"\
> /dev/null 2>&1
LAUNCHER_TRACKING_SIZE=`expr "$LAUNCHER_TRACKING_SIZE" + "$fullBlocks"`
LAUNCHER_TRACKING_SIZE_BYTES=`expr "$LAUNCHER_TRACKING_SIZE" \* "$FILE_BLOCK_SIZE"`
fi
if [ 0 -lt "$oneBlocks" ] ; then
dd if="$LAUNCHER_FULL_PATH" of="$name.tmp.tmp" bs="$FILE_BLOCK_SIZE" count=1\
skip="$oneBlocksStart"\
> /dev/null 2>&1
dd if="$name.tmp.tmp" of="$name" bs=1 count="$oneBlocks" seek="$fullBlocksSize"\
> /dev/null 2>&1
rm -f "$name.tmp.tmp"
LAUNCHER_TRACKING_SIZE=`expr "$LAUNCHER_TRACKING_SIZE" + 1`
LAUNCHER_TRACKING_SIZE_BYTES=`expr "$LAUNCHER_TRACKING_SIZE_BYTES" + "$oneBlocks"`
fi
}
md5_program=""
no_md5_program_id="no_md5_program"
initMD5program() {
if [ -z "$md5_program" ] ; then
type digest >> /dev/null 2>&1
if [ 0 -eq $? ] ; then
md5_program="digest -a md5"
else
type md5sum >> /dev/null 2>&1
if [ 0 -eq $? ] ; then
md5_program="md5sum"
else
type gmd5sum >> /dev/null 2>&1
if [ 0 -eq $? ] ; then
md5_program="gmd5sum"
else
type md5 >> /dev/null 2>&1
if [ 0 -eq $? ] ; then
md5_program="md5 -q"
else
md5_program="$no_md5_program_id"
fi
fi
fi
fi
debug "... program to check: $md5_program"
fi
}
checkMd5() {
name="$1"
md5="$2"
if [ 32 -eq `getStringLength "$md5"` ] ; then
#do MD5 check
initMD5program
if [ 0 -eq `ifEquals "$md5_program" "$no_md5_program_id"` ] ; then
debug "... check MD5 of file : $name"
debug "... expected md5: $md5"
realmd5=`$md5_program "$name" 2>/dev/null | sed "s/ .*//g"`
debug "... real md5 : $realmd5"
if [ 32 -eq `getStringLength "$realmd5"` ] ; then
if [ 0 -eq `ifEquals "$md5" "$realmd5"` ] ; then
debug "... integration check FAILED"
message "$MSG_ERROR_INTEGRITY" `normalizePath "$LAUNCHER_FULL_PATH"`
exitProgram $ERROR_INTEGRITY
fi
else
debug "... looks like not the MD5 sum"
fi
fi
fi
}
searchJavaEnvironment() {
if [ -z "$LAUNCHER_JAVA_EXE" ] ; then
# search java in the environment
ptr="$POSSIBLE_JAVA_ENV"
while [ -n "$ptr" ] && [ -z "$LAUNCHER_JAVA_EXE" ] ; do
argJavaHome=`echo "$ptr" | sed "s/:.*//"`
back=`echo "$argJavaHome" | sed "s/\\\//\\\\\\\\\//g"`
end=`echo "$ptr" | sed "s/${back}://"`
argJavaHome=`echo "$back" | sed "s/\\\\\\\\\//\\\//g"`
ptr="$end"
eval evaluated=`echo \\$$argJavaHome` > /dev/null
if [ -n "$evaluated" ] ; then
debug "EnvVar $argJavaHome=$evaluated"
verifyJVM "$evaluated"
fi
done
fi
}
installBundledJVMs() {
if [ -z "$LAUNCHER_JAVA_EXE" ] ; then
# search bundled java in the common list
javaCounter=0
while [ $javaCounter -lt $JAVA_LOCATION_NUMBER ] && [ -z "$LAUNCHER_JAVA_EXE" ] ; do
fileType=`resolveResourceType "JAVA_LOCATION_$javaCounter"`
if [ $fileType -eq 0 ] ; then # bundled->install
argJavaHome=`resolveResourcePath "JAVA_LOCATION_$javaCounter"`
installJVM "$argJavaHome"
fi
javaCounter=`expr "$javaCounter" + 1`
done
fi
}
searchJavaOnMacOs() {
if [ -x "/usr/libexec/java_home" ]; then
javaOnMacHome=`/usr/libexec/java_home --failfast`
fi
if [ ! -x "$javaOnMacHome/bin/java" -a -f "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java" ] ; then
javaOnMacHome=`echo "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"`
fi
verifyJVM "$javaOnMacHome"
}
searchJavaSystemDefault() {
if [ -z "$LAUNCHER_JAVA_EXE" ] ; then
debug "... check default java in the path"
java_bin=`which java 2>&1`
if [ $? -eq 0 ] && [ -n "$java_bin" ] ; then
remove_no_java_in=`echo "$java_bin" | sed "s/no java in//g"`
if [ 1 -eq `ifEquals "$remove_no_java_in" "$java_bin"` ] && [ -f "$java_bin" ] ; then
debug "... java in path found: $java_bin"
# java is in path
java_bin=`resolveSymlink "$java_bin"`
debug "... java real path: $java_bin"
parentDir=`dirname "$java_bin"`
if [ -n "$parentDir" ] ; then
parentDir=`dirname "$parentDir"`
if [ -n "$parentDir" ] ; then
debug "... java home path: $parentDir"
parentDir=`resolveSymlink "$parentDir"`
debug "... java home real path: $parentDir"
verifyJVM "$parentDir"
fi
fi
fi
fi
fi
}
searchJavaSystemPaths() {
if [ -z "$LAUNCHER_JAVA_EXE" ] ; then
# search java in the common system paths
javaCounter=0
while [ $javaCounter -lt $JAVA_LOCATION_NUMBER ] && [ -z "$LAUNCHER_JAVA_EXE" ] ; do
fileType=`resolveResourceType "JAVA_LOCATION_$javaCounter"`
argJavaHome=`resolveResourcePath "JAVA_LOCATION_$javaCounter"`
debug "... next location $argJavaHome"
if [ $fileType -ne 0 ] ; then # bundled JVMs have already been proceeded
argJavaHome=`escapeString "$argJavaHome"`
locations=`ls -d -1 $argJavaHome 2>/dev/null`
nextItem="$locations"
itemCounter=1
while [ -n "$nextItem" ] && [ -z "$LAUNCHER_JAVA_EXE" ] ; do
nextItem=`echo "$locations" | sed -n "${itemCounter}p" 2>/dev/null`
debug "... next item is $nextItem"
nextItem=`removeEndSlashes "$nextItem"`
if [ -n "$nextItem" ] ; then
if [ -d "$nextItem" ] || [ $isSymlink "$nextItem" ] ; then
debug "... checking item : $nextItem"
verifyJVM "$nextItem"
fi
fi
itemCounter=`expr "$itemCounter" + 1`
done
fi
javaCounter=`expr "$javaCounter" + 1`
done
fi
}
searchJavaUserDefined() {
if [ -z "$LAUNCHER_JAVA_EXE" ] ; then
if [ -n "$LAUNCHER_JAVA" ] ; then
verifyJVM "$LAUNCHER_JAVA"
if [ $VERIFY_UNCOMPATIBLE -eq $verifyResult ] ; then
message "$MSG_ERROR_JVM_UNCOMPATIBLE" "$LAUNCHER_JAVA" "$ARG_JAVAHOME"
exitProgram $ERROR_JVM_UNCOMPATIBLE
elif [ $VERIFY_NOJAVA -eq $verifyResult ] ; then
message "$MSG_ERROR_USER_ERROR" "$LAUNCHER_JAVA"
exitProgram $ERROR_JVM_NOT_FOUND
fi
fi
fi
}
searchJavaInstallFolder() {
installFolder="`dirname \"$0\"`"
installFolder="`( cd \"$installFolder\" && pwd )`"
installFolder="$installFolder/bin/jre"
tempJreFolder="$TEST_JVM_CLASSPATH/_jvm"
if [ -d "$installFolder" ] ; then
#copy nested JRE to temp folder
cp -r "$installFolder" "$tempJreFolder"
verifyJVM "$tempJreFolder"
fi
}
searchJava() {
message "$MSG_JVM_SEARCH"
if [ ! -f "$TEST_JVM_CLASSPATH" ] && [ ! $isSymlink "$TEST_JVM_CLASSPATH" ] && [ ! -d "$TEST_JVM_CLASSPATH" ]; then
debug "Cannot find file for testing JVM at $TEST_JVM_CLASSPATH"
message "$MSG_ERROR_JVM_NOT_FOUND" "$ARG_JAVAHOME"
exitProgram $ERROR_TEST_JVM_FILE
else
searchJavaInstallFolder
searchJavaUserDefined
installBundledJVMs
searchJavaEnvironment
searchJavaSystemDefault
searchJavaSystemPaths
if [ 1 -eq $isMacOSX ] ; then
searchJavaOnMacOs
fi
fi
if [ -z "$LAUNCHER_JAVA_EXE" ] ; then
message "$MSG_ERROR_JVM_NOT_FOUND" "$ARG_JAVAHOME"
exitProgram $ERROR_JVM_NOT_FOUND
fi
}
normalizePath() {
argument="$1"
# replace all /./ to /
while [ 0 -eq 0 ] ; do
testArgument=`echo "$argument" | sed 's/\/\.\//\//g' 2> /dev/null`
if [ -n "$testArgument" ] && [ 0 -eq `ifEquals "$argument" "$testArgument"` ] ; then
# something changed
argument="$testArgument"
else
break
fi
done
# replace XXX/../YYY to 'dirname XXX'/YYY
while [ 0 -eq 0 ] ; do
beforeDotDot=`echo "$argument" | sed "s/\/\.\.\/.*//g" 2> /dev/null`
if [ 0 -eq `ifEquals "$beforeDotDot" "$argument"` ] && [ 0 -eq `ifEquals "$beforeDotDot" "."` ] && [ 0 -eq `ifEquals "$beforeDotDot" ".."` ] ; then
esc=`echo "$beforeDotDot" | sed "s/\\\//\\\\\\\\\//g"`
afterDotDot=`echo "$argument" | sed "s/^$esc\/\.\.//g" 2> /dev/null`
parent=`dirname "$beforeDotDot"`
argument=`echo "$parent""$afterDotDot"`
else
break
fi
done
# replace XXX/.. to 'dirname XXX'
while [ 0 -eq 0 ] ; do
beforeDotDot=`echo "$argument" | sed "s/\/\.\.$//g" 2> /dev/null`
if [ 0 -eq `ifEquals "$beforeDotDot" "$argument"` ] && [ 0 -eq `ifEquals "$beforeDotDot" "."` ] && [ 0 -eq `ifEquals "$beforeDotDot" ".."` ] ; then
argument=`dirname "$beforeDotDot"`
else
break
fi
done
# remove /. a the end (if the resulting string is not zero)
testArgument=`echo "$argument" | sed 's/\/\.$//' 2> /dev/null`
if [ -n "$testArgument" ] ; then
argument="$testArgument"
fi
# replace more than 2 separators to 1
testArgument=`echo "$argument" | sed 's/\/\/*/\//g' 2> /dev/null`
if [ -n "$testArgument" ] ; then
argument="$testArgument"
fi
echo "$argument"
}
resolveSymlink() {
pathArg="$1"
while [ $isSymlink "$pathArg" ] ; do
ls=`ls -ld "$pathArg"`
link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
if expr "$link" : '^/' 2> /dev/null >/dev/null; then
pathArg="$link"
else
pathArg="`dirname "$pathArg"`"/"$link"
fi
pathArg=`normalizePath "$pathArg"`
done
echo "$pathArg"
}
verifyJVM() {
javaTryPath=`normalizePath "$1"`
verifyJavaHome "$javaTryPath"
if [ $VERIFY_OK -ne $verifyResult ] ; then
savedResult=$verifyResult
if [ 0 -eq $isMacOSX ] ; then
#check private jre
javaTryPath="$javaTryPath""/jre"
verifyJavaHome "$javaTryPath"
else
#check MacOSX Home dir
javaTryPath="$javaTryPath""/Home"
verifyJavaHome "$javaTryPath"
fi
if [ $VERIFY_NOJAVA -eq $verifyResult ] ; then
verifyResult=$savedResult
fi
fi
}
removeEndSlashes() {
arg="$1"
tryRemove=`echo "$arg" | sed 's/\/\/*$//' 2>/dev/null`
if [ -n "$tryRemove" ] ; then
arg="$tryRemove"
fi
echo "$arg"
}
checkJavaHierarchy() {
# return 0 on no java
# return 1 on jre
# return 2 on jdk
tryJava="$1"
javaHierarchy=0
if [ -n "$tryJava" ] ; then
if [ -d "$tryJava" ] || [ $isSymlink "$tryJava" ] ; then # existing directory or a isSymlink
javaBin="$tryJava"/"bin"
if [ -d "$javaBin" ] || [ $isSymlink "$javaBin" ] ; then
javaBinJavac="$javaBin"/"javac"
if [ -f "$javaBinJavac" ] || [ $isSymlink "$javaBinJavac" ] ; then
#definitely JDK as the JRE doesn`t contain javac
javaHierarchy=2
else
#check if we inside JRE
javaBinJava="$javaBin"/"java"
if [ -f "$javaBinJava" ] || [ $isSymlink "$javaBinJava" ] ; then
javaHierarchy=1
fi
fi
fi
fi
fi
if [ 0 -eq $javaHierarchy ] ; then
debug "... no java there"
elif [ 1 -eq $javaHierarchy ] ; then
debug "... JRE there"
elif [ 2 -eq $javaHierarchy ] ; then
debug "... JDK there"
fi
}
verifyJavaHome() {
verifyResult=$VERIFY_NOJAVA
java=`removeEndSlashes "$1"`
debug "... verify : $java"
java=`resolveSymlink "$java"`
debug "... real path : $java"
checkJavaHierarchy "$java"
if [ 0 -ne $javaHierarchy ] ; then
testJVMclasspath=`escapeString "$TEST_JVM_CLASSPATH"`
testJVMclass=`escapeString "$TEST_JVM_CLASS"`
pointer="$POSSIBLE_JAVA_EXE_SUFFIX"
while [ -n "$pointer" ] && [ -z "$LAUNCHER_JAVA_EXE" ]; do
arg=`echo "$pointer" | sed "s/:.*//"`
back=`echo "$arg" | sed "s/\\\//\\\\\\\\\//g"`
end=`echo "$pointer" | sed "s/${back}://"`
arg=`echo "$back" | sed "s/\\\\\\\\\//\\\//g"`
pointer="$end"
javaExe="$java/$arg"
if [ -x "$javaExe" ] ; then
javaExeEscaped=`escapeString "$javaExe"`
command="$javaExeEscaped -classpath $testJVMclasspath $testJVMclass"
debug "Executing java verification command..."
debug "$command"
output=`eval "$command" 2>/dev/null`
javaVersion=`echo "$output" | sed "2d;3d;4d;5d"`
javaVmVersion=`echo "$output" | sed "1d;3d;4d;5d"`
vendor=`echo "$output" | sed "1d;2d;4d;5d"`
osname=`echo "$output" | sed "1d;2d;3d;5d"`
osarch=`echo "$output" | sed "1d;2d;3d;4d"`
debug "Java :"
debug " executable = {$javaExe}"
debug " javaVersion = {$javaVersion}"
debug " javaVmVersion = {$javaVmVersion}"
debug " vendor = {$vendor}"
debug " osname = {$osname}"
debug " osarch = {$osarch}"
comp=0
if [ -n "$javaVersion" ] && [ -n "$javaVmVersion" ] && [ -n "$vendor" ] && [ -n "$osname" ] && [ -n "$osarch" ] ; then
debug "... seems to be java indeed"
javaVersionEsc=`escapeBackslash "$javaVersion"`
javaVmVersionEsc=`escapeBackslash "$javaVmVersion"`
javaVersion=`awk 'END { idx = index(b,a); if(idx!=0) { print substr(b,idx,length(b)) } else { print a } }' a="$javaVersionEsc" b="$javaVmVersionEsc" < /dev/null`
#remove build number
javaVersion=`echo "$javaVersion" | sed 's/-.*$//;s/\ .*//'`
verifyResult=$VERIFY_UNCOMPATIBLE
if [ -n "$javaVersion" ] ; then
debug " checking java version = {$javaVersion}"
javaCompCounter=0
while [ $javaCompCounter -lt $JAVA_COMPATIBLE_PROPERTIES_NUMBER ] && [ -z "$LAUNCHER_JAVA_EXE" ] ; do
comp=1
setJavaCompatibilityProperties_$javaCompCounter
debug "Min Java Version : $JAVA_COMP_VERSION_MIN"
debug "Max Java Version : $JAVA_COMP_VERSION_MAX"
debug "Java Vendor : $JAVA_COMP_VENDOR"
debug "Java OS Name : $JAVA_COMP_OSNAME"
debug "Java OS Arch : $JAVA_COMP_OSARCH"
if [ -n "$JAVA_COMP_VERSION_MIN" ] ; then
compMin=`ifVersionLess "$javaVersion" "$JAVA_COMP_VERSION_MIN"`
if [ 1 -eq $compMin ] ; then
comp=0
fi
fi
if [ -n "$JAVA_COMP_VERSION_MAX" ] ; then
compMax=`ifVersionGreater "$javaVersion" "$JAVA_COMP_VERSION_MAX"`
if [ 1 -eq $compMax ] ; then
comp=0
fi
fi
if [ -n "$JAVA_COMP_VENDOR" ] ; then
debug " checking vendor = {$vendor}, {$JAVA_COMP_VENDOR}"
subs=`echo "$vendor" | sed "s/${JAVA_COMP_VENDOR}//"`
if [ `ifEquals "$subs" "$vendor"` -eq 1 ] ; then
comp=0
debug "... vendor incompatible"
fi
fi
if [ -n "$JAVA_COMP_OSNAME" ] ; then
debug " checking osname = {$osname}, {$JAVA_COMP_OSNAME}"
subs=`echo "$osname" | sed "s/${JAVA_COMP_OSNAME}//"`
if [ `ifEquals "$subs" "$osname"` -eq 1 ] ; then
comp=0
debug "... osname incompatible"
fi
fi
if [ -n "$JAVA_COMP_OSARCH" ] ; then
debug " checking osarch = {$osarch}, {$JAVA_COMP_OSARCH}"
subs=`echo "$osarch" | sed "s/${JAVA_COMP_OSARCH}//"`
if [ `ifEquals "$subs" "$osarch"` -eq 1 ] ; then
comp=0
debug "... osarch incompatible"
fi
fi
if [ $comp -eq 1 ] ; then
LAUNCHER_JAVA_EXE="$javaExe"
LAUNCHER_JAVA="$java"
verifyResult=$VERIFY_OK
fi
debug " compatible = [$comp]"
javaCompCounter=`expr "$javaCompCounter" + 1`
done
fi
fi
fi
done
fi
}
checkFreeSpace() {
size="$1"
path="$2"
if [ ! -d "$path" ] && [ ! $isSymlink "$path" ] ; then
# if checking path is not an existing directory - check its parent dir
path=`dirname "$path"`
fi
diskSpaceCheck=0
if [ 0 -eq $PERFORM_FREE_SPACE_CHECK ] ; then
diskSpaceCheck=1
else
# get size of the atomic entry (directory)
freeSpaceDirCheck="$path"/freeSpaceCheckDir
debug "Checking space in $path (size = $size)"
mkdir -p "$freeSpaceDirCheck"
# POSIX compatible du return size in 1024 blocks
du --block-size=$DEFAULT_DISK_BLOCK_SIZE "$freeSpaceDirCheck" 1>/dev/null 2>&1
if [ $? -eq 0 ] ; then
debug " getting POSIX du with 512 bytes blocks"
atomicBlock=`du --block-size=$DEFAULT_DISK_BLOCK_SIZE "$freeSpaceDirCheck" | awk ' { print $A }' A=1 2>/dev/null`
else
debug " getting du with default-size blocks"
atomicBlock=`du "$freeSpaceDirCheck" | awk ' { print $A }' A=1 2>/dev/null`
fi
rm -rf "$freeSpaceDirCheck"
debug " atomic block size : [$atomicBlock]"
isBlockNumber=`ifNumber "$atomicBlock"`
if [ 0 -eq $isBlockNumber ] ; then
out "Can\`t get disk block size"
exitProgram $ERROR_INPUTOUPUT
fi
requiredBlocks=`expr \( "$1" / $DEFAULT_DISK_BLOCK_SIZE \) + $atomicBlock` 1>/dev/null 2>&1
if [ `ifNumber $1` -eq 0 ] ; then
out "Can\`t calculate required blocks size"
exitProgram $ERROR_INPUTOUPUT
fi
# get free block size
column=4
df -P --block-size="$DEFAULT_DISK_BLOCK_SIZE" "$path" 1>/dev/null 2>&1
if [ $? -eq 0 ] ; then
# gnu df, use POSIX output
debug " getting GNU POSIX df with specified block size $DEFAULT_DISK_BLOCK_SIZE"
availableBlocks=`df -P --block-size="$DEFAULT_DISK_BLOCK_SIZE" "$path" | sed "1d" | awk ' { print $A }' A=$column 2>/dev/null`
else
# try POSIX output
df -P "$path" 1>/dev/null 2>&1
if [ $? -eq 0 ] ; then
debug " getting POSIX df with 512 bytes blocks"
availableBlocks=`df -P "$path" | sed "1d" | awk ' { print $A }' A=$column 2>/dev/null`
# try Solaris df from xpg4
elif [ -x /usr/xpg4/bin/df ] ; then
debug " getting xpg4 df with default-size blocks"
availableBlocks=`/usr/xpg4/bin/df -P "$path" | sed "1d" | awk ' { print $A }' A=$column 2>/dev/null`
# last chance to get free space
else
debug " getting df with default-size blocks"
availableBlocks=`df "$path" | sed "1d" | awk ' { print $A }' A=$column 2>/dev/null`
fi
fi
debug " available blocks : [$availableBlocks]"
if [ `ifNumber "$availableBlocks"` -eq 0 ] ; then
out "Can\`t get the number of the available blocks on the system"
exitProgram $ERROR_INPUTOUTPUT
fi
# compare
debug " required blocks : [$requiredBlocks]"
if [ $availableBlocks -gt $requiredBlocks ] ; then
debug "... disk space check OK"
diskSpaceCheck=1
else
debug "... disk space check FAILED"
fi
fi
if [ 0 -eq $diskSpaceCheck ] ; then
mbDownSize=`expr "$size" / 1024 / 1024`
mbUpSize=`expr "$size" / 1024 / 1024 + 1`
mbSize=`expr "$mbDownSize" \* 1024 \* 1024`
if [ $size -ne $mbSize ] ; then
mbSize="$mbUpSize"
else
mbSize="$mbDownSize"
fi
message "$MSG_ERROR_FREESPACE" "$mbSize" "$ARG_TEMPDIR"
exitProgram $ERROR_FREESPACE
fi
}
prepareClasspath() {
debug "Processing external jars ..."
processJarsClasspath
LAUNCHER_CLASSPATH=""
if [ -n "$JARS_CLASSPATH" ] ; then
if [ -z "$LAUNCHER_CLASSPATH" ] ; then
LAUNCHER_CLASSPATH="$JARS_CLASSPATH"
else
LAUNCHER_CLASSPATH="$LAUNCHER_CLASSPATH":"$JARS_CLASSPATH"
fi
fi
if [ -n "$PREPEND_CP" ] ; then
debug "Appending classpath with [$PREPEND_CP]"
PREPEND_CP=`resolveString "$PREPEND_CP"`
if [ -z "$LAUNCHER_CLASSPATH" ] ; then
LAUNCHER_CLASSPATH="$PREPEND_CP"
else
LAUNCHER_CLASSPATH="$PREPEND_CP":"$LAUNCHER_CLASSPATH"
fi
fi
if [ -n "$APPEND_CP" ] ; then
debug "Appending classpath with [$APPEND_CP]"
APPEND_CP=`resolveString "$APPEND_CP"`
if [ -z "$LAUNCHER_CLASSPATH" ] ; then
LAUNCHER_CLASSPATH="$APPEND_CP"
else
LAUNCHER_CLASSPATH="$LAUNCHER_CLASSPATH":"$APPEND_CP"
fi
fi
debug "Launcher Classpath : $LAUNCHER_CLASSPATH"
}
resolvePropertyStrings() {
args="$1"
escapeReplacedString="$2"
propertyStart=`echo "$args" | sed "s/^.*\\$P{//"`
propertyValue=""
propertyName=""
#Resolve i18n strings and properties
if [ 0 -eq `ifEquals "$propertyStart" "$args"` ] ; then
propertyName=`echo "$propertyStart" | sed "s/}.*//" 2>/dev/null`
if [ -n "$propertyName" ] ; then
propertyValue=`getMessage "$propertyName"`
if [ 0 -eq `ifEquals "$propertyValue" "$propertyName"` ] ; then
propertyName="\$P{$propertyName}"
args=`replaceString "$args" "$propertyName" "$propertyValue" "$escapeReplacedString"`
fi
fi
fi
echo "$args"
}
resolveLauncherSpecialProperties() {
args="$1"
escapeReplacedString="$2"
propertyValue=""
propertyName=""
propertyStart=`echo "$args" | sed "s/^.*\\$L{//"`
if [ 0 -eq `ifEquals "$propertyStart" "$args"` ] ; then
propertyName=`echo "$propertyStart" | sed "s/}.*//" 2>/dev/null`
if [ -n "$propertyName" ] ; then
case "$propertyName" in
"nbi.launcher.tmp.dir")
propertyValue="$LAUNCHER_EXTRACT_DIR"
;;
"nbi.launcher.java.home")
propertyValue="$LAUNCHER_JAVA"
;;
"nbi.launcher.user.home")
propertyValue="$HOME"
;;
"nbi.launcher.parent.dir")
propertyValue="$LAUNCHER_DIR"
;;
*)
propertyValue="$propertyName"
;;
esac
if [ 0 -eq `ifEquals "$propertyValue" "$propertyName"` ] ; then
propertyName="\$L{$propertyName}"
args=`replaceString "$args" "$propertyName" "$propertyValue" "$escapeReplacedString"`
fi
fi
fi
echo "$args"
}
resolveString() {
args="$1"
escapeReplacedString="$2"
last="$args"
repeat=1
while [ 1 -eq $repeat ] ; do
repeat=1
args=`resolvePropertyStrings "$args" "$escapeReplacedString"`
args=`resolveLauncherSpecialProperties "$args" "$escapeReplacedString"`
if [ 1 -eq `ifEquals "$last" "$args"` ] ; then
repeat=0
fi
last="$args"
done
echo "$args"
}
replaceString() {
initialString="$1"
fromString="$2"
toString="$3"
if [ -n "$4" ] && [ 0 -eq `ifEquals "$4" "false"` ] ; then
toString=`escapeString "$toString"`
fi
fromString=`echo "$fromString" | sed "s/\\\//\\\\\\\\\//g" 2>/dev/null`
toString=`echo "$toString" | sed "s/\\\//\\\\\\\\\//g" 2>/dev/null`
replacedString=`echo "$initialString" | sed "s/${fromString}/${toString}/g" 2>/dev/null`
echo "$replacedString"
}
prepareJVMArguments() {
debug "Prepare JVM arguments... "
jvmArgCounter=0
debug "... resolving string : $LAUNCHER_JVM_ARGUMENTS"
LAUNCHER_JVM_ARGUMENTS=`resolveString "$LAUNCHER_JVM_ARGUMENTS" true`
debug "... resolved string : $LAUNCHER_JVM_ARGUMENTS"
while [ $jvmArgCounter -lt $JVM_ARGUMENTS_NUMBER ] ; do
argumentVar="$""JVM_ARGUMENT_$jvmArgCounter"
arg=`eval "echo \"$argumentVar\""`
debug "... jvm argument [$jvmArgCounter] [initial] : $arg"
arg=`resolveString "$arg"`
debug "... jvm argument [$jvmArgCounter] [resolved] : $arg"
arg=`escapeString "$arg"`
debug "... jvm argument [$jvmArgCounter] [escaped] : $arg"
LAUNCHER_JVM_ARGUMENTS="$LAUNCHER_JVM_ARGUMENTS $arg"
jvmArgCounter=`expr "$jvmArgCounter" + 1`
done
if [ ! -z "${DEFAULT_USERDIR_ROOT}" ] ; then
debug "DEFAULT_USERDIR_ROOT: $DEFAULT_USERDIR_ROOT"
LAUNCHER_JVM_ARGUMENTS="$LAUNCHER_JVM_ARGUMENTS -Dnetbeans.default_userdir_root=\"${DEFAULT_USERDIR_ROOT}\""
fi
if [ ! -z "${DEFAULT_CACHEDIR_ROOT}" ] ; then
debug "DEFAULT_CACHEDIR_ROOT: $DEFAULT_CACHEDIR_ROOT"
LAUNCHER_JVM_ARGUMENTS="$LAUNCHER_JVM_ARGUMENTS -Dnetbeans.default_cachedir_root=\"${DEFAULT_CACHEDIR_ROOT}\""
fi
debug "Final JVM arguments : $LAUNCHER_JVM_ARGUMENTS"
}
prepareAppArguments() {
debug "Prepare Application arguments... "
appArgCounter=0
debug "... resolving string : $LAUNCHER_APP_ARGUMENTS"
LAUNCHER_APP_ARGUMENTS=`resolveString "$LAUNCHER_APP_ARGUMENTS" true`
debug "... resolved string : $LAUNCHER_APP_ARGUMENTS"
while [ $appArgCounter -lt $APP_ARGUMENTS_NUMBER ] ; do
argumentVar="$""APP_ARGUMENT_$appArgCounter"
arg=`eval "echo \"$argumentVar\""`
debug "... app argument [$appArgCounter] [initial] : $arg"
arg=`resolveString "$arg"`
debug "... app argument [$appArgCounter] [resolved] : $arg"
arg=`escapeString "$arg"`
debug "... app argument [$appArgCounter] [escaped] : $arg"
LAUNCHER_APP_ARGUMENTS="$LAUNCHER_APP_ARGUMENTS $arg"
appArgCounter=`expr "$appArgCounter" + 1`
done
debug "Final application arguments : $LAUNCHER_APP_ARGUMENTS"
}
runCommand() {
cmd="$1"
debug "Running command : $cmd"
if [ -n "$OUTPUT_FILE" ] ; then
#redirect all stdout and stderr from the running application to the file
eval "$cmd" >> "$OUTPUT_FILE" 2>&1
elif [ 1 -eq $SILENT_MODE ] ; then
# on silent mode redirect all out/err to null
eval "$cmd" > /dev/null 2>&1
elif [ 0 -eq $USE_DEBUG_OUTPUT ] ; then
# redirect all output to null
# do not redirect errors there but show them in the shell output
eval "$cmd" > /dev/null
else
# using debug output to the shell
# not a silent mode but a verbose one
eval "$cmd"
fi
return $?
}
executeMainClass() {
prepareClasspath
prepareJVMArguments
prepareAppArguments
debug "Running main jar..."
message "$MSG_RUNNING"
classpathEscaped=`escapeString "$LAUNCHER_CLASSPATH"`
mainClassEscaped=`escapeString "$MAIN_CLASS"`
launcherJavaExeEscaped=`escapeString "$LAUNCHER_JAVA_EXE"`
tmpdirEscaped=`escapeString "$LAUNCHER_JVM_TEMP_DIR"`
command="$launcherJavaExeEscaped $LAUNCHER_JVM_ARGUMENTS -Djava.io.tmpdir=$tmpdirEscaped -classpath $classpathEscaped $mainClassEscaped $LAUNCHER_APP_ARGUMENTS"
debug "Running command : $command"
runCommand "$command"
exitCode=$?
debug "... java process finished with code $exitCode"
exitProgram $exitCode
}
escapeString() {
echo "$1" | sed "s/\\\/\\\\\\\/g;s/\ /\\\\ /g;s/\"/\\\\\"/g;s/(/\\\\\(/g;s/)/\\\\\)/g;" # escape spaces, commas and parentheses
}
getMessage() {
getLocalizedMessage_$LAUNCHER_LOCALE $@
}
POSSIBLE_JAVA_ENV="JAVA:JAVA_HOME:JAVAHOME:JAVA_PATH:JAVAPATH:JDK:JDK_HOME:JDKHOME:ANT_JAVA:"
POSSIBLE_JAVA_EXE_SUFFIX_SOLARIS="bin/java:bin/sparcv9/java:"
POSSIBLE_JAVA_EXE_SUFFIX_COMMON="bin/java:"