package org.eclipse.core.internal.resources;
import java.util.*;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Preferences;
public class WorkspacePreferences extends WorkspaceDescription {
public final static String PROJECT_SEPARATOR = "/";
private Preferences preferences;
public static String convertStringArraytoString(String[] array) {
if (array == null || array.length == 0)
return "";
StringBuilder sb = new StringBuilder();
for (String element : array) {
sb.append(element);
sb.append(PROJECT_SEPARATOR);
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
public static String[] convertStringToStringArray(String string, String separator) {
List<String> list = new ArrayList<>();
for (StringTokenizer tokenizer = new StringTokenizer(string, separator); tokenizer.hasMoreTokens();)
list.add(tokenizer.nextToken());
return list.toArray(new String[list.size()]);
}
private static void copyFromTo(WorkspaceDescription source, WorkspaceDescription target) {
target.setAutoBuilding(source.isAutoBuilding());
target.setBuildOrder(source.getBuildOrder());
target.setMaxBuildIterations(source.getMaxBuildIterations());
target.setApplyFileStatePolicy(source.isApplyFileStatePolicy());
target.setFileStateLongevity(source.getFileStateLongevity());
target.setMaxFileStates(source.getMaxFileStates());
target.setMaxFileStateSize(source.getMaxFileStateSize());
target.setSnapshotInterval(source.getSnapshotInterval());
target.setOperationsPerSnapshot(source.getOperationsPerSnapshot());
target.setDeltaExpiration(source.getDeltaExpiration());
target.setMaxConcurrentBuilds(source.getMaxConcurrentBuilds());
}
public WorkspacePreferences() {
super("Workspace");
this.preferences = ResourcesPlugin.getPlugin().getPluginPreferences();
final String version = preferences.getString(ICoreConstants.PREF_VERSION_KEY);
if (!ICoreConstants.PREF_VERSION.equals(version))
upgradeVersion(version);
super.setAutoBuilding(preferences.getBoolean(ResourcesPlugin.PREF_AUTO_BUILDING));
super.setSnapshotInterval(preferences.getInt(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL));
super.setMaxBuildIterations(preferences.getInt(ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS));
super.setApplyFileStatePolicy(preferences.getBoolean(ResourcesPlugin.PREF_APPLY_FILE_STATE_POLICY));
super.setMaxFileStates(preferences.getInt(ResourcesPlugin.PREF_MAX_FILE_STATES));
super.setMaxFileStateSize(preferences.getLong(ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE));
super.setFileStateLongevity(preferences.getLong(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY));
super.setOperationsPerSnapshot(preferences.getInt(PreferenceInitializer.PREF_OPERATIONS_PER_SNAPSHOT));
super.setDeltaExpiration(preferences.getLong(PreferenceInitializer.PREF_DELTA_EXPIRATION));
super.setMaxConcurrentBuilds(preferences.getInt(ResourcesPlugin.PREF_MAX_CONCURRENT_BUILDS));
preferences.addPropertyChangeListener(event -> synchronizeWithPreferences(event.getProperty()));
}
@Override
public Object clone() {
throw new UnsupportedOperationException("clone() is not supported in " + getClass().getName());
}
public void copyFrom(WorkspaceDescription source) {
copyFromTo(source, this);
}
public void copyTo(WorkspaceDescription target) {
copyFromTo(this, target);
}
@Override
public String[] getBuildOrder() {
boolean defaultBuildOrder = preferences.getBoolean(ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER);
if (defaultBuildOrder)
return null;
return convertStringToStringArray(preferences.getString(ResourcesPlugin.PREF_BUILD_ORDER), PROJECT_SEPARATOR);
}
@Override
public String[] getBuildOrder(boolean makeCopy) {
return getBuildOrder();
}
@Override
public void setAutoBuilding(boolean value) {
preferences.setValue(ResourcesPlugin.PREF_AUTO_BUILDING, value);
}
@Override
public void setBuildOrder(String[] value) {
preferences.setValue(ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER, value == null);
preferences.setValue(ResourcesPlugin.PREF_BUILD_ORDER, convertStringArraytoString(value));
}
@Override
public void setDeltaExpiration(long value) {
preferences.setValue(PreferenceInitializer.PREF_DELTA_EXPIRATION, value);
}
@Override
public void setApplyFileStatePolicy(boolean apply) {
preferences.setValue(ResourcesPlugin.PREF_APPLY_FILE_STATE_POLICY, apply);
}
@Override
public void setFileStateLongevity(long time) {
preferences.setValue(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY, time);
}
@Override
public void setMaxBuildIterations(int number) {
preferences.setValue(ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS, number);
}
@Override
public void setMaxFileStates(int number) {
preferences.setValue(ResourcesPlugin.PREF_MAX_FILE_STATES, number);
}
@Override
public void setMaxFileStateSize(long size) {
preferences.setValue(ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE, size);
}
@Override
public void setOperationsPerSnapshot(int value) {
preferences.setValue(PreferenceInitializer.PREF_OPERATIONS_PER_SNAPSHOT, value);
}
@Override
public void setMaxConcurrentBuilds(int n) {
preferences.setValue(ResourcesPlugin.PREF_MAX_CONCURRENT_BUILDS, n);
}
@Override
public void setSnapshotInterval(long delay) {
preferences.setValue(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL, delay);
}
protected void synchronizeWithPreferences(String property) {
if (property.equals(ResourcesPlugin.PREF_AUTO_BUILDING))
super.setAutoBuilding(preferences.getBoolean(ResourcesPlugin.PREF_AUTO_BUILDING));
else if (property.equals(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL))
super.setSnapshotInterval(preferences.getLong(ResourcesPlugin.PREF_SNAPSHOT_INTERVAL));
else if (property.equals(ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS))
super.setMaxBuildIterations(preferences.getInt(ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS));
else if (property.equals(ResourcesPlugin.PREF_APPLY_FILE_STATE_POLICY))
super.setApplyFileStatePolicy(preferences.getBoolean(ResourcesPlugin.PREF_APPLY_FILE_STATE_POLICY));
else if (property.equals(ResourcesPlugin.PREF_MAX_FILE_STATES))
super.setMaxFileStates(preferences.getInt(ResourcesPlugin.PREF_MAX_FILE_STATES));
else if (property.equals(ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE))
super.setMaxFileStateSize(preferences.getLong(ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE));
else if (property.equals(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY))
super.setFileStateLongevity(preferences.getLong(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY));
else if (property.equals(PreferenceInitializer.PREF_OPERATIONS_PER_SNAPSHOT))
super.setOperationsPerSnapshot(preferences.getInt(PreferenceInitializer.PREF_OPERATIONS_PER_SNAPSHOT));
else if (property.equals(PreferenceInitializer.PREF_DELTA_EXPIRATION))
super.setDeltaExpiration(preferences.getLong(PreferenceInitializer.PREF_DELTA_EXPIRATION));
else if (property.equals(ResourcesPlugin.PREF_MAX_CONCURRENT_BUILDS)) {
super.setMaxConcurrentBuilds(preferences.getInt(ResourcesPlugin.PREF_MAX_CONCURRENT_BUILDS));
}
}
private void upgradeVersion(String oldVersion) {
if (oldVersion.length() == 0) {
if (!preferences.getBoolean(ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER)) {
String oldOrder = preferences.getString(ResourcesPlugin.PREF_BUILD_ORDER);
setBuildOrder(convertStringToStringArray(oldOrder, ":"));
}
}
preferences.setValue(ICoreConstants.PREF_VERSION_KEY, ICoreConstants.PREF_VERSION);
}
}