From ccc4ebcf70455834dffb267d6ea20bf6eae0bb9a Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Tue, 11 Aug 2015 05:37:15 +0000 Subject: [PATCH] Bug 56479: don't hardcode dcterms as namespace alias in the attribute, but expect the actual alias that is used in the corresponding element. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1695212 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/TestAllFiles.java | 6 +- .../org/apache/poi/stress/OPCFileHandler.java | 73 ++++++++++++++++++ .../PackagePropertiesUnmarshaller.java | 4 +- .../poi/openxml4j/opc/TestZipPackage.java | 54 +++++++++++++ .../TestOPCComplianceCoreProperties.java | 2 +- test-data/openxml4j/dcterms_bug_56479.zip | Bin 0 -> 1277 bytes 6 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 src/integrationtest/org/apache/poi/stress/OPCFileHandler.java create mode 100644 src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestZipPackage.java create mode 100644 test-data/openxml4j/dcterms_bug_56479.zip diff --git a/src/integrationtest/org/apache/poi/TestAllFiles.java b/src/integrationtest/org/apache/poi/TestAllFiles.java index 784b9baa2e..0a68579c16 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 0000000000..60f5e927b3 --- /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 eb94f680e6..0ccbf30e1c 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 0000000000..f8c9afe974 --- /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 b9517ba2ef..b403e90d78 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 0000000000000000000000000000000000000000..bce20197273cda028084a2afa0832c36328e4d00 GIT binary patch literal 1277 zcmWIWW@Zs#U}9ikxHe^>3y^{XHXtj$C^e^8KLDzRgCQ?ao}As&;K}E zVN?4?dXM+ztxp=v|28OCPTTU#^1qC>$$D4C<>K31l5|x=` z`XDLneW!`urp@1$dX+uhx@GR!<7UB6e;nI`k<=@l?S4tVeV=R_8@Gm_XTpY4F zROI2ITrqBsl}Fz14JvVeZ@I2E>}Ndpt)mtjKk|PKsBb>`ySL=)w=1=bFfU>T11Hdn zDf!6(MfnBDA@O4ALKlaHOh)0rP?!!3K0#z<$@xX8dKI}jxswj&H5>4>y|;0lV$H%e z%Zla8hLyW>E-fj$wJz|{#T644sEGXf#(m*Z*kh-Z|NHmfICyi}dhHUX+?Gj}eN6(& z6MPC4Ps`N5-TqHXIeF!iEkQy>I-+i~51pQI>BGuU=386_Cjyt8{CMz|n(C1a%vY|k z_)YWs8M*|FiPWh4e==ejssO6q>j-8j>DH^Njygb1gNtypq(slK7Cyg4E(zP&~|?usiRt0gr2Wed~d(8=jVFbR8;dvpZ(y{EM;W z%nhd$uL(C4{{FsHxU5gMv$#}mWnOt?lVz};T@n9xU+%UWM=yT9a`^hgy>(2%ER{zD zW>!7mNHY()`%pd5@Yf7){>>g$+qUhPDW>D=bHuC9P+!C9*-5n$^*JZ(w!B?jIrcw zmWI1gc3&^OasL(G+dcEul&NVSOSEq#Pveidl63sVH?Qv4=CfYcubqqApS7Y6n06VN zL>O>qVqlm6fdPbqXK9!o?3o&*n2|vNNU8uaq!<8aaeS76vI+!%EMo`82U5mC*oQ6a sfV4sE(?iw<%SZ@YvBx<=`xanc#F7F6yjelz83QX2ssL>`%nafI0K_WeBme*a literal 0 HcmV?d00001 -- 2.39.5