diff --git a/src/macosx/classes/sun/lwawt/macosx/CClipboard.java b/src/macosx/classes/sun/lwawt/macosx/CClipboard.java index 51fbf52cfd51a7eed07f38e609bf24690ed442e4..9b6c3f4d4a703349dfbbda421dd65b8f6aaef4b0 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CClipboard.java +++ b/src/macosx/classes/sun/lwawt/macosx/CClipboard.java @@ -53,7 +53,7 @@ public class CClipboard extends SunClipboard { } protected void setContentsNative(Transferable contents) { - + FlavorTable flavorMap = getDefaultFlavorTable(); // Don't use delayed Clipboard rendering for the Transferable's data. // If we did that, we would call Transferable.getTransferData on // the Toolkit thread, which is a security hole. diff --git a/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java b/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java index ef154acdc2e12f7701030e5cd9fdbcecf2e87f58..47ede9865dd06f1096a3368c43cb38b5b98479dc 100644 --- a/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java +++ b/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java @@ -40,13 +40,12 @@ import java.net.MalformedURLException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.WeakHashMap; +import sun.awt.AppContext; import sun.awt.datatransfer.DataTransferer; /** @@ -67,10 +66,7 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable { */ private static String JavaMIME = "JAVA_DATAFLAVOR:"; - /** - * System singleton which maps a thread's ClassLoader to a SystemFlavorMap. - */ - private static final WeakHashMap flavorMaps = new WeakHashMap<>(); + private static final Object FLAVOR_MAP_KEY = new Object(); /** * Copied from java.util.Properties. @@ -184,22 +180,12 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable { * Returns the default FlavorMap for this thread's ClassLoader. */ public static FlavorMap getDefaultFlavorMap() { - ClassLoader contextClassLoader = - Thread.currentThread().getContextClassLoader(); - if (contextClassLoader == null) { - contextClassLoader = ClassLoader.getSystemClassLoader(); - } - - FlavorMap fm; - - synchronized(flavorMaps) { - fm = flavorMaps.get(contextClassLoader); - if (fm == null) { - fm = new SystemFlavorMap(); - flavorMaps.put(contextClassLoader, fm); - } + AppContext context = AppContext.getAppContext(); + FlavorMap fm = (FlavorMap) context.get(FLAVOR_MAP_KEY); + if (fm == null) { + fm = new SystemFlavorMap(); + context.put(FLAVOR_MAP_KEY, fm); } - return fm; } @@ -240,26 +226,11 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable { } }); - BufferedReader flavormapURL = + String url = java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public BufferedReader run() { - String url = Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null); - - if (url == null) { - return null; - } - - try { - return new BufferedReader - (new InputStreamReader - (new URL(url).openStream(), "ISO-8859-1")); - } catch (MalformedURLException e) { - System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url); - } catch (IOException e) { - System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url); - } - return null; + new java.security.PrivilegedAction() { + public String run() { + return Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null); } }); @@ -271,6 +242,19 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable { } } + BufferedReader flavormapURL = null; + if (url != null) { + try { + flavormapURL = new BufferedReader(new InputStreamReader(new URL(url).openStream(), "ISO-8859-1")); + } catch (MalformedURLException e) { + System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url); + } catch (IOException e) { + System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url); + } catch (SecurityException e) { + // ignored + } + } + if (flavormapURL != null) { try { parseAndStoreReader(flavormapURL); diff --git a/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java b/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java index 9439ec569b495fcf14ff4153dc930a7ff4275c56..b495ea9f5339cbfff1f04b54e12fdeba5da14a70 100644 --- a/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java +++ b/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java @@ -87,7 +87,7 @@ public class ClipboardTransferable implements Transferable { HashMap cached_data = new HashMap(formats.length, 1.0f); Map flavorsForFormats = DataTransferer.getInstance(). - getFlavorsForFormats(formats, SunClipboard.flavorMap); + getFlavorsForFormats(formats, SunClipboard.getDefaultFlavorTable()); for (Iterator iter = flavorsForFormats.keySet().iterator(); iter.hasNext(); ) { diff --git a/src/share/classes/sun/awt/datatransfer/SunClipboard.java b/src/share/classes/sun/awt/datatransfer/SunClipboard.java index df2a25afddea4579345d64acc60473e48b8b4176..388ebaf0fd791354373467e78edea9ab940e9567 100644 --- a/src/share/classes/sun/awt/datatransfer/SunClipboard.java +++ b/src/share/classes/sun/awt/datatransfer/SunClipboard.java @@ -64,9 +64,6 @@ import sun.awt.EventListenerAggregate; public abstract class SunClipboard extends Clipboard implements PropertyChangeListener { - public static final FlavorTable flavorMap = - (FlavorTable)SystemFlavorMap.getDefaultFlavorMap(); - private AppContext contentsContext = null; private final Object CLIPBOARD_FLAVOR_LISTENER_KEY; @@ -172,7 +169,7 @@ public abstract class SunClipboard extends Clipboard long[] formats = getClipboardFormatsOpenClose(); return DataTransferer.getInstance(). - getFlavorsForFormatsAsArray(formats, flavorMap); + getFlavorsForFormatsAsArray(formats, getDefaultFlavorTable()); } /** @@ -218,7 +215,7 @@ public abstract class SunClipboard extends Clipboard long[] formats = getClipboardFormats(); Long lFormat = (Long)DataTransferer.getInstance(). - getFlavorsForFormats(formats, flavorMap).get(flavor); + getFlavorsForFormats(formats, getDefaultFlavorTable()).get(flavor); if (lFormat == null) { throw new UnsupportedFlavorException(flavor); @@ -349,7 +346,7 @@ public abstract class SunClipboard extends Clipboard private static Set formatArrayAsDataFlavorSet(long[] formats) { return (formats == null) ? null : DataTransferer.getInstance(). - getFlavorsForFormatsAsSet(formats, flavorMap); + getFlavorsForFormatsAsSet(formats, getDefaultFlavorTable()); } @@ -469,4 +466,7 @@ public abstract class SunClipboard extends Clipboard } } + public static FlavorTable getDefaultFlavorTable() { + return (FlavorTable) SystemFlavorMap.getDefaultFlavorMap(); + } } diff --git a/src/solaris/classes/sun/awt/X11/XClipboard.java b/src/solaris/classes/sun/awt/X11/XClipboard.java index 6293bc52573ba471a5a3e328da6eddccf802f122..576820ac3d19c5586000521558e2a7fb34ee9ac0 100644 --- a/src/solaris/classes/sun/awt/X11/XClipboard.java +++ b/src/solaris/classes/sun/awt/X11/XClipboard.java @@ -86,7 +86,7 @@ public final class XClipboard extends SunClipboard implements OwnershipListener protected synchronized void setContentsNative(Transferable contents) { SortedMap formatMap = DataTransferer.getInstance().getFormatsForTransferable - (contents, DataTransferer.adaptFlavorMap(flavorMap)); + (contents, DataTransferer.adaptFlavorMap(getDefaultFlavorTable())); long[] formats = DataTransferer.keysToLongArray(formatMap); if (!selection.setOwner(contents, formatMap, formats, @@ -125,7 +125,7 @@ public final class XClipboard extends SunClipboard implements OwnershipListener private void checkChangeHere(Transferable contents) { if (areFlavorListenersRegistered()) { checkChange(DataTransferer.getInstance(). - getFormatsForTransferableAsArray(contents, flavorMap)); + getFormatsForTransferableAsArray(contents, getDefaultFlavorTable())); } } diff --git a/src/windows/classes/sun/awt/windows/WClipboard.java b/src/windows/classes/sun/awt/windows/WClipboard.java index 602d228f342ef6d76e3632c7e394a709efae6928..890a22029546a8b7208806e2a2289df1bccd9f12 100644 --- a/src/windows/classes/sun/awt/windows/WClipboard.java +++ b/src/windows/classes/sun/awt/windows/WClipboard.java @@ -63,7 +63,6 @@ public class WClipboard extends SunClipboard { } protected void setContentsNative(Transferable contents) { - // Don't use delayed Clipboard rendering for the Transferable's data. // If we did that, we would call Transferable.getTransferData on // the Toolkit thread, which is a security hole. @@ -72,7 +71,7 @@ public class WClipboard extends SunClipboard { // translated. Then, for each format, translate the data and post // it to the Clipboard. Map formatMap = WDataTransferer.getInstance(). - getFormatsForTransferable(contents, flavorMap); + getFormatsForTransferable(contents, getDefaultFlavorTable()); openClipboard(this);