From d09ab59ab0fd9f480c3781a6cae6dcabfd7e7f43 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Sat, 18 Jul 2009 09:09:11 +0000 Subject: [PATCH] Fixed ExtractorFactory to support .xltx and .dotx files, see Bugzilla 47517 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@795327 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/extractor/ExtractorFactory.java | 23 +++++++++----- .../poi/extractor/TestExtractorFactory.java | 29 +++++++++++++++--- .../org/apache/poi/hwpf/data/test.dotx | Bin 0 -> 10008 bytes .../org/apache/poi/hssf/data/test.xltx | Bin 0 -> 8566 bytes 4 files changed, 41 insertions(+), 11 deletions(-) create mode 100755 src/scratchpad/testcases/org/apache/poi/hwpf/data/test.dotx create mode 100755 src/testcases/org/apache/poi/hssf/data/test.xltx diff --git a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java index dc25f63a38..a313f36026 100644 --- a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java +++ b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java @@ -94,18 +94,27 @@ public class ExtractorFactory { if(core.size() != 1) { throw new IllegalArgumentException("Invalid OOXML Package received - expected 1 core document, found " + core.size()); } - - PackagePart corePart = pkg.getPart(core.getRelationship(0)); - if(corePart.getContentType().equals(XSSFRelation.WORKBOOK.getContentType())) { - return new XSSFExcelExtractor(pkg); - } - if(corePart.getContentType().equals(XWPFRelation.DOCUMENT.getContentType())) { + + PackagePart corePart = pkg.getPart(core.getRelationship(0)); + if (corePart.getContentType().equals(XSSFRelation.WORKBOOK.getContentType()) || + corePart.getContentType().equals(XSSFRelation.MACRO_TEMPLATE_WORKBOOK.getContentType()) || + corePart.getContentType().equals(XSSFRelation.MACRO_ADDIN_WORKBOOK.getContentType()) || + corePart.getContentType().equals(XSSFRelation.TEMPLATE_WORKBOOK.getContentType()) || + corePart.getContentType().equals(XSSFRelation.MACROS_WORKBOOK.getContentType())) { + return new XSSFExcelExtractor(pkg); + } + + if(corePart.getContentType().equals(XWPFRelation.DOCUMENT.getContentType()) || + corePart.getContentType().equals(XWPFRelation.TEMPLATE.getContentType()) || + corePart.getContentType().equals(XWPFRelation.MACRO_DOCUMENT.getContentType()) || + corePart.getContentType().equals(XWPFRelation.MACRO_TEMPLATE_DOCUMENT.getContentType()) ) { return new XWPFWordExtractor(pkg); } + if(corePart.getContentType().equals(XSLFSlideShow.MAIN_CONTENT_TYPE)) { return new XSLFPowerPointExtractor(pkg); } - throw new IllegalArgumentException("No supported documents found in the OOXML package"); + throw new IllegalArgumentException("No supported documents found in the OOXML package (found "+corePart.getContentType()+")"); } public static POIOLE2TextExtractor createExtractor(POIFSFileSystem fs) throws IOException { diff --git a/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java b/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java index bbbbaa9733..76daeed760 100644 --- a/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java +++ b/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java @@ -50,9 +50,11 @@ public class TestExtractorFactory extends TestCase { private File xls; private File xlsx; - + private File xltx; + private File doc; private File docx; + private File dotx; private File ppt; private File pptx; @@ -77,10 +79,12 @@ public class TestExtractorFactory extends TestCase { xls = new File(excel_dir, "SampleSS.xls"); xlsx = new File(excel_dir, "SampleSS.xlsx"); - + xltx = new File(excel_dir, "test.xltx"); + doc = new File(word_dir, "SampleDoc.doc"); docx = new File(word_dir, "SampleDoc.docx"); - + dotx = new File(word_dir, "test.dotx"); + ppt = new File(powerpoint_dir, "SampleShow.ppt"); pptx = new File(powerpoint_dir, "SampleShow.pptx"); @@ -104,6 +108,15 @@ public class TestExtractorFactory extends TestCase { assertTrue( ExtractorFactory.createExtractor(xlsx).getText().length() > 200 ); + + assertTrue( + ExtractorFactory.createExtractor(xltx) + instanceof XSSFExcelExtractor + ); + assertTrue( + ExtractorFactory.createExtractor(xltx).getText().contains("test") + ); + // Word assertTrue( @@ -121,7 +134,15 @@ public class TestExtractorFactory extends TestCase { assertTrue( ExtractorFactory.createExtractor(docx).getText().length() > 120 ); - + + assertTrue( + ExtractorFactory.createExtractor(dotx) + instanceof XWPFWordExtractor + ); + assertTrue( + ExtractorFactory.createExtractor(dotx).getText().contains("Test") + ); + // PowerPoint assertTrue( ExtractorFactory.createExtractor(ppt) diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/test.dotx b/src/scratchpad/testcases/org/apache/poi/hwpf/data/test.dotx new file mode 100755 index 0000000000000000000000000000000000000000..0b74e393260dc486e03bde26daa4509302417396 GIT binary patch literal 10008 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 OfNn@^B1-w=?SBBFd`jj3 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/test.xltx b/src/testcases/org/apache/poi/hssf/data/test.xltx new file mode 100755 index 0000000000000000000000000000000000000000..3974eb2f4ef0f7301c6a9bf9e634af87e32fa431 GIT binary patch literal 8566 zcmeHMWmFv7vK}nx-~@sV8r(HVut0DNP6EN*J-E9|(BKk+yCw`4+}+(ZKyY}IT**0{ z+_mm{Ki@mu)4kWM?y8x+_g7V4Rmn@iz+wX)0T2KH04V@`2pwz-1ps8j0RUKlIVepL zD@%I=OM7i47i$B%H;m2}<|J8DP}CU!Xvq72AOFWzpiik+wv8FRiToHXx|G^RlfqAa zl-QXt6Y~hFbAesqHfEAxf3Z@+7>@b{?Y4I)Io(Xs^t8I%re=055Vk0_f0~=19Ja{5 zu%b7$`7>Y6Bt4kA2y;fgYZ^7G-)Pfl^nDtgEnH$^z|0VW(TQ= zhYpmY6zgt!<7g9OIHHt7&+0kb<2l~qav8;m~t3Kuy@ zAJnc1n!N*rf35y*Vkj0bbFHRA?232QynDVj??0Ym_X(>J6YPwMmV^;MFLl@h1+>OU zeJQ(2Tm)r0iBm9!Md7Cg2G=lJ_Pm|ciADJOnxS_b>qYKbc>(GBf!Zw=2VQ2d6t8**KCA~|g2<2~ElXl8{T9pmBHCj|y`aqIj6 zUx?)y_{PDe2=K1(h0m|}E-Px;WvrZ;Hr#dJ%Z3Slz~b$7To*A!{x~>WkSyFQ;fr&U zI*QSKO{NF);pxn4xzqa^ZW}VG;34s)6TZa|JHg#uZ^m@vj~C4Yd@K2W%QE^GI^Yg8 zCGFp0eF5>78X6L6#$Wⅆ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 literal 0 HcmV?d00001