/******************************************************************************* | |
* 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(); | |
} | |
} |