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 a07e245..bc678a6 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 @@ -36,959 +36,1077 @@ import org.eclipse.core.runtime.QualifiedName; /** * @see IPackageFragmentRoot */ -public class PackageFragmentRoot extends Openable implements IPackageFragmentRoot { - - /** - * The delimiter between the source path and root path in the attachment server property. - */ - protected final static char ATTACHMENT_PROPERTY_DELIMITER = '*'; - - /* - * No source attachment property - */ - protected final static String NO_SOURCE_ATTACHMENT = ""; //$NON-NLS-1$ - - /* - * No source mapper singleton - */ - // protected final static SourceMapper NO_SOURCE_MAPPER = new SourceMapper(); - /** - * The resource associated with this root. (an IResource or a java.io.File (for external jar only)) - */ - protected Object 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 - */ - //public void attachSource(IPath sourcePath, IPath rootPath, IProgressMonitor monitor) throws JavaModelException { - // try { - // verifyAttachSource(sourcePath); - // if (monitor != null) { - // monitor.beginTask(ProjectPrefUtil.bind("element.attachingSource"), 2); //$NON-NLS-1$ - // } - // SourceMapper oldMapper= getSourceMapper(); - // IWorkspace workspace = ResourcesPlugin.getWorkspace(); - // boolean rootNeedsToBeClosed= false; - // - // if (sourcePath == null) { - // //source being detached - // rootNeedsToBeClosed= true; - // setSourceMapper(null); - // /* Disable deltas (see 1GDTUSD) - // // fire a delta to notify the UI about the source detachement. - // JavaModelManager manager = (JavaModelManager) JavaModelManager.getJavaModelManager(); - // JavaModel model = (JavaModel) getJavaModel(); - // JavaElementDelta attachedSourceDelta = new JavaElementDelta(model); - // attachedSourceDelta .sourceDetached(this); // this would be a PackageFragmentRoot - // manager.registerResourceDelta(attachedSourceDelta ); - // manager.fire(); // maybe you want to fire the change later. Let us know about it. - // */ - // } else { - // /* - // // fire a delta to notify the UI about the source attachement. - // JavaModelManager manager = (JavaModelManager) JavaModelManager.getJavaModelManager(); - // JavaModel model = (JavaModel) getJavaModel(); - // JavaElementDelta attachedSourceDelta = new JavaElementDelta(model); - // attachedSourceDelta .sourceAttached(this); // this would be a PackageFragmentRoot - // manager.registerResourceDelta(attachedSourceDelta ); - // manager.fire(); // maybe you want to fire the change later. Let us know about it. - // */ - // - // //check if different from the current attachment - // IPath storedSourcePath= getSourceAttachmentPath(); - // IPath storedRootPath= getSourceAttachmentRootPath(); - // if (monitor != null) { - // monitor.worked(1); - // } - // if (storedSourcePath != null) { - // if (!(storedSourcePath.equals(sourcePath) && (rootPath != null && rootPath.equals(storedRootPath)) || storedRootPath == null)) - // { - // rootNeedsToBeClosed= true; - // } - // } - // // check if source path is valid - // Object target = JavaModel.getTarget(workspace.getRoot(), sourcePath, false); - // if (target == null) { - // if (monitor != null) { - // monitor.done(); - // } - // throw new JavaModelException(new JavaModelStatus(IJavaModelStatusConstants.INVALID_PATH, sourcePath)); - // } - // SourceMapper mapper = createSourceMapper(sourcePath, rootPath); - // if (rootPath == null && mapper.rootPath != null) { - // // as a side effect of calling the SourceMapper constructor, the root path was computed - // rootPath = new Path(mapper.rootPath); - // } - // setSourceMapper(mapper); - // } - // if (sourcePath == null) { - // setSourceAttachmentProperty(null); //remove the property - // } else { - // //set the property to the path of the mapped source - // setSourceAttachmentProperty( - // sourcePath.toString() - // + (rootPath == null ? "" : (ATTACHMENT_PROPERTY_DELIMITER + rootPath.toString()))); //$NON-NLS-1$ - // } - // if (rootNeedsToBeClosed) { - // if (oldMapper != null) { - // oldMapper.close(); - // } - // BufferManager manager= BufferManager.getDefaultBufferManager(); - // Enumeration openBuffers= manager.getOpenBuffers(); - // while (openBuffers.hasMoreElements()) { - // IBuffer buffer= (IBuffer) openBuffers.nextElement(); - // IOpenable possibleMember= buffer.getOwner(); - // if (isAncestorOf((IJavaElement) possibleMember)) { - // buffer.close(); - // } - // } - // if (monitor != null) { - // monitor.worked(1); - // } - // } - // } catch (JavaModelException e) { - // setSourceAttachmentProperty(null); // loose info - will be recomputed - // throw e; - // } finally { - // if (monitor != null) { - // monitor.done(); - // } - // } - //} - //SourceMapper createSourceMapper(IPath sourcePath, IPath rootPath) { - // SourceMapper mapper = new SourceMapper( - // sourcePath, - // rootPath == null ? null : rootPath.toOSString(), - // this.isExternal() ? JavaCore.getOptions() : this.getJavaProject().getOptions(true)); // only project options if associated with - // resource - // return mapper; - //} - /* - * @see net.sourceforge.phpdt.core.IPackageFragmentRoot#delete - */ - //public void delete( - // int updateResourceFlags, - // int updateModelFlags, - // IProgressMonitor monitor) - // throws JavaModelException { - // - // DeletePackageFragmentRootOperation op = new DeletePackageFragmentRootOperation(this, updateResourceFlags, updateModelFlags); - // runOperation(op, monitor); - //} - /** - * This root is being closed. If this root has an associated source attachment, close it too. - * - * @see JavaElement - */ - //protected void closing(Object info) throws JavaModelException { TODO remove after 2.1 - // ((PackageFragmentRootInfo) info).sourceMapper = null; - // super.closing(info); - //} - /** - * 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) throws JavaModelException { - // 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 resource = getResource(); - // if (resource.getType() == IResource.FOLDER || resource.getType() == IResource.PROJECT) { - // ArrayList vChildren = new ArrayList(5); - // char[][] exclusionPatterns = fullExclusionPatternChars(); - // computeFolderChildren((IContainer) resource, "", 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, String prefix, ArrayList vChildren, char[][] exclusionPatterns) throws - // JavaModelException { - // IPackageFragment pkg = getPackageFragment(prefix); - // vChildren.add(pkg); - // try { - // JavaProject javaProject = (JavaProject)getJavaProject(); - // IResource[] members = folder.members(); - // for (int i = 0, max = members.length; i < max; i++) { - // IResource member = members[i]; - // String memberName = member.getName(); - // if (member.getType() == IResource.FOLDER - // && ProjectPrefUtil.isValidFolderNameForPackage(memberName) - // && !ProjectPrefUtil.isExcluded(member, exclusionPatterns)) { - // - // // 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, newPrefix, vChildren, exclusionPatterns); - // } - // } - // } - // } 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); - // } - //} - /* - * Computes and returns the source attachment root path for the given source attachment path. Returns null if none - * could be found. - * - * @param sourceAttachmentPath the given absolute path to the source archive or folder @return the computed source attachment root - * path or null if none could be found @throws JavaModelException - */ - //public IPath computeSourceAttachmentRootPath(IPath sourceAttachmentPath) throws JavaModelException { - // IPath sourcePath = this.getSourceAttachmentPath(); - // if (sourcePath == null) return null; - // SourceMapper mapper = - // new SourceMapper( - // sourcePath, - // null, // detect root path - // this.isExternal() ? JavaCore.getOptions() : this.getJavaProject().getOptions(true) // only project options if associated with - // resource - // ); - // if (mapper.rootPath == null) return null; - // return new Path(mapper.rootPath); - //} - /* - * @see net.sourceforge.phpdt.core.IPackageFragmentRoot#copy - */ - //public void copy( - // IPath destination, - // int updateResourceFlags, - // int updateModelFlags, - // IClasspathEntry sibling, - // IProgressMonitor monitor) - // throws JavaModelException { - // - // CopyPackageFragmentRootOperation op = - // new CopyPackageFragmentRootOperation(this, destination, updateResourceFlags, updateModelFlags, sibling); - // runOperation(op, monitor); - //} - - /** - * Returns a new element info for this element. - */ - protected Object createElementInfo() { - return new PackageFragmentRootInfo(); - } - - /** - * @see IPackageFragmentRoot - */ - //public IPackageFragment createPackageFragment(String name, boolean force, IProgressMonitor monitor) throws JavaModelException { - // CreatePackageFragmentOperation op = new CreatePackageFragmentOperation(this, name, force); - // runOperation(op, monitor); - // return getPackageFragment(name); - //} - /** - * 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; - //} - /** - * Compares two objects for equality; for PackageFragmentRoots, equality is having the same JavaModel, - * same resources, and occurrence count. - * - */ - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof PackageFragmentRoot)) - return false; - PackageFragmentRoot other = (PackageFragmentRoot) o; - return getJavaModel().equals(other.getJavaModel()) && this.resource.equals(other.resource) - && occurrenceCount == other.occurrenceCount; - } - - /** - * @see IJavaElement - */ - //public boolean exists() { - // return super.exists() - // && isOnClasspath(); - //} - //public IClasspathEntry findSourceAttachmentRecommendation() { - // try { - // IPath rootPath = this.getPath(); - // IClasspathEntry entry; - // IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); - // - // // try on enclosing project first - // JavaProject parentProject = (JavaProject) getJavaProject(); - // try { - // entry = parentProject.getClasspathEntryFor(rootPath); - // if (entry != null){ - // Object target = JavaModel.getTarget(workspaceRoot, entry.getSourceAttachmentPath(), true); - // if (target instanceof IFile){ - // IFile file = (IFile) target; - // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ - // return entry; - // } - // } else if (target instanceof IFolder) { - // return entry; - // } - // if (target instanceof java.io.File){ - // java.io.File file = (java.io.File) target; - // if (file.isFile()) { - // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ - // return entry; - // } - // } else { - // // external directory - // return entry; - // } - // } - // } - // } catch(JavaModelException e){ - // } - // - // // iterate over all projects - // IJavaModel model = getJavaModel(); - // IJavaProject[] jProjects = model.getJavaProjects(); - // for (int i = 0, max = jProjects.length; i < max; i++){ - // JavaProject jProject = (JavaProject) jProjects[i]; - // if (jProject == parentProject) continue; // already done - // try { - // entry = jProject.getClasspathEntryFor(rootPath); - // if (entry != null){ - // Object target = JavaModel.getTarget(workspaceRoot, entry.getSourceAttachmentPath(), true); - // if (target instanceof IFile){ - // IFile file = (IFile) target; - // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ - // return entry; - // } - // } else if (target instanceof IFolder) { - // return entry; - // } - // if (target instanceof java.io.File){ - // java.io.File file = (java.io.File) target; - // if (file.isFile()) { - // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ - // return entry; - // } - // } else { - // // external directory - // return entry; - // } - // } - // } - // } catch(JavaModelException e){ - // } - // } - // } catch(JavaModelException e){ - // } - // - // return null; - //} - /* - * Returns the exclusion patterns from the classpath entry associated with this root. - */ - char[][] fullExclusionPatternChars() { - return null; - // try { - - // if (this.isOpen() && this.getKind() != IPackageFragmentRoot.K_SOURCE) return null; - // ClasspathEntry entry = (ClasspathEntry)getRawClasspathEntry(); - // if (entry == null) { - // return null; - // } else { - // return entry.fullExclusionPatternChars(); - // } - // } catch (JavaModelException e) { - // return null; - // } - } - - /** - * @see Openable - */ - protected boolean generateInfos(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) - throws JavaModelException { - - // ((PackageFragmentRootInfo) info).setRootKind(determineKind(underlyingResource)); - // return computeChildren(info); - return false; - } - - /** - * @see JavaElement#getHandleMemento() - */ - protected char getHandleMementoDelimiter() { - return JavaElement.JEM_PACKAGEFRAGMENTROOT; - } - - /** - * @see IJavaElement - */ - public int getElementType() { - return PACKAGE_FRAGMENT_ROOT; - } - - /* - * @see JavaElement - */ - public IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) { - switch (token.charAt(0)) { - case JEM_COUNT: - return getHandleUpdatingCountFromMemento(memento, owner); - case JEM_PACKAGEFRAGMENT: - String pkgName; - if (memento.hasMoreTokens()) { - pkgName = memento.nextToken(); - char firstChar = pkgName.charAt(0); - // if (firstChar == JEM_CLASSFILE || firstChar == JEM_COMPILATIONUNIT || firstChar == JEM_COUNT) { - if (firstChar == JEM_COMPILATIONUNIT || firstChar == JEM_COUNT) { - token = pkgName; - pkgName = IPackageFragment.DEFAULT_PACKAGE_NAME; - } else { - token = null; - } - } else { - pkgName = IPackageFragment.DEFAULT_PACKAGE_NAME; - token = null; - } - JavaElement pkg = (JavaElement) getPackageFragment(pkgName); - if (token == null) { - return pkg.getHandleFromMemento(memento, owner); - } else { - return pkg.getHandleFromMemento(token, memento, owner); - } - } - return null; - } - - /** - * @see JavaElement#getHandleMemento() - */ - public String getHandleMemento() { - IPath path; - IResource underlyingResource = getResource(); - if (underlyingResource != null) { - // internal jar or regular root - if (getResource().getProject().equals(getJavaProject().getProject())) { - path = underlyingResource.getProjectRelativePath(); - } else { - path = underlyingResource.getFullPath(); - } - } else { - // external jar - path = getPath(); - } - StringBuffer buff = new StringBuffer(((JavaElement) getParent()).getHandleMemento()); - buff.append(getHandleMementoDelimiter()); - escapeMementoName(buff, path.toString()); - if (this.occurrenceCount > 1) { - buff.append(JEM_COUNT); - buff.append(this.occurrenceCount); - } - return buff.toString(); - } - - /** - * @see IPackageFragmentRoot - */ - public int getKind() throws JavaModelException { - return ((PackageFragmentRootInfo) getElementInfo()).getRootKind(); - } - - /** - * Returns an array of non-java resources contained in the receiver. - */ - //public Object[] getNonJavaResources() throws JavaModelException { - // return ((PackageFragmentRootInfo) getElementInfo()).getNonJavaResources(getJavaProject(), getResource(), this); - //} - /** - * @see IPackageFragmentRoot - */ - public IPackageFragment getPackageFragment(String packageName) { - if (packageName.indexOf(' ') != -1) { // tolerate package names with spaces (e.g. 'x . y') - // (http://bugs.eclipse.org/bugs/show_bug.cgi?id=21957) - char[][] compoundName = Util.toCompoundChars(packageName); - StringBuffer buffer = new StringBuffer(packageName.length()); - for (int i = 0, length = compoundName.length; i < length; i++) { - buffer.append(CharOperation.trim(compoundName[i])); - if (i != length - 1) { - buffer.append('.'); - } - } - packageName = buffer.toString(); - } - return new PackageFragment(this, packageName); - } - - /** - * Returns the package name for the given folder (which is a decendent of this root). - */ - protected String getPackageName(IFolder folder) throws JavaModelException { - IPath myPath = getPath(); - IPath pkgPath = folder.getFullPath(); - int mySegmentCount = myPath.segmentCount(); - int pkgSegmentCount = pkgPath.segmentCount(); - StringBuffer name = new StringBuffer(IPackageFragment.DEFAULT_PACKAGE_NAME); - for (int i = mySegmentCount; i < pkgSegmentCount; i++) { - if (i > mySegmentCount) { - name.append('.'); - } - name.append(pkgPath.segment(i)); - } - return name.toString(); - } - - /** - * @see IJavaElement - */ - public IPath getPath() { - return getResource().getFullPath(); - } - - /* - * @see IPackageFragmentRoot - */ - //public IClasspathEntry getRawClasspathEntry() throws JavaModelException { - // - // IClasspathEntry rawEntry = null; - // IJavaProject project = this.getJavaProject(); - // project.getResolvedClasspath(true); // force the reverse rawEntry cache to be populated - // JavaModelManager.PerProjectInfo perProjectInfo = - // JavaModelManager.getJavaModelManager().getPerProjectInfoCheckExistence(project.getProject()); - // if (perProjectInfo != null && perProjectInfo.resolvedPathToRawEntries != null) { - // rawEntry = (IClasspathEntry) perProjectInfo.resolvedPathToRawEntries.get(this.getPath()); - // } - // return rawEntry; - //} - /* - * @see IJavaElement - */ - public IResource getResource() { - return (IResource) this.resource; - } - - /** - * @see IPackageFragmentRoot - */ - //public IPath getSourceAttachmentPath() throws JavaModelException { - // if (getKind() != K_BINARY) return null; - // - // String serverPathString= getSourceAttachmentProperty(); - // if (serverPathString == null) { - // return null; - // } - // int index= serverPathString.lastIndexOf(ATTACHMENT_PROPERTY_DELIMITER); - // if (index < 0) { - // // no root path specified - // return new Path(serverPathString); - // } else { - // String serverSourcePathString= serverPathString.substring(0, index); - // return new Path(serverSourcePathString); - // } - //} - /** - * Returns the server property for this package fragment root's source attachement. - */ - //protected String getSourceAttachmentProperty() throws JavaModelException { - // String propertyString = null; - // QualifiedName qName= getSourceAttachmentPropertyName(); - // try { - // propertyString = ResourcesPlugin.getWorkspace().getRoot().getPersistentProperty(qName); - // - // // if no existing source attachment information, then lookup a recommendation from classpath entries - // if (propertyString == null) { - // IClasspathEntry recommendation = findSourceAttachmentRecommendation(); - // if (recommendation != null) { - // IPath rootPath = recommendation.getSourceAttachmentRootPath(); - // propertyString = - // recommendation.getSourceAttachmentPath().toString() - // + ((rootPath == null) - // ? "" : //$NON-NLS-1$ - // (ATTACHMENT_PROPERTY_DELIMITER + rootPath.toString())); - // setSourceAttachmentProperty(propertyString); - // } else { - // // mark as being already looked up - // setSourceAttachmentProperty(NO_SOURCE_ATTACHMENT); - // } - // } else if (NO_SOURCE_ATTACHMENT.equals(propertyString)) { - // // already looked up and no source attachment found - // return null; - // } - // return propertyString; - // } catch (CoreException ce) { - // throw new JavaModelException(ce); - // } - //} - /** - * Returns the qualified name for the source attachment property of this root. - */ - protected QualifiedName getSourceAttachmentPropertyName() throws JavaModelException { - return new QualifiedName(JavaCore.PLUGIN_ID, "sourceattachment: " + this.getPath().toOSString()); //$NON-NLS-1$ - } - - public void setSourceAttachmentProperty(String property) { - try { - ResourcesPlugin.getWorkspace().getRoot().setPersistentProperty(this.getSourceAttachmentPropertyName(), property); - } catch (CoreException ce) { - } - } - - /** - * For use by AttachSourceOperation only. Sets the source mapper associated with this root. - */ - //public void setSourceMapper(SourceMapper mapper) throws JavaModelException { - // ((PackageFragmentRootInfo) getElementInfo()).setSourceMapper(mapper); - //} - - /** - * @see IPackageFragmentRoot - */ - //public IPath getSourceAttachmentRootPath() throws JavaModelException { - // if (getKind() != K_BINARY) return null; - // - // String serverPathString= getSourceAttachmentProperty(); - // if (serverPathString == null) { - // return null; - // } - // int index = serverPathString.lastIndexOf(ATTACHMENT_PROPERTY_DELIMITER); - // if (index == -1) return null; - // String serverRootPathString= IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH; - // if (index != serverPathString.length() - 1) { - // serverRootPathString= serverPathString.substring(index + 1); - // } - // return new Path(serverRootPathString); - //} - /** - * @see JavaElement - */ - //public SourceMapper getSourceMapper() { - // SourceMapper mapper; - // try { - // PackageFragmentRootInfo rootInfo = (PackageFragmentRootInfo) getElementInfo(); - // mapper = rootInfo.getSourceMapper(); - // if (mapper == null) { - // // first call to this method - // IPath sourcePath= getSourceAttachmentPath(); - // if (sourcePath != null) { - // IPath rootPath= getSourceAttachmentRootPath(); - // mapper = this.createSourceMapper(sourcePath, rootPath); - // if (rootPath == null && mapper.rootPath != null) { - // // as a side effect of calling the SourceMapper constructor, the root path was computed - // rootPath = new Path(mapper.rootPath); - // - // //set the property to the path of the mapped source - // this.setSourceAttachmentProperty( - // sourcePath.toString() - // + ATTACHMENT_PROPERTY_DELIMITER - // + rootPath.toString()); - // } - // rootInfo.setSourceMapper(mapper); - // } else { - // // remember that no source is attached - // rootInfo.setSourceMapper(NO_SOURCE_MAPPER); - // mapper = null; - // } - // } else if (mapper == NO_SOURCE_MAPPER) { - // // a previous call to this method found out that no source was attached - // mapper = null; - // } - // } catch (JavaModelException e) { - // // no source can be attached - // mapper = null; - // } - // return mapper; - //} - /** - * @see IJavaElement - */ - public IResource getUnderlyingResource() throws JavaModelException { - if (!exists()) - throw newNotPresentException(); - return getResource(); - } - - public int hashCode() { - return this.resource.hashCode(); - } - - /** - * @see IPackageFragmentRoot - */ - public boolean isArchive() { - return false; - } - - /** - * @see IPackageFragmentRoot - */ - public boolean isExternal() { - return false; - } - - /* - * Returns whether this package fragment root is on the classpath of its project. - */ - //protected boolean isOnClasspath() { - // if (this.getElementType() == IJavaElement.JAVA_PROJECT){ - // return true; - // } - // - // IPath path = this.getPath(); - // try { - // // check package fragment root on classpath of its project - // IJavaProject project = this.getJavaProject(); - // IClasspathEntry[] classpath = project.getResolvedClasspath(true); - // for (int i = 0, length = classpath.length; i < length; i++) { - // IClasspathEntry entry = classpath[i]; - // if (entry.getPath().equals(path)) { - // return true; - // } - // } - // } catch(JavaModelException e){ - // // could not read classpath, then assume it is outside - // } - // return false; - //} - /* - * @see net.sourceforge.phpdt.core.IPackageFragmentRoot#move - */ - //public void move( - // IPath destination, - // int updateResourceFlags, - // int updateModelFlags, - // IClasspathEntry sibling, - // IProgressMonitor monitor) - // throws JavaModelException { - // - // MovePackageFragmentRootOperation op = - // new MovePackageFragmentRootOperation(this, destination, updateResourceFlags, updateModelFlags, sibling); - // runOperation(op, monitor); - //} - // - // - //protected void openWhenClosed(IProgressMonitor pm) throws JavaModelException { - // if (!this.resourceExists() - // || !this.isOnClasspath()) { - // 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); - // } catch (JavaModelException e) { - // // do nothing. - // } - //} - ///* - // * @see JavaElement#rootedAt(IJavaProject) - // */ - //public IJavaElement rootedAt(IJavaProject project) { - // return - // new PackageFragmentRoot( - // getResource(), - // project, - // name); - //} - /** - * @private Debugging purposes - */ - protected void toStringInfo(int tab, StringBuffer buffer, Object info) { - buffer.append(this.tabString(tab)); - if (getElementName().length() == 0) { - buffer.append("[project root]"); //$NON-NLS-1$ - } else { - IPath path = getPath(); - if (getJavaProject().getElementName().equals(path.segment(0))) { - buffer.append(path.removeFirstSegments(1).makeRelative()); - } else { - buffer.append(path); - } - } - if (info == null) { - buffer.append(" (not open)"); //$NON-NLS-1$ - } - } - - /** - * Possible failures: - * - */ - //protected void verifyAttachSource(IPath sourcePath) throws JavaModelException { - // if (!exists()) { - // throw newNotPresentException(); - // } else if (this.getKind() != K_BINARY) { - // throw new JavaModelException(new JavaModelStatus(IJavaModelStatusConstants.INVALID_ELEMENT_TYPES, this)); - // } else if (sourcePath != null && !sourcePath.isAbsolute()) { - // throw new JavaModelException(new JavaModelStatus(IJavaModelStatusConstants.RELATIVE_PATH, sourcePath)); - // } - //} +public class PackageFragmentRoot extends Openable implements + IPackageFragmentRoot { + + /** + * The delimiter between the source path and root path in the attachment + * server property. + */ + protected final static char ATTACHMENT_PROPERTY_DELIMITER = '*'; + + /* + * No source attachment property + */ + protected final static String NO_SOURCE_ATTACHMENT = ""; //$NON-NLS-1$ + + /* + * No source mapper singleton + */ + // protected final static SourceMapper NO_SOURCE_MAPPER = new + // SourceMapper(); + /** + * The resource associated with this root. (an IResource or a java.io.File + * (for external jar only)) + */ + protected Object 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 + */ + // public void attachSource(IPath sourcePath, IPath rootPath, + // IProgressMonitor monitor) throws JavaModelException { + // try { + // verifyAttachSource(sourcePath); + // if (monitor != null) { + // monitor.beginTask(ProjectPrefUtil.bind("element.attachingSource"), 2); + // //$NON-NLS-1$ + // } + // SourceMapper oldMapper= getSourceMapper(); + // IWorkspace workspace = ResourcesPlugin.getWorkspace(); + // boolean rootNeedsToBeClosed= false; + // + // if (sourcePath == null) { + // //source being detached + // rootNeedsToBeClosed= true; + // setSourceMapper(null); + // /* Disable deltas (see 1GDTUSD) + // // fire a delta to notify the UI about the source detachement. + // JavaModelManager manager = (JavaModelManager) + // JavaModelManager.getJavaModelManager(); + // JavaModel model = (JavaModel) getJavaModel(); + // JavaElementDelta attachedSourceDelta = new JavaElementDelta(model); + // attachedSourceDelta .sourceDetached(this); // this would be a + // PackageFragmentRoot + // manager.registerResourceDelta(attachedSourceDelta ); + // manager.fire(); // maybe you want to fire the change later. Let us know + // about it. + // */ + // } else { + // /* + // // fire a delta to notify the UI about the source attachement. + // JavaModelManager manager = (JavaModelManager) + // JavaModelManager.getJavaModelManager(); + // JavaModel model = (JavaModel) getJavaModel(); + // JavaElementDelta attachedSourceDelta = new JavaElementDelta(model); + // attachedSourceDelta .sourceAttached(this); // this would be a + // PackageFragmentRoot + // manager.registerResourceDelta(attachedSourceDelta ); + // manager.fire(); // maybe you want to fire the change later. Let us know + // about it. + // */ + // + // //check if different from the current attachment + // IPath storedSourcePath= getSourceAttachmentPath(); + // IPath storedRootPath= getSourceAttachmentRootPath(); + // if (monitor != null) { + // monitor.worked(1); + // } + // if (storedSourcePath != null) { + // if (!(storedSourcePath.equals(sourcePath) && (rootPath != null && + // rootPath.equals(storedRootPath)) || storedRootPath == null)) + // { + // rootNeedsToBeClosed= true; + // } + // } + // // check if source path is valid + // Object target = JavaModel.getTarget(workspace.getRoot(), sourcePath, + // false); + // if (target == null) { + // if (monitor != null) { + // monitor.done(); + // } + // throw new JavaModelException(new + // JavaModelStatus(IJavaModelStatusConstants.INVALID_PATH, sourcePath)); + // } + // SourceMapper mapper = createSourceMapper(sourcePath, rootPath); + // if (rootPath == null && mapper.rootPath != null) { + // // as a side effect of calling the SourceMapper constructor, the root + // path was computed + // rootPath = new Path(mapper.rootPath); + // } + // setSourceMapper(mapper); + // } + // if (sourcePath == null) { + // setSourceAttachmentProperty(null); //remove the property + // } else { + // //set the property to the path of the mapped source + // setSourceAttachmentProperty( + // sourcePath.toString() + // + (rootPath == null ? "" : (ATTACHMENT_PROPERTY_DELIMITER + + // rootPath.toString()))); //$NON-NLS-1$ + // } + // if (rootNeedsToBeClosed) { + // if (oldMapper != null) { + // oldMapper.close(); + // } + // BufferManager manager= BufferManager.getDefaultBufferManager(); + // Enumeration openBuffers= manager.getOpenBuffers(); + // while (openBuffers.hasMoreElements()) { + // IBuffer buffer= (IBuffer) openBuffers.nextElement(); + // IOpenable possibleMember= buffer.getOwner(); + // if (isAncestorOf((IJavaElement) possibleMember)) { + // buffer.close(); + // } + // } + // if (monitor != null) { + // monitor.worked(1); + // } + // } + // } catch (JavaModelException e) { + // setSourceAttachmentProperty(null); // loose info - will be recomputed + // throw e; + // } finally { + // if (monitor != null) { + // monitor.done(); + // } + // } + // } + // SourceMapper createSourceMapper(IPath sourcePath, IPath rootPath) { + // SourceMapper mapper = new SourceMapper( + // sourcePath, + // rootPath == null ? null : rootPath.toOSString(), + // this.isExternal() ? JavaCore.getOptions() : + // this.getJavaProject().getOptions(true)); // only project options if + // associated with + // resource + // return mapper; + // } + /* + * @see net.sourceforge.phpdt.core.IPackageFragmentRoot#delete + */ + // public void delete( + // int updateResourceFlags, + // int updateModelFlags, + // IProgressMonitor monitor) + // throws JavaModelException { + // + // DeletePackageFragmentRootOperation op = new + // DeletePackageFragmentRootOperation(this, updateResourceFlags, + // updateModelFlags); + // runOperation(op, monitor); + // } + /** + * This root is being closed. If this root has an associated source + * attachment, close it too. + * + * @see JavaElement + */ + // protected void closing(Object info) throws JavaModelException { TODO + // remove after 2.1 + // ((PackageFragmentRootInfo) info).sourceMapper = null; + // super.closing(info); + // } + /** + * 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) throws + // JavaModelException { + // 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 resource = getResource(); + // if (resource.getType() == IResource.FOLDER || resource.getType() == + // IResource.PROJECT) { + // ArrayList vChildren = new ArrayList(5); + // char[][] exclusionPatterns = fullExclusionPatternChars(); + // computeFolderChildren((IContainer) resource, "", 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, String prefix, + // ArrayList vChildren, char[][] exclusionPatterns) throws + // JavaModelException { + // IPackageFragment pkg = getPackageFragment(prefix); + // vChildren.add(pkg); + // try { + // JavaProject javaProject = (JavaProject)getJavaProject(); + // IResource[] members = folder.members(); + // for (int i = 0, max = members.length; i < max; i++) { + // IResource member = members[i]; + // String memberName = member.getName(); + // if (member.getType() == IResource.FOLDER + // && ProjectPrefUtil.isValidFolderNameForPackage(memberName) + // && !ProjectPrefUtil.isExcluded(member, exclusionPatterns)) { + // + // // 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, newPrefix, vChildren, + // exclusionPatterns); + // } + // } + // } + // } 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); + // } + // } + /* + * Computes and returns the source attachment root path for the given source + * attachment path. Returns null if none could be found. + * + * @param sourceAttachmentPath the given absolute path to the source archive + * or folder @return the computed source attachment root path or null + * if none could be found @throws JavaModelException + */ + // public IPath computeSourceAttachmentRootPath(IPath sourceAttachmentPath) + // throws JavaModelException { + // IPath sourcePath = this.getSourceAttachmentPath(); + // if (sourcePath == null) return null; + // SourceMapper mapper = + // new SourceMapper( + // sourcePath, + // null, // detect root path + // this.isExternal() ? JavaCore.getOptions() : + // this.getJavaProject().getOptions(true) // only project options if + // associated with + // resource + // ); + // if (mapper.rootPath == null) return null; + // return new Path(mapper.rootPath); + // } + /* + * @see net.sourceforge.phpdt.core.IPackageFragmentRoot#copy + */ + // public void copy( + // IPath destination, + // int updateResourceFlags, + // int updateModelFlags, + // IClasspathEntry sibling, + // IProgressMonitor monitor) + // throws JavaModelException { + // + // CopyPackageFragmentRootOperation op = + // new CopyPackageFragmentRootOperation(this, destination, + // updateResourceFlags, updateModelFlags, sibling); + // runOperation(op, monitor); + // } + /** + * Returns a new element info for this element. + */ + protected Object createElementInfo() { + return new PackageFragmentRootInfo(); + } + + /** + * @see IPackageFragmentRoot + */ + // public IPackageFragment createPackageFragment(String name, boolean force, + // IProgressMonitor monitor) throws JavaModelException { + // CreatePackageFragmentOperation op = new + // CreatePackageFragmentOperation(this, name, force); + // runOperation(op, monitor); + // return getPackageFragment(name); + // } + /** + * 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; + // } + /** + * Compares two objects for equality; for PackageFragmentRoots, + * equality is having the same JavaModel, same resources, + * and occurrence count. + * + */ + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof PackageFragmentRoot)) + return false; + PackageFragmentRoot other = (PackageFragmentRoot) o; + return getJavaModel().equals(other.getJavaModel()) + && this.resource.equals(other.resource) + && occurrenceCount == other.occurrenceCount; + } + + /** + * @see IJavaElement + */ + // public boolean exists() { + // return super.exists() + // && isOnClasspath(); + // } + // public IClasspathEntry findSourceAttachmentRecommendation() { + // try { + // IPath rootPath = this.getPath(); + // IClasspathEntry entry; + // IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); + // + // // try on enclosing project first + // JavaProject parentProject = (JavaProject) getJavaProject(); + // try { + // entry = parentProject.getClasspathEntryFor(rootPath); + // if (entry != null){ + // Object target = JavaModel.getTarget(workspaceRoot, + // entry.getSourceAttachmentPath(), true); + // if (target instanceof IFile){ + // IFile file = (IFile) target; + // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ + // return entry; + // } + // } else if (target instanceof IFolder) { + // return entry; + // } + // if (target instanceof java.io.File){ + // java.io.File file = (java.io.File) target; + // if (file.isFile()) { + // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ + // return entry; + // } + // } else { + // // external directory + // return entry; + // } + // } + // } + // } catch(JavaModelException e){ + // } + // + // // iterate over all projects + // IJavaModel model = getJavaModel(); + // IJavaProject[] jProjects = model.getJavaProjects(); + // for (int i = 0, max = jProjects.length; i < max; i++){ + // JavaProject jProject = (JavaProject) jProjects[i]; + // if (jProject == parentProject) continue; // already done + // try { + // entry = jProject.getClasspathEntryFor(rootPath); + // if (entry != null){ + // Object target = JavaModel.getTarget(workspaceRoot, + // entry.getSourceAttachmentPath(), true); + // if (target instanceof IFile){ + // IFile file = (IFile) target; + // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ + // return entry; + // } + // } else if (target instanceof IFolder) { + // return entry; + // } + // if (target instanceof java.io.File){ + // java.io.File file = (java.io.File) target; + // if (file.isFile()) { + // if (ProjectPrefUtil.isArchiveFileName(file.getName())){ + // return entry; + // } + // } else { + // // external directory + // return entry; + // } + // } + // } + // } catch(JavaModelException e){ + // } + // } + // } catch(JavaModelException e){ + // } + // + // return null; + // } + /* + * Returns the exclusion patterns from the classpath entry associated with + * this root. + */ + char[][] fullExclusionPatternChars() { + return null; + // try { + + // if (this.isOpen() && this.getKind() != IPackageFragmentRoot.K_SOURCE) + // return null; + // ClasspathEntry entry = (ClasspathEntry)getRawClasspathEntry(); + // if (entry == null) { + // return null; + // } else { + // return entry.fullExclusionPatternChars(); + // } + // } catch (JavaModelException e) { + // return null; + // } + } + + /** + * @see Openable + */ + protected boolean generateInfos(OpenableElementInfo info, + IProgressMonitor pm, Map newElements, IResource underlyingResource) + throws JavaModelException { + + // ((PackageFragmentRootInfo) + // info).setRootKind(determineKind(underlyingResource)); + // return computeChildren(info); + return false; + } + + /** + * @see JavaElement#getHandleMemento() + */ + protected char getHandleMementoDelimiter() { + return JavaElement.JEM_PACKAGEFRAGMENTROOT; + } + + /** + * @see IJavaElement + */ + public int getElementType() { + return PACKAGE_FRAGMENT_ROOT; + } + + /* + * @see JavaElement + */ + public IJavaElement getHandleFromMemento(String token, + MementoTokenizer memento, WorkingCopyOwner owner) { + switch (token.charAt(0)) { + case JEM_COUNT: + return getHandleUpdatingCountFromMemento(memento, owner); + case JEM_PACKAGEFRAGMENT: + String pkgName; + if (memento.hasMoreTokens()) { + pkgName = memento.nextToken(); + char firstChar = pkgName.charAt(0); + // if (firstChar == JEM_CLASSFILE || firstChar == + // JEM_COMPILATIONUNIT || firstChar == JEM_COUNT) { + if (firstChar == JEM_COMPILATIONUNIT || firstChar == JEM_COUNT) { + token = pkgName; + pkgName = IPackageFragment.DEFAULT_PACKAGE_NAME; + } else { + token = null; + } + } else { + pkgName = IPackageFragment.DEFAULT_PACKAGE_NAME; + token = null; + } + JavaElement pkg = (JavaElement) getPackageFragment(pkgName); + if (token == null) { + return pkg.getHandleFromMemento(memento, owner); + } else { + return pkg.getHandleFromMemento(token, memento, owner); + } + } + return null; + } + + /** + * @see JavaElement#getHandleMemento() + */ + public String getHandleMemento() { + IPath path; + IResource underlyingResource = getResource(); + if (underlyingResource != null) { + // internal jar or regular root + if (getResource().getProject() + .equals(getJavaProject().getProject())) { + path = underlyingResource.getProjectRelativePath(); + } else { + path = underlyingResource.getFullPath(); + } + } else { + // external jar + path = getPath(); + } + StringBuffer buff = new StringBuffer(((JavaElement) getParent()) + .getHandleMemento()); + buff.append(getHandleMementoDelimiter()); + escapeMementoName(buff, path.toString()); + if (this.occurrenceCount > 1) { + buff.append(JEM_COUNT); + buff.append(this.occurrenceCount); + } + return buff.toString(); + } + + /** + * @see IPackageFragmentRoot + */ + public int getKind() throws JavaModelException { + return ((PackageFragmentRootInfo) getElementInfo()).getRootKind(); + } + + /** + * Returns an array of non-java resources contained in the receiver. + */ + // public Object[] getNonJavaResources() throws JavaModelException { + // return ((PackageFragmentRootInfo) + // getElementInfo()).getNonJavaResources(getJavaProject(), getResource(), + // this); + // } + /** + * @see IPackageFragmentRoot + */ + public IPackageFragment getPackageFragment(String packageName) { + if (packageName.indexOf(' ') != -1) { // tolerate package names with + // spaces (e.g. 'x . y') + // (http://bugs.eclipse.org/bugs/show_bug.cgi?id=21957) + char[][] compoundName = Util.toCompoundChars(packageName); + StringBuffer buffer = new StringBuffer(packageName.length()); + for (int i = 0, length = compoundName.length; i < length; i++) { + buffer.append(CharOperation.trim(compoundName[i])); + if (i != length - 1) { + buffer.append('.'); + } + } + packageName = buffer.toString(); + } + return new PackageFragment(this, packageName); + } + + /** + * Returns the package name for the given folder (which is a decendent of + * this root). + */ + protected String getPackageName(IFolder folder) throws JavaModelException { + IPath myPath = getPath(); + IPath pkgPath = folder.getFullPath(); + int mySegmentCount = myPath.segmentCount(); + int pkgSegmentCount = pkgPath.segmentCount(); + StringBuffer name = new StringBuffer( + IPackageFragment.DEFAULT_PACKAGE_NAME); + for (int i = mySegmentCount; i < pkgSegmentCount; i++) { + if (i > mySegmentCount) { + name.append('.'); + } + name.append(pkgPath.segment(i)); + } + return name.toString(); + } + + /** + * @see IJavaElement + */ + public IPath getPath() { + return getResource().getFullPath(); + } + + /* + * @see IPackageFragmentRoot + */ + // public IClasspathEntry getRawClasspathEntry() throws JavaModelException { + // + // IClasspathEntry rawEntry = null; + // IJavaProject project = this.getJavaProject(); + // project.getResolvedClasspath(true); // force the reverse rawEntry cache + // to be populated + // JavaModelManager.PerProjectInfo perProjectInfo = + // JavaModelManager.getJavaModelManager().getPerProjectInfoCheckExistence(project.getProject()); + // if (perProjectInfo != null && perProjectInfo.resolvedPathToRawEntries != + // null) { + // rawEntry = (IClasspathEntry) + // perProjectInfo.resolvedPathToRawEntries.get(this.getPath()); + // } + // return rawEntry; + // } + /* + * @see IJavaElement + */ + public IResource getResource() { + return (IResource) this.resource; + } + + /** + * @see IPackageFragmentRoot + */ + // public IPath getSourceAttachmentPath() throws JavaModelException { + // if (getKind() != K_BINARY) return null; + // + // String serverPathString= getSourceAttachmentProperty(); + // if (serverPathString == null) { + // return null; + // } + // int index= serverPathString.lastIndexOf(ATTACHMENT_PROPERTY_DELIMITER); + // if (index < 0) { + // // no root path specified + // return new Path(serverPathString); + // } else { + // String serverSourcePathString= serverPathString.substring(0, index); + // return new Path(serverSourcePathString); + // } + // } + /** + * Returns the server property for this package fragment root's source + * attachement. + */ + // protected String getSourceAttachmentProperty() throws JavaModelException + // { + // String propertyString = null; + // QualifiedName qName= getSourceAttachmentPropertyName(); + // try { + // propertyString = + // ResourcesPlugin.getWorkspace().getRoot().getPersistentProperty(qName); + // + // // if no existing source attachment information, then lookup a + // recommendation from classpath entries + // if (propertyString == null) { + // IClasspathEntry recommendation = findSourceAttachmentRecommendation(); + // if (recommendation != null) { + // IPath rootPath = recommendation.getSourceAttachmentRootPath(); + // propertyString = + // recommendation.getSourceAttachmentPath().toString() + // + ((rootPath == null) + // ? "" : //$NON-NLS-1$ + // (ATTACHMENT_PROPERTY_DELIMITER + rootPath.toString())); + // setSourceAttachmentProperty(propertyString); + // } else { + // // mark as being already looked up + // setSourceAttachmentProperty(NO_SOURCE_ATTACHMENT); + // } + // } else if (NO_SOURCE_ATTACHMENT.equals(propertyString)) { + // // already looked up and no source attachment found + // return null; + // } + // return propertyString; + // } catch (CoreException ce) { + // throw new JavaModelException(ce); + // } + // } + /** + * Returns the qualified name for the source attachment property of this + * root. + */ + protected QualifiedName getSourceAttachmentPropertyName() + throws JavaModelException { + return new QualifiedName(JavaCore.PLUGIN_ID, + "sourceattachment: " + this.getPath().toOSString()); //$NON-NLS-1$ + } + + public void setSourceAttachmentProperty(String property) { + try { + ResourcesPlugin.getWorkspace().getRoot().setPersistentProperty( + this.getSourceAttachmentPropertyName(), property); + } catch (CoreException ce) { + } + } + + /** + * For use by AttachSourceOperation only. Sets the source + * mapper associated with this root. + */ + // public void setSourceMapper(SourceMapper mapper) throws + // JavaModelException { + // ((PackageFragmentRootInfo) getElementInfo()).setSourceMapper(mapper); + // } + /** + * @see IPackageFragmentRoot + */ + // public IPath getSourceAttachmentRootPath() throws JavaModelException { + // if (getKind() != K_BINARY) return null; + // + // String serverPathString= getSourceAttachmentProperty(); + // if (serverPathString == null) { + // return null; + // } + // int index = serverPathString.lastIndexOf(ATTACHMENT_PROPERTY_DELIMITER); + // if (index == -1) return null; + // String serverRootPathString= + // IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH; + // if (index != serverPathString.length() - 1) { + // serverRootPathString= serverPathString.substring(index + 1); + // } + // return new Path(serverRootPathString); + // } + /** + * @see JavaElement + */ + // public SourceMapper getSourceMapper() { + // SourceMapper mapper; + // try { + // PackageFragmentRootInfo rootInfo = (PackageFragmentRootInfo) + // getElementInfo(); + // mapper = rootInfo.getSourceMapper(); + // if (mapper == null) { + // // first call to this method + // IPath sourcePath= getSourceAttachmentPath(); + // if (sourcePath != null) { + // IPath rootPath= getSourceAttachmentRootPath(); + // mapper = this.createSourceMapper(sourcePath, rootPath); + // if (rootPath == null && mapper.rootPath != null) { + // // as a side effect of calling the SourceMapper constructor, the root + // path was computed + // rootPath = new Path(mapper.rootPath); + // + // //set the property to the path of the mapped source + // this.setSourceAttachmentProperty( + // sourcePath.toString() + // + ATTACHMENT_PROPERTY_DELIMITER + // + rootPath.toString()); + // } + // rootInfo.setSourceMapper(mapper); + // } else { + // // remember that no source is attached + // rootInfo.setSourceMapper(NO_SOURCE_MAPPER); + // mapper = null; + // } + // } else if (mapper == NO_SOURCE_MAPPER) { + // // a previous call to this method found out that no source was attached + // mapper = null; + // } + // } catch (JavaModelException e) { + // // no source can be attached + // mapper = null; + // } + // return mapper; + // } + /** + * @see IJavaElement + */ + public IResource getUnderlyingResource() throws JavaModelException { + if (!exists()) + throw newNotPresentException(); + return getResource(); + } + + public int hashCode() { + return this.resource.hashCode(); + } + + /** + * @see IPackageFragmentRoot + */ + public boolean isArchive() { + return false; + } + + /** + * @see IPackageFragmentRoot + */ + public boolean isExternal() { + return false; + } + + /* + * Returns whether this package fragment root is on the classpath of its + * project. + */ + // protected boolean isOnClasspath() { + // if (this.getElementType() == IJavaElement.JAVA_PROJECT){ + // return true; + // } + // + // IPath path = this.getPath(); + // try { + // // check package fragment root on classpath of its project + // IJavaProject project = this.getJavaProject(); + // IClasspathEntry[] classpath = project.getResolvedClasspath(true); + // for (int i = 0, length = classpath.length; i < length; i++) { + // IClasspathEntry entry = classpath[i]; + // if (entry.getPath().equals(path)) { + // return true; + // } + // } + // } catch(JavaModelException e){ + // // could not read classpath, then assume it is outside + // } + // return false; + // } + /* + * @see net.sourceforge.phpdt.core.IPackageFragmentRoot#move + */ + // public void move( + // IPath destination, + // int updateResourceFlags, + // int updateModelFlags, + // IClasspathEntry sibling, + // IProgressMonitor monitor) + // throws JavaModelException { + // + // MovePackageFragmentRootOperation op = + // new MovePackageFragmentRootOperation(this, destination, + // updateResourceFlags, updateModelFlags, sibling); + // runOperation(op, monitor); + // } + // + // + // protected void openWhenClosed(IProgressMonitor pm) throws + // JavaModelException { + // if (!this.resourceExists() + // || !this.isOnClasspath()) { + // 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); + // } catch (JavaModelException e) { + // // do nothing. + // } + // } + // /* + // * @see JavaElement#rootedAt(IJavaProject) + // */ + // public IJavaElement rootedAt(IJavaProject project) { + // return + // new PackageFragmentRoot( + // getResource(), + // project, + // name); + // } + /** + * @private Debugging purposes + */ + protected void toStringInfo(int tab, StringBuffer buffer, Object info) { + buffer.append(this.tabString(tab)); + if (getElementName().length() == 0) { + buffer.append("[project root]"); //$NON-NLS-1$ + } else { + IPath path = getPath(); + if (getJavaProject().getElementName().equals(path.segment(0))) { + buffer.append(path.removeFirstSegments(1).makeRelative()); + } else { + buffer.append(path); + } + } + if (info == null) { + buffer.append(" (not open)"); //$NON-NLS-1$ + } + } + + /** + * Possible failures: + * + */ + // protected void verifyAttachSource(IPath sourcePath) throws + // JavaModelException { + // if (!exists()) { + // throw newNotPresentException(); + // } else if (this.getKind() != K_BINARY) { + // throw new JavaModelException(new + // JavaModelStatus(IJavaModelStatusConstants.INVALID_ELEMENT_TYPES, this)); + // } else if (sourcePath != null && !sourcePath.isAbsolute()) { + // throw new JavaModelException(new + // JavaModelStatus(IJavaModelStatusConstants.RELATIVE_PATH, sourcePath)); + // } + // } } \ No newline at end of file