You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/08/04 07:51:25 UTC
svn commit: r428634 - in
/incubator/harmony/enhanced/classlib/trunk/modules/text/src:
main/java/java/text/Bidi.java
test/java/org/apache/harmony/text/tests/java/text/BidiTest.java
Author: pyang
Date: Thu Aug 3 22:51:24 2006
New Revision: 428634
URL: http://svn.apache.org/viewvc?rev=428634&view=rev
Log:
Fix for HARMONY-1031([classlib][text]compatibility: Bidi expected IAE) and HARMONY-1059([classlib][text]compatibility: createLineBidi(-1, 1) expected IAE)
Modified:
incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java
incubator/harmony/enhanced/classlib/trunk/modules/text/src/test/java/org/apache/harmony/text/tests/java/text/BidiTest.java
Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java?rev=428634&r1=428633&r2=428634&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/main/java/java/text/Bidi.java Thu Aug 3 22:51:24 2006
@@ -1,4 +1,4 @@
-/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable
+/* Copyright 2005, 2006 The Apache Software Foundation or its licensors, as applicable
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -132,6 +132,15 @@
*/
public Bidi(char[] text, int textStart, byte[] embeddings, int embStart,
int paragraphLength, int flags) {
+ if (textStart < 0) {
+ throw new IllegalArgumentException("Negative textStart value " + textStart);
+ }
+ if (embStart < 0) {
+ throw new IllegalArgumentException("Negative embStart value " + embStart);
+ }
+ if (paragraphLength < 0) {
+ throw new IllegalArgumentException("Negative paragraph length " + paragraphLength);
+ }
long pBidi = createUBiDi(text, textStart, embeddings, embStart,
paragraphLength, flags);
readBidiInfo(pBidi);
@@ -167,29 +176,31 @@
byte[] realEmbeddings = null;
- if (text == null || text.length < textStart + paragraphLength) {
+ if (text == null || text.length - textStart< paragraphLength) {
throw new IllegalArgumentException();
}
realText = new char[paragraphLength];
System.arraycopy(text, textStart, realText, 0, paragraphLength);
if (embeddings != null) {
- if (embeddings.length < embStart + paragraphLength) {
+ if (embeddings.length - embStart < paragraphLength) {
throw new IllegalArgumentException();
}
- Bidi temp = new Bidi(text, textStart, null, 0, paragraphLength,
- flags);
- realEmbeddings = new byte[paragraphLength];
- System.arraycopy(temp.offsetLevel, 0, realEmbeddings, 0,
- paragraphLength);
- for (int i = 0; i < paragraphLength; i++) {
- byte e = embeddings[i];
- if (e < 0) {
- realEmbeddings[i] = (byte) (BidiWrapper.UBIDI_LEVEL_OVERRIDE - e);
- } else if (e > 0) {
- realEmbeddings[i] = e;
- } else {
- realEmbeddings[i] |= (byte) BidiWrapper.UBIDI_LEVEL_OVERRIDE;
+ if (paragraphLength > 0) {
+ Bidi temp = new Bidi(text, textStart, null, 0, paragraphLength,
+ flags);
+ realEmbeddings = new byte[paragraphLength];
+ System.arraycopy(temp.offsetLevel, 0, realEmbeddings, 0,
+ paragraphLength);
+ for (int i = 0; i < paragraphLength; i++) {
+ byte e = embeddings[i];
+ if (e < 0) {
+ realEmbeddings[i] = (byte) (BidiWrapper.UBIDI_LEVEL_OVERRIDE - e);
+ } else if (e > 0) {
+ realEmbeddings[i] = e;
+ } else {
+ realEmbeddings[i] |= (byte) BidiWrapper.UBIDI_LEVEL_OVERRIDE;
+ }
}
}
}
@@ -267,6 +278,9 @@
* range from 0 to (limit - start - 1).
*/
public Bidi createLineBidi(int lineStart, int lineLimit) {
+ if (lineStart < 0 || lineLimit < 0 || lineLimit > length || lineStart > lineLimit) {
+ throw new IllegalArgumentException("Invalid ranges (start=" + lineStart + ", limit=" + lineLimit + ", length=" + length + ")");
+ }
char[] text = new char[this.length];
Arrays.fill(text, 'a');
byte[] embeddings = new byte[this.length];
@@ -440,19 +454,12 @@
* @return true if the range of characters requires a Bidi object.
*/
public static boolean requiresBidi(char[] text, int start, int limit) {
- if (limit < 0 || start >= limit) {
- return false;
- } else if (start < 0 || start > text.length || limit > text.length) {
- throw new ArrayIndexOutOfBoundsException();
- }
-
- Bidi bidi = new Bidi(text, start, null, 0, limit - start, 0);
-
- if (bidi.isLeftToRight()) {
- return false;
- }
-
- return true;
+ int length = text.length;
+ if(limit < 0 || start < 0 || start > limit || limit > length){
+ throw new IllegalArgumentException();
+ }
+ Bidi bidi = new Bidi(text, start, null, 0, limit - start, 0);
+ return !bidi.isLeftToRight();
}
/**
Modified: incubator/harmony/enhanced/classlib/trunk/modules/text/src/test/java/org/apache/harmony/text/tests/java/text/BidiTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/text/src/test/java/org/apache/harmony/text/tests/java/text/BidiTest.java?rev=428634&r1=428633&r2=428634&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/text/src/test/java/org/apache/harmony/text/tests/java/text/BidiTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/text/src/test/java/org/apache/harmony/text/tests/java/text/BidiTest.java Thu Aug 3 22:51:24 2006
@@ -1,4 +1,4 @@
-/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable
+/* Copyright 2005, 2006 The Apache Software Foundation or its licensors, as applicable
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -100,6 +100,44 @@
} catch (IllegalArgumentException e) {
// expected
}
+
+ //regression for HARMONY-1031
+ try {
+ bd = new Bidi(new char[] { 't','t','t'}, -1, new byte[] { 2, 2 }, 1, 1, 1);
+ fail("should be IAE");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ try {
+ bd = new Bidi(new char[] { 't','t','t'}, 1, new byte[] { 2, 2 }, -1, 1, 1);
+ fail("should be IAE");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ try {
+ bd = new Bidi(new char[] { 't','t','t'}, 1, new byte[] { 2, 2 }, 1, -1, 1);
+ fail("should be IAE");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ try {
+ bd = new Bidi(new char[] {}, 5, new byte[] { 2, 2, 2, 2, 2, 2 }, 8, Integer.MAX_VALUE, 5);
+ fail("should be IAE");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ try {
+ bd = new Bidi(null, 5, null, 8, Integer.MAX_VALUE, 5);
+ fail("should be IAE");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ bd = new Bidi(new char[] {'o'}, 0, new byte[] { 2, 2}, 2, 0, 2 );
}
public void testEmptyParagraph() {
@@ -598,7 +636,12 @@
}
public void testRequiresBidi() {
- assertFalse(Bidi.requiresBidi(null, 0, 0));
+ try{
+ Bidi.requiresBidi(null, 0, 0);
+ fail("should throw NullPointerException");
+ }catch (NullPointerException e){
+ // expected
+ }
try {
assertFalse(Bidi.requiresBidi(null, 0, 1));
@@ -608,35 +651,60 @@
}
try {
assertFalse(Bidi.requiresBidi("".toCharArray(), 0, 1));
- fail("should throw ArrayIndexOutOfBoundsException");
- } catch (ArrayIndexOutOfBoundsException e) {
- // expected
- }
- try {
- assertFalse(Bidi.requiresBidi("".toCharArray(), -1, 1));
- fail("should throw ArrayIndexOutOfBoundsException");
- } catch (ArrayIndexOutOfBoundsException e) {
- // expected
- }
- try {
- assertFalse(Bidi.requiresBidi("".toCharArray(), 1, 2));
- fail("should throw ArrayIndexOutOfBoundsException");
- } catch (ArrayIndexOutOfBoundsException e) {
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
// expected
}
try {
- assertFalse(Bidi.requiresBidi("".toCharArray(), 4, 5));
- fail("should throw ArrayIndexOutOfBoundsException");
- } catch (ArrayIndexOutOfBoundsException e) {
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), -1, 1));
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
// expected
}
- assertFalse(Bidi.requiresBidi("".toCharArray(), 7, 7));
- assertFalse(Bidi.requiresBidi(" ".toCharArray(), 0, 1));
- assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), 1, -1));
- assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), -1, -2));
- assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), 4, 4));
- assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), 3, 1));
+ try {
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, -1));
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), 1, -1));
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, 0));
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 7, 7));
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, Integer.MAX_VALUE));
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), Integer.MAX_VALUE, 1));
+ fail("should throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ assertFalse(Bidi.requiresBidi("".toCharArray(), 0, 0));
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 1, 1));
+ assertFalse(Bidi.requiresBidi("aaa".toCharArray(), 0, 2));
+ assertFalse(Bidi.requiresBidi("\u05D0".toCharArray(), 1, 1));
assertTrue(Bidi.requiresBidi("\u05D0".toCharArray(), 0, 1));
+ assertFalse(Bidi.requiresBidi("aa\u05D0a".toCharArray(), 0, 2));
+ assertTrue(Bidi.requiresBidi("aa\u05D0a".toCharArray(), 1, 3));
}
public void testHebrewOverrideEmbeddings() {
@@ -731,6 +799,47 @@
assertFalse(line.isRightToLeft());
}
+ public void testCreateLineBidiInvalid() {
+ //regression for HARMONY-1050
+ Bidi bidi = new Bidi("str", 1);
+ try {
+ bidi.createLineBidi(-1, 1);
+ fail("Expected IAE");
+ } catch (IllegalArgumentException e) {
+ // Expected
+ }
+
+ try {
+ bidi.createLineBidi(1, -1);
+ fail("Expected IAE");
+ } catch (IllegalArgumentException e) {
+ // Expected
+ }
+
+ try {
+ bidi.createLineBidi(-1, -1);
+ fail("Expected IAE");
+ } catch (IllegalArgumentException e) {
+ // Expected
+ }
+
+ try {
+ bidi.createLineBidi(2, 1);
+ fail("Expected IAE");
+ } catch (IllegalArgumentException e) {
+ // Expected
+ }
+
+ bidi.createLineBidi(2, 2);
+
+ try {
+ bidi.createLineBidi(2, 4);
+ fail("Expected IAE");
+ } catch (IllegalArgumentException e) {
+ // Expected
+ }
+ }
+
public void testIncompatibleLineAlgorithm() {
// ICU treat a new line as in the same run, however RI does not
bd = new Bidi("aaaaa".toCharArray(), 0,