X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragmentRoot.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragmentRoot.java index f3e3f82..f73c8bd 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragmentRoot.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragmentRoot.java @@ -10,6 +10,7 @@ *******************************************************************************/ package net.sourceforge.phpdt.internal.core; +import java.util.ArrayList; import java.util.Map; import net.sourceforge.phpdt.core.IJavaElement; @@ -19,7 +20,9 @@ import net.sourceforge.phpdt.core.IPackageFragmentRoot; import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpdt.core.JavaCore; import net.sourceforge.phpdt.core.compiler.CharOperation; +import net.sourceforge.phpdt.internal.core.util.Util; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; @@ -27,6 +30,13 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.QualifiedName; +import net.sourceforge.phpdt.core.IClasspathEntry; +import net.sourceforge.phpdt.core.IJavaModelStatusConstants; +import net.sourceforge.phpdt.internal.core.Openable; +import net.sourceforge.phpdt.internal.core.OpenableElementInfo; + +import net.sourceforge.phpdt.internal.core.JavaProject; +import net.sourceforge.phpdt.internal.core.PackageFragmentRootInfo; /** @@ -54,15 +64,134 @@ public class PackageFragmentRoot extends Openable implements IPackageFragmentRoo */ protected Object resource; -/** - * Constructs a package fragment root which is the root of the java package - * directory hierarchy. - */ -protected PackageFragmentRoot(IResource resource, IJavaProject project, String name) { - super(PACKAGE_FRAGMENT_ROOT, project, name); - this.resource = resource; -} + /** + * Constructs a package fragment root which is the root of the java package + * directory hierarchy. + */ + protected PackageFragmentRoot(IResource resource, JavaProject project, String name) { + super(project, name); + this.resource = resource; + } + + /** + * @see Openable + */ + protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws JavaModelException { + + // check whether this pkg fragment root can be opened + if (!resourceExists() ) { //|| !isOnClasspath()) { + throw newNotPresentException(); + } + ((PackageFragmentRootInfo) info).setRootKind(determineKind(underlyingResource)); + return computeChildren(info, newElements); + } + /** + * Returns the root's kind - K_SOURCE or K_BINARY, defaults + * to K_SOURCE if it is not on the classpath. + * + * @exception NotPresentException if the project and root do + * not exist. + */ + protected int determineKind(IResource underlyingResource) throws JavaModelException { +// IClasspathEntry[] entries= ((JavaProject)getJavaProject()).getExpandedClasspath(true); +// for (int i= 0; i < entries.length; i++) { +// IClasspathEntry entry= entries[i]; +// if (entry.getPath().equals(underlyingResource.getFullPath())) { +// return entry.getContentKind(); +// } +// } + return IPackageFragmentRoot.K_SOURCE; + } + /** + * Compute the package fragment children of this package fragment root. + * + * @exception JavaModelException The resource associated with this package fragment root does not exist + */ + protected boolean computeChildren(OpenableElementInfo info, Map newElements) throws JavaModelException { + // Note the children are not opened (so not added to newElements) for a regular package fragment root + // Howver they are opened for a Jar package fragment root (see JarPackageFragmentRoot#computeChildren) + try { + // the underlying resource may be a folder or a project (in the case that the project folder + // is actually the package fragment root) + IResource underlyingResource = getResource(); + if (underlyingResource.getType() == IResource.FOLDER || underlyingResource.getType() == IResource.PROJECT) { + ArrayList vChildren = new ArrayList(5); + IContainer rootFolder = (IContainer) underlyingResource; + // char[][] inclusionPatterns = fullInclusionPatternChars(); + char[][] exclusionPatterns = fullExclusionPatternChars(); + computeFolderChildren(rootFolder, !Util.isExcluded(rootFolder, exclusionPatterns), "", vChildren, exclusionPatterns); //$NON-NLS-1$ + + IJavaElement[] children = new IJavaElement[vChildren.size()]; + vChildren.toArray(children); + info.setChildren(children); + } + } catch (JavaModelException e) { + //problem resolving children; structure remains unknown + info.setChildren(new IJavaElement[]{}); + throw e; + } + return true; + } + /** + * Starting at this folder, create package fragments and add the fragments that are not exclused + * to the collection of children. + * + * @exception JavaModelException The resource associated with this package fragment does not exist + */ + protected void computeFolderChildren(IContainer folder, boolean isIncluded, String prefix, ArrayList vChildren, char[][] exclusionPatterns) throws JavaModelException { + //, char[][] inclusionPatterns, char[][] exclusionPatterns) throws JavaModelException { + + if (isIncluded) { + IPackageFragment pkg = getPackageFragment(prefix); + vChildren.add(pkg); + } + try { + JavaProject javaProject = (JavaProject)getJavaProject(); + IResource[] members = folder.members(); + boolean hasIncluded = isIncluded; + for (int i = 0, max = members.length; i < max; i++) { + IResource member = members[i]; + String memberName = member.getName(); + + switch(member.getType()) { + + case IResource.FOLDER: + if (Util.isValidFolderNameForPackage(memberName)) { + boolean isMemberIncluded = !Util.isExcluded(member, exclusionPatterns); + // keep looking inside as long as included already, or may have child included due to inclusion patterns +// if (isMemberIncluded || inclusionPatterns != null) { +// // eliminate binary output only if nested inside direct subfolders +// if (javaProject.contains(member)) { +// String newPrefix; +// if (prefix.length() == 0) { +// newPrefix = memberName; +// } else { +// newPrefix = prefix + "." + memberName; //$NON-NLS-1$ +// } +// computeFolderChildren((IFolder) member, isMemberIncluded, newPrefix, vChildren, inclusionPatterns, exclusionPatterns); +// } +// } + } + break; + case IResource.FILE: + // inclusion filter may only include files, in which case we still want to include the immediate parent package (lazily) + if (!hasIncluded + && Util.isValidCompilationUnitName(memberName) + && !Util.isExcluded(member, exclusionPatterns)) { + hasIncluded = true; + IPackageFragment pkg = getPackageFragment(prefix); + vChildren.add(pkg); + } + break; + } + } + } catch(IllegalArgumentException e){ + throw new JavaModelException(e, IJavaModelStatusConstants.ELEMENT_DOES_NOT_EXIST); // could be thrown by ElementTree when path is not found + } catch (CoreException e) { + throw new JavaModelException(e); + } + } /** * @see IPackageFragmentRoot */ @@ -292,12 +421,12 @@ protected PackageFragmentRoot(IResource resource, IJavaProject project, String n -/** - * Returns a new element info for this element. - */ -protected OpenableElementInfo createElementInfo() { - return new PackageFragmentRootInfo(); -} + /** + * Returns a new element info for this element. + */ + protected Object createElementInfo() { + return new PackageFragmentRootInfo(); + } /** * @see IPackageFragmentRoot @@ -340,7 +469,7 @@ public boolean equals(Object o) { PackageFragmentRoot other = (PackageFragmentRoot) o; return getJavaModel().equals(other.getJavaModel()) && this.resource.equals(other.resource) && - fOccurrenceCount == other.fOccurrenceCount; + occurrenceCount == other.occurrenceCount; } /** @@ -461,6 +590,12 @@ protected char getHandleMementoDelimiter() { return JavaElement.JEM_PACKAGEFRAGMENTROOT; } /** + * @see IJavaElement + */ +public int getElementType() { + return PACKAGE_FRAGMENT_ROOT; +} +/** * @see JavaElement#getHandleMemento() */ public String getHandleMemento(){ @@ -791,16 +926,16 @@ public boolean isExternal() { // } //} -/* - * @see JavaElement#rootedAt(IJavaProject) - */ -public IJavaElement rootedAt(IJavaProject project) { - return - new PackageFragmentRoot( - getResource(), - project, - fName); -} +///* +// * @see JavaElement#rootedAt(IJavaProject) +// */ +//public IJavaElement rootedAt(IJavaProject project) { +// return +// new PackageFragmentRoot( +// getResource(), +// project, +// name); +//} /** * @private Debugging purposes