3m9 compatible;
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / PackageFragmentRoot.java
index f3e3f82..f73c8bd 100644 (file)
@@ -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