Congratulations on the 0.8.3 release. Outstanding.
Hopefully you'll like this patch a little better as there are no changes to
jruby.bat or jruby.sh.
First, if the Java 5 Systen.getenv is available, then that is used to get the
environment. If not then the Runtime.getRuntime() technique is used. (I made
RubyKernel.runInShell public to do this without duplicating code)
There are two other implementations which can be selected setting the System
property jruby.env.method to specify the name of the class to use:
OSEnvironmentReaderFromFile gets the environment from a file (e.g. created by
env or set). OSEnvironmentReaderFromApacheAnt gets the environment from tha
apache ant Execute.getProcEnvironment method reflectively to avoid a dependecy
on ant jars.
System.getProperties values are put into a new global ENV_JAVA. This has meant a
change to RubyDir which used to use ENV['HOME'].
I put 3 runtime.getWarnings().warn messages is OSEnvironment.java so that you
can see which implementation is being used, suring startup. These can obviously
be removed later.
Index: src/org/jruby/RubyDir.java
===================================================================
RCS file: /cvsroot/jruby/jruby/src/org/jruby/RubyDir.java,v
retrieving revision 1.34
diff -u -r1.34 RubyDir.java
--- src/org/jruby/RubyDir.java 28 Mar 2006 16:35:30 -0000 1.34
+++ src/org/jruby/RubyDir.java 29 Mar 2006 08:07:26 -0000
@@ -444,15 +444,15 @@
}
public static RubyString getHomeDirectoryPath(IRubyObject recv) {
- RubyHash hash = (RubyHash)
recv.getRuntime().getObject().getConstant("ENV");
- IRubyObject home =
hash.aref(recv.getRuntime().newString("HOME"));
+ RubyHash hash = (RubyHash)
recv.getRuntime().getObject().getConstant("ENV_JAVA");
+ IRubyObject home =
hash.aref(recv.getRuntime().newString("user.home"));
if (home == null || home.isNil()) {
home = hash.aref(recv.getRuntime().newString("LOGDIR"));
}
if (home == null || home.isNil()) {
- throw recv.getRuntime().newArgumentError("HOME/LOGDIR
not set");
+ throw
recv.getRuntime().newArgumentError("user.home/LOGDIR not set");
}
return (RubyString) home;
Index: src/org/jruby/RubyGlobal.java
===================================================================
RCS file: /cvsroot/jruby/jruby/src/org/jruby/RubyGlobal.java,v
retrieving revision 1.24
diff -u -r1.24 RubyGlobal.java
--- src/org/jruby/RubyGlobal.java 25 Mar 2006 06:25:36 -0000 1.24
+++ src/org/jruby/RubyGlobal.java 29 Mar 2006 08:07:27 -0000
@@ -17,6 +17,7 @@
* Copyright (C) 2004 Charles O Nutter <[EMAIL PROTECTED]>
* Copyright (C) 2004 Thomas E Enebo <[EMAIL PROTECTED]>
* Copyright (C) 2004 Stefan Matthias Aust <[EMAIL PROTECTED]>
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
@@ -34,7 +35,10 @@
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Map;
+import org.jruby.environment.OSEnvironmentReaderExcepton;
+import org.jruby.environment.OSEnvironment;
import org.jruby.runtime.Constants;
import org.jruby.runtime.GlobalVariable;
import org.jruby.runtime.ReadonlyGlobalVariable;
@@ -60,12 +64,6 @@
runtime.defineGlobalConstant("RELEASE_DATE", release);
runtime.defineGlobalConstant("PLATFORM", platform);
- // FIXME: ENV Not really a RubyHash (but close)
- // FIXME: ENV Should not copy system properties, but should
reference them instead
- HashMap envs = new HashMap();
- envs.put(runtime.newString("HOME"),
runtime.newString(System.getProperty("user.home")));
- runtime.defineGlobalConstant("ENV", RubyHash.newHash(runtime, envs,
runtime.getNil()));
-
runtime.defineVariable(new StringGlobalVariable(runtime, "$KCODE",
runtime.newString("UTF8")));
runtime.defineVariable(new StringGlobalVariable(runtime, "$/",
runtime.newString("\n")));
runtime.defineVariable(new StringGlobalVariable(runtime, "$\\",
runtime.getNil()));
@@ -102,11 +100,39 @@
runtime.defineVariable(new LoadPath(runtime, "$-I"));
runtime.defineVariable(new LoadPath(runtime, "$LOAD_PATH"));
+ // after defn of $stderr as the call may produce warnings
+ defineGlobalEnvConstants(runtime);
+
// ARGF, $< object
RubyArgsFile argsFile = new RubyArgsFile(runtime);
argsFile.initArgsFile();
}
+ private static void defineGlobalEnvConstants(IRuby runtime) {
+
+ Map environmentVariableMap = null;
+ OSEnvironment environment = new OSEnvironment();
+ try {
+ environmentVariableMap =
environment.getEnvironmentVariableMap(runtime);
+ } catch (OSEnvironmentReaderExcepton e) {
+ // If the environment variables are not accessible shouldn't
terminate
+ runtime.getWarnings().warn(e.getMessage());
+ }
+
+ if (environmentVariableMap == null) {
+ // if the environment variables can't be obtainded, define an
empty ENV
+ environmentVariableMap = new HashMap();
+ }
+ runtime.defineGlobalConstant("ENV", RubyHash.newHash(runtime,
environmentVariableMap, runtime.getNil()));
+
+ // Define System.getProperties() in ENV_JAVA
+ Map systemProps = environment.getSystemPropertiesMap(runtime);
+ runtime.defineGlobalConstant("ENV_JAVA", RubyHash.newHash(runtime,
systemProps, runtime.getNil()));
+
+ }
+
+
+
// Accessor methods.
private static class LineNumberGlobalVariable extends GlobalVariable {
Index: src/org/jruby/RubyKernel.java
===================================================================
RCS file: /cvsroot/jruby/jruby/src/org/jruby/RubyKernel.java,v
retrieving revision 1.45
diff -u -r1.45 RubyKernel.java
--- src/org/jruby/RubyKernel.java 28 Mar 2006 03:06:16 -0000 1.45
+++ src/org/jruby/RubyKernel.java 29 Mar 2006 08:07:28 -0000
@@ -745,7 +745,7 @@
return PATH_SEPARATORS.matcher(executable).replaceAll(replacement) +
remainder;
}
- private static int runInShell(IRuby runtime, String command, StringBuffer
output) {
+ public static int runInShell(IRuby runtime, String command, StringBuffer
output) {
try {
String shell = System.getProperty("jruby.shell");
Process aProcess;
Index: src/org/jruby/environment/OSEnvironmentReaderFromJava5SystemGetenv.java
===================================================================
RCS file:
src/org/jruby/environment/OSEnvironmentReaderFromJava5SystemGetenv.java
diff -N src/org/jruby/environment/OSEnvironmentReaderFromJava5SystemGetenv.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/jruby/environment/OSEnvironmentReaderFromJava5SystemGetenv.java
1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,94 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.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.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+
+package org.jruby.environment;
+
+import java.lang.reflect.Method;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jruby.IRuby;
+
+class OSEnvironmentReaderFromJava5SystemGetenv implements IOSEnvironmentReader
{
+
+
+ /**
+ * Gets the new Java 5 Sytem.getenv method via reflection.
+ * @return
+ */
+ protected Method getSystemGetenvMethod() {
+ Method getenvMethod = null;
+ try {
+ getenvMethod = java.lang.System.class.getMethod("getenv",
(Class[]) null);
+ if (!getenvMethod.getReturnType().equals(java.util.Map.class)) {
+ // wrong return type
+ getenvMethod = null;
+ }
+ } catch (NoSuchMethodException e) {
+ // This is the error you get if using Java 1.4.2
+ getenvMethod = null;
+ } catch (Exception e) {
+ // Some other e.g. security problem
+ getenvMethod = null;
+ }
+ return getenvMethod;
+ }
+
+ /* (non-Javadoc)
+ * @see org.jruby.IOSEnvironment#isAccessible()
+ */
+ public boolean isAccessible(IRuby runtime) {
+ return getSystemGetenvMethod() != null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.jruby.IOSEnvironment#getVariables()
+ */
+ public Map getVariables(IRuby runtime) {
+ Map returnMap = null;
+ Method getenvMethod = getSystemGetenvMethod();
+ try {
+ if (getenvMethod != null) {
+ returnMap = (Map) getenvMethod.invoke(null, (Object[]) null);
+ }
+ } catch (Exception e) {
+ new OSEnvironment().handleException(e);
+ }
+ return returnMap;
+ }
+
+ public static void main(String[] args) {
+ OSEnvironmentReaderFromJava5SystemGetenv getenv = new
OSEnvironmentReaderFromJava5SystemGetenv();
+ Map envs = getenv.getVariables(null);
+ for (Iterator i = envs.entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry) i.next();
+ System.out.println(entry.getKey() + ":" + entry.getValue());
+ }
+ System.out.println();
+ }
+}
Index: src/org/jruby/environment/OSEnvironmentReaderFromFile.java
===================================================================
RCS file: src/org/jruby/environment/OSEnvironmentReaderFromFile.java
diff -N src/org/jruby/environment/OSEnvironmentReaderFromFile.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/jruby/environment/OSEnvironmentReaderFromFile.java 1 Jan 1970
00:00:00 -0000
@@ -0,0 +1,91 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.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.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+
+package org.jruby.environment;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.util.Map;
+
+import org.jruby.IRuby;
+
+
+/**
+ * Get the os environment from a file.
+ * Requires a java system property "jruby.envfile" to give the location of a
file from which
+ * the environment variables can be loaded.
+ *
+ */
+class OSEnvironmentReaderFromFile implements IOSEnvironmentReader {
+
+ private static final String JRUBY_ENVFILE = "jruby.envfile";
+
+ private final OSEnvironment environmentReader = new OSEnvironment();
+
+
+ /* (non-Javadoc)
+ * @see org.jruby.IOSEnvironment#isAccessible()
+ */
+ public boolean isAccessible(IRuby runtime) {
+ String jrubyEnvFilename = System.getProperty(JRUBY_ENVFILE);
+
+ if (jrubyEnvFilename == null || jrubyEnvFilename.length() < 1) {
+ return false;
+ }
+
+ File jrubyEnvFile = new File(jrubyEnvFilename);
+
+ return (jrubyEnvFile.exists() && !jrubyEnvFile.isDirectory() &&
jrubyEnvFile.canRead());
+ }
+
+ /* (non-Javadoc)
+ * @see org.jruby.IOSEnvironment#getVariables()
+ */
+ public Map getVariables(IRuby runtime) {
+ String jrubyEnvFilename = System.getProperty(JRUBY_ENVFILE);
+
+ Map envs = null;
+
+ if (jrubyEnvFilename == null || jrubyEnvFilename.length() < 1) {
+ environmentReader.handleException(new
OSEnvironmentReaderExcepton("Property " + JRUBY_ENVFILE + " not defined."));
+ } else {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new FileReader(jrubyEnvFilename));
+ } catch (FileNotFoundException e) {
+ envs = null;
+ // Very unlikely to happen as isAccessible() should be used
first
+ environmentReader.handleException(e);
+ }
+ envs = environmentReader.getVariablesFrom(reader);
+ }
+ return envs;
+ }
+}
Index: src/org/jruby/environment/OSEnvironmentReaderExcepton.java
===================================================================
RCS file: src/org/jruby/environment/OSEnvironmentReaderExcepton.java
diff -N src/org/jruby/environment/OSEnvironmentReaderExcepton.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/jruby/environment/OSEnvironmentReaderExcepton.java 1 Jan 1970
00:00:00 -0000
@@ -0,0 +1,42 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.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.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+
+package org.jruby.environment;
+
+public class OSEnvironmentReaderExcepton extends RuntimeException {
+
+ private static final long serialVersionUID = 8101107415664066073L;
+
+ public OSEnvironmentReaderExcepton() {
+ super();
+ }
+
+ public OSEnvironmentReaderExcepton(String message) {
+ super(message);
+ }
+}
Index: src/org/jruby/environment/OSEnvironmentReaderFromRuntimeExec.java
===================================================================
RCS file: src/org/jruby/environment/OSEnvironmentReaderFromRuntimeExec.java
diff -N src/org/jruby/environment/OSEnvironmentReaderFromRuntimeExec.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/jruby/environment/OSEnvironmentReaderFromRuntimeExec.java 1 Jan
1970 00:00:00 -0000
@@ -0,0 +1,91 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.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.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+
+package org.jruby.environment;
+
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.util.Map;
+
+import org.jruby.IRuby;
+import org.jruby.RubyKernel;
+import org.jruby.exceptions.RaiseException;
+
+class OSEnvironmentReaderFromRuntimeExec implements IOSEnvironmentReader {
+
+ private final OSEnvironment environmentReader = new OSEnvironment();
+
+ /* (non-Javadoc)
+ * @see org.jruby.IOSEnvironment#isAccessible()
+ */
+ public boolean isAccessible(IRuby runtime) {
+ return true;
+ }
+
+
+ private String getEnvCommand() {
+ String command;
+ String osname = System.getProperty("os.name").toLowerCase();
+
+ // TODO merge this logic into RubyKernel.runInShell? / possible
conflict if jruby.shell System property is set
+
+ if (osname.indexOf("windows 9") > -1) {
+ command = "command.com /c set";
+ } else if ((osname.indexOf("nt") > -1)
+ || (osname.indexOf("windows 20") > -1)
+ || (osname.indexOf("windows xp") > -1)) {
+ command = "cmd.exe /c set";
+ } else {
+ // Assume some unix variant with an env command
+ command = "env";
+ }
+ return command;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.jruby.IOSEnvironment#getVariables()
+ */
+ public Map getVariables(IRuby runtime) {
+
+ StringBuffer output = new StringBuffer();
+
+ try {
+ RubyKernel.runInShell(runtime, getEnvCommand(), output);
+ } catch (RaiseException e) {
+ environmentReader.handleException(e);
+ }
+
+ BufferedReader reader = new BufferedReader(new
StringReader(output.toString()));
+
+ return environmentReader.getVariablesFrom(reader);
+ }
+
+}
Index: src/org/jruby/environment/OSEnvironmentReaderFromApacheAnt.java
===================================================================
RCS file: src/org/jruby/environment/OSEnvironmentReaderFromApacheAnt.java
diff -N src/org/jruby/environment/OSEnvironmentReaderFromApacheAnt.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/jruby/environment/OSEnvironmentReaderFromApacheAnt.java 1 Jan
1970 00:00:00 -0000
@@ -0,0 +1,129 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.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.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+
+package org.jruby.environment;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Vector;
+
+import org.jruby.IRuby;
+
+class OSEnvironmentReaderFromApacheAnt implements IOSEnvironmentReader {
+
+
+ protected Map getProcEnvironmentMethodV() {
+
+ Method getProcEnvironment = getProcEnvironmentMethod();
+ Vector v = new Vector();
+
+ HashMap map = new HashMap();
+
+
+ if (getProcEnvironment != null) {
+ try {
+ v = (Vector) getProcEnvironment.invoke(null,
(Object[]) null);
+ } catch (IllegalArgumentException e) {
+ return map;
+ } catch (IllegalAccessException e) {
+ return map;
+ } catch (InvocationTargetException e) {
+ return map;
+ }
+ }
+
+ String line;
+ int equalsPos;
+
+ for (java.util.Enumeration e = v.elements(); e.hasMoreElements();) {
+ line = (String) e.nextElement();
+ equalsPos = line.indexOf('=');
+ if (equalsPos >= 1) {
+ map.put(line.substring(0, equalsPos),
line.substring(equalsPos + 1));
+ }
+ }
+
+
+ return map;
+
+ }
+
+
+ protected Method getProcEnvironmentMethod() {
+
+ Method getProcEnvironment;
+ Class c;
+
+ try {
+ c = Class.forName("org.apache.tools.ant.taskdefs.Execute");
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+
+ try {
+ getProcEnvironment = c.getMethod("getProcEnvironment",
(Class[]) null);
+ } catch (SecurityException e) {
+ return null;
+ } catch (NoSuchMethodException e) {
+ return null;
+ }
+
+ return getProcEnvironment;
+
+ }
+
+
+
+
+ /* (non-Javadoc)
+ * @see org.jruby.IOSEnvironment#isAccessible()
+ */
+ public boolean isAccessible(IRuby runtime) {
+ return getProcEnvironmentMethod() != null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.jruby.IOSEnvironment#getVariables()
+ */
+ public Map getVariables(IRuby runtime) {
+ return getProcEnvironmentMethodV();
+ }
+
+ public static void main(String[] args) {
+ OSEnvironmentReaderFromApacheAnt getenv = new
OSEnvironmentReaderFromApacheAnt();
+ Map envs = getenv.getVariables(null);
+ for (Iterator i = envs.entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry) i.next();
+ System.out.println(entry.getKey() + ":" + entry.getValue());
+ }
+ System.out.println();
+ }
+}
Index: src/org/jruby/environment/OSEnvironment.java
===================================================================
RCS file: src/org/jruby/environment/OSEnvironment.java
diff -N src/org/jruby/environment/OSEnvironment.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/jruby/environment/OSEnvironment.java 1 Jan 1970 00:00:00
-0000
@@ -0,0 +1,170 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.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.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+
+package org.jruby.environment;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.jruby.IRuby;
+
+public class OSEnvironment {
+
+
+ /**
+ * Handles exceptions from implementors of [EMAIL PROTECTED]
IOSEnvironmentReader},
+ * converting the exception to a [EMAIL PROTECTED]
OSEnvironmentReaderExcepton}
+ * @param e
+ */
+ void handleException(Exception e) {
+ throw (OSEnvironmentReaderExcepton)
+ new OSEnvironmentReaderExcepton().initCause(e);
+ }
+
+ /**
+ * Returns the OS environment variables as a Map<RubyString,RubyString>.
+ * If the Java system property "jruby.env.method" is set then
+ * the value is used as the classname of a class than implements the
IOSEnvironmentReader
+ * interface and the environment is obtained via this class.
+ * If the "jruby.env.method" is
"org.jruby.environment.OSEnvironmentReaderFromFile" then
+ * the java system property "jruby.envfile" should give the location of a
file from which
+ * the environment variables can be loaded.
+ * Otherwise, other default implementations of IOSEnvironmentReader are
tried
+ * to obtain the os environment variables.
+ * @param runtime
+ * @param System.getProperty("jruby.env.method")
+ * @throws OSEnvironmentReaderExcepton
+ */
+ public Map getEnvironmentVariableMap(IRuby runtime) {
+ String jrubyEnvMethod = System.getProperty("jruby.env.method");
+
+ IOSEnvironmentReader reader;
+
+ if (jrubyEnvMethod == null || jrubyEnvMethod.length() < 1) {
+ // Try to get environment from Java5 System.getenv()
+ reader = getAccessibleOSEnvironment(runtime,
OSEnvironmentReaderFromJava5SystemGetenv.class.getName());
+ // not Java5 so try getting environment using Runtime exec
+ if (reader == null) {
+ reader = getAccessibleOSEnvironment(runtime,
OSEnvironmentReaderFromRuntimeExec.class.getName());
+ runtime.getWarnings().warn("Getting environment variables
using Runtime Exec");
+ } else {
+ runtime.getWarnings().warn("Getting environment variables
using Java5 System.getenv()");
+ }
+ } else {
+ // get environment from jruby command line property supplied class
+ runtime.getWarnings().warn("Getting environment variables using
command line defined method: " + jrubyEnvMethod);
+ reader = getAccessibleOSEnvironment(runtime, jrubyEnvMethod);
+ }
+
+ Map envs = null;
+
+ if (reader != null) {
+ Map variables = null;
+ variables = reader.getVariables(runtime);
+ envs = getAsMapOfRubyStrings(runtime,
variables.entrySet());
+ }
+
+ return envs;
+
+ }
+
+ /**
+ * Returns java system properties as a Map<RubyString,RubyString>.
+ * @param runtime
+ * @return the java system properties as a Map<RubyString,RubyString>.
+ */
+ public Map getSystemPropertiesMap(IRuby runtime) {
+ return getAsMapOfRubyStrings(runtime,
System.getProperties().entrySet());
+ }
+
+
+ private static IOSEnvironmentReader getAccessibleOSEnvironment(IRuby
runtime, String classname) {
+ IOSEnvironmentReader osenvironment = null;
+ try {
+ osenvironment =
(IOSEnvironmentReader)Class.forName(classname).newInstance();
+ } catch (Exception e) {
+ // This should only happen for a command line supplied
IOSEnvironmentReader implementation
+ runtime.getWarnings().warn(e.getMessage());
+ }
+
+ if (osenvironment != null & osenvironment.isAccessible(runtime)) {
+ return osenvironment;
+ }
+ return null;
+ }
+
+
+
+ private static Map getAsMapOfRubyStrings(IRuby runtime, Set entrySet) {
+ Map envs = new HashMap();
+ for (Iterator iter = entrySet.iterator(); iter.hasNext();) {
+ Map.Entry entry = (Map.Entry) iter.next();
+
envs.put(runtime.newString((String)entry.getKey()),runtime.newString((String)entry.getValue()));
+ }
+ return envs;
+ }
+
+
+ /**
+ * Returns a Map of the variables found in the reader of form var=value
+ * @param reader
+ * @return Map<String,String> of variables found by reading lines from
reader.
+ */
+ Map getVariablesFrom(BufferedReader reader) {
+ Map envs = new HashMap();
+ try {
+ String line, envVarName, envVarValue;
+ int equalsPos;
+ while ((line = reader.readLine()) != null) {
+ equalsPos = line.indexOf('=');
+ if (equalsPos >= 1) {
+ envVarName = line.substring(0, equalsPos);
+ envVarValue = line.substring(equalsPos + 1);
+ envs.put(envVarName, envVarValue);
+ }
+ }
+ } catch (IOException e) {
+ envs = null;
+ handleException(e);
+ } finally {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ envs = null;
+ handleException(e);
+ }
+ }
+ return envs;
+ }
+
+
+}
Index: src/org/jruby/environment/IOSEnvironmentReader.java
===================================================================
RCS file: src/org/jruby/environment/IOSEnvironmentReader.java
diff -N src/org/jruby/environment/IOSEnvironmentReader.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/jruby/environment/IOSEnvironmentReader.java 1 Jan 1970 00:00:00
-0000
@@ -0,0 +1,55 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Common Public
+ * License Version 1.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.eclipse.org/legal/cpl-v10.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2006 Tim Azzopardi <[EMAIL PROTECTED]>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the CPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the CPL, the GPL or the LGPL.
+ ***** END LICENSE BLOCK *****/
+package org.jruby.environment;
+
+import java.util.Map;
+
+import org.jruby.IRuby;
+
+public interface IOSEnvironmentReader {
+
+ /**
+ * Get the operating system environment variables.
+ *
+ * Returns an string map view of the current system environment.
+ * If environment variables,are not supported, then null is returned.
(isEnvironmentAccessible() returns false).
+ * If there are no variables defined, then an empty Map is returned.
+ *
+ * @return the operating system environment variables in a
Map<String,String>.
+ * @throws OSEnvironmentReaderExcepton if there is a problem accessing the
environment variables.
+ */
+ Map getVariables(IRuby runtime);
+
+ /**
+ * Determines whether the OS environment variables are accessible using a
given implementation.
+ *
+ * @return whether the OS environment variables are accessible.
+ */
+ boolean isAccessible(IRuby runtime);;
+
+}