/*************************************************************************************
* Copyright (c) 2008-2011 Red Hat, Inc. 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:
* JBoss by Red Hat - Initial implementation.
************************************************************************************/
package org.jboss.tools.common.jdt.debug.ui.launching;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.ui.ILaunchShortcut2;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ITypeRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.jboss.tools.common.jdt.debug.VmModel;
import org.jboss.tools.common.jdt.debug.ui.RemoteDebugUIActivator;
import org.jboss.tools.common.jdt.debug.ui.actions.RemoteLaunchAction;
/**
*
* @author snjeza
*
*/
public class RemoteJavaApplicationLaunchShortcut implements ILaunchShortcut2 {
private int retValue;
private boolean restarted;
/* (non-Javadoc)
* @see ILaunchShortcut#launch(ISelection, String)
*/
public void launch(ISelection selection, final String mode) {
executeAction(getLaunchableResource(selection));
}
private void executeAction(final IResource resource) {
final boolean oldDiscover = RemoteDebugUIActivator.getDefault().isDiscoverRemoteApplication();
final IEclipsePreferences preferences = RemoteDebugUIActivator.getDefault().getPreferences();
preferences.putBoolean(RemoteDebugUIActivator.DISCOVER_REMOTE_APPLICATION, true);
final Job job = RemoteDebugUIActivator.getDefault().getRemoteApplicationJob();
while (job.getState() != Job.NONE) {
restarted = true;
MessageDialog dialog = new MessageDialog(getShell(),
"Remote Java Application scan already in progress",
null,
"Remote Java Application scan already in progress.\nPlease wait for it to be complete.",
MessageDialog.QUESTION, new String[] {"OK", "Try again"}, 0);
retValue = dialog.open();
if (retValue == 0) {
restarted = false;
return;
}
}
restarted = false;
job.addJobChangeListener(new IJobChangeListener() {
@Override
public void sleeping(IJobChangeEvent event) {
}
@Override
public void scheduled(IJobChangeEvent event) {
}
@Override
public void running(IJobChangeEvent event) {
}
@Override
public void done(IJobChangeEvent event) {
preferences.putBoolean(RemoteDebugUIActivator.DISCOVER_REMOTE_APPLICATION, oldDiscover);
job.removeJobChangeListener(this);
if (restarted) {
final Display display = Display.getDefault();
while (restarted) {
display.syncExec(new Runnable() {
@Override
public void run() {
if (!display.readAndDispatch()) {
display.sleep();
}
}
});
}
if (retValue != 0) {
return;
}
}
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
showDialog(resource);
}
});
}
@Override
public void awake(IJobChangeEvent event) {
}
@Override
public void aboutToRun(IJobChangeEvent event) {
}
});
job.schedule();
}
/* (non-Javadoc)
* @see ILaunchShortcut#launch(IEditorPart, String)
*/
public void launch(IEditorPart editor, String mode) {
executeAction(getLaunchableResource(editor));
}
public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) {
return new ILaunchConfiguration[0];
}
/* (non-Javadoc)
* @see ILaunchShortcut2#getLaunchConfigurations(IEditorPart)
*/
public ILaunchConfiguration[] getLaunchConfigurations(IEditorPart editor) {
return new ILaunchConfiguration[0];
}
public IResource getLaunchableResource(ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
if (ss.size() == 1) {
Object selected = ss.getFirstElement();
if (!(selected instanceof IJavaElement)
&& selected instanceof IAdaptable) {
selected = ((IAdaptable) selected)
.getAdapter(IJavaElement.class);
}
if (selected instanceof IJavaElement) {
return ((IJavaElement) selected).getResource();
}
}
}
return null;
}
public IResource getLaunchableResource(IEditorPart editor) {
ITypeRoot element = JavaUI.getEditorInputTypeRoot(editor
.getEditorInput());
if (element != null) {
try {
return element.getCorrespondingResource();
} catch (JavaModelException e) {
}
}
return null;
}
private void showDialog(IResource resource) {
VmModel[] vmModels = RemoteDebugUIActivator.getDefault().getCurrentDebugModels();
if (vmModels == null || vmModels.length == 0) {
boolean question = MessageDialog.openQuestion(getShell(),
"No remote Java Application Found",
"Sorry, could not detect any running remote java applications.\nTry search again?");
if (question) {
executeAction(resource);
}
} else {
boolean autoConnect = RemoteDebugUIActivator.getDefault().isAutoConnect();
if (autoConnect && vmModels.length == 1) {
new RemoteLaunchAction(vmModels[0].getPort()).run();
} else {
Dialog dialog = new LaunchRemoteApplicationDialog(getShell());
dialog.open();
}
}
}
private static Shell getShell() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window == null) {
IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
if (windows.length > 0) {
return windows[0].getShell();
}
}
else {
return window.getShell();
}
return null;
}
}