POI-60342: handle missing sdtcontentcell in an sdtcell

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1768054 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tim Allison 2016-11-04 15:21:51 +00:00
parent d769a03fda
commit abe0740d3a
1 changed files with 50 additions and 46 deletions

View File

@ -1,23 +1,23 @@
/* ==================================================================== /* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0 The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.xwpf.usermodel; package org.apache.poi.xwpf.usermodel;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlCursor.TokenType; import org.apache.xmlbeans.XmlCursor.TokenType;
@ -32,12 +32,12 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentCell;
*/ */
public class XWPFSDTContentCell implements ISDTContent { public class XWPFSDTContentCell implements ISDTContent {
//A full implementation would grab the icells //A full implementation would grab the icells
//that a content cell can contain. This would require //that a content cell can contain. This would require
//significant changes, including changing the notion that the //significant changes, including changing the notion that the
//parent of a cell can be not just a row, but an sdt. //parent of a cell can be not just a row, but an sdt.
//For now we are just grabbing the text out of the text tokentypes. //For now we are just grabbing the text out of the text tokentypes.
//private List<ICell> cells = new ArrayList<ICell>(). //private List<ICell> cells = new ArrayList<ICell>().
private String text = ""; private String text = "";
@ -45,9 +45,13 @@ public class XWPFSDTContentCell implements ISDTContent {
public XWPFSDTContentCell(CTSdtContentCell sdtContentCell, public XWPFSDTContentCell(CTSdtContentCell sdtContentCell,
XWPFTableRow xwpfTableRow, IBody part) { XWPFTableRow xwpfTableRow, IBody part) {
super(); super();
//sdtContentCell is allowed to be null: minOccurs="0" maxOccurs="1"
if (sdtContentCell == null) {
return;
}
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
XmlCursor cursor = sdtContentCell.newCursor(); XmlCursor cursor = sdtContentCell.newCursor();
//keep track of the following, //keep track of the following,
//and add "\n" only before the start of a body //and add "\n" only before the start of a body
//element if it is not the first body element. //element if it is not the first body element.
@ -55,8 +59,8 @@ public class XWPFSDTContentCell implements ISDTContent {
//index of cell in row //index of cell in row
int tcCnt = 0; int tcCnt = 0;
//count of body objects //count of body objects
int iBodyCnt = 0; int iBodyCnt = 0;
int depth = 1; int depth = 1;
while (cursor.hasNextToken() && depth > 0) { while (cursor.hasNextToken() && depth > 0) {
TokenType t = cursor.toNextToken(); TokenType t = cursor.toNextToken();
@ -64,17 +68,17 @@ public class XWPFSDTContentCell implements ISDTContent {
sb.append(cursor.getTextValue()); sb.append(cursor.getTextValue());
} else if (isStartToken(cursor, "tr")) { } else if (isStartToken(cursor, "tr")) {
tcCnt = 0; tcCnt = 0;
iBodyCnt = 0; iBodyCnt = 0;
} else if (isStartToken(cursor, "tc")) { } else if (isStartToken(cursor, "tc")) {
if (tcCnt++ > 0) { if (tcCnt++ > 0) {
sb.append("\t"); sb.append("\t");
} }
iBodyCnt = 0; iBodyCnt = 0;
} else if (isStartToken(cursor, "p") || } else if (isStartToken(cursor, "p") ||
isStartToken(cursor, "tbl") || isStartToken(cursor, "tbl") ||
isStartToken(cursor, "sdt")) { isStartToken(cursor, "sdt")) {
if (iBodyCnt > 0) { if (iBodyCnt > 0) {
sb.append("\n"); sb.append("\n");
} }
iBodyCnt++; iBodyCnt++;
} }
@ -84,7 +88,7 @@ public class XWPFSDTContentCell implements ISDTContent {
depth--; depth--;
} }
} }
text = sb.toString(); text = sb.toString();
cursor.dispose(); cursor.dispose();
} }
@ -94,11 +98,11 @@ public class XWPFSDTContentCell implements ISDTContent {
return false; return false;
} }
QName qName = cursor.getName(); QName qName = cursor.getName();
if (qName != null && qName.getLocalPart() != null && if (qName != null && qName.getLocalPart() != null &&
qName.getLocalPart().equals(string)) { qName.getLocalPart().equals(string)) {
return true; return true;
} }
return false; return false;
} }