JDK-8282422 : JTable.print() failed with UnsupportedCharsetException on AIX ko_KR locale
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt:i18n
  • Affected Version: 11,17,18,19
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: aix
  • CPU: ppc
  • Submitted: 2022-02-26
  • Updated: 2022-07-16
  • Resolved: 2022-03-23
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 17 JDK 19
11.0.16Fixed 17.0.4Fixed 19 b15Fixed
Related Reports
Relates :  
Description
On AIX ko_KR locale, I could see following exception after JTable.print() was called

==========
java.nio.charset.UnsupportedCharsetException: sun.font.X11KSC5601
        at java.base/java.nio.charset.Charset.forName(Charset.java:527)
        at java.desktop/sun.awt.FontConfiguration.getFontCharsetEncoder(FontConfiguration.java:964)
        at java.desktop/sun.awt.FontConfiguration.buildFontDescriptors(FontConfiguration.java:921)
        at java.desktop/sun.awt.FontConfiguration.getFontDescriptors(FontConfiguration.java:884)
        at java.desktop/sun.awt.FontConfiguration.getFontDescriptors(FontConfiguration.java:876)
        at java.desktop/sun.awt.PlatformFont.<init>(PlatformFont.java:74)
        at java.desktop/sun.awt.X11.XFontPeer.<init>(XFontPeer.java:33)
        at java.desktop/sun.awt.X11.XToolkit.getFontPeer(XToolkit.java:952)
        at java.desktop/java.awt.Font.getFontPeer(Font.java:488)
        at java.desktop/java.awt.Font$FontAccessImpl.getFontPeer(Font.java:282)
        at java.desktop/sun.print.PSPrinterJob.platformFontCount(PSPrinterJob.java:1247)
        at java.desktop/sun.print.PSPathGraphics.platformFontCount(PSPathGraphics.java:150)
        at java.desktop/sun.print.PathGraphics.printedSimpleGlyphVector(PathGraphics.java:851)
        at java.desktop/sun.print.PathGraphics.drawGlyphVector(PathGraphics.java:649)
        at java.desktop/sun.font.ExtendedTextSourceLabel.handleDraw(ExtendedTextSourceLabel.java:193)
        at java.desktop/sun.font.Decoration.drawTextAndDecorations(Decoration.java:123)
        at java.desktop/sun.font.ExtendedTextSourceLabel.draw(ExtendedTextSourceLabel.java:197)
        at java.desktop/java.awt.font.TextLine.draw(TextLine.java:776)
        at java.desktop/java.awt.font.TextLayout.draw(TextLayout.java:2609)
        at java.desktop/sun.swing.SwingUtilities2.drawString(SwingUtilities2.java:541)
        at java.desktop/sun.swing.SwingUtilities2.drawStringUnderlineCharAt(SwingUtilities2.java:652)
        at java.desktop/sun.swing.SwingUtilities2.drawStringUnderlineCharAt(SwingUtilities2.java:631)
        at java.desktop/javax.swing.plaf.basic.BasicLabelUI.paintEnabledText(BasicLabelUI.java:138)
        at java.desktop/javax.swing.plaf.basic.BasicLabelUI.paint(BasicLabelUI.java:203)
        at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
        at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:852)
        at java.desktop/sun.swing.table.DefaultTableCellHeaderRenderer.paintComponent(DefaultTableCellHeaderRenderer.java:159)
        at java.desktop/javax.swing.JComponent.printComponent(JComponent.java:1292)
        at java.desktop/javax.swing.JComponent.paint(JComponent.java:1132)
        at java.desktop/javax.swing.CellRendererPane.paintComponent(CellRendererPane.java:170)
        at java.desktop/javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderUI.java:741)
        at java.desktop/javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:683)
        at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
        at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:852)
        at java.desktop/javax.swing.JComponent.printComponent(JComponent.java:1292)
        at java.desktop/javax.swing.JComponent.paint(JComponent.java:1132)
        at java.desktop/javax.swing.JComponent.print(JComponent.java:1274)
        at java.desktop/javax.swing.TablePrintable.print(TablePrintable.java:370)
        at java.desktop/javax.swing.JTable$ThreadSafePrintable$1.run(JTable.java:6630)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
        at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:191)
        at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:236)
        at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:234)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
        at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:234)
        at java.desktop/java.awt.Dialog.show(Dialog.java:1080)
        at java.desktop/java.awt.Component.show(Component.java:1728)
        at java.desktop/java.awt.Component.setVisible(Component.java:1675)
        at java.desktop/java.awt.Window.setVisible(Window.java:1036)
        at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1016)
        at java.desktop/sun.swing.PrintingStatus.showModalOnEDT(PrintingStatus.java:204)
        at java.desktop/sun.swing.PrintingStatus.showModal(PrintingStatus.java:172)
        at java.desktop/javax.swing.JTable.print(JTable.java:6439)
        at java.desktop/javax.swing.JTable.print(JTable.java:6246)
        at java.desktop/javax.swing.JTable.print(JTable.java:6201)
        at java.desktop/javax.swing.JTable.print(JTable.java:6166)
        at java.desktop/javax.swing.JTable.print(JTable.java:6140)
        at WeekdayList$1.actionPerformed(WeekdayList.java:28)
        at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
        at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
        at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
        at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
        at java.desktop/java.awt.Component.processMouseEvent(Component.java:6620)
        at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3398)
        at java.desktop/java.awt.Component.processEvent(Component.java:6385)
        at java.desktop/java.awt.Container.processEvent(Container.java:2266)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4995)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827)
        at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
        at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
        at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:775)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
==========

Test instructions are as follows:
(Note: GUI environment, Korean locale and printer setting are required on AIX system)

1. Compile WeekdayList.java and execute it on ko_KR locale with -Dfile.encoding=COMPAT option on GUI environment
    $ env LANG=ko_KR java -Dfile.encoding=COMPAT WeekdayList
2. Press Print button
3. On print dialog, select "Print To File" checkbox, press Print button
4. On file dialog, set "File Name", press Save button
   (If file name is there, confirmation dialog is displayed, press "Yes" if the file can be overwritten)
5. Then see above exception

According to my investigation, sun.font.X11KSC5601 came from:
  src/java.desktop//unix/classes/sun/font/MFontConfiguration.java:
    encodingMap.put("ksc5601.1987-0", "sun.font.X11KSC5601");

This issue was happned on following code.
        if (!charsetName.startsWith("sun.awt.") && !charsetName.equals("default")) {
            fc = Charset.forName(charsetName);
        } else {

On JDK8, X11KSC5601 class file is in sun.awt.motif package.

But it seems it was moved to sun.font package by:
    JDK-8035302 Eliminate dependency on jdk.charsets from 2D font code.
I think !charsetName.startsWith("sun.font.") should be added
Comments
A pull request was submitted for review. URL: https://git.openjdk.java.net/jdk17u-dev/pull/421 Date: 2022-05-29 13:15:14 +0000
29-05-2022

A pull request was submitted for review. URL: https://git.openjdk.java.net/jdk11u-dev/pull/1113 Date: 2022-05-29 13:12:15 +0000
29-05-2022

Fix request [11u] Still I could recreate this issue on jdk-11.0.15+10. openjdk version "11.0.15" 2022-04-19 OpenJDK Runtime Environment Temurin-11.0.15+10 (build 11.0.15+10) OpenJDK 64-Bit Server VM Temurin-11.0.15+10 (build 11.0.15+10, mixed mode) Clean backport except Copyright year.
29-05-2022

Fix request [17u] Still I could recreate this issue on jdk-17.0.3+7. openjdk version "17.0.3" 2022-04-19 OpenJDK Runtime Environment Temurin-17.0.3+7 (build 17.0.3+7) OpenJDK 64-Bit Server VM Temurin-17.0.3+7 (build 17.0.3+7, mixed mode, sharing) Clean backport.
29-05-2022

Changeset: 6ea996c2 Author: Ichiroh Takiguchi <itakiguchi@openjdk.org> Date: 2022-03-23 01:39:20 +0000 URL: https://git.openjdk.java.net/jdk/commit/6ea996c20591cafa9673d9c697437ce2c48e4616
23-03-2022

Phill, thank you for your correction. Yes, should be JDK-8035302 I'm very sorry, it seemed I just checked by following command. ====== $ git log --oneline src/java.desktop//unix/classes/sun/font/X11KSC5601.java | tail 0a65e8b282f 8276794: Change nested classes in java.desktop to static nested classes 3789983e89c 8187443: Forest Consolidation: Move files to unified layout ====== > Also if you are needing these charsets it suggests AIS is still using custom fontconfig.properties files - > and perhaps needing X11 to rasterise ? AIX 7.* does not have fontconfig and related libs by default. For UTF-8 locales, I checked X11 rasterizer any more. https://bugs.openjdk.java.net/browse/JDK-8230873 But I did not check PostScript file creation.
06-03-2022

"But it seems it was moved to sun.font package by JDK10 (JDK-8187443) " I have no idea why you think that. It was moved by https://bugs.openjdk.java.net/browse/JDK-8035302 Also if you are needing these charsets it suggests AIS is still using custom fontconfig.properties files - and perhaps needing X11 to rasterise ?
04-03-2022

A pull request was submitted for review. URL: https://git.openjdk.java.net/jdk/pull/7630 Date: 2022-02-26 16:24:07 +0000
26-02-2022