blob: d73fb135b4e0a59637085047a568378a457f877e [file] [log] [blame]
/*******************************************************************************
* 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;
}
}