--- a/php.project/nbproject/project.xml Fri Feb 12 09:11:20 2010 +0100
+++ a/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
--- a/php.project/src/org/netbeans/modules/php/project/PhpActionProvider.java Fri Feb 12 09:11:20 2010 +0100
+++ a/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),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ a458e198e2b4 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;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ a458e198e2b4 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;
+ }
+}
--- a/php.project/src/org/netbeans/modules/php/project/ui/actions/Bundle.properties Fri Feb 12 09:11:20 2010 +0100
+++ a/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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ a458e198e2b4 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;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ a458e198e2b4 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;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ a458e198e2b4 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();
+ }
+ }
+}
--- a/php.project/src/org/netbeans/modules/php/project/ui/actions/support/ConfigAction.java Fri Feb 12 09:11:20 2010 +0100
+++ a/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;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ a458e198e2b4 Wed Feb 23 13:00:42 2011 -0500
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Generated content should be output into $${web.root}, which is ${web.root}
+
+
+
+
+
+
--- a/php.project/src/org/netbeans/modules/php/project/ui/logicalview/PhpLogicalViewProvider.java Fri Feb 12 09:11:20 2010 +0100
+++ a/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));