diff -r a458e198e2b4 php.project/nbproject/project.xml --- a/php.project/nbproject/project.xml Fri Feb 12 09:11:20 2010 +0100 +++ b/php.project/nbproject/project.xml Mon Feb 21 09:47:41 2011 -0500 @@ -47,6 +47,15 @@ org.netbeans.modules.php.project + org.apache.tools.ant.module + + + + 3 + 3.39 + + + org.netbeans.api.java.classpath @@ -255,6 +264,14 @@ + org.openide.execution + + + + 1.17 + + + org.openide.explorer diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/PhpActionProvider.java --- a/php.project/src/org/netbeans/modules/php/project/PhpActionProvider.java Fri Feb 12 09:11:20 2010 +0100 +++ b/php.project/src/org/netbeans/modules/php/project/PhpActionProvider.java Mon Feb 21 09:47:41 2011 -0500 @@ -60,6 +60,8 @@ import org.netbeans.modules.php.project.ui.actions.RunTestCommand; import org.netbeans.modules.php.project.ui.actions.TestProjectCommand; import org.netbeans.modules.php.project.ui.actions.UploadCommand; +import org.netbeans.modules.php.project.ui.actions.BuildProjectCommand; +import org.netbeans.modules.php.project.ui.actions.RebuildProjectCommand; import org.netbeans.spi.project.ActionProvider; import org.netbeans.spi.project.ui.support.FileSensitiveActions; import org.netbeans.spi.project.ui.support.ProjectSensitiveActions; @@ -87,6 +89,8 @@ new CopyCommand(project), new MoveCommand(project), new RenameCommand(project), + new BuildProjectCommand(project), + new RebuildProjectCommand(project), // file sensitive actions new DownloadCommand(project), diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/ui/actions/Bundle.properties --- a/php.project/src/org/netbeans/modules/php/project/ui/actions/Bundle.properties Fri Feb 12 09:11:20 2010 +0100 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/Bundle.properties Mon Feb 21 09:47:41 2011 -0500 @@ -40,6 +40,8 @@ #DefaultAntProjectOperations: LBL_RunProject=Run LBL_DebugProject=Debug +LBL_BuildProject=Build +LBL_RebuildProject=Rebuild LBL_TestProject=Test LBL_TestFile=Test LBL_UploadCommand=Upload diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/ui/actions/support/ConfigAction.java --- a/php.project/src/org/netbeans/modules/php/project/ui/actions/support/ConfigAction.java Fri Feb 12 09:11:20 2010 +0100 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/support/ConfigAction.java Mon Feb 21 09:47:41 2011 -0500 @@ -39,20 +39,31 @@ package org.netbeans.modules.php.project.ui.actions.support; +import java.io.IOException; import java.util.logging.Logger; +import org.apache.tools.ant.module.api.AntProjectCookie; +import org.apache.tools.ant.module.api.AntTargetExecutor; +import org.apache.tools.ant.module.api.AntTargetExecutor.Env; import org.netbeans.modules.php.project.PhpProject; import org.netbeans.modules.php.project.ProjectPropertiesSupport; import org.netbeans.modules.php.project.ui.customizer.CompositePanelProviderImpl; import org.netbeans.modules.php.project.ui.customizer.CustomizerProviderImpl; import org.netbeans.modules.php.project.ui.customizer.PhpProjectProperties; +import org.netbeans.spi.project.ui.support.BuildExecutionSupport; +import org.openide.execution.ExecutorTask; import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; +import org.openide.loaders.DataObjectNotFoundException; +import org.openide.util.Exceptions; import org.openide.util.Lookup; +import org.openide.util.Task; +import org.openide.util.TaskListener; /** * Common action for all the possible Run Configurations of a PHP project. *

* Meant to be stateless, so thread safe. - * @author Tomas Mysik + * @author Tomas Mysik, Phil Lello */ public abstract class ConfigAction { public static enum Type { @@ -123,6 +134,49 @@ return XDebugStarterFactory.getInstance() != null; } + // TODO: Decide how much effort these should put into detecting targets. + // Testing for build.xml is cheap and easy, probing build.xml via XPath + // to detect targets would be better, but then opens up a can of worms over + // includes, etc. + // It would probably be good to support Maven too. + private DataObject getBuildXmlDataObject() { + FileObject buildXml = project.getHelper().getProjectDirectory().getFileObject("build.xml"); + DataObject buildXmlDO = null; + try { + if (buildXml != null) buildXmlDO = DataObject.find(buildXml); + } catch (DataObjectNotFoundException ex) { + } + return buildXmlDO; + } + + private boolean isBuildXmlPresent() { + return getBuildXmlDataObject() != null; + } + + public boolean isBuildProjectEnabled() { + return isBuildXmlPresent(); + } + + public boolean isRebuildProjectEnabled() { + return isBuildXmlPresent(); + } + + public void buildProject() { + try { + new AntBuildExecutionSupportItem(getBuildXmlDataObject(), new String[]{"build"}).startRunning(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + public void rebuildProject() { + try { + new AntBuildExecutionSupportItem(getBuildXmlDataObject(), new String[]{"rebuild"}).startRunning(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + public abstract boolean isValid(boolean indexFileNeeded); public abstract boolean isRunFileEnabled(Lookup context); @@ -146,4 +200,56 @@ } return true; } + + private class AntBuildExecutionSupportItem implements BuildExecutionSupport.Item, TaskListener { + private final AntTargetExecutor mTargetExecutor; + private final String[] mTargets; + private final AntProjectCookie mProjectCookie; + private ExecutorTask mExecutorTask; + + AntBuildExecutionSupportItem(DataObject buildFileObject, String[] targets) { + mProjectCookie = buildFileObject.getCookie(AntProjectCookie.class); + mTargets = targets; + mTargetExecutor = AntTargetExecutor.createTargetExecutor(new Env()); + } + + @Override + public String getDisplayName() { + return "Running Ant Build"; + } + + @Override + public void repeatExecution() { + stopRunning(); + try { + startRunning(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + @Override + public boolean isRunning() { + return (mExecutorTask == null)?false:true; + } + + @Override + public void stopRunning() { + if (mExecutorTask != null) mExecutorTask.stop(); + mExecutorTask.waitFinished(); + taskFinished(mExecutorTask); + } + + public void startRunning() throws IOException { + mExecutorTask = mTargetExecutor.execute(mProjectCookie, mTargets); + mExecutorTask.addTaskListener(this); + BuildExecutionSupport.registerRunningItem(this); + } + + @Override + public void taskFinished(Task task) { + mExecutorTask = null; + BuildExecutionSupport.registerFinishedItem(this); + } + } }