blob: 08f1689962aa5193b706020a11bccbe1b7b78dec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.core.internal.registry;
import java.util.Properties;
import org.eclipse.core.internal.runtime.RuntimeLog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* Simple Property mechanism to chain property lookup from local registry properties,
* to BundleContext properties (if available) or System properties otherwise.
*/
public class RegistryProperties {
public static final String empty = ""; //$NON-NLS-1$
private static Properties registryProperties = new Properties();
private static Object context = null; // BundleContext, but specified as Object to avoid class loading
public static void setContext(Object object) {
context = object;
}
public static String getProperty(String propertyName) {
String propertyValue = registryProperties.getProperty(propertyName);
if (propertyValue != null)
return propertyValue;
return getContextProperty(propertyName);
}
public static String getProperty(String property, String defaultValue) {
String result = RegistryProperties.getProperty(property);
return result == null ? defaultValue : result;
}
public static void setProperty(String propertyName, String propertyValue) {
registryProperties.setProperty(propertyName, propertyValue);
}
// The registry could be used as a stand-alone utility without OSGi.
// Try to obtain the property from the OSGi context, but only use bundleContext if
// it was already set by Activator indicating that OSGi layer is present.
private static String getContextProperty(final String propertyName) {
if (context == null)
return System.getProperty(propertyName);
final String[] result = new String[1];
try {
// Wrap BundleContext into an inner class to make sure it will only get loaded
// if OSGi layer is present.
Runnable innerClass = new Runnable() {
public void run() {
org.osgi.framework.BundleContext bundleContext = (org.osgi.framework.BundleContext) context;
result[0] = bundleContext.getProperty(propertyName);
}
};
innerClass.run();
} catch (Exception e) {
// If we are here, it is likely means that context was set, but OSGi layer
// is not present or non-standard. This should not happen, but let's give
// the program a chance to continue - properties should have reasonable
// default values.
IStatus status = new Status(Status.ERROR, IRegistryConstants.RUNTIME_NAME, 0, e.getMessage(), e);
RuntimeLog.log(status);
return null;
}
return result[0];
}
}