org.eclipse.ajdt.internal.core.ClasspathModifier.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.internal.core.ClasspathModifier.java

Source

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

}