Skip to content

Commit

Permalink
Merge branch 'release/2.2.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasPohl committed Dec 22, 2017
2 parents 9b578ae + 593e3e2 commit 1909d80
Show file tree
Hide file tree
Showing 79 changed files with 3,895 additions and 366 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ esql-frontend/.gitignore
esql-frontend/.project
.settings/
.classpath
.project
6 changes: 5 additions & 1 deletion esql-checks-test/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<parent>
<groupId>com.exxeta.iss</groupId>
<artifactId>sonar-esql-plugin</artifactId>
<version>2.1.1</version>
<version>2.2.0</version>
</parent>

<modelVersion>4.0.0</modelVersion>
Expand All @@ -21,6 +21,10 @@
<groupId>org.sonarsource.sonarqube</groupId>
<artifactId>sonar-plugin-api</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public static CheckMessagesVerifier issues(EsqlCheck check, File file) {
* </pre>
*/
public static void verify(EsqlCheck check, File file) {
verify(check, new TestInputFile(file.getAbsolutePath()));
verify(check, TestUtils.createTestInputFile(file.getAbsolutePath()));
}

static void verify(EsqlCheck check, InputFile file) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,14 @@

import static com.exxeta.iss.sonar.esql.compat.CompatibilityHelper.wrap;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;

import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.config.MapSettings;
import org.sonar.api.config.Settings;

Expand Down Expand Up @@ -59,6 +64,24 @@ private static EsqlVisitorContext createContext(InputFile file, ActionParser<Tre
}
}

public static DefaultInputFile createTestInputFile(String baseDir, String relativePath) {
return new DefaultInputFile("module1", relativePath).setModuleBaseDir(Paths.get(baseDir))
.setLanguage("esql").setCharset(StandardCharsets.UTF_8).setType(InputFile.Type.MAIN);
}

public static DefaultInputFile createTestInputFile(File baseDir, String relativePath) {
return createTestInputFile(baseDir.getAbsolutePath(), relativePath);
}

public static DefaultInputFile createTestInputFile(String relativePath) {
return createTestInputFile("", relativePath);
}

public static DefaultInputFile createTestInputFile(File baseDir, String relativePath, Charset charset) {
return new DefaultInputFile(baseDir.getAbsolutePath(), relativePath)
.setModuleBaseDir(Paths.get(baseDir.getAbsolutePath())).setLanguage("esql").setCharset(charset);
}

private static Settings settings() {
Settings settings = new MapSettings();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ private TreeCheckTest() {
}

public static Collection<CheckMessage> getIssues(String relativePath, EsqlCheck check) {
InputFile file = new TestInputFile(relativePath);
InputFile file = TestUtils.createTestInputFile(relativePath);

EsqlVisitorContext context = TestUtils.createContext(file);
List<Issue> issues = check.scanFile(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,17 @@
*/
package com.exxeta.iss.sonar.esql.checks.verifier;

import com.exxeta.iss.sonar.esql.api.EsqlCheck;
import com.exxeta.iss.sonar.esql.api.tree.Tree;
import com.exxeta.iss.sonar.esql.api.tree.lexical.SyntaxTrivia;
import com.exxeta.iss.sonar.esql.api.visitors.Issue;
import com.exxeta.iss.sonar.esql.api.visitors.IssueLocation;
import com.exxeta.iss.sonar.esql.api.visitors.LineIssue;
import com.exxeta.iss.sonar.esql.api.visitors.PreciseIssue;
import com.exxeta.iss.sonar.esql.api.visitors.TreeVisitorContext;
import com.exxeta.iss.sonar.esql.checks.verifier.TestIssue.Location;
import com.exxeta.iss.sonar.esql.tree.impl.EsqlTree;
import com.exxeta.iss.sonar.esql.tree.impl.lexical.InternalSyntaxToken;
import com.google.common.collect.ImmutableList;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.Nullable;

import org.apache.commons.lang.NotImplementedException;
import org.apache.commons.lang.StringUtils;
import org.junit.Rule;
Expand All @@ -43,8 +36,18 @@
import org.junit.rules.TemporaryFolder;
import org.sonar.api.batch.fs.internal.DefaultInputFile;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.exxeta.iss.sonar.esql.api.EsqlCheck;
import com.exxeta.iss.sonar.esql.api.tree.Tree;
import com.exxeta.iss.sonar.esql.api.tree.lexical.SyntaxTrivia;
import com.exxeta.iss.sonar.esql.api.visitors.Issue;
import com.exxeta.iss.sonar.esql.api.visitors.IssueLocation;
import com.exxeta.iss.sonar.esql.api.visitors.LineIssue;
import com.exxeta.iss.sonar.esql.api.visitors.PreciseIssue;
import com.exxeta.iss.sonar.esql.api.visitors.TreeVisitorContext;
import com.exxeta.iss.sonar.esql.checks.verifier.TestIssue.Location;
import com.exxeta.iss.sonar.esql.tree.impl.EsqlTree;
import com.exxeta.iss.sonar.esql.tree.impl.lexical.InternalSyntaxToken;
import com.google.common.collect.ImmutableList;

public class EsqlCheckVerifierTest {

Expand Down Expand Up @@ -385,7 +388,7 @@ private void expect(String exceptionMessage) {

private void check(String sourceCode, TestIssue... actualIssues) throws Exception {
EsqlCheck check = new CheckStub(Arrays.asList(actualIssues));
DefaultInputFile fakeFile = new TestInputFile(folder.getRoot(), "fakeFile.txt");
DefaultInputFile fakeFile = TestUtils.createTestInputFile(folder.getRoot(), "fakeFile.txt");
fakeFile.setCharset(StandardCharsets.UTF_8);
Files.write(fakeFile.path(), sourceCode.getBytes(fakeFile.charset()));
EsqlCheckVerifier.verify(check, fakeFile);
Expand Down
2 changes: 1 addition & 1 deletion esql-checks/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>com.exxeta.iss</groupId>
<artifactId>sonar-esql-plugin</artifactId>
<version>2.1.1</version>
<version>2.2.0</version>
</parent>

<artifactId>esql-checks</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public class HardCodedCredentialsCheck extends DoubleDispatchVisitorCheck {

@Override
public void visitSetStatement(SetStatementTree tree) {
if (isPasswordVariableName(tree.variableReference()) && isStringLiteral(tree.expression())){
if (isPasswordVariableName(tree.variableReference()) && isNonEmptyStringLiteral(tree.expression())){
reportIssue(tree.expression());
}
super.visitSetStatement(tree);
Expand Down Expand Up @@ -85,7 +85,7 @@ private boolean isPasswordVariableName(IdentifierTree identifier) {
@Override
public void visitDeclareStatement(DeclareStatementTree tree) {
boolean isExternal = tree.sharedExt() != null && "EXTERNAL".equalsIgnoreCase(tree.sharedExt().text());
if (!isExternal && isStringLiteral(tree.initialValueExpression()) && isPasswordVaribleName(tree.nameList())) {
if (!isExternal && isNonEmptyStringLiteral(tree.initialValueExpression()) && isPasswordVaribleName(tree.nameList())) {
reportIssue(tree.initialValueExpression());
}
}
Expand Down Expand Up @@ -115,13 +115,18 @@ private boolean isPasswordVaribleName(SeparatedList<IdentifierTree> nameList) {

@Override
public void visitLiteral(LiteralTree tree) {
if (isStringLiteral(tree) && PASSWORD_LITERAL_PATTERN.matcher(tree.value()).find()){
if (isNonEmptyStringLiteral(tree) && PASSWORD_LITERAL_PATTERN.matcher(tree.value()).find()){
reportIssue(tree);
}
}

private static boolean isStringLiteral(@Nullable ExpressionTree initializer) {
return initializer != null && initializer.is(Tree.Kind.STRING_LITERAL);
private static boolean isNonEmptyStringLiteral(@Nullable ExpressionTree initializer) {
if ( initializer != null && initializer.is(Tree.Kind.STRING_LITERAL)){
LiteralTree literal = (LiteralTree) initializer;
return !"''".equals(literal.value());
} else {
return false;
}
}

private static boolean isPasswordVariableName(String token) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,38 +17,61 @@
*/
package com.exxeta.iss.sonar.esql.check;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;

import org.sonar.check.Rule;
import org.sonar.check.RuleProperty;

import com.exxeta.iss.sonar.esql.api.tree.Tree;
import com.exxeta.iss.sonar.esql.api.tree.lexical.SyntaxToken;
import com.exxeta.iss.sonar.esql.api.tree.statement.IfStatementTree;
import com.exxeta.iss.sonar.esql.api.visitors.DoubleDispatchVisitorCheck;
import com.exxeta.iss.sonar.esql.api.visitors.Issue;
import com.exxeta.iss.sonar.esql.api.visitors.IssueLocation;
import com.exxeta.iss.sonar.esql.api.visitors.PreciseIssue;
import com.exxeta.iss.sonar.esql.api.visitors.TreeVisitorContext;

@Rule(key = "NestedIfDepth")
public class NestedIfDepthCheck extends DoubleDispatchVisitorCheck {

private int nestingLevel = 0;
private Deque<SyntaxToken> nestingLevel;

private static final int DEFAULT_MAXIMUM_NESTING_LEVEL = 5;

@RuleProperty(key = "maximumNestingLevel", description = "the maxmimum if depth.", defaultValue = ""
+ DEFAULT_MAXIMUM_NESTING_LEVEL)
public int maximumNestingLevel = DEFAULT_MAXIMUM_NESTING_LEVEL;

public int getMaximumNestingLevel() {
return maximumNestingLevel;
}

@Override
public void visitIfStatement(IfStatementTree tree) {
nestingLevel++;
if (nestingLevel == getMaximumNestingLevel() + 1) {
addIssue(new PreciseIssue(this, new IssueLocation(tree, tree, "This if has a nesting level of "
+ nestingLevel + ", which is higher than the maximum allowed " + maximumNestingLevel + ".")));
}
SyntaxToken ifKeyword = tree.ifKeyword();
checkNesting(ifKeyword);
nestingLevel.push(ifKeyword);
super.visitIfStatement(tree);
nestingLevel--;
nestingLevel.pop();
}


private void checkNesting(Tree tree) {
int size = nestingLevel.size();
if (size == maximumNestingLevel) {
PreciseIssue issue = new PreciseIssue(this, new IssueLocation(tree, tree, "This if has a nesting level of "
+ (nestingLevel.size()+1) + ", which is higher than the maximum allowed " + maximumNestingLevel + "."));


for (SyntaxToken element : nestingLevel) {
issue.secondary(element , "Nesting + 1");
}
addIssue(issue);
}
}

@Override
public List<Issue> scanFile(TreeVisitorContext context) {
this.nestingLevel = new ArrayDeque<>();
return super.scanFile(context);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,17 @@
public class UnknownMessageDomainCheck extends DoubleDispatchVisitorCheck {

private static List<String> rootElements = Collections.unmodifiableList(Lists.newArrayList("InputRoot", "OutputRoot", "Root"));
private static List<String> domains = Collections.unmodifiableList(Lists.newArrayList("DFDL","MRM", "XML", "XMLNS", "XMLNSC", "JMS", "IDOC", "MIME", "BLOB", "JSON", "SOAP",
"Properties", "HTTPRequestHeader", "HTTPResponseHeader", "HTTPInputHeader", "HTTPReplyHeader", "MQMD", "MQRFH2", "EmailOutputHeader", "EmailInputHeader", "Collection", "*"));
private static List<String> domains = Collections.unmodifiableList(Lists.newArrayList(
"DFDL","MRM",
"XML", "XMLNS", "XMLNSC",
"JMS", "JMSMap", "JMSStream", "JMSTransport",
"IDOC", "MIME", "BLOB", "JSON", "SOAP", "Properties",
"HTTPRequestHeader", "HTTPResponseHeader", "HTTPInputHeader", "HTTPReplyHeader",
"MQCIH", "MQDLH", "MQIIH", "MQMD", "MQMDE", "MQPCF", "MQRFH", "MQRFH2", "MQRFH2C", "MQRMH", "MQSAPH", "MQWIH",
"EmailOutputHeader", "EmailInputHeader",
"Collection", "*",
"DataObject", "IDOC", "SMQ_BMH", "SQL"
));


@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"title": "Modues should be documented",
"type": "CODE_SMELL",
"status": "ready",
"remediation": {
"func": "Constant\/Issue",
"constantCost": "10min"
},
"tags": [
"convention"
],
"defaultSeverity": "Major"
}
{
"title": "Modules should be documented",
"type": "CODE_SMELL",
"status": "ready",
"remediation": {
"func": "Constant\/Issue",
"constantCost": "10min"
},
"tags": [
"convention"
],
"defaultSeverity": "Major"
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,37 @@
<li>XMLNS</li>
<li>XMLNSC</li>
<li>JMS</li>
<li>JMSMap</li>
<li>JMSStream</li>
<li>JMSTransport</li>
<li>IDOC</li>
<li>MIME</li>
<li>BLOB</li>
<li>JSON</li>
<li>SOAP</li>
<li>Properties</li>
<li>HTTPRequestHeader</li>
<li>HTTPResponseHeader</li>
<li>HTTPInputHeader</li>
<li>HTTPReplyHeader</li>
<li>MQCIH</li>
<li>MQDLH</li>
<li>MQIIH</li>
<li>MQMD</li>
<li>MQMDE</li>
<li>MQPCF</li>
<li>MQRFH</li>
<li>MQRFH2</li>
<li>MQRFH2C</li>
<li>MQRMH</li>
<li>MQSAPH</li>
<li>MQWIH</li>
<li>EmailOutputHeader</li>
<li>EmailInputHeader</li>
<li>Collection</li>
<li>*</li>
<li>DataObject</li>
<li>IDOC</li>
<li>SMQ_BMH</li>
<li>SQL</li>
</ul>
Loading

0 comments on commit 1909d80

Please sign in to comment.