From 4018636aa11219c97e19a8446f88b9f76758b060 Mon Sep 17 00:00:00 2001 From: Charlie Groves Date: Mon, 23 Feb 2009 22:39:58 +0000 Subject: [PATCH] Only set application specific environment variables if this is being launched by 1.5 or later and the existing environment can be passed on as well --- .../threerings/getdown/data/Application.java | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/src/java/com/threerings/getdown/data/Application.java b/src/java/com/threerings/getdown/data/Application.java index ff45d9d..163e272 100644 --- a/src/java/com/threerings/getdown/data/Application.java +++ b/src/java/com/threerings/getdown/data/Application.java @@ -23,6 +23,8 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package com.threerings.getdown.data; +import static com.threerings.getdown.Log.log; + import java.awt.Color; import java.awt.Rectangle; import java.io.BufferedReader; @@ -54,6 +56,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -75,8 +78,6 @@ import com.threerings.getdown.util.LaunchUtil; import com.threerings.getdown.util.MetaProgressObserver; import com.threerings.getdown.util.ProgressObserver; -import static com.threerings.getdown.Log.log; - /** * Parses and provide access to the information contained in the getdown.txt * configuration file. @@ -767,25 +768,50 @@ public class Application args.add(processArg(string)); } + + String[] envp = createEnvironment (); String[] sargs = new String[args.size()]; args.toArray(sargs); + log.info("Running " + StringUtil.join(sargs, "\n ")); + return Runtime.getRuntime().exec(sargs, envp); + } - // Look for environmental variables. Pass through envp as null if no environmental - // variables were specified so we keep the current environment - String[] envp = null; + /** + * If the application provided environment variables, combine those with the current + * environment and return that in a style usable for {@link Runtime#exec(String, String[])}. + * If the application didn't provide any environment variables, null is returned to just use + * the existing environment. If the application provided environment variables and this is + * running on Java 1.4 which can't find the existing environment, null is returned so the + * existing environment is used and things have a chance of running. + */ + protected String[] createEnvironment () + { List envvar = new ArrayList(); fillAssignmentListFromPairs("environment.txt", envvar); - if (envvar.size() > 0) { - envp = new String[envvar.size()]; - for (int ii = 0; ii < envp.length; ii++) { - envp[ii] = processArg(envvar.get(ii)); - } - log.info("Environment " + StringUtil.join(envp, "\n ")); + if (envvar.isEmpty()) { + log.info("Didn't find any custom environment variables, not setting any."); + return null; } - - log.info("Running " + StringUtil.join(sargs, "\n ")); - return Runtime.getRuntime().exec(sargs, envp); + Map existing; + try { + existing = System.getenv(); + } catch (NoSuchMethodError nsme) { + log.warning("Unable to access the existing environment, most likely due to being on " + + "Java 1.4. Not setting application specific environment.", "applicationEnv", + envvar, nsme); + return null; + } + List envAssignments = new ArrayList(); + for (String assignment : envvar) { + envAssignments.add(processArg(assignment)); + } + for (Entry environmentEntry : existing.entrySet()) { + envAssignments.add(environmentEntry.getKey() + "=" + environmentEntry.getValue()); + } + String[] envp = envAssignments.toArray(new String[envAssignments.size()]); + log.info("Environment " + StringUtil.join(envp, "\n ")); + return envp; } /**