/******************************************************************************* * Copyright (c) 2009, 2015 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.core.internal.preferences; import java.util.*; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.preferences.*; /** * This class represents a preference node in the "bundle_defaults" scope. This scope is * used to represent default values which are set by the bundle in either its preference * initializer or in a file included with the bundle. * * This differs from the regular default scope because it does not contain values set * by the product preference customization or the command-line. * * @since 3.3 */ public class BundleDefaultPreferences extends EclipsePreferences { private static Set<String> loadedNodes = Collections.synchronizedSet(new HashSet<String>()); private String qualifier; private int segmentCount; private IEclipsePreferences loadLevel; /* * Default constructor. */ public BundleDefaultPreferences() { this(null, null); } private BundleDefaultPreferences(EclipsePreferences parent, String name) { super(parent, name); // cache the segment count IPath path = new Path(absolutePath()); segmentCount = path.segmentCount(); if (segmentCount < 2) return; // cache the qualifier String scope = path.segment(0); if (BundleDefaultsScope.SCOPE.equals(scope)) qualifier = path.segment(1); // cache the location if (qualifier == null) return; } @Override protected IEclipsePreferences getLoadLevel() { if (loadLevel == null) { if (qualifier == null) return null; // Make it relative to this node rather than navigating to it from the root. // Walk backwards up the tree starting at this node. // This is important to avoid a chicken/egg thing on startup. IEclipsePreferences node = this; for (int i = 2; i < segmentCount; i++) node = (IEclipsePreferences) node.parent(); loadLevel = node; } return loadLevel; } @Override protected boolean isAlreadyLoaded(IEclipsePreferences node) { return loadedNodes.contains(node.name()); } @Override protected void loaded() { loadedNodes.add(name()); } @Override protected void load() { // ensure that the same node in the "default" scope is loaded so this one is // initialized properly String relativePath = DefaultPreferences.getScopeRelativePath(absolutePath()); if (relativePath != null) { // touch the node to force a load PreferencesService.getDefault().getRootNode().node(DefaultScope.SCOPE).node(relativePath); } } @Override protected EclipsePreferences internalCreate(EclipsePreferences nodeParent, String nodeName, Object context) { return new BundleDefaultPreferences(nodeParent, nodeName); } }