From 6025d985049e05abb7bb18fbd5aab332b2c4e422 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 13 Mar 2008 13:03:25 +0000 Subject: [PATCH] Patch from Raghu from bug #44580 - Fix bug #28627, where hwpf Range.delete() didn't work properly git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@636751 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hwpf/model/TextPiece.java | 12 ++++ .../org/apache/poi/hwpf/usermodel/Range.java | 7 ++ .../org/apache/poi/hwpf/data/Bug28627.doc | Bin 0 -> 19968 bytes .../poi/hwpf/usermodel/TestProblems.java | 62 ++++++++++++++---- 6 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 src/scratchpad/testcases/org/apache/poi/hwpf/data/Bug28627.doc diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index c355afd44..9c1529aa5 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ + 28627 / 44580 - Fix Range.delete() in HWPF 44539 - Support for area references in formulas of rows >= 32768 44536 - Improved support for detecting read-only recommended files 43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one) diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index c59cae1a3..367c6b0c7 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 28627 / 44580 - Fix Range.delete() in HWPF 44539 - Support for area references in formulas of rows >= 32768 44536 - Improved support for detecting read-only recommended files 43901 - Correctly update the internal last cell number when adding and removing cells (previously sometimes off-by-one) 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 593214b18..67c634d9f 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java @@ -90,7 +90,19 @@ public class TextPiece extends PropertyNode implements Comparable public void adjustForDelete(int start, int length) { + int myStart = getStart(); + int myEnd = getEnd(); + int end = start + length; + /* do we have to delete from this text piece? */ + if (start <= myEnd && end >= myStart) { + /* 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); + + super.adjustForDelete(start, length); + } } public int characterLength() diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java index 60e00f325..f2d9a615f 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java @@ -494,6 +494,7 @@ public class Range int numSections = _sections.size(); int numRuns = _characters.size(); int numParagraphs = _paragraphs.size(); + int numTextPieces = _text.size(); for (int x = _charStart; x < numRuns; x++) { @@ -512,6 +513,12 @@ public class Range SEPX sepx = (SEPX)_sections.get(x); sepx.adjustForDelete(_start, _end - _start); } + + for (int x = _textStart; x < numTextPieces; x++) + { + TextPiece piece = (TextPiece)_text.get(x); + piece.adjustForDelete(_start, _end - _start); + } } /** diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/Bug28627.doc b/src/scratchpad/testcases/org/apache/poi/hwpf/data/Bug28627.doc new file mode 100644 index 0000000000000000000000000000000000000000..91b031d1d77c9ac5f32c30911a4ff43d5c74b651 GIT binary patch literal 19968 zcmeHPU2IfE6h8NMciTdNQlV5txIj@8n@SNBW7HCAMI%2-)#!_CySLqi-QK!ge*7Uq zL?jWlMx!Q@P!mju8dJ0q9!%8OS0gVPjXq$4KMzXkPYgcT_4{Ub*4u5j-7O0K%t_8Y zGiT<^nfu+j_s*F+yC*-Med?8C^S_cjx>3qxBwZ;XpWZ@xiOyGx)FVyZNIIRSdNCMD zL;oTKzJK)td3Z}@KxDY)Jzhi+Tv-q<{P7BrnbN+see0RlGp$NH>QEV|l}6M)*pT7l zqe{nS(&zFotK*5R?ID~SX*^j4{ZW)t>iWlmICJFR z&)Q8@E=M~y+F1cfDn{0$UKfy$!ti6D|1R=(!+tIs$RmCJx_^1allGtO`boE^Wq!Ll zzYTV^Fs#bj=S$XOd44s7Q~yPf^ZWOWS3OMfZCz@K_Ed#~(@8d$KZ<|0Zj%^SV4!dhSQvu5L-=LqGLU z>hsi6``39bwS6I}>*Y&59y7q)LpRc?$iZ^$4}Is$FcSg#ZDI<_a=?v#Ucmlx~qa#EfX4exNBR1`T> zaN};ujX0f2FX6;eGiE5Wo^UeUl??Ypot?3G+-Y~6PH%g6#PPbFhcgyV!rkqJp-Q?5 zZ-*Nh-%xpqrFxxqFCKAH?ygi`eXra7(?zV?ol*LE8jAu5V79ReGmUG&Pk~Nz|N>IC<1flM)yCsTWZxYv97YB7c8?g`BfErwQ6Q<^rDUrMP~(h+Ub0V z^L$?WYr!742YeXZ59S#7-G7#UZN}fSNuPfNID079ao))J_isF2U<7Q-vKpkRFKR6s zIC+&baO#G|0~O^ahh&x@pvuyp zDXlTmAnI(n)ZaI`&8ux>oq@Mk(n|iOJ9Dw;}b4 z2i9h!4HoTa!A0%Sy<8yke#O$`%1=XLO)HCM5D&PLcEmtHlRpSDZT4SfY27E2p1NVRrgZsfJz%PN-auVg9EHe%Imy}t0ZlWN< z$#Xsmkz1QCXBu=2{0^AsU5=+%M&Iw#AepP7%g0)A!I;AcZscn)iPwM==AMh67fz(p z&DI`EwMCELU4Msd;pxdVNlRN@Cn$K?w(znw^Ri`TTz6q;Z3BC<6Gv+4P*bKBYtwmV zsmGsYCvU0kLsPaLDhmdJc3I$whcF6pnRPqL5fp70N(l_nUNuNv_;WCfJ#|BMqkI+G zu_YL^Y^ywE2Q{9$^QfVQj%=0(Vbcyv-iB9Sro2xN1#D75?`v>F#c-R@W(k08syI+5 z!zY1g6ulRD`ip(7&w!aGh$5GOU(V$MQdT`yt4vX6ahVLWqdJeIp`sC}DDMvr%AoAs zTeEVs5r?oI#-mG$&-or)D;}H8>!e5K_-(A)M1AFOdKSjPO(Lgp7h;w3(L&4{lC(k{ z{fBhACYxP_(H~WhQb!^fxgB`m^IqU%-O1{^ppQY*1x*TR2Nq%3p&sffWz90)JrU^m zuup*_$ai9F^FCrrnb(BKG`w2qBlB9I&m?M(ul4uYqzwWF0fT@+z#wqm5g5TVGidu> z*x4Rfkf$C${L^n6qt&lJTOn6o{`Tj~p*xC#*^n&n1Jjc61gE8+fjNIZ4d$HvESU54 z04j5C$=Mty0`-vmsJ$AJuj>}bX^;^}?!@SUE4j^9tGwq8($7P#`jNS|li z7E8t5T)&_&WDqb27z7Lg1_6VBLBJqj5HJWB1PlTOfqxVNjDs1;GIkDt8OJlC<@b7i ztLJ}v@Y_6NXvX1;)A>!FaX({umh&4vo zrS)fZ7XMPt|6-qiOV;8H6Iessh>f#bSyB?!;OV7(7kmD6@IXmkCaydc{}Z=ZTIsp? z=h!vRTR(#Tue61$UxpVv&pQ9v&3E*;d(@nk>>oy`ZF}oCbKe?N>Y2iHqb_e;Ex%m% Q)?azAm3C*C+LIyh2OOu{X#fBK literal 0 HcmV?d00001 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 e82c4d130..23681486f 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java @@ -16,19 +16,14 @@ */ package org.apache.poi.hwpf.usermodel; -import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileInputStream; -import java.util.Iterator; -import java.util.List; +import java.io.FileOutputStream; + +import junit.framework.TestCase; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.model.StyleSheet; -import org.apache.poi.hwpf.model.TextPiece; -import org.apache.poi.hwpf.usermodel.Paragraph; -import org.apache.poi.hwpf.usermodel.Range; -import org.apache.poi.util.LittleEndian; - -import junit.framework.TestCase; /** * Test various problem documents @@ -36,16 +31,18 @@ import junit.framework.TestCase; * @author Nick Burch (nick at torchbox dot com) */ public class TestProblems extends TestCase { + private String dirname = System.getProperty("HWPF.testdata.path"); protected void setUp() throws Exception { - } - + } + /** * ListEntry passed no ListTable */ public void testListEntryNoListTable() throws Exception { - HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/ListEntryNoListTable.doc")); + HWPFDocument doc = new HWPFDocument(new FileInputStream( + new File(dirname, "ListEntryNoListTable.doc"))); Range r = doc.getRange(); StyleSheet styleSheet = doc.getStyleSheet(); @@ -62,7 +59,8 @@ public class TestProblems extends TestCase { * AIOOB for TableSprmUncompressor.unCompressTAPOperation */ public void testSprmAIOOB() throws Exception { - HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/AIOOB-Tap.doc")); + HWPFDocument doc = new HWPFDocument(new FileInputStream( + new File(dirname, "AIOOB-Tap.doc"))); Range r = doc.getRange(); StyleSheet styleSheet = doc.getStyleSheet(); @@ -79,7 +77,8 @@ public class TestProblems extends TestCase { * Test for TableCell not skipping the last paragraph */ public void testTableCellLastParagraph() throws Exception { - HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/Bug44292.doc")); + HWPFDocument doc = new HWPFDocument(new FileInputStream( + new File(dirname, "Bug44292.doc"))); Range r = doc.getRange(); //get the table @@ -104,4 +103,39 @@ public class TestProblems extends TestCase { // Last cell should have one paragraph assertEquals(1, cell.numParagraphs()); } + + public void testRangeDelete() throws Exception { + HWPFDocument doc = new HWPFDocument(new FileInputStream( + new File(dirname, "Bug28627.doc"))); + + Range range = doc.getRange(); + int numParagraphs = range.numParagraphs(); + + int totalLength = 0, deletedLength = 0; + + for (int i = 0; i < numParagraphs; i++) { + Paragraph para = range.getParagraph(i); + String text = para.text(); + + totalLength += text.length(); + if (text.indexOf("{delete me}") > -1) { + para.delete(); + deletedLength = text.length(); + } + } + + // check the text length after deletion + int newLength = 0; + range = doc.getRange(); + numParagraphs = range.numParagraphs(); + + for (int i = 0; i < numParagraphs; i++) { + Paragraph para = range.getParagraph(i); + String text = para.text(); + + newLength += text.length(); + } + + assertEquals(newLength, totalLength - deletedLength); + } }