blob: ee29ad337588ac8c8d4be48e4f9480295bc7aa1d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 IBM Corporation 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.wst.sse.core.internal.model;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.ConfigurationScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.sse.core.internal.SSECorePlugin;
import org.osgi.service.prefs.Preferences;
class PrefUtil {
static long WAIT_INTERVAL_MS = 500;
static int WAIT_DELAY = getInt("org.eclipse.wst.sse.core.modelmanager.maxWaitDuringConcurrentLoad");
static boolean ALLOW_INTERRUPT_WAITING_THREAD = getBoolean("org.eclipse.wst.sse.core.modelmanager.allowInterruptsDuringConcurrentLoad");
/** Base of millisecond timings, to avoid wrapping */
private static final long MILLI_ORIGIN = System.currentTimeMillis();
/**
* Returns millisecond time offset by origin
*/
static final long now() {
return System.currentTimeMillis() - MILLI_ORIGIN;
}
private static IEclipsePreferences.IPreferenceChangeListener LISTENER;
static {
InstanceScope scope = new InstanceScope();
IEclipsePreferences instancePrefs = scope.getNode(SSECorePlugin.ID);
LISTENER = new IEclipsePreferences.IPreferenceChangeListener() {
public void preferenceChange(PreferenceChangeEvent event) {
if ("modelmanager.maxWaitDuringConcurrentLoad".equals(event.getKey())) {
WAIT_DELAY = getInt("org.eclipse.wst.sse.core.modelmanager.maxWaitDuringConcurrentLoad");
}
else if ("modelmanager.allowInterruptsDuringConcurrentLoad".equals(event.getKey())) {
ALLOW_INTERRUPT_WAITING_THREAD = getBoolean("org.eclipse.wst.sse.core.modelmanager.allowInterruptsDuringConcurrentLoad");
}
}
};
instancePrefs.addPreferenceChangeListener(LISTENER);
}
private static String getProperty(String property) {
// Importance order is:
// default-default < instanceScope < configurationScope < systemProperty
// < envVar
String value = null;
if (value == null) {
value = System.getenv(property);
}
if (value == null) {
value = System.getProperty(property);
}
if (value == null) {
IPreferencesService preferencesService = Platform.getPreferencesService();
String key = property;
if (property != null && property.startsWith(SSECorePlugin.ID)) {
// +1, include the "."
key = property.substring(SSECorePlugin.ID.length() + 1, property.length());
}
InstanceScope instance = new InstanceScope();
ConfigurationScope config = new ConfigurationScope();
Preferences instanceNode = instance.getNode(SSECorePlugin.ID);
Preferences configNode = config.getNode(SSECorePlugin.ID);
value = preferencesService.get(key, getDefault(property), new Preferences[]{configNode,instanceNode});
}
return value;
}
private static String getDefault(String property) {
// this is the "default-default"
if ("org.eclipse.wst.sse.core.modelmanager.maxWaitDuringConcurrentLoad".equals(property)) {
return "0";
}
else if ("org.eclipse.wst.sse.core.modelmanager.allowInterruptsDuringConcurrentLoad".equals(property)) {
return "false";
}
return null;
}
private static boolean getBoolean(String key) {
String property = getProperty(key);
// if (property != null) {
// System.out.println("Tweak: " + key + "=" + Boolean.parseBoolean(property)); //$NON-NLS-1$ //$NON-NLS-2$
// }
return (property != null ? Boolean.valueOf(property) : Boolean.valueOf(getDefault(key)))
.booleanValue();
}
private static int getInt(String key) {
String property = getProperty(key);
int size = 0;
if (property != null) {
try {
size = Integer.parseInt(property);
// System.out.println("Tweak: " + key + "=" + size); //$NON-NLS-1$ //$NON-NLS-2$
}
catch (NumberFormatException e) {
size = getDefaultInt(key, property, size);
}
}
else {
size = getDefaultInt(key, property, size);
}
return size;
}
private static int getDefaultInt(String key, String property, int size) {
// ignored
try {
size = Integer.parseInt(getDefault(key));
}
catch (NumberFormatException e1) {
handleIntParseException(key, property, e1);
size = 0;
}
return size;
}
private static void handleIntParseException(String key, String property, NumberFormatException e1) {
Exception n = new Exception(NLS.bind(
"Exception during parse of default value for key ''{0}'' value was ''{1}''. Using 0 instead", //$NON-NLS-1$
key, property), e1);
n.printStackTrace();
}
}