Class PackageFragmentRoot

java.lang.Object
org.eclipse.core.runtime.PlatformObject
All Implemented Interfaces:
IBufferChangedListener, IJavaElement, IOpenable, IPackageFragmentRoot, IParent, org.eclipse.core.runtime.IAdaptable
Direct Known Subclasses:
ExternalPackageFragmentRoot, JarPackageFragmentRoot

public class PackageFragmentRoot extends Openable implements IPackageFragmentRoot
See Also:
IPackageFragmentRoot
  • Field Details

    • ATTACHMENT_PROPERTY_DELIMITER

      protected static final char ATTACHMENT_PROPERTY_DELIMITER
      The delimiter between the source path and root path in the attachment server property.
      See Also:
      Constant Field Values
    • NO_SOURCE_ATTACHMENT

      public static final String NO_SOURCE_ATTACHMENT
      See Also:
      Constant Field Values
    • resource

      protected org.eclipse.core.resources.IResource resource
      The resource associated with this root (null for external jar)
  • Constructor Details

    • PackageFragmentRoot

      protected PackageFragmentRoot(org.eclipse.core.resources.IResource resource, JavaProject project)
      Constructs a package fragment root which is the root of the java package directory hierarchy.
  • Method Details

    • attachSource

      public void attachSource(org.eclipse.core.runtime.IPath sourcePath, org.eclipse.core.runtime.IPath rootPath, org.eclipse.core.runtime.IProgressMonitor monitor) throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Attaches the source archive identified by the given absolute path to this binary package fragment root. rootPath specifies the location of the root within the archive or folder (empty specifies the default root and null specifies the root path should be detected). Once a source archive or folder is attached to the package fragment root, the getSource and getSourceRange methods become operational for binary types/members. To detach a source archive or folder from a package fragment root, specify null as the source path.
      Specified by:
      attachSource in interface IPackageFragmentRoot
      Parameters:
      sourcePath - the given absolute path to the source archive or folder
      rootPath - specifies the location of the root within the archive (empty specifies the default root and null specifies automatic detection of the root path)
      monitor - the given progress monitor
      Throws:
      JavaModelException - if this operation fails. Reasons include:
      • This Java element does not exist (ELEMENT_DOES_NOT_EXIST)
      • A CoreException occurred while updating a server property
      • This package fragment root is not of kind binary (INVALID_ELEMENT_TYPES)
      • The path provided is not absolute (RELATIVE_PATH)
      See Also:
      IPackageFragmentRoot
    • buildStructure

      protected boolean buildStructure(OpenableElementInfo info, org.eclipse.core.runtime.IProgressMonitor pm, Map newElements, org.eclipse.core.resources.IResource underlyingResource) throws JavaModelException
      Description copied from class: Openable
      Builds this element's structure and properties in the given info object, based on this element's current contents (reuse buffer contents if this element has an open buffer, or resource contents if this element does not have an open buffer). Children are placed in the given newElements table (note, this element has already been placed in the newElements table). Returns true if successful, or false if an error is encountered while determining the structure of this element.
      Specified by:
      buildStructure in class Openable
      Throws:
      JavaModelException
      See Also:
      Openable
    • delete

      public void delete(int updateResourceFlags, int updateModelFlags, org.eclipse.core.runtime.IProgressMonitor monitor) throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Deletes the resource of this package fragment root as specified by IResource.delete(int, IProgressMonitor) but excluding nested source folders.

      If NO_RESOURCE_MODIFICATION is specified in updateModelFlags or if this package fragment root is external, this operation doesn't delete the resource. updateResourceFlags is then ignored.

      If ORIGINATING_PROJECT_CLASSPATH is specified in updateModelFlags, update the raw classpath of this package fragment root's project by removing the corresponding classpath entry.

      If OTHER_REFERRING_PROJECTS_CLASSPATH is specified in updateModelFlags, update the raw classpaths of all other Java projects referring to this root's resource by removing the corresponding classpath entries.

      If no flags is specified in updateModelFlags (using IResource.NONE), the default behavior applies: the resource is deleted (if this package fragment root is not external) and no classpaths are updated.

      Specified by:
      delete in interface IPackageFragmentRoot
      Parameters:
      updateResourceFlags - bit-wise or of update resource flag constants (IResource.FORCE and IResource.KEEP_HISTORY)
      updateModelFlags - bit-wise or of update resource flag constants (ORIGINATING_PROJECT_CLASSPATH, OTHER_REFERRING_PROJECTS_CLASSPATH and NO_RESOURCE_MODIFICATION)
      monitor - a progress monitor
      Throws:
      JavaModelException - if this root could not be deleted. Reasons include:
      • This root does not exist (ELEMENT_DOES_NOT_EXIST)
      • A CoreException occurred while deleting the resource or updating a classpath
      See Also:
      IResource.delete(boolean, IProgressMonitor)
    • computeChildren

      protected boolean computeChildren(OpenableElementInfo info, org.eclipse.core.resources.IResource underlyingResource) throws JavaModelException
      Compute the package fragment children of this package fragment root.
      Throws:
      JavaModelException - The resource associated with this package fragment root does not exist
    • computeFolderChildren

      protected void computeFolderChildren(org.eclipse.core.resources.IContainer folder, boolean isIncluded, String[] pkgName, ArrayList vChildren, char[][] inclusionPatterns, char[][] exclusionPatterns) throws JavaModelException
      Starting at this folder, create package fragments and add the fragments that are not excluded to the collection of children.
      Throws:
      JavaModelException - The resource associated with this package fragment does not exist
    • copy

      public void copy(org.eclipse.core.runtime.IPath destination, int updateResourceFlags, int updateModelFlags, IClasspathEntry sibling, org.eclipse.core.runtime.IProgressMonitor monitor) throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Copies the resource of this package fragment root to the destination path as specified by IResource.copy(IPath, int, IProgressMonitor) but excluding nested source folders.

      If NO_RESOURCE_MODIFICATION is specified in updateModelFlags or if this package fragment root is external, this operation doesn't copy the resource. updateResourceFlags is then ignored.

      If DESTINATION_PROJECT_CLASSPATH is specified in updateModelFlags, updates the classpath of the destination's project (if it is a Java project). If a non-null sibling is specified, a copy of this root's classpath entry is inserted before the sibling on the destination project's raw classpath. If null is specified, the classpath entry is added at the end of the raw classpath.

      If REPLACE is specified in updateModelFlags, overwrites the resource at the destination path if any. If the same classpath entry already exists on the destination project's raw classpath, then the sibling is ignored and the new classpath entry replaces the existing one.

      If no flags is specified in updateModelFlags (using IResource.NONE), the default behavior applies: the resource is copied (if this package fragment root is not external) and the classpath is not updated.

      Specified by:
      copy in interface IPackageFragmentRoot
      Parameters:
      destination - the destination path
      updateResourceFlags - bit-wise or of update resource flag constants (IResource.FORCE and IResource.SHALLOW)
      updateModelFlags - bit-wise or of update resource flag constants (DESTINATION_PROJECT_CLASSPATH and NO_RESOURCE_MODIFICATION)
      sibling - the classpath entry before which a copy of the classpath entry should be inserted or null if the classpath entry should be inserted at the end
      monitor - a progress monitor
      Throws:
      JavaModelException - if this root could not be copied. Reasons include:
      • This root does not exist (ELEMENT_DOES_NOT_EXIST)
      • A CoreException occurred while copying the resource or updating a classpath
      • The destination is not inside an existing project and updateModelFlags has been specified as DESTINATION_PROJECT_CLASSPATH (INVALID_DESTINATION)
      • The sibling is not a classpath entry on the destination project's raw classpath (INVALID_SIBLING)
      • The same classpath entry already exists on the destination project's classpath (NAME_COLLISION) and updateModelFlags has not been specified as REPLACE
      See Also:
      IResource.copy(IPath, boolean, IProgressMonitor)
    • createElementInfo

      protected Object createElementInfo()
      Returns a new element info for this element.
      Overrides:
      createElementInfo in class Openable
    • createPackageFragment

      public IPackageFragment createPackageFragment(String pkgName, boolean force, org.eclipse.core.runtime.IProgressMonitor monitor) throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Creates and returns a package fragment in this root with the given dot-separated package name. An empty string specifies the default package. This has the side effect of creating all package fragments that are a prefix of the new package fragment which do not exist yet. If the package fragment already exists, this has no effect. For a description of the force flag, see IFolder.create.
      Specified by:
      createPackageFragment in interface IPackageFragmentRoot
      Parameters:
      pkgName - the given dot-separated package name
      force - a flag controlling how to deal with resources that are not in sync with the local file system
      monitor - the given progress monitor
      Returns:
      a package fragment in this root with the given dot-separated package name
      Throws:
      JavaModelException - if the element could not be created. Reasons include:
      • This Java element does not exist (ELEMENT_DOES_NOT_EXIST)
      • A CoreException occurred while creating an underlying resource
      • This package fragment root is read only (READ_ONLY)
      • The name is not a valid package name (INVALID_NAME)
      See Also:
      IPackageFragmentRoot
    • determineKind

      protected int determineKind(org.eclipse.core.resources.IResource underlyingResource) throws JavaModelException
      Returns the root's kind - K_SOURCE or K_BINARY, defaults to K_SOURCE if it is not on the classpath.
      Throws:
      JavaModelException - if the project and root do not exist.
    • equals

      public boolean equals(Object o)
      Compares two objects for equality; for PackageFragmentRoots, equality is having the same parent, same resources, and occurrence count.
      Overrides:
      equals in class JavaElement
      See Also:
      Object.equals(java.lang.Object)
    • fullExclusionPatternChars

      public char[][] fullExclusionPatternChars()
    • fullInclusionPatternChars

      public char[][] fullInclusionPatternChars()
    • getElementName

      public String getElementName()
      Description copied from interface: IJavaElement
      Returns the name of this element. This is a handle-only method.
      Specified by:
      getElementName in interface IJavaElement
      Overrides:
      getElementName in class JavaElement
      Returns:
      the element name
      See Also:
      IAdaptable
    • getElementType

      public int getElementType()
      Description copied from interface: IJavaElement
      Returns this element's kind encoded as an integer. This is a handle-only method.
      Specified by:
      getElementType in interface IJavaElement
      Returns:
      the kind of element; one of the constants declared in IJavaElement
      See Also:
      IJavaElement
    • getHandleMementoDelimiter

      protected char getHandleMementoDelimiter()
      Description copied from class: JavaElement
      Returns the char that marks the start of this handles contribution to a memento.
      Specified by:
      getHandleMementoDelimiter in class JavaElement
      See Also:
      JavaElement.getHandleMemento()
    • getHandleFromMemento

      public IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner)
      Specified by:
      getHandleFromMemento in class JavaElement
    • getHandleMemento

      protected void getHandleMemento(StringBuffer buff)
      Overrides:
      getHandleMemento in class JavaElement
      See Also:
      JavaElement.getHandleMemento(StringBuffer)
    • getKind

      public int getKind() throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Returns this package fragment root's kind encoded as an integer. A package fragment root can contain source files (i.e. files with one of the Java-like extensions, or .class files, but not both. If the underlying folder or archive contains other kinds of files, they are ignored. In particular, .class files are ignored under a source package fragment root, and source files are ignored under a binary package fragment root.
      Specified by:
      getKind in interface IPackageFragmentRoot
      Returns:
      this package fragment root's kind encoded as an integer
      Throws:
      JavaModelException - if this element does not exist or if an exception occurs while accessing its corresponding resource.
      See Also:
      IPackageFragmentRoot
    • getNonJavaResources

      public Object[] getNonJavaResources() throws JavaModelException
      Returns an array of non-java resources contained in the receiver.
      Specified by:
      getNonJavaResources in interface IPackageFragmentRoot
      Returns:
      an array of non-Java resources (IFiles, IFolders, or IStorages if the package fragment root is in archive) contained in this package fragment root
      Throws:
      JavaModelException - if this element does not exist or if an exception occurs while accessing its corresponding resource.
      See Also:
      IClasspathEntry.getInclusionPatterns(), IClasspathEntry.getExclusionPatterns()
    • getPackageFragment

      public IPackageFragment getPackageFragment(String packageName)
      Description copied from interface: IPackageFragmentRoot
      Returns the package fragment with the given package name. An empty string indicates the default package. This is a handle-only operation. The package fragment may or may not exist.
      Specified by:
      getPackageFragment in interface IPackageFragmentRoot
      Parameters:
      packageName - the given package name
      Returns:
      the package fragment with the given package name
      See Also:
      IPackageFragmentRoot
    • getPackageFragment

      public PackageFragment getPackageFragment(String[] pkgName)
    • getPackageFragment

      public PackageFragment getPackageFragment(String[] pkgName, String mod)
    • getPackageName

      protected String getPackageName(org.eclipse.core.resources.IFolder folder)
      Returns the package name for the given folder (which is a decendent of this root).
    • getPath

      public org.eclipse.core.runtime.IPath getPath()
      Description copied from interface: IJavaElement
      Returns the path to the innermost resource enclosing this element. If this element is not included in an external library, the path returned is the full, absolute path to the underlying resource, relative to the workbench. If this element is included in an external library, the path returned is the absolute path to the archive or to the folder in the file system. This is a handle-only method.
      Specified by:
      getPath in interface IJavaElement
      Returns:
      the path to the innermost resource enclosing this element
      See Also:
      IJavaElement
    • internalPath

      public org.eclipse.core.runtime.IPath internalPath()
    • getRawClasspathEntry

      public IClasspathEntry getRawClasspathEntry() throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Returns the first raw classpath entry that corresponds to this package fragment root. A raw classpath entry corresponds to a package fragment root if once resolved this entry's path is equal to the root's path.
      Specified by:
      getRawClasspathEntry in interface IPackageFragmentRoot
      Returns:
      the first raw classpath entry that corresponds to this package fragment root
      Throws:
      JavaModelException - if this element does not exist or if an exception occurs while accessing its corresponding resource.
    • getResolvedClasspathEntry

      public IClasspathEntry getResolvedClasspathEntry() throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Returns the first resolved classpath entry that corresponds to this package fragment root. A resolved classpath entry is said to correspond to a root if the path of the resolved entry is equal to the root's path.
      Specified by:
      getResolvedClasspathEntry in interface IPackageFragmentRoot
      Returns:
      the first resolved classpath entry that corresponds to this package fragment root
      Throws:
      JavaModelException - if this element does not exist or if an exception occurs while accessing its corresponding resource.
    • resource

      public org.eclipse.core.resources.IResource resource()
      Overrides:
      resource in class Openable
    • resource

      public org.eclipse.core.resources.IResource resource(PackageFragmentRoot root)
      Specified by:
      resource in class Openable
    • getSourceAttachmentPath

      public org.eclipse.core.runtime.IPath getSourceAttachmentPath() throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Returns the absolute path to the source archive attached to this package fragment root's binary archive.
      Specified by:
      getSourceAttachmentPath in interface IPackageFragmentRoot
      Returns:
      the absolute path to the corresponding source archive, or null if this package fragment root's binary archive has no corresponding source archive, or if this package fragment root is not a binary archive
      Throws:
      JavaModelException - if this operation fails
      See Also:
      IPackageFragmentRoot
    • setSourceMapper

      public void setSourceMapper(SourceMapper mapper) throws JavaModelException
      For use by AttachSourceOperation only. Sets the source mapper associated with this root.
      Throws:
      JavaModelException
    • getSourceAttachmentRootPath

      public org.eclipse.core.runtime.IPath getSourceAttachmentRootPath() throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Returns the path within this package fragment root's source archive. An empty path indicates that packages are located at the root of the source archive.
      Specified by:
      getSourceAttachmentRootPath in interface IPackageFragmentRoot
      Returns:
      the path within the corresponding source archive, or null if this package fragment root's binary archive has no corresponding source archive, or if this package fragment root is not a binary archive
      Throws:
      JavaModelException - if this operation fails
      See Also:
      IPackageFragmentRoot
    • getSourceMapper

      public SourceMapper getSourceMapper()
      Description copied from class: JavaElement
      Returns the SourceMapper facility for this element, or null if this element does not have a SourceMapper.
      Overrides:
      getSourceMapper in class JavaElement
      See Also:
      JavaElement
    • getUnderlyingResource

      public org.eclipse.core.resources.IResource getUnderlyingResource() throws JavaModelException
      Description copied from interface: IJavaElement
      Returns the smallest underlying resource that contains this element, or null if this element is not contained in a resource.
      Specified by:
      getUnderlyingResource in interface IJavaElement
      Overrides:
      getUnderlyingResource in class Openable
      Returns:
      the underlying resource, or null if none
      Throws:
      JavaModelException - if this element does not exist or if an exception occurs while accessing its underlying resource
      See Also:
      IJavaElement
    • hasChildren

      public boolean hasChildren() throws JavaModelException
      Description copied from interface: IParent
      Returns whether this element has one or more immediate children. This is a convenience method, and may be more efficient than testing whether getChildren is an empty array.
      Specified by:
      hasChildren in interface IParent
      Overrides:
      hasChildren in class JavaElement
      Returns:
      true if the immediate children of this element, false otherwise
      Throws:
      JavaModelException - if this element does not exist or if an exception occurs while accessing its corresponding resource
      See Also:
      IParent
    • hashCode

      public int hashCode()
      Description copied from class: JavaElement
      Returns the hash code for this Java element. By default, the hash code for an element is a combination of its name and parent's hash code. Elements with other requirements must override this method.
      Overrides:
      hashCode in class JavaElement
    • ignoreOptionalProblems

      public boolean ignoreOptionalProblems()
    • isArchive

      public boolean isArchive()
      Description copied from interface: IPackageFragmentRoot
      Returns whether this package fragment root's underlying resource is a binary archive (a JAR or zip file).

      This is a handle-only method.

      Specified by:
      isArchive in interface IPackageFragmentRoot
      Returns:
      true if this package fragment root's underlying resource is a binary archive, false otherwise
      See Also:
      IPackageFragmentRoot
    • isExternal

      public boolean isExternal()
      Description copied from interface: IPackageFragmentRoot
      Returns whether this package fragment root is external to the workbench (that is, a local file), and has no underlying resource.

      This is a handle-only method.

      Specified by:
      isExternal in interface IPackageFragmentRoot
      Returns:
      true if this package fragment root is external to the workbench (that is, a local file), and has no underlying resource, false otherwise
      See Also:
      IPackageFragmentRoot
    • validateOnClasspath

      protected org.eclipse.core.runtime.IStatus validateOnClasspath()
    • move

      public void move(org.eclipse.core.runtime.IPath destination, int updateResourceFlags, int updateModelFlags, IClasspathEntry sibling, org.eclipse.core.runtime.IProgressMonitor monitor) throws JavaModelException
      Description copied from interface: IPackageFragmentRoot
      Moves the resource of this package fragment root to the destination path as specified by IResource.move(IPath,int,IProgressMonitor) but excluding nested source folders.

      If NO_RESOURCE_MODIFICATION is specified in updateModelFlags or if this package fragment root is external, this operation doesn't move the resource. updateResourceFlags is then ignored.

      If DESTINATION_PROJECT_CLASSPATH is specified in updateModelFlags, updates the classpath of the destination's project (if it is a Java project). If a non-null sibling is specified, a copy of this root's classpath entry is inserted before the sibling on the destination project's raw classpath. If null is specified, the classpath entry is added at the end of the raw classpath.

      If ORIGINATING_PROJECT_CLASSPATH is specified in updateModelFlags, update the raw classpath of this package fragment root's project by removing the corresponding classpath entry.

      If OTHER_REFERRING_PROJECTS_CLASSPATH is specified in updateModelFlags, update the raw classpaths of all other Java projects referring to this root's resource by removing the corresponding classpath entries.

      If REPLACE is specified in updateModelFlags, overwrites the resource at the destination path if any. If the same classpath entry already exists on the destination project's raw classpath, then the sibling is ignored and the new classpath entry replaces the existing one.

      If no flags is specified in updateModelFlags (using IResource.NONE), the default behavior applies: the resource is moved (if this package fragment root is not external) and no classpaths are updated.

      Specified by:
      move in interface IPackageFragmentRoot
      Parameters:
      destination - the destination path
      updateResourceFlags - bit-wise or of update flag constants (IResource.FORCE, IResource.KEEP_HISTORY and IResource.SHALLOW)
      updateModelFlags - bit-wise or of update resource flag constants (DESTINATION_PROJECT_CLASSPATH, ORIGINATING_PROJECT_CLASSPATH, OTHER_REFERRING_PROJECTS_CLASSPATH and NO_RESOURCE_MODIFICATION)
      sibling - the classpath entry before which a copy of the classpath entry should be inserted or null if the classpath entry should be inserted at the end
      monitor - a progress monitor
      Throws:
      JavaModelException - if this root could not be moved. Reasons include:
      • This root does not exist (ELEMENT_DOES_NOT_EXIST)
      • A CoreException occurred while copying the resource or updating a classpath
      • The destination is not inside an existing project and updateModelFlags has been specified as DESTINATION_PROJECT_CLASSPATH (INVALID_DESTINATION)
      • The sibling is not a classpath entry on the destination project's raw classpath (INVALID_SIBLING)
      • The same classpath entry already exists on the destination project's classpath (NAME_COLLISION) and updateModelFlags has not been specified as REPLACE
      See Also:
      IResource.move(IPath, boolean, IProgressMonitor)
    • toStringInfo

      protected void toStringInfo(int tab, StringBuffer buffer, Object info, boolean showResolvedInfo)
      Description copied from class: JavaElement
      Debugging purposes
      Overrides:
      toStringInfo in class JavaElement
      showResolvedInfo - TODO
    • validateExistence

      protected org.eclipse.core.runtime.IStatus validateExistence(org.eclipse.core.resources.IResource underlyingResource)
      Specified by:
      validateExistence in class Openable
    • verifyAttachSource

      protected void verifyAttachSource(org.eclipse.core.runtime.IPath sourcePath) throws JavaModelException
      Possible failures:
      • ELEMENT_NOT_PRESENT - the root supplied to the operation does not exist
      • INVALID_ELEMENT_TYPES - the root is not of kind K_BINARY
      • RELATIVE_PATH - the path supplied to this operation must be an absolute path
      Throws:
      JavaModelException
    • getClassFilePath

      public String getClassFilePath(String classname)
      Returns the relative path within an archive for the given class file name. In certain kind of archives, such as a JMOD file, class files are stored in a nested folder, as opposed to directly under the root. It is the responsibility of such package fragment roots to provide the custom behavior.
      Parameters:
      classname -
      Returns:
      the relative path for the class file within the archive
    • getModuleDescription

      public IModuleDescription getModuleDescription()
      Description copied from interface: IPackageFragmentRoot
      Returns the IModuleDescription that this package fragment root contains. Returns null if the root doesn't contain any named module or if the project compiler compliance is 1.8 or lower. If present the module descriptor is found as a child of the package fragment representing the default package. Note that only one of the source package fragment roots in a Java Project can legally contain a module descriptor.
      Specified by:
      getModuleDescription in interface IPackageFragmentRoot
      Returns:
      the IModuleDescription this root contains.
    • getAutomaticModuleDescription

      public IModuleDescription getAutomaticModuleDescription() throws JavaModelException
      Throws:
      JavaModelException
    • hasCompilationUnit

      public boolean hasCompilationUnit(String qualifiedPackageName, String moduleName)
      See Also:
      IModulePathEntry.hasCompilationUnit(String, String)
    • getManifest

      public Manifest getManifest()
      Convenience lookup, though currently only JarPackageFragmentRoot is searched for a manifest.
    • isComplianceJava9OrHigher

      protected boolean isComplianceJava9OrHigher()