package org.marketcetera.photon.internal.module.ui; import java.text.MessageFormat; import java.util.Map; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.InstanceScope; import org.marketcetera.module.ModuleURN; 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$ */ /** * Adapts the module preferences provided by the * <code>org.marketcetera.photon.module</code> plug-in to a * {@link PropertiesTree} suitable for {@link ModulePropertiesPreferencePage}. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: PreferencesAdapter.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.1.0 */ @ClassVersion("$Id: PreferencesAdapter.java 16154 2012-07-14 16:34:05Z colin $") public class PreferencesAdapter { private static final String ROOT_NODE = "ModuleAttributeDefaults"; //$NON-NLS-1$ private static final String MODULE_PLUGIN_ID = "org.marketcetera.photon.module"; //$NON-NLS-1$ private final IModuleAttributeDefaults mSupport; /** * Constructor. * * @param support * support for modify attribute defaults */ public PreferencesAdapter(IModuleAttributeDefaults support) { this.mSupport = support; } public PropertiesTree toTree() { final PropertiesTree defaults = new PropertiesTree(); IVisitor visitor = new IVisitor() { @Override public void visitNode(Preferences node, String key, String combinedKey) { defaults.put(combinedKey, node.get(key, null)); } }; visit(new DefaultScope().getNode(MODULE_PLUGIN_ID).node(ROOT_NODE), visitor); visit(new InstanceScope().getNode(MODULE_PLUGIN_ID).node(ROOT_NODE), visitor); return defaults; } public void fromTree(final PropertiesTree defaults) { for (Map.Entry<String, String> entry : defaults.entrySet()) { String[] parts = entry.getKey().split("\\."); //$NON-NLS-1$ String value = entry.getValue(); ModuleURN providerURN = new ModuleURN(MessageFormat.format( "metc:{0}:{1}", parts[0], parts[1])); //$NON-NLS-1$ if (parts.length == 3) { mSupport.setDefaultFor(providerURN, parts[2], value); } else if (parts.length == 4) { if (parts[2] .equals(IModuleAttributeDefaults.INSTANCE_DEFAULTS_IDENTIFIER)) { mSupport .setInstanceDefaultFor(providerURN, parts[3], value); } else { mSupport.setDefaultFor( new ModuleURN(providerURN, parts[2]), parts[3], value); } } } visit(new InstanceScope().getNode(MODULE_PLUGIN_ID).node(ROOT_NODE), new IVisitor() { @Override public void visitNode(Preferences node, String key, String combinedKey) { if (!defaults.containsKey(combinedKey)) { node.remove(key); } } }); } private void visit(Preferences rootNode, IVisitor visitor) { try { for (String providerType : rootNode.childrenNames()) { // cheat for now - exclude mdata and remote since there is custom UI if (providerType.equals("mdata") || providerType.equals("remote")) { //$NON-NLS-1$ continue; } Preferences providerTypeNode = rootNode.node(providerType); for (String provider : providerTypeNode.childrenNames()) { Preferences providerNode = providerTypeNode.node(provider); for (String key : providerNode.keys()) { visitor.visitNode(providerNode, key, MessageFormat .format("{0}.{1}.{2}", providerType, provider, //$NON-NLS-1$ key)); } for (String instance : providerNode.childrenNames()) { Preferences node = providerNode.node(instance); for (String key : node.keys()) { visitor.visitNode(node, key, MessageFormat.format( "{0}.{1}.{2}.{3}", providerType, provider, //$NON-NLS-1$ instance, key)); } } } } } catch (BackingStoreException e) { throw new RuntimeException(e); } } /** * Internal interface for walking the tree. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: PreferencesAdapter.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.1.0 */ @ClassVersion("$Id: PreferencesAdapter.java 16154 2012-07-14 16:34:05Z colin $") private static interface IVisitor { void visitNode(Preferences node, String key, String combinedKey); } }