package org.eclipse.core.internal.preferences;
import java.net.URL;
import java.util.*;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.osgi.service.datalocation.Location;
public class ConfigurationPreferences extends EclipsePreferences {
private int segmentCount;
private String qualifier;
private IPath location;
private IEclipsePreferences loadLevel;
private static Set<String> loadedNodes = Collections.synchronizedSet(new HashSet<String>());
private static boolean initialized = false;
private static IPath baseLocation;
static {
Location location = PreferencesOSGiUtils.getDefault().getConfigurationLocation();
if (location != null) {
URL url = location.getURL();
if (url != null)
baseLocation = new Path(url.getFile());
}
}
public ConfigurationPreferences() {
this(null, null);
}
private ConfigurationPreferences(EclipsePreferences parent, String name) {
super(parent, name);
initializeChildren();
String path = absolutePath();
segmentCount = getSegmentCount(path);
if (segmentCount < 2)
return;
qualifier = getSegment(path, 1);
if (qualifier == null)
return;
if (baseLocation != null)
location = computeLocation(baseLocation, qualifier);
}
@Override
protected IPath getLocation() {
return location;
}
@Override
protected boolean isAlreadyLoaded(IEclipsePreferences node) {
return loadedNodes.contains(node.name());
}
@Override
protected void loaded() {
loadedNodes.add(name());
}
@Override
protected IEclipsePreferences getLoadLevel() {
if (loadLevel == null) {
if (qualifier == null)
return null;
IEclipsePreferences node = this;
for (int i = 2; i < segmentCount; i++)
node = (EclipsePreferences) node.parent();
loadLevel = node;
}
return loadLevel;
}
protected void initializeChildren() {
if (initialized || parent == null)
return;
try {
synchronized (this) {
if (baseLocation == null)
return;
String[] names = computeChildren(baseLocation);
for (String n : names) {
addChild(n, null);
}
}
} finally {
initialized = true;
}
}
@Override
protected EclipsePreferences internalCreate(EclipsePreferences nodeParent, String nodeName, Object context) {
return new ConfigurationPreferences(nodeParent, nodeName);
}
}