You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2009/08/12 20:59:34 UTC

svn commit: r803667 - in /poi/trunk/src: documentation/content/xdocs/ examples/src/org/apache/poi/xssf/usermodel/examples/ ooxml/java/org/apache/poi/ ooxml/java/org/apache/poi/openxml4j/opc/ ooxml/java/org/apache/poi/util/ ooxml/java/org/apache/poi/xss...

Author: yegor
Date: Wed Aug 12 18:59:34 2009
New Revision: 803667

URL: http://svn.apache.org/viewvc?rev=803667&view=rev
Log:
Improved parsing of OOXML documents, see Bugzilla 47668

Added:
    poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java   (with props)
    poi/trunk/src/testcases/org/apache/poi/hssf/data/47668.xlsx   (with props)
Modified:
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java
    poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocument.java
    poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
    poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java
    poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
    poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Wed Aug 12 18:59:34 2009
@@ -33,6 +33,7 @@
 
     <changes>
         <release version="3.5-beta7" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="add">47668 - Improved parsing of OOXML documents</action>
            <action dev="POI-DEVELOPERS" type="add">47652 - Added support for reading encrypted workbooks</action>
            <action dev="POI-DEVELOPERS" type="add">47604 - Implementation of an XML to XLSX Importer using Custom XML Mapping</action>
            <action dev="POI-DEVELOPERS" type="fix">47620 - Avoid FormulaParseException in XSSFWorkbook.setRepeatingRowsAndColumns when removing repeated rows and columns</action>

Modified: poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java (original)
+++ poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java Wed Aug 12 18:59:34 2009
@@ -41,8 +41,7 @@
             }
             // Excel Workbook – OpenXML file format
             else if (contentType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) {
-                OPCPackage docPackage = OPCPackage.open(pPart.getInputStream());
-                XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(docPackage);
+                XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(pPart.getInputStream());
             }
             // Word Document – binary (OLE2CDF) file format
             else if (contentType.equals("application/msword")) {
@@ -50,8 +49,7 @@
             }
             // Word Document – OpenXML file format
             else if (contentType.equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document")) {
-                OPCPackage docPackage = OPCPackage.open(pPart.getInputStream());
-                XWPFDocument document = new XWPFDocument(docPackage);
+                XWPFDocument document = new XWPFDocument(pPart.getInputStream());
             }
             // PowerPoint Document – binary file format
             else if (contentType.equals("application/vnd.ms-powerpoint")) {

Modified: poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocument.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocument.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocument.java Wed Aug 12 18:59:34 2009
@@ -17,7 +17,7 @@
 package org.apache.poi;
 
 import java.io.*;
-import java.util.List;
+import java.util.*;
 
 import org.apache.poi.poifs.common.POIFSConstants;
 import org.apache.poi.util.IOUtils;
@@ -191,21 +191,33 @@
         return pkg;
     }
 
+    protected final void load(POIXMLFactory factory) throws IOException {
+    	Map<PackageRelationship, POIXMLDocumentPart> context = new HashMap<PackageRelationship, POIXMLDocumentPart>();
+        try {
+            read(factory, context);
+        } catch (OpenXML4JException e){
+            throw new POIXMLException(e);
+        }
+    	onDocumentRead();
+    	context.clear();
+    }
+
     /**
      * Write out this document to an Outputstream.
      *
-     * @param stream - the java OutputStream you wish to write the XLS to
+     * @param stream - the java OutputStream you wish to write the file to
      *
      * @exception IOException if anything can't be written.
      */
     public final void write(OutputStream stream) throws IOException {
         //force all children to commit their changes into the underlying OOXML Package
-        onSave();
+        Set<PackageRelationship> context = new HashSet<PackageRelationship>();
+        onSave(context);
+        context.clear();
 
         //save extended and custom properties
         getProperties().commit();
 
         getPackage().save(stream);
     }
-
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java Wed Aug 12 18:59:34 2009
@@ -17,8 +17,7 @@
 package org.apache.poi;
 
 import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import java.net.URI;
 
 import org.apache.xmlbeans.XmlOptions;
@@ -75,11 +74,11 @@
 
     /**
      * Creates an POIXMLDocumentPart representing the given package part and relationship.
-     * Called by {@link #read(POIXMLFactory)} when reading in an exisiting file.
+     * Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an exisiting file.
      *
      * @param part - The package part that holds xml data represenring this sheet.
      * @param rel - the relationship of the given package part
-     * @see #read(POIXMLFactory)
+     * @see #read(POIXMLFactory, java.util.Map) 
      */
     public POIXMLDocumentPart(PackagePart part, PackageRelationship rel){
         this.relations = new LinkedList<POIXMLDocumentPart>();
@@ -172,11 +171,14 @@
      * Save changes in the underlying OOXML package.
      * Recursively fires {@link #commit()} for each package part
      */
-    protected final void onSave() throws IOException{
-        commit();
-        for(POIXMLDocumentPart p : relations){
-            p.onSave();
-        }
+    protected final void onSave(Set<PackageRelationship> alreadySaved) throws IOException{
+    	commit();
+    	alreadySaved.add(this.getPackageRelationship());
+    	for(POIXMLDocumentPart p : relations){
+    		if (!alreadySaved.contains(p.getPackageRelationship())) {
+    			p.onSave(alreadySaved);
+    		}
+    	}
     }
 
     /**
@@ -228,10 +230,10 @@
      *
      * @param factory   the factory object that creates POIXMLFactory instances
      */
-    protected final void read(POIXMLFactory factory) throws OpenXML4JException {
-        PackageRelationshipCollection rels = packagePart.getRelationships();
-        for (PackageRelationship rel : rels) {
-            if(rel.getTargetMode() == TargetMode.INTERNAL){
+    protected void read(POIXMLFactory factory, Map<PackageRelationship, POIXMLDocumentPart> context) throws OpenXML4JException {
+    	PackageRelationshipCollection rels = packagePart.getRelationships();
+    	for (PackageRelationship rel : rels) {
+    		if(rel.getTargetMode() == TargetMode.INTERNAL){
                 URI uri = rel.getTargetURI();
 
                 PackagePart p;
@@ -249,16 +251,22 @@
                     }
                 }
 
-                POIXMLDocumentPart childPart = factory.createDocumentPart(rel, p);
-                childPart.parent = this;
-                addRelation(childPart);
-
-                if(p != null && p.hasRelationships()) childPart.read(factory);
-            }
-        }
+                if (!context.containsKey(rel)) {
+    				POIXMLDocumentPart childPart = factory.createDocumentPart(rel, p);
+    				childPart.parent = this;
+    				addRelation(childPart);
+                    if(p != null){
+                        context.put(rel, childPart);
+                        if(p.hasRelationships()) childPart.read(factory, context);
+                    }
+    			}
+    			else {
+    				addRelation(context.get(rel));
+    			}
+    		}
+    	}
     }
 
-
     /**
      * Fired when a new package part is created
      */

Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java Wed Aug 12 18:59:34 2009
@@ -129,8 +129,10 @@
 
 	@Override
 	public int hashCode() {
-		return this.id.hashCode() + this.relationshipType.hashCode()
-				+ this.source.hashCode() + this.targetMode.hashCode()
+		return this.id.hashCode()
+                + this.relationshipType.hashCode()
+				+ (this.source == null ? 0 : this.source.hashCode())
+                + this.targetMode.hashCode()
 				+ this.targetUri.hashCode();
 	}
 

Modified: poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java Wed Aug 12 18:59:34 2009
@@ -19,7 +19,9 @@
 import org.apache.poi.openxml4j.opc.*;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.util.IOUtils;
+import org.apache.poi.POIXMLException;
 
 import java.io.*;
 import java.net.URI;
@@ -41,6 +43,18 @@
         return clone(pkg, createTempFile());
     }
 
+    public static OPCPackage open(InputStream is) throws IOException {
+        File file = TempFile.createTempFile("poi-ooxml-", ".tmp");
+        FileOutputStream out = new FileOutputStream(file);
+        IOUtils.copy(is, out);
+        out.close();
+        try {
+            return OPCPackage.open(file.getAbsolutePath());
+        } catch (InvalidFormatException e){
+            throw new POIXMLException(e);
+        }
+    }
+
     /**
      * Clone the specified package.
      *

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Wed Aug 12 18:59:34 2009
@@ -149,12 +149,14 @@
         super(ensureWriteAccess(pkg));
 
         //build a tree of POIXMLDocumentParts, this workbook being the root
-        try {
-            read(XSSFFactory.getInstance());
-        } catch (OpenXML4JException e){
-            throw new POIXMLException(e);
-        }
-        onDocumentRead();
+        load(XSSFFactory.getInstance());
+    }
+
+    public XSSFWorkbook(InputStream is) throws IOException {
+        super(PackageHelper.open(is));
+
+        //build a tree of POIXMLDocumentParts, this workbook being the root
+        load(XSSFFactory.getInstance());
     }
 
     /**

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java Wed Aug 12 18:59:34 2009
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.InputStream;
 import java.util.*;
 
 import org.apache.poi.POIXMLDocument;
@@ -63,12 +64,14 @@
         super(ensureWriteAccess(pkg));
 
         //build a tree of POIXMLDocumentParts, this document being the root
-        try {
-            read(XWPFFactory.getInstance());
-        } catch (OpenXML4JException e){
-            throw new POIXMLException(e);
-        }
-        onDocumentRead();
+        load(XWPFFactory.getInstance());
+    }
+    
+    public XWPFDocument(InputStream is) throws IOException {
+        super(PackageHelper.open(is));
+
+        //build a tree of POIXMLDocumentParts, this workbook being the root
+        load(XWPFFactory.getInstance());
     }
 
     public XWPFDocument(){

Added: poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java?rev=803667&view=auto
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java (added)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java Wed Aug 12 18:59:34 2009
@@ -0,0 +1,118 @@
+
+/* ====================================================================
+   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;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.FileOutputStream;
+import java.util.List;
+import java.util.ArrayList;
+
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.TempFile;
+import org.apache.poi.xslf.XSLFSlideShow;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
+
+import junit.framework.TestCase;
+
+/**
+ * Test recursive read and write of OPC packages
+ */
+public class TestPOIXMLDocument extends TestCase
+{
+    private static class OPCParser extends POIXMLDocument {
+
+        public OPCParser(OPCPackage pkg) throws IOException {
+            super(pkg);
+        }
+
+        public List<PackagePart> getAllEmbedds() {
+            throw new RuntimeException("not supported");
+        }
+
+        public void parse(POIXMLFactory factory) throws OpenXML4JException, IOException{
+            load(factory);
+        }
+    }
+
+    private static class TestFactory extends POIXMLFactory  {
+
+        public POIXMLDocumentPart createDocumentPart(PackageRelationship rel, PackagePart part){
+            return new POIXMLDocumentPart(part, rel);
+        }
+
+        public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){
+            throw new RuntimeException("not supported");
+        }
+
+    }
+
+    public void assertReadWrite(String path) throws Exception {
+
+        OPCPackage pkg1 = OPCPackage.open(path);
+        OPCParser doc = new OPCParser(pkg1);
+        doc.parse(new TestFactory());
+
+        File tmp = TempFile.createTempFile("poi-ooxml", ".tmp");
+        FileOutputStream out = new FileOutputStream(tmp);
+        doc.write(out);
+        out.close();
+
+        OPCPackage pkg2 = OPCPackage.open(tmp.getAbsolutePath());
+
+        assertEquals(pkg1.getRelationships().size(), pkg2.getRelationships().size());
+
+        ArrayList<PackagePart> l1 = pkg1.getParts();
+        ArrayList<PackagePart> l2 = pkg2.getParts();
+
+        assertEquals(l1.size(), l2.size());
+        for (int i=0; i < l1.size(); i++){
+            PackagePart p1 = l1.get(i);
+            PackagePart p2 = l2.get(i);
+
+            assertEquals(p1.getContentType(), p2.getContentType());
+            assertEquals(p1.hasRelationships(), p2.hasRelationships());
+            if(p1.hasRelationships()){
+                assertEquals(p1.getRelationships().size(), p2.getRelationships().size());
+            }
+            assertEquals(p1.getPartName(), p2.getPartName());
+        }
+    }
+
+    public void testPPTX() throws Exception {
+        File file = new File(System.getProperty("OOXML.testdata.path"), "PPTWithAttachments.pptx");
+        assertReadWrite(file.getAbsolutePath());
+    }
+
+    public void testXLSX() throws Exception {
+        File file = new File(System.getProperty("OOXML.testdata.path"), "ExcelWithAttachments.xlsx");
+        assertReadWrite(file.getAbsolutePath());
+    }
+
+    public void testDOCX() throws Exception {
+        File file = new File(System.getProperty("OOXML.testdata.path"), "WordWithAttachments.docx");
+        assertReadWrite(file.getAbsolutePath());
+    }
+}
\ No newline at end of file

Propchange: poi/trunk/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java Wed Aug 12 18:59:34 2009
@@ -41,10 +41,7 @@
 	public static final XSSFWorkbook openSampleWorkbook(String sampleName) {
 		InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleName);
 		try {
-			OPCPackage pkg = OPCPackage.open(is);
-			return new XSSFWorkbook(pkg);
-		} catch (InvalidFormatException e) {
-			throw new RuntimeException(e);
+			return new XSSFWorkbook(is);
 		} catch (IOException e) {
 			throw new RuntimeException(e);
 		}

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java?rev=803667&r1=803666&r2=803667&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java Wed Aug 12 18:59:34 2009
@@ -20,6 +20,8 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
+import java.util.zip.CRC32;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -29,10 +31,7 @@
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.apache.poi.xssf.model.StylesTable;
-import org.apache.poi.openxml4j.opc.ContentTypes;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.PackagingURIHelper;
+import org.apache.poi.openxml4j.opc.*;
 import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart;
 import org.apache.poi.util.TempFile;
 import org.apache.poi.POIXMLProperties;
@@ -275,7 +274,41 @@
         opcProps = workbook.getProperties().getCoreProperties().getUnderlyingProperties();
         assertEquals("Testing Bugzilla #47460", opcProps.getTitleProperty().getValue());
         assertEquals("poi-dev@poi.apache.org", opcProps.getCreatorProperty().getValue());
+    }
 
+    /**
+     * Verify that the attached test data was not modified. If this test method
+     * fails, the test data is not working properly.
+     */
+    public void test47668() throws Exception {
+        XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("47668.xlsx");
+        List<XSSFPictureData> allPictures = workbook.getAllPictures();
+        assertEquals(2, allPictures.size());
+
+        PackagePartName imagePartName = PackagingURIHelper
+                .createPartName("/xl/media/image1.jpeg");
+        PackagePart imagePart = workbook.getPackage().getPart(imagePartName);
+        assertNotNull(imagePart);
+
+        for (XSSFPictureData pictureData : allPictures) {
+            PackagePart picturePart = pictureData.getPackagePart();
+            assertSame(imagePart, picturePart);
+        }
+
+        XSSFSheet sheet0 = workbook.getSheetAt(0);
+        XSSFDrawing drawing0 = sheet0.createDrawingPatriarch();
+        XSSFPictureData pictureData0 = (XSSFPictureData) drawing0.getRelations().get(0);
+        byte[] data0 = pictureData0.getData();
+        CRC32 crc0 = new CRC32();
+        crc0.update(data0);
+
+        XSSFSheet sheet1 = workbook.getSheetAt(1);
+        XSSFDrawing drawing1 = sheet1.createDrawingPatriarch();
+        XSSFPictureData pictureData1 = (XSSFPictureData) drawing1.getRelations().get(0);
+        byte[] data1 = pictureData1.getData();
+        CRC32 crc1 = new CRC32();
+        crc1.update(data1);
 
+        assertEquals(crc0.getValue(), crc1.getValue());
     }
 }

Added: poi/trunk/src/testcases/org/apache/poi/hssf/data/47668.xlsx
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/data/47668.xlsx?rev=803667&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/47668.xlsx
------------------------------------------------------------------------------
    svn:executable = *

Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/47668.xlsx
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org