diff --git a/src/integrationtest/org/apache/poi/TestAllFiles.java b/src/integrationtest/org/apache/poi/TestAllFiles.java index 784b9baa2..0a68579c1 100644 --- a/src/integrationtest/org/apache/poi/TestAllFiles.java +++ b/src/integrationtest/org/apache/poi/TestAllFiles.java @@ -83,7 +83,10 @@ public class TestAllFiles { HANDLERS.put(".docx", new XWPFFileHandler()); HANDLERS.put(".dotx", new XWPFFileHandler()); HANDLERS.put(".docm", new XWPFFileHandler()); - HANDLERS.put(".ooxml", new XWPFFileHandler()); // OPCPackage + + // OpenXML4J files + HANDLERS.put(".ooxml", new OPCFileHandler()); // OPCPackage + HANDLERS.put(".zip", new OPCFileHandler()); // OPCPackage // Powerpoint HANDLERS.put(".ppt", new HSLFFileHandler()); @@ -209,7 +212,6 @@ public class TestAllFiles { // TODO: good to ignore? EXPECTED_FAILURES.add("spreadsheet/sample-beta.xlsx"); EXPECTED_FAILURES.add("spreadsheet/49931.xls"); - EXPECTED_FAILURES.add("openxml4j/ContentTypeHasParameters.ooxml"); // This is actually a spreadsheet! EXPECTED_FAILURES.add("hpsf/TestRobert_Flaherty.doc"); diff --git a/src/integrationtest/org/apache/poi/stress/OPCFileHandler.java b/src/integrationtest/org/apache/poi/stress/OPCFileHandler.java new file mode 100644 index 000000000..60f5e927b --- /dev/null +++ b/src/integrationtest/org/apache/poi/stress/OPCFileHandler.java @@ -0,0 +1,73 @@ +/* ==================================================================== + 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 static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.PushbackInputStream; + +import org.apache.poi.openxml4j.OpenXML4JTestDataSamples; +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.xwpf.usermodel.XWPFRelation; +import org.junit.Test; + +public class OPCFileHandler extends AbstractFileHandler { + @Override + public void handleFile(InputStream stream) throws Exception { + // ignore password protected files + if (POIXMLDocumentHandler.isEncrypted(stream)) return; + + InputStream is = OpenXML4JTestDataSamples.openSampleStream("dcterms_bug_56479.zip"); + OPCPackage p = OPCPackage.open(is); + + for (PackagePart part : p.getParts()) { + if (part.getPartName().toString().equals("/docProps/core.xml")) { + assertEquals(ContentTypes.CORE_PROPERTIES_PART, part.getContentType()); + } + if (part.getPartName().toString().equals("/word/document.xml")) { + assertEquals(XWPFRelation.DOCUMENT.getContentType(), part.getContentType()); + } + if (part.getPartName().toString().equals("/word/theme/theme1.xml")) { + assertEquals(XWPFRelation.THEME.getContentType(), part.getContentType()); + } + } + } + + public void handleExtracting(File file) throws Exception { + // text-extraction is not possible currenlty for these types of files + } + + // a test-case to test this locally without executing the full TestAllFiles + @Test + public void test() throws Exception { + File file = new File("test-data/openxml4j/dcterms_bug_56479.zip"); + + InputStream stream = new PushbackInputStream(new FileInputStream(file), 100000); + try { + handleFile(stream); + } finally { + stream.close(); + } + + handleExtracting(file); + } +} \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java index eb94f680e..0ccbf30e1 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java @@ -279,9 +279,9 @@ public final class PackagePropertiesUnmarshaller implements PartUnmarshaller { + "' must have the 'xsi:type' attribute present !"); // Check for the attribute value => 'dcterms:W3CDTF' - if (!typeAtt.getValue().equals("dcterms:W3CDTF")) + if (!typeAtt.getValue().equals(el.getPrefix() + ":W3CDTF")) throw new InvalidFormatException("The element '" + elName - + "' must have the 'xsi:type' attribute with the value 'dcterms:W3CDTF' !"); + + "' must have the 'xsi:type' attribute with the value '" + el.getPrefix() + ":W3CDTF', but had '" + typeAtt.getValue() + "' !"); } // Check its children diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java new file mode 100644 index 000000000..f8c9afe97 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java @@ -0,0 +1,54 @@ +/* ==================================================================== + 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.openxml4j.opc; + +import static org.junit.Assert.*; + +import java.io.InputStream; + +import org.apache.poi.openxml4j.OpenXML4JTestDataSamples; +import org.apache.poi.xwpf.usermodel.XWPFRelation; +import org.junit.Test; + +public class TestZipPackage { + @Test + public void testBug56479() throws Exception { + InputStream is = OpenXML4JTestDataSamples.openSampleStream("dcterms_bug_56479.zip"); + OPCPackage p = OPCPackage.open(is); + + // Check we found the contents of it + boolean foundCoreProps = false, foundDocument = false, foundTheme1 = false; + for (PackagePart part : p.getParts()) { + if (part.getPartName().toString().equals("/docProps/core.xml")) { + assertEquals(ContentTypes.CORE_PROPERTIES_PART, part.getContentType()); + foundCoreProps = true; + } + if (part.getPartName().toString().equals("/word/document.xml")) { + assertEquals(XWPFRelation.DOCUMENT.getContentType(), part.getContentType()); + foundDocument = true; + } + if (part.getPartName().toString().equals("/word/theme/theme1.xml")) { + assertEquals(XWPFRelation.THEME.getContentType(), part.getContentType()); + foundTheme1 = true; + } + } + assertTrue("Core not found in " + p.getParts(), foundCoreProps); + assertFalse("Document should not be found in " + p.getParts(), foundDocument); + assertFalse("Theme1 should not found in " + p.getParts(), foundTheme1); + } +} diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java index b9517ba2e..b403e90d7 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java @@ -228,7 +228,7 @@ public final class TestOPCComplianceCoreProperties extends TestCase { */ public void testLimitedXSITypeAttribute_PresentWithUnauthorizedValue() { String msg = extractInvalidFormatMessage("LimitedXSITypeAttribute_PresentWithUnauthorizedValueFAIL.docx"); - assertEquals("The element 'modified' must have the 'xsi:type' attribute with the value 'dcterms:W3CDTF' !", msg); + assertEquals("The element 'modified' must have the 'xsi:type' attribute with the value 'dcterms:W3CDTF', but had 'W3CDTF' !", msg); } /** diff --git a/test-data/openxml4j/dcterms_bug_56479.zip b/test-data/openxml4j/dcterms_bug_56479.zip new file mode 100644 index 000000000..bce201972 Binary files /dev/null and b/test-data/openxml4j/dcterms_bug_56479.zip differ