<< Back to previous view

[QB-2421] Changes REST and velocity template raises NullPointerException because a repository was changed
Created: 27/Apr/15  Updated: 30/Apr/15

Status: Resolved
Project: QuickBuild
Component/s: None
Affects Version/s: 5.1.40
Fix Version/s: 6.0.13

Type: Bug Priority: Blocker
Reporter: AlSt Assigned To: Unassigned
Resolution: Fixed Votes: 0
Remaining Estimate: Unknown Time Spent: Unknown
Original Estimate: Unknown

File Attachments: PNG File commitdate-null.PNG    

 Description   
We changed a repository to use another configuration path as dependency and now the change is shown with "Unknown Date" and "UNKNOWN" user (committer) with the message that the dependency to <old config name> has been removed.

When we use the rest request with /rest/changes/commits/build/<buildid> we get the error:
2015-04-27 14:29:19,040 [qtp1509221534-853415] ERROR com.pmease.quickbuild.rest.providers.GenericExceptionMapper - Error serving restful request.
    java.lang.NullPointerException
        at com.pmease.quickbuild.plugin.report.changes.rest.ChangesetMapper.handle(ChangesetMapper.java:47)
        at com.pmease.quickbuild.plugin.report.changes.rest.ChangesetMapper.handle(ChangesetMapper.java:18)
        at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:396)
        at com.pmease.quickbuild.plugin.report.engine.datastore.DbStore.query(DbStore.java:87)
        at com.pmease.quickbuild.plugin.report.engine.datastore.DbStore.query(DbStore.java:59)
        at com.pmease.quickbuild.plugin.report.changes.ChangesHelper.getBuildChangesets(ChangesHelper.java:283)
        at com.pmease.quickbuild.plugin.report.changes.rest.ChangesResource.getBuildChanges(ChangesResource.java:179)
        at sun.reflect.GeneratedMethodAccessor440.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:149)
        at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
        at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:259)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
        at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
        at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:990)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:941)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:932)
        at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:384)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:451)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:632)
        at com.pmease.quickbuild.rest.RestServlet.service(RestServlet.java:48)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

The relevant code line is: change.setDate(new Date(rs.getTimestamp("changesets.commitDate").getTime()));
It seems that the commitDate is null and so it raises a NPE.

Also the velocity template failed with a NPE:
2015-04-27 13:21:29,551 [pool-1-thread-17391] ERROR com.pmease.quickbuild.DefaultBuildEngine - Error processing build request.
    com.pmease.quickbuild.QuickbuildException: Failed to evaluate Velocity template.
        at com.pmease.quickbuild.util.ExceptionUtils.wrapException(ExceptionUtils.java:89)
        at com.pmease.quickbuild.util.VelocityUtils.evalTemplate(VelocityUtils.java:44)
        at com.pmease.quickbuild.plugin.notifier.email.EmailNotifier.notify(EmailNotifier.java:113)
        at com.pmease.quickbuild.DefaultBuildEngine.sendNotifications(DefaultBuildEngine.java:898)
        at com.pmease.quickbuild.DefaultBuildEngine.process(DefaultBuildEngine.java:414)
        at com.pmease.quickbuild.DefaultBuildEngine.access$000(DefaultBuildEngine.java:131)
        at com.pmease.quickbuild.DefaultBuildEngine$2.run(DefaultBuildEngine.java:1076)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getCommitters' in class com.pmease.quickbuild.model.Build threw exception java.lang.NullPointerException at custom_html_notification.vm[line 115, column 48]
        at org.apache.velocity.runtime.parser.node.ASTIdentifier.execute(ASTIdentifier.java:223)
        at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:280)
        at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:567)
        at org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:318)
        at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
        at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
        at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
        at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
        at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
        at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
        at org.apache.velocity.runtime.directive.Parse.render(Parse.java:260)
        at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
        at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
        at org.apache.velocity.runtime.RuntimeInstance.render(RuntimeInstance.java:1378)
        at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1314)
        at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1265)
        at org.apache.velocity.app.Velocity.evaluate(Velocity.java:180)
        at com.pmease.quickbuild.util.VelocityUtils.evalTemplate(VelocityUtils.java:41)
        ... 10 more
    Caused by: java.lang.NullPointerException

because there is something wrong with the changes.

I just took a look at the source of qb 6.0.10 and I think there is nothing different in the ChangesetMapper so this might also occur there.

 Comments   
Comment by AlSt [ 27/Apr/15 02:59 PM ]
we took a look inside one of the scm_activity h2.db files and there are indeed rows, where the commitdate is null.
seems like this is the cause for the NPE
Comment by Robin Shen [ 27/Apr/15 11:37 PM ]
The NPE issue in RESTful API is a bug and we will get it fixed. However the error raised in custom_html_notification.vm is caused by your custom code, and to fixe it, you may need to check nullability of relevant objects to avoid calling getCommitters on it (most probably you are calling getCommitters on a repository that does not exist anymore).
Comment by AlSt [ 28/Apr/15 07:29 AM ]
Thanks for looking into this.

We will check our template. We try to get the committers of a build not of a single repository. Also the Exception states that this exception occurs inside of getCommitters() of the class Build. Sadly the cause in the stacktrace is truncated. It may be unrelated to this issue but I think the problem is somewhere in the Build model class.

Another question: Is there any chance to get something like groovy templates as alternative to velocity templates? I mean the last velocity update was 2010 and we use groovy a lot so that would ease the template creation.

Thank you.
Comment by AlSt [ 28/Apr/15 08:44 AM ]
I found a stacktrace which is not truncated from the template parsing:

2015-04-23 18:23:16,244 [pool-1-thread-5571] ERROR org.apache.velocity.runtime.directive.Parse - Exception rendering #parse(
tml_notification.vm) at velocity[line 1, column 1]
2015-04-23 18:23:16,250 [pool-1-thread-5571] ERROR com.pmease.quickbuild.DefaultBuildEngine - Error processing build request.
    com.pmease.quickbuild.QuickbuildException: Failed to evaluate Velocity template.
     at com.pmease.quickbuild.util.ExceptionUtils.wrapException(ExceptionUtils.java:89)
     at com.pmease.quickbuild.util.VelocityUtils.evalTemplate(VelocityUtils.java:44)
     at com.pmease.quickbuild.plugin.notifier.email.EmailNotifier.notify(EmailNotifier.java:113)
     at com.pmease.quickbuild.DefaultBuildEngine.sendNotifications(DefaultBuildEngine.java:898)
     at com.pmease.quickbuild.DefaultBuildEngine.process(DefaultBuildEngine.java:414)
     at com.pmease.quickbuild.DefaultBuildEngine.access$000(DefaultBuildEngine.java:131)
     at com.pmease.quickbuild.DefaultBuildEngine$2.run(DefaultBuildEngine.java:1076)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
     at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getCommitters' in class com.pmease.quickbuild.model.Build threw exception java.lang.NullPointerException at custom_html_notification.vm[line 115, column 48]
     at org.apache.velocity.runtime.parser.node.ASTIdentifier.execute(ASTIdentifier.java:223)
     at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:280)
     at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:567)
     at org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:318)
     at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
     at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
     at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
     at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
     at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
     at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
     at org.apache.velocity.runtime.directive.Parse.render(Parse.java:260)
     at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
     at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
     at org.apache.velocity.runtime.RuntimeInstance.render(RuntimeInstance.java:1378)
     at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1314)
     at org.apache.velocity.runtime.RuntimeInstance.evaluate(RuntimeInstance.java:1265)
     at org.apache.velocity.app.Velocity.evaluate(Velocity.java:180)
     at com.pmease.quickbuild.util.VelocityUtils.evalTemplate(VelocityUtils.java:41)
     ... 10 more
    Caused by: java.lang.NullPointerException
     at com.pmease.quickbuild.plugin.report.changes.rest.ChangesetMapper.handle(ChangesetMapper.java:47)
     at com.pmease.quickbuild.plugin.report.changes.rest.ChangesetMapper.handle(ChangesetMapper.java:18)
     at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:396)
     at com.pmease.quickbuild.plugin.report.engine.datastore.DbStore.query(DbStore.java:87)
     at com.pmease.quickbuild.plugin.report.engine.datastore.DbStore.query(DbStore.java:59)
     at com.pmease.quickbuild.plugin.report.changes.ChangesHelper.getBuildChangesets(ChangesHelper.java:283)
     at com.pmease.quickbuild.plugin.report.changes.generator.DefaultChangesRecorder.read(DefaultChangesRecorder.java:53)
     at com.pmease.quickbuild.ServerServiceImpl.readChanges(ServerServiceImpl.java:271)
     at com.pmease.quickbuild.model.Build.getChanges(Build.java:616)
     at com.pmease.quickbuild.model.Build.getCommitters(Build.java:750)
     at sun.reflect.GeneratedMethodAccessor755.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:606)
     at org.apache.velocity.runtime.parser.node.PropertyExecutor.execute(PropertyExecutor.java:142)
     at org.apache.velocity.util.introspection.UberspectImpl$VelGetterImpl.invoke(UberspectImpl.java:539)
     at org.apache.velocity.runtime.parser.node.ASTIdentifier.execute(ASTIdentifier.java:198)
     ... 27 more

Here you can see it is the exact same problem.
Generated at Thu May 16 18:34:51 UTC 2024 using JIRA 189.