/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.internal.core.builder; import java.util.ArrayList; import net.sourceforge.phpdt.core.JavaCore; import net.sourceforge.phpdt.internal.core.util.Util; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceProxy; import org.eclipse.core.resources.IResourceProxyVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; public class BatchImageBuilder extends AbstractImageBuilder { protected BatchImageBuilder(PHPBuilder javaBuilder) { super(javaBuilder); this.nameEnvironment.isIncrementalBuild = false; } public void build() { if (PHPBuilder.DEBUG) System.out.println("FULL build"); //$NON-NLS-1$ try { notifier.subTask(Util.bind("build.cleaningOutput")); //$NON-NLS-1$ PHPBuilder.removeProblemsAndTasksFor(javaBuilder.currentProject); // cleanOutputFolders(true); notifier.updateProgressDelta(0.1f); notifier.subTask(Util.bind("build.analyzingSources")); //$NON-NLS-1$ ArrayList sourceFiles = new ArrayList(33); addAllSourceFiles(sourceFiles); notifier.updateProgressDelta(0.15f); if (sourceFiles.size() > 0) { SourceFile[] allSourceFiles = new SourceFile[sourceFiles.size()]; sourceFiles.toArray(allSourceFiles); notifier .setProgressPerCompilationUnit(0.75f / allSourceFiles.length); workQueue.addAll(allSourceFiles); compile(allSourceFiles); } if (javaBuilder.javaProject.hasCycleMarker()) javaBuilder.mustPropagateStructuralChanges(); } catch (CoreException e) { throw internalException(e); } finally { cleanUp(); } } protected void addAllSourceFiles(final ArrayList sourceFiles) throws CoreException { for (int i = 0, l = sourceLocations.length; i < l; i++) { final ClasspathMultiDirectory sourceLocation = sourceLocations[i]; final char[][] exclusionPatterns = sourceLocation.exclusionPatterns; final boolean isAlsoProject = sourceLocation.sourceFolder .equals(javaBuilder.currentProject); sourceLocation.sourceFolder.accept(new IResourceProxyVisitor() { public boolean visit(IResourceProxy proxy) throws CoreException { IResource resource = null; if (exclusionPatterns != null) { resource = proxy.requestResource(); if (Util.isExcluded(resource, exclusionPatterns)) return false; } switch (proxy.getType()) { case IResource.FILE: if (net.sourceforge.phpdt.internal.compiler.util.Util .isJavaFileName(proxy.getName())) { if (resource == null) resource = proxy.requestResource(); sourceFiles.add(new SourceFile((IFile) resource, sourceLocation, ((IFile) resource).getCharset())); } return false; case IResource.FOLDER: if (isAlsoProject && isExcludedFromProject(proxy .requestFullPath())) return false; } return true; } }, IResource.NONE); notifier.checkCancel(); } } protected void cleanOutputFolders() throws CoreException { boolean deleteAll = JavaCore.CLEAN.equals(javaBuilder.javaProject .getOption(JavaCore.CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER, true)); if (deleteAll) { ArrayList visited = new ArrayList(sourceLocations.length); for (int i = 0, l = sourceLocations.length; i < l; i++) { notifier.subTask(Util.bind("build.cleaningOutput")); //$NON-NLS-1$ ClasspathMultiDirectory sourceLocation = sourceLocations[i]; if (sourceLocation.hasIndependentOutputFolder) { IContainer outputFolder = sourceLocation.binaryFolder; if (!visited.contains(outputFolder)) { visited.add(outputFolder); IResource[] members = outputFolder.members(); for (int j = 0, m = members.length; j < m; j++) members[j].delete(IResource.FORCE, null); } notifier.checkCancel(); copyExtraResourcesBack(sourceLocation, deleteAll); } else { boolean isOutputFolder = sourceLocation.sourceFolder .equals(sourceLocation.binaryFolder); final char[][] exclusionPatterns = isOutputFolder ? sourceLocation.exclusionPatterns : null; // ignore exclusionPatterns if output folder // == another source folder... not this one sourceLocation.binaryFolder.accept( new IResourceProxyVisitor() { public boolean visit(IResourceProxy proxy) throws CoreException { IResource resource = null; if (exclusionPatterns != null) { resource = proxy.requestResource(); if (Util.isExcluded(resource, exclusionPatterns)) return false; } if (proxy.getType() == IResource.FILE) { // if // (ProjectPrefUtil.isClassFileName(proxy.getName())) // { // if (resource == null) // resource = proxy.requestResource(); // resource.delete(IResource.FORCE, // null); // } return false; } notifier.checkCancel(); return true; } }, IResource.NONE); if (!isOutputFolder) { notifier.checkCancel(); copyPackages(sourceLocation); } } notifier.checkCancel(); } } else { for (int i = 0, l = sourceLocations.length; i < l; i++) { ClasspathMultiDirectory sourceLocation = sourceLocations[i]; if (sourceLocation.hasIndependentOutputFolder) copyExtraResourcesBack(sourceLocation, deleteAll); else if (!sourceLocation.sourceFolder .equals(sourceLocation.binaryFolder)) copyPackages(sourceLocation); // output folder is // different from source // folder notifier.checkCancel(); } } } protected void copyExtraResourcesBack( ClasspathMultiDirectory sourceLocation, final boolean deletedAll) throws CoreException { // When, if ever, does a builder need to copy resources files (not .java // or .class) into the output folder? // If we wipe the output folder at the beginning of the build then all // 'extra' resources must be copied to the output folder. notifier.subTask(Util.bind("build.copyingResources")); //$NON-NLS-1$ final int segmentCount = sourceLocation.sourceFolder.getFullPath() .segmentCount(); final char[][] exclusionPatterns = sourceLocation.exclusionPatterns; final IContainer outputFolder = sourceLocation.binaryFolder; final boolean isAlsoProject = sourceLocation.sourceFolder .equals(javaBuilder.currentProject); sourceLocation.sourceFolder.accept(new IResourceProxyVisitor() { public boolean visit(IResourceProxy proxy) throws CoreException { IResource resource = null; switch (proxy.getType()) { case IResource.FILE: if (net.sourceforge.phpdt.internal.compiler.util.Util .isJavaFileName(proxy.getName())) return false;// || // ProjectPrefUtil.isClassFileName(proxy.getName())) // return false; resource = proxy.requestResource(); if (javaBuilder.filterExtraResource(resource)) return false; if (exclusionPatterns != null && Util.isExcluded(resource, exclusionPatterns)) return false; IPath partialPath = resource.getFullPath() .removeFirstSegments(segmentCount); IResource copiedResource = outputFolder .getFile(partialPath); if (copiedResource.exists()) { if (deletedAll) { createErrorFor(resource, Util .bind("build.duplicateResource")); //$NON-NLS-1$ return false; } copiedResource.delete(IResource.FORCE, null); // last // one // wins } resource.copy(copiedResource.getFullPath(), IResource.FORCE, null); copiedResource.setDerived(true); return false; case IResource.FOLDER: resource = proxy.requestResource(); if (javaBuilder.filterExtraResource(resource)) return false; if (exclusionPatterns != null && Util.isExcluded(resource, exclusionPatterns)) return false; IPath folderPath = resource.getFullPath(); if (isAlsoProject && isExcludedFromProject(folderPath)) return false; // the sourceFolder == project // createFolder(folderPath.removeFirstSegments(segmentCount), // outputFolder); } return true; } }, IResource.NONE); } protected void copyPackages(ClasspathMultiDirectory sourceLocation) throws CoreException { // final int segmentCount = sourceLocation.sourceFolder.getFullPath() // .segmentCount(); final char[][] exclusionPatterns = sourceLocation.exclusionPatterns; //final IContainer outputFolder = sourceLocation.binaryFolder; final boolean isAlsoProject = sourceLocation.sourceFolder .equals(javaBuilder.currentProject); sourceLocation.sourceFolder.accept(new IResourceProxyVisitor() { public boolean visit(IResourceProxy proxy) throws CoreException { switch (proxy.getType()) { case IResource.FILE: return false; case IResource.FOLDER: IResource resource = proxy.requestResource(); if (javaBuilder.filterExtraResource(resource)) return false; if (exclusionPatterns != null && Util.isExcluded(resource, exclusionPatterns)) return false; IPath folderPath = resource.getFullPath(); if (isAlsoProject && isExcludedFromProject(folderPath)) return false; // the sourceFolder == project // createFolder(folderPath.removeFirstSegments(segmentCount), // outputFolder); } return true; } }, IResource.NONE); } public String toString() { return "batch image builder for:\n\tnew state: " + newState; //$NON-NLS-1$ } }