new version with WorkingCopy Management
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / builder / PHPBuilder.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/builder/PHPBuilder.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/builder/PHPBuilder.java
new file mode 100644 (file)
index 0000000..a4a7be9
--- /dev/null
@@ -0,0 +1,242 @@
+package net.sourceforge.phpeclipse.builder;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+import net.sourceforge.phpdt.core.IJavaModelMarker;
+import net.sourceforge.phpdt.internal.core.JavaProject;
+import net.sourceforge.phpdt.internal.core.util.SimpleLookupTable;
+import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import net.sourceforge.phpeclipse.phpeditor.PHPParserAction;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+
+/**
+ * Builder for .php files. 
+ * 
+ * 
+ * @see org.eclipse.core.resources.IncrementalProjectBuilder
+ * @see org.eclipse.core.resources.IResourceDelta
+ */
+public class PHPBuilder extends IncrementalProjectBuilder {
+  IProject currentProject;
+  JavaProject javaProject;
+  IWorkspaceRoot workspaceRoot;
+  //   NameEnvironment nameEnvironment;
+  SimpleLookupTable binaryLocationsPerProject;
+  // maps a project to its binary resources (output folders, class folders, zip/jar files)
+  State lastState;
+  
+//     BuildNotifier notifier;
+       
+  private final static int TOTAL_WORK = 100;
+
+  public static IMarker[] getProblemsFor(IResource resource) {
+    try {
+      if (resource != null && resource.exists())
+        return resource.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
+    } catch (CoreException e) {
+    } // assume there are no problems
+    return new IMarker[0];
+  }
+
+  public static IMarker[] getTasksFor(IResource resource) {
+    try {
+      if (resource != null && resource.exists())
+        return resource.findMarkers(IJavaModelMarker.TASK_MARKER, false, IResource.DEPTH_INFINITE);
+    } catch (CoreException e) {
+    } // assume there are no tasks
+    return new IMarker[0];
+  }
+
+  //           public static void finishedBuilding(IResourceChangeEvent event) {
+  //                   BuildNotifier.resetProblemCounters();
+  //           }
+
+  public static void removeProblemsFor(IResource resource) {
+    try {
+      if (resource != null && resource.exists())
+        resource.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
+    } catch (CoreException e) {
+    } // assume there were no problems
+  }
+
+  public static void removeTasksFor(IResource resource) {
+    try {
+      if (resource != null && resource.exists())
+        resource.deleteMarkers(IJavaModelMarker.TASK_MARKER, false, IResource.DEPTH_INFINITE);
+    } catch (CoreException e) {
+    } // assume there were no problems
+  }
+
+  public static void removeProblemsAndTasksFor(IResource resource) {
+    try {
+      if (resource != null && resource.exists()) {
+        resource.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
+        resource.deleteMarkers(IJavaModelMarker.TASK_MARKER, false, IResource.DEPTH_INFINITE);
+      }
+    } catch (CoreException e) {
+    } // assume there were no problems
+  }
+  public static State readState(IProject project, DataInputStream in) throws IOException {
+    return State.read(project, in);
+  }
+
+  public static void writeState(Object state, DataOutputStream out) throws IOException {
+    ((State) state).write(out);
+  }
+
+  /**
+   * Constructor
+   */
+  public PHPBuilder() {
+  }
+
+  /**
+   * 
+   */
+  protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+    monitor.beginTask("Parsing files", TOTAL_WORK);
+    this.currentProject = getProject();
+    if (currentProject == null || !currentProject.isAccessible())
+      return new IProject[0];
+
+    if (kind == IncrementalProjectBuilder.FULL_BUILD) {
+      IResourceDelta delta = getDelta(getProject());
+
+      processFull(getProject(), monitor);
+
+    } else { // INCREMENTAL_BUILD or AUTO_BUILD
+
+      IResourceDelta delta = getDelta(getProject());
+      if (delta != null) {
+        delta.accept(new ParserVisitor(getProject(), monitor));
+      }
+
+    }
+    monitor.done();
+    return null;
+  }
+
+  /**
+   * Performs a <code>FULL_BUILD</code> by visiting all nodes in the resource
+   * tree under the specified project.  
+   * 
+   * @param iProject
+   */
+  public void processFull(final IProject iProject, final IProgressMonitor monitor) {
+    final IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(iProject);
+    // Create resource visitor logic
+    IResourceVisitor myVisitor = new IResourceVisitor() {
+      public boolean visit(IResource resource) throws CoreException {
+        if (resource.getType() == IResource.FILE) {
+          if (monitor.isCanceled()) {
+            throw new OperationCanceledException();
+          }
+          if ((resource.getFileExtension() != null) && PHPFileUtil.isPHPFile((IFile) resource)) {
+            monitor.worked(1);
+            monitor.subTask("Parsing: " + resource.getFullPath());
+            // check for parsing errors
+            PHPParserAction.parseFile((IFile) resource);
+            // update indexfile for the project:
+            JavaProject nature = (JavaProject) iProject.getNature(PHPeclipsePlugin.PHP_NATURE_ID);
+            indexManager.addFile((IFile) resource);
+          }
+        }
+
+        return true;
+      }
+    };
+
+    // Process the project using the visitor just created
+    try {
+
+      //      if (iProject.hasNature(PHPeclipsePlugin.PHP_NATURE_ID)) {
+      //        thePHPProject = new PHPProject();
+      //        thePHPProject.setProject(iProject);
+      //      }
+      indexManager.initialize();
+      iProject.accept(myVisitor);
+      indexManager.writeFile();
+    } catch (CoreException e) {
+      e.printStackTrace();
+    }
+
+  }
+
+  /** 
+   * Sets initialization data for this builder.
+   * <p>
+   * This method is part of the <code>IExecutableExtension</code>
+   * interface.
+   * </p>
+   * <p>
+   * Subclasses are free to extend this method to pick up 
+   * initialization parameters from the plug-in plug-in manifest 
+   * (<code>plugin.xml</code>) file,
+   * but should be sure to invoke this method on their superclass.
+   * <p>
+   * For example, the following method looks for a boolean-valued 
+   * parameter named "trace":
+   * <pre>
+   *     public void setInitializationData(IConfigurationElement cfig, 
+   *             String propertyName, Object data) 
+   *                   throws CoreException {
+   *         super.setInitializationData(cfig, propertyName, data);
+   *         if (data instanceof Hashtable) { 
+   *             Hashtable args = (Hashtable) data; 
+   *             String traceValue = (String) args.get("trace"); 
+   *             TRACING = (traceValue!=null && traceValue.equals("true"));
+   *         }
+   *     }
+   * </pre>
+   * </p>
+   */
+  public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+    super.setInitializationData(config, propertyName, data);
+
+  }
+
+  /**
+   * Informs this builder that it is being started by the build management
+   * infrastructure.  By the time this method is run, the builder's project
+   * is available and <code>setInitializationData</code> has been called.
+   * The default implementation should be called by all overriding methods.
+   *
+   * @see #setInitializationData
+   */
+  protected void startupOnInitialize() {
+    //   traceMsg("Parse Builder Initialize - startupOnInitialize()");
+  }
+
+  /**
+  * Write trace statements.  
+  * System.out.println with prefix tagging used for simplicity.
+  */
+  //  private void traceMsg(String msg) {
+  //    if (PHPeclipsePlugin.DEBUG | traceEnabled)
+  //      System.out.println(
+  //        buildMode
+  //          + "<"
+  //          + getProject()
+  //          + "> "
+  //          + "\t\t\t"
+  //          + buildMark
+  //          + msg);
+  //  }
+
+}
\ No newline at end of file