Eliminate sun.awt.OSInfo?

Philip Race philip.race at oracle.com
Tue Mar 25 00:05:45 UTC 2025



On 3/24/25 3:43 PM, Daniel Gredler wrote:
> Interesting, what are the advantages of removing all of the "exports"? 
> Are they just code smells?

Bad code smells.

>
> In an ideal world where there were none of these "exports", 
> java.desktop would need to reimplement this OS detection 
> functionality, no? Or would something like 
> jdk.internal.util.OperatingSystem be promoted to a public API?

I can't see that being a public API. Internals that we use today is 
stuff that was
not considered suitable for public API, or it already would be.

>
> More immediately, in your opinion is it worth keeping OSInfo around as 
> a 10-line wrapper around jdk.internal.util.OperatingSystem in order to 
> limit the "blast radius" of the dependency? Or does it not matter 
> whether 1 class uses it or 20 classes use it, once the dependency has 
> been created?

Keeping the blast radius to no more than it is today is the first thing.
I would prefer re-implementation over the export, but it hasn't bubbled up.
And I can imagine that even today we might want to know more 
specifically which windows version.
Windows 10 is a range of "versions" and Windows 11 is really just more
Windows 10 versions. And we'll see about Windows 12.

-phil.

>
> Take care,
>
> Daniel
>
>
>
> On Mon, Mar 24, 2025 at 11:25 PM Philip Race <philip.race at oracle.com> 
> wrote:
>
>     I am not a huge fan of sun.awt.OSInfo and I know a lot of uses are
>     out-dated,
>     and probably could be removed.
>     Whether that ends up in not needing OSInfo is another a question.
>     But I would *not* want to migrate to a jdk.internal API.
>     I have a goal of someday having zero cases of java.base "exports
>     FOO to
>     java.desktop"
>     Its not a top priority to complete, but at the same time I don't
>     want to
>     needlessly go in the opposite direction.
>
>
>     -phil.
>
>     On 3/24/25 3:18 PM, Daniel Gredler wrote:
>     > Hi all,
>     >
>     > The sun.awt.OSInfo class seems to replicate the functionality in
>     > jdk.internal.util.OperatingSystem, with one additional capability:
>     > distinguishing between different versions of Windows. However, the
>     > Windows versions included are Windows 95 through Windows 7, which
>     > hasn't been an officially-supported platform for the JDK since
>     Java 7.
>     > There are Windows version checks which rely on OSInfo sprinkled
>     > throughout the java.desktop module, but all of them are checking
>     for
>     > Windows versions which are not even supported anymore, as far as
>     I can
>     > tell. Would a PR which removes OSInfo be accepted, or is there a
>     > reason to keep it around that I'm missing?
>     >
>     > Thanks!
>     >
>     > Daniel
>     >
>     > (Somewhat related: https://bugs.openjdk.org/browse/JDK-8305777)
>     >
>     > ---
>     >
>     > $ grep -r --include "*.java" OSInfo src/java.desktop/
>     >
>     src/java.desktop/windows/classes/sun/awt/windows/WTaskbarPeer.java:import
>
>     > sun.awt.OSInfo;
>     > src/java.desktop/windows/classes/sun/awt/windows/WTaskbarPeer.java:
>     >      supported = OSInfo.getWindowsVersion()
>     > src/java.desktop/windows/classes/sun/awt/windows/WTaskbarPeer.java:
>     >              .compareTo(OSInfo.WINDOWS_7) >= 0
>     >
>     src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java:import
>
>     > sun.awt.OSInfo;
>     >
>     src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java:
>
>     >                if (recentFolder != null &&
>     > OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_2000) >= 0) {
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:import
>
>     > sun.awt.OSInfo;
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >        return OSInfo.getOSType() == OSInfo.OSType.WINDOWS;
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >        if
>     (OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_95) <= 0) {
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >        isClassicWindows =
>     > OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_95) <= 0;
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >                (OSInfo.getOSType() == OSInfo.OSType.WINDOWS &&
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >  OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) >= 0)) {
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >        return OSInfo.getOSType() == OSInfo.OSType.WINDOWS
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >                &&
>     > OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_VISTA) >= 0;
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >        return OSInfo.getOSType() == OSInfo.OSType.WINDOWS
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >                &&
>     > OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_7) >= 0;
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >            if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS &&
>     >
>     src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
>
>     >  OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) < 0) {
>     >
>     src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:import
>
>     > sun.awt.OSInfo;
>     >
>     src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
>
>     >        return OSInfo.getOSType() == OSInfo.OSType.MACOSX;
>     >
>     src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
>
>     >        return OSInfo.getOSType() == OSInfo.OSType.LINUX;
>     >
>     src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
>
>     >        return (OSInfo.getOSType() == OSInfo.OSType.LINUX ||
>     >
>     src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
>
>     >                OSInfo.getOSType() == OSInfo.OSType.MACOSX);
>     >
>     src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
>
>     >        return OSInfo.getOSType() == OSInfo.OSType.AIX;
>     >
>     src/java.desktop/unix/classes/sun/awt/X11/XScrollbarPeer.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/unix/classes/sun/awt/X11/XScrollbarPeer.java:
>     >  if (OSInfo.getOSType() == OSInfo.OSType.LINUX) {
>     >
>     src/java.desktop/unix/classes/sun/awt/X11/MotifColorUtilities.java:import
>
>     > sun.awt.OSInfo;
>     > src/java.desktop/unix/classes/sun/awt/X11/MotifColorUtilities.java:
>     >  int numOfColor = OSInfo.getOSType() == OSInfo.OSType.AIX ? 8 : 4;
>     > src/java.desktop/unix/classes/sun/awt/X11/MotifColorUtilities.java:
>     >  if (OSInfo.getOSType() == OSInfo.OSType.LINUX) { // Load motif
>     > default colors on Linux.
>     > src/java.desktop/share/classes/javax/swing/PopupFactory.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/share/classes/javax/swing/PopupFactory.java:
>     >    if ((OSInfo.getOSType() == OSInfo.OSType.MACOSX) && (owner !=
>     null) &&
>     >
>     src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java:import
>
>     > sun.awt.OSInfo;
>     >
>     src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java:
>
>     >            boolean isWindows = OSInfo.getOSType() ==
>     > OSInfo.OSType.WINDOWS;
>     >
>     src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java:import
>
>     > sun.awt.OSInfo;
>     >
>     src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java:
>
>     >            if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:
>     >  OSInfo.OSType osType = OSInfo.getOSType();
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:  if
>     > (osType == OSInfo.OSType.WINDOWS) {
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:  else if
>     > (osType == OSInfo.OSType.MACOSX) {
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:
>     >  OSInfo.OSType osType = OSInfo.getOSType();
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:  if
>     > (osType == OSInfo.OSType.WINDOWS) {
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:    if
>     > (osType == OSInfo.OSType.MACOSX) {
>     > src/java.desktop/share/classes/javax/swing/UIManager.java:    if
>     > (OSInfo.getOSType() == OSInfo.OSType.MACOSX) {
>     > src/java.desktop/share/classes/sun/awt/OSInfo.java:import static
>     > sun.awt.OSInfo.OSType.*;
>     > src/java.desktop/share/classes/sun/awt/OSInfo.java:public class
>     OSInfo {
>     > src/java.desktop/share/classes/sun/awt/OSInfo.java:  private static
>     > final Map<String, WindowsVersion> windowsVersionMap = new
>     > HashMap<String, OSInfo.WindowsVersion>();
>     > src/java.desktop/share/classes/sun/awt/OSInfo.java:  private
>     OSInfo() {
>     > src/java.desktop/share/classes/sun/awt/FontConfiguration.java:
>     >        if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {
>     >
>     src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java:
>     >  if (f.equals(canonical) || OSInfo.getOSType() ==
>     OSInfo.OSType.WINDOWS) {
>     > src/java.desktop/share/classes/sun/print/PSPrinterJob.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/share/classes/sun/print/PSPrinterJob.java:  
>      isMac
>     > = OSInfo.getOSType() == OSInfo.OSType.MACOSX;
>     > src/java.desktop/share/classes/sun/print/PSPrinterJob.java:    if
>     > (OSInfo.getOSType() == OSInfo.OSType.LINUX ||
>     > src/java.desktop/share/classes/sun/print/PSPrinterJob.java:
>     >    OSInfo.getOSType() == OSInfo.OSType.MACOSX) {
>     > src/java.desktop/share/classes/sun/print/ServiceDialog.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/share/classes/sun/print/ServiceDialog.java:
>     >  if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) {
>     >
>     src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java:import
>
>     > sun.awt.OSInfo;
>     >
>     src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java:
>
>     >     if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {
>     > src/java.desktop/share/classes/sun/font/FontUtilities.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/share/classes/sun/font/FontUtilities.java:
>     >  isLinux = OSInfo.getOSType() == OSInfo.OSType.LINUX;
>     > src/java.desktop/share/classes/sun/font/FontUtilities.java:
>     >  isMacOSX = OSInfo.getOSType() == OSInfo.OSType.MACOSX;
>     > src/java.desktop/share/classes/sun/font/FontUtilities.java:
>     >  isWindows = OSInfo.getOSType() == OSInfo.OSType.WINDOWS;
>     >
>     src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java:import
>     > sun.awt.OSInfo;
>     > src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java:
>     >  boolean isXPPlatform = (OSInfo.getOSType() ==
>     OSInfo.OSType.WINDOWS &&
>     > src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java:
>     >  OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) >= 0);
>     >
>     src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java:import
>
>     > sun.awt.OSInfo;
>     >
>     src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java:
>
>     >                    if (OSInfo.getOSType() == OSInfo.OSType.LINUX) {
>     >
>     src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java:
>
>     >                    if (OSInfo.getOSType() ==
>     OSInfo.OSType.WINDOWS) {
>     >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/client-libs-dev/attachments/20250324/e5c38eae/attachment-0001.htm>


More information about the client-libs-dev mailing list