#!/bin/sh # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. # # Copyright 1997-2011 Oracle and/or its affiliates. All rights reserved. # # Oracle and Java are registered trademarks of Oracle and/or its affiliates. # Other names may be trademarks of their respective owners. # # The contents of this file are subject to the terms of either the GNU # General Public License Version 2 only ("GPL") or the Common # Development and Distribution License("CDDL") (collectively, the # "License"). You may not use this file except in compliance with the # License. You can obtain a copy of the License at # http://www.netbeans.org/cddl-gplv2.html # or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the # specific language governing permissions and limitations under the # License. When distributing the software, include this License Header # Notice in each file and include the License file at # nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle in the GPL Version 2 section of the License file that # accompanied this code. If applicable, add the following below the # License Header, with the fields enclosed by brackets [] replaced by # your own identifying information: # "Portions Copyrighted [year] [name of copyright owner]" # # Contributor(s): # # The Original Software is NetBeans. The Initial Developer of the Original # Software is Sun Microsystems, Inc. Portions Copyright 1997-2011 Sun # Microsystems, Inc. All Rights Reserved. # # If you wish your version of this file to be governed by only the CDDL # or only the GPL Version 2, indicate your decision by adding # "[Contributor] elects to include this software in this distribution # under the [CDDL or GPL Version 2] license." If you do not indicate a # single choice of license, a recipient has the option to distribute # your version of this file under either the CDDL, the GPL Version 2 or # to extend the choice of license to its licensees as provided above. # However, if you add GPL Version 2 code and therefore, elected the GPL # Version 2 license, then the option applies only if the new code is # made subject to such option by the copyright holder. PRG=$0 resolve_symlink () { file="$1" while [ -h "$file" ]; do ls=`ls -ld "$file"` link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null` if expr "$link" : '^/' 2> /dev/null >/dev/null; then file="$link" else file=`dirname "$1"`"/$link" fi done echo "$file" } absolutize_path () { oldpwd=`pwd` cd "$1" abspath=`pwd` cd "${oldpwd}" echo "$abspath" } PRG=`resolve_symlink "$PRG"` progdir=`dirname "$PRG"` plathome=`absolutize_path "$progdir/.."` jargs=${jreflags} jargs="$jargs -Dnetbeans.home=\"$plathome\"" args="" prefixcp="" postfixcp="" updater_class=org.netbeans.updater.UpdaterFrame # # parse arguments # parse_args() { while [ $# -gt 0 ] ; do case "$1" in -h|-\?|-help|--help) cat >&2 < path to Java(TM) 2 SDK, Standard Edition -J pass to JVM --cp:p prepend to classpath --cp:a append to classpath EOF # go on and print IDE options as well args="$args --help" ;; --jdkhome) shift; if [ $# -gt 0 ] ; then jdkhome=$1; fi ;; # this has to be here for purposes of updater.jar, but it should be # better to handle this argument inside the java launcher part --userdir) shift; if [ $# -gt 0 ] ; then userdir="$1"; fi ;; -cp|-cp:a|--cp|--cp:a) shift; if [ $# -gt 0 ] ; then if [ ! -z "$postfixcp" ] ; then postfixcp="$postfixcp:" ; fi postfixcp=$postfixcp$1; fi ;; -cp:p|--cp:p) shift; if [ $# -gt 0 ] ; then if [ ! -z "$prefixcp" ] ; then prefixcp="$prefixcp:" ; fi prefixcp=$prefixcp$1; fi ;; --clusters) shift; if [ $# -gt 0 ] ; then clusters="$1" fi ;; -psn*) shift; ;; -J*) jopt=`expr "X-$1" : 'X--J\(.*\)'`; jargs="$jargs '$jopt'";; *) args="$args \"$1\"" ;; esac shift done } # parse_args() # Process arguments given on the command line. parse_args "$@" # # check JDK # if [ -z "$jdkhome" ] ; then # try to find JDK case "`uname`" in Darwin*) if [ -f "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java" ] ; then jdkhome="/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home" elif [ -f "/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java" ] ; then jdkhome="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home" elif [ -f "/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/java" ] ; then jdkhome="/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home" fi ;; *) javac=`which javac` if [ -z "$javac" ] ; then java=`which java` if [ ! -z "$java" ] ; then java=`resolve_symlink "$java"` jdkhome=`dirname $java`"/.." fi else javac=`resolve_symlink "$javac"` jdkhome=`dirname $javac`"/.." fi ;; esac fi if [ ! -x "${jdkhome}/bin/java" ] ; then echo "Cannot find java. Please use the --jdkhome switch." >&2 exit 2 fi # if heap dump on OOME is supported enable it if "${jdkhome}/bin/java" -XX:+HeapDumpOnOutOfMemoryError > /dev/null 2>&1 ; then jargs="$jargs -XX:+HeapDumpOnOutOfMemoryError" if echo $jargs | grep -v -- "-XX:HeapDumpPath=" > /dev/null ; then jargs="$jargs -XX:HeapDumpPath=\"${userdir}/var/log/heapdump.hprof\"" fi fi jargs_without_clusters="$jargs" jargs="-Dnetbeans.dirs=\"${clusters}\" $jargs_without_clusters" jdkhome=`absolutize_path "$jdkhome"` args="--userdir \"${userdir}\" $args" append_jars_to_cp() { dir="$1" subpath="$2" for ex in jar zip ; do if [ "`echo "${dir}"/*.$ex`" != "${dir}/*.$ex" ] ; then for x in "${dir}"/*.$ex ; do subx=`basename "$x"` if echo "$paths" | fgrep -v "$subpath$subx" > /dev/null ; then if [ ! -z "$cp" ] ; then cp="$cp:" ; fi cp="$cp$x" if [ ! -z "$paths" ] ; then paths="$paths:" ; fi paths="$paths$subpath$subx" fi done fi done } construct_cp() { cp="" updatercp="" paths="" build_cp "${userdir}" build_cp "${plathome}" if [ -f "${userdir}/modules/ext/updater.jar" ] ; then updatercp="${userdir}/modules/ext/updater.jar" else if [ -f "${plathome}/modules/ext/updater.jar" ] ; then updatercp="${plathome}/modules/ext/updater.jar" fi fi # JDK tools for x in "${jdkhome}/lib/dt.jar" "${jdkhome}/lib/tools.jar"; do if [ -f "$x" ]; then if [ ! -z "$cp" ] ; then cp="$cp:" ; fi cp="${cp}$x" fi done # user-specified prefix and postfix CLASSPATH if [ ! -z "${prefixcp}" ] ; then cp="${prefixcp}:$cp" fi if [ ! -z "${postfixcp}" ] ; then cp="$cp:${postfixcp}" fi # prepend IDE's classpath to updater's classpath # (just xml-apis.jar and one XML parser would suffice) if [ ! -z "$updatercp" ] ; then updatercp=${cp}:${updatercp} else updatercp=${cp} fi } build_cp() { base="$1" append_jars_to_cp "${base}/lib/patches" "patches" append_jars_to_cp "${base}/lib" "lib" append_jars_to_cp "${base}/lib/locale" "locale" } do_run_updater() { eval "\"$jdkhome/bin/java\"" -classpath "\"${updatercp}\"" "$jargs" "-Dnetbeans.user=\"$userdir\"" $updater_class "$args" construct_cp } look_for_pre_runs() { base="$1" install_new_updater "$1" dir="${base}/update/download" if [ "`echo "${dir}"/*.nbm`" != "${dir}/*.nbm" -o "`echo "${dir}"/*.jar`" != "${dir}/*.jar" ] ; then run_updater=yes else dir="${base}/update/deactivate" if [ -f "${dir}/to_disable.txt" -o -f "${dir}/to_uninstall.txt" ] ; then run_updater=yes fi fi } look_for_post_runs() { base="$1" install_new_updater "$1" dir="${base}/update/download" if [ \! -f "${dir}/install_later.xml" ] && [ "`echo "${dir}"/*.nbm`" != "${dir}/*.nbm" -o "`echo "${dir}"/*.jar`" != "${dir}/*.jar" ] ; then run_updater=yes else dir="${base}/update/deactivate" if [ \! -f "${dir}/deactivate_later.txt" ] ; then if [ -f "${dir}/to_disable.txt" -o -f "${dir}/to_uninstall.txt" ] ; then run_updater=yes fi fi fi } look_for_new_clusters() { base="$userdir" dir="${base}/update/download" newclusters="${dir}/netbeans.dirs" if [ -f "${newclusters}" ] ; then clusters=`cat "${newclusters}"` jargs="-Dnetbeans.dirs=\"${clusters}\" $jargs_without_clusters" rm -f "${newclusters}" fi } delete_new_clusters_file() { base="$userdir" dir="${base}/update/download" newclusters="${dir}/netbeans.dirs" if [ \! -f "${newclusters}" ] ; then rm -f "${newclusters}" fi } install_new_updater() { base="$1" newUpdaterDir="${base}/update/new_updater" if [ -d "${newUpdaterDir}" ]; then mkdir -p "${base}/modules/ext/" if [ -f "${newUpdaterDir}/updater.jar" ]; then mv -f "${newUpdaterDir}/updater.jar" "${base}/modules/ext/" fi ls -l "${newUpdaterDir}/"updater_*.jar for i in "${newUpdaterDir}/"updater_*.jar; do mkdir -p "${base}/modules/ext/locale/" mv -f "$i" "${base}/modules/ext/locale/" done rmdir "${newUpdaterDir}" fi } # detect system http proxy setting detect_system_proxy () { if [ ! -z "$http_proxy" ]; then http_proxy_tmp=$http_proxy fi return 0 } detect_gnome_proxy () { gconftool=/usr/bin/gconftool-2 if [ -x $gconftool ] ; then proxy_mode=`$gconftool --get /system/proxy/mode 2>/dev/null` if [ "$proxy_mode" = "manual" ] ; then http_proxy_host=`$gconftool --get /system/http_proxy/host 2>/dev/null` http_proxy_port=`$gconftool --get /system/http_proxy/port 2>/dev/null` http_proxy_tmp=$http_proxy_host:$http_proxy_port http_non_proxy_hosts=`$gconftool --get /system/http_proxy/ignore_hosts 2>/dev/null` if [ $? ] ; then http_non_proxy_hosts=`echo $http_non_proxy_hosts | /bin/sed 's/\]//'` fi socks_proxy_host=`$gconftool --get /system/proxy/socks_host 2>/dev/null` socks_proxy_port=`$gconftool --get /system/proxy/socks_port 2>/dev/null` socks_proxy_tmp=$socks_proxy_host:$socks_proxy_port return 0 else if [ "$proxy_mode" = "none" ] ; then detect_system_proxy if [ -z "$http_proxy_tmp" ]; then http_proxy_tmp="DIRECT" fi return 0 else if [ "$proxy_mode" = "auto" ] ; then detect_system_proxy pac_file=`$gconftool --get /system/proxy/autoconfig_url 2>/dev/null` if [ ! -z "$pac_file" ]; then http_proxy_tmp="PAC "$pac_file fi return 0 fi fi fi fi return 1 } detect_kde_proxy () { kioslaverc="${HOME}/.kde/share/config/kioslaverc" if [ -f $kioslaverc ] ; then if /bin/grep 'ProxyType=1' "$kioslaverc" >/dev/null 2>&1; then http_proxy_tmp=`/bin/grep 'httpProxy=http://' "$kioslaverc"` if [ $? ] ; then http_proxy_tmp=`echo $http_proxy_tmp | /bin/sed 's/httpProxy=http:\/\///'` return 0 fi http_non_proxy_hosts=`/bin/grep 'NoProxyFor=' "$kioslaverc"` if [ $? ] ; then http_non_proxy_hosts=`echo $http_non_proxy_hosts | /bin/sed 's/NoProxyFor=//'` fi else if /bin/grep 'ProxyType=0' "$kioslaverc" >/dev/null 2>&1; then detect_system_proxy if [ -z "$http_proxy_tmp" ]; then http_proxy_tmp="DIRECT" fi return 0 else if /bin/grep 'ProxyType=2' "$kioslaverc" >/dev/null 2>&1; then pac_file=`grep "Proxy Config Script=" $kioslaverc | cut -f 2 -d =` http_proxy_tmp="PAC "$pac_file return 0 fi fi fi fi return 1 } detect_macosx_proxy () { if [ ! -x /usr/sbin/scutil ] ; then return 1 fi scutil_out=/tmp/nb-proxy-detection.$$ cat < ${scutil_out} open show State:/Network/Global/Proxies close EOF if /usr/bin/grep "ProxyAuto.*: *1" ${scutil_out} >/dev/null 2>&1; then if /usr/bin/grep "ProxyAutoConfigEnable.*: *1" ${scutil_out} >/dev/null 2>&1; then http_proxy_tmp="PAC `/usr/bin/grep ProxyAutoConfigURLString ${scutil_out} | /usr/bin/awk '{print $3}'`" rm ${scutil_out} return 0 fi rm ${scutil_out} return 1 fi if /usr/bin/grep "HTTPEnable *: *1" ${scutil_out} >/dev/null 2>&1; then http_proxy_host=`/usr/bin/grep HTTPProxy ${scutil_out} | /usr/bin/awk '{print $3}'` http_proxy_port=`/usr/bin/grep HTTPPort ${scutil_out} | /usr/bin/awk '{print $3} '` http_proxy_tmp=$http_proxy_host:$http_proxy_port rm ${scutil_out} return 0 fi http_proxy_tmp="DIRECT" rm ${scutil_out} return 0 } unset http_proxy_tmp if [ `uname` = Darwin ] ; then detect_macosx_proxy else if [ "$KDE_FULL_SESSION" = "true" ] ; then detect_kde_proxy else if [ ! -z "$GNOME_DESKTOP_SESSION_ID" ] ; then detect_gnome_proxy fi fi fi # fall back to the environment-defined http_proxy if nothing found so far if [ -z "$http_proxy_tmp" ]; then http_proxy_tmp=$http_proxy fi if [ ! -z "$http_proxy_tmp" ] ; then jargs="-Dnetbeans.system_http_proxy=\"$http_proxy_tmp\" -Dnetbeans.system_http_non_proxy_hosts=\"$http_non_proxy_hosts\" $jargs" fi if [ ! -z "$socks_proxy_tmp" ] ; then jargs="-Dnetbeans.system_socks_proxy=\"$socks_proxy_tmp\" $jargs" fi # http://java.sun.com/j2se/1.5.0/docs/guide/2d/flags.html#pixmaps J2D_PIXMAPS=shared export J2D_PIXMAPS # Check DISPLAY variable on non-Mac if [ "no$DISPLAY" = "no" -a `uname` != Darwin ]; then echo "$0: WARNING: environment variable DISPLAY is not set" fi # The Startup Notification Protocol Specification [1] # recommends to unset the DESKTOP_STARTUP_ID environment variable # to avoid possible reuse by some process started later by this # process, e.g. when a browser will be launched by the NetBeans [2]. # # See: # [1] http://standards.freedesktop.org/startup-notification-spec # [2] http://netbeans.org/bugzilla/show_bug.cgi?id=76970 if [ ! -z "$DESKTOP_STARTUP_ID" ] ; then # Save a value for later using NB_DESKTOP_STARTUP_ID="$DESKTOP_STARTUP_ID"; export NB_DESKTOP_STARTUP_ID unset DESKTOP_STARTUP_ID fi # # main loop # # clear to prevent loop from ending restart="yes" first_time_starting="yes" restart_file="${userdir}/var/restart" while [ "$restart" ] ; do # # build CLASSPATH # construct_cp # First check for pre-run updates. if [ "$first_time_starting" ] ; then run_updater="" look_for_pre_runs "$plathome" save="$IFS" IFS=':' ; for oneCls in $clusters ; do IFS="$save" look_for_pre_runs "$oneCls" done IFS="$save" look_for_pre_runs "$userdir" if [ "$run_updater" ] ; then do_run_updater ; fi # Do not check this after a restart, it makes no sense. first_time_starting="" fi # # let's go # delete_new_clusters_file rm -f "${restart_file}" eval ${_NB_PROFILE_CMD} "\"${jdkhome}/bin/java\"" -Djdk.home="\"${jdkhome}\"" -classpath "\"$cp\"" \ "$jargs" org.netbeans.Main "$args" '<&0' '&' PID=$! trap "kill $PID" EXIT wait $PID exitcode=$? trap '' EXIT look_for_new_clusters # If we should update anything, do it and restart IDE. run_updater="" look_for_post_runs "$plathome" save="$IFS" IFS=':' ; for oneCls in $clusters ; do IFS="$save" look_for_post_runs "$oneCls" done IFS="$save" look_for_post_runs "$userdir" if [ "$run_updater" ] ; then do_run_updater restart="yes" else if [ ! -f "${restart_file}" ] ; then # will fall thru loop and exit restart="" fi fi done # and we exit. exit $exitcode