package runjettyrun.launchshortcut;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.ILaunchShortcut2;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import runjettyrun.Plugin;
import runjettyrun.tabs.RunJettyRunTab;
import runjettyrun.utils.ProjectUtil;
public class RunJettyRunLaunchShortcut implements ILaunchShortcut2 {
private final static String ConfigurationType = "RunJettyRunWebApp";
public void launch(ISelection selection, String mode) {
IResource ir = getLaunchableResource(selection);
launch(ir,mode);
}
public void launch(IEditorPart editor, String mode) {
launch(getLaunchableResource(editor),mode);
}
protected ILaunchConfiguration findLaunchConfiguration(IResource type) {
if(type == null ) return null;
IProject proj = type.getProject();
if(proj == null) return null;
try {
ILaunchConfiguration[] configs = DebugPlugin.getDefault().
getLaunchManager().getLaunchConfigurations();
String typeProjectName = proj.getName();
for (int i = 0; i < configs.length; i++) {
ILaunchConfiguration config = configs[i];
if(isJettyRunConfiguration(config)){
String currentProejctName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
if(currentProejctName.equals(typeProjectName) ){
return config;
}
}
}
} catch (CoreException e) {
}
return null;
}
private boolean isJettyRunConfiguration(ILaunchConfiguration config) throws CoreException{
String mainType = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME,"");
return Plugin.BOOTSTRAP_CLASS_NAME.equals(mainType);
}
private ILaunchManager getLaunchManager() {
return DebugPlugin.getDefault().getLaunchManager();
}
public ILaunchConfigurationType getConfigurationType(){
return getLaunchManager().getLaunchConfigurationType(ConfigurationType);
}
public ILaunchConfiguration createConfiguration(IResource type){
if( type == null ) return null;
ILaunchConfiguration config = null;
ILaunchConfigurationWorkingCopy wc = null;
try {
ILaunchConfigurationType configType = getConfigurationType();
if(RunJettyRunTab.isWebappProject(type.getProject())){
String launchConfigName = getLaunchManager().
generateLaunchConfigurationName(type.getProject().getName());
wc = configType.newInstance(null, launchConfigName);
IProject proj = type.getProject();
RunJettyRunTab.initDefaultConfiguration(wc,
proj == null ? null : proj.getName(), launchConfigName);
//set mapped resource , let next time we could execute this directly from menuitem.
wc.setMappedResources(new IResource[] {type});
config = wc.doSave();
}else{
showError("Project is not a regular webapp project (missing WEB-INF)");
}
} catch (CoreException exception) {
showError( exception.getStatus().getMessage());
}
return config;
}
private void showError(String message){
MessageDialog.openError(getActiveShell(),"Error when startup Jetty Applciation",
message);
}
private Shell getActiveShell(){
IWorkbenchWindow win = Plugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
if(win ==null) return null;
return win.getShell();
}
public void launch(IResource ir,String mode){
ILaunchConfiguration config = findLaunchConfiguration(ir);
if (config == null) {
config = createConfiguration(ir);
}
if (config != null) {
DebugUITools.launch(config,mode);
}
}
public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) {
ILaunchConfiguration launchconf = findLaunchConfiguration(getLaunchableResource(selection));
if(launchconf == null) return null;
return new ILaunchConfiguration[]{launchconf};
}
public ILaunchConfiguration[] getLaunchConfigurations(IEditorPart editorpart) {
ILaunchConfiguration launchconf = findLaunchConfiguration(getLaunchableResource(editorpart));
if(launchconf == null) return null;
return new ILaunchConfiguration[]{launchconf};
}
public IResource getLaunchableResource(ISelection selection) {
return getLaunchableResource(ProjectUtil.getSelectedResource(selection));
}
public IResource getLaunchableResource(IEditorPart editorpart) {
return getLaunchableResource(ProjectUtil.getFile(editorpart
.getEditorInput()));
}
private IResource getLaunchableResource(IResource ir) {
if (ir == null )
return null;
return ir;
}
}