sdaschner / jaxrs-analyzer

Creates REST documentation for JAX-RS projects
Apache License 2.0
319 stars 101 forks source link

NullPointerException with "JavaDocParserVisitor.calculateMethodIdentifier" #191

Open dizzzz opened 5 years ago

dizzzz commented 5 years ago

I tried to reproduce the two null pointer exceptions I found in the current plugin; One I was able to reproduce in a project I am actively involved:

To reproduce:

java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.<init>(MethodIdentifier.java:49)
    at com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.of(MethodIdentifier.java:180)
    at com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.ofNonStatic(MethodIdentifier.java:161)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocParserVisitor.calculateMethodIdentifier(JavaDocParserVisitor.java:192)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocParserVisitor.recordMethodComment(JavaDocParserVisitor.java:119)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocParserVisitor.lambda$visit$2(JavaDocParserVisitor.java:113)
    at java.util.Optional.ifPresent(Optional.java:159)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocParserVisitor.visit(JavaDocParserVisitor.java:113)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocParserVisitor.visit(JavaDocParserVisitor.java:40)
    at com.github.javaparser.ast.body.MethodDeclaration.accept(MethodDeclaration.java:118)
    at com.github.javaparser.ast.visitor.VoidVisitorAdapter.lambda$visit$61(VoidVisitorAdapter.java:267)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at com.github.javaparser.ast.NodeList.forEach(NodeList.java:255)
    at com.github.javaparser.ast.visitor.VoidVisitorAdapter.visit(VoidVisitorAdapter.java:267)
    at com.github.javaparser.ast.body.EnumDeclaration.accept(EnumDeclaration.java:91)
    at com.github.javaparser.ast.visitor.VoidVisitorAdapter.lambda$visit$40(VoidVisitorAdapter.java:192)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at com.github.javaparser.ast.NodeList.forEach(NodeList.java:255)
    at com.github.javaparser.ast.visitor.VoidVisitorAdapter.visit(VoidVisitorAdapter.java:192)
    at com.github.javaparser.ast.CompilationUnit.accept(CompilationUnit.java:126)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.parseJavaDoc(JavaDocAnalyzer.java:64)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.lambda$invokeParser$0(JavaDocAnalyzer.java:58)
    at java.lang.Iterable.forEach(Iterable.java:75)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.invokeParser(JavaDocAnalyzer.java:58)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.invokeParser(JavaDocAnalyzer.java:38)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.analyze(JavaDocAnalyzer.java:31)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.ProjectAnalyzer.analyze(ProjectAnalyzer.java:107)
    at com.sebastian_daschner.jaxrs_analyzer.JAXRSAnalyzer.analyze(JAXRSAnalyzer.java:47)
    at com.sebastian_daschner.jaxrs_analyzer.maven.JAXRSAnalyzerMojo.execute(JAXRSAnalyzerMojo.java:226)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
dizzzz commented 5 years ago

in another (non public project):

java.lang.NullPointerException
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.findMethodResult(JavaDocAnalyzer.java:80)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.lambda$null$1(JavaDocAnalyzer.java:72)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1556)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.lambda$combineResults$3(JavaDocAnalyzer.java:74)
    at java.util.HashMap.forEach(HashMap.java:1289)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.combineResults(JavaDocAnalyzer.java:71)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.javadoc.JavaDocAnalyzer.analyze(JavaDocAnalyzer.java:32)
    at com.sebastian_daschner.jaxrs_analyzer.analysis.ProjectAnalyzer.analyze(ProjectAnalyzer.java:107)
    at com.sebastian_daschner.jaxrs_analyzer.JAXRSAnalyzer.analyze(JAXRSAnalyzer.java:47)
    at com.sebastian_daschner.jaxrs_analyzer.maven.JAXRSAnalyzerMojo.execute(JAXRSAnalyzerMojo.java:226)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
dizzzz commented 5 years ago

@sdaschner please could you have a look?

rmpestano commented 5 years ago

I've just found a way to reproduce the original issue:

java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.<init>(MethodIdentifier.java:49)
    at com.sebastian_daschner.jaxrs_analyzer.model.methods.MethodIdentifier.of(MethodIdentifier.java:180)

Basically by adding a javadoc in a static method inside an enum, e.g:

public enum MyEnum {
    FOO(1), BAR(2)

    private int code;

    MyEnum(final int code) {
        this.code = code;
     }

   public Integer getCode() {
     return code;
   }

 /**
   * A javadoc description
   * 
   * @param code enum code
   */
   public static MyEnum getByCode(final int code) { 
        return Arrays.asList(values()).stream()
                                  .filter(i -> i.getCode().equals(code))
                                  .findFirst()
                                  .orElse(MyEnum.FOO);
   }
}

Then I get the stacktrace above.

@sdaschner shouldn't we parse the javadoc only on rest endpoints?

rmpestano commented 5 years ago

Well the method doesn't need to be static and don't even need a param, any javadoc inside an enum method will raise the exception:

   /**
     * A javadoc description
     *
     */
    public void getByCode() {

    }
dizzzz commented 5 years ago

Hi, do you have plans to repair this issue and release a new version? regards Dannes

dizzzz commented 5 years ago

For my project I have a dependency on a fix on a reasonable short time. Would you able to address the reported issue?

jerith666 commented 3 years ago

This looks to be a duplicate of #182.