Fix bug #52449 - Support writing XWPF documents with glossaries (plus fix some indenting)

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1230045 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2012-01-11 14:02:40 +00:00
parent ee24b94d80
commit 57c4509faa
7 changed files with 75 additions and 37 deletions

View File

@ -34,6 +34,7 @@
<changes> <changes>
<release version="3.8-beta6" date="2012-??-??"> <release version="3.8-beta6" date="2012-??-??">
<action dev="poi-developers" type="fix">52449 - Support writing XWPF documents with glossaries (Glossaries are not yet supported, but can now be written out again without changes)</action>
<action dev="poi-developers" type="fix">52446 - Handle files which have been truncated by a few bytes in NPropertyTable</action> <action dev="poi-developers" type="fix">52446 - Handle files which have been truncated by a few bytes in NPropertyTable</action>
<action dev="poi-developers" type="fix">52438 - Update CellDateFormatter to handle times without seconds</action> <action dev="poi-developers" type="fix">52438 - Update CellDateFormatter to handle times without seconds</action>
<action dev="poi-developers" type="add">52389 - Support ?/? as well as #/# fractions, and tighten DataFormatter rules for fraction matching</action> <action dev="poi-developers" type="add">52389 - Support ?/? as well as #/# fractions, and tighten DataFormatter rules for fraction matching</action>

View File

@ -20,6 +20,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -188,6 +189,20 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
picData.onDocumentRead(); picData.onDocumentRead();
registerPackagePictureData(picData); registerPackagePictureData(picData);
pictures.add(picData); pictures.add(picData);
} else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) {
// We don't currently process the glossary itself
// Until we do, we do need to load the glossary child parts of it
for (POIXMLDocumentPart gp : p.getRelations()) {
// Trigger the onDocumentRead for all the child parts
// Otherwise we'll hit issues on Styles, Settings etc on save
try {
Method onDocumentRead = gp.getClass().getDeclaredMethod("onDocumentRead");
onDocumentRead.setAccessible(true);
onDocumentRead.invoke(gp);
} catch(Exception e) {
throw new POIXMLException(e);
}
}
} }
} }
initHyperlinks(); initHyperlinks();

View File

@ -58,6 +58,12 @@ public final class XWPFRelation extends POIXMLRelation {
"/word/document.xml", "/word/document.xml",
null null
); );
public static final XWPFRelation GLOSSARY_DOCUMENT = new XWPFRelation(
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml",
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument",
"/word/glossary/document.xml",
null
);
public static final XWPFRelation NUMBERING = new XWPFRelation( public static final XWPFRelation NUMBERING = new XWPFRelation(
"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml", "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml",

View File

@ -149,6 +149,9 @@ public class XWPFSettings extends POIXMLDocumentPart {
@Override @Override
protected void commit() throws IOException { protected void commit() throws IOException {
if (ctSettings == null) {
throw new IllegalStateException("Unable to write out settings that were never read in!");
}
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTSettings.type.getName().getNamespaceURI(), "settings")); xmlOptions.setSaveSyntheticDocumentElement(new QName(CTSettings.type.getName().getNamespaceURI(), "settings"));

View File

@ -70,41 +70,44 @@ public class XWPFStyles extends POIXMLDocumentPart{
public XWPFStyles() { public XWPFStyles() {
} }
/** /**
* Read document * Read document
*/ */
@Override @Override
protected void onDocumentRead ()throws IOException{ protected void onDocumentRead() throws IOException{
StylesDocument stylesDoc; StylesDocument stylesDoc;
try { try {
InputStream is = getPackagePart().getInputStream(); InputStream is = getPackagePart().getInputStream();
stylesDoc = StylesDocument.Factory.parse(is); stylesDoc = StylesDocument.Factory.parse(is);
ctStyles = stylesDoc.getStyles(); ctStyles = stylesDoc.getStyles();
latentStyles = new XWPFLatentStyles(ctStyles.getLatentStyles(), this); latentStyles = new XWPFLatentStyles(ctStyles.getLatentStyles(), this);
} catch (XmlException e) {
} catch (XmlException e) { throw new POIXMLException("Unable to read styles", e);
throw new POIXMLException(); }
}
//get any Style // Build up all the style objects
for(CTStyle style : ctStyles.getStyleList()) { for(CTStyle style : ctStyles.getStyleList()) {
listStyle.add(new XWPFStyle(style, this)); listStyle.add(new XWPFStyle(style, this));
} }
} }
@Override @Override
protected void commit() throws IOException { protected void commit() throws IOException {
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); if (ctStyles == null) {
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTStyles.type.getName().getNamespaceURI(), "styles")); throw new IllegalStateException("Unable to write out styles that were never read in!");
Map<String,String> map = new HashMap<String,String>(); }
map.put("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r");
map.put("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w"); XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
xmlOptions.setSaveSuggestedPrefixes(map); xmlOptions.setSaveSyntheticDocumentElement(new QName(CTStyles.type.getName().getNamespaceURI(), "styles"));
PackagePart part = getPackagePart(); Map<String,String> map = new HashMap<String,String>();
OutputStream out = part.getOutputStream(); map.put("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r");
ctStyles.save(out, xmlOptions); map.put("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w");
out.close(); xmlOptions.setSaveSuggestedPrefixes(map);
} PackagePart part = getPackagePart();
OutputStream out = part.getOutputStream();
ctStyles.save(out, xmlOptions);
out.close();
}
/** /**
* Sets the ctStyles * Sets the ctStyles

View File

@ -68,8 +68,18 @@ public class TestXWPFStyles extends TestCase {
assertTrue(styles.styleExist(strStyleName)); assertTrue(styles.styleExist(strStyleName));
} }
// protected void tearDown() throws Exception { /**
// super.tearDown(); * Bug #52449 - We should be able to write a file containing
// } * both regular and glossary styles without error
*/
public void test52449() throws Exception {
XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("52449.docx");
XWPFStyles styles = doc.getStyles();
assertNotNull(styles);
XWPFDocument docIn = XWPFTestDataSamples.writeOutAndReadBack(doc);
styles = docIn.getStyles();
assertNotNull(styles);
}
} }

Binary file not shown.