| /******************************************************************************* |
| * Copyright (c) 2006 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Matt Chapman - initial version |
| *******************************************************************************/ |
| package org.eclipse.ajdt.core; |
| |
| import java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.WeakHashMap; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceVisitor; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.internal.core.ClasspathEntry; |
| import org.eclipse.jdt.internal.core.util.Util; |
| |
| public class BuildConfig { |
| |
| private static Map<IProject, Set<IFile>> projectsToIncludedSourceFiles = new WeakHashMap<IProject, Set<IFile>>(); |
| |
| /** |
| * Returns all of the currently included source files in a project |
| * This list is cached and reset every build (or on request by calling flushIncludedSourceFileCache) |
| * @param project |
| * @return a list of IFiles |
| */ |
| public static Set<IFile> getIncludedSourceFiles(IProject project) { |
| if(projectsToIncludedSourceFiles.get(project) instanceof List) { |
| return projectsToIncludedSourceFiles.get(project); |
| } |
| Set<IFile> sourceFiles = new HashSet<IFile>(); |
| try { |
| IJavaProject jp = JavaCore.create(project); |
| IClasspathEntry[] cpes = jp.getRawClasspath(); |
| for (int i = 0; i < cpes.length; i++) { |
| if ((cpes[i] instanceof ClasspathEntry) && |
| (cpes[i].getEntryKind() == IClasspathEntry.CPE_SOURCE)) { |
| ClasspathEntry cp = (ClasspathEntry)cpes[i]; |
| char[][] incl = cp.fullInclusionPatternChars(); |
| char[][] excl = cp.fullExclusionPatternChars(); |
| IPath path = cpes[i].getPath(); |
| IResource res = project.findMember(path |
| .removeFirstSegments(1)); |
| if ((res != null) && (res instanceof IContainer)) { |
| List<IFile> l = allFiles((IContainer) res); |
| for (IFile file : l) { |
| if (!Util.isExcluded(file,incl,excl)) { |
| sourceFiles.add(file); |
| } |
| } |
| } |
| } |
| } |
| } catch (JavaModelException e) { |
| } |
| projectsToIncludedSourceFiles.put(project, sourceFiles); |
| return sourceFiles; |
| } |
| |
| |
| |
| /** |
| * Experimental version of above that uses a set, not a list |
| * @param project |
| * @return |
| */ |
| public static Set<IFile> getIncludedSourceFilesSet(IProject project) { |
| if (projectsToIncludedSourceFiles.get(project) instanceof List) { |
| return projectsToIncludedSourceFiles.get(project); |
| } |
| Set<IFile> sourceFiles = new HashSet<IFile>(); |
| try { |
| IJavaProject jp = JavaCore.create(project); |
| IClasspathEntry[] cpes = jp.getRawClasspath(); |
| for (int i = 0; i < cpes.length; i++) { |
| if ((cpes[i] instanceof ClasspathEntry) |
| && (cpes[i].getEntryKind() == IClasspathEntry.CPE_SOURCE)) { |
| ClasspathEntry cp = (ClasspathEntry) cpes[i]; |
| char[][] incl = cp.fullInclusionPatternChars(); |
| char[][] excl = cp.fullExclusionPatternChars(); |
| IPath path = cpes[i].getPath(); |
| IResource res = project.findMember(path |
| .removeFirstSegments(1)); |
| if ((res != null) && (res instanceof IContainer)) { |
| List<IFile> l = allFiles((IContainer) res); |
| for (IFile file : l) { |
| if (!Util.isExcluded(file, incl, excl)) { |
| sourceFiles.add(file); |
| } |
| } |
| } |
| } |
| } |
| } catch (JavaModelException e) { |
| } |
| projectsToIncludedSourceFiles.put(project, sourceFiles); |
| return sourceFiles; |
| } |
| |
| |
| /** |
| * Invalidate the list of included source files for a project |
| * @param project |
| */ |
| public static void flushIncludedSourceFileCache(IProject project) { |
| projectsToIncludedSourceFiles.remove(project); |
| } |
| |
| /** |
| * Find out whether a file is included. This does NOT use the cached version, |
| * so if you are calling it a lot and don't need the most up-to date information |
| * it would be better to use getIncludedSourceFiles(file.getProject()).contains(file) instead. |
| * @param file |
| * @return |
| */ |
| public static boolean isIncluded(IResource file) { |
| IJavaProject jp = JavaCore.create(file.getProject()); |
| return jp.isOnClasspath(file); |
| } |
| |
| //return a list of all IFiles in the given folder, including all |
| // sub-folders |
| private static List<IFile> allFiles(IContainer folder) { |
| final List<IFile> contents = new ArrayList<IFile>(); |
| try { |
| folder.accept(new IResourceVisitor() { |
| public boolean visit(IResource res) { |
| if (res.getType() == IResource.FILE |
| && JavaCore.isJavaLikeFileName((res |
| .getName()))) { |
| contents.add((IFile) res); |
| } |
| return true; |
| } |
| }); |
| } catch (CoreException e) { |
| } |
| return contents; |
| } |
| } |