From: Sergey Vladimirov Date: Thu, 7 Jul 2011 12:11:53 +0000 (+0000) Subject: fix 47287 - StringIndexOutOfBoundsException in CharacterRun.replaceText() X-Git-Tag: REL_3_8_BETA4~279 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=299da44a4d29b49e2b954ace0479f70a6337f7cd;p=poi.git fix 47287 - StringIndexOutOfBoundsException in CharacterRun.replaceText() git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1143786 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index c919ea0762..b87e29f6f6 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 47287 - StringIndexOutOfBoundsException in CharacterRun.replaceText() 46817 - Regression: Text from some table cells missing Add getOverallRange() method to HWPFDocumentCore PAPX referenced outside of TextPiecesTable are ignored now and not loaded diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java b/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java index 50e1127b5d..ce448911ab 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java @@ -141,7 +141,10 @@ public final class TextPiece extends PropertyNode /* 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 diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java index 2d3a3ff012..6a2fce237c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java @@ -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 z = 0; z < p.numCharacterRuns(); z++) { - boolean isFound = false; - - //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()); + 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 z = 0; z < p.numCharacterRuns(); z++ ) + { + boolean isFound = false; + + // 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() ); + 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() ); 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()); - 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,