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 <[email protected]> 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) {
    >

Reply via email to