Last active
August 22, 2018 09:36
-
-
Save hathazylaszlojr/f3b516999635e28521e6d0f1b6fb1303 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* SonarQube Java | |
* Copyright (C) 2012-2018 SonarSource SA | |
* mailto:info AT sonarsource DOT com | |
* | |
* This program is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU Lesser General Public | |
* License as published by the Free Software Foundation; either | |
* version 3 of the License, or (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
* Lesser General Public License for more details. | |
* | |
* You should have received a copy of the GNU Lesser General Public License | |
* along with this program; if not, write to the Free Software Foundation, | |
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
*/ | |
package org.sonar.java.checks; | |
import com.google.common.collect.ImmutableList; | |
import java.util.List; | |
import org.sonar.check.Rule; | |
import org.sonar.check.RuleProperty; | |
import org.sonar.java.RspecKey; | |
import org.sonar.plugins.java.api.JavaFileScanner; | |
import org.sonar.plugins.java.api.JavaFileScannerContext; | |
import org.sonar.plugins.java.api.semantic.SymbolMetadata; | |
import org.sonar.plugins.java.api.tree.BaseTreeVisitor; | |
import org.sonar.plugins.java.api.tree.MethodTree; | |
import org.sonar.plugins.java.api.tree.Tree; | |
@Rule( key = "S00107") | |
@RspecKey("S107") | |
public class TooManyParametersCheck extends BaseTreeVisitor implements JavaFileScanner { | |
private static final int DEFAULT_MAXIMUM = 7; | |
@RuleProperty( | |
key = "max", | |
description = "Maximum authorized number of parameters", | |
defaultValue = "" + DEFAULT_MAXIMUM) | |
public int maximum = DEFAULT_MAXIMUM; | |
@RuleProperty( | |
key = "constructorMax", | |
description = "Maximum authorized number of parameters for a constructor", | |
defaultValue = "" + DEFAULT_MAXIMUM) | |
public int constructorMax = DEFAULT_MAXIMUM; | |
private JavaFileScannerContext context; | |
private static final List<String> WHITE_LIST = ImmutableList.of( | |
"org.springframework.web.bind.annotation.RequestMapping", | |
// === Newly whitelisted annotations === | |
"org.springframework.web.bind.annotation.GetMapping", | |
"org.springframework.web.bind.annotation.PostMapping", | |
"org.springframework.web.bind.annotation.PutMapping", | |
"org.springframework.web.bind.annotation.DeleteMapping", | |
"org.springframework.web.bind.annotation.PatchMapping", | |
// === Newly whitelisted annotations end === | |
"com.fasterxml.jackson.annotation.JsonCreator"); | |
@Override | |
public void scanFile(JavaFileScannerContext context) { | |
this.context = context; | |
scan(context.getTree()); | |
} | |
@Override | |
public void visitMethod(MethodTree tree) { | |
super.visitMethod(tree); | |
if (isOverriding(tree) || (hasSemantic() && usesAuthorizedAnnotation(tree))) { | |
return; | |
} | |
int max; | |
String partialMessage; | |
if (tree.is(Tree.Kind.CONSTRUCTOR)) { | |
max = constructorMax; | |
partialMessage = "Constructor"; | |
} else { | |
max = maximum; | |
partialMessage = "Method"; | |
} | |
int size = tree.parameters().size(); | |
if (size > max) { | |
context.reportIssue(this, tree.simpleName(), partialMessage + " has " + size + " parameters, which is greater than " + max + " authorized."); | |
} | |
} | |
private static boolean isOverriding(MethodTree tree) { | |
return Boolean.TRUE.equals(tree.isOverriding()); | |
} | |
private boolean hasSemantic() { | |
return context.getSemanticModel() != null; | |
} | |
private static boolean usesAuthorizedAnnotation(MethodTree method) { | |
SymbolMetadata metadata = method.symbol().metadata(); | |
return WHITE_LIST.stream().anyMatch(metadata::isAnnotatedWith); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment