]> source.dussan.org Git - poi.git/commitdiff
Tidying up of some xssfmodel stuff, by doing more work generically in XSSFRelation
authorNick Burch <nick@apache.org>
Tue, 29 Jul 2008 23:37:35 +0000 (23:37 +0000)
committerNick Burch <nick@apache.org>
Tue, 29 Jul 2008 23:37:35 +0000 (23:37 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@680882 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/model/Control.java
src/ooxml/java/org/apache/poi/xssf/model/Drawing.java
src/ooxml/java/org/apache/poi/xssf/model/XSSFChildContainingModel.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

index 55f4872bec270a6e76f9a39bf65849d55b7d7861..0dc55a63fb7947f3af1ab00891eccfeca87c847b 100644 (file)
@@ -12,7 +12,6 @@ import org.apache.xmlbeans.XmlOptions;
 import org.openxml4j.exceptions.InvalidFormatException;
 import org.openxml4j.opc.PackagePart;
 import org.openxml4j.opc.PackagePartName;
-import org.openxml4j.opc.PackageRelationship;
 import org.openxml4j.opc.PackagingURIHelper;
 import org.openxml4j.opc.TargetMode;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTControl;
@@ -62,17 +61,24 @@ public class Control implements XSSFChildContainingModel {
         options.setSavePrettyPrint();
         control.save(out, options);
        }
+
+       /**
+        * We expect active x binary parts
+        */
+       public String[] getChildrenRelationshipTypes() {
+               return new String[] {
+                               XSSFWorkbook.ACTIVEX_BINS.getRelation()
+               };
+       }
        
        /**
-        * Finds our XSSFActiveXData children
+        * Generates and adds XSSFActiveXData children
         */
-       public void findChildren(PackagePart modelPart) throws IOException, InvalidFormatException {
-               for(PackageRelationship rel : modelPart.getRelationshipsByType(XSSFWorkbook.ACTIVEX_BINS.getRelation())) {
-                       PackagePart binPart = XSSFWorkbook.getTargetPart(modelPart.getPackage(), rel);
-                       XSSFActiveXData actX = new XSSFActiveXData(binPart, rel.getId());
-                       activexBins.add(actX);
-               }
+       public void generateChild(PackagePart childPart, String childRelId) {
+               XSSFActiveXData actX = new XSSFActiveXData(childPart, childRelId);
+               activexBins.add(actX);
        }
+
        /**
         * Writes back out our XSSFPictureData children
         */
index 41123e00052b19d62f3f7ddbd67c4be63010e6d9..df4ed853eec97e569d6c03bae3d386e861a30148 100644 (file)
@@ -12,7 +12,6 @@ import org.apache.xmlbeans.XmlOptions;
 import org.openxml4j.exceptions.InvalidFormatException;
 import org.openxml4j.opc.PackagePart;
 import org.openxml4j.opc.PackagePartName;
-import org.openxml4j.opc.PackageRelationship;
 import org.openxml4j.opc.PackagingURIHelper;
 import org.openxml4j.opc.TargetMode;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDrawing;
@@ -66,15 +65,22 @@ public class Drawing implements XSSFChildContainingModel {
        }
        
        /**
-        * Finds our XSSFPictureData children
+        * We expect image parts
         */
-       public void findChildren(PackagePart modelPart) throws IOException, InvalidFormatException {
-               for(PackageRelationship rel : modelPart.getRelationshipsByType(XSSFWorkbook.IMAGES.getRelation())) {
-                       PackagePart imagePart = XSSFWorkbook.getTargetPart(modelPart.getPackage(), rel);
-                       XSSFPictureData pd = new XSSFPictureData(imagePart, rel.getId());
-                       pictures.add(pd);
-               }
+       public String[] getChildrenRelationshipTypes() {
+               return new String[] {
+                               XSSFWorkbook.IMAGES.getRelation()
+               };
+       }
+       
+       /**
+        * Generates and adds XSSFActiveXData children
+        */
+       public void generateChild(PackagePart childPart, String childRelId) {
+               XSSFPictureData pd = new XSSFPictureData(childPart, childRelId);
+               pictures.add(pd);
        }
+
        /**
         * Writes back out our XSSFPictureData children
         */
index eedfcc0869d2d71f779c81c50b1eca1727705eef..d50a8eba05e810d9a18acfbdc8685ce1589fb7e3 100644 (file)
@@ -28,11 +28,20 @@ import org.openxml4j.opc.PackagePart;
  *  raw images associated with it. 
  */
 public interface XSSFChildContainingModel extends XSSFModel {
-       /** 
-        * Find any children associated with the {@link XSSFModel}.
-        * @param modelPart The PackagePart of this model 
+       /**
+        * Returns the relationship type of any children we
+        *  expect
+        */
+       public String[] getChildrenRelationshipTypes();
+       /**
+        * Called for each matching child, so that the 
+        *  appropriate model or usermodel thing can be 
+        *  created for it.
+        * @param childPart The PackagePart of the child
+        * @param childId the ID of the relationship the child comes from
         */
-       public void findChildren(PackagePart modelPart) throws IOException, InvalidFormatException;
+       public void generateChild(PackagePart childPart, String childRelId);
+       
        /** 
         * Writes out any children associated with the {@link XSSFModel},
         *  along with the required relationship stuff.
index 9aea48a0f3d181550d9e028fbdec14b31ee660d3..cb953dfbe1618d0212f380ee3d567cc95e211e74 100644 (file)
@@ -51,6 +51,7 @@ import org.apache.poi.xssf.model.Control;
 import org.apache.poi.xssf.model.Drawing;
 import org.apache.poi.xssf.model.SharedStringsTable;
 import org.apache.poi.xssf.model.StylesTable;
+import org.apache.poi.xssf.model.XSSFChildContainingModel;
 import org.apache.poi.xssf.model.XSSFModel;
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
@@ -235,6 +236,20 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
                return null;
             }
                }
+               
+               /**
+                * Finds all the XSSFModels of this type which are
+                *  defined as relationships of the given parent part
+                */
+               public ArrayList<? extends XSSFModel> findAll(PackagePart parentPart) throws Exception {
+                       ArrayList<XSSFModel> found = new ArrayList<XSSFModel>();
+                       for(PackageRelationship rel : parentPart.getRelationshipsByType(REL)) {
+                               PackagePart part = getTargetPart(parentPart.getPackage(), rel);
+                               found.add(load(part));
+                       }
+                       return found;
+               }
+               
                /**
                 * Load, off the specified core part
                 */
@@ -250,6 +265,19 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
                        inp.close();
                 }
             }
+                       
+                       // Do children, if required
+                       if(model instanceof XSSFChildContainingModel) {
+                               XSSFChildContainingModel ccm = 
+                                       (XSSFChildContainingModel)model;
+                               for(String relType : ccm.getChildrenRelationshipTypes()) {
+                                       for(PackageRelationship rel : corePart.getRelationshipsByType(relType)) {
+                                               PackagePart childPart = getTargetPart(corePart.getPackage(), rel);
+                                               ccm.generateChild(childPart, rel.getId());
+                                       }
+                               }
+                       }
+                       
             return model;
                }
                
@@ -347,32 +375,24 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
                     continue;
                 }
                 
-                // Get the comments for the sheet, if there are any
+                // Load child streams of the sheet
+                ArrayList<? extends XSSFModel> childModels;
                 CommentsSource comments = null;
-                PackageRelationshipCollection commentsRel =
-                       part.getRelationshipsByType(SHEET_COMMENTS.REL);
-                if(commentsRel != null && commentsRel.size() > 0) {
-                       PackagePart commentsPart = 
-                               getTargetPart(commentsRel.getRelationship(0));
-                       comments = new CommentsTable(commentsPart.getInputStream());
-                }
-                
-                // Get the drawings for the sheet, if there are any
-                ArrayList<Drawing> drawings = new ArrayList<Drawing>();
-                for(PackageRelationship rel : part.getRelationshipsByType(VML_DRAWINGS.REL)) {
-                       PackagePart drawingPart = getTargetPart(rel);
-                       Drawing drawing = new Drawing(drawingPart.getInputStream(), rel.getId());
-                       drawing.findChildren(drawingPart);
-                       drawings.add(drawing);
-                }
-                
-                // Get the activeX controls for the sheet, if there are any
-                ArrayList<Control> controls = new ArrayList<Control>();
-                for(PackageRelationship rel : part.getRelationshipsByType(ACTIVEX_CONTROLS.REL)) {
-                       PackagePart controlPart = getTargetPart(rel);
-                       Control control = new Control(controlPart.getInputStream(), rel.getId());
-                       control.findChildren(controlPart);
-                       controls.add(control);
+                ArrayList<Drawing> drawings;
+                ArrayList<Control> controls;
+                try {
+                       // Get the comments for the sheet, if there are any
+                       childModels = SHEET_COMMENTS.findAll(part);
+                       if(childModels.size() > 0) {
+                               comments = (CommentsSource)childModels.get(0);
+                       }
+                       
+                       // Get the drawings for the sheet, if there are any
+                       drawings = (ArrayList<Drawing>)VML_DRAWINGS.findAll(part);
+                       // Get the activeX controls for the sheet, if there are any
+                       controls = (ArrayList<Control>)ACTIVEX_CONTROLS.findAll(part);
+                } catch(Exception e) {
+                       throw new RuntimeException("Unable to construct child part",e);
                 }
                 
                 // Now create the sheet
index 703133f425e0d40c1c7d8a0e841a99b7751bec3f..9eb0da6b4a1274593f5665eda459edcd0a29ee6f 100644 (file)
@@ -93,23 +93,40 @@ public class TestXSSFBugs extends TestCase {
                                PackagingURIHelper.createPartName("/xl/vbaProject.bin")
                );
                assertNotNull(vba);
+               // And the drawing bit
+               PackagePart drw = pkg.getPart(
+                               PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
+               );
+               assertNotNull(drw);
+               
                
-               // Save and re-open, is still there
+               // Save and re-open, both still there
                Package nPkg = saveAndOpen(wb);
                XSSFWorkbook nwb = new XSSFWorkbook(nPkg);
                assertTrue(nwb.isMacroEnabled());
+               
                vba = nPkg.getPart(
                                PackagingURIHelper.createPartName("/xl/vbaProject.bin")
                );
                assertNotNull(vba);
+               drw = nPkg.getPart(
+                               PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
+               );
+               assertNotNull(drw);
                
                // And again, just to be sure
                nPkg = saveAndOpen(nwb);
                nwb = new XSSFWorkbook(nPkg);
+               assertTrue(nwb.isMacroEnabled());
+               
                vba = nPkg.getPart(
                                PackagingURIHelper.createPartName("/xl/vbaProject.bin")
                );
                assertNotNull(vba);
+               drw = nPkg.getPart(
+                               PackagingURIHelper.createPartName("/xl/drawings/vmlDrawing1.vml")
+               );
+               assertNotNull(drw);
                
                FileOutputStream fout = new FileOutputStream("/tmp/foo.xlsm");
                nwb.write(fout);