blob: 078447d4c0de47a346c445b0424dc4f86d60f933 [file] [log] [blame]
package org.eclipse.dltk.internal.ui.rse;
import java.net.URI;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.internal.rse.RSEEnvironmentProvider;
import org.eclipse.rse.ui.RSEUIPlugin;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchListener;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
/**
* The activator class controls the plug-in life cycle
* @since 2.0
*/
public class DLTKRSEUI extends AbstractUIPlugin {
// The plug-in ID
public static final String PLUGIN_ID = "org.eclipse.dltk.rse.ui"; //$NON-NLS-1$
// The shared instance
private static DLTKRSEUI plugin;
/**
* The constructor
*/
public DLTKRSEUI() {
}
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
RSEUIPlugin.getDefault();
RSEConnectionMonitor.start();
// try {
// PlatformUI.getWorkbench().addWorkbenchListener(
// new ShutdownCloseProjectsWithLinkedFiles());
// } catch (IllegalStateException e) {
// // IGNORE: workbench has not been created yet.
// }
}
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
RSEConnector.stop();
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static DLTKRSEUI getDefault() {
return plugin;
}
private static class ShutdownCloseProjectsWithLinkedFiles implements
IWorkbenchListener {
public void postShutdown(IWorkbench workbench) {
// empty
}
public boolean preShutdown(IWorkbench workbench, boolean forced) {
closeProjectsWithLinkedFiles();
return true;
}
/**
* At the moment RSE calls Display.syncExec() to ask password and if
* it's called from RefreshJob when workspace is locked and at the same
* time UI thread wants to perform a workspace operation - deadlock
* occurs.
*
* @throws ModelException
* @throws CoreException
*/
private void closeProjectsWithLinkedFiles() {
final IProject[] projects = ResourcesPlugin.getWorkspace()
.getRoot().getProjects();
for (IProject project : projects) {
if (project.isAccessible()
&& DLTKLanguageManager.hasScriptNature(project)) {
try {
if (shouldBeClosed(project)) {
project.close(null);
}
} catch (CoreException e) {
if (DLTKCore.DEBUG)
e.printStackTrace();
}
}
}
}
private boolean shouldBeClosed(IProject project) throws CoreException {
for (final IResource child : project.members()) {
if (child.isLinked()) {
final URI location = child.getLocationURI();
if (location != null
&& RSEEnvironmentProvider.RSE_SCHEME
.equalsIgnoreCase(location.getScheme())) {
return true;
}
}
}
return false;
}
}
}