/*******************************************************************************
* Copyright (c) 2012, 2014 VMWare, 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:
* VMWare, Inc. - initial API and implementation
* Pivotal Software Inc.
*******************************************************************************/
package org.grails.ide.eclipse.ui.internal.inplace;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.ui.progress.UIJob;
import org.grails.ide.eclipse.commands.GrailsCommand;
import org.grails.ide.eclipse.commands.GrailsCommandFactory;
import org.grails.ide.eclipse.core.GrailsCoreActivator;
import org.grails.ide.eclipse.core.launch.GrailsLaunchConfigurationDelegate;
import org.grails.ide.eclipse.ui.internal.utils.OpenNewResourcesCommandListener;
import org.grails.ide.eclipse.ui.internal.utils.RefreshDependenciesCommandListener;
/**
* @author Christian Dupuis
* @author Andrew Eisenberg
* @author Kris De Volder
* @since 2.2.1
*/
public abstract class GrailsLaunchUtils {
/**
* Launch a grails command. The launch configuration created for the launch is not persisted.
*
* @param javaProject Context for launching
* @param script Text of grails command to launch
* @throws CoreException
*/
public static void launch(IJavaProject javaProject, final String script) {
if (script!=null && (script.contains("run-app") || script.contains("test-app") || script.contains("run-war") || script.contains("console"))) {
launchNoTimeout(javaProject, script);
return;
}
//launch(javaProject, script, false);
final IProject project = javaProject.getProject();
final GrailsCommand cmd = GrailsCommandFactory.fromString(project, script);
final String title = "grails "+script;
// Register the command listeners
final GrailsCoreActivator grailsCore = GrailsCoreActivator.getDefault();
grailsCore.addGrailsCommandResourceListener(
new OpenNewResourcesCommandListener(javaProject.getProject()));
if (script != null && script.contains("install-plugin") || script.contains("s2-create-acl-domains")) {
grailsCore.addGrailsCommandResourceListener(
new RefreshDependenciesCommandListener(javaProject.getProject()));
}
new Job(title) {
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask(title, 3);
try {
try {
monitor.worked(1);
grailsCore.notifyCommandStart(project);
try {
cmd.synchExec();
monitor.worked(1);
} finally {
project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 1));
grailsCore.notifyCommandFinish(project);
}
} catch (CoreException e) {
return new Status(IStatus.ERROR, GrailsCoreActivator.PLUGIN_ID, "Problem executing: "+script, e);
}
return Status.OK_STATUS;
} finally {
monitor.done();
}
}
}.schedule();
}
/**
* Special handling for run-app and run-war, see https://issuetracker.springsource.com/browse/STS-3155
* https://issuetracker.springsource.com/browse/STS-3299
*
* @throws CoreException
*/
private static void launchNoTimeout(final IJavaProject javaProject, final String script) {
final String title = "Launching "+javaProject.getElementName() + ": " + script;
new UIJob(title) {
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
monitor.beginTask(title, 3);
try {
try {
ILaunchConfiguration launchConf = GrailsLaunchConfigurationDelegate.getLaunchConfiguration(javaProject.getProject(), script, false);
monitor.worked(1);
DebugUITools.launch(launchConf, ILaunchManager.RUN_MODE);
} catch (CoreException e) {
return new Status(IStatus.ERROR, GrailsCoreActivator.PLUGIN_ID, "Problem executing: "+script, e);
}
return Status.OK_STATUS;
} finally {
monitor.done();
}
}
}.schedule();
}
}