From 69c9f2566ea36fa3317d762d4498637489c70c45 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 19 Nov 2024 19:35:28 +0000 Subject: [PATCH] 8344061: Remove doPrivileged calls from shared implementation code in the java.desktop module : part 2 Reviewed-by: aivanov --- .../classes/sun/awt/AWTAutoShutdown.java | 18 +- .../share/classes/sun/awt/AppContext.java | 196 ++---- .../classes/sun/awt/CausedFocusEvent.java | 19 +- .../share/classes/sun/awt/DebugSettings.java | 13 +- .../classes/sun/awt/FontConfiguration.java | 37 +- .../share/classes/sun/awt/FontDescriptor.java | 5 +- .../classes/sun/awt/NativeLibLoader.java | 10 +- .../sun/awt/datatransfer/DataTransferer.java | 83 +-- .../awt/datatransfer/TransferableProxy.java | 20 +- .../awt/im/ExecutableInputMethodManager.java | 31 +- .../classes/sun/awt/im/InputContext.java | 24 +- .../sun/awt/im/InputMethodContext.java | 5 +- .../classes/sun/font/CreatedFontTracker.java | 30 +- .../share/classes/sun/font/FileFont.java | 99 +-- .../sun/font/FontManagerNativeLibrary.java | 47 +- .../share/classes/sun/font/FontUtilities.java | 98 ++- .../share/classes/sun/font/StrikeCache.java | 48 +- .../classes/sun/font/SunFontManager.java | 582 ++++++++---------- .../classes/sun/font/SunLayoutEngine.java | 7 +- .../share/classes/sun/font/TrueTypeFont.java | 22 +- .../share/classes/sun/font/Type1Font.java | 47 +- 21 files changed, 523 insertions(+), 918 deletions(-) diff --git a/src/java.desktop/share/classes/sun/awt/AWTAutoShutdown.java b/src/java.desktop/share/classes/sun/awt/AWTAutoShutdown.java index bb7fb64f7f1..e944d19e1c1 100644 --- a/src/java.desktop/share/classes/sun/awt/AWTAutoShutdown.java +++ b/src/java.desktop/share/classes/sun/awt/AWTAutoShutdown.java @@ -26,8 +26,6 @@ package sun.awt; import java.awt.AWTEvent; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Map; @@ -333,17 +331,13 @@ public final class AWTAutoShutdown implements Runnable { * Creates and starts a new blocker thread. Doesn't return until * the new blocker thread starts. */ - @SuppressWarnings("removal") private void activateBlockerThread() { - AccessController.doPrivileged((PrivilegedAction) () -> { - String name = "AWT-Shutdown"; - Thread thread = new Thread( - ThreadGroupUtils.getRootThreadGroup(), this, name, 0, false); - thread.setContextClassLoader(null); - thread.setDaemon(false); - blockerThread = thread; - return thread; - }).start(); + String name = "AWT-Shutdown"; + Thread thread = new Thread(ThreadGroupUtils.getRootThreadGroup(), this, name, 0, false); + thread.setContextClassLoader(null); + thread.setDaemon(false); + blockerThread = thread; + thread.start(); try { /* Wait for the blocker thread to start. */ mainLock.wait(); diff --git a/src/java.desktop/share/classes/sun/awt/AppContext.java b/src/java.desktop/share/classes/sun/awt/AppContext.java index fa098af556d..48482dfc39a 100644 --- a/src/java.desktop/share/classes/sun/awt/AppContext.java +++ b/src/java.desktop/share/classes/sun/awt/AppContext.java @@ -32,8 +32,6 @@ import java.awt.TrayIcon; import java.awt.Toolkit; import java.awt.GraphicsEnvironment; import java.awt.event.InvocationEvent; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.Collections; import java.util.HashMap; import java.util.IdentityHashMap; @@ -229,20 +227,13 @@ public final class AppContext { * @see sun.awt.SunToolkit * @since 1.2 */ - @SuppressWarnings("removal") AppContext(ThreadGroup threadGroup) { numAppContexts.incrementAndGet(); this.threadGroup = threadGroup; threadGroup2appContext.put(threadGroup, this); - this.contextClassLoader = - AccessController.doPrivileged(new PrivilegedAction() { - public ClassLoader run() { - return Thread.currentThread().getContextClassLoader(); - } - }); - + this.contextClassLoader = Thread.currentThread().getContextClassLoader(); // Initialize push/pop lock and its condition to be used by all the // EventQueues within this AppContext Lock eventQueuePushPopLock = new ReentrantLock(); @@ -254,26 +245,19 @@ public final class AppContext { private static final ThreadLocal threadAppContext = new ThreadLocal(); - @SuppressWarnings("removal") private static void initMainAppContext() { // On the main Thread, we get the ThreadGroup, make a corresponding // AppContext, and instantiate the Java EventQueue. This way, legacy // code is unaffected by the move to multiple AppContext ability. - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - ThreadGroup currentThreadGroup = - Thread.currentThread().getThreadGroup(); - ThreadGroup parentThreadGroup = currentThreadGroup.getParent(); - while (parentThreadGroup != null) { - // Find the root ThreadGroup to construct our main AppContext - currentThreadGroup = parentThreadGroup; - parentThreadGroup = currentThreadGroup.getParent(); - } + ThreadGroup currentThreadGroup = Thread.currentThread().getThreadGroup(); + ThreadGroup parentThreadGroup = currentThreadGroup.getParent(); + while (parentThreadGroup != null) { + // Find the root ThreadGroup to construct our main AppContext + currentThreadGroup = parentThreadGroup; + parentThreadGroup = currentThreadGroup.getParent(); + } - mainAppContext = SunToolkit.createNewAppContext(currentThreadGroup); - return null; - } - }); + mainAppContext = SunToolkit.createNewAppContext(currentThreadGroup); } /** @@ -284,7 +268,6 @@ public final class AppContext { * @see java.lang.ThreadGroup * @since 1.2 */ - @SuppressWarnings("removal") public static AppContext getAppContext() { // we are standalone app, return the main app context if (numAppContexts.get() == 1 && mainAppContext != null) { @@ -294,69 +277,53 @@ public final class AppContext { AppContext appContext = threadAppContext.get(); if (null == appContext) { - appContext = AccessController.doPrivileged(new PrivilegedAction() - { - public AppContext run() { - // Get the current ThreadGroup, and look for it and its - // parents in the hash from ThreadGroup to AppContext -- - // it should be found, because we use createNewContext() - // when new AppContext objects are created. - ThreadGroup currentThreadGroup = Thread.currentThread().getThreadGroup(); - ThreadGroup threadGroup = currentThreadGroup; + // Get the current ThreadGroup, and look for it and its + // parents in the hash from ThreadGroup to AppContext -- + // it should be found, because we use createNewContext() + // when new AppContext objects are created. + ThreadGroup currentThreadGroup = Thread.currentThread().getThreadGroup(); + ThreadGroup threadGroup = currentThreadGroup; - // Special case: we implicitly create the main app context - // if no contexts have been created yet. This covers standalone apps - // and excludes applets because by the time applet starts - // a number of contexts have already been created by the plugin. - synchronized (getAppContextLock) { - if (numAppContexts.get() == 0) { - if (System.getProperty("javaplugin.version") == null && - System.getProperty("javawebstart.version") == null) { - initMainAppContext(); - } else if (System.getProperty("javafx.version") != null && - threadGroup.getParent() != null) { - // Swing inside JavaFX case - SunToolkit.createNewAppContext(); - } - } + // Special case: we implicitly create the main app context + // if no contexts have been created yet. This covers standalone apps + // and excludes applets because by the time applet starts + // a number of contexts have already been created by the plugin. + synchronized (getAppContextLock) { + if (numAppContexts.get() == 0) { + if (System.getProperty("javaplugin.version") == null && + System.getProperty("javawebstart.version") == null) { + initMainAppContext(); + } else if (System.getProperty("javafx.version") != null && + threadGroup.getParent() != null) { + // Swing inside JavaFX case + SunToolkit.createNewAppContext(); } - - AppContext context = threadGroup2appContext.get(threadGroup); - while (context == null) { - threadGroup = threadGroup.getParent(); - if (threadGroup == null) { - // We've got up to the root thread group and did not find an AppContext - // Try to get it from the security manager - SecurityManager securityManager = System.getSecurityManager(); - if (securityManager != null) { - ThreadGroup smThreadGroup = securityManager.getThreadGroup(); - if (smThreadGroup != null) { - /* - * If we get this far then it's likely that - * the ThreadGroup does not actually belong - * to the applet, so do not cache it. - */ - return threadGroup2appContext.get(smThreadGroup); - } - } - return null; - } - context = threadGroup2appContext.get(threadGroup); - } - - // In case we did anything in the above while loop, we add - // all the intermediate ThreadGroups to threadGroup2appContext - // so we won't spin again. - for (ThreadGroup tg = currentThreadGroup; tg != threadGroup; tg = tg.getParent()) { - threadGroup2appContext.put(tg, context); - } - - // Now we're done, so we cache the latest key/value pair. - threadAppContext.set(context); - - return context; } - }); + } + + AppContext context = threadGroup2appContext.get(threadGroup); + while (context == null) { + threadGroup = threadGroup.getParent(); + if (threadGroup == null) { + // We've got up to the root thread group and did not find an AppContext + // We have nowhere else to look, and this is not supposed to happen. + // return null from this whole method. + return null; + } + context = threadGroup2appContext.get(threadGroup); + } + + // In case we did anything in the above while loop, we add + // all the intermediate ThreadGroups to threadGroup2appContext + // so we won't spin again. + for (ThreadGroup tg = currentThreadGroup; tg != threadGroup; tg = tg.getParent()) { + threadGroup2appContext.put(tg, context); + } + + // Now we're done, so we cache the latest key/value pair. + threadAppContext.set(context); + + appContext = context; } return appContext; @@ -395,7 +362,7 @@ public final class AppContext { * contained within this AppContext * @since 1.2 */ - @SuppressWarnings({"deprecation", "removal"}) + @SuppressWarnings("deprecation") public void dispose() throws IllegalThreadStateException { System.err.println( """ @@ -439,19 +406,13 @@ public final class AppContext { log.finer("exception occurred while disposing app context", t); } } - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - if (!GraphicsEnvironment.isHeadless() && SystemTray.isSupported()) - { - SystemTray systemTray = SystemTray.getSystemTray(); - TrayIcon[] trayIconsToDispose = systemTray.getTrayIcons(); - for (TrayIcon ti : trayIconsToDispose) { - systemTray.remove(ti); - } - } - return null; - } - }); + if (!GraphicsEnvironment.isHeadless() && SystemTray.isSupported()) { + SystemTray systemTray = SystemTray.getSystemTray(); + TrayIcon[] trayIconsToDispose = systemTray.getTrayIcons(); + for (TrayIcon ti : trayIconsToDispose) { + systemTray.remove(ti); + } + } // Alert PropertyChangeListeners that the GUI has been disposed. if (changeSupport != null) { changeSupport.firePropertyChange(GUI_DISPOSED, false, true); @@ -546,25 +507,6 @@ public final class AppContext { } } - static final class CreateThreadAction implements PrivilegedAction { - private final AppContext appContext; - private final Runnable runnable; - - CreateThreadAction(AppContext ac, Runnable r) { - appContext = ac; - runnable = r; - } - - public Thread run() { - Thread t = new Thread(appContext.getThreadGroup(), - runnable, "AppContext Disposer", 0, false); - t.setContextClassLoader(appContext.getContextClassLoader()); - t.setPriority(Thread.NORM_PRIORITY + 1); - t.setDaemon(true); - return t; - } - } - static void stopEventDispatchThreads() { for (AppContext appContext: getAppContexts()) { if (appContext.isDisposed()) { @@ -576,9 +518,11 @@ public final class AppContext { if (appContext != AppContext.getAppContext()) { // Create a thread that belongs to the thread group associated // with the AppContext and invokes EventQueue.postEvent. - PrivilegedAction action = new CreateThreadAction(appContext, r); - @SuppressWarnings("removal") - Thread thread = AccessController.doPrivileged(action); + Thread thread = new Thread(appContext.getThreadGroup(), + r, "AppContext Disposer", 0, false); + thread.setContextClassLoader(appContext.getContextClassLoader()); + thread.setPriority(Thread.NORM_PRIORITY + 1); + thread.setDaemon(true); thread.start(); } else { r.run(); @@ -806,14 +750,8 @@ public final class AppContext { // Set up JavaAWTAccess in SharedSecrets static { SharedSecrets.setJavaAWTAccess(new JavaAWTAccess() { - @SuppressWarnings("removal") private boolean hasRootThreadGroup(final AppContext ecx) { - return AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Boolean run() { - return ecx.threadGroup.getParent() == null; - } - }); + return ecx.threadGroup.getParent() == null; } /** diff --git a/src/java.desktop/share/classes/sun/awt/CausedFocusEvent.java b/src/java.desktop/share/classes/sun/awt/CausedFocusEvent.java index a19e4f394e1..2527eda11f6 100644 --- a/src/java.desktop/share/classes/sun/awt/CausedFocusEvent.java +++ b/src/java.desktop/share/classes/sun/awt/CausedFocusEvent.java @@ -30,8 +30,6 @@ import java.awt.event.FocusEvent; import java.io.ObjectStreamException; import java.io.Serial; import java.lang.reflect.Field; -import java.security.AccessController; -import java.security.PrivilegedAction; /** * This class exists for deserialization compatibility only. @@ -72,7 +70,6 @@ class CausedFocusEvent extends FocusEvent { throw new IllegalStateException(); } - @SuppressWarnings("removal") @Serial Object readResolve() throws ObjectStreamException { FocusEvent.Cause newCause; @@ -119,17 +116,11 @@ class CausedFocusEvent extends FocusEvent { focusEvent.setSource(null); try { final Field consumedField = FocusEvent.class.getField("consumed"); - AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Object run() { - consumedField.setAccessible(true); - try { - consumedField.set(focusEvent, consumed); - } catch (IllegalAccessException e) { - } - return null; - } - }); + consumedField.setAccessible(true); + try { + consumedField.set(focusEvent, consumed); + } catch (IllegalAccessException e) { + } } catch (NoSuchFieldException e) { } diff --git a/src/java.desktop/share/classes/sun/awt/DebugSettings.java b/src/java.desktop/share/classes/sun/awt/DebugSettings.java index 9d89b6519b7..b95ac44ba54 100644 --- a/src/java.desktop/share/classes/sun/awt/DebugSettings.java +++ b/src/java.desktop/share/classes/sun/awt/DebugSettings.java @@ -108,18 +108,11 @@ public final class DebugSettings { * Load debug properties from file, then override * with any command line specified properties */ - @SuppressWarnings("removal") private synchronized void loadProperties() { // setup initial properties - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Void run() { - loadDefaultProperties(); - loadFileProperties(); - loadSystemProperties(); - return null; - } - }); + loadDefaultProperties(); + loadFileProperties(); + loadSystemProperties(); // echo the initial property settings to stdout if (log.isLoggable(PlatformLogger.Level.FINE)) { diff --git a/src/java.desktop/share/classes/sun/awt/FontConfiguration.java b/src/java.desktop/share/classes/sun/awt/FontConfiguration.java index 9fffa09ed6c..0054382e8f6 100644 --- a/src/java.desktop/share/classes/sun/awt/FontConfiguration.java +++ b/src/java.desktop/share/classes/sun/awt/FontConfiguration.java @@ -35,8 +35,6 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -120,7 +118,7 @@ public abstract class FontConfiguration { this.preferPropFonts = preferPropFonts; /* fontConfig should be initialised by default constructor, and * its data tables can be shared, since readFontConfigFile doesn't - * update any other state. Also avoid a doPrivileged block. + * update any other state. */ initFontConfig(); } @@ -156,20 +154,8 @@ public abstract class FontConfiguration { short fontNameID = compFontNameIDs[0][0][0]; short fileNameID = getComponentFileID(fontNameID); final String fileName = mapFileName(getComponentFileName(fileNameID)); - @SuppressWarnings("removal") - Boolean exists = java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Boolean run() { - try { - File f = new File(fileName); - return Boolean.valueOf(f.exists()); - } - catch (Exception e) { - return Boolean.FALSE; - } - } - }); - return exists.booleanValue(); + File f = new File(fileName); + return f.exists(); } private void findFontConfigFile() { @@ -960,18 +946,11 @@ public abstract class FontConfiguration { !charsetName.startsWith("sun.font.")) { fc = Charset.forName(charsetName); } else { - @SuppressWarnings("removal") - Class fcc = AccessController.doPrivileged(new PrivilegedAction>() { - public Class run() { - try { - return Class.forName(charsetName, true, - ClassLoader.getSystemClassLoader()); - } catch (ClassNotFoundException e) { - } - return null; - } - }); - + Class fcc = null; + try { + fcc = Class.forName(charsetName, true, ClassLoader.getSystemClassLoader()); + } catch (ClassNotFoundException e) { + } if (fcc != null) { try { fc = (Charset) fcc.getDeclaredConstructor().newInstance(); diff --git a/src/java.desktop/share/classes/sun/awt/FontDescriptor.java b/src/java.desktop/share/classes/sun/awt/FontDescriptor.java index 046ecce16da..4a16cd8d811 100644 --- a/src/java.desktop/share/classes/sun/awt/FontDescriptor.java +++ b/src/java.desktop/share/classes/sun/awt/FontDescriptor.java @@ -120,10 +120,7 @@ public class FontDescriptor implements Cloneable { } static boolean isLE; static { - @SuppressWarnings("removal") - String enc = java.security.AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("sun.io.unicode.encoding", - "UnicodeBig")); + String enc = System.getProperty("sun.io.unicode.encoding", "UnicodeBig"); isLE = !"UnicodeBig".equals(enc); } } diff --git a/src/java.desktop/share/classes/sun/awt/NativeLibLoader.java b/src/java.desktop/share/classes/sun/awt/NativeLibLoader.java index 868ebdf3699..4bb49ae0b10 100644 --- a/src/java.desktop/share/classes/sun/awt/NativeLibLoader.java +++ b/src/java.desktop/share/classes/sun/awt/NativeLibLoader.java @@ -52,14 +52,8 @@ class NativeLibLoader { * For now, we know it's done by the implementation, and we assume * that the name of the library is "awt". -br. */ - @SuppressWarnings({"removal", "restricted"}) + @SuppressWarnings("restricted") static void loadLibraries() { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Void run() { - System.loadLibrary("awt"); - return null; - } - }); + System.loadLibrary("awt"); } } diff --git a/src/java.desktop/share/classes/sun/awt/datatransfer/DataTransferer.java b/src/java.desktop/share/classes/sun/awt/datatransfer/DataTransferer.java index 23520de9eea..5014bb78ead 100644 --- a/src/java.desktop/share/classes/sun/awt/datatransfer/DataTransferer.java +++ b/src/java.desktop/share/classes/sun/awt/datatransfer/DataTransferer.java @@ -62,10 +62,6 @@ import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.UnsupportedCharsetException; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.security.ProtectionDomain; import java.util.AbstractMap; import java.util.ArrayList; @@ -985,7 +981,6 @@ search: @SuppressWarnings("removal") private String removeSuspectedData(DataFlavor flavor, final Transferable contents, final String str) - throws IOException { if (null == System.getSecurityManager() || !flavor.isMimeTypeEqual("text/uri-list")) @@ -994,34 +989,25 @@ search: } final ProtectionDomain userProtectionDomain = getUserProtectionDomain(contents); + StringBuilder allowedFiles = new StringBuilder(str.length()); + String [] uriArray = str.split("(\\s)+"); - try { - return AccessController.doPrivileged((PrivilegedExceptionAction) () -> { - - StringBuilder allowedFiles = new StringBuilder(str.length()); - String [] uriArray = str.split("(\\s)+"); - - for (String fileName : uriArray) + for (String fileName : uriArray) + { + File file = new File(fileName); + if (file.exists() && + !(isFileInWebstartedCache(file) || + isForbiddenToRead(file, userProtectionDomain))) + { + if (0 != allowedFiles.length()) { - File file = new File(fileName); - if (file.exists() && - !(isFileInWebstartedCache(file) || - isForbiddenToRead(file, userProtectionDomain))) - { - if (0 != allowedFiles.length()) - { - allowedFiles.append("\\r\\n"); - } - - allowedFiles.append(fileName); - } + allowedFiles.append("\\r\\n"); } - return allowedFiles.toString(); - }); - } catch (PrivilegedActionException pae) { - throw new IOException(pae.getMessage(), pae); + allowedFiles.append(fileName); + } } + return allowedFiles.toString(); } private static ProtectionDomain getUserProtectionDomain(Transferable contents) { @@ -1047,25 +1033,19 @@ search: @SuppressWarnings("removal") private ArrayList castToFiles(final List files, final ProtectionDomain userProtectionDomain) throws IOException { - try { - return AccessController.doPrivileged((PrivilegedExceptionAction>) () -> { - ArrayList fileList = new ArrayList<>(); - for (Object fileObject : files) - { - File file = castToFile(fileObject); - if (file != null && - (null == System.getSecurityManager() || - !(isFileInWebstartedCache(file) || - isForbiddenToRead(file, userProtectionDomain)))) - { - fileList.add(file.getCanonicalPath()); - } - } - return fileList; - }); - } catch (PrivilegedActionException pae) { - throw new IOException(pae.getMessage()); + ArrayList fileList = new ArrayList<>(); + for (Object fileObject : files) + { + File file = castToFile(fileObject); + if (file != null && + (null == System.getSecurityManager() || + !(isFileInWebstartedCache(file) || + isForbiddenToRead(file, userProtectionDomain)))) + { + fileList.add(file.getCanonicalPath()); + } } + return fileList; } // It is important do not use user's successors @@ -1419,7 +1399,6 @@ search: * and also arbitrary Objects which have a constructor which takes an * instance of the Class as its sole parameter. */ - @SuppressWarnings("removal") private Object constructFlavoredObject(Object arg, DataFlavor flavor, Class clazz) throws IOException @@ -1429,15 +1408,7 @@ search: if (clazz.equals(dfrc)) { return arg; // simple case } else { - Constructor[] constructors; - - try { - constructors = AccessController.doPrivileged( - (PrivilegedAction[]>) dfrc::getConstructors); - } catch (SecurityException se) { - throw new IOException(se.getMessage()); - } - + Constructor[] constructors = dfrc.getConstructors(); Constructor constructor = Stream.of(constructors) .filter(c -> Modifier.isPublic(c.getModifiers())) .filter(c -> { diff --git a/src/java.desktop/share/classes/sun/awt/datatransfer/TransferableProxy.java b/src/java.desktop/share/classes/sun/awt/datatransfer/TransferableProxy.java index cf8660fa8fa..fffb3f98a3e 100644 --- a/src/java.desktop/share/classes/sun/awt/datatransfer/TransferableProxy.java +++ b/src/java.desktop/share/classes/sun/awt/datatransfer/TransferableProxy.java @@ -38,8 +38,6 @@ import java.io.ObjectStreamClass; import java.io.OutputStream; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -111,28 +109,14 @@ final class ClassLoaderObjectOutputStream extends ObjectOutputStream { } protected void annotateClass(final Class cl) throws IOException { - @SuppressWarnings("removal") - ClassLoader classLoader = AccessController.doPrivileged( - new PrivilegedAction() { - public ClassLoader run() { - return cl.getClassLoader(); - } - }); - + ClassLoader classLoader = cl.getClassLoader(); Set s = new HashSet(1); s.add(cl.getName()); map.put(s, classLoader); } protected void annotateProxyClass(final Class cl) throws IOException { - @SuppressWarnings("removal") - ClassLoader classLoader = AccessController.doPrivileged( - new PrivilegedAction() { - public ClassLoader run() { - return cl.getClassLoader(); - } - }); - + ClassLoader classLoader = cl.getClassLoader(); Class[] interfaces = cl.getInterfaces(); Set s = new HashSet(interfaces.length); for (int i = 0; i < interfaces.length; i++) { diff --git a/src/java.desktop/share/classes/sun/awt/im/ExecutableInputMethodManager.java b/src/java.desktop/share/classes/sun/awt/im/ExecutableInputMethodManager.java index 3696d53945b..b937fb139a3 100644 --- a/src/java.desktop/share/classes/sun/awt/im/ExecutableInputMethodManager.java +++ b/src/java.desktop/share/classes/sun/awt/im/ExecutableInputMethodManager.java @@ -41,10 +41,6 @@ import java.awt.event.ActionListener; import java.awt.event.InvocationEvent; import java.awt.im.spi.InputMethodDescriptor; import java.lang.reflect.InvocationTargetException; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.util.Hashtable; import java.util.Iterator; import java.util.Locale; @@ -252,24 +248,14 @@ class ExecutableInputMethodManager extends InputMethodManager * initializes the input method locator list for all * installed input method descriptors. */ - @SuppressWarnings("removal") private void initializeInputMethodLocatorList() { synchronized (javaInputMethodLocatorList) { javaInputMethodLocatorList.clear(); - try { - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() { - for (InputMethodDescriptor descriptor : - ServiceLoader.load(InputMethodDescriptor.class, - ClassLoader.getSystemClassLoader())) { - ClassLoader cl = descriptor.getClass().getClassLoader(); - javaInputMethodLocatorList.add(new InputMethodLocator(descriptor, cl, null)); - } - return null; - } - }); - } catch (PrivilegedActionException e) { - e.printStackTrace(); + for (InputMethodDescriptor descriptor : + ServiceLoader.load(InputMethodDescriptor.class, + ClassLoader.getSystemClassLoader())) { + ClassLoader cl = descriptor.getClass().getClassLoader(); + javaInputMethodLocatorList.add(new InputMethodLocator(descriptor, cl, null)); } javaInputMethodCount = javaInputMethodLocatorList.size(); } @@ -594,13 +580,8 @@ class ExecutableInputMethodManager extends InputMethodManager } } - @SuppressWarnings("removal") private Preferences getUserRoot() { - return AccessController.doPrivileged(new PrivilegedAction() { - public Preferences run() { - return Preferences.userRoot(); - } - }); + return Preferences.userRoot(); } private Locale getAdvertisedLocale(InputMethodLocator locator, Locale locale) { diff --git a/src/java.desktop/share/classes/sun/awt/im/InputContext.java b/src/java.desktop/share/classes/sun/awt/im/InputContext.java index 6d3dc248abf..00703eb44c3 100644 --- a/src/java.desktop/share/classes/sun/awt/im/InputContext.java +++ b/src/java.desktop/share/classes/sun/awt/im/InputContext.java @@ -44,8 +44,6 @@ import java.awt.event.WindowListener; import java.awt.im.InputMethodRequests; import java.awt.im.spi.InputMethod; import java.lang.Character.Subset; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.text.MessageFormat; import java.util.Collection; import java.util.HashMap; @@ -1036,22 +1034,16 @@ public class InputContext extends java.awt.im.InputContext /** * Initializes the input method selection key definition in preference trees */ - @SuppressWarnings("removal") private void initializeInputMethodSelectionKey() { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - // Look in user's tree - Preferences root = Preferences.userRoot(); - inputMethodSelectionKey = getInputMethodSelectionKeyStroke(root); + // Look in user's tree + Preferences root = Preferences.userRoot(); + inputMethodSelectionKey = getInputMethodSelectionKeyStroke(root); - if (inputMethodSelectionKey == null) { - // Look in system's tree - root = Preferences.systemRoot(); - inputMethodSelectionKey = getInputMethodSelectionKeyStroke(root); - } - return null; - } - }); + if (inputMethodSelectionKey == null) { + // Look in system's tree + root = Preferences.systemRoot(); + inputMethodSelectionKey = getInputMethodSelectionKeyStroke(root); + } } private AWTKeyStroke getInputMethodSelectionKeyStroke(Preferences root) { diff --git a/src/java.desktop/share/classes/sun/awt/im/InputMethodContext.java b/src/java.desktop/share/classes/sun/awt/im/InputMethodContext.java index 96d53178783..a0f9baa3112 100644 --- a/src/java.desktop/share/classes/sun/awt/im/InputMethodContext.java +++ b/src/java.desktop/share/classes/sun/awt/im/InputMethodContext.java @@ -37,7 +37,6 @@ import java.awt.event.InputMethodEvent; import java.awt.font.TextHitInfo; import java.awt.im.InputMethodRequests; import java.awt.im.spi.InputMethod; -import java.security.AccessController; import java.text.AttributedCharacterIterator; import java.text.AttributedCharacterIterator.Attribute; import java.text.AttributedString; @@ -72,9 +71,7 @@ public class InputMethodContext static { // check whether we should use below-the-spot input // get property from command line - @SuppressWarnings("removal") - String inputStyle = AccessController.doPrivileged - (new GetPropertyAction("java.awt.im.style", null)); + String inputStyle = System.getProperty("java.awt.im.style"); // get property from awt.properties file if (inputStyle == null) { inputStyle = Toolkit.getProperty("java.awt.im.style", null); diff --git a/src/java.desktop/share/classes/sun/font/CreatedFontTracker.java b/src/java.desktop/share/classes/sun/font/CreatedFontTracker.java index 61f48e8d098..a144f14f4a9 100644 --- a/src/java.desktop/share/classes/sun/font/CreatedFontTracker.java +++ b/src/java.desktop/share/classes/sun/font/CreatedFontTracker.java @@ -27,8 +27,6 @@ package sun.font; import java.io.File; import java.io.OutputStream; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Semaphore; @@ -112,25 +110,21 @@ public class CreatedFontTracker { private static HashMap files = new HashMap<>(); private static Thread t = null; - @SuppressWarnings("removal") static void init() { if (t == null) { // Add a shutdown hook to remove the temp file. - AccessController.doPrivileged((PrivilegedAction) () -> { - /* The thread must be a member of a thread group - * which will not get GCed before VM exit. - * Make its parent the top-level thread group. - */ - ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup(); - t = new Thread(rootTG, TempFileDeletionHook::runHooks, - "TempFontFileDeleter", 0, false); - /* Set context class loader to null in order to avoid - * keeping a strong reference to an application classloader. - */ - t.setContextClassLoader(null); - Runtime.getRuntime().addShutdownHook(t); - return null; - }); + /* The thread must be a member of a thread group + * which will not get GCed before VM exit. + * Make its parent the top-level thread group. + */ + ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup(); + t = new Thread(rootTG, TempFileDeletionHook::runHooks, + "TempFontFileDeleter", 0, false); + /* Set context class loader to null in order to avoid + * keeping a strong reference to an application classloader. + */ + t.setContextClassLoader(null); + Runtime.getRuntime().addShutdownHook(t); } } diff --git a/src/java.desktop/share/classes/sun/font/FileFont.java b/src/java.desktop/share/classes/sun/font/FileFont.java index da5874518fa..47c6ea181f4 100644 --- a/src/java.desktop/share/classes/sun/font/FileFont.java +++ b/src/java.desktop/share/classes/sun/font/FileFont.java @@ -35,11 +35,7 @@ import java.nio.ByteBuffer; import sun.java2d.Disposer; import sun.java2d.DisposerRecord; -import java.io.IOException; import java.util.List; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; public abstract class FileFont extends PhysicalFont { @@ -252,84 +248,35 @@ public abstract class FileFont extends PhysicalFont { this.tracker = tracker; } - @SuppressWarnings("removal") public void dispose() { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - synchronized (fontFile) { - count--; - if (count > 0) { - return null; - } - } - if (fontFile != null) { - try { - if (tracker != null) { - tracker.subBytes((int)fontFile.length()); - } - /* REMIND: is it possible that the file is - * still open? It will be closed when the - * font2D is disposed but could this code - * execute first? If so the file would not - * be deleted on MS-windows. - */ - fontFile.delete(); - /* remove from delete on exit hook list : */ - // FIXME: still need to be refactored - SunFontManager.getInstance().tmpFontFiles.remove(fontFile); - } catch (Exception e) { - } - } - return null; + synchronized (fontFile) { + count--; + if (count > 0) { + return; + } + } + if (fontFile != null) { + try { + if (tracker != null) { + tracker.subBytes((int)fontFile.length()); } - }); + /* REMIND: is it possible that the file is + * still open? It will be closed when the + * font2D is disposed but could this code + * execute first? If so the file would not + * be deleted on MS-windows. + */ + fontFile.delete(); + /* remove from delete on exit hook list : */ + // FIXME: still need to be refactored + SunFontManager.getInstance().tmpFontFiles.remove(fontFile); + } catch (Exception e) { + } + } } } - @SuppressWarnings("removal") protected String getPublicFileName() { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { return platName; - } - boolean canReadProperty = true; - - try { - sm.checkPropertyAccess("java.io.tmpdir"); - } catch (SecurityException e) { - canReadProperty = false; - } - - if (canReadProperty) { - return platName; - } - - final File f = new File(platName); - - Boolean isTmpFile = Boolean.FALSE; - try { - isTmpFile = AccessController.doPrivileged( - new PrivilegedExceptionAction() { - public Boolean run() { - File tmp = new File(System.getProperty("java.io.tmpdir")); - try { - String tpath = tmp.getCanonicalPath(); - String fpath = f.getCanonicalPath(); - - return (fpath == null) || fpath.startsWith(tpath); - } catch (IOException e) { - return Boolean.TRUE; - } - } - } - ); - } catch (PrivilegedActionException e) { - // unable to verify whether value of java.io.tempdir will be - // exposed, so return only a name of the font file. - isTmpFile = Boolean.TRUE; - } - - return isTmpFile ? "temp file" : platName; } } diff --git a/src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java b/src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java index 9439f6ed857..51997571e75 100644 --- a/src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java +++ b/src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java @@ -27,39 +27,32 @@ package sun.font; import sun.awt.OSInfo; -@SuppressWarnings({"removal", "restricted"}) +@SuppressWarnings("restricted") public class FontManagerNativeLibrary { static { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - /* REMIND do we really have to load awt here? */ - System.loadLibrary("awt"); - if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) { - /* Ideally fontmanager library should not depend on - particular implementation of the font scaler. - However, freetype scaler is basically small wrapper on - top of freetype library (that is used in binary form). + /* REMIND do we really have to load awt here? */ + System.loadLibrary("awt"); + if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) { + /* Ideally fontmanager library should not depend on + particular implementation of the font scaler. + However, freetype scaler is basically small wrapper on + top of freetype library (that is used in binary form). - This wrapper is compiled into fontmanager and this make - fontmanger library depending on freetype library. + This wrapper is compiled into fontmanager and this make + fontmanger library depending on freetype library. - On Windows DLL's in the JRE's BIN directory cannot be - found by windows DLL loading as that directory is not - on the Windows PATH. + On Windows DLL's in the JRE's BIN directory cannot be + found by windows DLL loading as that directory is not + on the Windows PATH. - To avoid link error we have to load freetype explicitly - before we load fontmanager. + To avoid link error we have to load freetype explicitly + before we load fontmanager. - NB: consider moving freetype wrapper part to separate - shared library in order to avoid dependency. */ - System.loadLibrary("freetype"); - } - System.loadLibrary("fontmanager"); - - return null; - } - }); + NB: consider moving freetype wrapper part to separate + shared library in order to avoid dependency. */ + System.loadLibrary("freetype"); + } + System.loadLibrary("fontmanager"); } /* diff --git a/src/java.desktop/share/classes/sun/font/FontUtilities.java b/src/java.desktop/share/classes/sun/font/FontUtilities.java index bdccf99d1ed..30ec4f3db81 100644 --- a/src/java.desktop/share/classes/sun/font/FontUtilities.java +++ b/src/java.desktop/share/classes/sun/font/FontUtilities.java @@ -28,9 +28,7 @@ package sun.font; import java.awt.Font; import java.lang.ref.SoftReference; import java.util.concurrent.ConcurrentHashMap; -import java.security.AccessController; -import java.security.PrivilegedAction; import javax.swing.plaf.FontUIResource; import sun.awt.OSInfo; @@ -59,65 +57,57 @@ public final class FontUtilities { initStatic(); } - @SuppressWarnings("removal") + @SuppressWarnings("deprecation") // PlatformLogger.setLevel is deprecated. private static void initStatic() { - AccessController.doPrivileged(new PrivilegedAction() { - @SuppressWarnings("deprecation") // PlatformLogger.setLevel is deprecated. - @Override - public Object run() { - isLinux = OSInfo.getOSType() == OSInfo.OSType.LINUX; + isLinux = OSInfo.getOSType() == OSInfo.OSType.LINUX; - isMacOSX = OSInfo.getOSType() == OSInfo.OSType.MACOSX; - if (isMacOSX) { - // os.version has values like 10.13.6, 10.14.6 - // If it is not positively recognised as 10.13 or less, - // assume it means 10.14 or some later version. - isMacOSX14 = true; - String version = System.getProperty("os.version", ""); - if (version.startsWith("10.")) { - version = version.substring(3); - int periodIndex = version.indexOf('.'); - if (periodIndex != -1) { - version = version.substring(0, periodIndex); - } - try { - int v = Integer.parseInt(version); - isMacOSX14 = (v >= 14); - } catch (NumberFormatException e) { - } - } - } - /* If set to "jdk", use the JDK's scaler rather than - * the platform one. This may be a no-op on platforms where - * JDK has been configured so that it always relies on the - * platform scaler. The principal case where it has an - * effect is that on Windows, 2D will never use GDI. - */ - String scalerStr = System.getProperty("sun.java2d.font.scaler"); - if (scalerStr != null) { - useJDKScaler = "jdk".equals(scalerStr); - } else { - useJDKScaler = false; + isMacOSX = OSInfo.getOSType() == OSInfo.OSType.MACOSX; + if (isMacOSX) { + // os.version has values like 10.13.6, 10.14.6 + // If it is not positively recognised as 10.13 or less, + // assume it means 10.14 or some later version. + isMacOSX14 = true; + String version = System.getProperty("os.version", ""); + if (version.startsWith("10.")) { + version = version.substring(3); + int periodIndex = version.indexOf('.'); + if (periodIndex != -1) { + version = version.substring(0, periodIndex); } - isWindows = OSInfo.getOSType() == OSInfo.OSType.WINDOWS; - String debugLevel = - System.getProperty("sun.java2d.debugfonts"); - - if (debugLevel != null && !debugLevel.equals("false")) { - debugFonts = true; - logger = PlatformLogger.getLogger("sun.java2d"); - if (debugLevel.equals("warning")) { - logger.setLevel(PlatformLogger.Level.WARNING); - } else if (debugLevel.equals("severe")) { - logger.setLevel(PlatformLogger.Level.SEVERE); - } - logging = logger.isEnabled(); + try { + int v = Integer.parseInt(version); + isMacOSX14 = (v >= 14); + } catch (NumberFormatException e) { } + } + } + /* If set to "jdk", use the JDK's scaler rather than + * the platform one. This may be a no-op on platforms where + * JDK has been configured so that it always relies on the + * platform scaler. The principal case where it has an + * effect is that on Windows, 2D will never use GDI. + */ + String scalerStr = System.getProperty("sun.java2d.font.scaler"); + if (scalerStr != null) { + useJDKScaler = "jdk".equals(scalerStr); + } else { + useJDKScaler = false; + } + isWindows = OSInfo.getOSType() == OSInfo.OSType.WINDOWS; + String debugLevel = + System.getProperty("sun.java2d.debugfonts"); - return null; + if (debugLevel != null && !debugLevel.equals("false")) { + debugFonts = true; + logger = PlatformLogger.getLogger("sun.java2d"); + if (debugLevel.equals("warning")) { + logger.setLevel(PlatformLogger.Level.WARNING); + } else if (debugLevel.equals("severe")) { + logger.setLevel(PlatformLogger.Level.SEVERE); } - }); + logging = logger.isEnabled(); + } } /** diff --git a/src/java.desktop/share/classes/sun/font/StrikeCache.java b/src/java.desktop/share/classes/sun/font/StrikeCache.java index ea1369b4383..c0859c4c0af 100644 --- a/src/java.desktop/share/classes/sun/font/StrikeCache.java +++ b/src/java.desktop/share/classes/sun/font/StrikeCache.java @@ -263,7 +263,6 @@ public final class StrikeCache { initStatic(); } - @SuppressWarnings("removal") private static void initStatic() { if (nativeAddressSize < 4) { @@ -271,37 +270,28 @@ public final class StrikeCache { nativeAddressSize); } - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { + /* Allow a client to override the reference type used to + * cache strikes. The default is "soft" which hints to keep + * the strikes around. This property allows the client to + * override this to "weak" which hint to the GC to free + * memory more aggressively. + */ + String refType = System.getProperty("sun.java2d.font.reftype", "soft"); + cacheRefTypeWeak = refType.equals("weak"); - /* Allow a client to override the reference type used to - * cache strikes. The default is "soft" which hints to keep - * the strikes around. This property allows the client to - * override this to "weak" which hint to the GC to free - * memory more aggressively. - */ - String refType = - System.getProperty("sun.java2d.font.reftype", "soft"); - cacheRefTypeWeak = refType.equals("weak"); - - String minStrikesStr = - System.getProperty("sun.java2d.font.minstrikes"); - if (minStrikesStr != null) { - try { - MINSTRIKES = Integer.parseInt(minStrikesStr); - if (MINSTRIKES <= 0) { - MINSTRIKES = 1; - } - } catch (NumberFormatException e) { - } + String minStrikesStr = + System.getProperty("sun.java2d.font.minstrikes"); + if (minStrikesStr != null) { + try { + MINSTRIKES = Integer.parseInt(minStrikesStr); + if (MINSTRIKES <= 0) { + MINSTRIKES = 1; } - - recentStrikes = new FontStrike[MINSTRIKES]; - - return null; + } catch (NumberFormatException e) { } - }); + } + + recentStrikes = new FontStrike[MINSTRIKES]; } diff --git a/src/java.desktop/share/classes/sun/font/SunFontManager.java b/src/java.desktop/share/classes/sun/font/SunFontManager.java index 3aec139b56d..06dc4a90820 100644 --- a/src/java.desktop/share/classes/sun/font/SunFontManager.java +++ b/src/java.desktop/share/classes/sun/font/SunFontManager.java @@ -33,8 +33,6 @@ import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStreamReader; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -262,30 +260,24 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { initStatic(); } - @SuppressWarnings("removal") private static void initStatic() { - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - FontManagerNativeLibrary.load(); + FontManagerNativeLibrary.load(); - // JNI throws an exception if a class/method/field is not found, - // so there's no need to do anything explicit here. - initIDs(); + // JNI throws an exception if a class/method/field is not found, + // so there's no need to do anything explicit here. + initIDs(); - switch (StrikeCache.nativeAddressSize) { - case 8: longAddresses = true; break; - case 4: longAddresses = false; break; - default: throw new RuntimeException("Unexpected address size"); - } + switch (StrikeCache.nativeAddressSize) { + case 8: longAddresses = true; break; + case 4: longAddresses = false; break; + default: throw new RuntimeException("Unexpected address size"); + } - noType1Font = "true".equals(System.getProperty("sun.java2d.noType1Font")); - jreLibDirName = System.getProperty("java.home","") + File.separator + "lib"; - jreFontDirName = jreLibDirName + File.separator + "fonts"; + noType1Font = "true".equals(System.getProperty("sun.java2d.noType1Font")); + jreLibDirName = System.getProperty("java.home","") + File.separator + "lib"; + jreFontDirName = jreLibDirName + File.separator + "fonts"; - maxSoftRefCnt = Integer.getInteger("sun.java2d.font.maxSoftRefs", 10); - return null; - } - }); + maxSoftRefCnt = Integer.getInteger("sun.java2d.font.maxSoftRefs", 10); } /** @@ -304,150 +296,142 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { /* Initialise ptrs used by JNI methods */ private static native void initIDs(); - @SuppressWarnings("removal") protected SunFontManager() { - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - File badFontFile = - new File(jreFontDirName + File.separator + "badfonts.txt"); - if (badFontFile.exists()) { - badFonts = new ArrayList<>(); - try (FileInputStream fis = new FileInputStream(badFontFile); - BufferedReader br = new BufferedReader(new InputStreamReader(fis))) { - while (true) { - String name = br.readLine(); - if (name == null) { - break; - } else { - if (FontUtilities.debugFonts()) { - FontUtilities.logWarning("read bad font: " + name); - } - badFonts.add(name); - } - } - } catch (IOException e) { - } - } - - /* Here we get the fonts in jre/lib/fonts and register - * them so they are always available and preferred over - * other fonts. This needs to be registered before the - * composite fonts as otherwise some native font that - * corresponds may be found as we don't have a way to - * handle two fonts of the same name, so the JRE one - * must be the first one registered. Pass "true" to - * registerFonts method as on-screen these JRE fonts - * always go through the JDK rasteriser. - */ - if (FontUtilities.isLinux) { - /* Linux font configuration uses these fonts */ - registerFontDir(jreFontDirName); - } - registerFontsInDir(jreFontDirName, true, Font2D.JRE_RANK, - true, false); - - /* Create the font configuration and get any font path - * that might be specified. - */ - fontConfig = createFontConfiguration(); - - String[] fontInfo = getDefaultPlatformFont(); - defaultFontName = fontInfo[0]; - if (defaultFontName == null && FontUtilities.debugFonts()) { - FontUtilities.logWarning("defaultFontName is null"); - } - defaultFontFileName = fontInfo[1]; - - String extraFontPath = fontConfig.getExtraFontPath(); - - /* In prior releases the debugging font path replaced - * all normally located font directories except for the - * JRE fonts dir. This directory is still always located - * and placed at the head of the path but as an - * augmentation to the previous behaviour the - * changes below allow you to additionally append to - * the font path by starting with append: or prepend by - * starting with a prepend: sign. Eg: to append - * -Dsun.java2d.fontpath=append:/usr/local/myfonts - * and to prepend - * -Dsun.java2d.fontpath=prepend:/usr/local/myfonts Disp - * - * If there is an appendedfontpath it in the font - * configuration it is used instead of searching the - * system for dirs. - * The behaviour of append and prepend is then similar - * to the normal case. ie it goes after what - * you prepend and * before what you append. If the - * sun.java2d.fontpath property is used, but it - * neither the append or prepend syntaxes is used then - * as except for the JRE dir the path is replaced and it - * is up to you to make sure that all the right - * directories are located. This is platform and - * locale-specific so its almost impossible to get - * right, so it should be used with caution. - */ - boolean prependToPath = false; - boolean appendToPath = false; - String dbgFontPath = System.getProperty("sun.java2d.fontpath"); - - if (dbgFontPath != null) { - if (dbgFontPath.startsWith("prepend:")) { - prependToPath = true; - dbgFontPath = - dbgFontPath.substring("prepend:".length()); - } else if (dbgFontPath.startsWith("append:")) { - appendToPath = true; - dbgFontPath = - dbgFontPath.substring("append:".length()); - } - } - - if (FontUtilities.debugFonts()) { - FontUtilities.logInfo("JRE font directory: " + jreFontDirName); - FontUtilities.logInfo("Extra font path: " + extraFontPath); - FontUtilities.logInfo("Debug font path: " + dbgFontPath); - } - - if (dbgFontPath != null) { - /* In debugging mode we register all the paths - * Caution: this is a very expensive call on Solaris:- - */ - fontPath = getPlatformFontPath(noType1Font); - - if (extraFontPath != null) { - fontPath = extraFontPath + File.pathSeparator + fontPath; - } - if (appendToPath) { - fontPath += File.pathSeparator + dbgFontPath; - } else if (prependToPath) { - fontPath = dbgFontPath + File.pathSeparator + fontPath; + File badFontFile = + new File(jreFontDirName + File.separator + "badfonts.txt"); + if (badFontFile.exists()) { + badFonts = new ArrayList<>(); + try (FileInputStream fis = new FileInputStream(badFontFile); + BufferedReader br = new BufferedReader(new InputStreamReader(fis))) { + while (true) { + String name = br.readLine(); + if (name == null) { + break; } else { - fontPath = dbgFontPath; + if (FontUtilities.debugFonts()) { + FontUtilities.logWarning("read bad font: " + name); + } + badFonts.add(name); } - registerFontDirs(fontPath); - } else if (extraFontPath != null) { - /* If the font configuration contains an - * "appendedfontpath" entry, it is interpreted as a - * set of locations that should always be registered. - * It may be additional to locations normally found - * for that place, or it may be locations that need - * to have all their paths registered to locate all - * the needed platform names. - * This is typically when the same .TTF file is - * referenced from multiple font.dir files and all - * of these must be read to find all the native - * (XLFD) names for the font, so that X11 font APIs - * can be used for as many code points as possible. - */ - registerFontDirs(extraFontPath); } - - initCompositeFonts(fontConfig, null); - - return null; + } catch (IOException e) { } - }); + } + /* Here we get the fonts in jre/lib/fonts and register + * them so they are always available and preferred over + * other fonts. This needs to be registered before the + * composite fonts as otherwise some native font that + * corresponds may be found as we don't have a way to + * handle two fonts of the same name, so the JRE one + * must be the first one registered. Pass "true" to + * registerFonts method as on-screen these JRE fonts + * always go through the JDK rasteriser. + */ + if (FontUtilities.isLinux) { + /* Linux font configuration uses these fonts */ + registerFontDir(jreFontDirName); + } + registerFontsInDir(jreFontDirName, true, Font2D.JRE_RANK, + true, false); + + /* Create the font configuration and get any font path + * that might be specified. + */ + fontConfig = createFontConfiguration(); + + String[] fontInfo = getDefaultPlatformFont(); + defaultFontName = fontInfo[0]; + if (defaultFontName == null && FontUtilities.debugFonts()) { + FontUtilities.logWarning("defaultFontName is null"); + } + defaultFontFileName = fontInfo[1]; + + String extraFontPath = fontConfig.getExtraFontPath(); + + /* In prior releases the debugging font path replaced + * all normally located font directories except for the + * JRE fonts dir. This directory is still always located + * and placed at the head of the path but as an + * augmentation to the previous behaviour the + * changes below allow you to additionally append to + * the font path by starting with append: or prepend by + * starting with a prepend: sign. Eg: to append + * -Dsun.java2d.fontpath=append:/usr/local/myfonts + * and to prepend + * -Dsun.java2d.fontpath=prepend:/usr/local/myfonts Disp + * + * If there is an appendedfontpath it in the font + * configuration it is used instead of searching the + * system for dirs. + * The behaviour of append and prepend is then similar + * to the normal case. ie it goes after what + * you prepend and * before what you append. If the + * sun.java2d.fontpath property is used, but it + * neither the append or prepend syntaxes is used then + * as except for the JRE dir the path is replaced and it + * is up to you to make sure that all the right + * directories are located. This is platform and + * locale-specific so its almost impossible to get + * right, so it should be used with caution. + */ + boolean prependToPath = false; + boolean appendToPath = false; + String dbgFontPath = System.getProperty("sun.java2d.fontpath"); + + if (dbgFontPath != null) { + if (dbgFontPath.startsWith("prepend:")) { + prependToPath = true; + dbgFontPath = + dbgFontPath.substring("prepend:".length()); + } else if (dbgFontPath.startsWith("append:")) { + appendToPath = true; + dbgFontPath = + dbgFontPath.substring("append:".length()); + } + } + + if (FontUtilities.debugFonts()) { + FontUtilities.logInfo("JRE font directory: " + jreFontDirName); + FontUtilities.logInfo("Extra font path: " + extraFontPath); + FontUtilities.logInfo("Debug font path: " + dbgFontPath); + } + + if (dbgFontPath != null) { + /* In debugging mode we register all the paths + * Caution: this is a very expensive call on Solaris:- + */ + fontPath = getPlatformFontPath(noType1Font); + + if (extraFontPath != null) { + fontPath = extraFontPath + File.pathSeparator + fontPath; + } + if (appendToPath) { + fontPath += File.pathSeparator + dbgFontPath; + } else if (prependToPath) { + fontPath = dbgFontPath + File.pathSeparator + fontPath; + } else { + fontPath = dbgFontPath; + } + registerFontDirs(fontPath); + } else if (extraFontPath != null) { + /* If the font configuration contains an + * "appendedfontpath" entry, it is interpreted as a + * set of locations that should always be registered. + * It may be additional to locations normally found + * for that place, or it may be locations that need + * to have all their paths registered to locate all + * the needed platform names. + * This is typically when the same .TTF file is + * referenced from multiple font.dir files and all + * of these must be read to find all the native + * (XLFD) names for the font, so that X11 font APIs + * can be used for as many code points as possible. + */ + registerFontDirs(extraFontPath); + } + + initCompositeFonts(fontConfig, null); } public Font2DHandle getNewComposite(String family, int style, @@ -1095,7 +1079,6 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { private boolean haveCheckedUnreferencedFontFiles; - @SuppressWarnings("removal") private String[] getFontFilesFromPath(boolean noType1) { final FilenameFilter filter; if (noType1) { @@ -1103,34 +1086,30 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { } else { filter = new TTorT1Filter(); } - return AccessController.doPrivileged(new PrivilegedAction() { - public String[] run() { - if (pathDirs.length == 1) { - File dir = new File(pathDirs[0]); - String[] files = dir.list(filter); - if (files == null) { - return new String[0]; - } - for (int f=0; f fileList = new ArrayList<>(); - for (int i = 0; i< pathDirs.length; i++) { - File dir = new File(pathDirs[i]); - String[] files = dir.list(filter); - if (files == null) { - continue; - } - for (int f = 0; f < files.length ; f++) { - fileList.add(files[f].toLowerCase()); - } - } - return fileList.toArray(STR_ARRAY); + if (pathDirs.length == 1) { + File dir = new File(pathDirs[0]); + String[] files = dir.list(filter); + if (files == null) { + return new String[0]; + } + for (int f=0; f fileList = new ArrayList<>(); + for (int i = 0; i< pathDirs.length; i++) { + File dir = new File(pathDirs[i]); + String[] files = dir.list(filter); + if (files == null) { + continue; + } + for (int f = 0; f < files.length ; f++) { + fileList.add(files[f].toLowerCase()); } } - }); + return fileList.toArray(STR_ARRAY); + } } /* This is needed since some windows registry names don't match @@ -1430,7 +1409,6 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { return new HashMap<>(0); } - @SuppressWarnings("removal") Font2D findFontFromPlatformMap(String lcName, int style) { HashMap platformFontMap = SunFontManager.platformFontMap; if (platformFontMap == null) { @@ -1524,20 +1502,16 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { final String[] files = { plainFile, boldFile, italicFile, boldItalicFile } ; - failure = AccessController.doPrivileged(new PrivilegedAction() { - public Boolean run() { - for (int i=0; i() { - public String run() { - for (int p = 0; p < pathDirs.length; p++) { - File f = new File(pathDirs[p] +File.separator+ s); - if (f.exists()) { - return f.getAbsolutePath(); - } - } - return null; - } - }); - if (path != null) { - return path; + for (int p = 0; p < pathDirs.length; p++) { + f = new File(pathDirs[p] + File.separator + s); + if (f.exists()) { + return f.getAbsolutePath(); + } } } return s; // shouldn't happen, but harmless @@ -2181,7 +2145,6 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { private int createdFontCount = 0; - @SuppressWarnings("removal") public Font2D[] createFont2D(File fontFile, int fontFormat, boolean all, boolean isCopy, CreatedFontTracker tracker) throws FontFormatException { @@ -2229,15 +2192,10 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { } } catch (FontFormatException e) { if (isCopy) { - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - if (_tracker != null) { - _tracker.subBytes((int)fFile.length()); - } - fFile.delete(); - return null; - } - }); + if (_tracker != null) { + _tracker.subBytes((int)fFile.length()); + } + fFile.delete(); } throw(e); } @@ -2253,39 +2211,31 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { if (fileCloser == null) { final Runnable fileCloserRunnable = new Runnable() { public void run() { - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - for (int i = 0;i < CHANNELPOOLSIZE; i++) { - if (fontFileCache[i] != null) { - try { - fontFileCache[i].close(); - } catch (Exception e) { - } - } + for (int i = 0;i < CHANNELPOOLSIZE; i++) { + if (fontFileCache[i] != null) { + try { + fontFileCache[i].close(); + } catch (Exception e) { } - if (tmpFontFiles != null) { - File[] files = new File[tmpFontFiles.size()]; - files = tmpFontFiles.toArray(files); - for (int f=0; f) () -> { - ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup(); - fileCloser = new Thread(rootTG, fileCloserRunnable, - "FileCloser", 0, false); - fileCloser.setContextClassLoader(null); - Runtime.getRuntime().addShutdownHook(fileCloser); - return null; - }); + ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup(); + fileCloser = new Thread(rootTG, fileCloserRunnable, + "FileCloser", 0, false); + fileCloser.setContextClassLoader(null); + Runtime.getRuntime().addShutdownHook(fileCloser); } } } @@ -2930,7 +2880,6 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { return fontPath; } - @SuppressWarnings("removal") protected void loadFonts() { if (discoveredAllFonts) { return; @@ -2943,28 +2892,23 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { } initialiseDeferredFonts(); - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - if (fontPath == null) { - fontPath = getPlatformFontPath(noType1Font); - registerFontDirs(fontPath); - } - if (fontPath != null) { - // this will find all fonts including those already - // registered. But we have checks in place to prevent - // double registration. - if (! gotFontsFromPlatform()) { - registerFontsOnPath(fontPath, false, - Font2D.UNKNOWN_RANK, - false, true); - loadedAllFontFiles = true; - } - } - registerOtherFontFiles(registeredFontFiles); - discoveredAllFonts = true; - return null; + if (fontPath == null) { + fontPath = getPlatformFontPath(noType1Font); + registerFontDirs(fontPath); + } + if (fontPath != null) { + // this will find all fonts including those already + // registered. But we have checks in place to prevent + // double registration. + if (! gotFontsFromPlatform()) { + registerFontsOnPath(fontPath, false, + Font2D.UNKNOWN_RANK, + false, true); + loadedAllFontFiles = true; } - }); + } + registerOtherFontFiles(registeredFontFiles); + discoveredAllFonts = true; } } @@ -3048,7 +2992,6 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { return defaultFontName; } - @SuppressWarnings("removal") public void loadFontFiles() { loadFonts(); if (loadedAllFontFiles) { @@ -3060,23 +3003,18 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { Thread.dumpStack(); FontUtilities.logInfo("loadAllFontFiles() called"); } - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - if (fontPath == null) { - fontPath = getPlatformFontPath(noType1Font); - } - if (fontPath != null) { - // this will find all fonts including those already - // registered. But we have checks in place to prevent - // double registration. - registerFontsOnPath(fontPath, false, - Font2D.UNKNOWN_RANK, - false, true); - } - loadedAllFontFiles = true; - return null; - } - }); + if (fontPath == null) { + fontPath = getPlatformFontPath(noType1Font); + } + if (fontPath != null) { + // this will find all fonts including those already + // registered. But we have checks in place to prevent + // double registration. + registerFontsOnPath(fontPath, false, + Font2D.UNKNOWN_RANK, + false, true); + } + loadedAllFontFiles = true; } } @@ -3402,16 +3340,9 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { // Provides an aperture to add native font family names to the map protected void addNativeFontFamilyNames(TreeMap familyNames, Locale requestedLocale) { } - @SuppressWarnings("removal") public void register1dot0Fonts() { - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { - String type1Dir = "/usr/openwin/lib/X11/fonts/Type1"; - registerFontsInDir(type1Dir, true, Font2D.TYPE1_RANK, - false, false); - return null; - } - }); + String type1Dir = "/usr/openwin/lib/X11/fonts/Type1"; + registerFontsInDir(type1Dir, true, Font2D.TYPE1_RANK, false, false); } /* Really we need only the JRE fonts family names, but there's little @@ -3442,33 +3373,28 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE { * on windows and uses that if set. */ private static Locale systemLocale = null; - @SuppressWarnings("removal") private static Locale getSystemStartupLocale() { if (systemLocale == null) { - systemLocale = AccessController.doPrivileged(new PrivilegedAction() { - public Locale run() { - /* On windows the system locale may be different than the - * user locale. This is an unsupported configuration, but - * in that case we want to return a dummy locale that will - * never cause a match in the usage of this API. This is - * important because Windows documents that the family - * names of fonts are enumerated using the language of - * the system locale. BY returning a dummy locale in that - * case we do not use the platform API which would not - * return us the names we want. - */ - String fileEncoding = System.getProperty("file.encoding", ""); - String sysEncoding = System.getProperty("sun.jnu.encoding"); - if (sysEncoding != null && !sysEncoding.equals(fileEncoding)) { - return Locale.ROOT; - } - - String language = System.getProperty("user.language", "en"); - String country = System.getProperty("user.country",""); - String variant = System.getProperty("user.variant",""); - return Locale.of(language, country, variant); - } - }); + /* On windows the system locale may be different than the + * user locale. This is an unsupported configuration, but + * in that case we want to return a dummy locale that will + * never cause a match in the usage of this API. This is + * important because Windows documents that the family + * names of fonts are enumerated using the language of + * the system locale. BY returning a dummy locale in that + * case we do not use the platform API which would not + * return us the names we want. + */ + String fileEncoding = System.getProperty("file.encoding", ""); + String sysEncoding = System.getProperty("sun.jnu.encoding"); + if (sysEncoding != null && !sysEncoding.equals(fileEncoding)) { + systemLocale = Locale.ROOT; + } else { + String language = System.getProperty("user.language", "en"); + String country = System.getProperty("user.country",""); + String variant = System.getProperty("user.variant",""); + systemLocale = Locale.of(language, country, variant); + } } return systemLocale; } diff --git a/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java b/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java index c291e45b558..f1d6de7d4bc 100644 --- a/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java +++ b/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java @@ -37,8 +37,6 @@ import sun.java2d.DisposerRecord; import java.awt.geom.Point2D; import java.lang.foreign.MemorySegment; import java.lang.ref.SoftReference; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.concurrent.ConcurrentHashMap; import java.util.WeakHashMap; @@ -167,10 +165,7 @@ public final class SunLayoutEngine implements LayoutEngine, LayoutEngineFactory static boolean useFFM = true; static { - @SuppressWarnings("removal") - String prop = AccessController.doPrivileged( - (PrivilegedAction) () -> - System.getProperty("sun.font.layout.ffm", "true")); + String prop = System.getProperty("sun.font.layout.ffm", "true"); useFFM = "true".equals(prop); } diff --git a/src/java.desktop/share/classes/sun/font/TrueTypeFont.java b/src/java.desktop/share/classes/sun/font/TrueTypeFont.java index 3895ec6ca82..a44a013b749 100644 --- a/src/java.desktop/share/classes/sun/font/TrueTypeFont.java +++ b/src/java.desktop/share/classes/sun/font/TrueTypeFont.java @@ -38,9 +38,6 @@ import java.nio.IntBuffer; import java.nio.ShortBuffer; import java.nio.channels.ClosedChannelException; import java.nio.channels.FileChannel; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; @@ -246,13 +243,7 @@ public class TrueTypeFont extends FileFont { FontUtilities.logInfo("open TTF: " + platName); } try { - @SuppressWarnings("removal") - RandomAccessFile raf = AccessController.doPrivileged( - new PrivilegedExceptionAction() { - public RandomAccessFile run() throws FileNotFoundException { - return new RandomAccessFile(platName, "r"); - } - }); + RandomAccessFile raf = new RandomAccessFile(platName, "r"); disposerRecord.channel = raf.getChannel(); fileSize = (int)disposerRecord.channel.size(); if (usePool) { @@ -261,13 +252,6 @@ public class TrueTypeFont extends FileFont { ((SunFontManager) fm).addToPool(this); } } - } catch (PrivilegedActionException e) { - close(); - Throwable reason = e.getCause(); - if (reason == null) { - reason = e; - } - throw new FontFormatException(reason.toString()); } catch (ClosedChannelException e) { /* NIO I/O is interruptible, recurse to retry operation. * The call to channel.size() above can throw this exception. @@ -664,7 +648,6 @@ public class TrueTypeFont extends FileFont { }; private static String defaultCodePage = null; - @SuppressWarnings("removal") static String getCodePage() { if (defaultCodePage != null) { @@ -672,8 +655,7 @@ public class TrueTypeFont extends FileFont { } if (FontUtilities.isWindows) { - defaultCodePage = - AccessController.doPrivileged(new GetPropertyAction("file.encoding")); + defaultCodePage = System.getProperty("file.encoding"); } else { if (languages.length != codePages.length) { throw new InternalError("wrong code pages array length"); diff --git a/src/java.desktop/share/classes/sun/font/Type1Font.java b/src/java.desktop/share/classes/sun/font/Type1Font.java index cc36c193de0..67f83cce643 100644 --- a/src/java.desktop/share/classes/sun/font/Type1Font.java +++ b/src/java.desktop/share/classes/sun/font/Type1Font.java @@ -83,18 +83,10 @@ public class Type1Font extends FileFont { fileName = name; } - @SuppressWarnings("removal") public synchronized void dispose() { - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - - if (fileName != null) { - (new java.io.File(fileName)).delete(); - } - return null; - } - }); + if (fileName != null) { + (new java.io.File(fileName)).delete(); + } } } @@ -191,18 +183,11 @@ public class Type1Font extends FileFont { FontUtilities.logInfo("open Type 1 font: " + platName); } try { - @SuppressWarnings("removal") - RandomAccessFile raf = (RandomAccessFile) - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - try { - return new RandomAccessFile(platName, "r"); - } catch (FileNotFoundException ffne) { - } - return null; - } - }); + RandomAccessFile raf = null; + try { + raf = new RandomAccessFile(platName, "r"); + } catch (FileNotFoundException ffne) { + } FileChannel fc = raf.getChannel(); fileSize = (int)fc.size(); bbuf = ByteBuffer.allocate(fileSize); @@ -227,7 +212,6 @@ public class Type1Font extends FileFont { } /* called from native code to read file into a direct byte buffer */ - @SuppressWarnings("removal") void readFile(ByteBuffer buffer) { RandomAccessFile raf = null; FileChannel fc; @@ -235,17 +219,10 @@ public class Type1Font extends FileFont { FontUtilities.logInfo("open Type 1 font: " + platName); } try { - raf = (RandomAccessFile) - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - try { - return new RandomAccessFile(platName, "r"); - } catch (FileNotFoundException fnfe) { - } - return null; - } - }); + try { + raf = new RandomAccessFile(platName, "r"); + } catch (FileNotFoundException fnfe) { + } fc = raf.getChannel(); while (buffer.remaining() > 0 && fc.read(buffer) != -1) {} } catch (ClosedChannelException e) {