View Javadoc
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 org.codehaus.plexus.interpolation.os.OperatingSystemUtils;
20  
21  import java.io.IOException;
22  import java.util.Properties;
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   * @version $Id$
31   */
32  public class EnvarBasedValueSource
33      extends AbstractValueSource
34  {
35  
36      private static Properties envarsCaseSensitive;
37      private static Properties envarsCaseInsensitive;
38  
39      private final Properties envars;
40      private final boolean caseSensitive;
41  
42      /**
43       * Create a new value source for interpolation based on shell environment variables. In this
44       * case, envar keys ARE CASE SENSITIVE.
45       *
46       * @throws IOException
47       */
48      public EnvarBasedValueSource() throws IOException
49      {
50          this( true );
51      }
52  
53      /**
54       * Create a new value source for interpolation based on shell environment variables.
55       *
56       * @param caseSensitive Whether the environment variable key should be treated in a
57       *                      case-sensitive manner for lookups
58       * @throws IOException
59       */
60      public EnvarBasedValueSource( boolean caseSensitive ) throws IOException
61      {
62          super( false );
63          this.caseSensitive = caseSensitive;
64          this.envars = getEnvars( caseSensitive );
65      }
66  
67      private static synchronized Properties getEnvars( boolean caseSensitive )
68          throws IOException
69      {
70          if ( caseSensitive )
71          {
72              if ( envarsCaseSensitive == null )
73              {
74                  envarsCaseSensitive = OperatingSystemUtils.getSystemEnvVars( caseSensitive );
75              }
76              return envarsCaseSensitive;
77          }
78          else
79          {
80              if ( envarsCaseInsensitive == null )
81              {
82                  envarsCaseInsensitive = OperatingSystemUtils.getSystemEnvVars( caseSensitive );
83              }
84              return envarsCaseInsensitive;
85          }
86      }
87  
88      /**
89       * If the expression starts with 'env.' then trim this prefix. Next, resolve
90       * the (possibly trimmed) expression as an environment variable name against
91       * the collection of environment variables that were read from the operating
92       * system when this {@link ValueSource} instance was created.
93       *
94       * @param expression envar expression, like 'HOME' or 'env.HOME'
95       * @return the environment variable value for the given expression
96       */
97      public Object getValue( String expression )
98      {
99          String expr = expression;
100 
101         if ( expr.startsWith( "env." ) )
102         {
103             expr = expr.substring( "env.".length() );
104         }
105 
106         if ( !caseSensitive )
107         {
108             expr = expr.toUpperCase();
109         }
110 
111         return envars.getProperty( expr );
112     }
113 
114 }