/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ 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.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.core.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; /** * @see IPackageFragment */ public class PackageFragment extends Openable implements IPackageFragment { /** * Constant empty list of compilation units */ protected static ICompilationUnit[] fgEmptyCompilationUnitList = new ICompilationUnit[] {}; /** * 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. // * // *

Package fragments which are folders recognize files based on the // * type of the fragment // *

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(); // String extType; // // 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 // && !ProjectPrefUtil.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 = getCompilationUnit(child.getName()); // // vChildren.add(childElement); // // } else if (ProjectPrefUtil.isValidClassFileName(child.getName())) { // // childElement = getClassFile(child.getName()); // // vChildren.add(childElement); // // } // } // } // } // } // } catch (CoreException e) { // throw new JavaModelException(e); // } // IJavaElement[] children = new IJavaElement[vChildren.size()]; // vChildren.toArray(children); // info.setChildren(children); // return true; // } /** * Returns true if this fragment contains at least one java resource. * Returns false otherwise. */ // public boolean containsJavaResources() throws JavaModelException { // return ((PackageFragmentInfo) getElementInfo()).containsJavaResources(); // } /** * @see ISourceManipulation */ // public void copy(IJavaElement container, IJavaElement sibling, String // rename, boolean force, IProgressMonitor monitor) throws // JavaModelException { // if (container == null) { // throw new // IllegalArgumentException(ProjectPrefUtil.bind("operation.nullContainer")); // //$NON-NLS-1$ // } // IJavaElement[] elements= new IJavaElement[] {this}; // IJavaElement[] containers= new IJavaElement[] {container}; // IJavaElement[] siblings= null; // if (sibling != null) { // siblings= new IJavaElement[] {sibling}; // } // String[] renamings= null; // if (rename != null) { // renamings= new String[] {rename}; // } // getJavaModel().copy(elements, containers, siblings, renamings, force, // monitor); // } /** * @see IPackageFragment */ public ICompilationUnit createCompilationUnit(String name, String contents, boolean force, IProgressMonitor monitor) throws JavaModelException { // CreateCompilationUnitOperation op= new // CreateCompilationUnitOperation(this, name, contents, force); // runOperation(op, monitor); // return getCompilationUnit(name); return null; } /** * @see JavaElement */ protected Object createElementInfo() { return new PackageFragmentInfo(); } /** * @see ISourceManipulation */ // public void delete(boolean force, IProgressMonitor monitor) throws // JavaModelException { // IJavaElement[] elements = new IJavaElement[] {this}; // getJavaModel().delete(elements, force, monitor); // } // /** // * @see Openable // */ // protected boolean generateInfos(OpenableElementInfo info, // IProgressMonitor pm, Map newElements, IResource underlyingResource) // throws JavaModelException { // // return computeChildren(info, underlyingResource); // } // /** // * @see IPackageFragment#getClassFile(String) // */ // public IClassFile getClassFile(String name) { // return new ClassFile(this, name); // } /** * Returns a the collection of class files in this - a folder package * fragment which has a root that has its kind set to * IPackageFragmentRoot.K_Source does not recognize class * files. * * @see IPackageFragment#getClassFiles() */ // public IClassFile[] getClassFiles() throws JavaModelException { // if (getKind() == IPackageFragmentRoot.K_SOURCE) { // return fgEmptyClassFileList; // } // // ArrayList list = getChildrenOfType(CLASS_FILE); // IClassFile[] array= new IClassFile[list.size()]; // list.toArray(array); // return array; // } /** * @see IPackageFragment#getCompilationUnit(String) * @exception IllegalArgumentExcpetion * if the name does not end with a php file extension */ 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; } /** * @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() */ protected char getHandleMementoDelimiter() { return JavaElement.JEM_PACKAGEFRAGMENT; } /** * @see IPackageFragment#getKind() */ public int getKind() throws JavaModelException { return ((IPackageFragmentRoot) getParent()).getKind(); } /** * Returns an array of non-java resources contained in the receiver. */ // public Object[] getNonJavaResources() throws JavaModelException { // if (this.isDefaultPackage()) { // // We don't want to show non java resources of the default package (see // PR #1G58NB8) // return JavaElementInfo.NO_NON_JAVA_RESOURCES; // } else { // return ((PackageFragmentInfo) // getElementInfo()).getNonJavaResources(getResource(), // (PackageFragmentRoot)getPackageFragmentRoot()); // } // } /** * @see IJavaElement#getPath() */ 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() */ public IResource getResource() { PackageFragmentRoot root = this.getPackageFragmentRoot(); if (root.isArchive()) { return root.getResource(); } else { String elementName = this.getElementName(); 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())); } } } /** * @see IJavaElement#getUnderlyingResource() */ public IResource getUnderlyingResource() throws JavaModelException { IResource rootResource = parent.getUnderlyingResource(); if (rootResource == null) { // jar package fragment root that has no associated resource return null; } // the underlying resource may be a folder or a project (in the case // that the project folder // is atually the package fragment root) // if (rootResource.getType() == IResource.FOLDER || // rootResource.getType() == IResource.PROJECT) { // IContainer folder = (IContainer) rootResource; // String[] segs = Signature.getSimpleNames(fName); // for (int i = 0; i < segs.length; ++i) { // IResource child = folder.findMember(segs[i]); // if (child == null || child.getType() != IResource.FOLDER) { // throw newNotPresentException(); // } // folder = (IFolder) child; // } // return folder; // } else { return rootResource; // } } /** * @see IPackageFragment#hasSubpackages() */ // public boolean hasSubpackages() throws JavaModelException { // IJavaElement[] packages= // ((IPackageFragmentRoot)getParent()).getChildren(); // String name = getElementName(); // int nameLength = name.length(); // String packageName = isDefaultPackage() ? name : name+"."; //$NON-NLS-1$ // for (int i= 0; i < packages.length; i++) { // String otherName = packages[i].getElementName(); // if (otherName.length() > nameLength && otherName.startsWith(packageName)) // { // return true; // } // } // return false; // } /** * @see IPackageFragment#isDefaultPackage() */ public boolean isDefaultPackage() { return this.getElementName().length() == 0; } /** * @see ISourceManipulation#move(IJavaElement, IJavaElement, String, * boolean, IProgressMonitor) */ // public void move(IJavaElement container, IJavaElement sibling, String // rename, boolean force, IProgressMonitor monitor) throws // JavaModelException { // if (container == null) { // throw new // IllegalArgumentException(ProjectPrefUtil.bind("operation.nullContainer")); // //$NON-NLS-1$ // } // IJavaElement[] elements= new IJavaElement[] {this}; // IJavaElement[] containers= new IJavaElement[] {container}; // IJavaElement[] siblings= null; // if (sibling != null) { // siblings= new IJavaElement[] {sibling}; // } // String[] renamings= null; // if (rename != null) { // renamings= new String[] {rename}; // } // getJavaModel().move(elements, containers, siblings, renamings, force, // monitor); // } // protected void openWhenClosed(IProgressMonitor pm) throws // JavaModelException { // if (!this.resourceExists()) throw newNotPresentException(); // super.openWhenClosed(pm); // } /** * Recomputes the children of this element, based on the current state of * the workbench. */ // public void refreshChildren() { // try { // OpenableElementInfo info= (OpenableElementInfo)getElementInfo(); // computeChildren(info, getResource()); // } catch (JavaModelException e) { // // do nothing. // } // } /** * @see ISourceManipulation#rename(String, boolean, IProgressMonitor) */ // public void rename(String name, boolean force, IProgressMonitor monitor) // throws JavaModelException { // if (name == null) { // 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)parent).rootedAt(project), // name); // } /** * Debugging purposes */ protected void toStringChildren(int tab, StringBuffer buffer, Object info) { if (tab == 0) { super.toStringChildren(tab, buffer, info); } } /** * Debugging purposes */ protected void toStringInfo(int tab, StringBuffer buffer, Object info) { buffer.append(this.tabString(tab)); if (getElementName().length() == 0) { buffer.append("[default]"); //$NON-NLS-1$ } else { buffer.append(getElementName()); } if (info == null) { buffer.append(" (not open)"); //$NON-NLS-1$ } else { if (tab > 0) { buffer.append(" (...)"); //$NON-NLS-1$ } } } }