From afaf6472d0c580f06598bb2ea55c55cd3d1fcf16 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Wed, 29 Feb 2012 07:50:10 +0000 Subject: [PATCH] Bugzilla 51780 - support replacement of content types in OPC packages git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1294998 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../apache/poi/openxml4j/opc/OPCPackage.java | 46 +++++++++++++++++++ .../apache/poi/openxml4j/opc/TestPackage.java | 26 ++++++++--- 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index b1a1825ad2..538273a20e 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 51780 - support replacement of content types in OPC packages 52784 - replace ISO control characters with question marks in SXSSF to be consistent with XSSF 52057 - updated formula test framework to be aware of recently added Functions 52574 - support setting header / footer page margins in HSSF diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java index f384cc650c..7a0da815b7 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java @@ -1439,4 +1439,50 @@ public abstract class OPCPackage implements RelationshipSource, Closeable { */ protected abstract PackagePart[] getPartsImpl() throws InvalidFormatException; + + /** + * Replace a content type in this package. + * + *

+ * A typical scneario to call this method is to rename a template file to the main format, e.g. + * ".dotx" to ".docx" + * ".dotm" to ".docm" + * ".xltx" to ".xlsx" + * ".xltm" to ".xlsm" + * ".potx" to ".pptx" + * ".potm" to ".pptm" + *

+ * For example, a code converting a .xlsm macro workbook to .xlsx would look as follows: + *

+ *


+     *
+     *     OPCPackage pkg = OPCPackage.open(new FileInputStream("macro-workbook.xlsm"));
+     *     pkg.replaceContentType(
+     *         "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
+     *         "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
+     *
+     *     FileOutputStream out = new FileOutputStream("workbook.xlsx");
+     *     pkg.save(out);
+     *     out.close();
+     *
+     *    
+ *

+ * + * @param oldContentType the content type to be replaced + * @param newContentType the replacement + * @return whether replacement was succesfull + * @since POI-3.8 + */ + public boolean replaceContentType(String oldContentType, String newContentType){ + boolean success = false; + ArrayList list = getPartsByContentType(oldContentType); + for (PackagePart packagePart : list) { + if (packagePart.getContentType().equals(oldContentType)) { + PackagePartName partName = packagePart.getPartName(); + contentTypeManager.addContentType(partName, newContentType); + success = true; + } + } + return success; + } } diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java index 35e87ec00d..b6bc97c185 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java @@ -17,12 +17,7 @@ package org.apache.poi.openxml4j.opc; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.lang.reflect.Field; import java.net.URI; import java.util.*; @@ -528,4 +523,23 @@ public final class TestPackage extends TestCase { assertTrue(selected.containsKey("/word/theme/theme1.xml")); assertTrue(selected.containsKey("/word/webSettings.xml")); } + + public void testReplaceContentType() throws Exception { + InputStream is = OpenXML4JTestDataSamples.openSampleStream("sample.xlsx"); + OPCPackage p = OPCPackage.open(is); + + ContentTypeManager mgr = getContentTypeManager(p); + + assertTrue(mgr.isContentTypeRegister("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml")); + assertFalse(mgr.isContentTypeRegister("application/vnd.ms-excel.sheet.macroEnabled.main+xml")); + + assertTrue( + p.replaceContentType( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", + "application/vnd.ms-excel.sheet.macroEnabled.main+xml") + ); + + assertFalse(mgr.isContentTypeRegister("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml")); + assertTrue(mgr.isContentTypeRegister("application/vnd.ms-excel.sheet.macroEnabled.main+xml")); + } }