--- src/ooxml/java/org/apache/poi/POIXMLDocument.java (revision 802651) +++ src/ooxml/java/org/apache/poi/POIXMLDocument.java (working copy) @@ -17,7 +17,10 @@ package org.apache.poi; import java.io.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.util.IOUtils; @@ -53,6 +56,13 @@ this.pkg = pkg; } + public void load(POIXMLFactory factory) throws IOException, OpenXML4JException { + Map context = new HashMap (); + read(factory, context); + onDocumentRead(); + context.clear(); + } + /** * Wrapper to open a package, returning an IOException * in the event of a problem. @@ -207,5 +217,21 @@ getPackage().save(stream); } + + /** + * Write out this document to an Outputstream. + * + * @param stream - the java OutputStream you wish to write the XLS to + * + * @exception IOException if anything can't be written. + */ + public final void write(OutputStream stream, Set alreadySaved) throws IOException { + //force all children to commit their changes into the underlying OOXML Package + onSave(alreadySaved); + //save extended and custom properties + getProperties().commit(); + + getPackage().save(stream); + } } --- src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java (revision 802651) +++ src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java (working copy) @@ -19,7 +19,8 @@ import java.io.IOException; import java.util.LinkedList; import java.util.List; -import java.net.URI; +import java.util.Map; +import java.util.Set; import org.apache.xmlbeans.XmlOptions; import org.apache.poi.util.POILogger; @@ -180,6 +181,20 @@ } /** + * Save changes in the underlying OOXML package. + * Recursively fires {@link #commit()} for each package part + */ + protected final void onSave(Set alreadySaved) throws IOException{ + commit(); + alreadySaved.add(this.getPackagePart()); + for(POIXMLDocumentPart p : relations){ + if (!alreadySaved.contains(p.getPackagePart())) { + p.onSave(alreadySaved); + } + } + } + + /** * Create a new child POIXMLDocumentPart * * @param descriptor the part descriptor @@ -258,6 +273,29 @@ } } + protected final void read(POIXMLFactory factory, Map context) throws OpenXML4JException { + PackageRelationshipCollection rels = packagePart.getRelationships(); + for (PackageRelationship rel : rels) { + if(rel.getTargetMode() == TargetMode.INTERNAL){ + PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI()); + PackagePart p = packagePart.getPackage().getPart(relName); + if(p == null) { + logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI()); + continue; + } + if (!context.containsKey(p)) { + POIXMLDocumentPart childPart = factory.createDocumentPart(rel, p); + context.put(p, childPart); + childPart.parent = this; + addRelation(childPart); + if(p.hasRelationships()) childPart.read(factory, context); + } + else { + addRelation(context.get(p)); + } + } + } + } /** * Fired when a new package part is created