diff --git a/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassBlankLine.java b/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassBlankLine.java new file mode 100644 index 00000000000..a1585fe069c --- /dev/null +++ b/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassBlankLine.java @@ -0,0 +1,7 @@ + +package checks.FileHeaderCheck; + +public class ClassBlankLine { +} +// Compliant + diff --git a/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassDefaultHeader.java b/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassDefaultHeader.java new file mode 100644 index 00000000000..0765af43edc --- /dev/null +++ b/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassDefaultHeader.java @@ -0,0 +1,11 @@ +/* + * + * Copyright (c) - + * + * Please configure this header in your SonarCloud/SonarQube quality profile. + */ +package checks.FileHeaderCheck; + +public class ClassDefaultHeader { +} +// Compliant (default header) diff --git a/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassNoBlankLine.java b/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassNoBlankLine.java new file mode 100644 index 00000000000..006c957bfc8 --- /dev/null +++ b/java-checks-test-sources/default/src/main/java/checks/FileHeaderCheck/ClassNoBlankLine.java @@ -0,0 +1,5 @@ +package checks.FileHeaderCheck; + +public class ClassNoBlankLine { +} +// Compliant diff --git a/java-checks/src/main/java/org/sonar/java/checks/FileHeaderCheck.java b/java-checks/src/main/java/org/sonar/java/checks/FileHeaderCheck.java index a9bd6d7ec8b..fd150b96c1e 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/FileHeaderCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/FileHeaderCheck.java @@ -47,7 +47,6 @@ public class FileHeaderCheck extends IssuableSubscriptionVisitor { defaultValue = "false") public boolean isRegularExpression = false; - private String[] expectedLines; private Pattern searchPattern = null; @Override @@ -58,18 +57,26 @@ public List nodesToVisit() { @Override public void setContext(JavaFileScannerContext context) { super.context = context; - if (isRegularExpression) { - if (searchPattern == null) { - try { - searchPattern = Pattern.compile(getHeaderFormat(), Pattern.DOTALL); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("[" + getClass().getSimpleName() + "] Unable to compile the regular expression: " + headerFormat, e); - } + + if (headerFormat.isEmpty()) { + checkExpectedLines(new String[] {}); + return; + } + + if (!isRegularExpression) { + String[] expectedLines = headerFormat.split("(?:\r)?\n|\r"); + checkExpectedLines(expectedLines); + return; + } + + if (searchPattern == null) { + try { + searchPattern = Pattern.compile(getHeaderFormat(), Pattern.DOTALL); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("[" + getClass().getSimpleName() + "] Unable to compile the regular expression: " + headerFormat, e); } - } else { - expectedLines = headerFormat.split("(?:\r)?\n|\r"); } - visitFile(); + checkRegularExpression(context.getFileContent()); } private String getHeaderFormat() { @@ -80,13 +87,9 @@ private String getHeaderFormat() { return format; } - private void visitFile() { - if (isRegularExpression) { - checkRegularExpression(context.getFileContent()); - } else { - if (!matches(expectedLines, context.getFileLines())) { - addIssueOnFile(MESSAGE); - } + private void checkExpectedLines(String[] expectedLines) { + if (!matches(expectedLines, context.getFileLines())) { + addIssueOnFile(MESSAGE); } } @@ -104,9 +107,9 @@ private static boolean matches(String[] expectedLines, List lines) { result = true; Iterator it = lines.iterator(); - for (int i = 0; i < expectedLines.length; i++) { + for (String expectedLine : expectedLines) { String line = it.next(); - if (!line.equals(expectedLines[i])) { + if (!line.equals(expectedLine)) { result = false; break; } diff --git a/java-checks/src/test/java/org/sonar/java/checks/FileHeaderCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/FileHeaderCheckTest.java index 33036f91e98..ce63e249b4a 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/FileHeaderCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/FileHeaderCheckTest.java @@ -98,6 +98,26 @@ void test() { .onFile(mainCodeSourcesPath("checks/FileHeaderCheck/Class3.java")) .withCheck(check) .verifyNoIssues(); + + check = new FileHeaderCheck(); + check.headerFormat = ""; + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/FileHeaderCheck/ClassBlankLine.java")) + .withCheck(check) + .verifyNoIssues(); + + check = new FileHeaderCheck(); + check.headerFormat = ""; + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/FileHeaderCheck/ClassNoBlankLine.java")) + .withCheck(check) + .verifyNoIssues(); + + check = new FileHeaderCheck(); + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/FileHeaderCheck/ClassDefaultHeader.java")) + .withCheck(check) + .verifyNoIssues(); } @Test @@ -139,6 +159,22 @@ void regex() { .onFile(mainCodeSourcesPath("checks/FileHeaderCheck/Regex4.java")) .withCheck(check) .verifyIssues(); + + check = new FileHeaderCheck(); + check.headerFormat = ""; + check.isRegularExpression = true; + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/FileHeaderCheck/ClassBlankLine.java")) + .withCheck(check) + .verifyNoIssues(); + + check = new FileHeaderCheck(); + check.headerFormat = ""; + check.isRegularExpression = true; + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/FileHeaderCheck/ClassNoBlankLine.java")) + .withCheck(check) + .verifyNoIssues(); } @Test diff --git a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java index 04695b3f062..76b3573c242 100644 --- a/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java +++ b/sonar-java-plugin/src/test/java/org/sonar/plugins/java/JavaSensorTest.java @@ -429,8 +429,8 @@ void do_not_filter_checks_when_no_autoscan() throws IOException { "CustomRepository:CustomMainCheck", "CustomRepository:CustomJspCheck", "CustomRepository:CustomTestCheck", - // not in SonarWay (FileHeaderCheck) - "java:S1451", + // not in SonarWay (CatchUsesExceptionWithContextCheck) + "java:S1166", // main check in SonarWay (DefaultPackageCheck) "java:S1220", // main check in SonarWay, not supported by autoscan (CombineCatchCheck)