*******************************************************************************/
package net.sourceforge.phpdt.internal.core;
+import java.util.ArrayList;
import java.util.Map;
import net.sourceforge.phpdt.core.IJavaElement;
import net.sourceforge.phpdt.core.IPackageFragment;
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.phpeclipse.PHPCore;
+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;
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;
/**
*/
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
*/
-/**
- * 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
PackageFragmentRoot other = (PackageFragmentRoot) o;
return getJavaModel().equals(other.getJavaModel()) &&
this.resource.equals(other.resource) &&
- fOccurrenceCount == other.fOccurrenceCount;
+ occurrenceCount == other.occurrenceCount;
}
/**
return JavaElement.JEM_PACKAGEFRAGMENTROOT;
}
/**
+ * @see IJavaElement
+ */
+public int getElementType() {
+ return PACKAGE_FRAGMENT_ROOT;
+}
+/**
* @see JavaElement#getHandleMemento()
*/
public String getHandleMemento(){
* of this root.
*/
protected QualifiedName getSourceAttachmentPropertyName() throws JavaModelException {
- return new QualifiedName(PHPCore.PLUGIN_ID, "sourceattachment: " + this.getPath().toOSString()); //$NON-NLS-1$
+ return new QualifiedName(JavaCore.PLUGIN_ID, "sourceattachment: " + this.getPath().toOSString()); //$NON-NLS-1$
}
public void setSourceAttachmentProperty(String property) {
// }
//}
-/*
- * @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