changeset 6994:b6ab933f06e0

8012277: Improve AWT DataFlavor Reviewed-by: art, skoivu
author malenkov
date Fri, 31 May 2013 20:43:32 +0400
parents 65b07e0a2f36
children 0b84d3b434c2
files src/share/classes/java/awt/datatransfer/DataFlavor.java
diffstat 1 files changed, 31 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/awt/datatransfer/DataFlavor.java	Wed May 22 22:52:55 2013 -0700
+++ b/src/share/classes/java/awt/datatransfer/DataFlavor.java	Fri May 31 20:43:32 2013 +0400
@@ -25,12 +25,14 @@
 
 package java.awt.datatransfer;
 
-import java.awt.Toolkit;
 import java.io.*;
 import java.nio.*;
 import java.util.*;
 
 import sun.awt.datatransfer.DataTransferer;
+import sun.reflect.misc.ReflectUtil;
+
+import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION;
 
 /**
  * A {@code DataFlavor} provides meta information about data. {@code DataFlavor}
@@ -117,26 +119,36 @@
                                                    ClassLoader fallback)
         throws ClassNotFoundException
     {
-        ClassLoader systemClassLoader = (ClassLoader)
-            java.security.AccessController.doPrivileged(
-                new java.security.PrivilegedAction() {
-                    public Object run() {
-                        ClassLoader cl = Thread.currentThread().
-                            getContextClassLoader();
-                        return (cl != null)
-                            ? cl
-                            : ClassLoader.getSystemClassLoader();
+        ReflectUtil.checkPackageAccess(className);
+        try {
+            SecurityManager sm = System.getSecurityManager();
+            if (sm != null) {
+                sm.checkPermission(GET_CLASSLOADER_PERMISSION);
+            }
+            ClassLoader loader = ClassLoader.getSystemClassLoader();
+            try {
+                // bootstrap class loader and system class loader if present
+                return Class.forName(className, true, loader);
+            }
+            catch (ClassNotFoundException exception) {
+                // thread context class loader if and only if present
+                loader = Thread.currentThread().getContextClassLoader();
+                if (loader != null) {
+                    try {
+                        return Class.forName(className, true, loader);
                     }
-                    });
-
-        try {
-            return Class.forName(className, true, systemClassLoader);
-        } catch (ClassNotFoundException e2) {
-            if (fallback != null) {
-                return Class.forName(className, true, fallback);
-            } else {
-                throw new ClassNotFoundException(className);
+                    catch (ClassNotFoundException e) {
+                        // fallback to user's class loader
+                    }
+                }
             }
+        } catch (SecurityException exception) {
+            // ignore secured class loaders
+        }
+        if (fallback != null) {
+            return Class.forName(className, true, fallback);
+        } else {
+            throw new ClassNotFoundException(className);
         }
     }