-
Bug
-
Resolution: Fixed
-
P3
-
1.4.2
-
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)
======================================================================