diff --git a/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java b/src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java index fa8a47649..b9327f48f 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 000000000..28a055ec7 --- /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 c6acd4371..42e4b3793 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 d524a1772..36a38ac25 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 ); + } + }