]> source.dussan.org Git - poi.git/commitdiff
Bug 57484: Allow processing of non-OOXML core namespace packages
authorDominik Stadler <centic@apache.org>
Sun, 19 Jul 2015 12:11:19 +0000 (12:11 +0000)
committerDominik Stadler <centic@apache.org>
Sun, 19 Jul 2015 12:11:19 +0000 (12:11 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1691821 13f79535-47bb-0310-9956-ffa450edef68

src/integrationtest/org/apache/poi/TestAllFiles.java
src/integrationtest/org/apache/poi/stress/POIXMLDocumentHandler.java
src/integrationtest/org/apache/poi/stress/XDGFFileHandler.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/POIXMLDocument.java
src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java

index 85b0580841444b5a0f9e6c0670b469297e945a57..784b9baa2ea50386643f42420e8513c681f1d500 100644 (file)
@@ -103,12 +103,12 @@ public class TestAllFiles {
         HANDLERS.put(".vsd", new HDGFFileHandler());
         
         // Visio - ooxml (currently unsupported)
-        HANDLERS.put(".vsdm", new NullFileHandler());
-        HANDLERS.put(".vsdx", new NullFileHandler());
-        HANDLERS.put(".vssm", new NullFileHandler());
-        HANDLERS.put(".vssx", new NullFileHandler());
-        HANDLERS.put(".vstm", new NullFileHandler());
-        HANDLERS.put(".vstx", new NullFileHandler());
+        HANDLERS.put(".vsdm", new XDGFFileHandler());
+        HANDLERS.put(".vsdx", new XDGFFileHandler());
+        HANDLERS.put(".vssm", new XDGFFileHandler());
+        HANDLERS.put(".vssx", new XDGFFileHandler());
+        HANDLERS.put(".vstm", new XDGFFileHandler());
+        HANDLERS.put(".vstx", new XDGFFileHandler());
 
         // POIFS
         HANDLERS.put(".ole2", new POIFSFileHandler());
index 7b0821dcc0eb3e36486199574d693368bc93cc8a..1a8cbf6a03e49e58fcb802f8b498805e32b9d84c 100644 (file)
@@ -20,17 +20,10 @@ import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.List;
 
 import org.apache.poi.POIXMLDocument;
-import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.openxml4j.opc.PackageAccess;
-import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.poifs.crypt.Decryptor;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.junit.Ignore;
-import org.junit.Test;
 
 public final class POIXMLDocumentHandler {
        protected void handlePOIXMLDocument(POIXMLDocument doc) throws Exception {
@@ -44,33 +37,15 @@ public final class POIXMLDocumentHandler {
     protected static boolean isEncrypted(InputStream stream) throws IOException {
         if (POIFSFileSystem.hasPOIFSHeader(stream)) {
             POIFSFileSystem poifs = new POIFSFileSystem(stream);
-            if (poifs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
-                return true;
+            try {
+                if (poifs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
+                    return true;
+                }
+            } finally {
+                poifs.close();
             }
             throw new IOException("wrong file format or file extension for OO XML file");
         }
         return false;
     }
-       
-       // a test-case to test this locally without executing the full TestAllFiles
-    @Ignore("POIXMLDocument cannot handle this Visio file currently...")
-       @Test
-       public void test() throws Exception {
-               OPCPackage pkg = OPCPackage.open("test-data/diagram/test.vsdx", PackageAccess.READ);
-               try {
-                       handlePOIXMLDocument(new TestPOIXMLDocument(pkg));
-               } finally {
-                       pkg.close();
-               }
-       }
-       
-       private final static class TestPOIXMLDocument extends POIXMLDocument {
-               public TestPOIXMLDocument(OPCPackage pkg) {
-                       super(pkg);
-               }
-
-               public List<PackagePart> getAllEmbedds() throws OpenXML4JException {
-                       return null;
-               }
-       }
 }
diff --git a/src/integrationtest/org/apache/poi/stress/XDGFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XDGFFileHandler.java
new file mode 100644 (file)
index 0000000..3095cea
--- /dev/null
@@ -0,0 +1,77 @@
+/* ====================================================================
+   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.stress;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.POIXMLDocument;
+import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackageAccess;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.util.PackageHelper;
+import org.junit.Test;
+
+public class XDGFFileHandler extends AbstractFileHandler {
+    @Override
+    public void handleFile(InputStream stream) throws Exception {
+        // ignore password protected files
+        if (POIXMLDocumentHandler.isEncrypted(stream)) return;
+
+        TestXDGFXMLDocument doc = new TestXDGFXMLDocument(stream);
+        new POIXMLDocumentHandler().handlePOIXMLDocument(doc);
+    }
+
+    @Override
+    public void handleExtracting(File file) throws Exception {
+        // TODO: extraction/actual operations not supported yet
+    }
+
+    // a test-case to test this locally without executing the full TestAllFiles
+    @Test
+    public void test() throws Exception {
+        OPCPackage pkg = OPCPackage.open("test-data/diagram/test.vsdx", PackageAccess.READ);
+        try {
+            TestXDGFXMLDocument doc = new TestXDGFXMLDocument(pkg);
+            new POIXMLDocumentHandler().handlePOIXMLDocument(doc);
+        } finally {
+            pkg.close();
+        }
+    }
+
+    // TODO: Get rid of this when full visio ooxml support is added
+    private final static class TestXDGFXMLDocument extends POIXMLDocument {
+
+        public static String CORE_DOCUMENT = "http://schemas.microsoft.com/visio/2010/relationships/document";
+
+        public TestXDGFXMLDocument(OPCPackage pkg) {
+            super(pkg, CORE_DOCUMENT);
+        }
+
+        public TestXDGFXMLDocument(InputStream is) throws IOException {
+            this(PackageHelper.open(is));
+        }
+
+        public List<PackagePart> getAllEmbedds() throws OpenXML4JException {
+            return new ArrayList<PackagePart>();
+        }
+    }
+}
\ No newline at end of file
index 0e18ee1121e9bf8a0493d215df4c043cafe1ff42..0352d5c8741290c0ad528c75ea1f1966091d8192 100644 (file)
@@ -57,6 +57,15 @@ public abstract class POIXMLDocument extends POIXMLDocumentPart implements Close
 
     protected POIXMLDocument(OPCPackage pkg) {
         super(pkg);
+        init(pkg);
+    }
+    
+    protected POIXMLDocument(OPCPackage pkg, String coreDocumentRel) {
+        super(pkg, coreDocumentRel);
+        init(pkg);
+    }
+    
+    private void init(OPCPackage pkg) {
         this.pkg = pkg;
         
         // Workaround for XMLBEANS-512 - ensure that when we parse
index f051eb32af5997e5d04d103deeb71507f4018bae..857f0dad23c29c81a7373bf903f7114ff36c16b0 100644 (file)
@@ -63,7 +63,7 @@ public class POIXMLDocumentPart {
         DEFAULT_XML_OPTIONS.setCharacterEncoding("UTF-8");
     }
 
-
+    private String coreDocumentRel = PackageRelationshipTypes.CORE_DOCUMENT;
     private PackagePart packagePart;
     private PackageRelationship packageRel;
     private POIXMLDocumentPart parent;
@@ -93,7 +93,16 @@ public class POIXMLDocumentPart {
      * Construct POIXMLDocumentPart representing a "core document" package part.
      */
     public POIXMLDocumentPart(OPCPackage pkg) {
-        PackageRelationship coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT).getRelationship(0);
+        this(pkg, PackageRelationshipTypes.CORE_DOCUMENT);
+    }
+    
+    /**
+     * Construct POIXMLDocumentPart representing a custom "core document" package part.
+     */
+    public POIXMLDocumentPart(OPCPackage pkg, String coreDocumentRel) {
+        this.coreDocumentRel = coreDocumentRel;
+        PackageRelationship coreRel = pkg.getRelationshipsByType(this.coreDocumentRel).getRelationship(0);
+
         if (coreRel == null) {
             coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
             if (coreRel != null) {
@@ -151,10 +160,10 @@ public class POIXMLDocumentPart {
      */
     protected final void rebase(OPCPackage pkg) throws InvalidFormatException {
         PackageRelationshipCollection cores =
-            packagePart.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
+            packagePart.getRelationshipsByType(coreDocumentRel);
         if(cores.size() != 1) {
             throw new IllegalStateException(
-                "Tried to rebase using " + PackageRelationshipTypes.CORE_DOCUMENT +
+                "Tried to rebase using " + coreDocumentRel +
                 " but found " + cores.size() + " parts of the right type"
             );
         }
index 55f4093fb6dedd8f54ad89d3420f21d18ae658eb..2c41b18f73ef080e46c8e8b42cdda8b464b6576e 100644 (file)
@@ -31,6 +31,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 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.opc.PackageRelationshipTypes;
 import org.apache.poi.util.PackageHelper;
 import org.apache.poi.util.TempFile;
 
@@ -44,6 +45,10 @@ public final class TestPOIXMLDocument extends TestCase {
         public OPCParser(OPCPackage pkg) {
             super(pkg);
         }
+        
+        public OPCParser(OPCPackage pkg, String coreDocumentRel) {
+            super(pkg, coreDocumentRel);
+        }
 
         @Override
         public List<PackagePart> getAllEmbedds() {
@@ -181,4 +186,33 @@ public final class TestPOIXMLDocument extends TestCase {
         part.onDocumentCreate();
         //part.getTargetPart(null);
     }
+    
+    public void testVSDX() throws Exception {
+        OPCPackage open = PackageHelper.open(POIDataSamples.getDiagramInstance().openResourceAsStream("test.vsdx"));
+        
+        POIXMLDocument part = new OPCParser(open, PackageRelationshipTypes.VISIO_CORE_DOCUMENT);
+        
+        assertNotNull(part);
+        assertEquals(0, part.getRelationCounter());
+    }
+    
+    public void testVSDXPart() throws Exception {
+        OPCPackage open = PackageHelper.open(POIDataSamples.getDiagramInstance().openResourceAsStream("test.vsdx"));
+        
+        POIXMLDocumentPart part = new POIXMLDocumentPart(open, PackageRelationshipTypes.VISIO_CORE_DOCUMENT);
+        
+        assertNotNull(part);
+        assertEquals(0, part.getRelationCounter());
+    }
+    
+    public void testInvalidCoreRel() throws Exception {
+        OPCPackage open = PackageHelper.open(POIDataSamples.getDiagramInstance().openResourceAsStream("test.vsdx"));
+        
+        try {
+            new POIXMLDocumentPart(open, "somethingillegal");
+            fail("Unknown core ref will throw exception");
+        } catch (POIXMLException e) {
+            // expected here
+        }
+    }
 }