[visualforce] Parse Error: NullPointerException in Visualforce Rules
Affects PMD Version:
7.7.0
Description:
We encountered a parse error when running Visualforce rules on specific Visualforce pages. The error occurs when the page contains a standard field reference, such as {!Case.Description}. However, if we use a custom field, such as {!Case.Description__c}, no error is triggered.
The issue is intermittent and only reproducible when running PMD Visualforce rules on a large set of Visualforce pages (approximately 7,000). Running the rules on the specific problematic file alone does not trigger the error.
Error Message:
The following error is encountered:
NullPointerException: Cannot invoke "org.w3c.dom.Node.getNodeValue()" because "typeNode" is null
Exception Stacktrace:
<error filename=".\force-app\main\default\pages\nameofthepage.page" msg="NullPointerException: Cannot invoke "org.w3c.dom.Node.getNodeValue()" because "typeNode" is null">
<![CDATA[java.lang.NullPointerException: Cannot invoke "org.w3c.dom.Node.getNodeValue()" because "typeNode" is null
at net.sourceforge.pmd.lang.visualforce.ast.ObjectFieldTypes.parseSfdxCustomField(ObjectFieldTypes.java:175)
at net.sourceforge.pmd.lang.visualforce.ast.ObjectFieldTypes.findDataType(ObjectFieldTypes.java:129)
at net.sourceforge.pmd.lang.visualforce.ast.SalesforceFieldTypes.getDataType(SalesforceFieldTypes.java:70)
at net.sourceforge.pmd.lang.visualforce.ast.VfExpressionTypeVisitor.visit(VfExpressionTypeVisitor.java:142)
at net.sourceforge.pmd.lang.visualforce.ast.VfExpressionTypeVisitor.visit(VfExpressionTypeVisitor.java:26)
at net.sourceforge.pmd.lang.visualforce.ast.ASTElExpression.acceptVfVisitor(ASTElExpression.java:14)
at net.sourceforge.pmd.lang.visualforce.ast.AbstractVfNode.acceptVisitor(AbstractVfNode.java:32)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visitVfNode(VfVisitor.java:7)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visit(VfVisitor.java:21)
at net.sourceforge.pmd.lang.visualforce.ast.ASTAttributeValue.acceptVfVisitor(ASTAttributeValue.java:15)
at net.sourceforge.pmd.lang.visualforce.ast.AbstractVfNode.acceptVisitor(AbstractVfNode.java:32)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visitVfNode(VfVisitor.java:7)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visit(VfVisitor.java:20)
at net.sourceforge.pmd.lang.visualforce.ast.ASTAttribute.acceptVfVisitor(ASTAttribute.java:53)
at net.sourceforge.pmd.lang.visualforce.ast.AbstractVfNode.acceptVisitor(AbstractVfNode.java:32)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visitVfNode(VfVisitor.java:7)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visit(VfVisitor.java:19)
at net.sourceforge.pmd.lang.visualforce.ast.VfExpressionTypeVisitor.visit(VfExpressionTypeVisitor.java:89)
at net.sourceforge.pmd.lang.visualforce.ast.VfExpressionTypeVisitor.visit(VfExpressionTypeVisitor.java:26)
at net.sourceforge.pmd.lang.visualforce.ast.ASTElement.acceptVfVisitor(ASTElement.java:82)
at net.sourceforge.pmd.lang.visualforce.ast.AbstractVfNode.acceptVisitor(AbstractVfNode.java:32)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visitVfNode(VfVisitor.java:7)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visit(VfVisitor.java:9)
at net.sourceforge.pmd.lang.visualforce.ast.ASTContent.acceptVfVisitor(ASTContent.java:15)
at net.sourceforge.pmd.lang.visualforce.ast.AbstractVfNode.acceptVisitor(AbstractVfNode.java:32)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visitVfNode(VfVisitor.java:7)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visit(VfVisitor.java:19)
at net.sourceforge.pmd.lang.visualforce.ast.VfExpressionTypeVisitor.visit(VfExpressionTypeVisitor.java:89)
at net.sourceforge.pmd.lang.visualforce.ast.VfExpressionTypeVisitor.visit(VfExpressionTypeVisitor.java:26)
at net.sourceforge.pmd.lang.visualforce.ast.ASTElement.acceptVfVisitor(ASTElement.java:82)
at net.sourceforge.pmd.lang.visualforce.ast.AbstractVfNode.acceptVisitor(AbstractVfNode.java:32)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visitVfNode(VfVisitor.java:7)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visit(VfVisitor.java:9)
at net.sourceforge.pmd.lang.visualforce.ast.ASTContent.acceptVfVisitor(ASTContent.java:15)
at net.sourceforge.pmd.lang.visualforce.ast.AbstractVfNode.acceptVisitor(AbstractVfNode.java:32)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitChildren(AstVisitorBase.java:31)
at net.sourceforge.pmd.lang.ast.AstVisitorBase.visitNode(AstVisitorBase.java:38)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visitVfNode(VfVisitor.java:7)
at net.sourceforge.pmd.lang.visualforce.ast.VfVisitor.visit(VfVisitor.java:8)
at net.sourceforge.pmd.lang.visualforce.ast.VfExpressionTypeVisitor.visit(VfExpressionTypeVisitor.java:63)
at net.sourceforge.pmd.lang.visualforce.ast.VfParser.parseImpl(VfParser.java:37)
at net.sourceforge.pmd.lang.visualforce.ast.VfParser.parseImpl(VfParser.java:16)
at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse(JjtreeParserAdapter.java:36)
at net.sourceforge.pmd.lang.impl.PmdRunnable.parse(PmdRunnable.java:112)
at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:132)
at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
]]>
</error>
Code Sample demonstrating the issue:
<apex:page standardController="Case">
<apex:outputField value="{!Case.Description}"/>
</apex:page>
The error occurs at line 2.
If {!Case.Description} is replaced with {!Case.Description__c}, the error does not occur.
Steps to reproduce:
Note: The issue does not occur if the PMD rules are executed only on the specific example provided above. The error is only reproducible in a large-scale analysis scenario.
Additional Information:
We observed four similar parse errors across different Visualforce pages, all related to standard field references like {!Case.Description}.
Running PMD through:
CLI
JDK and OS Information:
JDK Version:
openjdk 21.0.4 2024-07-16 LTS
OpenJDK Runtime Environment Microsoft-9889606 (build 21.0.4+7-LTS)
OpenJDK 64-Bit Server VM Microsoft-9889606 (build 21.0.4+7-LTS, mixed mode, sharing)
OS: Microsoft Windows
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4