如何使用Apache Tika 1.16 SourceCodeParser?

时间:2017-12-16 17:52:02

标签: java nullpointerexception apache-tika

社区注意:请不要将其作为重复关闭,因为我正在研究的特定问题已表现为空指针异常。从堆栈跟踪中可以看出,NPE在Tika库中埋藏了4层深。这意味着在NPE上现有的StackExchange帖子中给出的所有好建议,没有一个Tika开发人员认为适合在四个模块中应用该建议(检查空指针)。它不是学习Tika并使用补丁来改进他们的代码来完成这项工作,而是认为询问是否有人实现了使用SourcCodeParser的常见用例会更有效。

我正在寻找有关Tika图书馆已发布示例的帮助。我没有编写示例代码。我见过许多与Tika库有关的类似问题,它有20个贡献者和数千行代码。请不要关闭这个问题,因为我相信任何以前使用此Parser的人都可以很快回答这个问题。我已经阅读了关于NullPointerException的帖子,并且正在遵循这个问题的建议:

  

我仍然无法找到问题

     

如果您尝试调试问题但仍然没有解决方案,那么您   可以发布问题以获得更多帮助,但请确保包含哪些内容   你到目前为止已经尝试过了。至少包括堆栈跟踪   问题,并在代码中标记重要的行号。

由于我花了很多时间创作这篇文章,检索并包含相关的堆栈跟踪和源代码,如果你允许它在一个未闭合的状态下花费一点时间,那么我真的很感激。熟悉Tika可能会看一下看似相当普遍的问题。正如您所知道的Java专家一样,许多空指针异常问题可能并非易事,尤其是在使用大型不熟悉的框架时。我非常感谢你的帮助。

我编写了一个简单的程序来测试Tika SourceCodeParser,将其替换为来自the Tika Examples page的XHTML解析示例中的AutoDetectParser。在第137行执行parse命令时,存在NullPointerException。看来,Parser代码的第180行in可能缺少一名代表。

AutoDetectParser有效,但未将源代码标识为java。

当我使用Tika桌面应用程序时,它可以正常工作并将代码识别为Java。

如何初始化SourceCodeParser以避免NullPointerException在操作时出现?{/ p>

使用Tika的示例"示例"封装 LocalFile.toTikaXhtmlString()

123      /** Parses as Tika using source code parser.
124      *
125      * @param filePathParam path to file to parse
126      */
127             public static String toTikaXhtmlString(final String filePathParam)
128                     throws IOException, SAXException, TikaException
129                 {
130                     SourceCodeParser parser = new SourceCodeParser();
131                     ContentHandler handler = new ToXMLContentHandler();
132                     Metadata metadata = new Metadata();
133                     File file = new File(filePathParam);
134                     try (InputStream stream
135                             = ContentHandlerExample.class
136                               .getResourceAsStream(filePathParam)) {
137                         parser.parse(stream, handler, metadata);
138                         return handler.toString();
139                     } catch (Exception e) {
140                         System.out.println("Caught exception.");
141                         System.out.println(e.toString());
142                         e.printStackTrace();
143                         throw e;
144                     }
145                     
146                 }    

我也尝试过避免使用Tika' ContentHandlerExample'使用与InputStreamReader直接调用的类,结果相同:

public static String toTikaXhtmlString(final String filePathParam)
        throws IOException, SAXException, TikaException
    {
        SourceCodeParser parser = new SourceCodeParser();
        ContentHandler handler = new ToXMLContentHandler();
        Metadata metadata = new Metadata();
        File file = new File(filePathParam);


        try (InputStream stream = new FileInputStream(file)) {
            parser.parse(stream, handler, metadata);
            return handler.toString();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }

JUNIT测试

108         @Test
109         public void parseFile() {
110                 String fileName, verifyInput, resultContent;
111 
112                 //arrange
113                 fileName = "/Users/johnmeyer/Projects/code-proc/FileParseTest-run.txt";
114 
115                 String fileContent = "/** Test */ public MyTestClass {"
116                                    + "public static void main(String[] args) {"
117                                    + "System.out.println(\"This is a test.\"); }";
118 
119 
120                 LocalFile.putText(fileName, fileContent);
121 
122                 verifyInput = LocalFile.getContent(fileName);
123 
124                 assertEquals(fileContent, verifyInput);
125                 //act (and clean up)
126 
127                 try {
128 
129                     resultContent = LocalFile.toTikaXhtmlString(fileName);
130                 } catch (Exception e) {
131                     throw new RuntimeException(e.getMessage());
132                 }
133 
134                 LocalFile.delete(fileName);
135 
136                 //assert
137                 assertEquals(fileContent, resultContent);
138         }

堆栈跟踪

  

[INFO]运行us.johnmeyer.test.tools.FileParseTest捕获异常。   java.lang.NullPointerException java.lang.NullPointerException at   org.apache.commons.io.input.ProxyInputStream.markSupported(ProxyInputStream.java:181)     在   org.apache.tika.detect.AutoDetectReader.getBuffered(AutoDetectReader.java:137)     在   org.apache.tika.detect.AutoDetectReader。(AutoDetectReader.java:114)     在   org.apache.tika.parser.code.SourceCodeParser.parse(SourceCodeParser.java:93)     在   org.apache.tika.parser.AbstractParser.parse(AbstractParser.java:53)     在   us.johnmeyer.utilities.LocalFile.toTikaXhtmlString(LocalFile.java:137)     在   us.johnmeyer.test.tools.FileParseTest.parseFile(FileParseTest.java:129)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)at   org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:47)     在   org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)     在   org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)     在   org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)     在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)at   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)     在   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)     在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:238)at   org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:63)at   org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)at at   org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:53)at at   org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)at at   org.junit.runners.ParentRunner.run(ParentRunner.java:309)at at   org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:369)     在   org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:275)     在   org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:239)     在   org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:160)     在   org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:373)     在   org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:334)     在   org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:119)     在   org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:407)

Tika源代码

17 package org.apache.tika.io;
 18 
 19 import java.io.FilterInputStream;
 20 import java.io.IOException;
 21 import java.io.InputStream;
 22 
 23 /**
 24  * A Proxy stream which acts as expected, that is it passes the method
 25  * calls on to the proxied stream and doesn't change which methods are
 26  * being called.
 27  * <p>
 28  * It is an alternative base class to FilterInputStream
 29  * to increase reusability, because FilterInputStream changes the
 30  * methods being called, such as read(byte[]) to read(byte[], int, int).
 31  * <p>
 32  * See the protected methods for ways in which a subclass can easily decorate
 33  * a stream with custom pre-, post- or error processing functionality.
 34  *
 35  * @author Stephen Colebourne
 36  * @version $Id$
 37  */
 38 public abstract class ProxyInputStream extends FilterInputStream {
 40     /**
 41      * Constructs a new ProxyInputStream.
 42      *
 43      * @param proxy  the InputStream to delegate to
 44      */
 45     public ProxyInputStream(InputStream proxy) {
 46         super(proxy);
 47         // the proxy is stored in a protected superclass variable named 'in'
 48     }

...

    174     /**
    175      * Invokes the delegate's <code>markSupported()</code> method.
    176      * @return true if mark is supported, otherwise false
    177      */
    178     @Override
    179     public boolean markSupported() {
    180         return in.markSupported();
    181     }

0 个答案:

没有答案