From a2fa746ee080db5aa0cd66ca21fc8c0b989259e9 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Sun, 28 Nov 2021 09:43:28 +0000 Subject: [PATCH] cache vml drawing git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895388 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/model/CommentsTable.java | 13 ++-- .../apache/poi/xssf/usermodel/XSSFSheet.java | 66 ++++++++++-------- poi/src/main/java9/module-info.class | Bin 3385 -> 3421 bytes 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java index dfd3320795..ab555cb346 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java @@ -52,6 +52,7 @@ public class CommentsTable extends POIXMLDocumentPart implements Comments { public static final int DEFAULT_AUTHOR_ID = 0; private Sheet sheet; + private XSSFVMLDrawing vmlDrawing; /** * Underlying XML Beans CTComment list. @@ -337,11 +338,13 @@ public class CommentsTable extends POIXMLDocumentPart implements Comments { } private XSSFVMLDrawing getVMLDrawing(Sheet sheet, boolean autocreate) { - if (sheet instanceof XSSFSheet) { - return ((XSSFSheet)sheet).getVMLDrawing(autocreate); - } else if (sheet instanceof SXSSFSheet) { - return ((SXSSFSheet)sheet).getVMLDrawing(autocreate); + if (vmlDrawing == null) { + if (sheet instanceof XSSFSheet) { + vmlDrawing = ((XSSFSheet)sheet).getVMLDrawing(autocreate); + } else if (sheet instanceof SXSSFSheet) { + vmlDrawing = ((SXSSFSheet)sheet).getVMLDrawing(autocreate); + } } - return null; + return vmlDrawing; } } diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 23b659883f..9f5a9addac 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -104,6 +104,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { private SortedMap tables; private List arrayFormulas; private final XSSFDataValidationHelper dataValidationHelper; + private XSSFVMLDrawing xssfvmlDrawing; /** * Creates new XSSFSheet - called by XSSFWorkbook to create a sheet from scratch. @@ -568,41 +569,44 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { */ @Internal public XSSFVMLDrawing getVMLDrawing(boolean autoCreate) { - XSSFVMLDrawing drawing = null; - CTLegacyDrawing ctDrawing = getCTLegacyDrawing(); - if(ctDrawing == null) { - if(autoCreate) { - int drawingNumber = getNextPartNumber(XSSFRelation.VML_DRAWINGS, - getPackagePart().getPackage().getPartsByContentType(XSSFRelation.VML_DRAWINGS.getContentType()).size()); - RelationPart rp = createRelationship(XSSFRelation.VML_DRAWINGS, getWorkbook().getXssfFactory(), drawingNumber, false); - drawing = rp.getDocumentPart(); - String relId = rp.getRelationship().getId(); - - //add CTLegacyDrawing element which indicates that this sheet contains drawing components built on the drawingML platform. - //The relationship Id references the part containing the drawing definitions. - ctDrawing = worksheet.addNewLegacyDrawing(); - ctDrawing.setId(relId); - } - } else { - //search the referenced drawing in the list of the sheet's relations - final String id = ctDrawing.getId(); - for (RelationPart rp : getRelationParts()){ - POIXMLDocumentPart p = rp.getDocumentPart(); - if(p instanceof XSSFVMLDrawing) { - XSSFVMLDrawing dr = (XSSFVMLDrawing)p; - String drId = rp.getRelationship().getId(); - if (drId.equals(id)) { - drawing = dr; - break; + if (xssfvmlDrawing == null) { + XSSFVMLDrawing drawing = null; + CTLegacyDrawing ctDrawing = getCTLegacyDrawing(); + if(ctDrawing == null) { + if(autoCreate) { + int drawingNumber = getNextPartNumber(XSSFRelation.VML_DRAWINGS, + getPackagePart().getPackage().getPartsByContentType(XSSFRelation.VML_DRAWINGS.getContentType()).size()); + RelationPart rp = createRelationship(XSSFRelation.VML_DRAWINGS, getWorkbook().getXssfFactory(), drawingNumber, false); + drawing = rp.getDocumentPart(); + String relId = rp.getRelationship().getId(); + + //add CTLegacyDrawing element which indicates that this sheet contains drawing components built on the drawingML platform. + //The relationship Id references the part containing the drawing definitions. + ctDrawing = worksheet.addNewLegacyDrawing(); + ctDrawing.setId(relId); + } + } else { + //search the referenced drawing in the list of the sheet's relations + final String id = ctDrawing.getId(); + for (RelationPart rp : getRelationParts()){ + POIXMLDocumentPart p = rp.getDocumentPart(); + if(p instanceof XSSFVMLDrawing) { + XSSFVMLDrawing dr = (XSSFVMLDrawing)p; + String drId = rp.getRelationship().getId(); + if (drId.equals(id)) { + drawing = dr; + break; + } + // do not break here since drawing has not been found yet (see bug 52425) } - // do not break here since drawing has not been found yet (see bug 52425) + } + if(drawing == null){ + LOG.atError().log("Can't find VML drawing with id={} in the list of the sheet's relationships", id); } } - if(drawing == null){ - LOG.atError().log("Can't find VML drawing with id={} in the list of the sheet's relationships", id); - } + xssfvmlDrawing = drawing; } - return drawing; + return xssfvmlDrawing; } protected CTDrawing getCTDrawing() { diff --git a/poi/src/main/java9/module-info.class b/poi/src/main/java9/module-info.class index a27868cdf4ab031ce77f7eff01d32dadd450c52a..7ca4ecd882a04d09234b79b8f0809aa79580adb5 100644 GIT binary patch literal 3421 zcmai$_mAg`xBE`vuUP2&C0t7+~gbrHy+SXc@ge2Qp>e74fy?35~ zKX?Ehgva188aL%y+3Y#{*}gM(H091*{qx^ne*-v(KTEjZz`{z{j$JkB`O3iZR#=5u9y0N;iAPL4YT_{ynd*M4JYkhhOqp;^ zR0)buBh(2Ef=8GpGzmVTMF5%O8B*e-%9wsgg*={$|cFb$}p~5 zPUN@^WksQv{To=2<<6RN63*$CoPry+T49h_Zs_~UO+EfTVPI{cMpd~6Ruzc6(7=*` zrIwR64j5QmiJUl5hrP6-(lagkVZH7Jb&EeIrdd;5>n{#|R#nnW!^pt0>1xwz2T41M z!Z=k`154QhyBD7=v1Kmh7VMrUy*S6$?RKJKPMGoy>?+(j(y(h`kS4v9<}FpLwO&a1 zMRhuj9XAbQ1EyxT5hc7~Q^Bg8+f^vx*Oq!+NzEnc<$$cIx$5)tyvv zwF({R>$#k%6&6eP?6UO)6|*D24P`P zxiS^n8OrU3@*@>Gz()qr8yy&Mke{rV(Zy{ zd&&!(cqVoy49unGO3s{!=h==qtR<-vRGsW7>K%}G>vYzrdNz6r(mlnFNc+?{pkyXV zRcrhd^ep5xiqqP1+&C<#M{j?Sja0qlJy8^gT*-9Cz{bKHBs_tfI-i);nmF<8YV35! z>)aREbro_zy1OjRHLpHxSn9RpaRvK^$IrkD-5CyjY)6uRl3to5;b|Q6?P5TmAbnBW z=PO@N+DK+QDc>jh%*)BSX|tol575s|PDyo~f{Q~_$UJRkchwwEtF;5UZ^zGa&e%Yy zV5;S`qO?9|;O*?XD#&)OK6*c~^`Ue$JjRX`Ysu)yUMccZCELyd+vVG<>-f#_%d2?g zbfeK@4eZve4$q-|WN_D>h{KLoRou#ZH03iQIK}mt3d80|eXp+WkDhE-e70F>gx!(8 zJ`M&=b1XakCsn{cWM1fIM=l?CykO||q`W9_50^DJdgFNThGHMBR3-<$5BKP48Mwml zS}i9!!=YKg;8*M3-#pCYFY|C7&gbQSae*u^#Qa&HgbU@@g8o|eu}Hoz7A|2f#WH3I z%Y`e1hp>`A0aHlARl?Q6HNv&Rb;9++4Z@AWO~TE>EyAtBZNlxs9m1W$UBZim7Yi>D zUMk!zyiB-9xL0TiZQ(v)S-4+#KsX^hD7;*Fh44z@Rl=)<*9fl_UMIX>c!The@J8Wb z;Z4Gug-3*w!drw#g~x=q3U3qME<7&0LwKj~gzzpQxSA(X!QHrrD|?dbeJ}qqaEgB$ GxbJ^K=i(&* literal 3385 zcmai$_nzBC5XXNTAV)4e-t^umA(3*)C3FIT90?EzF%UZJNo!kYSrU?L$JC?u-XZkP zBk%_gz*F!fd>D;f6iasQ^SQ5W?ab_yomu_!-(PXYIW!1D1_)hX)!Xkl1iKsEFA~LaX>aelj zI8ee8fvp*N%WpJ%FET9Ob+r{c^nJR7WdiF8g=}q=utH#U!K&kzuu5QQ&tyZzwSy%{ zfhFZYg^@n$#AO|qu;zU0u3xP>Ue%z_={fTBfH5^~OqH;n6gh&fKnWXrPi!64V?QWi zv%vB>yKXeSs2K!)7;9T%tH3hy&rDNdQaU8Ir#@$%nW>)=JJXEhm&|6QLrT4NC3Xw! zKHp|ne;{O5d@qh9E>A0xwP)KEi7V5vv(NR}I8;{bhZ0u_l!i8_1re$36WCm^U}kj9 z5h88vx^>TQdlFLx=A*>?L4hs9=4rvyE$zkK;13Dx7%7uU($xaSh2>1U*=Te^ZTTS; z>)Ha}dH+Fbt`}HeWVY+wjRG5rmU}xK$(OE{?2xXTs#*sEnn zqjxi{nhIlyV*=a9NpaUn+@3#rS=TH&P!cCDU@Pndu`hAw_%H*f<;Ss_b+yFF5n*OZ zdCv%IeG#*!-9U$ww0raCnuBP@4mD0$VB=6Gs39v+zy0pdm#-_31SWANpYY5&m5)ZG z#6tqRinmFun6r+j!cJ&SOFS}O(&BWgfM&*H0z1dpjAG^4DmlYXA!9y~MuY-3(jI>rUUBpd_z%C$(m`={n=J-UE<69^_gma zo%gXF4BiPQ@QuKpp`+G6#^$l!C3hBrSAWd*n>w&M$f61NToV$LohM!!I(O3H&B7HRMlv zAM|55UM|n{;^?dWkxx|5Cwg&gsNg)$<^e%3&*|R+Ttr_M;9^`tkN?F&emsdw=YdHq z=3h&h%b6>gCFW}4TC5{ZVgqv%^9Z)kC$NpVgSm@&8S@I}9_C)A!Q9V0z?^0tW?sX* zj(G#~Cg#n|qs-fwGtA@6JD7Jd?`EE2o@U<1e1Q2N^I_(r%*UBeGH01Kv%;(~=a??j zV+PES88chVv&^TN&oZB9&NE+PzQTNs`3CbX<~z*ym>)1dVt&H>jQIugD<-It=kP7Q V$B$Imb5!Y{>6gH-^jqNf{{aAB*t!4! -- 2.39.5