JDK-8298305 : (fs) temporarily remove Path.getExtension
  • Type: CSR
  • Component: core-libs
  • Sub-Component: java.nio
  • Priority: P4
  • Status: Closed
  • Resolution: Approved
  • Fix Versions: 20
  • Submitted: 2022-12-07
  • Updated: 2022-12-07
  • Resolved: 2022-12-07
Related Reports
CSR :  
Relates :  
Relates :  
Description
Summary
-------

Remove `java.nio.file.Path::getExtension` that was added for JDK-8057113.

Problem
-------

`Path::getExtension` is still a matter of discussion (cf. JDK-8297814) and it would be dangerous to add it this late in the JDK 20 timeline.

Solution
--------

Remove `java.nio.file.Path::getExtension`

Specification
-------------

    --- a/src/java.base/share/classes/java/nio/file/Path.java
    +++ b/src/java.base/share/classes/java/nio/file/Path.java
    @@ -50,7 +50,7 @@
      * file system. {@code Path} defines the {@link #getFileName() getFileName},
      * {@link #getParent getParent}, {@link #getRoot getRoot}, and {@link #subpath
      * subpath} methods to access the path components or a subsequence of its name
    - * elements, and {@link #getExtension() getExtension} to obtain its extension.
    + * elements.
      *
      * <p> In addition to accessing the components of a path, a {@code Path} also
      * defines the {@link #resolve(Path) resolve} and {@link #resolveSibling(Path)
    @@ -249,63 +249,6 @@ public static Path of(URI uri) {
          */
         Path getFileName();
     
    -    /**
    -     * Returns the file extension of this path's file name as a {@code String}.
    -     * The extension is derived from this {@code Path} by obtaining the
    -     * {@linkplain #getFileName file name element}, deriving its {@linkplain
    -     * #toString string representation}, and then extracting a substring
    -     * determined by the position of a period character ('.', U+002E FULL STOP)
    -     * within the file name string. If the file name element is {@code null},
    -     * or if the file name string does not contain a period character, or if
    -     * the only period in the file name string is its first character, then
    -     * the extension is {@code null}. Otherwise, the extension is the substring
    -     * after the last period in the file name string. If this last period is
    -     * also the last character in the file name string, then the  extension is
    -     * {@linkplain String#isEmpty empty}.
    -     *
    -     * @implSpec
    -     * The default implementation is equivalent for this path to:
    -     * <pre>{@code
    -     * int lastPeriod = fileName.lastIndexOf('.');
    -     * if (lastPeriod <= 0)
    -     *     return null;
    -     * return (lastPeriod == fileName.length() - 1)
    -     *     ? ""
    -     *     : fileName.substring(lastPeriod + 1);
    -     * }</pre>
    -     *
    -     * @return  the file name extension of this path, which might be the
    -     *          empty string, or {@code null} if no extension is found
    -     *
    -     * @since 20
    -     */
    -    default String getExtension() {
    -        Path fileName = getFileName();
    -        if (fileName == null)
    -            return null;
    -
    -        String fileNameString = fileName.toString();
    -        int length = fileNameString.length();
    -
    -        // An empty or unity length file name string has a null extension
    -        if (length > 1) {
    -            int lastPeriodIndex = fileNameString.lastIndexOf('.');
    -
    -            // Indeterminate if there is no period character or
    -            // only the first character is a period character
    -            if (lastPeriodIndex > 0) {
    -                if (lastPeriodIndex == length - 1) {
    -                    // empty string
    -                    return "";
    -                } else {
    -                    return fileNameString.substring(lastPeriodIndex + 1);
    -                }
    -            }
    -        }
    -
    -        return null;
    -    }
    -
         /**
          * Returns the <em>parent path</em>, or {@code null} if this path does not
          * have a parent.
Comments
Moving to Approved. I think removing the API for 20 is a reasonable decision given the timeline and would welcome the method being added back in 21.
07-12-2022