*******************************************************************************/
package net.sourceforge.phpdt.internal.core;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Map;
+
import net.sourceforge.phpdt.core.ICompilationUnit;
import net.sourceforge.phpdt.core.IJavaElement;
-import net.sourceforge.phpdt.core.IJavaProject;
import net.sourceforge.phpdt.core.IPackageFragment;
import net.sourceforge.phpdt.core.IPackageFragmentRoot;
import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.WorkingCopyOwner;
+import net.sourceforge.phpdt.internal.core.util.MementoTokenizer;
+import net.sourceforge.phpdt.internal.core.util.Util;
+import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil;
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.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
* Constant empty list of compilation units
*/
protected static ICompilationUnit[] fgEmptyCompilationUnitList= new ICompilationUnit[] {};
-/**
- * Constructs a handle for a package fragment
- *
- * @see IPackageFragment
- */
-protected PackageFragment(IPackageFragmentRoot root, String name) {
- super(PACKAGE_FRAGMENT, null, name);
-}
-/**
- * Compute the children of this package fragment.
- *
- * <p>Package fragments which are folders recognize files based on the
- * type of the fragment
- * <p>Package fragments which are in a jar only recognize .class files (
- * @see JarPackageFragment).
- */
+ /**
+ * Constructs a handle for a package fragment
+ *
+ * @see IPackageFragment
+ */
+ protected PackageFragment(PackageFragmentRoot root, String name) {
+ super(root, name);
+ }
+ /**
+ * @see Openable
+ */
+ protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws JavaModelException {
+
+ // check whether this pkg can be opened
+ if (!underlyingResource.isAccessible()) throw newNotPresentException();
+
+ int kind = getKind();
+ String extType;
+// if (kind == IPackageFragmentRoot.K_SOURCE) {
+ extType = "php"; //EXTENSION_java;
+// } else {
+// extType = EXTENSION_class;
+// }
+
+ // add compilation units/class files from resources
+ HashSet vChildren = new HashSet();
+ try {
+ PackageFragmentRoot root = getPackageFragmentRoot();
+// char[][] inclusionPatterns = root.fullInclusionPatternChars();
+ char[][] exclusionPatterns = root.fullExclusionPatternChars();
+ IResource[] members = ((IContainer) underlyingResource).members();
+ for (int i = 0, max = members.length; i < max; i++) {
+ IResource child = members[i];
+ if (child.getType() != IResource.FOLDER
+ && !Util.isExcluded(child, exclusionPatterns)) {
+ String extension = child.getProjectRelativePath().getFileExtension();
+ if (extension != null) {
+ if (extension.equalsIgnoreCase(extType)) {
+ IJavaElement childElement;
+// if (kind == IPackageFragmentRoot.K_SOURCE && ProjectPrefUtil.isValidCompilationUnitName(child.getName())) {
+// childElement = new CompilationUnit(this, child.getName(), DefaultWorkingCopyOwner.PRIMARY);
+// vChildren.add(childElement);
+// } else if (ProjectPrefUtil.isValidClassFileName(child.getName())) {
+// childElement = getClassFile(child.getName());
+// vChildren.add(childElement);
+// }
+ }
+ }
+ }
+ }
+ } catch (CoreException e) {
+ throw new JavaModelException(e);
+ }
+
+// if (kind == IPackageFragmentRoot.K_SOURCE) {
+// // add primary compilation units
+// ICompilationUnit[] primaryCompilationUnits = getCompilationUnits(DefaultWorkingCopyOwner.PRIMARY);
+// for (int i = 0, length = primaryCompilationUnits.length; i < length; i++) {
+// ICompilationUnit primary = primaryCompilationUnits[i];
+// vChildren.add(primary);
+// }
+// }
+
+ IJavaElement[] children = new IJavaElement[vChildren.size()];
+ vChildren.toArray(children);
+ info.setChildren(children);
+ return true;
+ }
+///**
+// * Compute the children of this package fragment.
+// *
+// * <p>Package fragments which are folders recognize files based on the
+// * type of the fragment
+// * <p>Package fragments which are in a jar only recognize .class files (
+// * @see JarPackageFragment).
+// */
//protected boolean computeChildren(OpenableElementInfo info, IResource resource) throws JavaModelException {
// ArrayList vChildren = new ArrayList();
-// int kind = getKind();
+//// int kind = getKind();
// String extType;
-// if (kind == IPackageFragmentRoot.K_SOURCE) {
-// extType = "java"; //$NON-NLS-1$
-// } else {
-// extType = "class"; //$NON-NLS-1$
-// }
+//// if (kind == IPackageFragmentRoot.K_SOURCE) {
+// extType = "php"; //$NON-NLS-1$
+//// } else {
+//// extType = "class"; //$NON-NLS-1$
+//// }
// try {
// char[][] exclusionPatterns = ((PackageFragmentRoot)getPackageFragmentRoot()).fullExclusionPatternChars();
// IResource[] members = ((IContainer) resource).members();
// for (int i = 0, max = members.length; i < max; i++) {
// IResource child = members[i];
// if (child.getType() != IResource.FOLDER
-// && !Util.isExcluded(child, exclusionPatterns)) {
+// && !ProjectPrefUtil.isExcluded(child, exclusionPatterns)) {
// String extension = child.getProjectRelativePath().getFileExtension();
// if (extension != null) {
// if (extension.equalsIgnoreCase(extType)) {
// IJavaElement childElement;
-// if (kind == IPackageFragmentRoot.K_SOURCE && Util.isValidCompilationUnitName(child.getName())) {
-// childElement = getCompilationUnit(child.getName());
-// vChildren.add(childElement);
-// } else if (Util.isValidClassFileName(child.getName())) {
-// childElement = getClassFile(child.getName());
-// vChildren.add(childElement);
-// }
+//// if (kind == IPackageFragmentRoot.K_SOURCE && ProjectPrefUtil.isValidCompilationUnitName(child.getName())) {
+//// childElement = getCompilationUnit(child.getName());
+//// vChildren.add(childElement);
+//// } else if (ProjectPrefUtil.isValidClassFileName(child.getName())) {
+//// childElement = getClassFile(child.getName());
+//// vChildren.add(childElement);
+//// }
// }
// }
// }
*/
//public void copy(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) throws JavaModelException {
// if (container == null) {
-// throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$
+// throw new IllegalArgumentException(ProjectPrefUtil.bind("operation.nullContainer")); //$NON-NLS-1$
// }
// IJavaElement[] elements= new IJavaElement[] {this};
// IJavaElement[] containers= new IJavaElement[] {container};
/**
* @see JavaElement
*/
-//protected OpenableElementInfo createElementInfo() {
-// return new PackageFragmentInfo();
-//}
+protected Object createElementInfo() {
+ return new PackageFragmentInfo();
+}
/**
* @see ISourceManipulation
*/
// IJavaElement[] elements = new IJavaElement[] {this};
// getJavaModel().delete(elements, force, monitor);
//}
-/**
- * @see Openable
- */
+///**
+// * @see Openable
+// */
//protected boolean generateInfos(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws JavaModelException {
//
// return computeChildren(info, underlyingResource);
//}
/**
* @see IPackageFragment#getCompilationUnit(String)
+ * @exception IllegalArgumentExcpetion if the name does not end with a php file extension
*/
-public ICompilationUnit getCompilationUnit(String name) {
- return new CompilationUnit(this, name);
+public ICompilationUnit getCompilationUnit(String cuName) {
+ if (! PHPFileUtil.isValidPHPUnitName(cuName)) {
+ throw new IllegalArgumentException(Util.bind("convention.unit.notJavaName")); //$NON-NLS-1$
+ }
+ return new CompilationUnit(this, cuName, DefaultWorkingCopyOwner.PRIMARY);
}
/**
* @see IPackageFragment#getCompilationUnits()
*/
-//public ICompilationUnit[] getCompilationUnits() throws JavaModelException {
-// if (getKind() == IPackageFragmentRoot.K_BINARY) {
-// return fgEmptyCompilationUnitList;
-// }
-//
-// ArrayList list = getChildrenOfType(COMPILATION_UNIT);
-// ICompilationUnit[] array= new ICompilationUnit[list.size()];
-// list.toArray(array);
-// return array;
-//}
+public ICompilationUnit[] getCompilationUnits() throws JavaModelException {
+ if (getKind() == IPackageFragmentRoot.K_BINARY) {
+ return fgEmptyCompilationUnitList;
+ }
+
+ ArrayList list = getChildrenOfType(COMPILATION_UNIT);
+ ICompilationUnit[] array= new ICompilationUnit[list.size()];
+ list.toArray(array);
+ return array;
+}
+/**
+ * @see IJavaElement
+ */
+public int getElementType() {
+ return PACKAGE_FRAGMENT;
+}
+/*
+ * @see JavaElement
+ */
+public IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) {
+ switch (token.charAt(0)) {
+ case JEM_COUNT:
+ return getHandleUpdatingCountFromMemento(memento, owner);
+// case JEM_CLASSFILE:
+// String classFileName = memento.nextToken();
+// JavaElement classFile = (JavaElement)getClassFile(classFileName);
+// return classFile.getHandleFromMemento(memento, owner);
+ case JEM_COMPILATIONUNIT:
+ String cuName = memento.nextToken();
+ JavaElement cu = new CompilationUnit(this, cuName, owner);
+ return cu.getHandleFromMemento(memento, owner);
+ }
+ return null;
+}
/**
* @see JavaElement#getHandleMementoDelimiter()
*/
/**
* @see IPackageFragment#getKind()
*/
-//public int getKind() throws JavaModelException {
-// return ((IPackageFragmentRoot)getParent()).getKind();
-//}
+public int getKind() throws JavaModelException {
+ return ((IPackageFragmentRoot)getParent()).getKind();
+}
/**
* Returns an array of non-java resources contained in the receiver.
*/
/**
* @see IJavaElement#getPath()
*/
-//public IPath getPath() {
-// PackageFragmentRoot root = this.getPackageFragmentRoot();
-// if (root.isArchive()) {
-// return root.getPath();
-// } else {
+public IPath getPath() {
+ PackageFragmentRoot root = this.getPackageFragmentRoot();
+ if (root.isArchive()) {
+ return root.getPath();
+ } else {
// return root.getPath().append(this.getElementName().replace('.', '/'));
-// }
-//}
+ return root.getPath().append(this.getElementName());
+ }
+}
/**
* @see IJavaElement#getResource()
*/
if (elementName.length() == 0) {
return root.getResource();
} else {
- return ((IContainer)root.getResource()).getFolder(new Path(this.getElementName().replace('.', '/')));
+// return ((IContainer)root.getResource()).getFolder(new Path(this.getElementName().replace('.', '/')));
+ return ((IContainer)root.getResource()).getFolder(new Path(this.getElementName()));
}
}
}
* @see IJavaElement#getUnderlyingResource()
*/
public IResource getUnderlyingResource() throws JavaModelException {
- IResource rootResource = fParent.getUnderlyingResource();
+ IResource rootResource = parent.getUnderlyingResource();
if (rootResource == null) {
//jar package fragment root that has no associated resource
return null;
*/
//public void move(IJavaElement container, IJavaElement sibling, String rename, boolean force, IProgressMonitor monitor) throws JavaModelException {
// if (container == null) {
-// throw new IllegalArgumentException(Util.bind("operation.nullContainer")); //$NON-NLS-1$
+// throw new IllegalArgumentException(ProjectPrefUtil.bind("operation.nullContainer")); //$NON-NLS-1$
// }
// IJavaElement[] elements= new IJavaElement[] {this};
// IJavaElement[] containers= new IJavaElement[] {container};
*/
//public void rename(String name, boolean force, IProgressMonitor monitor) throws JavaModelException {
// if (name == null) {
-// throw new IllegalArgumentException(Util.bind("element.nullName")); //$NON-NLS-1$
+// throw new IllegalArgumentException(ProjectPrefUtil.bind("element.nullName")); //$NON-NLS-1$
// }
// IJavaElement[] elements= new IJavaElement[] {this};
// IJavaElement[] dests= new IJavaElement[] {this.getParent()};
// String[] renamings= new String[] {name};
// getJavaModel().rename(elements, dests, renamings, force, monitor);
//}
-/*
- * @see JavaElement#rootedAt(IJavaProject)
- */
-public IJavaElement rootedAt(IJavaProject project) {
- return
- new PackageFragment(
- (IPackageFragmentRoot)((JavaElement)fParent).rootedAt(project),
- fName);
-}
+///*
+// * @see JavaElement#rootedAt(IJavaProject)
+// */
+//public IJavaElement rootedAt(IJavaProject project) {
+// return
+// new PackageFragment(
+// (IPackageFragmentRoot)((JavaElement)parent).rootedAt(project),
+// name);
+//}
/**
* Debugging purposes
*/