/******************************************************************************* * 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.Map; import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaModelStatusConstants; import net.sourceforge.phpdt.core.IPackageFragment; import net.sourceforge.phpdt.core.IPackageFragmentRoot; import net.sourceforge.phpdt.core.JavaCore; import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpdt.core.WorkingCopyOwner; import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.internal.core.util.MementoTokenizer; import net.sourceforge.phpdt.internal.core.util.Util; import org.eclipse.core.resources.IContainer; //import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; 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)); // } // } }