/*******************************************************************************
* Copyright (c) 2012 Sierra Wireless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.koneki.ldt.debug.ui.internal.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.core.runtime.IProgressMonitor;
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.debug.ui.interpreters.InterpretersUpdater;
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;
/////////////////////////////////////////////////////////////////////////////////////
// This is a COPY of org.eclipse.dltk.debug.ui.interpreters.InterpretersUpdater
// to workaround DLTK BUG 390358
// ///////////////////////////////////////////////////////////////////////////////////
/**
* Processes add/removed/changed Interpreters.
*/
public class LuaInterpretersUpdater extends InterpretersUpdater {
// The interpreters defined when this updated is instantiated
private InterpreterDefinitionsContainer fOriginalInterpreters;
/**
* Constructs a new Interpreter updater to update Interpreter install settings.
*/
public LuaInterpretersUpdater() {
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
// ///////////////////////////////////////////////////////////////////////////////////
// START HACK CUSTOM CODE
// ///////////////////////////////////////////////////////////////////////////////////
// TODO BUG_ECLIPSE 390358
InterpreterDefinitionsContainer container = new LuaInterpreterDefinitionsContainer();
// ///////////////////////////////////////////////////////////////////////////////////
// END HACK CUSTOM CODE
// ///////////////////////////////////////////////////////////////////////////////////
// Default interpreter id for natureId
final Set<String> envIds = new HashSet<String>();
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 = new IRunnableWithProgress() {
@SuppressWarnings("deprecation")
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
monitor.beginTask(InterpretersMessages.InterpretersUpdater_0, 100);
final String xml = container.getAsXML();
monitor.worked(40);
ScriptRuntime.getPreferences().setValue(ScriptRuntime.PREF_INTERPRETER_XML, xml);
monitor.worked(30);
ScriptRuntime.savePreferences();
monitor.worked(30);
} catch (IOException ioe) {
DLTKDebugUIPlugin.log(ioe);
} catch (ParserConfigurationException e) {
DLTKDebugUIPlugin.log(e);
} catch (TransformerException e) {
DLTKDebugUIPlugin.log(e);
} finally {
monitor.done();
}
}
};
try {
DLTKDebugUIPlugin.getDefault().getWorkbench().getProgressService().busyCursorWhile(runnable);
} catch (InvocationTargetException e) {
DLTKDebugUIPlugin.log(e);
} catch (InterruptedException e) {
DLTKDebugUIPlugin.log(e);
}
}
}