Skip to content

Commit

Permalink
Introduce 'user' preference scope located in <user.home>/.eclipse
Browse files Browse the repository at this point in the history
  • Loading branch information
HannesWell committed Dec 21, 2023
1 parent ab23314 commit 0edec5a
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public class PreferencesService implements IPreferencesService {
private static List<String> DEFAULT_DEFAULT_LOOKUP_ORDER = List.of( //
InstanceScope.SCOPE, //
ConfigurationScope.SCOPE, //
UserScope.SCOPE, //
DefaultScope.SCOPE);
private static final char EXPORT_ROOT_PREFIX = '!';
private static final char BUNDLE_VERSION_PREFIX = '@';
Expand Down Expand Up @@ -339,6 +340,8 @@ private void initializeDefaultScopes() {
root.addChild(InstanceScope.SCOPE, null);
defaultScopes.put(ConfigurationScope.SCOPE, new ConfigurationPreferences());
root.addChild(ConfigurationScope.SCOPE, null);
defaultScopes.put(UserScope.SCOPE, new UserPreferences());
root.addChild(UserScope.SCOPE, null);
}

public IEclipsePreferences createNode(String key) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*******************************************************************************
* Copyright (c) 2023, 2023 Hannes Wellmann and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Hannes Wellmann - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.preferences;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.preferences.UserScope;

public class UserPreferences extends SingletonEclipsePreferences {

// cache which nodes have been loaded from disk
private static final Set<String> LOADED_NODES = ConcurrentHashMap.newKeySet();
private static final AtomicBoolean INITIALIZED = new AtomicBoolean();

/**
* Default constructor. Should only be called by #createExecutableExtension.
*/
public UserPreferences() {
this(null, null);
}

private UserPreferences(EclipsePreferences parent, String name) {
super(parent, name, LOADED_NODES, INITIALIZED);
}

@Override
IPath getBaseLocation() {
return UserScope.INSTANCE.getLocation();
}

@Override
protected EclipsePreferences internalCreate(EclipsePreferences nodeParent, String nodeName, Object context) {
return new UserPreferences(nodeParent, nodeName);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*******************************************************************************
* Copyright (c) 2023, 2023 Hannes Wellmann and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Hannes Wellmann - initial API and implementation
*******************************************************************************/
package org.eclipse.core.runtime.preferences;

import org.eclipse.core.internal.preferences.AbstractScope;
import org.eclipse.core.runtime.IPath;

/**
* @since 3.11
*/
public class UserScope extends AbstractScope {

/**
* String constant (value of <code>"user"</code>) used for the scope name for
* the user preference scope.
*/
public static final String SCOPE = "user"; //$NON-NLS-1$

private static final IPath USER_HOME_PREFERENCE_LOCATION;
static {
String userHome = System.getProperty("user.home"); //$NON-NLS-1$
USER_HOME_PREFERENCE_LOCATION = IPath.forWindows(userHome).append(".eclipse"); //$NON-NLS-1$
}

/**
* Singleton instance of a User Scope object. Typical usage is:
* <code>UserScope.INSTANCE.getNode(...);</code>
*
* @since 3.4
*/
public static final IScopeContext INSTANCE = new UserScope();

private UserScope() { // static use only via INSTANCE
}

@Override
public String getName() {
return SCOPE;
}

@Override
public IPath getLocation() {
return USER_HOME_PREFERENCE_LOCATION;
}

}

0 comments on commit 0edec5a

Please sign in to comment.