[apex] AvoidGlobalModifierRule gives warning even when its a webservice - false positive

Fixes 
This commit is contained in:
Andreas Dangel
2018-09-17 13:20:04 +02:00
parent 3113e4ad0f
commit ec79ac1004
3 changed files with 77 additions and 3 deletions
docs/pages
pmd-apex/src
main/java/net/sourceforge/pmd/lang/apex/rule/bestpractices
test/resources/net/sourceforge/pmd/lang/apex/rule/bestpractices/xml

@ -65,6 +65,8 @@ the breaking API changes will be performed in 7.0.0.
### Fixed Issues
* apex-bestpractices
* [#1348](https://github.com/pmd/pmd/issues/1348): \[apex] AvoidGlobalModifierRule gives warning even when its a webservice - false positive
* java-codestyle
* [#1329](https://github.com/pmd/pmd/issues/1329): \[java] FieldNamingConventions: false positive in serializable class with serialVersionUID
* [#1334](https://github.com/pmd/pmd/issues/1334): \[java] LinguisticNaming should support AtomicBooleans

@ -4,14 +4,18 @@
package net.sourceforge.pmd.lang.apex.rule.bestpractices;
import static apex.jorje.semantic.symbol.type.ModifierTypeInfos.GLOBAL;
import java.util.List;
import net.sourceforge.pmd.lang.apex.ast.ASTAnnotation;
import net.sourceforge.pmd.lang.apex.ast.ASTMethod;
import net.sourceforge.pmd.lang.apex.ast.ASTModifierNode;
import net.sourceforge.pmd.lang.apex.ast.ASTUserClass;
import net.sourceforge.pmd.lang.apex.ast.ASTUserInterface;
import net.sourceforge.pmd.lang.apex.ast.ApexNode;
import net.sourceforge.pmd.lang.apex.rule.AbstractApexRule;
import apex.jorje.semantic.symbol.type.ModifierTypeInfos;
public class AvoidGlobalModifierRule extends AbstractApexRule {
public AvoidGlobalModifierRule() {
@ -33,10 +37,39 @@ public class AvoidGlobalModifierRule extends AbstractApexRule {
private Object checkForGlobal(ApexNode<?> node, Object data) {
ASTModifierNode modifierNode = node.getFirstChildOfType(ASTModifierNode.class);
if (modifierNode != null && modifierNode.getNode().getModifiers().has(GLOBAL)) {
if (isGlobal(modifierNode) && !hasRestAnnotation(modifierNode) && !hasWebServices(node)) {
addViolation(data, node);
}
return data;
}
private boolean hasWebServices(ApexNode<?> node) {
List<ASTMethod> methods = node.findChildrenOfType(ASTMethod.class);
for (ASTMethod method : methods) {
ASTModifierNode methodModifier = method.getFirstChildOfType(ASTModifierNode.class);
if (isWebService(methodModifier)) {
return true;
}
}
return false;
}
private boolean isWebService(ASTModifierNode modifierNode) {
return modifierNode != null && modifierNode.getNode().getModifiers().has(ModifierTypeInfos.WEB_SERVICE);
}
private boolean isGlobal(ASTModifierNode modifierNode) {
return modifierNode != null && modifierNode.getNode().getModifiers().has(ModifierTypeInfos.GLOBAL);
}
private boolean hasRestAnnotation(ASTModifierNode modifierNode) {
List<ASTAnnotation> annotations = modifierNode.findChildrenOfType(ASTAnnotation.class);
for (ASTAnnotation annotation : annotations) {
if (annotation.hasImageEqualTo("RestResource")) {
return true;
}
}
return false;
}
}

@ -48,5 +48,44 @@ global class Foo {
}
]]></code>
</test-code>
<test-code>
<description>#1348 [apex] AvoidGlobalModifierRule gives warning even when its a REST webservice - false positive</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
@RestResource(urlMapping = '/partners/submit/*')
global class Generic_LoanCreation {
@HttpPost
global static void createLoanApplication() {
}
}
]]></code>
</test-code>
<test-code>
<description>#1348 [apex] AvoidGlobalModifierRule gives warning even when its a SOAP webservice - false positive</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
global class Generic_LoanCreation {
webservice static void createLoanApplication() {
}
}
]]></code>
</test-code>
<test-code>
<description>Simple public and non-global class</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
public class myOuterClass {
// Additional myOuterClass code here
class myInnerClass {
// myInnerClass code here
}
void myMethod() {
}
}
]]></code>
</test-code>
</test-data>