/******************************************************************************* * Copyright (c) 2005, 2007 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 * *******************************************************************************/ package org.eclipse.dltk.internal.core; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.dltk.core.DLTKLanguageManager; import org.eclipse.dltk.core.IBuildpathEntry; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.internal.core.util.Util; class ProjectFragmentInfo extends OpenableElementInfo { /** * The kind of the root associated with this info. */ protected int fRootKind = IProjectFragment.K_SOURCE; protected Object[] foreignResources; /** * Returns the kind of this root. */ public int getRootKind() { return this.fRootKind; } void setForeignResources(Object[] resources) { foreignResources = resources; } public Object[] getForeignResources(IScriptProject scriptProject, IResource resource, ProjectFragment fragment) { Object[] nonScriptResources = this.foreignResources; if (nonScriptResources == null) { nonScriptResources = this.computeForeignResources(scriptProject, resource, fragment); this.foreignResources = nonScriptResources; } return nonScriptResources; } private Object[] computeForeignResources(IScriptProject scriptProject, IResource underlyingResource, ProjectFragment handle) { Object[] nonScriptResources = NO_NON_SCRIPT_RESOURCES; try { // the underlying resource may be a folder or a project (in the case // that the project folder // is actually the package fragment root) if (underlyingResource.getType() == IResource.FOLDER || underlyingResource.getType() == IResource.PROJECT) { nonScriptResources = computeFolderForeignResources( (ScriptProject) scriptProject, (IContainer) underlyingResource, handle .fullInclusionPatternChars(), handle .fullExclusionPatternChars()); } } catch (ModelException e) { // ignore } return nonScriptResources; } public static Object[] computeFolderForeignResources(ScriptProject project, IContainer folder, char[][] inclusionPatterns, char[][] exclusionPatterns) throws ModelException { Object[] nonScriptResources = new IResource[5]; int nonScriptResourcesCounter = 0; try { IBuildpathEntry[] classpath = project.getResolvedBuildpath(); IResource[] members = folder.members(); nextResource: for (int i = 0, max = members.length; i < max; i++) { IResource member = members[i]; switch (member.getType()) { case IResource.FILE: String fileName = member.getName(); // ignore .java files that are not excluded if (Util.isValidSourceModule(project, member) && !Util.isExcluded(member, inclusionPatterns, exclusionPatterns)) continue nextResource; // ignore .zip file on buildpath if (org.eclipse.dltk.compiler.util.Util.isArchiveFileName( DLTKLanguageManager.getLanguageToolkit(project), fileName) && isBuildpathEntry(member.getFullPath(), classpath)) continue nextResource; // All other resources should be in folders. // continue nextResource; break; case IResource.FOLDER: // ignore valid packages or excluded folders that correspond // to a nested pkg fragment root if (Util.isValidFolderNameForPackage(folder, member .getName()) && (!Util.isExcluded(member, inclusionPatterns, exclusionPatterns) || isBuildpathEntry( member.getFullPath(), classpath))) continue nextResource; break; } if (nonScriptResources.length == nonScriptResourcesCounter) { // resize System .arraycopy( nonScriptResources, 0, (nonScriptResources = new IResource[nonScriptResourcesCounter * 2]), 0, nonScriptResourcesCounter); } nonScriptResources[nonScriptResourcesCounter++] = member; } if (nonScriptResources.length != nonScriptResourcesCounter) { System .arraycopy( nonScriptResources, 0, (nonScriptResources = new IResource[nonScriptResourcesCounter]), 0, nonScriptResourcesCounter); } return nonScriptResources; } catch (CoreException e) { throw new ModelException(e); } } private static boolean isBuildpathEntry(IPath path, IBuildpathEntry[] resolvedClasspath) { for (int i = 0, length = resolvedClasspath.length; i < length; i++) { IBuildpathEntry entry = resolvedClasspath[i]; if (entry.getPath().equals(path)) { return true; } } return false; } }