blob: 1497e896726a11500c9a1c5c27eb674db6f7b84f [file] [log] [blame]
/*******************************************************************************
* 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;
}
}