| /* ==================================================================== |
| 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.compliance; |
| |
| import static org.junit.jupiter.api.Assertions.assertEquals; |
| import static org.junit.jupiter.api.Assertions.assertThrows; |
| import static org.junit.jupiter.api.Assertions.assertTrue; |
| |
| import java.io.File; |
| import java.io.IOException; |
| |
| import org.apache.poi.POIDataSamples; |
| import org.apache.poi.openxml4j.exceptions.InvalidFormatException; |
| import org.apache.poi.openxml4j.exceptions.InvalidOperationException; |
| import org.apache.poi.openxml4j.exceptions.PartAlreadyExistsException; |
| import org.apache.poi.openxml4j.opc.ContentTypes; |
| import org.apache.poi.openxml4j.opc.OPCPackage; |
| import org.apache.poi.openxml4j.opc.PackagePartName; |
| import org.apache.poi.openxml4j.opc.PackageRelationshipTypes; |
| import org.apache.poi.openxml4j.opc.PackagingURIHelper; |
| import org.apache.poi.openxml4j.opc.TargetMode; |
| import org.apache.poi.util.TempFile; |
| import org.junit.jupiter.api.BeforeAll; |
| import org.junit.jupiter.api.BeforeEach; |
| import org.junit.jupiter.api.Test; |
| |
| /** |
| * Test Open Packaging Convention package model compliance. |
| * |
| * M1.11 : A package implementer shall neither create nor recognize a part with |
| * a part name derived from another part name by appending segments to it. |
| */ |
| class TestOPCCompliancePackageModel { |
| |
| private static File TESTFILE; |
| |
| @BeforeAll |
| public static void setup() throws IOException { |
| TESTFILE = TempFile.createTempFile("TODELETEIFEXIST", ".docx"); |
| } |
| |
| @BeforeEach |
| void tearDown() { |
| if (TESTFILE.exists()) { |
| assertTrue(TESTFILE.delete()); |
| } |
| } |
| |
| /** |
| * A package implementer shall neither create nor recognize a part with a |
| * part name derived from another part name by appending segments to it. |
| * [M1.11] |
| */ |
| @Test |
| void testPartNameDerivationAdditionFailure() throws InvalidFormatException, IOException { |
| try (OPCPackage pkg = OPCPackage.create(TESTFILE)) { |
| PackagePartName name = PackagingURIHelper.createPartName("/word/document.xml"); |
| PackagePartName nameDerived = PackagingURIHelper.createPartName("/word/document.xml/image1.gif"); |
| pkg.createPart(name, ContentTypes.XML); |
| |
| assertThrows(InvalidOperationException.class, () -> pkg.createPart(nameDerived, ContentTypes.EXTENSION_GIF), |
| "A package implementer shall neither create nor recognize a part with a part name derived from another " + |
| "part name by appending segments to it. [M1.11]"); |
| pkg.revert(); |
| } |
| } |
| |
| /** |
| * A package implementer shall neither create nor recognize a part with a |
| * part name derived from another part name by appending segments to it. |
| * [M1.11] |
| */ |
| @Test |
| void testPartNameDerivationReadingFailure() { |
| String filename = "OPCCompliance_DerivedPartNameFAIL.docx"; |
| assertThrows(InvalidFormatException.class, () -> |
| OPCPackage.open(POIDataSamples.getOpenXML4JInstance().openResourceAsStream(filename)), |
| "A package implementer shall neither create nor recognize a part with a part name derived from another" + |
| " part name by appending segments to it. [M1.11]" |
| ); |
| } |
| |
| /** |
| * Rule M1.12 : Packages shall not contain equivalent part names and package |
| * implementers shall neither create nor recognize packages with equivalent |
| * part names. |
| */ |
| @Test |
| void testAddPackageAlreadyAddFailure() throws Exception { |
| try (OPCPackage pkg = OPCPackage.create(TESTFILE)) { |
| PackagePartName name1 = PackagingURIHelper.createPartName("/word/document.xml"); |
| PackagePartName name2 = PackagingURIHelper.createPartName("/word/document.xml"); |
| |
| pkg.createPart(name1, ContentTypes.XML); |
| assertThrows(PartAlreadyExistsException.class, () -> pkg.createPart(name2, ContentTypes.XML), |
| "Packages shall not contain equivalent part names and package implementers shall neither create nor " + |
| "recognize packages with equivalent part names. [M1.12]" |
| ); |
| pkg.revert(); |
| } |
| } |
| |
| /** |
| * Rule M1.12 : Packages shall not contain equivalent part names and package |
| * implementers shall neither create nor recognize packages with equivalent |
| * part names. |
| */ |
| @Test |
| void testAddPackageAlreadyAddFailure2() throws Exception { |
| try (OPCPackage pkg = OPCPackage.create(TESTFILE)) { |
| PackagePartName partName = PackagingURIHelper.createPartName("/word/document.xml"); |
| pkg.createPart(partName, ContentTypes.XML); |
| assertThrows(InvalidOperationException.class, () -> pkg.createPart(partName, ContentTypes.XML), |
| "Packages shall not contain equivalent part names and package implementers shall neither create nor " + |
| "recognize packages with equivalent part names. [M1.12]" |
| ); |
| pkg.revert(); |
| } |
| } |
| |
| /** |
| * Try to add a relationship to a relationship part. |
| * <p> |
| * Check rule M1.25: The Relationships part shall not have relationships to |
| * any other part. Package implementers shall enforce this requirement upon |
| * the attempt to create such a relationship and shall treat any such |
| * relationship as invalid. |
| */ |
| @Test |
| void testAddRelationshipRelationshipsPartFailure() throws IOException, InvalidFormatException { |
| try (OPCPackage pkg = OPCPackage.create(TESTFILE)) { |
| PackagePartName name1 = PackagingURIHelper.createPartName("/test/_rels/document.xml.rels"); |
| |
| assertThrows(InvalidOperationException.class, |
| () -> pkg.addRelationship(name1, TargetMode.INTERNAL, PackageRelationshipTypes.CORE_DOCUMENT), |
| "The Relationships part shall not have relationships to any other part [M1.25]" |
| ); |
| pkg.revert(); |
| } |
| } |
| |
| @Test |
| void testToString() throws IOException { |
| try (OPCPackage pkg = OPCPackage.create(TESTFILE)) { |
| assertEquals("OPCPackage{" + |
| "packageAccess=READ_WRITE, " + |
| "relationships=null, " + |
| "packageProperties=Name: /docProps/core.xml - Content Type: application/vnd.openxmlformats-package.core-properties+xml, " + |
| "isDirty=false}", pkg.toString()); |
| } |
| } |
| } |