diff options
author | alexsch <none@none> | 2014-09-11 13:25:44 +0400 |
---|---|---|
committer | alexsch <none@none> | 2014-09-11 13:25:44 +0400 |
commit | a937a071e90fa6b5fe515b748cb0a047f449ccb9 (patch) | |
tree | ec86e27e11879b46c61d6a2d838aad10b3cde08f | |
parent | ad05ce1c0502bbb3bccc0760009fa7703bc18873 (diff) |
8055304: More boxing for DirectoryComboBoxModel
Reviewed-by: serb, prr, skoivu
5 files changed, 51 insertions, 40 deletions
diff --git a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java index 48b501094..b22ebf958 100644 --- a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java +++ b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java @@ -1067,16 +1067,9 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { directories.clear(); - File[] baseFolders; - if (useShellFolder) { - baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { - public File[] run() { - return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); - } - }); - } else { - baseFolders = fsv.getRoots(); - } + File[] baseFolders = (useShellFolder) + ? (File[]) ShellFolder.get("fileChooserComboBoxFolders") + : fsv.getRoots(); directories.addAll(Arrays.asList(baseFolders)); // Get the canonical (full) path. This has the side diff --git a/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java b/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java index 677d1f88c..ddc70c91c 100644 --- a/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java +++ b/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java @@ -941,16 +941,9 @@ public class MetalFileChooserUI extends BasicFileChooserUI { directories.clear(); - File[] baseFolders; - if (useShellFolder) { - baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { - public File[] run() { - return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); - } - }); - } else { - baseFolders = fsv.getRoots(); - } + File[] baseFolders = (useShellFolder) + ? (File[]) ShellFolder.get("fileChooserComboBoxFolders") + : fsv.getRoots(); directories.addAll(Arrays.asList(baseFolders)); // Get the canonical (full) path. This has the side diff --git a/src/share/classes/sun/swing/WindowsPlacesBar.java b/src/share/classes/sun/swing/WindowsPlacesBar.java index 8b033ca3e..2a693294c 100644 --- a/src/share/classes/sun/swing/WindowsPlacesBar.java +++ b/src/share/classes/sun/swing/WindowsPlacesBar.java @@ -81,11 +81,7 @@ public class WindowsPlacesBar extends JToolBar setBackground(bgColor); FileSystemView fsv = fc.getFileSystemView(); - files = AccessController.doPrivileged(new PrivilegedAction<File[]>() { - public File[] run() { - return (File[]) ShellFolder.get("fileChooserShortcutPanelFolders"); - } - }); + files = (File[]) ShellFolder.get("fileChooserShortcutPanelFolders"); buttons = new JToggleButton[files.length]; buttonGroup = new ButtonGroup(); diff --git a/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java b/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java index 37792070d..047952cd6 100644 --- a/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java +++ b/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java @@ -769,16 +769,9 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { fireIntervalRemoved(this, 0, oldSize); } - File[] baseFolders; - if (useShellFolder) { - baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() { - public File[] run() { - return (File[]) ShellFolder.get("fileChooserComboBoxFolders"); - } - }); - } else { - baseFolders = fsv.getRoots(); - } + File[] baseFolders = (useShellFolder) + ? (File[]) ShellFolder.get("fileChooserComboBoxFolders") + : fsv.getRoots(); directories.addAll(Arrays.asList(baseFolders)); // Get the canonical (full) path. This has the side diff --git a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java index 41ba690f3..4d7da2de2 100644 --- a/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java +++ b/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java @@ -36,6 +36,7 @@ import java.security.PrivilegedAction; import java.util.*; import java.util.List; import java.util.concurrent.*; +import java.util.stream.Stream; import static sun.awt.shell.Win32ShellFolder2.*; import sun.awt.OSInfo; @@ -251,7 +252,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { if (file == null) { file = getDesktop(); } - return file; + return checkFile(file); } else if (key.equals("roots")) { // Should be "History" and "Desktop" ? if (roots == null) { @@ -262,11 +263,11 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { roots = (File[])super.get(key); } } - return roots; + return checkFiles(roots); } else if (key.equals("fileChooserComboBoxFolders")) { Win32ShellFolder2 desktop = getDesktop(); - if (desktop != null) { + if (desktop != null && checkFile(desktop) != null) { ArrayList<File> folders = new ArrayList<File>(); Win32ShellFolder2 drives = getDrives(); @@ -295,7 +296,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { } } } - return folders.toArray(new File[folders.size()]); + return checkFiles(folders); } else { return super.get(key); } @@ -332,7 +333,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { } } } - return folders.toArray(new File[folders.size()]); + return checkFiles(folders); } else if (key.startsWith("fileChooserIcon ")) { String name = key.substring(key.indexOf(" ") + 1); @@ -378,6 +379,41 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { return null; } + private File checkFile(File file) { + SecurityManager sm = System.getSecurityManager(); + return (sm == null || file == null) ? file : checkFile(file, sm); + } + + private File checkFile(File file, SecurityManager sm) { + try { + sm.checkRead(file.getPath()); + return file; + } catch (SecurityException se) { + return null; + } + } + + private File[] checkFiles(File[] files) { + SecurityManager sm = System.getSecurityManager(); + if (sm == null || files == null || files.length == 0) { + return files; + } + return checkFiles(Arrays.stream(files), sm); + } + + private File[] checkFiles(List<File> files) { + SecurityManager sm = System.getSecurityManager(); + if (sm == null || files.isEmpty()) { + return files.toArray(new File[files.size()]); + } + return checkFiles(files.stream(), sm); + } + + private File[] checkFiles(Stream<File> filesStream, SecurityManager sm) { + return filesStream.filter((file) -> checkFile(file, sm) != null) + .toArray(File[]::new); + } + /** * Does <code>dir</code> represent a "computer" such as a node on the network, or * "My Computer" on the desktop. |