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 FULL_BUILD 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. *

* This method is part of the IExecutableExtension * interface. *

*

* Subclasses are free to extend this method to pick up * initialization parameters from the plug-in plug-in manifest * (plugin.xml) file, * but should be sure to invoke this method on their superclass. *

* For example, the following method looks for a boolean-valued * parameter named "trace": *

   *     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"));
   *         }
   *     }
   * 
*

*/ 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 setInitializationData 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); // } }