fix 47287 - StringIndexOutOfBoundsException in CharacterRun.replaceText()

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1143786 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Sergey Vladimirov 2011-07-07 12:11:53 +00:00
parent 6a8223f0de
commit d6d163fd96
3 changed files with 65 additions and 57 deletions

View File

@ -34,6 +34,7 @@
<changes>
<release version="3.8-beta4" date="2011-??-??">
<action dev="poi-developers" type="fix">47287 - StringIndexOutOfBoundsException in CharacterRun.replaceText()</action>
<action dev="poi-developers" type="fix">46817 - Regression: Text from some table cells missing</action>
<action dev="poi-developers" type="add">Add getOverallRange() method to HWPFDocumentCore</action>
<action dev="poi-developers" type="fix">PAPX referenced outside of TextPiecesTable are ignored now and not loaded</action>

View File

@ -141,7 +141,10 @@ public final class TextPiece extends PropertyNode<TextPiece>
/* find where the deleted area overlaps with this text piece */
int overlapStart = Math.max(myStart, start);
int overlapEnd = Math.min(myEnd, end);
((StringBuffer)_buf).delete(overlapStart, overlapEnd);
int bufStart = overlapStart - myStart;
int bufEnd = overlapEnd - myStart;
((StringBuffer)_buf).delete(bufStart, bufEnd);
}
// We need to invoke this even if text from this piece is not being

View File

@ -525,75 +525,79 @@ public final class TestProblems extends HWPFTestCase {
}
/**
* [FAILING] Bug 47287 - StringIndexOutOfBoundsException in CharacterRun.replaceText()
* [RESOLVED FIXED] Bug 47287 - StringIndexOutOfBoundsException in
* CharacterRun.replaceText()
*/
public void test47287() {
HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug47287.doc");
String[] values = {
"1-1",
"1-2",
"1-3",
"1-4",
"1-5",
"1-6",
"1-7",
"1-8",
"1-9",
"1-10",
"1-11",
"1-12",
"1-13",
"1-14",
"1-15",
};
public void test47287()
{
HWPFDocument doc = HWPFTestDataSamples.openSampleFile( "Bug47287.doc" );
String[] values = { "1-1", "1-2", "1-3", "1-4", "1-5", "1-6", "1-7",
"1-8", "1-9", "1-10", "1-11", "1-12", "1-13", "1-14", "1-15", };
int usedVal = 0;
try {
String PLACEHOLDER = "\u2002\u2002\u2002\u2002\u2002";
Range r = doc.getRange();
for (int x = 0; x < r.numSections(); x++) {
Section s = r.getSection(x);
for (int y = 0; y < s.numParagraphs(); y++) {
Paragraph p = s.getParagraph(y);
for ( int x = 0; x < r.numSections(); x++ )
{
Section s = r.getSection( x );
for ( int y = 0; y < s.numParagraphs(); y++ )
{
Paragraph p = s.getParagraph( y );
for (int z = 0; z < p.numCharacterRuns(); z++) {
for ( int z = 0; z < p.numCharacterRuns(); z++ )
{
boolean isFound = false;
//character run
CharacterRun run = p.getCharacterRun(z);
//character run text
// character run
CharacterRun run = p.getCharacterRun( z );
// character run text
String text = run.text();
String oldText = text;
int c = text.indexOf("FORMTEXT ");
if (c < 0) {
int k = text.indexOf(PLACEHOLDER);
if (k >= 0) {
text = text.substring(0, k) + values[usedVal] + text.substring(k + PLACEHOLDER.length());
int c = text.indexOf( "FORMTEXT " );
if ( c < 0 )
{
int k = text.indexOf( PLACEHOLDER );
if ( k >= 0 )
{
text = text.substring( 0, k ) + values[usedVal]
+ text.substring( k + PLACEHOLDER.length() );
usedVal++;
isFound = true;
}
} else {
for (; c >= 0; c = text.indexOf("FORMTEXT ", c + "FORMTEXT ".length())) {
int k = text.indexOf(PLACEHOLDER, c);
if (k >= 0) {
text = text.substring(0, k) + values[usedVal] + text.substring(k + PLACEHOLDER.length());
}
else
{
for ( ; c >= 0; c = text.indexOf( "FORMTEXT ", c
+ "FORMTEXT ".length() ) )
{
int k = text.indexOf( PLACEHOLDER, c );
if ( k >= 0 )
{
text = text.substring( 0, k )
+ values[usedVal]
+ text.substring( k
+ PLACEHOLDER.length() );
usedVal++;
isFound = true;
}
}
}
if (isFound) {
run.replaceText(oldText, text, 0);
if ( isFound )
{
run.replaceText( oldText, text, 0 );
}
}
}
}
fixed("47287");
} catch (StringIndexOutOfBoundsException e) {
// expected exception
}
}
String docText = r.text();
assertTrue( docText.contains( "1-1" ) );
assertTrue( docText.contains( "1-12" ) );
assertFalse( docText.contains( "1-13" ) );
assertFalse( docText.contains( "1-15" ) );
}
private static void insertTable(int rows, int columns) {
// POI apparently can't create a document from scratch,