/*
* FindBugs - Find Bugs in Java programs
* Copyright (C) 2006, University of Maryland
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.umd.cs.findbugs;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.IllegalFormatException;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import edu.umd.cs.findbugs.ba.AnalysisContext;
import edu.umd.cs.findbugs.io.IO;
/**
* @author pugh
*/
public class SystemProperties {
private static Properties properties = new Properties();
public final static boolean ASSERTIONS_ENABLED;
public static boolean RUNNING_IN_ECLIPSE = SystemProperties.class.getClassLoader().getClass().getCanonicalName()
.startsWith("org.eclipse.osgi");
final static String OS_NAME;
static {
boolean tmp = false;
assert tmp = true; // set tmp to true if assertions are enabled
ASSERTIONS_ENABLED = tmp;
String osName;
try {
osName = "." + System.getProperty("os.name", "Unknown").replace(' ', '_');
} catch (Throwable e) {
osName = ".Unknown";
}
OS_NAME = osName;
loadPropertiesFromConfigFile();
if (getBoolean("findbugs.dumpProperties")) {
FileOutputStream out = null;
try {
out = new FileOutputStream("/tmp/outProperties.txt");
System.getProperties().store(out, "System properties dump");
properties.store(out, "FindBugs properties dump");
} catch (IOException e) {
assert true;
} finally {
IO.close(out);
}
}
}
private static void loadPropertiesFromConfigFile() {
URL systemProperties = DetectorFactoryCollection.getCoreResource("systemProperties.properties");
loadPropertiesFromURL(systemProperties);
String u = System.getProperty("findbugs.loadPropertiesFrom");
if (u != null)
try {
URL configURL = new URL(u);
loadPropertiesFromURL(configURL);
} catch (MalformedURLException e) {
AnalysisContext.logError("Unable to load properties from " + u, e);
}
}
public static Properties getLocalProperties() {
return properties;
}
public static Properties getAllProperties() {
Properties result = System.getProperties();
result.putAll(properties);
return result;
}
/**
* This method is public to allow clients to set system properties via any
* {@link URL}
*
* @param url
* an url to load system properties from, may be nullerrorMsg
*/
public static void loadPropertiesFromURL(URL url) {
if (url == null) {
return;
}
InputStream in = null;
try {
in = url.openStream();
properties.load(in);
} catch (IOException e) {
AnalysisContext.logError("Unable to load properties from " + url, e);
} finally {
IO.close(in);
}
}
/**
* Get boolean property, returning false if a security manager prevents us
* from accessing system properties
* <p>
* (incomplete) list of known system properties
* <ul>
* <li>
* "report_TESTING_pattern_in_standard_detectors" - default is false
* </li>
* </ul>
*
* @return true if the property exists and is set to true
*/
public static boolean getBoolean(String name) {
return getBoolean(name, false);
}
public static boolean getBoolean(String name, boolean defaultValue) {
boolean result = defaultValue;
try {
String value = getProperty(name);
if (value == null)
return defaultValue;
result = toBoolean(value);
} catch (IllegalArgumentException e) {
} catch (NullPointerException e) {
}
return result;
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
/**
* @param arg0
* property name
* @param arg1
* default value
* @return the int value (or arg1 if the property does not exist)
* @deprecated Use {@link #getInt(String,int)} instead
*/
@Deprecated
public static Integer getInteger(String arg0, int arg1) {
return getInt(arg0, arg1);
}
/**
* @param name
* property name
* @param defaultValue
* default value
* @return the int value (or defaultValue if the property does not exist)
*/
public static int getInt(String name, int defaultValue) {
try {
String value = getProperty(name);
if (value != null)
return Integer.decode(value);
} catch (Exception e) {
assert true;
}
return defaultValue;
}
/**
* @param name
* property name
* @return string value (or null if the property does not exist)
*/
public static String getOSDependentProperty(String name) {
String osDependentName = name + OS_NAME;
String value = getProperty(osDependentName);
if (value != null)
return value;
return getProperty(name);
}
/**
* @param name
* property name
* @return string value (or null if the property does not exist)
*/
public static String getProperty(String name) {
try {
String value = properties.getProperty(name);
if (value != null)
return value;
return System.getProperty(name);
} catch (Exception e) {
return null;
}
}
public static void setProperty(String name, String value) {
properties.setProperty(name, value);
}
/**
* @param name
* property name
* @param defaultValue
* default value
* @return string value (or defaultValue if the property does not exist)
*/
public static String getProperty(String name, String defaultValue) {
try {
String value = properties.getProperty(name);
if (value != null)
return value;
return System.getProperty(name, defaultValue);
} catch (Exception e) {
return defaultValue;
}
}
private static final String URL_REWRITE_PATTERN_STRING = getOSDependentProperty("findbugs.urlRewritePattern");
private static final String URL_REWRITE_FORMAT = getOSDependentProperty("findbugs.urlRewriteFormat");
private static final Pattern URL_REWRITE_PATTERN;
static {
Pattern p = null;
if (URL_REWRITE_PATTERN_STRING != null && URL_REWRITE_FORMAT != null) {
try {
p = Pattern.compile(URL_REWRITE_PATTERN_STRING);
String ignored = String.format(URL_REWRITE_FORMAT, "");
} catch (PatternSyntaxException e) {
throw new IllegalArgumentException("Bad findbugs.urlRewritePattern '" + URL_REWRITE_PATTERN_STRING + "' - "
+ e.getClass().getSimpleName() + ": "+ e.getMessage());
} catch (IllegalFormatException e) {
throw new IllegalArgumentException("Bad findbugs.urlRewriteFormat '" + URL_REWRITE_FORMAT + "' - "
+ e.getClass().getSimpleName() + ": " + e.getMessage());
}
} else if (URL_REWRITE_PATTERN_STRING != null) {
throw new IllegalArgumentException("findbugs.urlRewritePattern is set but not findbugs.urlRewriteFormat");
} else if (URL_REWRITE_FORMAT != null) {
throw new IllegalArgumentException("findbugs.urlRewriteFormat is set but not findbugs.urlRewritePattern");
}
URL_REWRITE_PATTERN = p;
}
public static String rewriteURLAccordingToProperties(String u) {
if (URL_REWRITE_PATTERN == null || URL_REWRITE_FORMAT == null)
return u;
Matcher m = URL_REWRITE_PATTERN.matcher(u);
if (!m.matches() || m.groupCount() == 0)
return u;
String result = String.format(URL_REWRITE_FORMAT, m.group(1));
return result;
}
}