From abe0740d3a87296491db26fe8284b14f218213d0 Mon Sep 17 00:00:00 2001 From: Tim Allison Date: Fri, 4 Nov 2016 15:21:51 +0000 Subject: [PATCH] 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 --- .../xwpf/usermodel/XWPFSDTContentCell.java | 96 ++++++++++--------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java index 4ded4787e..c8246f6dd 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContentCell.java @@ -1,23 +1,23 @@ -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - 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 obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ -package org.apache.poi.xwpf.usermodel; - - -import javax.xml.namespace.QName; +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + 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 obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.xwpf.usermodel; + + +import javax.xml.namespace.QName; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlCursor.TokenType; @@ -32,12 +32,12 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentCell; */ public class XWPFSDTContentCell implements ISDTContent { - //A full implementation would grab the icells - //that a content cell can contain. This would require - //significant changes, including changing the notion that the - //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. - + //A full implementation would grab the icells + //that a content cell can contain. This would require + //significant changes, including changing the notion that the + //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. + //private List cells = new ArrayList(). private String text = ""; @@ -45,9 +45,13 @@ public class XWPFSDTContentCell implements ISDTContent { public XWPFSDTContentCell(CTSdtContentCell sdtContentCell, XWPFTableRow xwpfTableRow, IBody part) { super(); + //sdtContentCell is allowed to be null: minOccurs="0" maxOccurs="1" + if (sdtContentCell == null) { + return; + } StringBuilder sb = new StringBuilder(); XmlCursor cursor = sdtContentCell.newCursor(); - + //keep track of the following, //and add "\n" only before the start of a body //element if it is not the first body element. @@ -55,8 +59,8 @@ public class XWPFSDTContentCell implements ISDTContent { //index of cell in row int tcCnt = 0; //count of body objects - int iBodyCnt = 0; - int depth = 1; + int iBodyCnt = 0; + int depth = 1; while (cursor.hasNextToken() && depth > 0) { TokenType t = cursor.toNextToken(); @@ -64,17 +68,17 @@ public class XWPFSDTContentCell implements ISDTContent { sb.append(cursor.getTextValue()); } else if (isStartToken(cursor, "tr")) { tcCnt = 0; - iBodyCnt = 0; - } else if (isStartToken(cursor, "tc")) { - if (tcCnt++ > 0) { - sb.append("\t"); - } - iBodyCnt = 0; - } else if (isStartToken(cursor, "p") || - isStartToken(cursor, "tbl") || - isStartToken(cursor, "sdt")) { - if (iBodyCnt > 0) { - sb.append("\n"); + iBodyCnt = 0; + } else if (isStartToken(cursor, "tc")) { + if (tcCnt++ > 0) { + sb.append("\t"); + } + iBodyCnt = 0; + } else if (isStartToken(cursor, "p") || + isStartToken(cursor, "tbl") || + isStartToken(cursor, "sdt")) { + if (iBodyCnt > 0) { + sb.append("\n"); } iBodyCnt++; } @@ -84,7 +88,7 @@ public class XWPFSDTContentCell implements ISDTContent { depth--; } } - text = sb.toString(); + text = sb.toString(); cursor.dispose(); } @@ -94,11 +98,11 @@ public class XWPFSDTContentCell implements ISDTContent { return false; } QName qName = cursor.getName(); - if (qName != null && qName.getLocalPart() != null && - qName.getLocalPart().equals(string)) { - return true; - } - return false; + if (qName != null && qName.getLocalPart() != null && + qName.getLocalPart().equals(string)) { + return true; + } + return false; }