6461173: One JCK test([NewFolderAction0001]) failed on Windows due to lack of PropertyPermission(s)
authorrupashka
Mon, 10 Aug 2009 14:55:10 +0400
changeset 3507 1610d6f5a0e3
parent 3506 6ef230deec46
child 3508 defe8eec9251
6461173: One JCK test([NewFolderAction0001]) failed on Windows due to lack of PropertyPermission(s) Reviewed-by: peterz, malenkov
jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java
jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java
jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java
--- a/jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java	Fri Aug 07 19:06:56 2009 +0400
+++ b/jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java	Mon Aug 10 14:55:10 2009 +0400
@@ -37,6 +37,8 @@
 import java.lang.ref.WeakReference;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeEvent;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 
 import sun.awt.shell.*;
 
@@ -718,8 +720,13 @@
         return isFileSystemRoot(dir);
     }
 
-    public boolean isFloppyDrive(File dir) {
-        String path = dir.getAbsolutePath();
+    public boolean isFloppyDrive(final File dir) {
+        String path = AccessController.doPrivileged(new PrivilegedAction<String>() {
+            public String run() {
+                return dir.getAbsolutePath();
+            }
+        });
+
         return (path != null && (path.equals("A:\\") || path.equals("B:\\")));
     }
 
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java	Fri Aug 07 19:06:56 2009 +0400
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java	Mon Aug 10 14:55:10 2009 +0400
@@ -73,12 +73,7 @@
 
     private static native void initIDs();
 
-    private static final boolean is98;
-
     static {
-        String osName = System.getProperty("os.name");
-        is98 = (osName != null && osName.startsWith("Windows 98"));
-
         initIDs();
     }
 
@@ -305,7 +300,6 @@
             }, RuntimeException.class)
         );
         this.disposer.relativePIDL = relativePIDL;
-        getAbsolutePath();
         sun.java2d.Disposer.addRecord(this, disposer);
     }
 
@@ -616,11 +610,8 @@
     public boolean isDirectory() {
         if (isDir == null) {
             // Folders with SFGAO_BROWSABLE have "shell extension" handlers and are
-            // not traversable in JFileChooser. An exception is "My Documents" on
-            // Windows 98.
-            if (hasAttribute(ATTRIB_FOLDER)
-                && (!hasAttribute(ATTRIB_BROWSABLE) ||
-                    (is98 && equals(Win32ShellFolderManager2.getPersonal())))) {
+            // not traversable in JFileChooser.
+            if (hasAttribute(ATTRIB_FOLDER) && !hasAttribute(ATTRIB_BROWSABLE)) {
                 isDir = Boolean.TRUE;
             } else if (isLink()) {
                 ShellFolder linkLocation = getLinkLocation(false);
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java	Fri Aug 07 19:06:56 2009 +0400
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java	Mon Aug 10 14:55:10 2009 +0400
@@ -105,9 +105,11 @@
     private static Win32ShellFolder2 network;
     private static Win32ShellFolder2 personal;
 
-    private static String osVersion = System.getProperty("os.version");
-    private static final boolean useShell32Icons =
-                        (osVersion != null && osVersion.compareTo("5.1") >= 0);
+    private static final boolean USE_SHELL32_ICONS = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
+        public Boolean run() {
+            return OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) >= 0;
+        }
+    });
 
     static Win32ShellFolder2 getDesktop() {
         if (desktop == null) {
@@ -307,15 +309,15 @@
                 i = Integer.parseInt(name);
             } catch (NumberFormatException ex) {
                 if (name.equals("ListView")) {
-                    i = (useShell32Icons) ? 21 : 2;
+                    i = (USE_SHELL32_ICONS) ? 21 : 2;
                 } else if (name.equals("DetailsView")) {
-                    i = (useShell32Icons) ? 23 : 3;
+                    i = (USE_SHELL32_ICONS) ? 23 : 3;
                 } else if (name.equals("UpFolder")) {
-                    i = (useShell32Icons) ? 28 : 8;
+                    i = (USE_SHELL32_ICONS) ? 28 : 8;
                 } else if (name.equals("NewFolder")) {
-                    i = (useShell32Icons) ? 31 : 11;
+                    i = (USE_SHELL32_ICONS) ? 31 : 11;
                 } else if (name.equals("ViewMenu")) {
-                    i = (useShell32Icons) ? 21 : 2;
+                    i = (USE_SHELL32_ICONS) ? 21 : 2;
                 }
             }
             if (i >= 0) {
@@ -352,11 +354,16 @@
      * Does <code>dir</code> represent a "computer" such as a node on the network, or
      * "My Computer" on the desktop.
      */
-    public boolean isComputerNode(File dir) {
+    public boolean isComputerNode(final File dir) {
         if (dir != null && dir == getDrives()) {
             return true;
         } else {
-            String path = dir.getAbsolutePath();
+            String path = AccessController.doPrivileged(new PrivilegedAction<String>() {
+                public String run() {
+                    return dir.getAbsolutePath();
+                }
+            });
+
             return (path.startsWith("\\\\") && path.indexOf("\\", 2) < 0);      //Network path
         }
     }
@@ -501,7 +508,7 @@
                 // thread, we don't need to delegate the task
                 return task.call();
             } else {
-                Future<T> future;
+                final Future<T> future;
 
                 try {
                     future = submit(task);
@@ -512,7 +519,13 @@
                 try {
                     return future.get();
                 } catch (InterruptedException e) {
-                    future.cancel(true);
+                    AccessController.doPrivileged(new PrivilegedAction<Void>() {
+                        public Void run() {
+                            future.cancel(true);
+
+                            return null;
+                        }
+                    });
 
                     throw e;
                 } catch (ExecutionException e) {