public boolean execute(IProgressMonitor progressMonitor) { if (this.isCancelled || progressMonitor != null && progressMonitor.isCanceled()) return true; if (!project.isAccessible()) return true; // nothing to do IResource folder = this.project.getParent().findMember(this.folderPath); if (folder == null || folder.getType() == IResource.FILE) return true; // nothing to do, source folder was removed /* ensure no concurrent write access to index */ Index index = this.manager.getIndex( this.containerPath, true, /*reuse index file*/ true /*create if none*/); if (index == null) return true; ReadWriteMonitor monitor = index.monitor; if (monitor == null) return true; // index got deleted since acquired try { monitor.enterRead(); // ask permission to read final IPath container = this.containerPath; final IndexManager indexManager = this.manager; final SourceElementParser parser = indexManager.getSourceElementParser( JavaCore.create(this.project), null /*requestor will be set by indexer*/); if (this.exclusionPatterns == null && this.inclusionPatterns == null) { folder.accept( new IResourceProxyVisitor() { public boolean visit(IResourceProxy proxy) /* throws CoreException */ { if (proxy.getType() == IResource.FILE) { if (descent.internal.core.util.Util.isJavaLikeFileName(proxy.getName())) indexManager.addSource((IFile) proxy.requestResource(), container, parser); return false; } return true; } }, IResource.NONE); } else { folder.accept( new IResourceProxyVisitor() { public boolean visit(IResourceProxy proxy) /* throws CoreException */ { switch (proxy.getType()) { case IResource.FILE: if (descent.internal.core.util.Util.isJavaLikeFileName(proxy.getName())) { IResource resource = proxy.requestResource(); if (!Util.isExcluded(resource, inclusionPatterns, exclusionPatterns)) indexManager.addSource((IFile) resource, container, parser); } return false; case IResource.FOLDER: if (exclusionPatterns != null && inclusionPatterns == null) { // if there are inclusion patterns then we must walk the children if (Util.isExcluded( proxy.requestFullPath(), inclusionPatterns, exclusionPatterns, true)) return false; } } return true; } }, IResource.NONE); } } catch (CoreException e) { if (JobManager.VERBOSE) { Util.verbose( "-> failed to add " + this.folderPath + " to index because of the following exception:", System.err); // $NON-NLS-1$ //$NON-NLS-2$ e.printStackTrace(); } return false; } finally { monitor.exitRead(); // free read lock } return true; }