]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3644 Fix issues notified during testing
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 12 Sep 2013 07:17:20 +0000 (09:17 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 12 Sep 2013 07:19:20 +0000 (09:19 +0200)
Fix issue with empty end block pattern
Change labels for batch messages (configuration exceptions)

plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/issue/ignore/pattern/PatternDecoder.java
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/issue/ignore/scanner/RegexpScanner.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/issue/ignore/pattern/PatternDecoderTest.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/issue/ignore/pattern/PatternsInitializerTest.java

index 03542237fb7d6e66d95d03217c5687d79515d1c4..8a2b8e289095060a4d22ee26d2aec20be446cb5a 100644 (file)
@@ -31,6 +31,7 @@ public class PatternDecoder {
 
   private static final int THREE_FIELDS_PER_LINE = 3;
   private static final String LINE_RANGE_REGEXP = "\\[((\\d+|\\d+-\\d+),?)*\\]";
+  private static final String CONFIG_FORMAT_ERROR_PREFIX = "Exclusions > Issues : Invalid format. ";
 
   public List<Pattern> decode(String patternsList) {
     List<Pattern> patterns = Lists.newLinkedList();
@@ -54,7 +55,7 @@ public class PatternDecoder {
 
     String[] fields = StringUtils.splitPreserveAllTokens(line, ';');
     if (fields.length > THREE_FIELDS_PER_LINE) {
-      throw new SonarException("Invalid format. The following line has more than 3 fields separated by comma: " + line);
+      throw new SonarException(CONFIG_FORMAT_ERROR_PREFIX + "The following line has more than 3 fields separated by comma: " + line);
     }
 
     Pattern pattern;
@@ -75,28 +76,26 @@ public class PatternDecoder {
 
   static void checkRegularLineConstraints(String line, String[] fields) {
     if (!isResource(fields[0])) {
-      throw new SonarException("Invalid format. The first field does not define a resource pattern: " + line);
+      throw new SonarException(CONFIG_FORMAT_ERROR_PREFIX + "The first field does not define a resource pattern: " + line);
     }
     if (!isRule(fields[1])) {
-      throw new SonarException("Invalid format. The second field does not define a rule pattern: " + line);
+      throw new SonarException(CONFIG_FORMAT_ERROR_PREFIX + "The second field does not define a rule pattern: " + line);
     }
     if (!isLinesRange(fields[2])) {
-      throw new SonarException("Invalid format. The third field does not define a range of lines: " + line);
+      throw new SonarException(CONFIG_FORMAT_ERROR_PREFIX + "The third field does not define a range of lines: " + line);
     }
   }
 
   static void checkDoubleRegexpLineConstraints(String line, String[] fields) {
     if (!isRegexp(fields[0])) {
-      throw new SonarException("Invalid format. The first field does not define a regular expression: " + line);
-    }
-    if (!isRegexp(fields[1])) {
-      throw new SonarException("Invalid format. The second field does not define a regular expression: " + line);
+      throw new SonarException(CONFIG_FORMAT_ERROR_PREFIX + "The first field does not define a regular expression: " + line);
     }
+    // As per configuration help, missing second field means: from start regexp to EOF
   }
 
   static void checkWholeFileRegexp(String regexp) {
     if (!isRegexp(regexp)) {
-      throw new SonarException("Invalid format. The field does not define a regular expression: " + regexp);
+      throw new SonarException(CONFIG_FORMAT_ERROR_PREFIX + "The field does not define a regular expression: " + regexp);
     }
   }
 
index 98985fa2992eedc3b07cb118bc506a1e48a523d4..edd107c7e9ee24a3d7c0dc3aa58426a6d1141a52 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.sonar.plugins.core.issue.ignore.scanner;
 
+import org.apache.commons.lang.StringUtils;
+
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.commons.io.FileUtils;
@@ -102,6 +104,11 @@ public class RegexpScanner implements BatchExtension {
       checkDoubleRegexps(line, lineIndex);
     }
 
+    if (currentMatcher != null && !currentMatcher.hasSecondPattern()) {
+      // this will happen when there is a start block regexp but no end block regexp
+      endExclusion(lineIndex + 1);
+    }
+
     // now create the new line-based pattern for this file if there are exclusions
     fileLength = lineIndex;
     if (!lineExclusions.isEmpty()) {
@@ -181,9 +188,12 @@ public class RegexpScanner implements BatchExtension {
     }
 
     boolean matchesSecondPattern(String line) {
-      return secondPattern.matcher(line).find();
+      return hasSecondPattern() && secondPattern.matcher(line).find();
     }
 
+    boolean hasSecondPattern() {
+      return StringUtils.isNotEmpty(secondPattern.toString());
+    }
   }
 
 }
index c6d4a0d8a5b40ea1febe5b817670aa33f787e215..27ccd5eb81ea762706adf070883e3dd9c3a5cea1 100644 (file)
@@ -140,7 +140,7 @@ public class PatternDecoderTest {
   @Test
   public void shouldFailToReadUncorrectLine1() {
     thrown.expect(SonarException.class);
-    thrown.expectMessage("Invalid format. The following line has more than 3 fields separated by comma");
+    thrown.expectMessage("Exclusions > Issues : Invalid format. The following line has more than 3 fields separated by comma");
 
     decoder.decode(";;;;");
   }
@@ -148,7 +148,7 @@ public class PatternDecoderTest {
   @Test
   public void shouldFailToReadUncorrectLine3() {
     thrown.expect(SonarException.class);
-    thrown.expectMessage("Invalid format. The first field does not define a resource pattern");
+    thrown.expectMessage("Exclusions > Issues : Invalid format. The first field does not define a resource pattern");
 
     decoder.decode(";*;*");
   }
@@ -156,7 +156,7 @@ public class PatternDecoderTest {
   @Test
   public void shouldFailToReadUncorrectLine4() {
     thrown.expect(SonarException.class);
-    thrown.expectMessage("Invalid format. The second field does not define a rule pattern");
+    thrown.expectMessage("Exclusions > Issues : Invalid format. The second field does not define a rule pattern");
 
     decoder.decode("*;;*");
   }
@@ -164,7 +164,7 @@ public class PatternDecoderTest {
   @Test
   public void shouldFailToReadUncorrectLine5() {
     thrown.expect(SonarException.class);
-    thrown.expectMessage("Invalid format. The third field does not define a range of lines");
+    thrown.expectMessage("Exclusions > Issues : Invalid format. The third field does not define a range of lines");
 
     decoder.decode("*;*;blabla");
   }
@@ -172,16 +172,17 @@ public class PatternDecoderTest {
   @Test
   public void shouldFailToReadUncorrectLine6() {
     thrown.expect(SonarException.class);
-    thrown.expectMessage("Invalid format. The first field does not define a regular expression");
+    thrown.expectMessage("Exclusions > Issues : Invalid format. The first field does not define a regular expression");
 
     decoder.decode(";ON");
   }
 
   @Test
-  public void shouldFailToReadUncorrectLine7() {
-    thrown.expect(SonarException.class);
-    thrown.expectMessage("Invalid format. The second field does not define a regular expression");
+  public void shouldAcceptEmptyEndBlockRegexp() {
+    Pattern pattern = decoder.decodeLine("OFF;");
 
-    decoder.decode("OFF;");
+    assertThat(pattern.getResourcePattern()).isNull();
+    assertThat(pattern.getBeginBlockRegexp()).isEqualTo("OFF");
+    assertThat(pattern.getEndBlockRegexp()).isEmpty();
   }
 }
index da78f3c5b955347aad44beb0e682c371160c91d0..5a45b9327e91800ffd1c8a5be97871cb9c671caf 100644 (file)
@@ -124,18 +124,20 @@ public class PatternsInitializerTest {
 
   @Test
   public void shouldReturnBlockPattern() {
-    settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY, "1,2");
+    settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY, "1,2,3");
     settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".1." + IgnoreIssuesConfiguration.BEGIN_BLOCK_REGEXP, "// SONAR-OFF");
     settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".1." + IgnoreIssuesConfiguration.END_BLOCK_REGEXP, "// SONAR-ON");
     settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".2." + IgnoreIssuesConfiguration.BEGIN_BLOCK_REGEXP, "// FOO-OFF");
     settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".2." + IgnoreIssuesConfiguration.END_BLOCK_REGEXP, "// FOO-ON");
+    settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".3." + IgnoreIssuesConfiguration.BEGIN_BLOCK_REGEXP, "// IGNORE-TO-EOF");
+    settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".3." + IgnoreIssuesConfiguration.END_BLOCK_REGEXP, "");
     patternsInitializer.initPatterns();
 
     assertThat(patternsInitializer.hasConfiguredPatterns()).isTrue();
     assertThat(patternsInitializer.hasFileContentPattern()).isTrue();
     assertThat(patternsInitializer.hasMulticriteriaPatterns()).isFalse();
     assertThat(patternsInitializer.getMulticriteriaPatterns().size()).isEqualTo(0);
-    assertThat(patternsInitializer.getBlockPatterns().size()).isEqualTo(2);
+    assertThat(patternsInitializer.getBlockPatterns().size()).isEqualTo(3);
     assertThat(patternsInitializer.getAllFilePatterns().size()).isEqualTo(0);
   }
 
@@ -147,14 +149,6 @@ public class PatternsInitializerTest {
     patternsInitializer.initPatterns();
   }
 
-  @Test(expected = SonarException.class)
-  public void shouldLogInvalidEndBlockPattern() {
-    settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY, "1");
-    settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".1." + IgnoreIssuesConfiguration.BEGIN_BLOCK_REGEXP, "// SONAR-OFF");
-    settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_BLOCK_KEY + ".1." + IgnoreIssuesConfiguration.END_BLOCK_REGEXP, "");
-    patternsInitializer.initPatterns();
-  }
-
   @Test
   public void shouldReturnAllFilePattern() {
     settings.setProperty(IgnoreIssuesConfiguration.PATTERNS_ALLFILE_KEY, "1,2");