| /* ==================================================================== |
| 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.Assert.fail; |
| |
| 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.junit.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. |
| * |
| * @author Julien Chable |
| */ |
| public class TestOPCCompliancePackageModel { |
| |
| /** |
| * 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 |
| public void testPartNameDerivationAdditionFailure() { |
| OPCPackage pkg = OPCPackage.create("TODELETEIFEXIST.docx"); |
| try { |
| PackagePartName name = PackagingURIHelper |
| .createPartName("/word/document.xml"); |
| PackagePartName nameDerived = PackagingURIHelper |
| .createPartName("/word/document.xml/image1.gif"); |
| pkg.createPart(name, ContentTypes.XML); |
| pkg.createPart(nameDerived, ContentTypes.EXTENSION_GIF); |
| } catch (InvalidOperationException e) { |
| pkg.revert(); |
| return; |
| } catch (InvalidFormatException e) { |
| fail(e.getMessage()); |
| } |
| fail("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]"); |
| } |
| |
| /** |
| * 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 |
| public void testPartNameDerivationReadingFailure() throws IOException { |
| String filename = "OPCCompliance_DerivedPartNameFAIL.docx"; |
| try { |
| OPCPackage.open(POIDataSamples.getOpenXML4JInstance().openResourceAsStream(filename)); |
| } catch (InvalidFormatException e) { |
| return; |
| } |
| fail("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 |
| public void testAddPackageAlreadyAddFailure() throws Exception { |
| OPCPackage pkg = OPCPackage.create("DELETEIFEXISTS.docx"); |
| PackagePartName name1 = null; |
| PackagePartName name2 = null; |
| try { |
| name1 = PackagingURIHelper.createPartName("/word/document.xml"); |
| name2 = PackagingURIHelper.createPartName("/word/document.xml"); |
| } catch (InvalidFormatException e) { |
| throw new Exception(e.getMessage()); |
| } |
| pkg.createPart(name1, ContentTypes.XML); |
| try { |
| pkg.createPart(name2, ContentTypes.XML); |
| } catch (PartAlreadyExistsException e) { |
| return; |
| } |
| fail("Packages shall not contain equivalent part names and package implementers shall neither create nor recognize packages with equivalent part names. [M1.12]"); |
| } |
| |
| /** |
| * Rule M1.12 : Packages shall not contain equivalent part names and package |
| * implementers shall neither create nor recognize packages with equivalent |
| * part names. |
| */ |
| @Test |
| public void testAddPackageAlreadyAddFailure2() throws Exception { |
| OPCPackage pkg = OPCPackage.create("DELETEIFEXISTS.docx"); |
| PackagePartName partName = null; |
| try { |
| partName = PackagingURIHelper.createPartName("/word/document.xml"); |
| } catch (InvalidFormatException e) { |
| throw new Exception(e.getMessage()); |
| } |
| pkg.createPart(partName, ContentTypes.XML); |
| try { |
| pkg.createPart(partName, ContentTypes.XML); |
| } catch (InvalidOperationException e) { |
| return; |
| } |
| fail("Packages shall not contain equivalent part names and package implementers shall neither create nor recognize packages with equivalent part names. [M1.12]"); |
| } |
| |
| /** |
| * Try to add a relationship to a relationship part. |
| * |
| * 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 |
| public void testAddRelationshipRelationshipsPartFailure() { |
| OPCPackage pkg = OPCPackage.create("DELETEIFEXISTS.docx"); |
| PackagePartName name1 = null; |
| try { |
| name1 = PackagingURIHelper |
| .createPartName("/test/_rels/document.xml.rels"); |
| } catch (InvalidFormatException e) { |
| fail("This exception should never happen !"); |
| } |
| |
| try { |
| pkg.addRelationship(name1, TargetMode.INTERNAL, |
| PackageRelationshipTypes.CORE_DOCUMENT); |
| } catch (InvalidOperationException e) { |
| return; |
| } |
| fail("Fail test -> M1.25: The Relationships part shall not have relationships to any other part"); |
| } |
| } |