Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NullPointerException with "JavaDocParserVisitor.calculateMethodIdentifier" #191

Open
dizzzz opened this issue Jul 4, 2019 · 7 comments
Open

Comments

@dizzzz
Copy link

dizzzz commented Jul 4, 2019

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:

  • clone https://github.com/eXist-db/exist.git
  • add plugin to exist-parent/pom.xml
  • run mvn clean install -DskipTests (sorry a lot of CVE data is downloaded - it sometimes fails)
  • build fails with plugin NPE
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
Copy link
Author

dizzzz commented Jul 4, 2019

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
Copy link
Author

dizzzz commented Jul 10, 2019

@sdaschner please could you have a look?

@rmpestano
Copy link
Contributor

rmpestano commented Jul 10, 2019

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
Copy link
Contributor

rmpestano commented Jul 10, 2019

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
Copy link
Author

dizzzz commented Aug 6, 2019

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

@dizzzz
Copy link
Author

dizzzz commented Sep 3, 2019

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

@jerith666
Copy link

This looks to be a duplicate of #182.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants