]> source.dussan.org Git - sonarqube.git/commitdiff
Fix some quality flaws
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 27 Aug 2014 08:31:46 +0000 (10:31 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 27 Aug 2014 08:31:46 +0000 (10:31 +0200)
28 files changed:
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/MeasureSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SyntaxHighlightingSensor.java
sonar-batch/src/main/java/org/sonar/batch/highlighting/DefaultHighlightingBuilder.java
sonar-batch/src/main/java/org/sonar/batch/highlighting/SyntaxHighlightingDataBuilder.java
sonar-batch/src/main/java/org/sonar/batch/highlighting/SyntaxHighlightingRule.java
sonar-batch/src/main/java/org/sonar/batch/highlighting/SyntaxHighlightingRuleValueCoder.java
sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java
sonar-batch/src/main/java/org/sonar/batch/rule/QProfileEventsDecorator.java
sonar-batch/src/main/java/org/sonar/batch/scan2/DefaultSensorContext.java
sonar-batch/src/main/java/org/sonar/batch/source/DefaultHighlightable.java
sonar-batch/src/test/java/org/sonar/batch/highlighting/DefaultHighlightingBuilderTest.java
sonar-batch/src/test/java/org/sonar/batch/highlighting/SyntaxHighlightingDataBuilderTest.java
sonar-batch/src/test/java/org/sonar/batch/highlighting/SyntaxHighlightingDataTest.java
sonar-batch/src/test/java/org/sonar/batch/mediumtest/highlighting/HighlightingMediumTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/ProjectClasspath.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/DependsUponMavenPlugin.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenPlugin.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenPluginHandler.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenSurefireUtils.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenUtils.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/SensorContext.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/SensorDescriptor.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/duplication/DuplicationGroup.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/highlighting/HighlightingBuilder.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/highlighting/TypeOfText.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/measures/Measure.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java

index 56e013b3716898b9ed30cd06fdf33d87b0a1500e..bc796808f1902e94c0ed6d2fa84da3b642824925 100644 (file)
@@ -60,28 +60,32 @@ public class MeasureSensor implements Sensor {
         int lineNumber = 0;
         for (String line : lines) {
           lineNumber++;
-          if (StringUtils.isBlank(line)) {
+          if (StringUtils.isBlank(line) || line.startsWith("#")) {
             continue;
           }
-          if (line.startsWith("#")) {
-            continue;
-          }
-          try {
-            String metricKey = StringUtils.substringBefore(line, ":");
-            String value = line.substring(metricKey.length() + 1);
-            context.addMeasure(createMeasure(context, inputFile, metricKey, value));
-          } catch (Exception e) {
-            throw new IllegalStateException("Error processing line " + lineNumber + " of file " + measureFile.getAbsolutePath(), e);
-          }
+          processMeasure(inputFile, context, measureFile, lineNumber, line);
         }
       } catch (IOException e) {
-        throw new RuntimeException(e);
+        throw new IllegalStateException(e);
       }
     }
   }
 
+  private void processMeasure(InputFile inputFile, SensorContext context, File measureFile, int lineNumber, String line) {
+    try {
+      String metricKey = StringUtils.substringBefore(line, ":");
+      String value = line.substring(metricKey.length() + 1);
+      context.addMeasure(createMeasure(context, inputFile, metricKey, value));
+    } catch (Exception e) {
+      throw new IllegalStateException("Error processing line " + lineNumber + " of file " + measureFile.getAbsolutePath(), e);
+    }
+  }
+
   private Measure<?> createMeasure(SensorContext context, InputFile xooFile, String metricKey, String value) {
     org.sonar.api.batch.measure.Metric<Serializable> metric = metricFinder.findByKey(metricKey);
+    if (metric == null) {
+      throw new IllegalStateException("Unknow metric with key: " + metricKey);
+    }
     MeasureBuilder<Serializable> builder = context.measureBuilder()
       .forMetric(metric)
       .onFile(xooFile);
index 0ae2395444270a0d5d8b088230ae6db58187929e..ca2f6b5e0ace2c042346c0c1ba311404900024b0 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.xoo.lang;
 
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+
 import com.google.common.base.Splitter;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
@@ -64,7 +66,7 @@ public class SyntaxHighlightingSensor implements Sensor {
             Iterator<String> split = Splitter.on(":").split(line).iterator();
             int startOffset = Integer.parseInt(split.next());
             int endOffset = Integer.parseInt(split.next());
-            HighlightingBuilder.TypeOfText type = HighlightingBuilder.TypeOfText.forCssClass(split.next());
+            TypeOfText type = TypeOfText.forCssClass(split.next());
             highlightingBuilder.highlight(startOffset, endOffset, type);
           } catch (Exception e) {
             throw new IllegalStateException("Error processing line " + lineNumber + " of file " + highlightingFile.getAbsolutePath(), e);
index 1399f66a438a09813da32a1b172be3a643490e8c..6682e32536cf43867cb71362e0ec19c0a0995402 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.highlighting;
 
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+
 import com.google.common.base.Preconditions;
 import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder;
 import org.sonar.batch.index.ComponentDataCache;
index aba6bd66029c72c951c0738aec74d7eecf8609a9..80e784d42110e55111400721c3b9db497a37bdb9 100644 (file)
  */
 package org.sonar.batch.highlighting;
 
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Ordering;
 import org.elasticsearch.common.collect.Sets;
-import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder;
 
 import javax.annotation.Nullable;
 
@@ -52,7 +53,7 @@ public class SyntaxHighlightingDataBuilder {
     return syntaxHighlightingRuleSet;
   }
 
-  public SyntaxHighlightingDataBuilder registerHighlightingRule(int startOffset, int endOffset, HighlightingBuilder.TypeOfText typeOfText) {
+  public SyntaxHighlightingDataBuilder registerHighlightingRule(int startOffset, int endOffset, TypeOfText typeOfText) {
     SyntaxHighlightingRule syntaxHighlightingRule = SyntaxHighlightingRule.create(startOffset, endOffset,
       typeOfText);
     this.syntaxHighlightingRuleSet.add(syntaxHighlightingRule);
index 9ccf5758557e38c84019edcdef452f9a96590633..bcfab67f476c426ebb1fdc4ab2a0064bf38b974a 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.batch.highlighting;
 
-import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder;
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
 
 import java.io.Serializable;
 
@@ -27,15 +27,15 @@ public class SyntaxHighlightingRule implements Serializable {
 
   private final int startPosition;
   private final int endPosition;
-  private final HighlightingBuilder.TypeOfText textType;
+  private final TypeOfText textType;
 
-  private SyntaxHighlightingRule(int startPosition, int endPosition, HighlightingBuilder.TypeOfText textType) {
+  private SyntaxHighlightingRule(int startPosition, int endPosition, TypeOfText textType) {
     this.startPosition = startPosition;
     this.endPosition = endPosition;
     this.textType = textType;
   }
 
-  public static SyntaxHighlightingRule create(int startPosition, int endPosition, HighlightingBuilder.TypeOfText textType) {
+  public static SyntaxHighlightingRule create(int startPosition, int endPosition, TypeOfText textType) {
     return new SyntaxHighlightingRule(startPosition, endPosition, textType);
   }
 
@@ -47,7 +47,7 @@ public class SyntaxHighlightingRule implements Serializable {
     return endPosition;
   }
 
-  public HighlightingBuilder.TypeOfText getTextType() {
+  public TypeOfText getTextType() {
     return textType;
   }
 }
index 4cc9ea53ab8b8b922b114f09bc12e7f72cd83e0e..3d69f717c6b3085f43577b2fdba7f084df507a6f 100644 (file)
  */
 package org.sonar.batch.highlighting;
 
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+
 import com.persistit.Value;
 import com.persistit.encoding.CoderContext;
 import com.persistit.encoding.ValueCoder;
-import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder;
 
 class SyntaxHighlightingRuleValueCoder implements ValueCoder {
 
@@ -38,7 +39,7 @@ class SyntaxHighlightingRuleValueCoder implements ValueCoder {
   public Object get(Value value, Class clazz, CoderContext context) {
     int startPosition = value.getInt();
     int endPosition = value.getInt();
-    HighlightingBuilder.TypeOfText type = HighlightingBuilder.TypeOfText.values()[value.getInt()];
+    TypeOfText type = TypeOfText.values()[value.getInt()];
     return SyntaxHighlightingRule.create(startPosition, endPosition, type);
   }
 }
index 2905cc6b0d786886360f78e3ce74462d5bbec8c7..bdb052ddc1ec4a78a6bad3f41fc82cfd2b1b4367 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.mediumtest;
 
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+
 import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +32,6 @@ import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.InputPath;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.sensor.duplication.DuplicationGroup;
-import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder;
 import org.sonar.api.batch.sensor.issue.Issue;
 import org.sonar.api.batch.sensor.measure.Measure;
 import org.sonar.api.batch.sensor.symbol.Symbol;
@@ -291,12 +292,12 @@ public class BatchMediumTester {
      * @param charIndex 0-based offset in file
      */
     @CheckForNull
-    public List<HighlightingBuilder.TypeOfText> highlightingTypeFor(InputFile file, int charIndex) {
+    public List<TypeOfText> highlightingTypeFor(InputFile file, int charIndex) {
       SyntaxHighlightingData syntaxHighlightingData = highlightingPerFile.get(file);
       if (syntaxHighlightingData == null) {
         return null;
       }
-      List<HighlightingBuilder.TypeOfText> result = new ArrayList<HighlightingBuilder.TypeOfText>();
+      List<TypeOfText> result = new ArrayList<TypeOfText>();
       for (SyntaxHighlightingRule sortedRule : syntaxHighlightingData.syntaxHighlightingRuleSet()) {
         if (sortedRule.getStartPosition() <= charIndex && sortedRule.getEndPosition() > charIndex) {
           result.add(sortedRule.getTextType());
@@ -341,6 +342,7 @@ public class BatchMediumTester {
     }
 
     public FakeGlobalReferentialsLoader add(Metric metric) {
+      Boolean optimizedBestValue = metric.isOptimizedBestValue();
       ref.metrics().add(new org.sonar.batch.protocol.input.Metric(metricId,
         metric.key(),
         metric.getType().name(),
@@ -351,7 +353,7 @@ public class BatchMediumTester {
         metric.getUserManaged(),
         metric.getWorstValue(),
         metric.getBestValue(),
-        metric.isOptimizedBestValue()));
+        optimizedBestValue != null ? optimizedBestValue : false));
       metricId++;
       return this;
     }
index 28c1fea24c3a68e6a6bfdb8f1f22c834a7f30dbb..3de4a4b985b963b5b617a04a460b44a9b1f1dee5 100644 (file)
@@ -84,7 +84,20 @@ public class QProfileEventsDecorator implements Decorator {
     Measure currentMeasure = context.getMeasure(CoreMetrics.QUALITY_PROFILES);
     Map<String, QProfile> currentProfiles = UsedQProfiles.fromJson(currentMeasure.getData()).profilesByKey();
 
-    // Detect new profiles or updated profiles
+    detectNewOrUpdatedProfiles(context, previousProfiles, currentProfiles);
+
+    detectNoMoreUsedProfiles(context, previousProfiles, currentProfiles);
+  }
+
+  private void detectNoMoreUsedProfiles(DecoratorContext context, Map<String, QProfile> previousProfiles, Map<String, QProfile> currentProfiles) {
+    for (QProfile previousProfile : previousProfiles.values()) {
+      if (!currentProfiles.containsKey(previousProfile.getKey())) {
+        markAsRemoved(context, previousProfile);
+      }
+    }
+  }
+
+  private void detectNewOrUpdatedProfiles(DecoratorContext context, Map<String, QProfile> previousProfiles, Map<String, QProfile> currentProfiles) {
     for (QProfile profile : currentProfiles.values()) {
       QProfile previousProfile = previousProfiles.get(profile.getKey());
       if (previousProfile != null) {
@@ -95,13 +108,6 @@ public class QProfileEventsDecorator implements Decorator {
         markAsAdded(context, profile);
       }
     }
-
-    // Detect profiles that are not used anymore
-    for (QProfile previousProfile : previousProfiles.values()) {
-      if (!currentProfiles.containsKey(previousProfile.getKey())) {
-        markAsRemoved(context, previousProfile);
-      }
-    }
   }
 
   private void markAsChanged(DecoratorContext context, QProfile previousProfile, QProfile profile) {
index afd21a8d358c235cd139e61f106c5ba32a2099b4..74b13c2e43e6ca52b2a2553f283ae4cb8ded0872 100644 (file)
@@ -130,8 +130,9 @@ public class DefaultSensorContext implements SensorContext {
 
   @Override
   public void addMeasure(Measure<?> measure) {
-    if (measure.inputFile() != null) {
-      measureCache.put(def.getKey(), ComponentKeys.createEffectiveKey(def.getKey(), measure.inputFile()), (DefaultMeasure) measure);
+    InputFile inputFile = measure.inputFile();
+    if (inputFile != null) {
+      measureCache.put(def.getKey(), ComponentKeys.createEffectiveKey(def.getKey(), inputFile), (DefaultMeasure) measure);
     } else {
       measureCache.put(def.getKey(), def.getKey(), (DefaultMeasure) measure);
     }
index b290c9a0dc93da2b3165348e963b8a2e7b0bf8c2..0fbedcaeb22bee5ecad8cf746b6d4cacf765238a 100644 (file)
@@ -19,7 +19,8 @@
  */
 package org.sonar.batch.source;
 
-import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText;
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+
 import org.sonar.api.component.Component;
 import org.sonar.api.source.Highlightable;
 import org.sonar.batch.highlighting.SyntaxHighlightingDataBuilder;
@@ -71,7 +72,7 @@ public class DefaultHighlightable implements Highlightable {
 
     @Override
     public HighlightingBuilder highlight(int startOffset, int endOffset, String typeOfText) {
-      TypeOfText type = org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText.forCssClass(typeOfText);
+      TypeOfText type = org.sonar.api.batch.sensor.highlighting.TypeOfText.forCssClass(typeOfText);
       builder.registerHighlightingRule(startOffset, endOffset, type);
       return this;
     }
index aefc5afd73298a9eb3b31a44c194fe069cbca4e4..dcfdb8a14300562d1c3796416dad647637820081 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.batch.highlighting;
 
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
-import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText;
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
 import org.sonar.batch.index.ComponentDataCache;
 import org.sonar.core.source.SnapshotDataTypes;
 
index 4b192a477312c4e5f937f0bd562bf70d8fe94437..c132dcba47792695fc3778f36edf5fae3d58a904 100644 (file)
@@ -27,9 +27,9 @@ import org.junit.rules.ExpectedException;
 import java.util.Collection;
 
 import static org.fest.assertions.Assertions.assertThat;
-import static org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText.CLASSIC_COMMENT;
-import static org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText.CPP_DOC;
-import static org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText.KEYWORD;
+import static org.sonar.api.batch.sensor.highlighting.TypeOfText.COMMENT;
+import static org.sonar.api.batch.sensor.highlighting.TypeOfText.CPP_DOC;
+import static org.sonar.api.batch.sensor.highlighting.TypeOfText.KEYWORD;
 
 public class SyntaxHighlightingDataBuilderTest {
 
@@ -42,12 +42,12 @@ public class SyntaxHighlightingDataBuilderTest {
   public void setUpSampleRules() {
 
     SyntaxHighlightingDataBuilder highlightingDataBuilder = new SyntaxHighlightingDataBuilder();
-    highlightingDataBuilder.registerHighlightingRule(0, 10, CLASSIC_COMMENT);
+    highlightingDataBuilder.registerHighlightingRule(0, 10, COMMENT);
     highlightingDataBuilder.registerHighlightingRule(10, 12, KEYWORD);
     highlightingDataBuilder.registerHighlightingRule(24, 38, KEYWORD);
     highlightingDataBuilder.registerHighlightingRule(42, 50, KEYWORD);
     highlightingDataBuilder.registerHighlightingRule(24, 65, CPP_DOC);
-    highlightingDataBuilder.registerHighlightingRule(12, 20, CLASSIC_COMMENT);
+    highlightingDataBuilder.registerHighlightingRule(12, 20, COMMENT);
 
     highlightingRules = highlightingDataBuilder.getSyntaxHighlightingRuleSet();
   }
@@ -61,7 +61,7 @@ public class SyntaxHighlightingDataBuilderTest {
   public void should_order_by_start_then_end_offset() throws Exception {
     assertThat(highlightingRules).onProperty("startPosition").containsOnly(0, 10, 12, 24, 24, 42);
     assertThat(highlightingRules).onProperty("endPosition").containsOnly(10, 12, 20, 38, 65, 50);
-    assertThat(highlightingRules).onProperty("textType").containsOnly(CLASSIC_COMMENT, KEYWORD, CLASSIC_COMMENT, KEYWORD, CPP_DOC, KEYWORD);
+    assertThat(highlightingRules).onProperty("textType").containsOnly(COMMENT, KEYWORD, COMMENT, KEYWORD, CPP_DOC, KEYWORD);
   }
 
   @Test
index 75a78d1becd1308536458cc72d28c011bbd14e77..c7ab820408c7f0640344a9a7ba38c32091670eab 100644 (file)
@@ -25,9 +25,9 @@ import org.junit.Test;
 import java.util.List;
 
 import static org.fest.assertions.Assertions.assertThat;
-import static org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText.CLASSIC_COMMENT;
-import static org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText.CPP_DOC;
-import static org.sonar.api.batch.sensor.highlighting.HighlightingBuilder.TypeOfText.KEYWORD;
+import static org.sonar.api.batch.sensor.highlighting.TypeOfText.COMMENT;
+import static org.sonar.api.batch.sensor.highlighting.TypeOfText.CPP_DOC;
+import static org.sonar.api.batch.sensor.highlighting.TypeOfText.KEYWORD;
 
 public class SyntaxHighlightingDataTest {
 
@@ -35,9 +35,9 @@ public class SyntaxHighlightingDataTest {
   public void should_serialize_rules_to_string() throws Exception {
 
     List<SyntaxHighlightingRule> orderedHighlightingRules = Lists.newArrayList(
-      SyntaxHighlightingRule.create(0, 10, CLASSIC_COMMENT),
+      SyntaxHighlightingRule.create(0, 10, COMMENT),
       SyntaxHighlightingRule.create(10, 12, KEYWORD),
-      SyntaxHighlightingRule.create(12, 20, CLASSIC_COMMENT),
+      SyntaxHighlightingRule.create(12, 20, COMMENT),
       SyntaxHighlightingRule.create(24, 38, KEYWORD),
       SyntaxHighlightingRule.create(24, 65, CPP_DOC),
       SyntaxHighlightingRule.create(42, 50, KEYWORD)
index b55a2125cbeaf7e53b52a1dc9e60346be2d6f27a..b6ce7fb7d527d2b2c34b12c2da521333c043e0ff 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.mediumtest.highlighting;
 
+import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+
 import com.google.common.collect.ImmutableMap;
 import org.apache.commons.io.FileUtils;
 import org.junit.After;
@@ -28,7 +30,6 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
 import org.sonar.api.batch.fs.InputFile;
-import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder;
 import org.sonar.batch.mediumtest.BatchMediumTester;
 import org.sonar.batch.mediumtest.BatchMediumTester.TaskResult;
 import org.sonar.xoo.XooPlugin;
@@ -87,10 +88,10 @@ public class HighlightingMediumTest {
       .start();
 
     InputFile file = result.inputFiles().get(0);
-    assertThat(result.highlightingTypeFor(file, 0)).containsExactly(HighlightingBuilder.TypeOfText.STRING);
-    assertThat(result.highlightingTypeFor(file, 9)).containsExactly(HighlightingBuilder.TypeOfText.STRING);
+    assertThat(result.highlightingTypeFor(file, 0)).containsExactly(TypeOfText.STRING);
+    assertThat(result.highlightingTypeFor(file, 9)).containsExactly(TypeOfText.STRING);
     assertThat(result.highlightingTypeFor(file, 10)).isEmpty();
-    assertThat(result.highlightingTypeFor(file, 11)).containsExactly(HighlightingBuilder.TypeOfText.KEYWORD);
+    assertThat(result.highlightingTypeFor(file, 11)).containsExactly(TypeOfText.KEYWORD);
 
   }
 
@@ -126,7 +127,7 @@ public class HighlightingMediumTest {
     System.out.println("Duration: " + (System.currentTimeMillis() - start));
 
     InputFile file = result.inputFiles().get(0);
-    assertThat(result.highlightingTypeFor(file, 0)).containsExactly(HighlightingBuilder.TypeOfText.STRING);
+    assertThat(result.highlightingTypeFor(file, 0)).containsExactly(TypeOfText.STRING);
 
   }
 
index eac312f7cfc92aa1200841da26a5e2cb8cf2a012..6af187f63151dbebc2ebb1c84f9ad9fdf7b555e5 100644 (file)
@@ -33,7 +33,9 @@ import java.util.List;
 
 /**
  * @since 2.2
+ * @deprecated since 4.5 this is some Java specific stuff that should by handled by SQ Java plugin
  */
+@Deprecated
 public class ProjectClasspath implements BatchComponent {
 
   protected MavenProject pom;
index 39888e030c39dc46bf344a1b8e79d597b696503f..34611ea5d98a8958e781f2ea874437f95c6aae0a 100644 (file)
@@ -22,8 +22,6 @@ package org.sonar.api.batch.fs.internal;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.utils.PathUtils;
 
-import javax.annotation.CheckForNull;
-
 import java.io.File;
 import java.io.Serializable;
 
@@ -50,12 +48,7 @@ public class DefaultInputFile implements InputFile, Serializable {
     return relativePath;
   }
 
-  /**
-   * Marked as nullable just for the unit tests that do not call {@link #setFile(java.io.File)}
-   * previously.
-   */
   @Override
-  @CheckForNull
   public String absolutePath() {
     return absolutePath;
   }
@@ -68,11 +61,6 @@ public class DefaultInputFile implements InputFile, Serializable {
     return new File(absolutePath);
   }
 
-  /**
-   * Marked as nullable just for the unit tests that do not call {@link #setLanguage(String)}
-   * previously.
-   */
-  @CheckForNull
   @Override
   public String language() {
     return language;
@@ -84,20 +72,16 @@ public class DefaultInputFile implements InputFile, Serializable {
   }
 
   /**
-   * Marked as nullable just for the unit tests that do not previously call
    * {@link #setStatus(org.sonar.api.batch.fs.InputFile.Status)}
    */
-  @CheckForNull
   @Override
   public Status status() {
     return status;
   }
 
   /**
-   * Digest hash of the file. Marked as nullable just for the unit tests
-   * that do not previously call {@link #setHash(String)}
+   * Digest hash of the file.
    */
-  @CheckForNull
   public String hash() {
     return hash;
   }
index 0e590c84593bc30cadea6456becbf2ccd4d982e4..87b7545937378b97caf9c223df950c0de4c6344d 100644 (file)
@@ -33,7 +33,9 @@ import org.sonar.api.resources.Project;
  * </p>
  * 
  * @since 1.10
+ * @deprecated since 4.5 we don't want any dependency on Maven anymore
  */
+@Deprecated
 @SupportedEnvironment("maven")
 public interface DependsUponMavenPlugin extends BatchExtension {
 
index 0f3da165a07b93e04719fea6bb8dd1a1583d3d1c..7df378027eb90a9365ff7f7b111225c8667d7df6 100644 (file)
@@ -34,7 +34,9 @@ import java.util.List;
  * A class to handle maven plugins
  *
  * @since 1.10
+ * @deprecated since 4.5 we don't want any dependency on Maven anymore
  */
+@Deprecated
 public class MavenPlugin {
 
   private static final String CONFIGURATION_ELEMENT = "configuration";
index 6e98b50219db3b5084c7cd612f97e265a3ef172d..5f98c19c528251b2490039fc5c2625fa7303ba82 100644 (file)
@@ -27,7 +27,9 @@ import javax.annotation.Nullable;
 
 /**
  * @since 1.10
+ * @deprecated since 4.5 we don't want any dependency on Maven anymore
  */
+@Deprecated
 public interface MavenPluginHandler extends BatchExtension {
 
   /**
index 2a3aed4cb324c42b4c4bfc0a1c824f1010adf689..fed72d6f041a3403221ba88577ca88748c1d173d 100644 (file)
@@ -23,7 +23,9 @@ import org.sonar.api.resources.Project;
 
 /**
  * @since 1.10
+ * @deprecated since 4.5 we don't want any dependency on Maven anymore
  */
+@Deprecated
 public final class MavenSurefireUtils {
 
   public static final String GROUP_ID = MavenUtils.GROUP_ID_APACHE_MAVEN;
index 5419b7bc1e0828196e4cf6bee45c5633c543a67c..6fc76d56d9a2a68da7f6abf3ce91c430d479be15 100644 (file)
@@ -32,7 +32,9 @@ import java.util.Collection;
  * An utility class to manipulate Maven concepts
  *
  * @since 1.10
+ * @deprecated since 4.5 we don't want any dependency on Maven anymore
  */
+@Deprecated
 public final class MavenUtils {
 
   private static final String MAVEN_COMPILER_PLUGIN = "maven-compiler-plugin";
index d572d974af4b5c9644cb0d8bc947d752d8e67608..7465126c3e1c02339626683bebc60d792ae05671 100644 (file)
@@ -134,7 +134,7 @@ public interface SensorContext {
   // ------------ DUPLICATIONS ------------
 
   /**
-   * Builder to define tokens in a file. Tokens are used to compute duplication by the core.
+   * Builder to define tokens in a file. Tokens are used to compute duplication using default SonarQube engine.
    * @since 4.5
    */
   DuplicationTokenBuilder duplicationTokenBuilder(InputFile inputFile);
index 3d4a3d913a5f0461e8d9dec46c62e2986ef4f6ed..9fcd030e553f496d29d48215cae640138006b947 100644 (file)
@@ -56,7 +56,7 @@ public interface SensorDescriptor {
   /**
    * List {@link InputFile.Type} this {@link Sensor} work on. May be used by the platform to skip execution of the {@link Sensor} when
    * no file for given type are present in the project.
-   * If not type is provided then it will be executed for all types.
+   * If you don't call this method then it means sensor is working on all input file types.
    */
   SensorDescriptor workOnFileTypes(InputFile.Type... types);
 
index 9061e9165e3a7fb5508f3526422cf445bef56382..280e81062469c3194ebebd560decdc259fcf76a2 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.api.batch.sensor.duplication;
 
 import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
 import org.sonar.api.batch.sensor.SensorContext;
@@ -137,6 +138,17 @@ public class DuplicationGroup {
     return equalsBuilder.isEquals();
   }
 
+  @Override
+  public int hashCode() {
+    HashCodeBuilder hcBuilder = new HashCodeBuilder(17, 37)
+      .append(originBlock)
+      .append(duplicates.size());
+    for (int i = 0; i < duplicates.size(); i++) {
+      hcBuilder.append(duplicates.get(i));
+    }
+    return hcBuilder.toHashCode();
+  }
+
   @Override
   public String toString() {
     return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).
index 0acc7848e2249ca12841335e77b3369688cf6f0c..d969ba49a03ab6223cb7097212f3aa68e2925136 100644 (file)
@@ -25,43 +25,6 @@ package org.sonar.api.batch.sensor.highlighting;
  */
 public interface HighlightingBuilder {
 
-  /**
-   * See sonar-colorizer.css
-   */
-  enum TypeOfText {
-    ANNOTATION("a"),
-    CONSTANT("c"),
-    JAVADOC("j"),
-    CLASSIC_COMMENT("cd"),
-    CPP_DOC("cppd"),
-    KEYWORD("k"),
-    STRING("s"),
-    KEYWORD_LIGHT("h"),
-    PREPROCESS_DIRECTIVE("p");
-
-    private final String cssClass;
-
-    private TypeOfText(String cssClass) {
-      this.cssClass = cssClass;
-    }
-
-    public static TypeOfText forCssClass(String cssClass) {
-      for (TypeOfText typeOfText : TypeOfText.values()) {
-        if (typeOfText.cssClass().equals(cssClass)) {
-          return typeOfText;
-        }
-      }
-      throw new IllegalArgumentException("No TypeOfText for CSS class " + cssClass);
-    }
-
-    /**
-     * For internal use
-     */
-    public String cssClass() {
-      return cssClass;
-    }
-  }
-
   /**
    * Call this method to indicate the type of text in a range.
    * @param startOffset Starting position in file for this type of text. Beginning of a file starts with offset '0'.
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/highlighting/TypeOfText.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/highlighting/TypeOfText.java
new file mode 100644 (file)
index 0000000..ae42794
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.batch.sensor.highlighting;
+
+/**
+ * Possible types for highlighting code.
+ * See sonar-colorizer.css
+ * @since 4.5
+ */
+public enum TypeOfText {
+  ANNOTATION("a"),
+  CONSTANT("c"),
+  COMMENT("cd"),
+  /**
+   * @deprecated use {@link #COMMENT}
+   */
+  @Deprecated
+  CPP_DOC("cppd"),
+  /**
+   * For example Javadoc
+   */
+  STRUCTURED_COMMENT("j"),
+  KEYWORD("k"),
+  STRING("s"),
+  KEYWORD_LIGHT("h"),
+  PREPROCESS_DIRECTIVE("p");
+
+  private final String cssClass;
+
+  private TypeOfText(String cssClass) {
+    this.cssClass = cssClass;
+  }
+
+  public static TypeOfText forCssClass(String cssClass) {
+    for (TypeOfText typeOfText : TypeOfText.values()) {
+      if (typeOfText.cssClass().equals(cssClass)) {
+        return typeOfText;
+      }
+    }
+    throw new IllegalArgumentException("No TypeOfText for CSS class " + cssClass);
+  }
+
+  /**
+   * For internal use
+   */
+  public String cssClass() {
+    return cssClass;
+  }
+}
index 870a8519271c35c9d420771187d97ffaf0acd180..af2022282529adb07c4a7f7fca9a6bca08719b43 100644 (file)
@@ -679,9 +679,10 @@ public class Measure<G extends Serializable> implements Serializable {
    * @since 3.2
    */
   public boolean isBestValue() {
+    Double bestValue = metric.getBestValue();
     return metric.isOptimizedBestValue() == Boolean.TRUE
-      && metric.getBestValue() != null
-      && (value == null || NumberUtils.compare(metric.getBestValue(), value) == 0)
+      && bestValue != null
+      && (value == null || NumberUtils.compare(bestValue, value) == 0)
       && allNull(alertStatus, description, tendency, url, data)
       && isZeroVariation(variation1, variation2, variation3, variation4, variation5);
   }
index 93f874c8af7322b8c6c5e1d6296646683d205a78..5e16b420c2ebb7a6a5c283b117cf70518aa2113c 100644 (file)
@@ -475,7 +475,7 @@ public class Metric<G extends Serializable> implements ServerExtension, BatchExt
   /**
    * @return this
    */
-  public Metric setWorstValue(Double d) {
+  public Metric setWorstValue(@Nullable Double d) {
     this.worstValue = d;
     return this;
   }
@@ -484,7 +484,7 @@ public class Metric<G extends Serializable> implements ServerExtension, BatchExt
    * @param bestValue the best value. It can be null.
    * @return this
    */
-  public Metric setBestValue(Double bestValue) {
+  public Metric setBestValue(@Nullable Double bestValue) {
     this.bestValue = bestValue;
     return this;
   }
@@ -516,7 +516,7 @@ public class Metric<G extends Serializable> implements ServerExtension, BatchExt
     return ValueType.PERCENT.equals(type);
   }
 
-  public Metric setOptimizedBestValue(Boolean b) {
+  public Metric setOptimizedBestValue(@Nullable Boolean b) {
     this.optimizedBestValue = b;
     return this;
   }