blob: c79f3645116a24ed5e2a34fe1a40e035a1bb4873 [file] [log] [blame]
/*
* 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.
*/
package org.apache.commons.exec.environment;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.OS;
/**
* Helper class to determine the environment variable
* for the OS. Depending on the JDK the environment
* variables can be either retrieved directly from the
* JVM or requires starting a process to get them running
* an OS command line.
*
*/
public class DefaultProcessingEnvironment {
/** the line separator of the system */
// private static final String LINE_SEPARATOR = System.getProperty("line.separator");
/** the environment variables of the process */
protected Map<String, String> procEnvironment;
/**
* Find the list of environment variables for this process.
*
* @return a map containing the environment variables
* @throws IOException obtaining the environment variables failed
*/
public synchronized Map<String, String> getProcEnvironment() throws IOException {
if (procEnvironment == null) {
procEnvironment = this.createProcEnvironment();
}
// create a copy of the map just in case that
// anyone is going to modifiy it, e.g. removing
// or setting an evironment variable
final Map<String, String> copy = createEnvironmentMap();
copy.putAll(procEnvironment);
return copy;
}
/**
* Find the list of environment variables for this process.
*
* @return a amp containing the environment variables
* @throws IOException the operation failed
*/
protected Map<String, String> createProcEnvironment() throws IOException {
if (procEnvironment == null) {
final Map<String, String> env = System.getenv();
procEnvironment = createEnvironmentMap();
procEnvironment.putAll(env);
}
// No longer needed
// if (procEnvironment == null) {
// procEnvironment = createEnvironmentMap();
// final BufferedReader in = runProcEnvCommand();
//
// String var = null;
// String line;
// while ((line = in.readLine()) != null) {
// if (line.indexOf('=') == -1) {
// // Chunk part of previous env var (UNIX env vars can
// // contain embedded new lines).
// if (var == null) {
// var = LINE_SEPARATOR + line;
// } else {
// var += LINE_SEPARATOR + line;
// }
// } else {
// // New env var...append the previous one if we have it.
// if (var != null) {
// EnvironmentUtils.addVariableToEnvironment(procEnvironment, var);
// }
// var = line;
// }
// }
// // Since we "look ahead" before adding, there's one last env var.
// if (var != null) {
// EnvironmentUtils.addVariableToEnvironment(procEnvironment, var);
// }
// }
return procEnvironment;
}
/**
* Start a process to list the environment variables.
*
* @return a reader containing the output of the process
* @throws IOException starting the process failed
* @deprecated No longer needed
*/
@Deprecated
protected BufferedReader runProcEnvCommand() throws IOException {
// final ByteArrayOutputStream out = new ByteArrayOutputStream();
// final Executor exe = new DefaultExecutor();
// exe.setStreamHandler(new PumpStreamHandler(out));
// // ignore the exit value - Just try to use what we got
// exe.execute(getProcEnvCommand());
// return new BufferedReader(new StringReader(toString(out)));
return null;
}
/**
* Determine the OS specific command line to get a list of environment
* variables.
*
* @return the command line
* @deprecated No longer needed
*/
@Deprecated
protected CommandLine getProcEnvCommand() {
// String executable;
// String[] arguments = null;
// if (OS.isFamilyOS2()) {
// // OS/2 - use same mechanism as Windows 2000
// executable = "cmd";
//
// arguments = new String[] {"/c", "set"};
// } else if (OS.isFamilyWindows()) {
// // Determine if we're running under XP/2000/NT or 98/95
// if (OS.isFamilyWin9x()) {
// executable = "command.com";
// // Windows 98/95
// } else {
// executable = "cmd";
// // Windows XP/2000/NT/2003
// }
// arguments = new String[] {"/c", "set"};
// } else if (OS.isFamilyZOS() || OS.isFamilyUnix()) {
// // On most systems one could use: /bin/sh -c env
//
// // Some systems have /bin/env, others /usr/bin/env, just try
// if (new File("/bin/env").canRead()) {
// executable = "/bin/env";
// } else if (new File("/usr/bin/env").canRead()) {
// executable = "/usr/bin/env";
// } else {
// // rely on PATH
// executable = "env";
// }
// } else if (OS.isFamilyNetware() || OS.isFamilyOS400()) {
// // rely on PATH
// executable = "env";
// } else {
// // MAC OS 9 and previous
// // TODO: I have no idea how to get it, someone must fix it
// executable = null;
// }
final CommandLine commandLine = null;
// if (executable != null) {
// commandLine = new CommandLine(executable);
// commandLine.addArguments(arguments);
// }
return commandLine;
}
// /**
// * ByteArrayOutputStream#toString doesn't seem to work reliably on OS/390,
// * at least not the way we use it in the execution context.
// *
// * @param bos
// * the output stream that one wants to read
// * @return the output stream as a string, read with special encodings in the
// * case of z/os and os/400
// */
// private String toString(final ByteArrayOutputStream bos) {
// if (OS.isFamilyZOS()) {
// try {
// return bos.toString("Cp1047");
// } catch (final java.io.UnsupportedEncodingException e) {
// // noop default encoding used
// }
// } else if (OS.isFamilyOS400()) {
// try {
// return bos.toString("Cp500");
// } catch (final java.io.UnsupportedEncodingException e) {
// // noop default encoding used
// }
// }
// return bos.toString();
// }
/**
* Creates a map that obeys the casing rules of the current platform for key
* lookup. E.g. on a Windows platform, the map keys will be
* case-insensitive.
*
* @return The map for storage of environment variables, never
* {@code null}.
*/
private Map<String, String> createEnvironmentMap() {
if (OS.isFamilyWindows()) {
return new TreeMap<String, String>(new Comparator<String>() {
public int compare(final String key0, final String key1) {
return key0.compareToIgnoreCase(key1);
}
});
}
return new HashMap<String, String>();
}
}