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 Wed Feb 23 13:00:42 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 Wed Feb 23 13:00:42 2011 -0500 @@ -37,6 +37,7 @@ * However, if you add GPL Version 2 code and therefore, elected the GPL * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. + * */ package org.netbeans.modules.php.project; @@ -60,6 +61,9 @@ 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.AddAntSupportCommand; +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 +91,9 @@ new CopyCommand(project), new MoveCommand(project), new RenameCommand(project), + new AddAntSupportCommand(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/AddAntSupportCommand.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/AddAntSupportCommand.java Wed Feb 23 13:00:42 2011 -0500 @@ -0,0 +1,49 @@ +package org.netbeans.modules.php.project.ui.actions; + +import org.netbeans.modules.php.project.ui.actions.support.Displayable; +import org.netbeans.modules.php.project.PhpProject; +import org.netbeans.modules.php.project.ui.ProjectNameProvider; +import org.netbeans.modules.php.project.ui.actions.support.AntBuildExecutionSupportItem; +import org.netbeans.modules.php.project.ui.actions.support.ConfigAction; +import org.netbeans.spi.project.ActionProvider; +import org.openide.nodes.Node; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; +import org.openide.windows.TopComponent; + +/** + * @author Phil Lello + */ +public class AddAntSupportCommand extends Command implements Displayable { + public static final String ID = "add_ant_support"; + public static final String DISPLAY_NAME = NbBundle.getMessage(AddAntSupportCommand.class, "LBL_AddAntSupportToProject"); + + /** + * @param project + */ + public AddAntSupportCommand(PhpProject project) { + super(project); + } + + @Override + public void invokeAction(Lookup context) { + AntBuildExecutionSupportItem.addToProject(getProject()); + } + + @Override + public boolean isActionEnabled(Lookup context) { + // As this action is only on the menu when ant support is missing, + // it is always enabled. + return true; + } + + @Override + public String getCommandId() { + return ID; + } + + @Override + public String getDisplayName() { + return DISPLAY_NAME; + } +} diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/ui/actions/BuildProjectCommand.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/BuildProjectCommand.java Wed Feb 23 13:00:42 2011 -0500 @@ -0,0 +1,49 @@ +package org.netbeans.modules.php.project.ui.actions; + +import org.netbeans.modules.php.project.ui.actions.support.Displayable; +import org.netbeans.modules.php.project.PhpProject; +import org.netbeans.modules.php.project.ui.actions.support.AntBuildExecutionSupportItem; +import org.netbeans.modules.php.project.ui.actions.support.ConfigAction; +import org.netbeans.spi.project.ActionProvider; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * @author Phil Lello + */ +public class BuildProjectCommand extends Command implements Displayable { + public static final String ID = ActionProvider.COMMAND_BUILD; + public static final String DISPLAY_NAME = NbBundle.getMessage(BuildProjectCommand.class, "LBL_BuildProject"); + + /** + * @param project + */ + public BuildProjectCommand(PhpProject project) { + super(project); + } + + @Override + public void invokeAction(Lookup context) { + try { + AntBuildExecutionSupportItem.invokeTarget(getProject(), "build"); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + } + + @Override + public boolean isActionEnabled(Lookup context) { + return AntBuildExecutionSupportItem.hasTarget(getProject(), "build"); + } + + @Override + public String getCommandId() { + return ID; + } + + @Override + public String getDisplayName() { + return DISPLAY_NAME; + } +} 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 Wed Feb 23 13:00:42 2011 -0500 @@ -38,8 +38,11 @@ # made subject to such option by the copyright holder. #DefaultAntProjectOperations: +LBL_AddAntSupportToProject=Add Ant Support 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/RebuildProjectCommand.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/RebuildProjectCommand.java Wed Feb 23 13:00:42 2011 -0500 @@ -0,0 +1,49 @@ +package org.netbeans.modules.php.project.ui.actions; + +import org.netbeans.modules.php.project.ui.actions.support.Displayable; +import org.netbeans.modules.php.project.PhpProject; +import org.netbeans.modules.php.project.ui.actions.support.AntBuildExecutionSupportItem; +import org.netbeans.modules.php.project.ui.actions.support.ConfigAction; +import org.netbeans.spi.project.ActionProvider; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; + +/** + * @author Phil Lello + */ +public class RebuildProjectCommand extends Command implements Displayable { + public static final String ID = ActionProvider.COMMAND_REBUILD; + public static final String DISPLAY_NAME = NbBundle.getMessage(RebuildProjectCommand.class, "LBL_RebuildProject"); + + /** + * @param project + */ + public RebuildProjectCommand(PhpProject project) { + super(project); + } + + @Override + public void invokeAction(Lookup context) { + try { + AntBuildExecutionSupportItem.invokeTarget(getProject(), "rebuild"); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + } + + @Override + public boolean isActionEnabled(Lookup context) { + return AntBuildExecutionSupportItem.hasTarget(getProject(), "rebuild"); + } + + @Override + public String getCommandId() { + return ID; + } + + @Override + public String getDisplayName() { + return DISPLAY_NAME; + } +} diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/ui/actions/support/AntBuildExecutionSupportItem.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/support/AntBuildExecutionSupportItem.java Wed Feb 23 13:00:42 2011 -0500 @@ -0,0 +1,136 @@ +package org.netbeans.modules.php.project.ui.actions.support; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; +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.apache.tools.ant.module.api.support.AntScriptUtils; +import org.netbeans.modules.php.project.PhpProject; +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.Task; +import org.openide.util.TaskListener; + +/** + * + * @author Phil Lello + */ + +public class AntBuildExecutionSupportItem implements BuildExecutionSupport.Item, TaskListener { + private final AntTargetExecutor mTargetExecutor; + private final String[] mTargets; + private final AntProjectCookie mProjectCookie; + private ExecutorTask mExecutorTask; + private final DataObject mBuildDataObject; + private final FileObject mBuildFileObject; + + AntBuildExecutionSupportItem(FileObject buildFileObject, String[] targets) throws DataObjectNotFoundException { + mBuildFileObject = buildFileObject; + mBuildDataObject = DataObject.find(mBuildFileObject); + mProjectCookie = mBuildDataObject.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); + } + + public static AntBuildExecutionSupportItem invokeTarget(PhpProject project, String target) + throws Exception { + return invokeTarget(getBuildFileObject(project), target); + } + + public static AntBuildExecutionSupportItem invokeTarget(FileObject antFile, String target) + throws Exception { + AntBuildExecutionSupportItem item; + item = new AntBuildExecutionSupportItem(antFile, new String[]{target}); + item.startRunning(); + return item; + } + + public static boolean hasTarget(PhpProject project, String target) { + return hasTarget(getBuildFileObject(project), target); + } + + public static boolean hasTarget(FileObject antFile, String target) { + boolean present = false; + List targets; + try { + targets = AntScriptUtils.getCallableTargetNames(antFile); + present = targets.contains(target); + } catch (Exception e) { + // Any error means we can't run target, so we don't care what it is. + } + return present; + } + + public static FileObject getBuildFileObject(PhpProject project) { + FileObject buildXml = project.getProjectDirectory().getFileObject("build.xml"); + return buildXml; + } + + public static void addToProject(PhpProject project) { + try { + FileObject buildFile = project.getProjectDirectory().createData("build.xml"); + InputStream is = AntBuildExecutionSupportItem.class.getResourceAsStream("build.template.xml"); + OutputStream os = buildFile.getOutputStream(); + while (is.available() != 0) { + os.write(is.read()); + } + os.close(); + is.close(); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + /** + * @return the mTargetExecutor + */ + public ExecutorTask getExecutorTask() { + return mExecutorTask; + } +} diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/ui/actions/support/AntConfigAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/support/AntConfigAction.java Wed Feb 23 13:00:42 2011 -0500 @@ -0,0 +1,95 @@ +package org.netbeans.modules.php.project.ui.actions.support; + +import org.netbeans.modules.php.project.PhpProject; +import org.openide.execution.ExecutorTask; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.Task; +import org.openide.util.TaskListener; + +/** + * + * @author Phil Lello + */ +public class AntConfigAction extends ConfigAction { + ConfigAction mDelegate; + + protected AntConfigAction(PhpProject project, ConfigAction delegate) { + super(project); + mDelegate = delegate; + } + + @Override + public boolean isValid(boolean indexFileNeeded) { + return mDelegate.isValid(indexFileNeeded); + } + + @Override + public boolean isRunFileEnabled(Lookup context) { + return mDelegate.isRunFileEnabled(context); + } + + @Override + public boolean isDebugFileEnabled(Lookup context) { + return mDelegate.isDebugFileEnabled(context); + } + + @Override + public void runProject() { + build(new Runnable() { + @Override + public void run() { + mDelegate.runProject(); + } + }); + } + + @Override + public void debugProject() { + build(new Runnable() { + @Override + public void run() { + mDelegate.debugProject(); + } + }); + } + + @Override + public void runFile(final Lookup context) { + build(new Runnable() { + @Override + public void run() { + mDelegate.runFile(context); + } + }); + } + + @Override + public void debugFile(final Lookup context) { + build(new Runnable() { + @Override + public void run() { + mDelegate.debugFile(context); + } + }); + } + + public void build(final Runnable runOnSuccess) { + if (AntBuildExecutionSupportItem.hasTarget(project, "build")) { + try { + AntBuildExecutionSupportItem invokeTarget = AntBuildExecutionSupportItem.invokeTarget(project, "build"); + invokeTarget.getExecutorTask().addTaskListener(new TaskListener() { + @Override + public void taskFinished(Task task) { + if (((ExecutorTask)task).result() == 0) + runOnSuccess.run(); + } + }); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + } else { + runOnSuccess.run(); + } + } +} 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 Wed Feb 23 13:00:42 2011 -0500 @@ -111,6 +111,7 @@ default: throw new IllegalArgumentException("Unknown type: " + type); } + action = new AntConfigAction(project, action); assert action != null; return action; } diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/ui/actions/support/build.template.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/php.project/src/org/netbeans/modules/php/project/ui/actions/support/build.template.xml Wed Feb 23 13:00:42 2011 -0500 @@ -0,0 +1,13 @@ + + + + + + + Generated content should be output into $${web.root}, which is ${web.root} + + + + + + \ No newline at end of file diff -r a458e198e2b4 php.project/src/org/netbeans/modules/php/project/ui/logicalview/PhpLogicalViewProvider.java --- a/php.project/src/org/netbeans/modules/php/project/ui/logicalview/PhpLogicalViewProvider.java Fri Feb 12 09:11:20 2010 +0100 +++ b/php.project/src/org/netbeans/modules/php/project/ui/logicalview/PhpLogicalViewProvider.java Wed Feb 23 13:00:42 2011 -0500 @@ -54,8 +54,10 @@ import org.netbeans.modules.php.project.PhpActionProvider; import org.netbeans.modules.php.project.PhpProject; import org.netbeans.modules.php.project.ui.actions.support.CommandUtils; +import org.netbeans.modules.php.project.ui.actions.support.AntBuildExecutionSupportItem; import org.netbeans.modules.php.project.ui.customizer.CustomizerProviderImpl; import org.netbeans.modules.php.project.phpunit.PhpUnit; +import org.netbeans.modules.php.project.ui.actions.AddAntSupportCommand; import org.netbeans.modules.php.spi.phpmodule.PhpFrameworkProvider; import org.netbeans.modules.php.spi.phpmodule.PhpModuleActionsExtender; import org.netbeans.spi.project.ActionProvider; @@ -206,6 +208,10 @@ List actions = new ArrayList(); actions.add(CommonProjectActions.newFileAction()); actions.add(null); + if (AntBuildExecutionSupportItem.getBuildFileObject(project) == null) + actions.add(provider.getAction(AddAntSupportCommand.ID)); + actions.add(provider.getAction(ActionProvider.COMMAND_BUILD)); + actions.add(provider.getAction(ActionProvider.COMMAND_REBUILD)); actions.add(provider.getAction(ActionProvider.COMMAND_RUN)); actions.add(provider.getAction(ActionProvider.COMMAND_DEBUG)); actions.add(provider.getAction(ActionProvider.COMMAND_TEST));