Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-5004101

Gurmukhi Input to Swing TextComponent throws ArrayIndexOutOfBounds

XMLWordPrintable

    • 2d
    • b42
    • x86
    • windows_2000



      Name: rmT116609 Date: 02/26/2004


      FULL PRODUCT VERSION :
      java version "1.4.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
      Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)

      AND

      java version "1.4.2"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
      Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)

      AND

      java version "1.5.0-beta"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b26)
      Java HotSpot(TM) Client VM (build 1.5.0-beta-b26, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows 2000 [Version 5.00.2195]
      SunOS XXXX 5.8 Generic_108528-18 sun4u sparc SUNW,Sun-Blade-100
      SunOd XXXX 5.6 Generic_105181-29 sun4u sparc SUNW,Ultra-5_10

      A DESCRIPTION OF THE PROBLEM :
      The sun.awt.font.ExtendedTextSourceLabel throws an ArrayIndexOutOfBounds from line 670 when the user enters certain Gurmukhi character sequences into a Swing text component.

      The text component also throws an ArrayIndexOutOfBounds exception if the same sequence of character is entered as a block of text (via setText()).

      So far we have found two sequences that exhibit this behavior:
      Ra-Virama-Ra-Nukta (\u0a30\u0a4d\u0a30\u0a3c)
      Ya-Virama-Ya-Nukta (\u0a2f\u0a4d\u0a2f\u0a3c)

      We are checking with our customer to see if these are Valid sequences of characters but in either case the exception should not happen (using the no-glyph character or some other representation would be better if these are invalid sequences).


      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile and run the test case provided.


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      No Exception is thrown.
      ACTUAL -
      Exception is thrown and repeated making the application non-responsive and it impossible to add more text to the Swing text component.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :


      Below is a Stack trace from the 1.40_04:
      C:\devel\test>"C:\j2sdk1.4.0_04\bin\java.exe" -cp .. test.TestGurmukhi
      minIndex = 1, maxIndex = 4, cp = 1
      Exception in thread "main" minIndex = 1, maxIndex = 4, cp = 1
      java.lang.ArrayIndexOutOfBoundsException
              at sun.awt.font.ExtendedTextSourceLabel.createCharinfo(ExtendedTextSourceLabel.java:670)
              at sun.awt.font.ExtendedTextSourceLabel.getCharinfo(ExtendedTextSourceLabel.java:413)
              at sun.awt.font.ExtendedTextSourceLabel.getLineBreakIndex(ExtendedTextSourceLabel.java:359)
              at java.awt.font.TextMeasurer.calcLineBreak(TextMeasurer.java:313)
              at java.awt.font.TextMeasurer.getLineBreakIndex(TextMeasurer.java:556)
              at java.awt.font.LineBreakMeasurer.nextOffset(LineBreakMeasurer.java:340)
              at javax.swing.text.TextLayoutStrategy.getLimitingOffset(TextLayoutStrategy.java:260)
              at javax.swing.text.TextLayoutStrategy.createView(TextLayoutStrategy.java:168)
              at javax.swing.text.FlowView$FlowStrategy.layoutRow(FlowView.java:441)
              at javax.swing.text.TextLayoutStrategy.layoutRow(TextLayoutStrategy.java:109)
              at javax.swing.text.FlowView$FlowStrategy.layout(FlowView.java:397)
              at javax.swing.text.TextLayoutStrategy.layout(TextLayoutStrategy.java:92)
              at javax.swing.text.FlowView.layout(FlowView.java:182)
              at javax.swing.text.BoxView.setSize(BoxView.java:379)
              at javax.swing.plaf.basic.BasicTextAreaUI$PlainParagraph.setSize(BasicTextAreaUI.java:203)
              at javax.swing.text.BoxView.updateChildSizes(BoxView.java:348)
              at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:330)
              at javax.swing.text.BoxView.layout(BoxView.java:682)
              at javax.swing.text.BoxView.setSize(BoxView.java:379)
              at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1528)
              at javax.swing.plaf.basic.BasicTextUI$RootView.paint(BasicTextUI.java:1247)
              at javax.swing.plaf.basic.BasicTextUI.paintSafely(BasicTextUI.java:565)
              at javax.swing.plaf.basic.BasicTextUI.paint(BasicTextUI.java:699)
              at javax.swing.plaf.basic.BasicTextUI.update(BasicTextUI.java:678)
              at javax.swing.JComponent.paintComponent(JComponent.java:537)
              at javax.swing.JComponent.paint(JComponent.java:804)
              at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4735)
              at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4688)
              at javax.swing.JComponent._paintImmediately(JComponent.java:4632)
              at javax.swing.JComponent.paintImmediately(JComponent.java:4464)
              at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)
              at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:117)
              at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
              at java.awt.EventQueue.dispatchEvent(EventQueue.java:443)
              at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:191)
              at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:144)
              at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
              at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:130)
              at java.awt.EventDispatchThread.run(EventDispatchThread.java:98)
      java.lang.ArrayIndexOutOfBoundsException
              at sun.awt.font.ExtendedTextSourceLabel.createCharinfo(ExtendedTextSourceLabel.java:670)
              at sun.awt.font.ExtendedTextSourceLabel.getCharinfo(ExtendedTextSourceLabel.java:413)
              at sun.awt.font.ExtendedTextSourceLabel.getLineBreakIndex(ExtendedTextSourceLabel.java:359)
              at java.awt.font.TextMeasurer.calcLineBreak(TextMeasurer.java:313)
              at java.awt.font.TextMeasurer.getLineBreakIndex(TextMeasurer.java:556)
              at java.awt.font.LineBreakMeasurer.nextOffset(LineBreakMeasurer.java:340)
              at java.awt.font.LineBreakMeasurer.nextLayout(LineBreakMeasurer.java:422)
              at javax.swing.text.TextLayoutStrategy.sync(TextLayoutStrategy.java:321)
              at javax.swing.text.TextLayoutStrategy.insertUpdate(TextLayoutStrategy.java:52)
              at javax.swing.text.FlowView.insertUpdate(FlowView.java:236)
              at javax.swing.text.View.forwardUpdateToView(View.java:1208)
              at javax.swing.text.View.forwardUpdate(View.java:1183)
              at javax.swing.text.BoxView.forwardUpdate(BoxView.java:222)
              at javax.swing.text.View.insertUpdate(View.java:707)
              at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(BasicTextUI.java:1416)
              at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1650)
              at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:184)
              at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748)
              at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:705)
              at javax.swing.text.PlainDocument.insertString(PlainDocument.java:114)
              at javax.swing.JTextArea.insert(JTextArea.java:442)
              at test.TestGurmukhi.main(TestGurmukhi.java:35)

      C:\devel\test>"C:\j2sdk1.4.0_04\bin\java.exe" -version
      java version "1.4.0_04"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_04-b04)
      Java HotSpot(TM) Client VM (build 1.4.0_04-b04, mixed mode)



      And for 1.5.0 beta:
      C:\devel\test>"C:\Program Files\Java\j2re1.5.0\bin\java.exe" -cp .. test.TestGurmukhi
      Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32
              at sun.font.ExtendedTextSourceLabel.createCharinfo(Unknown Source)
              at sun.font.ExtendedTextSourceLabel.getCharinfo(Unknown Source)
              at sun.font.ExtendedTextSourceLabel.getLineBreakIndex(Unknown Source)
              at java.awt.font.TextMeasurer.calcLineBreak(Unknown Source)
              at java.awt.font.TextMeasurer.getLineBreakIndex(Unknown Source)
              at java.awt.font.LineBreakMeasurer.nextOffset(Unknown Source)
              at java.awt.font.LineBreakMeasurer.nextLayout(Unknown Source)
              at javax.swing.text.TextLayoutStrategy.sync(Unknown Source)
              at javax.swing.text.TextLayoutStrategy.insertUpdate(Unknown Source)
              at javax.swing.text.FlowView.insertUpdate(Unknown Source)
              at javax.swing.text.View.forwardUpdateToView(Unknown Source)
              at javax.swing.text.View.forwardUpdate(Unknown Source)
              at javax.swing.text.BoxView.forwardUpdate(Unknown Source)
              at javax.swing.text.View.insertUpdate(Unknown Source)
              at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(Unknown Source)
              at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(Unknown Source)
              at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source)
              at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
              at javax.swing.text.AbstractDocument.insertString(Unknown Source)
              at javax.swing.text.PlainDocument.insertString(Unknown Source)
              at javax.swing.JTextArea.insert(Unknown Source)
              at test.TestGurmukhi.main(TestGurmukhi.java:35)
      java.lang.ArrayIndexOutOfBoundsException: 32
              at sun.font.ExtendedTextSourceLabel.createCharinfo(Unknown Source)
              at sun.font.ExtendedTextSourceLabel.getCharinfo(Unknown Source)
              at sun.font.ExtendedTextSourceLabel.getLineBreakIndex(Unknown Source)
              at java.awt.font.TextMeasurer.calcLineBreak(Unknown Source)
              at java.awt.font.TextMeasurer.getLineBreakIndex(Unknown Source)
              at java.awt.font.LineBreakMeasurer.nextOffset(Unknown Source)
              at javax.swing.text.TextLayoutStrategy.getLimitingOffset(Unknown Source)
              at javax.swing.text.TextLayoutStrategy.createView(Unknown Source)
              at javax.swing.text.FlowView$FlowStrategy.layoutRow(Unknown Source)
              at javax.swing.text.TextLayoutStrategy.layoutRow(Unknown Source)
              at javax.swing.text.FlowView$FlowStrategy.layout(Unknown Source)
              at javax.swing.text.TextLayoutStrategy.layout(Unknown Source)
              at javax.swing.text.FlowView.layout(Unknown Source)
              at javax.swing.text.BoxView.setSize(Unknown Source)
              at javax.swing.plaf.basic.BasicTextAreaUI$PlainParagraph.setSize(Unknown Source)
              at javax.swing.text.BoxView.updateChildSizes(Unknown Source)
              at javax.swing.text.BoxView.setSpanOnAxis(Unknown Source)
              at javax.swing.text.BoxView.layout(Unknown Source)
              at javax.swing.text.BoxView.setSize(Unknown Source)
              at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(Unknown Source)
              at javax.swing.plaf.basic.BasicTextUI$RootView.paint(Unknown Source)
              at javax.swing.plaf.basic.BasicTextUI.paintSafely(Unknown Source)
              at javax.swing.plaf.basic.BasicTextUI.paint(Unknown Source)
              at javax.swing.plaf.basic.BasicTextUI.update(Unknown Source)
              at javax.swing.JComponent.paintComponent(Unknown Source)
              at javax.swing.JComponent.paint(Unknown Source)
              at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
              at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
              at javax.swing.JComponent._paintImmediately(Unknown Source)
              at javax.swing.JComponent.paintImmediately(Unknown Source)
              at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
              at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
              at java.awt.event.InvocationEvent.dispatch(Unknown Source)
              at java.awt.EventQueue.dispatchEvent(Unknown Source)
              at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
              at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
              at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
              at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
              at java.awt.EventDispatchThread.run(Unknown Source)

      C:\devel\test>"C:\Program Files\Java\j2re1.5.0\bin\java.exe" -version
      java version "1.5.0-beta"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b26)
      Java HotSpot(TM) Client VM (build 1.5.0-beta-b26, mixed mode)

      C:\devel\test>



      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------

      package test;

      import java.awt.*;

      import javax.swing.*;


      public class TestGurmukhi
      {
          public static void main(String[] args) throws Exception
          {
              JTextArea textArea = new JTextArea();
              JFrame frame = new JFrame();

              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

              // Uncomment to see the setText() exception.
              //textArea.setText(
              // "Ra Virama Ra Nukta \n" +
              // "\u0a30\u0a4d\u0a30\u0a3c \n");

              frame.getContentPane().setLayout(new BorderLayout());
              frame.getContentPane().add(textArea, BorderLayout.CENTER);

              frame.pack();
              frame.setVisible(true);


              Thread.sleep(5000);
              
              String keys = null;
              keys = "\u0a30\u0a4d\u0a30\u0a3c";
              keys = "\u0a2f\u0a4d\u0a2f\u0a3c";
              for(int i = 0; i < keys.length(); ++i)
              {
                  textArea.insert(
                      String.valueOf(keys.charAt(i)),
                      textArea.getDocument().getLength());
              }
          }
      }

      ---------- END SOURCE ----------


      (Incident Review ID: 240176)
      ======================================================================

            dougfelt Doug Felt
            rmandalasunw Ranjith Mandala (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: