| /******************************************************************************* |
| * 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.internal.core; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IPackageFragmentRoot; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| |
| /* |
| * Selected methods copied from JDT/UI |
| * org.eclipse.jdt.internal.corext.buildpath.ClasspathModifer |
| */ |
| public class ClasspathModifier { |
| /** |
| * Find out whether the <code>IResource</code> excluded or not. |
| * |
| * @param resource |
| * the resource to be checked |
| * @param project |
| * the Java project |
| * @return <code>true</code> if the resource is excluded, <code> |
| * false</code> |
| * otherwise |
| * @throws JavaModelException |
| */ |
| public static boolean isExcluded(IResource resource, IJavaProject project) |
| throws JavaModelException { |
| IPackageFragmentRoot root = getFragmentRoot(resource, project, null); |
| if (root == null) |
| return false; |
| String fragmentName = getName(resource.getFullPath(), root.getPath()); |
| fragmentName = completeName(fragmentName); |
| IClasspathEntry entry = root.getRawClasspathEntry(); |
| return entry != null |
| && contains(new Path(fragmentName), entry |
| .getExclusionPatterns()); |
| } |
| |
| /** |
| * Find out whether one of the <code>IResource</code>'s parents |
| * is excluded. |
| * |
| * @param resource check the resources parents whether they are |
| * excluded or not |
| * @param project the Java project |
| * @return <code>true</code> if there is an excluded parent, |
| * <code>false</code> otherwise |
| * @throws JavaModelException |
| */ |
| public static boolean parentExcluded(IResource resource, IJavaProject project) throws JavaModelException { |
| if (resource.getFullPath().equals(project.getPath())) |
| return false; |
| IPackageFragmentRoot root= getFragmentRoot(resource, project, null); |
| if (root == null) { |
| return true; |
| } |
| IPath path= resource.getFullPath().removeFirstSegments(root.getPath().segmentCount()); |
| IClasspathEntry entry= root.getRawClasspathEntry(); |
| if (entry == null) |
| return true; // there is no build path entry, this is equal to the fact that the parent is excluded |
| while (path.segmentCount() > 0) { |
| if (contains(path, entry.getExclusionPatterns())) |
| return true; |
| path= path.removeLastSegments(1); |
| } |
| return false; |
| } |
| |
| /** |
| * Get the source folder of a given <code>IResource</code> element, |
| * starting with the resource's parent. |
| * |
| * @param resource |
| * the resource to get the fragment root from |
| * @param project |
| * the Java project |
| * @param monitor |
| * progress monitor, can be <code>null</code> |
| * @return resolved fragment root |
| * @throws JavaModelException |
| */ |
| public static IPackageFragmentRoot getFragmentRoot(IResource resource, |
| IJavaProject project, IProgressMonitor monitor) |
| throws JavaModelException { |
| IJavaElement javaElem = null; |
| if (resource.getFullPath().equals(project.getPath())) |
| return project.getPackageFragmentRoot(resource); |
| IContainer container = resource.getParent(); |
| do { |
| if (container instanceof IFolder) |
| javaElem = JavaCore.create((IFolder) container); |
| if (container.getFullPath().equals(project.getPath())) { |
| javaElem = project; |
| break; |
| } |
| container = container.getParent(); |
| if (container == null) |
| return null; |
| } while (javaElem == null |
| || !(javaElem instanceof IPackageFragmentRoot)); |
| if (javaElem instanceof IJavaProject) |
| javaElem = project.getPackageFragmentRoot(project.getResource()); |
| return (IPackageFragmentRoot) javaElem; |
| } |
| |
| /** |
| * Returns a string corresponding to the <code>path</code> with the |
| * <code>rootPath<code>'s number of segments |
| * removed |
| * |
| * @param path path to remove segments |
| * @param rootPath provides the number of segments to |
| * be removed |
| * @return a string corresponding to the mentioned |
| * action |
| */ |
| private static String getName(IPath path, IPath rootPath) { |
| return path.removeFirstSegments(rootPath.segmentCount()).toString(); |
| } |
| |
| /** |
| * Add a '/' at the end of the name if it does not end with '.java', or |
| * other Java-like extension. |
| * |
| * @param name |
| * append '/' at the end if necessary |
| * @return modified string |
| */ |
| private static String completeName(String name) { |
| if (!JavaCore.isJavaLikeFileName(name)) { |
| name = name + "/"; //$NON-NLS-1$ |
| name = name.replace('.', '/'); |
| return name; |
| } |
| return name; |
| } |
| |
| /** |
| * Find out whether the provided path equals to one in the array. |
| * |
| * @param path |
| * path to find an equivalent for |
| * @param paths |
| * set of paths to compare with |
| * @return <code>true</code> if there is an occurrence, <code> |
| * false</code> |
| * otherwise |
| */ |
| private static boolean contains(IPath path, IPath[] paths) { |
| if (path == null) |
| return false; |
| if (path.getFileExtension() == null) |
| path = new Path(completeName(path.toString())); |
| for (int i = 0; i < paths.length; i++) { |
| if (paths[i].equals(path)) |
| return true; |
| } |
| return false; |
| } |
| |
| } |