]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5931 Publish new sensor API
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 14 Jan 2015 15:07:49 +0000 (16:07 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Thu, 15 Jan 2015 08:08:58 +0000 (09:08 +0100)
18 files changed:
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/CoveragePerTestSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/DependencySensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/MeasureSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SymbolReferencesSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SyntaxHighlightingSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/TestCaseSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/XooTokenizerSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/CreateIssueByInternalKeySensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/OneIssueOnDirPerFileSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/OneIssuePerLineSensor.java
sonar-batch/src/main/java/org/sonar/batch/scan/SensorWrapper.java
sonar-batch/src/main/java/org/sonar/batch/scan2/AnalyzerOptimizer.java
sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java
sonar-batch/src/test/java/org/sonar/batch/scan2/AnalyzerOptimizerTest.java
sonar-deprecated/src/main/java/org/sonar/api/batch/BatchExtensionDictionnary.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/internal/DefaultSensorDescriptor.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/DefaultSensorDescriptorTest.java

index e16829385c85ff0551de8ed1bd530b807aa708b4..e9963f838450cf7e6f9e47fed727cf36d44cfbeb 100644 (file)
@@ -98,8 +98,8 @@ public class CoveragePerTestSensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("Xoo Coverage Per Test Sensor")
-      .workOnLanguages(Xoo.KEY)
-      .workOnFileTypes(InputFile.Type.TEST);
+      .onlyOnLanguages(Xoo.KEY)
+      .onlyOnFileType(InputFile.Type.TEST);
   }
 
   @Override
index 7ffca61bb62c26a71e28eca7dd05eb0a56853910..a10120028961a2c8e02509305eea169c95f0520f 100644 (file)
@@ -91,8 +91,8 @@ public class DependencySensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("Xoo Dependency Sensor")
-      .workOnLanguages(Xoo.KEY)
-      .workOnFileTypes(InputFile.Type.MAIN);
+      .onlyOnLanguages(Xoo.KEY)
+      .onlyOnFileType(InputFile.Type.MAIN);
   }
 
   @Override
index 5ec2190ce2db57232ea72a9160f303e0128abd8d..471a5835639dc1b2dc2c27b73abe7a06dc8419db 100644 (file)
@@ -112,8 +112,8 @@ public class MeasureSensor implements Sensor {
     descriptor
       .name("Xoo Measure Sensor")
       .provides(CoreMetrics.LINES)
-      .workOnLanguages(Xoo.KEY)
-      .workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST);
+      .onlyOnLanguages(Xoo.KEY)
+      .onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
   }
 
   @Override
index 61131e8b87a2ea791f5992a013768b449d2b73db..fbff5f756419d5b5f06423ef2f4ad1711ba2e5e4 100644 (file)
@@ -87,8 +87,8 @@ public class SymbolReferencesSensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("Xoo Symbol Reference Sensor")
-      .workOnLanguages(Xoo.KEY)
-      .workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST);
+      .onlyOnLanguages(Xoo.KEY)
+      .onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
   }
 
   @Override
index a930c9c8f4ced51695c0bb07928e4303d75647b1..d72b50b4089bad9f12a91305421155d950f7e712 100644 (file)
@@ -85,8 +85,8 @@ public class SyntaxHighlightingSensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("Xoo Highlighting Sensor")
-      .workOnLanguages(Xoo.KEY)
-      .workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST);
+      .onlyOnLanguages(Xoo.KEY)
+      .onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
   }
 
   @Override
index bd297b6117299afadd4cd9b5e37d7b0b8333064f..a406a20a9ca59c3426c31f084cc82b0a53436fec 100644 (file)
@@ -97,8 +97,8 @@ public class TestCaseSensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("Xoo TestPlan Sensor")
-      .workOnLanguages(Xoo.KEY)
-      .workOnFileTypes(InputFile.Type.TEST);
+      .onlyOnLanguages(Xoo.KEY)
+      .onlyOnFileType(InputFile.Type.TEST);
   }
 
   @Override
index ae1c7e2820ac844e7d205e64cceef552c38cac41..3190c9d7712787adbf2e1c44f0bb1e05d2d23fa5 100644 (file)
@@ -61,8 +61,8 @@ public class XooTokenizerSensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("Xoo Tokenizer Sensor")
-      .workOnLanguages(Xoo.KEY)
-      .workOnFileTypes(InputFile.Type.MAIN);
+      .onlyOnLanguages(Xoo.KEY)
+      .onlyOnFileType(InputFile.Type.MAIN);
   }
 
   @Override
index 01b2f8168bd3d2ccb17f0a669bc5f19f0cd164b4..04dc7be446f3507d3442258e9486f4feb2027667 100644 (file)
@@ -34,9 +34,9 @@ public class CreateIssueByInternalKeySensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("CreateIssueByInternalKeySensor")
-      .workOnLanguages(Xoo.KEY)
+      .onlyOnLanguages(Xoo.KEY)
       .createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY)
-      .workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST);
+      .onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
   }
 
   @Override
index 7a2161b10493de0694526c42a2fd307049f5f6c6..548b596c3005c4a65f2d4d09678098d78e81f6d1 100644 (file)
@@ -35,9 +35,9 @@ public class OneIssueOnDirPerFileSensor implements Sensor {
   public void describe(SensorDescriptor descriptor) {
     descriptor
       .name("One Issue On Dir Per File")
-      .workOnLanguages(Xoo.KEY)
+      .onlyOnLanguages(Xoo.KEY)
       .createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY)
-      .workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST);
+      .onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
   }
 
   @Override
index 31db08c01f201a6f57ad07e10b2d4955feac6f32..081bb1a0a2bee41ec49eef6730b2e00fa8b018b8 100644 (file)
@@ -39,9 +39,9 @@ public class OneIssuePerLineSensor implements Sensor {
     descriptor
       .name("One Issue Per Line")
       .dependsOn(CoreMetrics.LINES)
-      .workOnLanguages(Xoo.KEY)
+      .onlyOnLanguages(Xoo.KEY)
       .createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY)
-      .workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST);
+      .onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
   }
 
   @Override
index 4639a8fbd839f54ef004bba73bbd3cc3fa8f9ed7..c316078f71451ea3f9a484b621617a9053b67a47 100644 (file)
@@ -21,18 +21,12 @@ package org.sonar.batch.scan;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.sonar.api.batch.DependedUpon;
-import org.sonar.api.batch.DependsUpon;
-import org.sonar.api.batch.measure.Metric;
 import org.sonar.api.batch.sensor.Sensor;
 import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
 import org.sonar.api.resources.Project;
 import org.sonar.batch.scan2.AnalyzerOptimizer;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class SensorWrapper implements org.sonar.api.batch.Sensor {
 
   private static final Logger LOG = LoggerFactory.getLogger(SensorWrapper.class);
@@ -54,16 +48,6 @@ public class SensorWrapper implements org.sonar.api.batch.Sensor {
     return wrappedSensor;
   }
 
-  @DependedUpon
-  public List<Metric> provides() {
-    return Arrays.asList(descriptor.provides());
-  }
-
-  @DependsUpon
-  public List<Metric> depends() {
-    return Arrays.asList(descriptor.dependsOn());
-  }
-
   @Override
   public boolean shouldExecuteOnProject(Project project) {
     return optimizer.shouldExecute(descriptor);
index 4ae3ddfce095564f48038d31a791a041d59e2bf3..c149a7aea1568e12b82b5805f4da6c881fed94d2 100644 (file)
@@ -24,9 +24,9 @@ import org.slf4j.LoggerFactory;
 import org.sonar.api.BatchComponent;
 import org.sonar.api.batch.fs.FilePredicate;
 import org.sonar.api.batch.fs.FileSystem;
-import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.rule.ActiveRules;
 import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
+import org.sonar.api.config.Settings;
 
 public class AnalyzerOptimizer implements BatchComponent {
 
@@ -34,10 +34,12 @@ public class AnalyzerOptimizer implements BatchComponent {
 
   private final FileSystem fs;
   private final ActiveRules activeRules;
+  private final Settings settings;
 
-  public AnalyzerOptimizer(FileSystem fs, ActiveRules activeRules) {
+  public AnalyzerOptimizer(FileSystem fs, ActiveRules activeRules, Settings settings) {
     this.fs = fs;
     this.activeRules = activeRules;
+    this.settings = settings;
   }
 
   /**
@@ -52,6 +54,21 @@ public class AnalyzerOptimizer implements BatchComponent {
       LOG.debug("'{}' skipped because there is no related rule activated in the quality profile", descriptor.name());
       return false;
     }
+    if (!settingsCondition(descriptor)) {
+      LOG.debug("'{}' skipped because one of the required properties is missing", descriptor.name());
+      return false;
+    }
+    return true;
+  }
+
+  private boolean settingsCondition(DefaultSensorDescriptor descriptor) {
+    if (!descriptor.properties().isEmpty()) {
+      for (String propertyKey : descriptor.properties()) {
+        if (!settings.hasKey(propertyKey)) {
+          return false;
+        }
+      }
+    }
     return true;
   }
 
@@ -68,15 +85,10 @@ public class AnalyzerOptimizer implements BatchComponent {
   }
 
   private boolean fsCondition(DefaultSensorDescriptor descriptor) {
-    if (!descriptor.languages().isEmpty() || !descriptor.types().isEmpty()) {
+    if (!descriptor.languages().isEmpty() || descriptor.type() != null) {
       FilePredicate langPredicate = descriptor.languages().isEmpty() ? fs.predicates().all() : fs.predicates().hasLanguages(descriptor.languages());
 
-      FilePredicate typePredicate = descriptor.types().isEmpty() ? fs.predicates().all() : fs.predicates().none();
-      for (InputFile.Type type : descriptor.types()) {
-        typePredicate = fs.predicates().or(
-          typePredicate,
-          fs.predicates().hasType(type));
-      }
+      FilePredicate typePredicate = descriptor.type() == null ? fs.predicates().all() : fs.predicates().hasType(descriptor.type());
       return fs.hasFiles(fs.predicates().and(langPredicate, typePredicate));
     }
     return true;
index bbfcbdaa6f19aa0b6d691b7fc5bf6824dacfa145..56e477ec9c770851fe5aa0768d36efc2e10cadef 100644 (file)
@@ -59,11 +59,7 @@ public final class ScmSensor implements Sensor {
 
   @Override
   public void describe(SensorDescriptor descriptor) {
-    descriptor
-      .name("SCM Sensor")
-      .provides(CoreMetrics.SCM_AUTHORS_BY_LINE,
-        CoreMetrics.SCM_LAST_COMMIT_DATETIMES_BY_LINE,
-        CoreMetrics.SCM_REVISIONS_BY_LINE);
+    descriptor.name("SCM Sensor");
   }
 
   @Override
index b26434d30481d7f7b9924ac77ce27265fc495fc5..b056715e260f1d3f27395bbaac3f19e1d3b70435 100644 (file)
@@ -29,6 +29,7 @@ import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.rule.ActiveRules;
 import org.sonar.api.batch.rule.internal.ActiveRulesBuilder;
 import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
+import org.sonar.api.config.Settings;
 import org.sonar.api.rule.RuleKey;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -41,9 +42,12 @@ public class AnalyzerOptimizerTest {
   public ExpectedException thrown = ExpectedException.none();
   private AnalyzerOptimizer optimizer;
 
+  private Settings settings;
+
   @Before
   public void prepare() {
-    optimizer = new AnalyzerOptimizer(fs, new ActiveRulesBuilder().build());
+    settings = new Settings();
+    optimizer = new AnalyzerOptimizer(fs, new ActiveRulesBuilder().build(), settings);
   }
 
   @Test
@@ -56,7 +60,7 @@ public class AnalyzerOptimizerTest {
   @Test
   public void should_optimize_on_language() throws Exception {
     DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor()
-      .workOnLanguages("java", "php");
+      .onlyOnLanguages("java", "php");
     assertThat(optimizer.shouldExecute(descriptor)).isFalse();
 
     fs.add(new DefaultInputFile("foo", "src/Foo.java").setLanguage("java"));
@@ -66,7 +70,7 @@ public class AnalyzerOptimizerTest {
   @Test
   public void should_optimize_on_type() throws Exception {
     DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor()
-      .workOnFileTypes(InputFile.Type.MAIN);
+      .onlyOnFileType(InputFile.Type.MAIN);
     assertThat(optimizer.shouldExecute(descriptor)).isFalse();
 
     fs.add(new DefaultInputFile("foo", "tests/FooTest.java").setType(InputFile.Type.TEST));
@@ -79,8 +83,8 @@ public class AnalyzerOptimizerTest {
   @Test
   public void should_optimize_on_both_type_and_language() throws Exception {
     DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor()
-      .workOnLanguages("java", "php")
-      .workOnFileTypes(InputFile.Type.MAIN);
+      .onlyOnLanguages("java", "php")
+      .onlyOnFileType(InputFile.Type.MAIN);
     assertThat(optimizer.shouldExecute(descriptor)).isFalse();
 
     fs.add(new DefaultInputFile("foo", "tests/FooTest.java").setLanguage("java").setType(InputFile.Type.TEST));
@@ -101,7 +105,7 @@ public class AnalyzerOptimizerTest {
       .create(RuleKey.of("repo1", "foo"))
       .activate()
       .build();
-    optimizer = new AnalyzerOptimizer(fs, activeRules);
+    optimizer = new AnalyzerOptimizer(fs, activeRules, settings);
 
     assertThat(optimizer.shouldExecute(descriptor)).isFalse();
 
@@ -111,7 +115,17 @@ public class AnalyzerOptimizerTest {
       .create(RuleKey.of("squid", "rule"))
       .activate()
       .build();
-    optimizer = new AnalyzerOptimizer(fs, activeRules);
+    optimizer = new AnalyzerOptimizer(fs, activeRules, settings);
+    assertThat(optimizer.shouldExecute(descriptor)).isTrue();
+  }
+
+  @Test
+  public void should_optimize_on_settings() throws Exception {
+    DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor()
+      .requireProperty("sonar.foo.reportPath");
+    assertThat(optimizer.shouldExecute(descriptor)).isFalse();
+
+    settings.setProperty("sonar.foo.reportPath", "foo");
     assertThat(optimizer.shouldExecute(descriptor)).isTrue();
   }
 }
index 34c5d6bbdbdeb5d9f00e23fe2ef87f86580d8352..e81f3509a552ecd6fc7d66c89ae671a9106724dc 100644 (file)
@@ -26,8 +26,6 @@ import org.apache.commons.lang.ClassUtils;
 import org.sonar.api.BatchExtension;
 import org.sonar.api.batch.maven.DependsUponMavenPlugin;
 import org.sonar.api.batch.maven.MavenPluginHandler;
-import org.sonar.api.batch.sensor.Sensor;
-import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.resources.Project;
 import org.sonar.api.utils.AnnotationUtils;
@@ -148,11 +146,6 @@ public class BatchExtensionDictionnary {
   private <T> List<Object> getDependencies(T extension) {
     List<Object> result = new ArrayList<Object>();
     result.addAll(evaluateAnnotatedClasses(extension, DependsUpon.class));
-    if (ClassUtils.isAssignable(extension.getClass(), Sensor.class)) {
-      DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor();
-      ((Sensor) extension).describe(descriptor);
-      result.addAll(Arrays.asList(descriptor.dependsOn()));
-    }
     return result;
   }
 
@@ -162,11 +155,6 @@ public class BatchExtensionDictionnary {
   public <T> List<Object> getDependents(T extension) {
     List<Object> result = new ArrayList<Object>();
     result.addAll(evaluateAnnotatedClasses(extension, DependedUpon.class));
-    if (ClassUtils.isAssignable(extension.getClass(), Sensor.class)) {
-      DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor();
-      ((Sensor) extension).describe(descriptor);
-      result.addAll(Arrays.asList(descriptor.provides()));
-    }
     return result;
   }
 
index a2187c13c4952817de34208d20326fe97058be95..06abd08f58ce83a3bb31471f7c78d93ba13d87c6 100644 (file)
 package org.sonar.api.batch.sensor;
 
 import org.sonar.api.batch.fs.InputFile;
-import org.sonar.api.batch.measure.Metric;
 
 /**
- * Describe what an {@link Sensor} is doing. Information may be used by the platform
+ * Describe what a {@link Sensor} is doing. Information may be used by the platform
  * to log interesting information or perform some optimization.
  * See {@link Sensor#describe(SensorDescriptor)}
- * @since 5.0
+ * @since 5.1
  */
 public interface SensorDescriptor {
 
   /**
-   * Name of the {@link Sensor}. Will be displayed in logs.
+   * Displayable name of the {@link Sensor}. Will be displayed in logs.
    */
-  SensorDescriptor name(String name);
+  SensorDescriptor name(String sensorName);
 
   /**
-   * List {@link Metric} this {@link Sensor} depends on. Will be used to execute sensors in correct order.
+   * Language this {@link Sensor} work on. Used by the platform to skip execution of the {@link Sensor} when
+   * no file for given languages are present in the project.
+   * Default is to execute sensor for all languages.
    */
-  SensorDescriptor dependsOn(Metric<?>... metrics);
+  SensorDescriptor onlyOnLanguage(String languageKey);
 
   /**
-   * List {@link Metric} this {@link Sensor} provides. Will be used to execute sensors in correct order.
+   * List languages this {@link Sensor} work on. Used by the platform to skip execution of the {@link Sensor} when
+   * no file for given languages are present in the project.
+   * Default is to execute sensor for all languages.
    */
-  SensorDescriptor provides(Metric<?>... metrics);
+  SensorDescriptor onlyOnLanguages(String... languageKeys);
 
   /**
-   * List languages this {@link Sensor} work on. May be used by the platform to skip execution of the {@link Sensor} when
-   * no file for given languages are present in the project.
-   * If no language is provided then it will be executed for all languages.
+   * {@link InputFile.Type} this {@link Sensor} work on. Used by the platform to skip execution of the {@link Sensor} when
+   * no file for given type are present in the project.
+   * Default is to execute sensor whatever are the available file types.
    */
-  SensorDescriptor workOnLanguages(String... languageKeys);
+  SensorDescriptor onlyOnFileType(InputFile.Type type);
 
   /**
-   * 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 you don't call this method then it means sensor is working on all input file types.
+   * Rule repository this {@link Sensor} create issues for. Used by the platform to skip execution of the {@link Sensor} when
+   * no rule is activated for the given repository.
    */
-  SensorDescriptor workOnFileTypes(InputFile.Type... types);
+  SensorDescriptor createIssuesForRuleRepository(String... repositoryKey);
 
   /**
-   * 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.
+   * List rule repositories this {@link Sensor} create issues for. Used by the platform to skip execution of the {@link Sensor} when
+   * no rule is activated for the given repositories.
    */
   SensorDescriptor createIssuesForRuleRepositories(String... repositoryKeys);
 
+  /**
+   * Property this {@link Sensor} depends on. Used by the platform to skip execution of the {@link Sensor} when
+   * property is not set.
+   */
+  SensorDescriptor requireProperty(String... propertyKey);
+
+  /**
+   * List properties this {@link Sensor} depends on. Used by the platform to skip execution of the {@link Sensor} when
+   * property is not set.
+   */
+  SensorDescriptor requireProperties(String... propertyKeys);
+
 }
index a371fc57fb8581383b24cf63206faa6b5c2f50e5..8f6925f814de748cd1f19e9bba2b3941b0985223 100644 (file)
  */
 package org.sonar.api.batch.sensor.internal;
 
+import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.sensor.SensorDescriptor;
 
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.api.batch.measure.Metric;
+import javax.annotation.Nullable;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -30,36 +30,32 @@ import java.util.Collection;
 public class DefaultSensorDescriptor implements SensorDescriptor {
 
   private String name;
-  private Metric<?>[] dependsOn = new Metric<?>[0];
-  private Metric<?>[] provides = new Metric<?>[0];
   private String[] languages = new String[0];
-  private InputFile.Type[] types = new InputFile.Type[0];
+  private InputFile.Type type = null;
   private String[] ruleRepositories = new String[0];
+  private String[] properties = new String[0];
 
   public String name() {
     return name;
   }
 
-  public Metric[] dependsOn() {
-    return dependsOn;
-  }
-
-  public Metric[] provides() {
-    return provides;
-  }
-
   public Collection<String> languages() {
     return Arrays.asList(languages);
   }
 
-  public Collection<InputFile.Type> types() {
-    return Arrays.asList(types);
+  @Nullable
+  public InputFile.Type type() {
+    return type;
   }
 
   public Collection<String> ruleRepositories() {
     return Arrays.asList(ruleRepositories);
   }
 
+  public Collection<String> properties() {
+    return Arrays.asList(properties);
+  }
+
   @Override
   public DefaultSensorDescriptor name(String name) {
     this.name = name;
@@ -67,27 +63,25 @@ public class DefaultSensorDescriptor implements SensorDescriptor {
   }
 
   @Override
-  public DefaultSensorDescriptor dependsOn(Metric<?>... metrics) {
-    this.dependsOn = metrics;
-    return this;
+  public DefaultSensorDescriptor onlyOnLanguage(String languageKey) {
+    return onlyOnLanguages(languageKey);
   }
 
   @Override
-  public DefaultSensorDescriptor provides(Metric<?>... metrics) {
-    this.provides = metrics;
+  public DefaultSensorDescriptor onlyOnLanguages(String... languageKeys) {
+    this.languages = languageKeys;
     return this;
   }
 
   @Override
-  public DefaultSensorDescriptor workOnLanguages(String... languageKeys) {
-    this.languages = languageKeys;
+  public DefaultSensorDescriptor onlyOnFileType(InputFile.Type type) {
+    this.type = type;
     return this;
   }
 
   @Override
-  public DefaultSensorDescriptor workOnFileTypes(InputFile.Type... types) {
-    this.types = types;
-    return this;
+  public DefaultSensorDescriptor createIssuesForRuleRepository(String... repositoryKey) {
+    return createIssuesForRuleRepositories(repositoryKey);
   }
 
   @Override
@@ -96,4 +90,15 @@ public class DefaultSensorDescriptor implements SensorDescriptor {
     return this;
   }
 
+  @Override
+  public DefaultSensorDescriptor requireProperty(String... propertyKey) {
+    return requireProperties(propertyKey);
+  }
+
+  @Override
+  public DefaultSensorDescriptor requireProperties(String... propertyKeys) {
+    this.properties = propertyKeys;
+    return this;
+  }
+
 }
index 5b890818f8ac4313fc5143d38c27c890e182f11c..ebad1ccdbcb1a4b068826fa9ab4b8d381e1f9b0e 100644 (file)
  */
 package org.sonar.api.batch.sensor.internal;
 
-import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
-
 import org.junit.Test;
 import org.sonar.api.batch.fs.InputFile;
-import org.sonar.api.measures.CoreMetrics;
+
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class DefaultSensorDescriptorTest {
@@ -33,16 +31,16 @@ public class DefaultSensorDescriptorTest {
     DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor();
     descriptor
       .name("Foo")
-      .dependsOn(CoreMetrics.NCLOC)
-      .provides(CoreMetrics.BLOCKER_VIOLATIONS)
-      .workOnLanguages("java", "php")
-      .workOnFileTypes(InputFile.Type.MAIN);
+      .onlyOnLanguage("java")
+      .onlyOnFileType(InputFile.Type.MAIN)
+      .requireProperty("sonar.foo.reportPath")
+      .createIssuesForRuleRepository("squid-java");
 
     assertThat(descriptor.name()).isEqualTo("Foo");
-    assertThat(descriptor.dependsOn()).containsOnly(CoreMetrics.NCLOC);
-    assertThat(descriptor.provides()).containsOnly(CoreMetrics.BLOCKER_VIOLATIONS);
-    assertThat(descriptor.languages()).containsOnly("java", "php");
-    assertThat(descriptor.types()).containsOnly(InputFile.Type.MAIN);
+    assertThat(descriptor.languages()).containsOnly("java");
+    assertThat(descriptor.type()).isEqualTo(InputFile.Type.MAIN);
+    assertThat(descriptor.properties()).containsOnly("sonar.foo.reportPath");
+    assertThat(descriptor.ruleRepositories()).containsOnly("squid-java");
   }
 
 }