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
This commit is contained in:
Sergey Vladimirov 2011-08-09 05:17:35 +00:00
parent d31694057d
commit aade7062e1
4 changed files with 92 additions and 6 deletions

View File

@ -39,11 +39,11 @@ import org.apache.poi.hwpf.model.NoteType;
import org.apache.poi.hwpf.model.NotesTables; import org.apache.poi.hwpf.model.NotesTables;
import org.apache.poi.hwpf.model.PAPBinTable; import org.apache.poi.hwpf.model.PAPBinTable;
import org.apache.poi.hwpf.model.PicturesTable; 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.RevisionMarkAuthorTable;
import org.apache.poi.hwpf.model.SavedByTable; import org.apache.poi.hwpf.model.SavedByTable;
import org.apache.poi.hwpf.model.SectionTable; import org.apache.poi.hwpf.model.SectionTable;
import org.apache.poi.hwpf.model.ShapesTable; 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.StyleSheet;
import org.apache.poi.hwpf.model.SubdocumentType; import org.apache.poi.hwpf.model.SubdocumentType;
import org.apache.poi.hwpf.model.TextPiece; import org.apache.poi.hwpf.model.TextPiece;
@ -94,7 +94,8 @@ public final class HWPFDocument extends HWPFDocumentCore
* structure*/ * structure*/
protected ComplexFileTable _cft; 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. */ /** Holds the save history for this document. */
protected SavedByTable _sbt; protected SavedByTable _sbt;
@ -284,9 +285,9 @@ public final class HWPFDocument extends HWPFDocumentCore
{ {
_cft = new ComplexFileTable(); _cft = new ComplexFileTable();
_tpt = _cft.getTextPieceTable(); _tpt = _cft.getTextPieceTable();
_tpt.add( new TextPiece( 0, _text.length(), _text.toString() final TextPiece textPiece = new SinglentonTextPiece( _text );
.getBytes( "UTF-16LE" ), new PieceDescriptor( new byte[8], _tpt.add( textPiece );
0 ) ) ); _text = textPiece.getStringBuilder();
} }
// Read FSPA and Escher information // Read FSPA and Escher information

View File

@ -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)";
}
}

View File

@ -31,7 +31,7 @@ import org.apache.poi.util.Internal;
* @author Ryan Ackley * @author Ryan Ackley
*/ */
@Internal @Internal
public final class TextPiece extends PropertyNode<TextPiece> public class TextPiece extends PropertyNode<TextPiece>
{ {
private boolean _usesUnicode; private boolean _usesUnicode;
@ -134,6 +134,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
* @param start Local start position, in characters * @param start Local start position, in characters
* @param end Local end position, in characters * @param end Local end position, in characters
*/ */
@Deprecated
public String substring(int start, int end) public String substring(int start, int end)
{ {
StringBuilder buf = (StringBuilder)_buf; StringBuilder buf = (StringBuilder)_buf;
@ -157,6 +158,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
* @param start The start position for the delete, in characters * @param start The start position for the delete, in characters
* @param length The number of characters to delete * @param length The number of characters to delete
*/ */
@Deprecated
public void adjustForDelete(int start, int length) { public void adjustForDelete(int start, int length) {
int numChars = length; int numChars = length;
@ -187,6 +189,7 @@ public final class TextPiece extends PropertyNode<TextPiece>
/** /**
* Returns the length, in characters * Returns the length, in characters
*/ */
@Deprecated
public int characterLength() public int characterLength()
{ {
return (getEnd() - getStart()); return (getEnd() - getStart());

View File

@ -16,6 +16,8 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.hwpf.usermodel; package org.apache.poi.hwpf.usermodel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Arrays; import java.util.Arrays;
@ -473,4 +475,33 @@ public class TestBugs extends TestCase
HWPFTestDataSamples.openSampleFileFromArchive( "Bug51524.zip" ); 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 );
}
} }