1 package org.codehaus.plexus.interpolation;
2
3 /*
4 * Copyright 2007 The Codehaus Foundation.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 import java.io.IOException;
20 import java.util.Properties;
21
22 import org.codehaus.plexus.interpolation.os.OperatingSystemUtils;
23
24 /**
25 * {@link ValueSource} which resolves expressions against the environment variables
26 * available from the underlying operating system (and possibly, the shell environment
27 * that created the present Java process). If the expression starts with 'env.',
28 * this prefix is trimmed before resolving the rest as an environment variable name.
29 */
30 public class EnvarBasedValueSource extends AbstractValueSource {
31
32 private static Properties envarsCaseSensitive;
33 private static Properties envarsCaseInsensitive;
34
35 private final Properties envars;
36 private final boolean caseSensitive;
37
38 /**
39 * Create a new value source for interpolation based on shell environment variables. In this
40 * case, envar keys ARE CASE SENSITIVE.
41 *
42 * @throws IOException in case of an error.
43 */
44 public EnvarBasedValueSource() throws IOException {
45 this(true);
46 }
47
48 /**
49 * Create a new value source for interpolation based on shell environment variables.
50 *
51 * @param caseSensitive Whether the environment variable key should be treated in a
52 * case-sensitive manner for lookups
53 * @throws IOException in case of an error.
54 */
55 public EnvarBasedValueSource(boolean caseSensitive) throws IOException {
56 super(false);
57 this.caseSensitive = caseSensitive;
58 this.envars = getEnvars(caseSensitive);
59 }
60
61 private static synchronized Properties getEnvars(boolean caseSensitive) throws IOException {
62 if (caseSensitive) {
63 if (envarsCaseSensitive == null) {
64 envarsCaseSensitive = OperatingSystemUtils.getSystemEnvVars(caseSensitive);
65 }
66 return envarsCaseSensitive;
67 } else {
68 if (envarsCaseInsensitive == null) {
69 envarsCaseInsensitive = OperatingSystemUtils.getSystemEnvVars(caseSensitive);
70 }
71 return envarsCaseInsensitive;
72 }
73 }
74
75 /**
76 * If the expression starts with 'env.' then trim this prefix. Next, resolve
77 * the (possibly trimmed) expression as an environment variable name against
78 * the collection of environment variables that were read from the operating
79 * system when this {@link ValueSource} instance was created.
80 *
81 * @param expression envar expression, like 'HOME' or 'env.HOME'
82 * @return the environment variable value for the given expression
83 */
84 public Object getValue(String expression) {
85 String expr = expression;
86
87 if (expr.startsWith("env.")) {
88 expr = expr.substring("env.".length());
89 }
90
91 if (!caseSensitive) {
92 expr = expr.toUpperCase();
93 }
94
95 return envars.getProperty(expr);
96 }
97
98 /**
99 * reset static variables acting as a cache for testing purposes only
100 */
101 static void resetStatics() {
102 envarsCaseSensitive = null;
103 envarsCaseInsensitive = null;
104 }
105 }