package org.marketcetera.photon.internal.module;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.marketcetera.module.InvalidURNException;
import org.marketcetera.module.ModuleURN;
import org.marketcetera.module.URNUtils;
import org.marketcetera.photon.module.IModuleAttributeDefaults;
import org.marketcetera.util.misc.ClassVersion;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
/* $License$ */
/**
* Supports module attribute defaults using Eclipse preferences.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: PreferenceAttributeDefaults.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.1.0
*/
@ClassVersion("$Id: PreferenceAttributeDefaults.java 16154 2012-07-14 16:34:05Z colin $")
public class PreferenceAttributeDefaults implements IModuleAttributeDefaults {
private static final String ROOT_NODE = "ModuleAttributeDefaults"; //$NON-NLS-1$
@Override
public synchronized String getDefaultFor(ModuleURN urn, String attribute) {
Preferences[] nodes;
if (urn.instanceURN()) {
nodes = new Preferences[] {
getNode(urn),
getDefaultScopeNode(urn),
getNode(urn).parent().node(INSTANCE_DEFAULTS_IDENTIFIER),
getDefaultScopeNode(urn).parent().node(
INSTANCE_DEFAULTS_IDENTIFIER) };
} else {
nodes = new Preferences[] { getNode(urn), getDefaultScopeNode(urn) };
}
return Platform.getPreferencesService().get(attribute, null, nodes);
}
@Override
public synchronized void setDefaultFor(ModuleURN urn, String attribute,
String value) {
Preferences node = getNode(urn);
node.put(attribute, value);
}
@Override
public synchronized void setInstanceDefaultFor(ModuleURN urn,
String attribute, String value) {
try {
URNUtils.validateProviderURN(urn);
} catch (InvalidURNException e) {
throw new IllegalArgumentException(urn.toString(), e);
}
getNode(urn).node(INSTANCE_DEFAULTS_IDENTIFIER).put(attribute, value);
}
@Override
public synchronized void removeDefaultFor(ModuleURN urn, String attribute) {
Preferences node = getNode(urn);
node.remove(attribute);
}
@Override
public synchronized void removeInstanceDefaultFor(ModuleURN urn,
String attribute) {
try {
URNUtils.validateProviderURN(urn);
} catch (InvalidURNException e) {
throw new IllegalArgumentException(urn.toString(), e);
}
getNode(urn).node(INSTANCE_DEFAULTS_IDENTIFIER).remove(attribute);
}
private Preferences getNode(ModuleURN urn) {
return getNode(urn, getRootNode());
}
private Preferences getRootNode() {
return new InstanceScope().getNode(Activator.PLUGIN_ID).node(ROOT_NODE);
}
private Preferences getDefaultScopeNode(ModuleURN urn) {
return getNode(urn, new DefaultScope().getNode(Activator.PLUGIN_ID)
.node(ROOT_NODE));
}
private Preferences getNode(ModuleURN urn, Preferences baseNode) {
Preferences node = baseNode.node(urn.providerType()).node(
urn.providerName());
if (urn.instanceURN()) {
node = node.node(urn.instanceName());
}
return node;
}
@Override
public void flush() {
try {
getRootNode().flush();
} catch (BackingStoreException e) {
Messages.PREFERENCE_ATTRIBUTE_DEFAULTS_FAILED_TO_SAVE_PREFERENCES
.error(this, e);
}
}
}