package org.erlide.backend.runtimeinfo;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.erlide.runtime.runtimeinfo.IRuntimeInfoSerializer;
import org.erlide.runtime.runtimeinfo.RuntimeInfo;
import org.erlide.runtime.runtimeinfo.RuntimeInfoCatalogData;
import org.erlide.util.ErlLogger;
import org.osgi.service.prefs.BackingStoreException;
public class RuntimeInfoPreferencesSerializer implements IRuntimeInfoSerializer {
private static final String ERLIDE_KEY = "erlide";
private static final String DEFAULT_KEY = "default";
// TODO remove old key in a few releases
@Deprecated
private static String rootKeyOld = "org.erlide.core" + "/runtimes";
private static String rootKey = "org.erlide.backend" + "/runtimes";
@Deprecated
public static IEclipsePreferences getInstanceOldRootNode() {
return InstanceScope.INSTANCE.getNode(rootKeyOld);
}
@Deprecated
public static IEclipsePreferences getDefaultOldRootNode() {
return DefaultScope.INSTANCE.getNode(rootKeyOld);
}
public static IEclipsePreferences getInstanceRootNode() {
return InstanceScope.INSTANCE.getNode(rootKey);
}
public static IEclipsePreferences getDefaultRootNode() {
return DefaultScope.INSTANCE.getNode(rootKey);
}
private final IEclipsePreferences defaultRootNode;
private final IEclipsePreferences instanceRootNode;
public RuntimeInfoPreferencesSerializer(final IEclipsePreferences instanceRootNode,
final IEclipsePreferences defaultRootNode) {
this.instanceRootNode = instanceRootNode;
this.defaultRootNode = defaultRootNode;
}
public RuntimeInfoPreferencesSerializer() {
this(getInstanceRootNode(), getDefaultRootNode());
}
@Override
public synchronized void store(final RuntimeInfoCatalogData data) {
try {
instanceRootNode.clear();
for (final String node : instanceRootNode.childrenNames()) {
instanceRootNode.node(node).removeNode();
}
for (final RuntimeInfo rt : data.runtimes) {
RuntimeInfoLoader.store(rt, instanceRootNode);
}
if (data.defaultRuntimeName != null) {
instanceRootNode.put(DEFAULT_KEY, data.defaultRuntimeName);
}
if (data.erlideRuntimeName != null) {
instanceRootNode.put(ERLIDE_KEY, data.erlideRuntimeName);
}
instanceRootNode.flush();
} catch (final Exception e) {
ErlLogger.warn(e);
}
}
@Override
public synchronized RuntimeInfoCatalogData load() {
RuntimeInfoCatalogData data = new RuntimeInfoCatalogData();
data = loadPrefs(data, getDefaultOldRootNode());
data = loadPrefs(data, defaultRootNode);
data = loadPrefs(data, getInstanceOldRootNode());
data = loadPrefs(data, instanceRootNode);
String dflt = null;
String ide = null;
if (data.runtimes.size() > 0) {
dflt = data.defaultRuntimeName != null ? data.defaultRuntimeName
: data.runtimes.iterator().next().getName();
ide = data.erlideRuntimeName != null ? data.erlideRuntimeName : dflt;
}
return new RuntimeInfoCatalogData(data.runtimes, dflt, ide);
}
private RuntimeInfoCatalogData loadPrefs(final RuntimeInfoCatalogData data,
final IEclipsePreferences root) {
String[] children;
final Collection<RuntimeInfo> runtimes = new ArrayList<>(
data.runtimes);
try {
children = root.childrenNames();
for (final String name : children) {
final RuntimeInfo rt = RuntimeInfoLoader.load(root.node(name));
runtimes.add(rt);
}
} catch (final BackingStoreException e) {
ErlLogger.warn(e);
}
final String defaultRuntimeName = root.get(DEFAULT_KEY, data.defaultRuntimeName);
final String ideRuntimeName = root.get(ERLIDE_KEY, data.erlideRuntimeName);
return new RuntimeInfoCatalogData(runtimes, defaultRuntimeName, ideRuntimeName);
}
}