Example usage for org.eclipse.jdt.internal.core.util Util isExcluded

List of usage examples for org.eclipse.jdt.internal.core.util Util isExcluded

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.core.util Util isExcluded.

Prototype

public final static boolean isExcluded(IResource resource, char[][] inclusionPatterns,
            char[][] exclusionPatterns) 

Source Link

Usage

From source file:com.codenvy.ide.ext.java.server.internal.core.JavaProjectElementInfo.java

License:Open Source License

/**
 * Compute the non-java resources contained in this java project.
 *//*from w  w  w  .j  av  a2 s  .  com*/
private Object[] computeNonJavaResources(JavaProject project) {

    // determine if src == project and/or if bin == project
    IPath projectPath = project.getProject().getFullPath();
    boolean srcIsProject = false;
    boolean binIsProject = false;
    char[][] inclusionPatterns = null;
    char[][] exclusionPatterns = null;
    IPath projectOutput = null;
    boolean isClasspathResolved = true;
    try {
        IClasspathEntry entry = project.getClasspathEntryFor(projectPath);
        if (entry != null) {
            srcIsProject = true;
            inclusionPatterns = ((ClasspathEntry) entry).fullInclusionPatternChars();
            exclusionPatterns = ((ClasspathEntry) entry).fullExclusionPatternChars();
        }
        projectOutput = project.getOutputLocation();
        binIsProject = projectPath.equals(projectOutput);
    } catch (JavaModelException e) {
        isClasspathResolved = false;
    }

    Object[] resources = new IResource[5];
    int resourcesCounter = 0;
    try {
        IResource[] members = ((IContainer) project.getResource()).members();
        int length = members.length;
        if (length > 0) {
            String sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true);
            String complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
            IClasspathEntry[] classpath = project.getResolvedClasspath();
            for (int i = 0; i < length; i++) {
                IResource res = members[i];
                switch (res.getType()) {
                case IResource.FILE:
                    IPath resFullPath = res.getFullPath();
                    String resName = res.getName();

                    // ignore a jar file on the classpath
                    if (isClasspathResolved && isClasspathEntryOrOutputLocation(resFullPath,
                            res.getLocation()/* see https://bugs.eclipse
                                             .org/bugs/show_bug.cgi?id=244406 */, classpath, projectOutput)) {
                        break;
                    }
                    // ignore .java file if src == project
                    if (srcIsProject && Util.isValidCompilationUnitName(resName, sourceLevel, complianceLevel)
                            && !Util.isExcluded(res, inclusionPatterns, exclusionPatterns)) {
                        break;
                    }
                    // ignore .class file if bin == project
                    if (binIsProject && Util.isValidClassFileName(resName, sourceLevel, complianceLevel)) {
                        break;
                    }
                    // else add non java resource
                    if (resources.length == resourcesCounter) {
                        // resize
                        System.arraycopy(resources, 0, (resources = new IResource[resourcesCounter * 2]), 0,
                                resourcesCounter);
                    }
                    resources[resourcesCounter++] = res;
                    break;
                case IResource.FOLDER:
                    resFullPath = res.getFullPath();

                    // ignore non-excluded folders on the classpath or that correspond to an output location
                    if ((srcIsProject && !Util.isExcluded(res, inclusionPatterns, exclusionPatterns)
                            && Util.isValidFolderNameForPackage(res.getName(), sourceLevel, complianceLevel))
                            || (isClasspathResolved && isClasspathEntryOrOutputLocation(resFullPath,
                                    res.getLocation(), classpath, projectOutput))) {
                        break;
                    }
                    // else add non java resource
                    if (resources.length == resourcesCounter) {
                        // resize
                        System.arraycopy(resources, 0, (resources = new IResource[resourcesCounter * 2]), 0,
                                resourcesCounter);
                    }
                    resources[resourcesCounter++] = res;
                }
            }
        }
        if (resources.length != resourcesCounter) {
            System.arraycopy(resources, 0, (resources = new IResource[resourcesCounter]), 0, resourcesCounter);
        }
    } catch (CoreException e) {
        resources = NO_NON_JAVA_RESOURCES;
        resourcesCounter = 0;
    }
    return resources;
}

From source file:com.codenvy.ide.ext.java.server.internal.core.PackageFragmentRootInfo.java

License:Open Source License

/**
 * Starting at this folder, create non-java resources for this package fragment root
 * and add them to the non-java resources collection.
 *
 * @exception org.eclipse.jdt.core.JavaModelException  The resource associated with this package fragment does not exist
 *///  w w  w .j  av a 2 s.  c  o  m
static Object[] computeFolderNonJavaResources(IPackageFragmentRoot root, IContainer folder,
        char[][] inclusionPatterns, char[][] exclusionPatterns) throws JavaModelException {
    IResource[] nonJavaResources = new IResource[5];
    int nonJavaResourcesCounter = 0;
    try {
        IResource[] members = folder.members();
        int length = members.length;
        if (length > 0) {
            // if package fragment root refers to folder in another IProject, then
            // folder.getProject() is different than root.getJavaProject().getProject()
            // use the other java project's options to verify the name
            IJavaProject otherJavaProject = JavaCore.create(folder.getProject());
            String sourceLevel = otherJavaProject.getOption(JavaCore.COMPILER_SOURCE, true);
            String complianceLevel = otherJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
            JavaProject javaProject = (JavaProject) root.getJavaProject();
            IClasspathEntry[] classpath = javaProject.getResolvedClasspath();
            nextResource: for (int i = 0; i < length; i++) {
                IResource member = members[i];
                switch (member.getType()) {
                case IResource.FILE:
                    String fileName = member.getName();

                    // ignore .java files that are not excluded
                    if (Util.isValidCompilationUnitName(fileName, sourceLevel, complianceLevel)
                            && !Util.isExcluded(member, inclusionPatterns, exclusionPatterns))
                        continue nextResource;
                    // ignore .class files
                    if (Util.isValidClassFileName(fileName, sourceLevel, complianceLevel))
                        continue nextResource;
                    // ignore .zip or .jar file on classpath
                    if (isClasspathEntry(member.getFullPath(), classpath))
                        continue nextResource;
                    break;

                case IResource.FOLDER:
                    // ignore valid packages or excluded folders that correspond to a nested pkg fragment root
                    if (Util.isValidFolderNameForPackage(member.getName(), sourceLevel, complianceLevel)
                            && (!Util.isExcluded(member, inclusionPatterns, exclusionPatterns)
                                    || isClasspathEntry(member.getFullPath(), classpath)))
                        continue nextResource;
                    break;
                }
                if (nonJavaResources.length == nonJavaResourcesCounter) {
                    // resize
                    System.arraycopy(nonJavaResources, 0,
                            (nonJavaResources = new IResource[nonJavaResourcesCounter * 2]), 0,
                            nonJavaResourcesCounter);
                }
                nonJavaResources[nonJavaResourcesCounter++] = member;
            }
        }
        //      if (ExternalFoldersManager.isInternalPathForExternalFolder(folder.getFullPath())) {
        //         IJarEntryResource[] jarEntryResources = new IJarEntryResource[nonJavaResourcesCounter];
        //         for (int i = 0; i < nonJavaResourcesCounter; i++) {
        //            jarEntryResources[i] = new NonJavaResource(root, nonJavaResources[i]);
        //         }
        //         return jarEntryResources;
        //      } else if (nonJavaResources.length != nonJavaResourcesCounter) {
        //         System.arraycopy(nonJavaResources, 0, (nonJavaResources = new IResource[nonJavaResourcesCounter]), 0, nonJavaResourcesCounter);
        //      }
        return nonJavaResources;
    } catch (CoreException e) {
        throw new JavaModelException(e);
    }
}

From source file:net.sf.j2s.core.builder.AbstractImageBuilder.java

License:Open Source License

protected SourceFile findSourceFile(IFile file, boolean mustExist) {
    if (mustExist && !file.exists())
        return null;

    // assumes the file exists in at least one of the source folders & is not excluded
    ClasspathMultiDirectory md = this.sourceLocations[0];
    if (this.sourceLocations.length > 1) {
        IPath sourceFileFullPath = file.getFullPath();
        for (int j = 0, m = this.sourceLocations.length; j < m; j++) {
            if (this.sourceLocations[j].sourceFolder.getFullPath().isPrefixOf(sourceFileFullPath)) {
                md = this.sourceLocations[j];
                if (md.exclusionPatterns == null && md.inclusionPatterns == null)
                    break;
                if (!Util.isExcluded(file, md.inclusionPatterns, md.exclusionPatterns))
                    break;
            }/* w w w.  j a v a 2s .c om*/
        }
    }
    return new SourceFile(file, md);
}

From source file:net.sf.j2s.core.builder.ClasspathMultiDirectory.java

License:Open Source License

protected boolean isExcluded(IResource resource) {
    if (this.exclusionPatterns != null || this.inclusionPatterns != null)
        if (this.sourceFolder.equals(this.binaryFolder))
            return Util.isExcluded(resource, this.inclusionPatterns, this.exclusionPatterns);
    return false;
}

From source file:net.sf.j2s.core.builder.IncrementalImageBuilder.java

License:Open Source License

protected boolean checkForClassFileChanges(IResourceDelta binaryDelta, ClasspathMultiDirectory md,
        int segmentCount) throws CoreException {
    IResource resource = binaryDelta.getResource();
    // remember that if inclusion & exclusion patterns change then a full build is done
    boolean isExcluded = (md.exclusionPatterns != null || md.inclusionPatterns != null)
            && Util.isExcluded(resource, md.inclusionPatterns, md.exclusionPatterns);
    switch (resource.getType()) {
    case IResource.FOLDER:
        if (isExcluded && md.inclusionPatterns == null)
            return true; // no need to go further with this delta since its children cannot be included

        IResourceDelta[] children = binaryDelta.getAffectedChildren();
        for (int i = 0, l = children.length; i < l; i++)
            if (!checkForClassFileChanges(children[i], md, segmentCount))
                return false;
        return true;
    case IResource.FILE:
        if (!isExcluded && org.eclipse.jdt.internal.compiler.util.Util.isClassFileName(resource.getName())) {
            // perform full build if a managed class file has been changed
            IPath typePath = resource.getFullPath().removeFirstSegments(segmentCount).removeFileExtension();
            if (this.newState.isKnownType(typePath.toString())) {
                if (JavaBuilder.DEBUG)
                    System.out.println("MUST DO FULL BUILD. Found change to class file " + typePath); //$NON-NLS-1$
                return false;
            }//w  w  w. j  av a 2  s .c  o  m
            return true;
        }
    }
    return true;
}

From source file:net.sf.j2s.core.builder.IncrementalImageBuilder.java

License:Open Source License

protected boolean findSourceFiles(IResourceDelta sourceDelta, ClasspathMultiDirectory md, int segmentCount)
        throws CoreException {
    // When a package becomes a type or vice versa, expect 2 deltas,
    // one on the folder & one on the source file
    IResource resource = sourceDelta.getResource();
    // remember that if inclusion & exclusion patterns change then a full build is done
    boolean isExcluded = (md.exclusionPatterns != null || md.inclusionPatterns != null)
            && Util.isExcluded(resource, md.inclusionPatterns, md.exclusionPatterns);
    switch (resource.getType()) {
    case IResource.FOLDER:
        if (isExcluded && md.inclusionPatterns == null)
            return true; // no need to go further with this delta since its children cannot be included

        switch (sourceDelta.getKind()) {
        case IResourceDelta.ADDED:
            if (!isExcluded) {
                IPath addedPackagePath = resource.getFullPath().removeFirstSegments(segmentCount);
                createFolder(addedPackagePath, md.binaryFolder); // ensure package exists in the output folder
                // see if any known source file is from the same package... classpath already includes new package
                if (this.sourceLocations.length > 1
                        && this.newState.isKnownPackage(addedPackagePath.toString())) {
                    if (JavaBuilder.DEBUG)
                        System.out.println("Skipped dependents of added package " + addedPackagePath); //$NON-NLS-1$
                } else {
                    if (JavaBuilder.DEBUG)
                        System.out.println("Found added package " + addedPackagePath); //$NON-NLS-1$
                    addDependentsOf(addedPackagePath, true);
                }/*ww  w  .  j  a  v a  2s. com*/
            }
            //$FALL-THROUGH$ collect all the source files
        case IResourceDelta.CHANGED:
            IResourceDelta[] children = sourceDelta.getAffectedChildren();
            for (int i = 0, l = children.length; i < l; i++)
                if (!findSourceFiles(children[i], md, segmentCount))
                    return false;
            return true;
        case IResourceDelta.REMOVED:
            if (isExcluded) {
                // since this folder is excluded then there is nothing to delete (from this md), but must walk any included subfolders
                children = sourceDelta.getAffectedChildren();
                for (int i = 0, l = children.length; i < l; i++)
                    if (!findSourceFiles(children[i], md, segmentCount))
                        return false;
                return true;
            }
            IPath removedPackagePath = resource.getFullPath().removeFirstSegments(segmentCount);
            if (this.sourceLocations.length > 1) {
                for (int i = 0, l = this.sourceLocations.length; i < l; i++) {
                    if (this.sourceLocations[i].sourceFolder.getFolder(removedPackagePath).exists()) {
                        // only a package fragment was removed, same as removing multiple source files
                        if (md.hasIndependentOutputFolder)
                            createFolder(removedPackagePath, md.binaryFolder); // ensure package exists in the output folder
                        IResourceDelta[] removedChildren = sourceDelta.getAffectedChildren();
                        for (int j = 0, m = removedChildren.length; j < m; j++)
                            if (!findSourceFiles(removedChildren[j], md, segmentCount))
                                return false;
                        return true;
                    }
                }
            }
            if ((sourceDelta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
                // same idea as moving a source file
                // see bug 163200
                IResource movedFolder = this.javaBuilder.workspaceRoot.getFolder(sourceDelta.getMovedToPath());
                JavaBuilder.removeProblemsAndTasksFor(movedFolder);
            }
            IFolder removedPackageFolder = md.binaryFolder.getFolder(removedPackagePath);
            if (removedPackageFolder.exists())
                removedPackageFolder.delete(IResource.FORCE, null);
            // add dependents even when the package thinks it does not exist to be on the safe side
            if (JavaBuilder.DEBUG)
                System.out.println("Found removed package " + removedPackagePath); //$NON-NLS-1$
            addDependentsOf(removedPackagePath, true);
            this.newState.removePackage(sourceDelta);
        }
        return true;
    case IResource.FILE:
        if (isExcluded)
            return true;

        String resourceName = resource.getName();
        if (org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(resourceName)) {
            IPath typePath = resource.getFullPath().removeFirstSegments(segmentCount).removeFileExtension();
            String typeLocator = resource.getProjectRelativePath().toString();
            switch (sourceDelta.getKind()) {
            case IResourceDelta.ADDED:
                if (JavaBuilder.DEBUG)
                    System.out.println("Compile this added source file " + typeLocator); //$NON-NLS-1$
                this.sourceFiles.add(new SourceFile((IFile) resource, md, true));
                String typeName = typePath.toString();
                if (!this.newState.isDuplicateLocator(typeName, typeLocator)) { // adding dependents results in 2 duplicate errors
                    if (JavaBuilder.DEBUG)
                        System.out.println("Found added source file " + typeName); //$NON-NLS-1$
                    addDependentsOf(typePath, true);
                }
                return true;
            case IResourceDelta.REMOVED:
                char[][] definedTypeNames = this.newState.getDefinedTypeNamesFor(typeLocator);
                if (definedTypeNames == null) { // defined a single type matching typePath
                    removeClassFile(typePath, md.binaryFolder);
                    if ((sourceDelta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
                        // remove problems and tasks for a compilation unit that is being moved (to another package or renamed)
                        // if the target file is a compilation unit, the new cu will be recompiled
                        // if the target file is a non-java resource, then markers are removed
                        // see bug 2857
                        IResource movedFile = this.javaBuilder.workspaceRoot
                                .getFile(sourceDelta.getMovedToPath());
                        JavaBuilder.removeProblemsAndTasksFor(movedFile);
                    }
                } else {
                    if (JavaBuilder.DEBUG)
                        System.out.println("Found removed source file " + typePath.toString()); //$NON-NLS-1$
                    addDependentsOf(typePath, true); // add dependents of the source file since it may be involved in a name collision
                    if (definedTypeNames.length > 0) { // skip it if it failed to successfully define a type
                        IPath packagePath = typePath.removeLastSegments(1);
                        for (int i = 0, l = definedTypeNames.length; i < l; i++)
                            removeClassFile(packagePath.append(new String(definedTypeNames[i])),
                                    md.binaryFolder);
                    }
                }
                this.newState.removeLocator(typeLocator);
                return true;
            case IResourceDelta.CHANGED:
                if ((sourceDelta.getFlags() & IResourceDelta.CONTENT) == 0
                        && (sourceDelta.getFlags() & IResourceDelta.ENCODING) == 0)
                    return true; // skip it since it really isn't changed
                if (JavaBuilder.DEBUG)
                    System.out.println("Compile this changed source file " + typeLocator); //$NON-NLS-1$
                this.sourceFiles.add(new SourceFile((IFile) resource, md, true));
            }
            return true;
        } else if (org.eclipse.jdt.internal.compiler.util.Util.isClassFileName(resourceName)) {
            // perform full build if a managed class file has been changed
            if (this.makeOutputFolderConsistent) {
                IPath typePath = resource.getFullPath().removeFirstSegments(segmentCount).removeFileExtension();
                if (this.newState.isKnownType(typePath.toString())) {
                    if (JavaBuilder.DEBUG)
                        System.out.println("MUST DO FULL BUILD. Found change to class file " + typePath); //$NON-NLS-1$
                    return false;
                }
            }
            return true;
        } else if (md.hasIndependentOutputFolder) {
            if (this.javaBuilder.filterExtraResource(resource))
                return true;

            // copy all other resource deltas to the output folder
            IPath resourcePath = resource.getFullPath().removeFirstSegments(segmentCount);
            IResource outputFile = md.binaryFolder.getFile(resourcePath);
            switch (sourceDelta.getKind()) {
            case IResourceDelta.ADDED:
                if (outputFile.exists()) {
                    if (JavaBuilder.DEBUG)
                        System.out.println("Deleting existing file " + resourcePath); //$NON-NLS-1$
                    outputFile.delete(IResource.FORCE, null);
                }
                if (JavaBuilder.DEBUG)
                    System.out.println("Copying added file " + resourcePath); //$NON-NLS-1$
                createFolder(resourcePath.removeLastSegments(1), md.binaryFolder); // ensure package exists in the output folder
                copyResource(resource, outputFile);
                return true;
            case IResourceDelta.REMOVED:
                if (outputFile.exists()) {
                    if (JavaBuilder.DEBUG)
                        System.out.println("Deleting removed file " + resourcePath); //$NON-NLS-1$
                    outputFile.delete(IResource.FORCE, null);
                }
                return true;
            case IResourceDelta.CHANGED:
                if ((sourceDelta.getFlags() & IResourceDelta.CONTENT) == 0
                        && (sourceDelta.getFlags() & IResourceDelta.ENCODING) == 0)
                    return true; // skip it since it really isn't changed
                if (outputFile.exists()) {
                    if (JavaBuilder.DEBUG)
                        System.out.println("Deleting existing file " + resourcePath); //$NON-NLS-1$
                    outputFile.delete(IResource.FORCE, null);
                }
                if (JavaBuilder.DEBUG)
                    System.out.println("Copying changed file " + resourcePath); //$NON-NLS-1$
                createFolder(resourcePath.removeLastSegments(1), md.binaryFolder); // ensure package exists in the output folder
                copyResource(resource, outputFile);
            }
            return true;
        }
    }
    return true;
}

From source file:org.eclipse.ajdt.core.BuildConfig.java

License:Open Source License

/**
 * 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/*from  www  .  ja v a  2s  .  c o m*/
 * @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;
}

From source file:org.eclipse.ajdt.core.BuildConfig.java

License:Open Source License

/**
 * Experimental version of above that uses a set, not a list
 * @param project/*  w  w w.j a  v a  2 s  . co m*/
 * @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;
}

From source file:org.eclipse.ajdt.core.builder.AJBuilder.java

License:Open Source License

/**
 * Copies over all non-excluded resources into the out folders.
 * //  w  ww  .j a v  a  2 s  .  c o  m
 * Called during a full build
 * 
 * @param javaProject
 */
private void copyResources(IJavaProject project) throws CoreException {
    IClasspathEntry[] srcEntries = getSrcClasspathEntry(project);

    for (int i = 0, l = srcEntries.length; i < l; i++) {
        IClasspathEntry srcEntry = srcEntries[i];
        IPath srcPath = srcEntry.getPath().removeFirstSegments(1);
        IPath outPath = srcEntry.getOutputLocation();
        if (outPath == null) {
            outPath = project.getOutputLocation();
        }
        outPath = outPath.removeFirstSegments(1);
        if (!srcPath.equals(outPath)) {
            final char[][] inclusionPatterns = ((ClasspathEntry) srcEntry).fullInclusionPatternChars();
            final char[][] exclusionPatterns = ((ClasspathEntry) srcEntry).fullExclusionPatternChars();

            final IContainer srcContainer = getContainerForGivenPath(srcPath, project.getProject());
            if (!srcContainer.exists()) {
                continue;
            }
            final int segmentsToRemove = srcContainer.getLocation().segmentCount();
            final IContainer outContainer = getContainerForGivenPath(outPath, project.getProject());
            if (outContainer.getType() == IResource.FOLDER && (!outContainer.exists())) {
                // also ensure parent folders exist
                createFolder(outPath, getProject(), false);
            }
            IResourceVisitor copyVisitor = new IResourceVisitor() {
                public boolean visit(IResource resource) throws CoreException {
                    if (Util.isExcluded(resource, inclusionPatterns, exclusionPatterns)) {
                        return false;
                    } else if (resource.getType() == IResource.PROJECT) {
                        return true;
                    }

                    if (resource.getType() == IResource.FOLDER || !isSourceFile(resource)) {
                        // refresh to ensure that resource has not been deleted from file system
                        resource.refreshLocal(IResource.DEPTH_ZERO, null);

                        if (resource.exists()) {
                            switch (resource.getType()) {
                            case IResource.FOLDER:
                                // ensure folder exists and is derived
                                IPath outPath = resource.getLocation().removeFirstSegments(segmentsToRemove);
                                IFolder outFolder = (IFolder) createFolder(outPath, outContainer, true);

                                // outfolder itself should not be derived
                                if (outFolder.equals(outContainer)) {
                                    outFolder.setDerived(false, null);
                                }
                                break;

                            case IResource.FILE:
                                // if this is not a CU, then copy over and mark as derived
                                if (!isSourceFile(resource)) {
                                    outPath = resource.getLocation().removeFirstSegments(segmentsToRemove);
                                    IFile outFile = outContainer.getFile(outPath);
                                    // check to make sure that resource has not been deleted from the file
                                    // system without a refresh
                                    if (!outFile.exists()) {
                                        try {
                                            resource.copy(outFile.getFullPath(),
                                                    IResource.DERIVED | IResource.FORCE, null);
                                            Util.setReadOnly(outFile, false);
                                        } catch (ResourceException e) {
                                            resource.refreshLocal(IResource.DEPTH_ZERO, null);
                                            if (resource.exists()) {
                                                // probably hit https://bugs.eclipse.org/bugs/show_bug.cgi?id=331036
                                                // We just checked to see if the outfile exists, but we get this exception
                                                // anyway.  It might be that it has not been refreshed.
                                                if (e.getStatus()
                                                        .getCode() == IResourceStatus.FAILED_WRITE_LOCAL) {
                                                    AJLog.log(AJLog.BUILDER, "Could not write to resource '"
                                                            + resource + "'.  "
                                                            + "It probbly already exists on disk.  Try a clean build.");
                                                    outFile.refreshLocal(IResource.DEPTH_ZERO, null);
                                                } else {
                                                    throw e;
                                                }
                                            } else {
                                                // resource was deleted in the middle of the build.  Can safely ignore this
                                            }
                                        }
                                    }
                                }
                                break;
                            }
                            return true;
                        }
                    }
                    return false;
                }
            };

            srcContainer.accept(copyVisitor);

        }
    }
}

From source file:org.eclipse.ajdt.core.builder.AJBuilder.java

License:Open Source License

/**
 * Copies non-src resources to the output directory (bug 78579). The main
 * part of this method was taken from /*from   w  w  w  .ja v a  2 s .  com*/
 * org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.findSourceFiles(IResourceDelta,ClasspathMultiDirectory,int)
 * 
 * @param IJavaProject - the project which is being built
 * @param IResourceDelta - the projects delta
 * @param IClasspathEntry - the src entry on the classpath
 * @param int - the segment count
 * 
 * @throws CoreException
 */
private void copyResources(IJavaProject javaProject, IResourceDelta sourceDelta, IClasspathEntry srcEntry,
        int segmentCount) throws CoreException {
    IResource resource = sourceDelta.getResource();
    // bug 161739: skip excluded resources
    char[][] inclusionPatterns = ((ClasspathEntry) srcEntry).fullInclusionPatternChars();
    char[][] exclusionPatterns = ((ClasspathEntry) srcEntry).fullExclusionPatternChars();
    if (Util.isExcluded(resource, inclusionPatterns, exclusionPatterns)) {
        return;
    }

    IPath outputPath = srcEntry.getOutputLocation();
    if (outputPath == null) {
        outputPath = javaProject.getOutputLocation();
    }
    outputPath = outputPath.removeFirstSegments(1).makeRelative();

    IContainer outputFolder = getContainerForGivenPath(outputPath, javaProject.getProject());
    IContainer srcContainer = getContainerForGivenPath(srcEntry.getPath().removeFirstSegments(1),
            javaProject.getProject());

    IPath deltaPath = resource.getFullPath().removeFirstSegments(segmentCount);

    switch (resource.getType()) {
    case IResource.FOLDER:
        IContainer folderToRefresh = outputFolder.getFolder(deltaPath);
        switch (sourceDelta.getKind()) {
        case IResourceDelta.ADDED:
            createFolder(deltaPath, outputFolder, true); // ensure package exists in the output folder
            // fall through & collect all the resource files
        case IResourceDelta.CHANGED:
            IResourceDelta[] children = sourceDelta.getAffectedChildren();
            for (int i = 0, l = children.length; i < l; i++) {
                copyResources(javaProject, children[i], srcEntry, segmentCount);
            }
            break;

        case IResourceDelta.REMOVED:
            IClasspathEntry[] srcEntries = getSrcClasspathEntry(javaProject);
            if (srcEntries.length > 1) {
                for (int i = 0, l = srcEntries.length; i < l; i++) {
                    IPath srcPath = srcEntries[i].getPath().removeFirstSegments(1);
                    IFolder srcFolder = javaProject.getProject().getFolder(srcPath);
                    if (srcFolder.getFolder(deltaPath).exists()) {
                        // only a package fragment was removed, same as removing multiple source files
                        // ensure package exists in the output folder
                        // ADE---wait...why are we doing this???  why not just delete and be done with it?
                        // not going to change this because I don't know the ramifications.
                        createFolder(deltaPath, outputFolder, true);
                        IResourceDelta[] removedChildren = sourceDelta.getAffectedChildren();
                        for (int j = 0, m = removedChildren.length; j < m; j++) {
                            copyResources(javaProject, removedChildren[j], srcEntry, segmentCount);
                        }
                        folderToRefresh.refreshLocal(IResource.DEPTH_ZERO, null);
                        return;
                    }
                }
            }
            IFolder removedPackageFolder = outputFolder.getFolder(deltaPath);
            if (removedPackageFolder.exists()) {
                removedPackageFolder.delete(IResource.FORCE, null);
            }
            break;
        } // switch(sourceDelta.getKind())
        folderToRefresh.refreshLocal(IResource.DEPTH_ZERO, null);
        break;

    case IResource.FILE:
        // only do something if the output folder is different to the src folder
        if (!outputFolder.equals(srcContainer)) {
            // copy all resource deltas to the output folder
            if (deltaPath == null)
                return;
            // don't want to copy over .aj or .java files
            if (deltaPath.getFileExtension() != null && (deltaPath.getFileExtension().equals("aj") //$NON-NLS-1$
                    || deltaPath.getFileExtension().equals("java"))) { //$NON-NLS-1$
                break;
            }

            IResource fileToRefresh = outputFolder.getFile(deltaPath);
            switch (sourceDelta.getKind()) {
            case IResourceDelta.ADDED:
                if (fileToRefresh.exists()) {
                    AJLog.log(AJLog.BUILDER, "Deleting existing file " + deltaPath);//$NON-NLS-1$
                    fileToRefresh.delete(IResource.FORCE, null);
                }
                AJLog.log(AJLog.BUILDER, "Copying added file " + deltaPath);//$NON-NLS-1$
                createFolder(deltaPath.removeLastSegments(1), outputFolder, true);
                resource.copy(fileToRefresh.getFullPath(), IResource.FORCE | IResource.DERIVED, null);
                Util.setReadOnly(fileToRefresh, false); // just in case the original was read only
                fileToRefresh.refreshLocal(IResource.DEPTH_ZERO, null);
                // mark this change so compiler knows about it.
                CoreCompilerConfiguration.getCompilerConfigurationForProject(getProject())
                        .configurationChanged(CompilerConfigurationChangeFlags.PROJECTSOURCERESOURCES_CHANGED);
                break;
            case IResourceDelta.REMOVED:
                if (fileToRefresh.exists()) {
                    AJLog.log(AJLog.BUILDER, "Deleting removed file " + deltaPath);//$NON-NLS-1$
                    fileToRefresh.delete(IResource.FORCE, null);
                }
                // mark this change so compiler knows about it.
                CoreCompilerConfiguration.getCompilerConfigurationForProject(getProject())
                        .configurationChanged(CompilerConfigurationChangeFlags.PROJECTSOURCERESOURCES_CHANGED);
                break;
            case IResourceDelta.CHANGED:
                if ((sourceDelta.getFlags() & IResourceDelta.CONTENT) == 0
                        && (sourceDelta.getFlags() & IResourceDelta.ENCODING) == 0) {
                    return; // skip it since it really isn't changed
                }
                if (fileToRefresh.exists()) {
                    AJLog.log(AJLog.BUILDER, "Deleting existing file " + deltaPath);//$NON-NLS-1$
                    fileToRefresh.delete(IResource.FORCE, null);
                }
                AJLog.log(AJLog.BUILDER, "Copying changed file " + deltaPath);//$NON-NLS-1$
                createFolder(deltaPath.removeLastSegments(1), outputFolder, true);
                resource.copy(fileToRefresh.getFullPath(), IResource.FORCE | IResource.DERIVED, null);
                Util.setReadOnly(fileToRefresh, false); // just in case the original was read only
                break;
            }
            fileToRefresh.refreshLocal(IResource.DEPTH_ZERO, null);
        } // switch (sourceDelta.getKind())
        break;
    } // switch(resource.getType())
}