diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java index ae73199878d..2662686ff99 100644 --- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java @@ -37,7 +37,6 @@ import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; @@ -709,8 +708,7 @@ public class BasicFileChooserUI extends FileChooserUI { && ((File)objects[0]).isDirectory() && chooser.isTraversable(((File)objects[0])) && (useSetDirectory - || (!fsv.isFileSystem(((File)objects[0])) - && !Files.isSymbolicLink(((File)objects[0]).toPath())))) { + || (!fsv.isFileSystem((File)objects[0])))) { setDirectorySelected(true); setDirectory(((File)objects[0])); } else { @@ -720,7 +718,7 @@ public class BasicFileChooserUI extends FileChooserUI { boolean isDir = f.isDirectory(); if ((chooser.isFileSelectionEnabled() && !isDir) || (chooser.isDirectorySelectionEnabled() - && (fsv.isFileSystem(f) || Files.isSymbolicLink(f.toPath())) + && fsv.isFileSystem(f) && isDir)) { fList.add(f); } @@ -742,11 +740,7 @@ public class BasicFileChooserUI extends FileChooserUI { setDirectorySelected(true); setDirectory(file); if (usesSingleFilePane) { - if (Files.isSymbolicLink(file.toPath())) { - chooser.setSelectedFile(file); - } else { - chooser.setSelectedFile(null); - } + chooser.setSelectedFile(null); } } else { setDirectorySelected(false); diff --git a/src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolder2.java b/src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolder2.java index 43534e7ad8c..9678f00f565 100644 --- a/src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolder2.java +++ b/src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolder2.java @@ -856,10 +856,18 @@ final class Win32ShellFolder2 extends ShellFolder { /** * @return Whether this shell folder is a link + * @implNote Returns {@code true} for {@code .lnk} shortcuts only. + * For symbolic links and junctions, it returns + * {@code false} even though {@code IShellFolder} returns + * {@code true} now. It is a workaround for easier handling of + * symbolic links and junctions. */ + public boolean isLink() { if (cachedIsLink == null) { - cachedIsLink = hasAttribute(ATTRIB_LINK); + cachedIsLink = hasAttribute(ATTRIB_LINK) + && (!isFileSystem() + || getPath().toLowerCase().endsWith(".lnk")); } return cachedIsLink; diff --git a/test/jdk/javax/swing/JFileChooser/FileChooserInvalidPathExceptionTest.java b/test/jdk/javax/swing/JFileChooser/FileChooserInvalidPathExceptionTest.java new file mode 100644 index 00000000000..3aabca25393 --- /dev/null +++ b/test/jdk/javax/swing/JFileChooser/FileChooserInvalidPathExceptionTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.BorderLayout; + +import javax.swing.JFrame; +import javax.swing.JFileChooser; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; + +import java.lang.reflect.InvocationTargetException; + +/* + * @test + * @bug 8307105 + * @key headful + * @requires (os.family == "windows") + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @summary Test to check if the certain windows like "This PC", + * "Library", "Network" does not throw Invalid Path Exception on selection. + * @run main/manual FileChooserInvalidPathExceptionTest + */ + +public class FileChooserInvalidPathExceptionTest { + static JFrame frame; + static JFileChooser jfc; + static PassFailJFrame passFailJFrame; + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + try { + initialize(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + passFailJFrame.awaitAndCheck(); + } + + static void initialize() throws Exception { + //Initialize the components + final String INSTRUCTIONS = """ + Instructions to Test: + 1. Navigate to any windows specific folders like My PC/Libraries/ + Network. + 2. Select and traverse through those folders. + 3. On click of the mentioned folder if InvalidPathException + occurs does not occur then test is PASS. + """; + frame = new JFrame("JFileChooser IPE test"); + jfc = new JFileChooser(); + passFailJFrame = new PassFailJFrame("Test Instructions", INSTRUCTIONS, 5L, 8, 40); + + PassFailJFrame.addTestWindow(frame); + PassFailJFrame.positionTestWindow(frame, PassFailJFrame.Position.HORIZONTAL); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + jfc.setControlButtonsAreShown(false); + jfc.setDialogType(JFileChooser.CUSTOM_DIALOG); + + frame.add(jfc, BorderLayout.CENTER); + frame.pack(); + frame.setVisible(true); + } +}