blob: f8a88d2406aa198c0529b9e2efd24b138c29b33e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*******************************************************************************/
package org.eclipse.dltk.debug.ui.interpreters;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.eclipse.dltk.core.environment.EnvironmentManager;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
import org.eclipse.dltk.internal.debug.ui.interpreters.InterpretersMessages;
import org.eclipse.dltk.internal.launching.InterpreterDefinitionsContainer;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.IInterpreterInstallType;
import org.eclipse.dltk.launching.ScriptRuntime;
import org.eclipse.dltk.launching.ScriptRuntime.DefaultInterpreterEntry;
import org.eclipse.jface.operation.IRunnableWithProgress;
/**
* Processes add/removed/changed Interpreters.
*/
public class InterpretersUpdater {
// The interpreters defined when this updated is instantiated
private InterpreterDefinitionsContainer fOriginalInterpreters;
/**
* Constructs a new Interpreter updater to update Interpreter install
* settings.
*/
public InterpretersUpdater() {
saveCurrentAsOriginal();
}
private void saveCurrentAsOriginal() {
fOriginalInterpreters = new InterpreterDefinitionsContainer();
final DefaultInterpreterEntry[] entries = ScriptRuntime
.getDefaultInterpreterIDs();
for (int i = 0; i < entries.length; i++) {
final DefaultInterpreterEntry entry = entries[i];
IInterpreterInstall def = ScriptRuntime
.getDefaultInterpreterInstall(entry);
if (def != null) {
fOriginalInterpreters.setDefaultInterpreterInstallCompositeID(
entry,
ScriptRuntime.getCompositeIdFromInterpreter(def));
}
}
final IInterpreterInstallType[] types = ScriptRuntime
.getInterpreterInstallTypes();
for (int i = 0; i < types.length; i++) {
IInterpreterInstall[] installs = types[i].getInterpreterInstalls();
if (installs != null) {
for (int j = 0; j < installs.length; j++) {
fOriginalInterpreters.addInterpreter(installs[j]);
}
}
}
}
/**
* Updates Interpreter settings and returns whether the update was
* successful.
*
* @param interpreters
* new installed InterpreterEnvironments
* @param defaultInterpreters
* new default Interpreter
* @return whether the update was successful
*/
public boolean updateInterpreterSettings(String langNatureId,
IInterpreterInstall[] interpreters,
IInterpreterInstall[] defaultInterpreters) {
// Create a Interpreter definition container
InterpreterDefinitionsContainer container = new InterpreterDefinitionsContainer();
// Default interpreter id for natureId
final Set<String> envIds = new HashSet<>();
if (defaultInterpreters != null) {
for (int i = 0; i < defaultInterpreters.length; i++) {
final String defaultId = ScriptRuntime
.getCompositeIdFromInterpreter(defaultInterpreters[i]);
final String environmentId = defaultInterpreters[i]
.getEnvironmentId();
if (environmentId != null) {
DefaultInterpreterEntry entry = new DefaultInterpreterEntry(
langNatureId, environmentId);
container.setDefaultInterpreterInstallCompositeID(entry,
defaultId);
envIds.add(environmentId);
}
}
}
for (IEnvironment environment : EnvironmentManager.getEnvironments()) {
if (!envIds.contains(environment.getId())) {
DefaultInterpreterEntry entry = new DefaultInterpreterEntry(
langNatureId, environment.getId());
container.setDefaultInterpreterInstallCompositeID(entry, null);
}
}
// Interpreters for natureId
for (int i = 0; i < interpreters.length; i++) {
container.addInterpreter(interpreters[i]);
}
// Default interpreters for other languages
for (final DefaultInterpreterEntry entry : fOriginalInterpreters
.getInterpreterNatures()) {
if (!langNatureId.equals(entry.getNature())) {
final String defaultId = fOriginalInterpreters
.getDefaultInterpreterInstallCompositeID(entry);
container.setDefaultInterpreterInstallCompositeID(entry,
defaultId);
}
}
// Save interpreters from other languages to the container
for (final IInterpreterInstall install : fOriginalInterpreters
.getInterpreterList()) {
if (!langNatureId.equals(
install.getInterpreterInstallType().getNatureId())) {
container.addInterpreter(install);
}
}
// Generate XML for the interpreter definitions and save it as the new
// value of the Interpreter preference
saveInterpreterDefinitions(container);
saveCurrentAsOriginal();
return true;
}
private void saveInterpreterDefinitions(
final InterpreterDefinitionsContainer container) {
IRunnableWithProgress runnable = monitor -> {
try {
monitor.beginTask(InterpretersMessages.InterpretersUpdater_0,
100);
final String xml = container.getAsXML();
monitor.worked(40);
ScriptRuntime.getPreferences()
.put(ScriptRuntime.PREF_INTERPRETER_XML, xml);
monitor.worked(30);
ScriptRuntime.savePreferences();
monitor.worked(30);
} catch (IOException ioe) {
DLTKDebugUIPlugin.log(ioe);
} catch (ParserConfigurationException e1) {
DLTKDebugUIPlugin.log(e1);
} catch (TransformerException e2) {
DLTKDebugUIPlugin.log(e2);
} finally {
monitor.done();
}
};
try {
DLTKDebugUIPlugin.getDefault().getWorkbench().getProgressService()
.busyCursorWhile(runnable);
} catch (InvocationTargetException e) {
DLTKDebugUIPlugin.log(e);
} catch (InterruptedException e) {
DLTKDebugUIPlugin.log(e);
}
}
}