View Javadoc
1   /*
2    * Copyright 2012 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  package org.jboss.netty.util.internal;
17  
18  import org.jboss.netty.logging.InternalLogger;
19  import org.jboss.netty.logging.InternalLoggerFactory;
20  
21  import java.util.logging.Level;
22  import java.util.logging.Logger;
23  import java.util.regex.Pattern;
24  
25  /**
26   * A collection of utility methods to retrieve and parse the values of the Java system properties.
27   */
28  public final class SystemPropertyUtil {
29  
30      @SuppressWarnings("all")
31      private static boolean initializedLogger;
32      private static final InternalLogger logger;
33      private static boolean loggedException;
34  
35      static {
36          logger = InternalLoggerFactory.getInstance(SystemPropertyUtil.class);
37          initializedLogger = true;
38      }
39  
40      /**
41       * Returns {@code true} if and only if the system property with the specified {@code key}
42       * exists.
43       */
44      public static boolean contains(String key) {
45          return get(key) != null;
46      }
47  
48      /**
49       * Returns the value of the Java system property with the specified
50       * {@code key}, while falling back to {@code null} if the property access fails.
51       *
52       * @return the property value or {@code null}
53       */
54      public static String get(String key) {
55          return get(key, null);
56      }
57  
58      /**
59       * Returns the value of the Java system property with the specified
60       * {@code key}, while falling back to the specified default value if
61       * the property access fails.
62       *
63       * @return the property value.
64       *         {@code def} if there's no such property or if an access to the
65       *         specified property is not allowed.
66       */
67      public static String get(String key, String def) {
68          if (key == null) {
69              throw new NullPointerException("key");
70          }
71          if (key.length() == 0) {
72              throw new IllegalArgumentException("key must not be empty.");
73          }
74  
75          String value = null;
76          try {
77              value = System.getProperty(key);
78          } catch (Exception e) {
79              if (!loggedException) {
80                  log("Unable to retrieve a system property '" + key + "'; default values will be used.", e);
81                  loggedException = true;
82              }
83          }
84  
85          if (value == null) {
86              return def;
87          }
88  
89          return value;
90      }
91  
92      /**
93       * Returns the value of the Java system property with the specified
94       * {@code key}, while falling back to the specified default value if
95       * the property access fails.
96       *
97       * @return the property value.
98       *         {@code def} if there's no such property or if an access to the
99       *         specified property is not allowed.
100      */
101     public static boolean getBoolean(String key, boolean def) {
102         String value = get(key);
103         if (value == null) {
104             return def;
105         }
106 
107         value = value.trim().toLowerCase();
108         if (value.length() == 0) {
109             return true;
110         }
111 
112         if ("true".equals(value) || "yes".equals(value) || "1".equals(value)) {
113             return true;
114         }
115 
116         if ("false".equals(value) || "no".equals(value) || "0".equals(value)) {
117             return false;
118         }
119 
120         log(
121                 "Unable to parse the boolean system property '" + key + "':" + value + " - " +
122                         "using the default value: " + def);
123 
124         return def;
125     }
126 
127     private static final Pattern INTEGER_PATTERN = Pattern.compile("-?[0-9]+");
128 
129     /**
130      * Returns the value of the Java system property with the specified
131      * {@code key}, while falling back to the specified default value if
132      * the property access fails.
133      *
134      * @return the property value.
135      *         {@code def} if there's no such property or if an access to the
136      *         specified property is not allowed.
137      */
138     public static int getInt(String key, int def) {
139         String value = get(key);
140         if (value == null) {
141             return def;
142         }
143 
144         value = value.trim().toLowerCase();
145         if (INTEGER_PATTERN.matcher(value).matches()) {
146             try {
147                 return Integer.parseInt(value);
148             } catch (Exception e) {
149                 // Ignore
150             }
151         }
152 
153         log(
154                 "Unable to parse the integer system property '" + key + "':" + value + " - " +
155                         "using the default value: " + def);
156 
157         return def;
158     }
159 
160     /**
161      * Returns the value of the Java system property with the specified
162      * {@code key}, while falling back to the specified default value if
163      * the property access fails.
164      *
165      * @return the property value.
166      *         {@code def} if there's no such property or if an access to the
167      *         specified property is not allowed.
168      */
169     public static long getLong(String key, long def) {
170         String value = get(key);
171         if (value == null) {
172             return def;
173         }
174 
175         value = value.trim().toLowerCase();
176         if (INTEGER_PATTERN.matcher(value).matches()) {
177             try {
178                 return Long.parseLong(value);
179             } catch (Exception e) {
180                 // Ignore
181             }
182         }
183 
184         log(
185                 "Unable to parse the long integer system property '" + key + "':" + value + " - " +
186                         "using the default value: " + def);
187 
188         return def;
189     }
190 
191     private static void log(String msg) {
192         if (initializedLogger) {
193             logger.warn(msg);
194         } else {
195             // Use JDK logging if logger was not initialized yet.
196             Logger.getLogger(SystemPropertyUtil.class.getName()).log(Level.WARNING, msg);
197         }
198     }
199 
200     private static void log(String msg, Exception e) {
201         if (initializedLogger) {
202             logger.warn(msg, e);
203         } else {
204             // Use JDK logging if logger was not initialized yet.
205             Logger.getLogger(SystemPropertyUtil.class.getName()).log(Level.WARNING, msg, e);
206         }
207     }
208 
209     private SystemPropertyUtil() {
210         // Unused
211     }
212 }