From aade7062e119b48925dd6edeaaa4b63995cabb4e Mon Sep 17 00:00:00 2001 From: Sergey Vladimirov Date: Tue, 9 Aug 2011 05:17:35 +0000 Subject: [PATCH] backlink used doc's stringbuilder and singlenton TextPiece from TextPieceTable git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1155210 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/org/apache/poi/hwpf/HWPFDocument.java | 11 ++-- .../poi/hwpf/model/SinglentonTextPiece.java | 51 +++++++++++++++++++ .../org/apache/poi/hwpf/model/TextPiece.java | 5 +- .../apache/poi/hwpf/usermodel/TestBugs.java | 31 +++++++++++ 4 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/hwpf/model/SinglentonTextPiece.java diff --git a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java index fa8a47649c..b9327f48f1 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java @@ -39,11 +39,11 @@ import org.apache.poi.hwpf.model.NoteType; import org.apache.poi.hwpf.model.NotesTables; import org.apache.poi.hwpf.model.PAPBinTable; import org.apache.poi.hwpf.model.PicturesTable; -import org.apache.poi.hwpf.model.PieceDescriptor; import org.apache.poi.hwpf.model.RevisionMarkAuthorTable; import org.apache.poi.hwpf.model.SavedByTable; import org.apache.poi.hwpf.model.SectionTable; import org.apache.poi.hwpf.model.ShapesTable; +import org.apache.poi.hwpf.model.SinglentonTextPiece; import org.apache.poi.hwpf.model.StyleSheet; import org.apache.poi.hwpf.model.SubdocumentType; import org.apache.poi.hwpf.model.TextPiece; @@ -94,7 +94,8 @@ public final class HWPFDocument extends HWPFDocumentCore * structure*/ protected ComplexFileTable _cft; - protected final StringBuilder _text; + /** Contains text buffer linked directly to single-piece document text piece */ + protected StringBuilder _text; /** Holds the save history for this document. */ protected SavedByTable _sbt; @@ -284,9 +285,9 @@ public final class HWPFDocument extends HWPFDocumentCore { _cft = new ComplexFileTable(); _tpt = _cft.getTextPieceTable(); - _tpt.add( new TextPiece( 0, _text.length(), _text.toString() - .getBytes( "UTF-16LE" ), new PieceDescriptor( new byte[8], - 0 ) ) ); + final TextPiece textPiece = new SinglentonTextPiece( _text ); + _tpt.add( textPiece ); + _text = textPiece.getStringBuilder(); } // Read FSPA and Escher information diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/SinglentonTextPiece.java b/src/scratchpad/src/org/apache/poi/hwpf/model/SinglentonTextPiece.java new file mode 100644 index 0000000000..28a055ec76 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/SinglentonTextPiece.java @@ -0,0 +1,51 @@ +package org.apache.poi.hwpf.model; + +import java.io.IOException; + +import org.apache.poi.util.Internal; + +@Internal +public class SinglentonTextPiece extends TextPiece +{ + + public SinglentonTextPiece( StringBuilder buffer ) throws IOException + { + super( 0, buffer.length(), buffer.toString().getBytes( "UTF-16LE" ), + new PieceDescriptor( new byte[8], 0 ) ); + } + + @Override + public int bytesLength() + { + return getStringBuilder().length() * 2; + } + + @Override + public int characterLength() + { + return getStringBuilder().length(); + } + + @Override + public int getCP() + { + return 0; + } + + @Override + public int getEnd() + { + return characterLength(); + } + + @Override + public int getStart() + { + return 0; + } + + public String toString() + { + return "SinglentonTextPiece (" + characterLength() + " chars)"; + } +} 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 c6acd4371c..42e4b3793d 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java @@ -31,7 +31,7 @@ import org.apache.poi.util.Internal; * @author Ryan Ackley */ @Internal -public final class TextPiece extends PropertyNode +public class TextPiece extends PropertyNode { private boolean _usesUnicode; @@ -134,6 +134,7 @@ public final class TextPiece extends PropertyNode * @param start Local start position, in characters * @param end Local end position, in characters */ + @Deprecated public String substring(int start, int end) { StringBuilder buf = (StringBuilder)_buf; @@ -157,6 +158,7 @@ public final class TextPiece extends PropertyNode * @param start The start position for the delete, in characters * @param length The number of characters to delete */ + @Deprecated public void adjustForDelete(int start, int length) { int numChars = length; @@ -187,6 +189,7 @@ public final class TextPiece extends PropertyNode /** * Returns the length, in characters */ + @Deprecated public int characterLength() { return (getEnd() - getStart()); diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java index d524a17728..36a38ac259 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java @@ -16,6 +16,8 @@ ==================================================================== */ package org.apache.poi.hwpf.usermodel; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -473,4 +475,33 @@ public class TestBugs extends TestCase HWPFTestDataSamples.openSampleFileFromArchive( "Bug51524.zip" ); } + /** + * Bug 51604 - replace text fails for doc ( poi 3.8 beta release from + * download site ) + */ + public void test51604() + { + HWPFDocument document = HWPFTestDataSamples + .openSampleFile( "Bug51604.doc" ); + + Range range = document.getRange(); + int numParagraph = range.numParagraphs(); + int counter = 0; + for ( int i = 0; i < numParagraph; i++ ) + { + Paragraph paragraph = range.getParagraph( i ); + int numCharRuns = paragraph.numCharacterRuns(); + for ( int j = 0; j < numCharRuns; j++ ) + { + CharacterRun charRun = paragraph.getCharacterRun( j ); + String text = charRun.text(); + charRun.replaceText( text, "+" + ( ++counter ) ); + } + } + + document = HWPFTestDataSamples.writeOutAndReadBack( document ); + String text = document.getDocumentText(); + assertEquals( "+1+2+3+4+5+6+7+8+9+10+11+12", text ); + } + } -- 2.39.5