]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5389 Drop batch-api module
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 18 Jun 2014 09:41:59 +0000 (11:41 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 18 Jun 2014 14:26:00 +0000 (16:26 +0200)
134 files changed:
pom.xml
sonar-batch-plugin-api/pom.xml [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/Analyzer.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerContext.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerDescriptor.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/AnalyzerIssue.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasure.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFile.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFileFilter.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPattern.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/FilenameUtils.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/Preconditions.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/StringUtils.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/WildcardPattern.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/languages/Language.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/languages/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/measures/Metric.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/measures/package-info.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/QProfile.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/RuleKey.java [deleted file]
sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/package-info.java [deleted file]
sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java [deleted file]
sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java [deleted file]
sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultInputFileTest.java [deleted file]
sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/PathPatternTest.java [deleted file]
sonar-batch/pom.xml
sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchExtensionDictionnary.java
sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java
sonar-batch/src/main/java/org/sonar/batch/languages/DeprecatedLanguagesReferential.java
sonar-batch/src/main/java/org/sonar/batch/languages/LanguagesReferential.java
sonar-batch/src/main/java/org/sonar/batch/phases/SensorMatcher.java
sonar-batch/src/main/java/org/sonar/batch/rule/ActiveRulesProvider.java
sonar-batch/src/main/java/org/sonar/batch/rule/ModuleQProfiles.java
sonar-batch/src/main/java/org/sonar/batch/rule/QProfileVerifier.java
sonar-batch/src/main/java/org/sonar/batch/rule/RulesProfileProvider.java
sonar-batch/src/main/java/org/sonar/batch/rules/DefaultQProfileReferential.java
sonar-batch/src/main/java/org/sonar/batch/rules/QProfileWithId.java
sonar-batch/src/main/java/org/sonar/batch/rules/QProfilesReferential.java
sonar-batch/src/main/java/org/sonar/batch/scan/AnalyzerContextAdaptor.java
sonar-batch/src/main/java/org/sonar/batch/scan/LanguageVerifier.java
sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java
sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java
sonar-batch/src/main/java/org/sonar/batch/scan/ScanTask.java
sonar-batch/src/main/java/org/sonar/batch/scan/SensorWrapper.java
sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/LanguageDetection.java
sonar-batch/src/main/java/org/sonar/batch/scan2/AnalyzerMeasureCache.java [new file with mode: 0644]
sonar-batch/src/main/java/org/sonar/batch/scan2/AnalyzersExecutor.java
sonar-batch/src/main/java/org/sonar/batch/scan2/DefaultAnalyzerContext.java
sonar-batch/src/main/java/org/sonar/batch/scan2/MeasureCache.java [deleted file]
sonar-batch/src/main/java/org/sonar/batch/scan2/ModuleScanContainer.java
sonar-batch/src/main/java/org/sonar/batch/scan2/Phase2Executor.java
sonar-batch/src/main/java/org/sonar/batch/scan2/ProjectScanContainer.java
sonar-batch/src/main/java/org/sonar/batch/scan2/ScanTaskObserver.java
sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchExtensionDictionnaryTest.java
sonar-batch/src/test/java/org/sonar/batch/rule/ActiveRulesProviderTest.java
sonar-batch/src/test/java/org/sonar/batch/rule/ModuleQProfilesTest.java
sonar-batch/src/test/java/org/sonar/batch/rule/QProfileSensorTest.java
sonar-batch/src/test/java/org/sonar/batch/rule/RulesProfileProviderTest.java
sonar-deprecated/src/main/java/org/sonar/api/batch/BatchExtensionDictionnary.java
sonar-plugin-api/pom.xml
sonar-plugin-api/src/main/java/org/sonar/api/batch/SonarIndex.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/Analyzer.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerContext.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerDescriptor.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/internal/DefaultAnalyzerDescriptor.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/internal/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/AnalyzerIssue.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/internal/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasure.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasureBuilder.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/DefaultAnalyzerMeasure.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/DefaultAnalyzerMeasureBuilder.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFile.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFileFilter.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DeprecatedDefaultInputFile.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPattern.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/languages/Language.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/languages/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/measures/Metric.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/measures/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/rules/QProfile.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/batch/rules/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/measures/MeasuresFilters.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/Metric.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultInputFileTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/PathPatternTest.java [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index 907c04df713d83b0d69a7e7eea01e02fe58debc4..822598b083b8518324729a9660f3521450bfe4da 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,6 @@
   <modules>
     <module>sonar-application</module>
     <module>sonar-batch</module>
-    <module>sonar-batch-plugin-api</module>
     <module>sonar-batch-maven-compat</module>
     <module>sonar-check-api</module>
     <module>sonar-colorizer</module>
         <artifactId>sonar-plugin-api</artifactId>
         <version>${project.version}</version>
       </dependency>
-      <dependency>
-        <groupId>org.codehaus.sonar</groupId>
-        <artifactId>sonar-batch-plugin-api</artifactId>
-        <version>${project.version}</version>
-      </dependency>
       <dependency>
         <groupId>org.codehaus.sonar</groupId>
         <artifactId>sonar-update-center-common</artifactId>
diff --git a/sonar-batch-plugin-api/pom.xml b/sonar-batch-plugin-api/pom.xml
deleted file mode 100644 (file)
index f90ff63..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.codehaus.sonar</groupId>
-    <artifactId>sonar</artifactId>
-    <version>4.4-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>sonar-batch-plugin-api</artifactId>
-  <packaging>jar</packaging>
-
-  <name>SonarQube :: Batch Plugin API</name>
-  
-  <dependencies>
-    <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-    </dependency>
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.easytesting</groupId>
-      <artifactId>fest-assert</artifactId>
-    </dependency>
-  </dependencies>
-
-
-</project>
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/Analyzer.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/Analyzer.java
deleted file mode 100644 (file)
index 6123545..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.batch.api.analyzer;
-
-import org.sonar.batch.api.BatchExtension;
-
-/**
- * <p>
- * An Analyzer is invoked once during the analysis of a project. The analyzer can parse a flat file, connect to a web server... Analyzers are
- * used to add measure and issues at file level.
- * </p>
- *
- * <p>
- * For example the Cobertura Analyzer parses Cobertura report and saves the first-level of measures on files.
- * </p>
- *
- * @since 4.4
- */
-public interface Analyzer extends BatchExtension {
-
-  /**
-   * Describe what this analyzer is doing.
-   * @return
-   */
-  AnalyzerDescriptor describe();
-
-  /**
-   * The method that is going to be run when the analyzer is called
-   *
-   * @param context the context
-   */
-  void analyse(AnalyzerContext context);
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerContext.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerContext.java
deleted file mode 100644 (file)
index e29dfaf..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.batch.api.analyzer;
-
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.analyzer.issue.AnalyzerIssue;
-import org.sonar.batch.api.analyzer.measure.AnalyzerMeasure;
-import org.sonar.batch.api.measures.Metric;
-
-import javax.annotation.CheckForNull;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-/**
- * @since 4.4
- */
-public interface AnalyzerContext {
-
-  // ----------- MEASURES --------------
-
-  /**
-   * Find a project measure.
-   */
-  @CheckForNull
-  AnalyzerMeasure<?> getMeasure(String metricKey);
-
-  /**
-   * Find a project measure.
-   */
-  @CheckForNull
-  <G extends Serializable> AnalyzerMeasure<G> getMeasure(Metric<G> metric);
-
-  /**
-   * Find a file measure.
-   */
-  @CheckForNull
-  AnalyzerMeasure<?> getMeasure(InputFile file, String metricKey);
-
-  /**
-   * Find a file measure.
-   */
-  @CheckForNull
-  <G extends Serializable> AnalyzerMeasure<G> getMeasure(InputFile file, Metric<G> metric);
-
-  /**
-   * Add a measure.
-   */
-  void addMeasure(AnalyzerMeasure<?> measure);
-
-  // ----------- ISSUES --------------
-
-  /**
-   * Add an issue.
-   */
-  void addIssue(AnalyzerIssue issue);
-
-  /**
-   * Add a list of issues.
-   */
-  void addIssues(Collection<AnalyzerIssue> issues);
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerDescriptor.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerDescriptor.java
deleted file mode 100644 (file)
index 0b97200..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.batch.api.analyzer;
-
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.measures.Metric;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-public class AnalyzerDescriptor {
-
-  private final String name;
-  private final Metric<?>[] dependsOn;
-  private final Metric<?>[] provides;
-  private final String[] languages;
-  private final InputFile.Type[] types;
-
-  private AnalyzerDescriptor(Builder builder) {
-    this.name = builder.name;
-    this.dependsOn = builder.dependsOn != null ? builder.dependsOn : new Metric<?>[0];
-    this.provides = builder.provides != null ? builder.provides : new Metric<?>[0];
-    this.languages = builder.languages != null ? builder.languages : new String[0];
-    this.types = builder.types;
-  }
-
-  public String name() {
-    return name;
-  }
-
-  public Metric<?>[] dependsOn() {
-    return dependsOn;
-  }
-
-  public Metric<?>[] provides() {
-    return provides;
-  }
-
-  public Collection<String> languages() {
-    return Arrays.asList(languages);
-  }
-
-  public InputFile.Type[] types() {
-    return types;
-  }
-
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  public static class Builder {
-
-    private String name;
-    private Metric<?>[] dependsOn;
-    private Metric<?>[] provides;
-    private String[] languages;
-    private InputFile.Type[] types;
-
-    public Builder name(String name) {
-      this.name = name;
-      return this;
-    }
-
-    public Builder dependsOn(Metric<?>... metrics) {
-      this.dependsOn = metrics;
-      return this;
-    }
-
-    public Builder provides(Metric<?>... metrics) {
-      this.provides = metrics;
-      return this;
-    }
-
-    public Builder runOnLanguages(String... languageKeys) {
-      this.languages = languageKeys;
-      return this;
-    }
-
-    public Builder runOnTypes(InputFile.Type... types) {
-      this.types = types;
-      return this;
-    }
-
-    public AnalyzerDescriptor build() {
-      return new AnalyzerDescriptor(this);
-    }
-
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/AnalyzerIssue.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/AnalyzerIssue.java
deleted file mode 100644 (file)
index f39d884..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * 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.batch.api.analyzer.issue;
-
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.analyzer.Analyzer;
-import org.sonar.batch.api.internal.Preconditions;
-import org.sonar.batch.api.rules.RuleKey;
-
-import javax.annotation.Nullable;
-
-/**
- * Issue reported by an {@link Analyzer}
- *
- * @since 4.4
- */
-public class AnalyzerIssue {
-
-  private final InputFile inputFile;
-  private final RuleKey ruleKey;
-  private final String message;
-  private final Integer line;
-  private final Double effortToFix;
-
-  private AnalyzerIssue(Builder builder) {
-    this.inputFile = builder.file;
-    this.ruleKey = builder.ruleKey;
-    this.message = builder.message;
-    this.line = builder.line;
-    this.effortToFix = builder.effortToFix;
-  }
-
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  @Nullable
-  public InputFile inputFile() {
-    return inputFile;
-  }
-
-  public RuleKey ruleKey() {
-    return ruleKey;
-  }
-
-  public String message() {
-    return message;
-  }
-
-  public Integer line() {
-    return line;
-  }
-
-  @Nullable
-  public Double effortToFix() {
-    return effortToFix;
-  }
-
-  public static class Builder {
-
-    private Boolean onProject = null;
-    private InputFile file;
-    private RuleKey ruleKey;
-    private String message;
-    private Integer line;
-    private Double effortToFix;
-
-    public AnalyzerIssue build() {
-      return new AnalyzerIssue(this);
-    }
-
-    public Builder ruleKey(RuleKey ruleKey) {
-      this.ruleKey = ruleKey;
-      return this;
-    }
-
-    public Builder onFile(InputFile file) {
-      Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
-      Preconditions.checkNotNull(file, "InputFile should be non null");
-      this.file = file;
-      this.onProject = false;
-      return this;
-    }
-
-    public Builder onProject() {
-      Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
-      this.file = null;
-      this.onProject = true;
-      return this;
-    }
-
-    public Builder atLine(int line) {
-      this.line = line;
-      return this;
-    }
-
-    public Builder effortToFix(@Nullable Double effortToFix) {
-      this.effortToFix = effortToFix;
-      return this;
-    }
-
-    public Builder message(String message) {
-      this.message = message;
-      return this;
-    }
-
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/package-info.java
deleted file mode 100644 (file)
index 70a6600..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-@javax.annotation.ParametersAreNonnullByDefault
-package org.sonar.batch.api.analyzer.issue;
\ No newline at end of file
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasure.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasure.java
deleted file mode 100644 (file)
index 3d74dca..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.batch.api.analyzer.measure;
-
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.internal.Preconditions;
-import org.sonar.batch.api.measures.Metric;
-
-import javax.annotation.Nullable;
-
-import java.io.Serializable;
-
-public class AnalyzerMeasure<G extends Serializable> implements Serializable {
-
-  private final InputFile inputFile;
-  private final String metricKey;
-  private final G value;
-
-  private AnalyzerMeasure(Builder<G> builder) {
-    Preconditions.checkNotNull(builder.value, "Measure value can't be null");
-    Preconditions.checkNotNull(builder.metricKey, "Measure metricKey can't be null");
-    this.inputFile = builder.file;
-    this.metricKey = builder.metricKey;
-    this.value = builder.value;
-  }
-
-  @Nullable
-  public InputFile inputFile() {
-    return inputFile;
-  }
-
-  public String metricKey() {
-    return metricKey;
-  }
-
-  public Serializable value() {
-    return value;
-  }
-
-  public static <G extends Serializable> Builder<G> builder() {
-    return new Builder<G>();
-  }
-
-  public static class Builder<G extends Serializable> {
-
-    private Boolean onProject = null;
-    private InputFile file;
-    private String metricKey;
-    private G value;
-
-    public Builder<G> onFile(InputFile file) {
-      Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
-      Preconditions.checkNotNull(file, "InputFile should be non null");
-      this.file = file;
-      this.onProject = false;
-      return this;
-    }
-
-    public Builder<G> onProject() {
-      Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
-      this.file = null;
-      this.onProject = true;
-      return this;
-    }
-
-    private Builder<G> metricKey(String metricKey) {
-      Preconditions.checkState(metricKey != null, "Metric already defined");
-      this.metricKey = metricKey;
-      return this;
-    }
-
-    public Builder<G> forMetric(Metric<G> metric) {
-      return metricKey(metric.key());
-    }
-
-    public Builder<G> withValue(G value) {
-      Preconditions.checkState(value != null, "Measure value already defined");
-      Preconditions.checkNotNull(value, "Measure value can't be null");
-      this.value = value;
-      return this;
-    }
-
-    public AnalyzerMeasure<G> build() {
-      return new AnalyzerMeasure<G>(this);
-    }
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (!(obj instanceof AnalyzerMeasure)) {
-      return false;
-    }
-    AnalyzerMeasure<?> other = (AnalyzerMeasure<?>) obj;
-    return metricKey.equals(other.metricKey)
-      && value.equals(other.value)
-      && (inputFile == null ? other.inputFile == null : inputFile.equals(other.inputFile));
-  }
-
-  @Override
-  public int hashCode() {
-    return metricKey.hashCode()
-      + value.hashCode()
-      + (inputFile != null ? inputFile.hashCode() : 0);
-  }
-
-  @Override
-  public String toString() {
-    return "AnalyzerMeasure[" + (inputFile != null ? "inputFile=" + inputFile.toString() : "onProject")
-      + ",metricKey=" + metricKey + ",value=" + value + "]";
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/package-info.java
deleted file mode 100644 (file)
index b490662..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-@javax.annotation.ParametersAreNonnullByDefault
-package org.sonar.batch.api.analyzer.measure;
\ No newline at end of file
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/analyzer/package-info.java
deleted file mode 100644 (file)
index 5b72f8c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-@javax.annotation.ParametersAreNonnullByDefault
-package org.sonar.batch.api.analyzer;
\ No newline at end of file
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicate.java
deleted file mode 100644 (file)
index 830859e..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.fs;
-
-/**
- * Determines if a file must be kept in search results. See {@link org.sonar.api.batch.fs.FileSystem}
- * and {@link org.sonar.api.batch.fs.FilePredicates}.
- * @since 4.2
- */
-public interface FilePredicate {
-  boolean apply(InputFile inputFile);
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java
deleted file mode 100644 (file)
index 65a2e19..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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.fs;
-
-import java.io.File;
-import java.util.Collection;
-
-/**
- * Factory of {@link org.sonar.api.batch.fs.FilePredicate}
- *
- * @since 4.2
- */
-public interface FilePredicates {
-  /**
-   * Returns a predicate that always evaluates to true
-   */
-  FilePredicate all();
-
-  /**
-   * Returns a predicate that always evaluates to false
-   */
-  FilePredicate none();
-
-  /**
-   * Warning - not efficient because absolute path is not indexed yet.
-   */
-  FilePredicate hasAbsolutePath(String s);
-
-  /**
-   * TODO document that non-normalized path and Windows-style path are supported
-   */
-  FilePredicate hasRelativePath(String s);
-
-  FilePredicate matchesPathPattern(String inclusionPattern);
-
-  FilePredicate matchesPathPatterns(String[] inclusionPatterns);
-
-  FilePredicate doesNotMatchPathPattern(String exclusionPattern);
-
-  FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns);
-
-  FilePredicate hasPath(String s);
-
-  FilePredicate is(File ioFile);
-
-  FilePredicate hasLanguage(String language);
-
-  FilePredicate hasLanguages(Collection<String> languages);
-
-  FilePredicate hasLanguages(String... languages);
-
-  FilePredicate hasStatus(InputFile.Status status);
-
-  FilePredicate hasType(InputFile.Type type);
-
-  FilePredicate not(FilePredicate p);
-
-  FilePredicate or(Collection<FilePredicate> or);
-
-  FilePredicate or(FilePredicate... or);
-
-  FilePredicate or(FilePredicate first, FilePredicate second);
-
-  FilePredicate and(Collection<FilePredicate> and);
-
-  FilePredicate and(FilePredicate... and);
-
-  FilePredicate and(FilePredicate first, FilePredicate second);
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java
deleted file mode 100644 (file)
index 0c050f0..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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.fs;
-
-import org.sonar.batch.api.BatchComponent;
-
-import javax.annotation.CheckForNull;
-
-import java.io.File;
-import java.nio.charset.Charset;
-import java.util.SortedSet;
-
-/**
- * The {@link FileSystem} manages all the source files to be analyzed.
- * <p/>
- * This is not an extension point so it must not be implemented by plugins. It must be injected as a
- * constructor parameter :
- * <pre>
- * public class MySensor implements Sensor {
- *   private final FileSystem fs;
- *
- *   public MySensor(FileSystem fs) {
- *     this.fs = fs;
- *   }
- * }
- * </pre>
- *
- * <h2>How to use in unit tests</h2>
- * The unit tests needing an instance of FileSystem can use the implementation
- * {@link org.sonar.api.batch.fs.internal.DefaultFileSystem} and the related {@link org.sonar.api.batch.fs.internal.DefaultInputFile},
- * for example :
- * <pre>
- * DefaultFileSystem fs = new DefaultFileSystem();
- * fs.add(new DefaultInputFile("src/foo/bar.php"));
- * </pre>
- *
- * @since 4.2
- */
-public interface FileSystem extends BatchComponent {
-
-  /**
-   * Absolute base directory of module
-   */
-  File baseDir();
-
-  /**
-   * Default encoding of input files. If it's not defined, then
-   * the platform default encoding is returned
-   */
-  Charset encoding();
-
-  /**
-   * Absolute work directory. It can be used to
-   * store third-party analysis reports.
-   * <p/>
-   * The work directory can be located outside {@link #baseDir()}.
-   */
-  File workDir();
-
-  /**
-   * Factory of {@link FilePredicate}
-   */
-  FilePredicates predicates();
-
-  /**
-   * Returns the single element matching the predicate. If more than one elements match
-   * the predicate, then {@link IllegalArgumentException} is thrown. Returns {@code null}
-   * if no files match.
-   *
-   * <p/>
-   * How to use :
-   * <pre>
-   * InputFile file = fs.inputFile(fs.predicates().hasRelativePath("src/Foo.php"));
-   * </pre>
-   *
-   * @see #predicates()
-   */
-  @CheckForNull
-  InputFile inputFile(FilePredicate predicate);
-
-  /**
-   * Input files matching the given attributes. Return all the files if the parameter
-   * <code>attributes</code> is empty.
-   * <p/>
-   * <b>Important</b> - result is an {@link java.lang.Iterable} to benefit from streaming and decreasing
-   * memory consumption. It should be iterated only once, else copy it into a list :
-   * {@code com.google.common.collect.Lists.newArrayList(inputFiles(predicate))}
-   * <p/>
-   * How to use :
-   * <pre>
-   * FilePredicates p = fs.predicates();
-   * Iterable<InputFile> files = fs.inputFiles(p.and(p.hasLanguage("java"), p.hasType(InputFile.Type.MAIN)));
-   * </pre>
-   *
-   * @see #predicates()
-   */
-  Iterable<InputFile> inputFiles(FilePredicate predicate);
-
-  /**
-   * Returns true if at least one {@link org.sonar.api.batch.fs.InputFile} matches
-   * the given predicate. This method can be faster than checking if {@link #inputFiles(org.sonar.api.batch.fs.FilePredicate)}
-   * has elements.
-   * @see #predicates()
-   */
-  boolean hasFiles(FilePredicate predicate);
-
-  /**
-   * Files matching the given predicate.
-   * @see #predicates()
-   */
-  Iterable<File> files(FilePredicate predicate);
-
-  /**
-   * Languages detected in all files, whatever their type (main or test)
-   */
-  SortedSet<String> languages();
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFile.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFile.java
deleted file mode 100644 (file)
index 83e9697..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.fs;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * This layer over {@link java.io.File} adds information for code analyzers.
- *
- * @since 4.2
- */
-public interface InputFile extends Serializable {
-
-  enum Type {
-    MAIN, TEST
-  }
-
-  /** 
-   * Status regarding previous analysis
-   */
-  enum Status {
-    SAME, CHANGED, ADDED
-  }
-
-  /**
-   * Path relative to module base directory. Path is unique and identifies file
-   * within given <code>{@link FileSystem}</code>. File separator is the forward
-   * slash ('/'), even on Microsoft Windows.
-   * <p/>
-   * Returns <code>src/main/java/com/Foo.java</code> if module base dir is
-   * <code>/path/to/module</code> and if file is
-   * <code>/path/to/module/src/main/java/com/Foo.java</code>.
-   * <p/>
-   * Relative path is not null and is normalized ('foo/../foo' is replaced by 'foo').
-   */
-  String relativePath();
-
-  /**
-   * Normalized absolute path. File separator is forward slash ('/'), even on Microsoft Windows.
-   * <p/>
-   * This is not canonical path. Symbolic links are not resolved. For example if /project/src links
-   * to /tmp/src and basedir is /project, then this method returns /project/src/index.php. Use
-   * {@code file().getCanonicalPath()} to resolve symbolic link.
-   */
-  String absolutePath();
-
-  /**
-   * The underlying absolute {@link java.io.File}
-   */
-  File file();
-
-  /**
-   * Language, for example "java" or "php". It's automatically guessed if it is not
-   * set in project settings.
-   */
-  String language();
-
-  /**
-   * Does it contain main or test code ?
-   */
-  Type type();
-
-  /**
-   * Status regarding previous analysis
-   */
-  Status status();
-
-  /**
-   * Number of physical lines. This method supports all end-of-line characters. Returns
-   * zero if the file is empty.
-   */
-  int lines();
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFileFilter.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFileFilter.java
deleted file mode 100644 (file)
index 166af9e..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fs;
-
-import org.sonar.batch.api.BatchExtension;
-
-/**
- * Extension point to exclude some files from inspection
- * @since 4.2
- */
-public interface InputFileFilter extends BatchExtension {
-
-  // TODO requires a context (FileSystem) ?
-  boolean accept(InputFile f);
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java
deleted file mode 100644 (file)
index 367c1ea..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.internal.FilenameUtils;
-
-/**
- * @since 4.2
- */
-class AbsolutePathPredicate implements FilePredicate {
-
-  private final String path;
-
-  AbsolutePathPredicate(String path) {
-    this.path = FilenameUtils.normalize(path);
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    return path.equals(f.absolutePath());
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java
deleted file mode 100644 (file)
index 0494ed5..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-import java.util.Collection;
-
-/**
- * @since 4.2
- */
-class AndPredicate implements FilePredicate {
-
-  private final Collection<FilePredicate> predicates;
-
-  AndPredicate(Collection<FilePredicate> predicates) {
-    this.predicates = predicates;
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    for (FilePredicate predicate : predicates) {
-      if (!predicate.apply(f)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java
deleted file mode 100644 (file)
index 8036d90..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.FilePredicates;
-import org.sonar.api.batch.fs.InputFile;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Factory of {@link org.sonar.api.batch.fs.FilePredicate}
- *
- * @since 4.2
- */
-public class DefaultFilePredicates implements FilePredicates {
-  /**
-   * Client code should use {@link org.sonar.api.batch.fs.FileSystem#predicates()} to get an instance
-   */
-  DefaultFilePredicates() {
-  }
-
-  /**
-   * Returns a predicate that always evaluates to true
-   */
-  public FilePredicate all() {
-    return TruePredicate.TRUE;
-  }
-
-  /**
-   * Returns a predicate that always evaluates to false
-   */
-  public FilePredicate none() {
-    return FalsePredicate.FALSE;
-  }
-
-  /**
-   * Warning - not efficient because absolute path is not indexed yet.
-   */
-  public FilePredicate hasAbsolutePath(String s) {
-    return new AbsolutePathPredicate(s);
-  }
-
-  /**
-   * TODO document that non-normalized path and Windows-style path are supported
-   */
-  public FilePredicate hasRelativePath(String s) {
-    return new RelativePathPredicate(s);
-  }
-
-  public FilePredicate matchesPathPattern(String inclusionPattern) {
-    return new PathPatternPredicate(PathPattern.create(inclusionPattern));
-  }
-
-  public FilePredicate matchesPathPatterns(String[] inclusionPatterns) {
-    if (inclusionPatterns.length == 0) {
-      return TruePredicate.TRUE;
-    }
-    FilePredicate[] predicates = new FilePredicate[inclusionPatterns.length];
-    for (int i = 0; i < inclusionPatterns.length; i++) {
-      predicates[i] = new PathPatternPredicate(PathPattern.create(inclusionPatterns[i]));
-    }
-    return or(predicates);
-  }
-
-  public FilePredicate doesNotMatchPathPattern(String exclusionPattern) {
-    return not(matchesPathPattern(exclusionPattern));
-  }
-
-  public FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns) {
-    if (exclusionPatterns.length == 0) {
-      return TruePredicate.TRUE;
-    }
-    return not(matchesPathPatterns(exclusionPatterns));
-  }
-
-  public FilePredicate hasPath(String s) {
-    File file = new File(s);
-    if (file.isAbsolute()) {
-      return hasAbsolutePath(s);
-    }
-    return hasRelativePath(s);
-  }
-
-  public FilePredicate is(File ioFile) {
-    if (ioFile.isAbsolute()) {
-      return hasAbsolutePath(ioFile.getAbsolutePath());
-    }
-    return hasRelativePath(ioFile.getPath());
-  }
-
-  public FilePredicate hasLanguage(String language) {
-    return new LanguagePredicate(language);
-  }
-
-  public FilePredicate hasLanguages(Collection<String> languages) {
-    List<FilePredicate> list = new ArrayList<FilePredicate>();
-    for (String language : languages) {
-      list.add(hasLanguage(language));
-    }
-    return or(list);
-  }
-
-  public FilePredicate hasLanguages(String... languages) {
-    List<FilePredicate> list = new ArrayList<FilePredicate>();
-    for (String language : languages) {
-      list.add(hasLanguage(language));
-    }
-    return or(list);
-  }
-
-  public FilePredicate hasStatus(InputFile.Status status) {
-    return new StatusPredicate(status);
-  }
-
-  public FilePredicate hasType(InputFile.Type type) {
-    return new TypePredicate(type);
-  }
-
-  public FilePredicate not(FilePredicate p) {
-    return new NotPredicate(p);
-  }
-
-  public FilePredicate or(Collection<FilePredicate> or) {
-    return new OrPredicate(or);
-  }
-
-  public FilePredicate or(FilePredicate... or) {
-    return new OrPredicate(Arrays.asList(or));
-  }
-
-  public FilePredicate or(FilePredicate first, FilePredicate second) {
-    return new OrPredicate(Arrays.asList(first, second));
-  }
-
-  public FilePredicate and(Collection<FilePredicate> and) {
-    return new AndPredicate(and);
-  }
-
-  public FilePredicate and(FilePredicate... and) {
-    return new AndPredicate(Arrays.asList(and));
-  }
-
-  public FilePredicate and(FilePredicate first, FilePredicate second) {
-    return new AndPredicate(Arrays.asList(first, second));
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java
deleted file mode 100644 (file)
index 89abb9e..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.FilePredicates;
-import org.sonar.api.batch.fs.FileSystem;
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.internal.Preconditions;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.io.File;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * @since 4.2
- */
-public class DefaultFileSystem implements FileSystem {
-
-  private final Cache cache;
-  private final SortedSet<String> languages = new TreeSet<String>();
-  private File baseDir, workDir;
-  private Charset encoding;
-  private final FilePredicates predicates = new DefaultFilePredicates();
-
-  /**
-   * Only for testing
-   */
-  public DefaultFileSystem() {
-    this.cache = new MapCache();
-  }
-
-  protected DefaultFileSystem(Cache cache) {
-    this.cache = cache;
-  }
-
-  public DefaultFileSystem setBaseDir(File d) {
-    Preconditions.checkNotNull(d, "Base directory can't be null");
-    this.baseDir = d.getAbsoluteFile();
-    return this;
-  }
-
-  @Override
-  public File baseDir() {
-    return baseDir;
-  }
-
-  public DefaultFileSystem setEncoding(@Nullable Charset e) {
-    this.encoding = e;
-    return this;
-  }
-
-  @Override
-  public Charset encoding() {
-    return encoding == null ? Charset.defaultCharset() : encoding;
-  }
-
-  public boolean isDefaultJvmEncoding() {
-    return encoding == null;
-  }
-
-  public DefaultFileSystem setWorkDir(File d) {
-    this.workDir = d.getAbsoluteFile();
-    return this;
-  }
-
-  @Override
-  public File workDir() {
-    return workDir;
-  }
-
-  @Override
-  public InputFile inputFile(FilePredicate predicate) {
-    doPreloadFiles();
-    if (predicate instanceof RelativePathPredicate) {
-      return cache.inputFile((RelativePathPredicate) predicate);
-    }
-    Iterable<InputFile> files = inputFiles(predicate);
-    Iterator<InputFile> iterator = files.iterator();
-    if (!iterator.hasNext()) {
-      return null;
-    }
-    InputFile first = iterator.next();
-    if (!iterator.hasNext()) {
-      return first;
-    }
-
-    StringBuilder sb = new StringBuilder();
-    sb.append("expected one element but was: <" + first);
-    for (int i = 0; i < 4 && iterator.hasNext(); i++) {
-      sb.append(", " + iterator.next());
-    }
-    if (iterator.hasNext()) {
-      sb.append(", ...");
-    }
-    sb.append('>');
-
-    throw new IllegalArgumentException(sb.toString());
-
-  }
-
-  @Override
-  public Iterable<InputFile> inputFiles(FilePredicate predicate) {
-    doPreloadFiles();
-    return filter(cache.inputFiles(), predicate);
-  }
-
-  @Override
-  public boolean hasFiles(FilePredicate predicate) {
-    doPreloadFiles();
-    for (InputFile element : cache.inputFiles()) {
-      if (predicate.apply(element)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public Iterable<File> files(FilePredicate predicate) {
-    doPreloadFiles();
-    Collection<File> result = new ArrayList<File>();
-    for (InputFile element : inputFiles(predicate)) {
-      if (predicate.apply(element)) {
-        result.add(element.file());
-      }
-    }
-    return result;
-  }
-
-  public static Collection<InputFile> filter(Iterable<InputFile> target, FilePredicate predicate) {
-    Collection<InputFile> result = new ArrayList<InputFile>();
-    for (InputFile element : target) {
-      if (predicate.apply(element)) {
-        result.add(element);
-      }
-    }
-    return result;
-  }
-
-  /**
-   * Adds InputFile to the list and registers its language, if present.
-   */
-  public DefaultFileSystem add(InputFile inputFile) {
-    cache.add(inputFile);
-    if (inputFile.language() != null) {
-      languages.add(inputFile.language());
-    }
-    return this;
-  }
-
-  /**
-   * Adds a language to the list. To be used only for unit tests that need to use {@link #languages()} without
-   * using {@link #add(org.sonar.api.batch.fs.InputFile)}.
-   */
-  public DefaultFileSystem addLanguages(String language, String... others) {
-    languages.add(language);
-    Collections.addAll(languages, others);
-    return this;
-  }
-
-  @Override
-  public SortedSet<String> languages() {
-    doPreloadFiles();
-    return languages;
-  }
-
-  @Override
-  public FilePredicates predicates() {
-    return predicates;
-  }
-
-  /**
-   * This method is called before each search of files.
-   */
-  protected void doPreloadFiles() {
-    // nothing to do by default
-  }
-
-  public static abstract class Cache {
-    protected abstract Iterable<InputFile> inputFiles();
-
-    @CheckForNull
-    protected abstract InputFile inputFile(RelativePathPredicate predicate);
-
-    protected abstract void doAdd(InputFile inputFile);
-
-    final void add(InputFile inputFile) {
-      doAdd(inputFile);
-    }
-  }
-
-  /**
-   * Used only for testing
-   */
-  private static class MapCache extends Cache {
-    private final Map<String, InputFile> fileMap = new HashMap<String, InputFile>();
-
-    @Override
-    public Iterable<InputFile> inputFiles() {
-      return new ArrayList<InputFile>(fileMap.values());
-    }
-
-    @Override
-    public InputFile inputFile(RelativePathPredicate predicate) {
-      return fileMap.get(predicate.path());
-    }
-
-    @Override
-    protected void doAdd(InputFile inputFile) {
-      fileMap.put(inputFile.relativePath(), inputFile);
-    }
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java
deleted file mode 100644 (file)
index 5767d74..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.internal.FilenameUtils;
-
-import javax.annotation.CheckForNull;
-
-import java.io.File;
-import java.io.Serializable;
-
-/**
- * @since 4.2
- */
-public class DefaultInputFile implements InputFile, Serializable {
-
-  private final String relativePath;
-  private String absolutePath;
-  private String language;
-  private Type type = Type.MAIN;
-  private Status status;
-  private String hash;
-  private int lines;
-  private String key;
-
-  public DefaultInputFile(String relativePath) {
-    this.relativePath = FilenameUtils.normalize(relativePath);
-  }
-
-  @Override
-  public String relativePath() {
-    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;
-  }
-
-  @Override
-  public File file() {
-    if (absolutePath == null) {
-      throw new IllegalStateException("Can not return the java.io.File because absolute path is not set (see method setFile(java.io.File))");
-    }
-    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;
-  }
-
-  @Override
-  public Type type() {
-    return type;
-  }
-
-  /**
-   * 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)}
-   */
-  @CheckForNull
-  public String hash() {
-    return hash;
-  }
-
-  @Override
-  public int lines() {
-    return lines;
-  }
-
-  /**
-   * Component key. It's marked as nullable just for the unit tests that
-   * do not previously call {@link #setKey(String)}.
-   */
-  @CheckForNull
-  public String key() {
-    return key;
-  }
-
-  public DefaultInputFile setAbsolutePath(String s) {
-    this.absolutePath = FilenameUtils.normalize(s);
-    return this;
-  }
-
-  public DefaultInputFile setLanguage(String language) {
-    this.language = language;
-    return this;
-  }
-
-  public DefaultInputFile setFile(File file) {
-    setAbsolutePath(file.getAbsolutePath());
-    return this;
-  }
-
-  public DefaultInputFile setType(Type type) {
-    this.type = type;
-    return this;
-  }
-
-  public DefaultInputFile setStatus(Status status) {
-    this.status = status;
-    return this;
-  }
-
-  public DefaultInputFile setHash(String hash) {
-    this.hash = hash;
-    return this;
-  }
-
-  public DefaultInputFile setLines(int lines) {
-    this.lines = lines;
-    return this;
-  }
-
-  public DefaultInputFile setKey(String s) {
-    this.key = s;
-    return this;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (!(o instanceof DefaultInputFile)) {
-      return false;
-    }
-
-    DefaultInputFile that = (DefaultInputFile) o;
-    return relativePath.equals(that.relativePath);
-  }
-
-  @Override
-  public int hashCode() {
-    return relativePath.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return "[relative=" + relativePath + ", abs=" + absolutePath + "]";
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java
deleted file mode 100644 (file)
index b092f84..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-class FalsePredicate implements FilePredicate {
-
-  static final FilePredicate FALSE = new FalsePredicate();
-
-  @Override
-  public boolean apply(InputFile inputFile) {
-    return false;
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java
deleted file mode 100644 (file)
index 77d2f74..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-/**
- * @since 4.2
- */
-class LanguagePredicate implements FilePredicate {
-  private final String language;
-
-  LanguagePredicate(String language) {
-    this.language = language;
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    return language.equals(f.language());
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java
deleted file mode 100644 (file)
index 5f2359e..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-/**
- * @since 4.2
- */
-class NotPredicate implements FilePredicate {
-
-  private final FilePredicate predicate;
-
-  NotPredicate(FilePredicate predicate) {
-    this.predicate = predicate;
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    return !predicate.apply(f);
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java
deleted file mode 100644 (file)
index a887c63..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-/**
- * @since 4.2
- */
-class OrPredicate implements FilePredicate {
-
-  private final Collection<FilePredicate> predicates;
-
-  OrPredicate(Collection<FilePredicate> predicates) {
-    if (predicates.isEmpty()) {
-      this.predicates = Arrays.asList(TruePredicate.TRUE);
-    } else {
-      this.predicates = predicates;
-    }
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    for (FilePredicate predicate : predicates) {
-      if (predicate.apply(f)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPattern.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPattern.java
deleted file mode 100644 (file)
index cdcfd8e..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.internal.FilenameUtils;
-import org.sonar.batch.api.internal.StringUtils;
-import org.sonar.batch.api.internal.WildcardPattern;
-
-public abstract class PathPattern {
-
-  final WildcardPattern pattern;
-
-  PathPattern(String pattern) {
-    this.pattern = WildcardPattern.create(pattern);
-  }
-
-  public abstract boolean match(InputFile inputFile);
-
-  public abstract boolean match(InputFile inputFile, boolean caseSensitiveFileExtension);
-
-  public static PathPattern create(String s) {
-    String trimmed = StringUtils.trim(s);
-    if (StringUtils.startsWithIgnoreCase(trimmed, "file:")) {
-      return new AbsolutePathPattern(StringUtils.substring(trimmed, "file:".length()));
-    }
-    return new RelativePathPattern(trimmed);
-  }
-
-  public static PathPattern[] create(String[] s) {
-    PathPattern[] result = new PathPattern[s.length];
-    for (int i = 0; i < s.length; i++) {
-      result[i] = create(s[i]);
-    }
-    return result;
-  }
-
-  private static class AbsolutePathPattern extends PathPattern {
-    private AbsolutePathPattern(String pattern) {
-      super(pattern);
-    }
-
-    @Override
-    public boolean match(InputFile inputFile) {
-      return match(inputFile, true);
-    }
-
-    @Override
-    public boolean match(InputFile inputFile, boolean caseSensitiveFileExtension) {
-      String path = inputFile.absolutePath();
-      if (!caseSensitiveFileExtension) {
-        String extension = sanitizeExtension(FilenameUtils.getExtension(inputFile.file().getName()));
-        if (StringUtils.isNotBlank(extension)) {
-          path = StringUtils.removeEndIgnoreCase(path, extension);
-          path = path + extension;
-        }
-      }
-      return pattern.match(path);
-    }
-
-    @Override
-    public String toString() {
-      return "file:" + pattern.toString();
-    }
-  }
-
-  /**
-   * Path relative to module basedir
-   */
-  private static class RelativePathPattern extends PathPattern {
-    private RelativePathPattern(String pattern) {
-      super(pattern);
-    }
-
-    @Override
-    public boolean match(InputFile inputFile) {
-      return match(inputFile, true);
-    }
-
-    @Override
-    public boolean match(InputFile inputFile, boolean caseSensitiveFileExtension) {
-      String path = inputFile.relativePath();
-      if (!caseSensitiveFileExtension) {
-        String extension = sanitizeExtension(FilenameUtils.getExtension(inputFile.file().getName()));
-        if (StringUtils.isNotBlank(extension)) {
-          path = StringUtils.removeEndIgnoreCase(path, extension);
-          path = path + extension;
-        }
-      }
-      return path != null && pattern.match(path);
-    }
-
-    @Override
-    public String toString() {
-      return pattern.toString();
-    }
-  }
-
-  static String sanitizeExtension(String suffix) {
-    return StringUtils.lowerCase(StringUtils.removeStart(suffix, "."));
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java
deleted file mode 100644 (file)
index 0cf614b..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-/**
- * @since 4.2
- */
-class PathPatternPredicate implements FilePredicate {
-
-  private final PathPattern pattern;
-
-  PathPatternPredicate(PathPattern pattern) {
-    this.pattern = pattern;
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    return pattern.match(f);
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java
deleted file mode 100644 (file)
index d0c4a3d..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-import org.sonar.batch.api.internal.FilenameUtils;
-
-/**
- * @since 4.2
- */
-public class RelativePathPredicate implements FilePredicate {
-
-  private final String path;
-
-  RelativePathPredicate(String path) {
-    this.path = FilenameUtils.normalize(path);
-  }
-
-  public String path() {
-    return path;
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    return path.equals(f.relativePath());
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java
deleted file mode 100644 (file)
index fe7c934..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-/**
- * @since 4.2
- */
-class StatusPredicate implements FilePredicate {
-
-  private final InputFile.Status status;
-
-  StatusPredicate(InputFile.Status status) {
-    this.status = status;
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    return status == f.status();
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java
deleted file mode 100644 (file)
index ec2aebd..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-class TruePredicate implements FilePredicate {
-
-  static final FilePredicate TRUE = new TruePredicate();
-
-  @Override
-  public boolean apply(InputFile inputFile) {
-    return true;
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java
deleted file mode 100644 (file)
index ac8b6d5..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.InputFile;
-
-/**
- * @since 4.2
- */
-class TypePredicate implements FilePredicate {
-
-  private final InputFile.Type type;
-
-  TypePredicate(InputFile.Type type) {
-    this.type = type;
-  }
-
-  @Override
-  public boolean apply(InputFile f) {
-    return type == f.type();
-  }
-
-}
-
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/package-info.java
deleted file mode 100644 (file)
index 713fe61..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.api.batch.fs.internal;
-
-import javax.annotation.ParametersAreNonnullByDefault;
-
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/fs/package-info.java
deleted file mode 100644 (file)
index c97db58..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.api.batch.fs;
-
-import javax.annotation.ParametersAreNonnullByDefault;
-
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/FilenameUtils.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/FilenameUtils.java
deleted file mode 100644 (file)
index 0461255..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * 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.batch.api.internal;
-
-import java.io.File;
-
-/**
- * Copied from commons io
- *
- */
-public class FilenameUtils {
-
-  public static final char EXTENSION_SEPARATOR = '.';
-
-  private static final char UNIX_SEPARATOR = '/';
-
-  /**
-   * The Windows separator character.
-   */
-  private static final char WINDOWS_SEPARATOR = '\\';
-
-  /**
-   * The system separator character.
-   */
-  private static final char SYSTEM_SEPARATOR = File.separatorChar;
-
-  /**
-   * The separator character that is the opposite of the system separator.
-   */
-  private static final char OTHER_SEPARATOR;
-  static {
-    if (isSystemWindows()) {
-      OTHER_SEPARATOR = UNIX_SEPARATOR;
-    } else {
-      OTHER_SEPARATOR = WINDOWS_SEPARATOR;
-    }
-  }
-
-  static boolean isSystemWindows() {
-    return SYSTEM_SEPARATOR == WINDOWS_SEPARATOR;
-  }
-
-  public static String normalize(String filename) {
-    return doNormalize(filename, UNIX_SEPARATOR, true);
-  }
-
-  private static String doNormalize(String filename, char separator, boolean keepSeparator) {
-    if (filename == null) {
-      return null;
-    }
-    int size = filename.length();
-    if (size == 0) {
-      return filename;
-    }
-    int prefix = getPrefixLength(filename);
-    if (prefix < 0) {
-      return null;
-    }
-
-    char[] array = new char[size + 2]; // +1 for possible extra slash, +2 for arraycopy
-    filename.getChars(0, filename.length(), array, 0);
-
-    // fix separators throughout
-    char otherSeparator = separator == SYSTEM_SEPARATOR ? OTHER_SEPARATOR : SYSTEM_SEPARATOR;
-    for (int i = 0; i < array.length; i++) {
-      if (array[i] == otherSeparator) {
-        array[i] = separator;
-      }
-    }
-
-    // add extra separator on the end to simplify code below
-    boolean lastIsDirectory = true;
-    if (array[size - 1] != separator) {
-      array[size++] = separator;
-      lastIsDirectory = false;
-    }
-
-    // adjoining slashes
-    for (int i = prefix + 1; i < size; i++) {
-      if (array[i] == separator && array[i - 1] == separator) {
-        System.arraycopy(array, i, array, i - 1, size - i);
-        size--;
-        i--;
-      }
-    }
-
-    // dot slash
-    for (int i = prefix + 1; i < size; i++) {
-      if (array[i] == separator && array[i - 1] == '.' &&
-        (i == prefix + 1 || array[i - 2] == separator)) {
-        if (i == size - 1) {
-          lastIsDirectory = true;
-        }
-        System.arraycopy(array, i + 1, array, i - 1, size - i);
-        size -= 2;
-        i--;
-      }
-    }
-
-    // double dot slash
-    outer: for (int i = prefix + 2; i < size; i++) {
-      if (array[i] == separator && array[i - 1] == '.' && array[i - 2] == '.' &&
-        (i == prefix + 2 || array[i - 3] == separator)) {
-        if (i == prefix + 2) {
-          return null;
-        }
-        if (i == size - 1) {
-          lastIsDirectory = true;
-        }
-        int j;
-        for (j = i - 4; j >= prefix; j--) {
-          if (array[j] == separator) {
-            // remove b/../ from a/b/../c
-            System.arraycopy(array, i + 1, array, j + 1, size - i);
-            size -= i - j;
-            i = j + 1;
-            continue outer;
-          }
-        }
-        // remove a/../ from a/../c
-        System.arraycopy(array, i + 1, array, prefix, size - i);
-        size -= i + 1 - prefix;
-        i = prefix + 1;
-      }
-    }
-
-    if (size <= 0) { // should never be less than 0
-      return "";
-    }
-    if (size <= prefix) { // should never be less than prefix
-      return new String(array, 0, size);
-    }
-    if (lastIsDirectory && keepSeparator) {
-      return new String(array, 0, size); // keep trailing separator
-    }
-    return new String(array, 0, size - 1); // lose trailing separator
-  }
-
-  public static int getPrefixLength(String filename) {
-    if (filename == null) {
-      return -1;
-    }
-    int len = filename.length();
-    if (len == 0) {
-      return 0;
-    }
-    char ch0 = filename.charAt(0);
-    if (ch0 == ':') {
-      return -1;
-    }
-    if (len == 1) {
-      if (ch0 == '~') {
-        return 2; // return a length greater than the input
-      }
-      return isSeparator(ch0) ? 1 : 0;
-    } else {
-      if (ch0 == '~') {
-        int posUnix = filename.indexOf(UNIX_SEPARATOR, 1);
-        int posWin = filename.indexOf(WINDOWS_SEPARATOR, 1);
-        if (posUnix == -1 && posWin == -1) {
-          return len + 1; // return a length greater than the input
-        }
-        posUnix = posUnix == -1 ? posWin : posUnix;
-        posWin = posWin == -1 ? posUnix : posWin;
-        return Math.min(posUnix, posWin) + 1;
-      }
-      char ch1 = filename.charAt(1);
-      if (ch1 == ':') {
-        ch0 = Character.toUpperCase(ch0);
-        if (ch0 >= 'A' && ch0 <= 'Z') {
-          if (len == 2 || isSeparator(filename.charAt(2)) == false) {
-            return 2;
-          }
-          return 3;
-        }
-        return -1;
-
-      } else if (isSeparator(ch0) && isSeparator(ch1)) {
-        int posUnix = filename.indexOf(UNIX_SEPARATOR, 2);
-        int posWin = filename.indexOf(WINDOWS_SEPARATOR, 2);
-        if (posUnix == -1 && posWin == -1 || posUnix == 2 || posWin == 2) {
-          return -1;
-        }
-        posUnix = posUnix == -1 ? posWin : posUnix;
-        posWin = posWin == -1 ? posUnix : posWin;
-        return Math.min(posUnix, posWin) + 1;
-      } else {
-        return isSeparator(ch0) ? 1 : 0;
-      }
-    }
-  }
-
-  private static boolean isSeparator(char ch) {
-    return ch == UNIX_SEPARATOR || ch == WINDOWS_SEPARATOR;
-  }
-
-  public static String getExtension(String filename) {
-    if (filename == null) {
-      return null;
-    }
-    int index = indexOfExtension(filename);
-    if (index == -1) {
-      return "";
-    } else {
-      return filename.substring(index + 1);
-    }
-  }
-
-  public static int indexOfExtension(String filename) {
-    if (filename == null) {
-      return -1;
-    }
-    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
-    int lastSeparator = indexOfLastSeparator(filename);
-    return lastSeparator > extensionPos ? -1 : extensionPos;
-  }
-
-  public static int indexOfLastSeparator(String filename) {
-    if (filename == null) {
-      return -1;
-    }
-    int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
-    int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
-    return Math.max(lastUnixPos, lastWindowsPos);
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/Preconditions.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/Preconditions.java
deleted file mode 100644 (file)
index 75ac73f..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * 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.batch.api.internal;
-
-import javax.annotation.Nullable;
-
-/**
- * Copied from Guava
- */
-public final class Preconditions {
-  private Preconditions() {
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the
-   * calling method.
-   *
-   * @param expression a boolean expression
-   * @throws IllegalArgumentException if {@code expression} is false
-   */
-  public static void checkArgument(boolean expression) {
-    if (!expression) {
-      throw new IllegalArgumentException();
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the
-   * calling method.
-   *
-   * @param expression a boolean expression
-   * @param errorMessage the exception message to use if the check fails; will
-   *     be converted to a string using {@link String#valueOf(Object)}
-   * @throws IllegalArgumentException if {@code expression} is false
-   */
-  public static void checkArgument(
-    boolean expression, @Nullable Object errorMessage) {
-    if (!expression) {
-      throw new IllegalArgumentException(String.valueOf(errorMessage));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the
-   * calling method.
-   *
-   * @param expression a boolean expression
-   * @param errorMessageTemplate a template for the exception message should the
-   *     check fail. The message is formed by replacing each {@code %s}
-   *     placeholder in the template with an argument. These are matched by
-   *     position - the first {@code %s} gets {@code errorMessageArgs[0]}, etc.
-   *     Unmatched arguments will be appended to the formatted message in square
-   *     braces. Unmatched placeholders will be left as-is.
-   * @param errorMessageArgs the arguments to be substituted into the message
-   *     template. Arguments are converted to strings using
-   *     {@link String#valueOf(Object)}.
-   * @throws IllegalArgumentException if {@code expression} is false
-   * @throws NullPointerException if the check fails and either {@code
-   *     errorMessageTemplate} or {@code errorMessageArgs} is null (don't let
-   *     this happen)
-   */
-  public static void checkArgument(boolean expression,
-    @Nullable String errorMessageTemplate,
-    @Nullable Object... errorMessageArgs) {
-    if (!expression) {
-      throw new IllegalArgumentException(
-        format(errorMessageTemplate, errorMessageArgs));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling
-   * instance, but not involving any parameters to the calling method.
-   *
-   * @param expression a boolean expression
-   * @throws IllegalStateException if {@code expression} is false
-   */
-  public static void checkState(boolean expression) {
-    if (!expression) {
-      throw new IllegalStateException();
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling
-   * instance, but not involving any parameters to the calling method.
-   *
-   * @param expression a boolean expression
-   * @param errorMessage the exception message to use if the check fails; will
-   *     be converted to a string using {@link String#valueOf(Object)}
-   * @throws IllegalStateException if {@code expression} is false
-   */
-  public static void checkState(
-    boolean expression, @Nullable Object errorMessage) {
-    if (!expression) {
-      throw new IllegalStateException(String.valueOf(errorMessage));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling
-   * instance, but not involving any parameters to the calling method.
-   *
-   * @param expression a boolean expression
-   * @param errorMessageTemplate a template for the exception message should the
-   *     check fail. The message is formed by replacing each {@code %s}
-   *     placeholder in the template with an argument. These are matched by
-   *     position - the first {@code %s} gets {@code errorMessageArgs[0]}, etc.
-   *     Unmatched arguments will be appended to the formatted message in square
-   *     braces. Unmatched placeholders will be left as-is.
-   * @param errorMessageArgs the arguments to be substituted into the message
-   *     template. Arguments are converted to strings using
-   *     {@link String#valueOf(Object)}.
-   * @throws IllegalStateException if {@code expression} is false
-   * @throws NullPointerException if the check fails and either {@code
-   *     errorMessageTemplate} or {@code errorMessageArgs} is null (don't let
-   *     this happen)
-   */
-  public static void checkState(boolean expression,
-    @Nullable String errorMessageTemplate,
-    @Nullable Object... errorMessageArgs) {
-    if (!expression) {
-      throw new IllegalStateException(
-        format(errorMessageTemplate, errorMessageArgs));
-    }
-  }
-
-  /**
-   * Ensures that an object reference passed as a parameter to the calling
-   * method is not null.
-   *
-   * @param reference an object reference
-   * @return the non-null reference that was validated
-   * @throws NullPointerException if {@code reference} is null
-   */
-  public static <T> T checkNotNull(T reference) {
-    if (reference == null) {
-      throw new NullPointerException();
-    }
-    return reference;
-  }
-
-  /**
-   * Ensures that an object reference passed as a parameter to the calling
-   * method is not null.
-   *
-   * @param reference an object reference
-   * @param errorMessage the exception message to use if the check fails; will
-   *     be converted to a string using {@link String#valueOf(Object)}
-   * @return the non-null reference that was validated
-   * @throws NullPointerException if {@code reference} is null
-   */
-  public static <T> T checkNotNull(T reference, @Nullable Object errorMessage) {
-    if (reference == null) {
-      throw new NullPointerException(String.valueOf(errorMessage));
-    }
-    return reference;
-  }
-
-  /**
-   * Ensures that an object reference passed as a parameter to the calling
-   * method is not null.
-   *
-   * @param reference an object reference
-   * @param errorMessageTemplate a template for the exception message should the
-   *     check fail. The message is formed by replacing each {@code %s}
-   *     placeholder in the template with an argument. These are matched by
-   *     position - the first {@code %s} gets {@code errorMessageArgs[0]}, etc.
-   *     Unmatched arguments will be appended to the formatted message in square
-   *     braces. Unmatched placeholders will be left as-is.
-   * @param errorMessageArgs the arguments to be substituted into the message
-   *     template. Arguments are converted to strings using
-   *     {@link String#valueOf(Object)}.
-   * @return the non-null reference that was validated
-   * @throws NullPointerException if {@code reference} is null
-   */
-  public static <T> T checkNotNull(T reference,
-    @Nullable String errorMessageTemplate,
-    @Nullable Object... errorMessageArgs) {
-    if (reference == null) {
-      // If either of these parameters is null, the right thing happens anyway
-      throw new NullPointerException(
-        format(errorMessageTemplate, errorMessageArgs));
-    }
-    return reference;
-  }
-
-  /*
-   * All recent hotspots (as of 2009) *really* like to have the natural code
-   * 
-   * if (guardExpression) {
-   * throw new BadException(messageExpression);
-   * }
-   * 
-   * refactored so that messageExpression is moved to a separate
-   * String-returning method.
-   * 
-   * if (guardExpression) {
-   * throw new BadException(badMsg(...));
-   * }
-   * 
-   * The alternative natural refactorings into void or Exception-returning
-   * methods are much slower. This is a big deal - we're talking factors of
-   * 2-8 in microbenchmarks, not just 10-20%. (This is a hotspot optimizer
-   * bug, which should be fixed, but that's a separate, big project).
-   * 
-   * The coding pattern above is heavily used in java.util, e.g. in ArrayList.
-   * There is a RangeCheckMicroBenchmark in the JDK that was used to test this.
-   * 
-   * But the methods in this class want to throw different exceptions,
-   * depending on the args, so it appears that this pattern is not directly
-   * applicable. But we can use the ridiculous, devious trick of throwing an
-   * exception in the middle of the construction of another exception.
-   * Hotspot is fine with that.
-   */
-
-  /**
-   * Ensures that {@code index} specifies a valid <i>element</i> in an array,
-   * list or string of size {@code size}. An element index may range from zero,
-   * inclusive, to {@code size}, exclusive.
-   *
-   * @param index a user-supplied index identifying an element of an array, list
-   *     or string
-   * @param size the size of that array, list or string
-   * @return the value of {@code index}
-   * @throws IndexOutOfBoundsException if {@code index} is negative or is not
-   *     less than {@code size}
-   * @throws IllegalArgumentException if {@code size} is negative
-   */
-  public static int checkElementIndex(int index, int size) {
-    return checkElementIndex(index, size, "index");
-  }
-
-  /**
-   * Ensures that {@code index} specifies a valid <i>element</i> in an array,
-   * list or string of size {@code size}. An element index may range from zero,
-   * inclusive, to {@code size}, exclusive.
-   *
-   * @param index a user-supplied index identifying an element of an array, list
-   *     or string
-   * @param size the size of that array, list or string
-   * @param desc the text to use to describe this index in an error message
-   * @return the value of {@code index}
-   * @throws IndexOutOfBoundsException if {@code index} is negative or is not
-   *     less than {@code size}
-   * @throws IllegalArgumentException if {@code size} is negative
-   */
-  public static int checkElementIndex(
-    int index, int size, @Nullable String desc) {
-    // Carefully optimized for execution by hotspot (explanatory comment above)
-    if (index < 0 || index >= size) {
-      throw new IndexOutOfBoundsException(badElementIndex(index, size, desc));
-    }
-    return index;
-  }
-
-  private static String badElementIndex(int index, int size, String desc) {
-    if (index < 0) {
-      return format("%s (%s) must not be negative", desc, index);
-    } else if (size < 0) {
-      throw new IllegalArgumentException("negative size: " + size);
-    } else { // index >= size
-      return format("%s (%s) must be less than size (%s)", desc, index, size);
-    }
-  }
-
-  /**
-   * Ensures that {@code index} specifies a valid <i>position</i> in an array,
-   * list or string of size {@code size}. A position index may range from zero
-   * to {@code size}, inclusive.
-   *
-   * @param index a user-supplied index identifying a position in an array, list
-   *     or string
-   * @param size the size of that array, list or string
-   * @return the value of {@code index}
-   * @throws IndexOutOfBoundsException if {@code index} is negative or is
-   *     greater than {@code size}
-   * @throws IllegalArgumentException if {@code size} is negative
-   */
-  public static int checkPositionIndex(int index, int size) {
-    return checkPositionIndex(index, size, "index");
-  }
-
-  /**
-   * Ensures that {@code index} specifies a valid <i>position</i> in an array,
-   * list or string of size {@code size}. A position index may range from zero
-   * to {@code size}, inclusive.
-   *
-   * @param index a user-supplied index identifying a position in an array, list
-   *     or string
-   * @param size the size of that array, list or string
-   * @param desc the text to use to describe this index in an error message
-   * @return the value of {@code index}
-   * @throws IndexOutOfBoundsException if {@code index} is negative or is
-   *     greater than {@code size}
-   * @throws IllegalArgumentException if {@code size} is negative
-   */
-  public static int checkPositionIndex(
-    int index, int size, @Nullable String desc) {
-    // Carefully optimized for execution by hotspot (explanatory comment above)
-    if (index < 0 || index > size) {
-      throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc));
-    }
-    return index;
-  }
-
-  private static String badPositionIndex(int index, int size, String desc) {
-    if (index < 0) {
-      return format("%s (%s) must not be negative", desc, index);
-    } else if (size < 0) {
-      throw new IllegalArgumentException("negative size: " + size);
-    } else { // index > size
-      return format("%s (%s) must not be greater than size (%s)",
-        desc, index, size);
-    }
-  }
-
-  /**
-   * Ensures that {@code start} and {@code end} specify a valid <i>positions</i>
-   * in an array, list or string of size {@code size}, and are in order. A
-   * position index may range from zero to {@code size}, inclusive.
-   *
-   * @param start a user-supplied index identifying a starting position in an
-   *     array, list or string
-   * @param end a user-supplied index identifying a ending position in an array,
-   *     list or string
-   * @param size the size of that array, list or string
-   * @throws IndexOutOfBoundsException if either index is negative or is
-   *     greater than {@code size}, or if {@code end} is less than {@code start}
-   * @throws IllegalArgumentException if {@code size} is negative
-   */
-  public static void checkPositionIndexes(int start, int end, int size) {
-    // Carefully optimized for execution by hotspot (explanatory comment above)
-    if (start < 0 || end < start || end > size) {
-      throw new IndexOutOfBoundsException(badPositionIndexes(start, end, size));
-    }
-  }
-
-  private static String badPositionIndexes(int start, int end, int size) {
-    if (start < 0 || start > size) {
-      return badPositionIndex(start, size, "start index");
-    }
-    if (end < 0 || end > size) {
-      return badPositionIndex(end, size, "end index");
-    }
-    // end < start
-    return format("end index (%s) must not be less than start index (%s)",
-      end, start);
-  }
-
-  /**
-   * Substitutes each {@code %s} in {@code template} with an argument. These
-   * are matched by position - the first {@code %s} gets {@code args[0]}, etc.
-   * If there are more arguments than placeholders, the unmatched arguments will
-   * be appended to the end of the formatted message in square braces.
-   *
-   * @param template a non-null string containing 0 or more {@code %s}
-   *     placeholders.
-   * @param args the arguments to be substituted into the message
-   *     template. Arguments are converted to strings using
-   *     {@link String#valueOf(Object)}. Arguments can be null.
-   */
-  static String format(String template,
-    @Nullable Object... args) {
-    template = String.valueOf(template); // null -> "null"
-
-    // start substituting the arguments into the '%s' placeholders
-    StringBuilder builder = new StringBuilder(
-      template.length() + 16 * args.length);
-    int templateStart = 0;
-    int i = 0;
-    while (i < args.length) {
-      int placeholderStart = template.indexOf("%s", templateStart);
-      if (placeholderStart == -1) {
-        break;
-      }
-      builder.append(template.substring(templateStart, placeholderStart));
-      builder.append(args[i++]);
-      templateStart = placeholderStart + 2;
-    }
-    builder.append(template.substring(templateStart));
-
-    // if we run out of placeholders, append the extra args in square braces
-    if (i < args.length) {
-      builder.append(" [");
-      builder.append(args[i++]);
-      while (i < args.length) {
-        builder.append(", ");
-        builder.append(args[i++]);
-      }
-      builder.append(']');
-    }
-
-    return builder.toString();
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/StringUtils.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/StringUtils.java
deleted file mode 100644 (file)
index ab279ae..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.batch.api.internal;
-
-/**
- * Copied from commons lang
- */
-public class StringUtils {
-
-  public static final String EMPTY = "";
-
-  public static String trim(String str) {
-    return str == null ? null : str.trim();
-  }
-
-  public static String removeStart(String str, String remove) {
-    if (isEmpty(str) || isEmpty(remove)) {
-      return str;
-    }
-    if (str.startsWith(remove)) {
-      return str.substring(remove.length());
-    }
-    return str;
-  }
-
-  public static String removeEnd(String str, String remove) {
-    if (isEmpty(str) || isEmpty(remove)) {
-      return str;
-    }
-    if (str.endsWith(remove)) {
-      return str.substring(0, str.length() - remove.length());
-    }
-    return str;
-  }
-
-  public static boolean isEmpty(String str) {
-    return str == null || str.length() == 0;
-  }
-
-  public static boolean startsWithIgnoreCase(String str, String prefix) {
-    return startsWith(str, prefix, true);
-  }
-
-  private static boolean startsWith(String str, String prefix, boolean ignoreCase) {
-    if (str == null || prefix == null) {
-      return (str == null && prefix == null);
-    }
-    if (prefix.length() > str.length()) {
-      return false;
-    }
-    return str.regionMatches(ignoreCase, 0, prefix, 0, prefix.length());
-  }
-
-  public static String substring(String str, int start) {
-    if (str == null) {
-      return null;
-    }
-
-    // handle negatives, which means last n characters
-    if (start < 0) {
-      start = str.length() + start; // remember start is negative
-    }
-
-    if (start < 0) {
-      start = 0;
-    }
-    if (start > str.length()) {
-      return EMPTY;
-    }
-
-    return str.substring(start);
-  }
-
-  public static boolean isBlank(String str) {
-    int strLen;
-    if (str == null || (strLen = str.length()) == 0) {
-      return true;
-    }
-    for (int i = 0; i < strLen; i++) {
-      if ((Character.isWhitespace(str.charAt(i)) == false)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  public static boolean isNotBlank(String str) {
-    return !StringUtils.isBlank(str);
-  }
-
-  public static String removeEndIgnoreCase(String str, String remove) {
-    if (isEmpty(str) || isEmpty(remove)) {
-      return str;
-    }
-    if (endsWithIgnoreCase(str, remove)) {
-      return str.substring(0, str.length() - remove.length());
-    }
-    return str;
-  }
-
-  public static boolean endsWithIgnoreCase(String str, String suffix) {
-    return endsWith(str, suffix, true);
-  }
-
-  private static boolean endsWith(String str, String suffix, boolean ignoreCase) {
-    if (str == null || suffix == null) {
-      return (str == null && suffix == null);
-    }
-    if (suffix.length() > str.length()) {
-      return false;
-    }
-    int strOffset = str.length() - suffix.length();
-    return str.regionMatches(ignoreCase, strOffset, suffix, 0, suffix.length());
-  }
-
-  public static String lowerCase(String str) {
-    if (str == null) {
-      return null;
-    }
-    return str.toLowerCase();
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/WildcardPattern.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/WildcardPattern.java
deleted file mode 100644 (file)
index f179fd7..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * 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.batch.api.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Implementation of Ant-style matching patterns.
- * Contrary to other implementations (like AntPathMatcher from Spring Framework) it is based on {@link Pattern Java Regular Expressions}.
- * To increase performance it holds an internal cache of all processed patterns.
- * <p>
- * Following rules are applied:
- * <ul>
- * <li>? matches single character</li>
- * <li>* matches zero or more characters</li>
- * <li>** matches zero or more 'directories'</li>
- * </ul>
- * </p>
- * <p>
- * Some examples of patterns:
- * <ul>
- * <li><code>org/T?st.java</code> - matches <code>org/Test.java</code> and also <code>org/Tost.java</code></li>
- * <li><code>org/*.java</code> - matches all <code>.java</code> files in the <code>org</code> directory,
- * e.g. <code>org/Foo.java</code> or <code>org/Bar.java</code></li>
- * <li><code>org/**</code> - matches all files underneath the <code>org</code> directory,
- * e.g. <code>org/Foo.java</code> or <code>org/foo/bar.jsp</code></li>
- * <li><code>org/&#42;&#42;/Test.java</code> - matches all <code>Test.java</code> files underneath the <code>org</code> directory,
- * e.g. <code>org/Test.java</code> or <code>org/foo/Test.java</code> or <code>org/foo/bar/Test.java</code></li>
- * <li><code>org/&#42;&#42;/*.java</code> - matches all <code>.java</code> files underneath the <code>org</code> directory,
- * e.g. <code>org/Foo.java</code> or <code>org/foo/Bar.java</code> or <code>org/foo/bar/Baz.java</code></li>
- * </ul>
- * </p>
- * <p>
- * Another implementation, which is also based on Java Regular Expressions, can be found in
- * <a href="https://github.com/JetBrains/intellij-community/blob/idea/107.743/platform/util/src/com/intellij/openapi/util/io/FileUtil.java#L847">FileUtil</a>
- * from IntelliJ OpenAPI.
- * </p>
- * 
- */
-public class WildcardPattern {
-
-  private static final Map<String, WildcardPattern> CACHE = new HashMap<String, WildcardPattern>();
-  private static final String SPECIAL_CHARS = "()[]^$.{}+|";
-
-  private Pattern pattern;
-  private String stringRepresentation;
-
-  protected WildcardPattern(String pattern, String directorySeparator) {
-    this.stringRepresentation = pattern;
-    this.pattern = Pattern.compile(toRegexp(pattern, directorySeparator));
-  }
-
-  private static String toRegexp(String antPattern, String directorySeparator) {
-    final String escapedDirectorySeparator = '\\' + directorySeparator;
-
-    final StringBuilder sb = new StringBuilder(antPattern.length());
-
-    sb.append('^');
-
-    int i = antPattern.startsWith("/") || antPattern.startsWith("\\") ? 1 : 0;
-    while (i < antPattern.length()) {
-      final char ch = antPattern.charAt(i);
-
-      if (SPECIAL_CHARS.indexOf(ch) != -1) {
-        // Escape regexp-specific characters
-        sb.append('\\').append(ch);
-      } else if (ch == '*') {
-        if (i + 1 < antPattern.length() && antPattern.charAt(i + 1) == '*') {
-          // Double asterisk
-          // Zero or more directories
-          if (i + 2 < antPattern.length() && isSlash(antPattern.charAt(i + 2))) {
-            sb.append("(?:.*").append(escapedDirectorySeparator).append("|)");
-            i += 2;
-          } else {
-            sb.append(".*");
-            i += 1;
-          }
-        } else {
-          // Single asterisk
-          // Zero or more characters excluding directory separator
-          sb.append("[^").append(escapedDirectorySeparator).append("]*?");
-        }
-      } else if (ch == '?') {
-        // Any single character excluding directory separator
-        sb.append("[^").append(escapedDirectorySeparator).append("]");
-      } else if (isSlash(ch)) {
-        // Directory separator
-        sb.append(escapedDirectorySeparator);
-      } else {
-        // Single character
-        sb.append(ch);
-      }
-
-      i++;
-    }
-
-    sb.append('$');
-
-    return sb.toString();
-  }
-
-  private static boolean isSlash(char ch) {
-    return ch == '/' || ch == '\\';
-  }
-
-  /**
-   * Returns string representation of this pattern.
-   * 
-   * @since 2.5
-   */
-  @Override
-  public String toString() {
-    return stringRepresentation;
-  }
-
-  /**
-   * Returns true if specified value matches this pattern.
-   */
-  public boolean match(String value) {
-    value = StringUtils.removeStart(value, "/");
-    value = StringUtils.removeEnd(value, "/");
-    return pattern.matcher(value).matches();
-  }
-
-  /**
-   * Returns true if specified value matches one of specified patterns.
-   * 
-   * @since 2.4
-   */
-  public static boolean match(WildcardPattern[] patterns, String value) {
-    for (WildcardPattern pattern : patterns) {
-      if (pattern.match(value)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Creates pattern with "/" as a directory separator.
-   * 
-   * @see #create(String, String)
-   */
-  public static WildcardPattern create(String pattern) {
-    return create(pattern, "/");
-  }
-
-  /**
-   * Creates array of patterns with "/" as a directory separator.
-   * 
-   * @see #create(String, String)
-   */
-  public static WildcardPattern[] create(String[] patterns) {
-    if (patterns == null) {
-      return new WildcardPattern[0];
-    }
-    WildcardPattern[] exclusionPAtterns = new WildcardPattern[patterns.length];
-    for (int i = 0; i < patterns.length; i++) {
-      exclusionPAtterns[i] = create(patterns[i]);
-    }
-    return exclusionPAtterns;
-  }
-
-  /**
-   * Creates pattern with specified separator for directories.
-   * <p>
-   * This is used to match Java-classes, i.e. <code>org.foo.Bar</code> against <code>org/**</code>.
-   * <b>However usage of character other than "/" as a directory separator is misleading and should be avoided,
-   * so method {@link #create(String)} is preferred over this one.</b>
-   * </p>
-   * <p>
-   * Also note that no matter whether forward or backward slashes were used in the <code>antPattern</code>
-   * the returned pattern will use <code>directorySeparator</code>.
-   * Thus to match Windows-style path "dir\file.ext" against pattern "dir/file.ext" normalization should be performed.
-   * </p>
-   */
-  public static WildcardPattern create(String pattern, String directorySeparator) {
-    String key = pattern + directorySeparator;
-    WildcardPattern wildcardPattern = CACHE.get(key);
-    if (wildcardPattern == null) {
-      wildcardPattern = new WildcardPattern(pattern, directorySeparator);
-      CACHE.put(key, wildcardPattern);
-    }
-    return wildcardPattern;
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/internal/package-info.java
deleted file mode 100644 (file)
index 9870b99..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-@javax.annotation.ParametersAreNonnullByDefault
-package org.sonar.batch.api.internal;
\ No newline at end of file
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/languages/Language.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/languages/Language.java
deleted file mode 100644 (file)
index 7dd6c8b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.batch.api.languages;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-public final class Language {
-
-  private final String key, name;
-  private final String[] fileSuffixes;
-
-  public Language(String key, String name, String... fileSuffixes) {
-    this.key = key;
-    this.name = name;
-    this.fileSuffixes = fileSuffixes;
-  }
-
-  /**
-   * For example "java".
-   */
-  public String key() {
-    return key;
-  }
-
-  /**
-   * For example "Java"
-   */
-  public String name() {
-    return name;
-  }
-
-  /**
-   * For example ["jav", "java"].
-   */
-  public Collection<String> fileSuffixes() {
-    return Arrays.asList(fileSuffixes);
-  }
-
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/languages/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/languages/package-info.java
deleted file mode 100644 (file)
index a36d1c1..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-@javax.annotation.ParametersAreNonnullByDefault
-package org.sonar.batch.api.languages;
\ No newline at end of file
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/measures/Metric.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/measures/Metric.java
deleted file mode 100644 (file)
index 52dc17c..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.batch.api.measures;
-
-import java.io.Serializable;
-
-public interface Metric<G extends Serializable> {
-
-  Class<G> type();
-
-  String key();
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/measures/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/measures/package-info.java
deleted file mode 100644 (file)
index e684b54..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-@javax.annotation.ParametersAreNonnullByDefault
-package org.sonar.batch.api.measures;
\ No newline at end of file
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/QProfile.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/QProfile.java
deleted file mode 100644 (file)
index 1d074e1..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.batch.api.rules;
-
-public class QProfile {
-  private final String name, language;
-  private final Integer version;
-
-  public QProfile(String name, String language, Integer version) {
-    this.name = name;
-    this.language = language;
-    this.version = version;
-  }
-
-  public String name() {
-    return name;
-  }
-
-  public String language() {
-    return language;
-  }
-
-  public Integer version() {
-    return version;
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/RuleKey.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/RuleKey.java
deleted file mode 100644 (file)
index 3af1337..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.batch.api.rules;
-
-import java.io.Serializable;
-
-/**
- * Key of a rule. Unique among all the rule repositories.
- *
- * @since 3.6
- */
-public class RuleKey implements Serializable {
-  private final String repository, rule;
-
-  protected RuleKey(String repositoryKey, String ruleKey) {
-    this.repository = repositoryKey;
-    this.rule = ruleKey;
-  }
-
-  /**
-   * Create a key. Parameters are NOT null.
-   */
-  public static RuleKey of(String repository, String rule) {
-    return new RuleKey(repository, rule);
-  }
-
-  /**
-   * Never null
-   */
-  public String repository() {
-    return repository;
-  }
-
-  /**
-   * Never null
-   */
-  public String rule() {
-    return rule;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    RuleKey ruleKey = (RuleKey) o;
-    if (!repository.equals(ruleKey.repository)) {
-      return false;
-    }
-    if (!rule.equals(ruleKey.rule)) {
-      return false;
-    }
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = repository.hashCode();
-    result = 31 * result + rule.hashCode();
-    return result;
-  }
-
-  /**
-   * Format is "repository:rule", for example "squid:AvoidCycle"
-   */
-  @Override
-  public String toString() {
-    return String.format("%s:%s", repository, rule);
-  }
-}
diff --git a/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/package-info.java b/sonar-batch-plugin-api/src/main/java/org/sonar/api/batch/rules/package-info.java
deleted file mode 100644 (file)
index d91eb34..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-@javax.annotation.ParametersAreNonnullByDefault
-package org.sonar.batch.api.rules;
\ No newline at end of file
diff --git a/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java b/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java
deleted file mode 100644 (file)
index 95888fe..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.fest.assertions.Assertions;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.sonar.api.batch.fs.FilePredicate;
-import org.sonar.api.batch.fs.FilePredicates;
-import org.sonar.api.batch.fs.InputFile;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class DefaultFilePredicatesTest {
-
-  @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
-
-  DefaultInputFile javaFile;
-  FilePredicates predicates = new DefaultFilePredicates();
-
-  @Before
-  public void before() throws IOException {
-    javaFile = new DefaultInputFile("src/main/java/struts/Action.java")
-      .setFile(temp.newFile("Action.java"))
-      .setLanguage("java")
-      .setStatus(InputFile.Status.ADDED);
-  }
-
-  @Test
-  public void all() throws Exception {
-    Assertions.assertThat(predicates.all().apply(javaFile)).isTrue();
-  }
-
-  @Test
-  public void none() throws Exception {
-    assertThat(predicates.none().apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void matches_inclusion_pattern() throws Exception {
-    assertThat(predicates.matchesPathPattern("src/main/**/Action.java").apply(javaFile)).isTrue();
-    assertThat(predicates.matchesPathPattern("Action.java").apply(javaFile)).isFalse();
-    assertThat(predicates.matchesPathPattern("src/**/*.php").apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void matches_inclusion_patterns() throws Exception {
-    assertThat(predicates.matchesPathPatterns(new String[] {"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isTrue();
-    assertThat(predicates.matchesPathPatterns(new String[] {}).apply(javaFile)).isTrue();
-    assertThat(predicates.matchesPathPatterns(new String[] {"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void does_not_match_exclusion_pattern() throws Exception {
-    assertThat(predicates.doesNotMatchPathPattern("src/main/**/Action.java").apply(javaFile)).isFalse();
-    assertThat(predicates.doesNotMatchPathPattern("Action.java").apply(javaFile)).isTrue();
-    assertThat(predicates.doesNotMatchPathPattern("src/**/*.php").apply(javaFile)).isTrue();
-  }
-
-  @Test
-  public void does_not_match_exclusion_patterns() throws Exception {
-    assertThat(predicates.doesNotMatchPathPatterns(new String[] {}).apply(javaFile)).isTrue();
-    assertThat(predicates.doesNotMatchPathPatterns(new String[] {"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isTrue();
-    assertThat(predicates.doesNotMatchPathPatterns(new String[] {"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void has_relative_path() throws Exception {
-    assertThat(predicates.hasRelativePath("src/main/java/struts/Action.java").apply(javaFile)).isTrue();
-    assertThat(predicates.hasRelativePath("src/main/java/struts/Other.java").apply(javaFile)).isFalse();
-
-    // path is normalized
-    assertThat(predicates.hasRelativePath("src/main/java/../java/struts/Action.java").apply(javaFile)).isTrue();
-
-    assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Action.java").apply(javaFile)).isTrue();
-    assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Other.java").apply(javaFile)).isFalse();
-    assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\..\\struts\\Action.java").apply(javaFile)).isTrue();
-  }
-
-  @Test
-  public void has_absolute_path() throws Exception {
-    String path = javaFile.file().getAbsolutePath();
-    assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue();
-    assertThat(predicates.hasAbsolutePath(path.replaceAll("/", "\\\\")).apply(javaFile)).isTrue();
-
-    assertThat(predicates.hasAbsolutePath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse();
-    assertThat(predicates.hasAbsolutePath("src/main/java/struts/Action.java").apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void has_path() throws Exception {
-    // is relative path
-    assertThat(predicates.hasPath("src/main/java/struts/Action.java").apply(javaFile)).isTrue();
-    assertThat(predicates.hasPath("src/main/java/struts/Other.java").apply(javaFile)).isFalse();
-
-    // is absolute path
-    String path = javaFile.file().getAbsolutePath();
-    assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue();
-    assertThat(predicates.hasPath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void is_file() throws Exception {
-    // relative file
-    assertThat(predicates.is(new File(javaFile.relativePath())).apply(javaFile)).isTrue();
-
-    // absolute file
-    assertThat(predicates.is(javaFile.file()).apply(javaFile)).isTrue();
-    assertThat(predicates.is(javaFile.file().getAbsoluteFile()).apply(javaFile)).isTrue();
-    assertThat(predicates.is(javaFile.file().getCanonicalFile()).apply(javaFile)).isTrue();
-    assertThat(predicates.is(new File(javaFile.file().toURI())).apply(javaFile)).isTrue();
-    assertThat(predicates.is(temp.newFile()).apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void has_language() throws Exception {
-    assertThat(predicates.hasLanguage("java").apply(javaFile)).isTrue();
-    assertThat(predicates.hasLanguage("php").apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void has_languages() throws Exception {
-    assertThat(predicates.hasLanguages(Arrays.asList("java", "php")).apply(javaFile)).isTrue();
-    assertThat(predicates.hasLanguages(Arrays.asList("cobol", "php")).apply(javaFile)).isFalse();
-    assertThat(predicates.hasLanguages(Collections.<String>emptyList()).apply(javaFile)).isTrue();
-  }
-
-  @Test
-  public void has_status() throws Exception {
-    assertThat(predicates.hasStatus(InputFile.Status.ADDED).apply(javaFile)).isTrue();
-    assertThat(predicates.hasStatus(InputFile.Status.CHANGED).apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void has_type() throws Exception {
-    assertThat(predicates.hasType(InputFile.Type.MAIN).apply(javaFile)).isTrue();
-    assertThat(predicates.hasType(InputFile.Type.TEST).apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void not() throws Exception {
-    assertThat(predicates.not(predicates.hasType(InputFile.Type.MAIN)).apply(javaFile)).isFalse();
-    assertThat(predicates.not(predicates.hasType(InputFile.Type.TEST)).apply(javaFile)).isTrue();
-  }
-
-  @Test
-  public void and() throws Exception {
-    // empty
-    assertThat(predicates.and().apply(javaFile)).isTrue();
-    assertThat(predicates.and(new FilePredicate[0]).apply(javaFile)).isTrue();
-    assertThat(predicates.and(Collections.<FilePredicate>emptyList()).apply(javaFile)).isTrue();
-
-    // two arguments
-    assertThat(predicates.and(predicates.all(), predicates.all()).apply(javaFile)).isTrue();
-    assertThat(predicates.and(predicates.all(), predicates.none()).apply(javaFile)).isFalse();
-    assertThat(predicates.and(predicates.none(), predicates.all()).apply(javaFile)).isFalse();
-
-    // collection
-    assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue();
-    assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isFalse();
-
-    // array
-    assertThat(predicates.and(new FilePredicate[] {predicates.all(), predicates.all()}).apply(javaFile)).isTrue();
-    assertThat(predicates.and(new FilePredicate[] {predicates.all(), predicates.none()}).apply(javaFile)).isFalse();
-  }
-
-  @Test
-  public void or() throws Exception {
-    // empty
-    assertThat(predicates.or().apply(javaFile)).isTrue();
-    assertThat(predicates.or(new FilePredicate[0]).apply(javaFile)).isTrue();
-    assertThat(predicates.or(Collections.<FilePredicate>emptyList()).apply(javaFile)).isTrue();
-
-    // two arguments
-    assertThat(predicates.or(predicates.all(), predicates.all()).apply(javaFile)).isTrue();
-    assertThat(predicates.or(predicates.all(), predicates.none()).apply(javaFile)).isTrue();
-    assertThat(predicates.or(predicates.none(), predicates.all()).apply(javaFile)).isTrue();
-    assertThat(predicates.or(predicates.none(), predicates.none()).apply(javaFile)).isFalse();
-
-    // collection
-    assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue();
-    assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isTrue();
-    assertThat(predicates.or(Arrays.asList(predicates.none(), predicates.none())).apply(javaFile)).isFalse();
-
-    // array
-    assertThat(predicates.or(new FilePredicate[] {predicates.all(), predicates.all()}).apply(javaFile)).isTrue();
-    assertThat(predicates.or(new FilePredicate[] {predicates.all(), predicates.none()}).apply(javaFile)).isTrue();
-    assertThat(predicates.or(new FilePredicate[] {predicates.none(), predicates.none()}).apply(javaFile)).isFalse();
-  }
-}
diff --git a/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java b/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java
deleted file mode 100644 (file)
index 678fdc5..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
-
-import java.io.File;
-import java.nio.charset.Charset;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class DefaultFileSystemTest {
-
-  @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
-
-  @Rule
-  public ExpectedException thrown = ExpectedException.none();
-
-  @Test
-  public void test_directories() throws Exception {
-    DefaultFileSystem fs = new DefaultFileSystem();
-
-    File basedir = temp.newFolder();
-    fs.setBaseDir(basedir);
-    assertThat(fs.baseDir()).isAbsolute().isDirectory().exists();
-    assertThat(fs.baseDir().getCanonicalPath()).isEqualTo(basedir.getCanonicalPath());
-
-    File workdir = temp.newFolder();
-    fs.setWorkDir(workdir);
-    assertThat(fs.workDir()).isAbsolute().isDirectory().exists();
-    assertThat(fs.workDir().getCanonicalPath()).isEqualTo(workdir.getCanonicalPath());
-  }
-
-  @Test
-  public void test_encoding() throws Exception {
-    DefaultFileSystem fs = new DefaultFileSystem();
-
-    assertThat(fs.isDefaultJvmEncoding()).isTrue();
-    assertThat(fs.encoding()).isEqualTo(Charset.defaultCharset());
-
-    fs.setEncoding(Charset.forName("ISO-8859-1"));
-    assertThat(fs.encoding()).isEqualTo(Charset.forName("ISO-8859-1"));
-    assertThat(fs.isDefaultJvmEncoding()).isFalse();
-  }
-
-  @Test
-  public void add_languages() throws Exception {
-    DefaultFileSystem fs = new DefaultFileSystem();
-
-    assertThat(fs.languages()).isEmpty();
-
-    fs.addLanguages("java", "php", "cobol");
-    assertThat(fs.languages()).containsOnly("cobol", "java", "php");
-  }
-
-  @Test
-  public void files() throws Exception {
-    DefaultFileSystem fs = new DefaultFileSystem();
-
-    assertThat(fs.inputFiles(fs.predicates().all())).isEmpty();
-
-    fs.add(new DefaultInputFile("src/Foo.php").setLanguage("php").setFile(temp.newFile()));
-    fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile()));
-    fs.add(new DefaultInputFile("src/Baz.java").setLanguage("java").setFile(temp.newFile()));
-
-    // no language
-    fs.add(new DefaultInputFile("src/readme.txt").setFile(temp.newFile()));
-
-    assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNotNull();
-    assertThat(fs.inputFile(fs.predicates().hasRelativePath("does/not/exist"))).isNull();
-
-    assertThat(fs.files(fs.predicates().all())).hasSize(4);
-    assertThat(fs.files(fs.predicates().hasLanguage("java"))).hasSize(2);
-    assertThat(fs.files(fs.predicates().hasLanguage("cobol"))).isEmpty();
-
-    assertThat(fs.hasFiles(fs.predicates().all())).isTrue();
-    assertThat(fs.hasFiles(fs.predicates().hasLanguage("java"))).isTrue();
-    assertThat(fs.hasFiles(fs.predicates().hasLanguage("cobol"))).isFalse();
-
-    assertThat(fs.inputFiles(fs.predicates().all())).hasSize(4);
-    assertThat(fs.inputFiles(fs.predicates().hasLanguage("php"))).hasSize(1);
-    assertThat(fs.inputFiles(fs.predicates().hasLanguage("java"))).hasSize(2);
-    assertThat(fs.inputFiles(fs.predicates().hasLanguage("cobol"))).isEmpty();
-
-    assertThat(fs.languages()).containsOnly("java", "php");
-  }
-
-  @Test
-  public void input_file_returns_null_if_file_not_found() throws Exception {
-    DefaultFileSystem fs = new DefaultFileSystem();
-    assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNull();
-    assertThat(fs.inputFile(fs.predicates().hasLanguage("cobol"))).isNull();
-  }
-
-  @Test
-  public void input_file_fails_if_too_many_results() throws Exception {
-    thrown.expect(IllegalArgumentException.class);
-    thrown.expectMessage("expected one element");
-
-    DefaultFileSystem fs = new DefaultFileSystem();
-    fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile()));
-    fs.add(new DefaultInputFile("src/Baz.java").setLanguage("java").setFile(temp.newFile()));
-
-    fs.inputFile(fs.predicates().all());
-  }
-
-  @Test
-  public void input_file_supports_non_indexed_predicates() throws Exception {
-    DefaultFileSystem fs = new DefaultFileSystem();
-    fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile()));
-
-    // it would fail if more than one java file
-    assertThat(fs.inputFile(fs.predicates().hasLanguage("java"))).isNotNull();
-  }
-}
diff --git a/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultInputFileTest.java b/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultInputFileTest.java
deleted file mode 100644 (file)
index b96821f..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.sonar.api.batch.fs.InputFile;
-
-import java.io.File;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class DefaultInputFileTest {
-
-  @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
-
-  @Test
-  public void test() throws Exception {
-    DefaultInputFile inputFile = new DefaultInputFile("src/Foo.php")
-      .setFile(temp.newFile("Foo.php"))
-      .setKey("ABCDE")
-      .setHash("1234")
-      .setLines(42)
-      .setLanguage("php")
-      .setStatus(InputFile.Status.ADDED)
-      .setType(InputFile.Type.TEST);
-
-    assertThat(inputFile.relativePath()).isEqualTo("src/Foo.php");
-    assertThat(new File(inputFile.relativePath())).isRelative();
-    assertThat(inputFile.absolutePath()).endsWith("Foo.php");
-    assertThat(new File(inputFile.absolutePath())).isAbsolute();
-    assertThat(inputFile.language()).isEqualTo("php");
-    assertThat(inputFile.status()).isEqualTo(InputFile.Status.ADDED);
-    assertThat(inputFile.type()).isEqualTo(InputFile.Type.TEST);
-    assertThat(inputFile.lines()).isEqualTo(42);
-    assertThat(inputFile.hash()).isEqualTo("1234");
-  }
-
-  @Test
-  public void test_equals_and_hashcode() throws Exception {
-    DefaultInputFile f1 = new DefaultInputFile("src/Foo.php");
-    DefaultInputFile f1a = new DefaultInputFile("src/Foo.php");
-    DefaultInputFile f2 = new DefaultInputFile("src/Bar.php");
-
-    assertThat(f1).isEqualTo(f1);
-    assertThat(f1).isEqualTo(f1a);
-    assertThat(f1).isNotEqualTo(f2);
-    assertThat(f1.equals("foo")).isFalse();
-    assertThat(f1.equals(null)).isFalse();
-
-    assertThat(f1.hashCode()).isEqualTo(f1.hashCode());
-    assertThat(f1.hashCode()).isEqualTo(f1a.hashCode());
-  }
-
-  @Test
-  public void test_toString() throws Exception {
-    DefaultInputFile file = new DefaultInputFile("src/Foo.php").setAbsolutePath("/path/to/src/Foo.php");
-    assertThat(file.toString()).isEqualTo("[relative=src/Foo.php, abs=/path/to/src/Foo.php]");
-  }
-}
diff --git a/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/PathPatternTest.java b/sonar-batch-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/PathPatternTest.java
deleted file mode 100644 (file)
index 01d6dab..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.fs.internal;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.sonar.api.batch.fs.InputFile;
-
-import java.io.File;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class PathPatternTest {
-  @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
-
-  @Test
-  public void match_relative_path() throws Exception {
-    PathPattern pattern = PathPattern.create("**/*Foo.java");
-    assertThat(pattern.toString()).isEqualTo("**/*Foo.java");
-
-    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.java");
-    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.java").setFile(file);
-    assertThat(pattern.match(inputFile)).isTrue();
-
-    // case sensitive by default
-    file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
-    inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
-    assertThat(pattern.match(inputFile)).isFalse();
-
-    file = new File(temp.newFolder(), "src/main/java/org/Other.java");
-    inputFile = new DefaultInputFile("src/main/java/org/Other.java").setFile(file);
-    assertThat(pattern.match(inputFile)).isFalse();
-  }
-
-  @Test
-  public void match_relative_path_and_insensitive_file_extension() throws Exception {
-    PathPattern pattern = PathPattern.create("**/*Foo.java");
-
-    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
-    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
-    assertThat(pattern.match(inputFile, false)).isTrue();
-
-    file = new File(temp.newFolder(), "src/main/java/org/Other.java");
-    inputFile = new DefaultInputFile("src/main/java/org/Other.java").setFile(file);
-    assertThat(pattern.match(inputFile, false)).isFalse();
-  }
-
-  @Test
-  public void match_absolute_path() throws Exception {
-    PathPattern pattern = PathPattern.create("file:**/src/main/**Foo.java");
-    assertThat(pattern.toString()).isEqualTo("file:**/src/main/**Foo.java");
-
-    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.java");
-    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.java").setFile(file);
-    assertThat(pattern.match(inputFile)).isTrue();
-
-    // case sensitive by default
-    file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
-    inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
-    assertThat(pattern.match(inputFile)).isFalse();
-
-    file = new File(temp.newFolder(), "src/main/java/org/Other.java");
-    inputFile = new DefaultInputFile("src/main/java/org/Other.java").setFile(file);
-    assertThat(pattern.match(inputFile)).isFalse();
-  }
-
-  @Test
-  public void match_absolute_path_and_insensitive_file_extension() throws Exception {
-    PathPattern pattern = PathPattern.create("file:**/src/main/**Foo.java");
-    assertThat(pattern.toString()).isEqualTo("file:**/src/main/**Foo.java");
-
-    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
-    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
-    assertThat(pattern.match(inputFile, false)).isTrue();
-
-    file = new File(temp.newFolder(), "src/main/java/org/Other.JAVA");
-    inputFile = new DefaultInputFile("src/main/java/org/Other.JAVA").setFile(file);
-    assertThat(pattern.match(inputFile, false)).isFalse();
-  }
-
-  @Test
-  public void create_array_of_patterns() throws Exception {
-    PathPattern[] patterns = PathPattern.create(new String[]{
-      "**/src/main/**Foo.java",
-      "file:**/src/main/**Bar.java"
-    });
-    assertThat(patterns).hasSize(2);
-    assertThat(patterns[0].toString()).isEqualTo("**/src/main/**Foo.java");
-    assertThat(patterns[1].toString()).isEqualTo("file:**/src/main/**Bar.java");
-  }
-}
index 1db1f35f0e90183603a4d496120734270af0e3f2..db45a80e535562ef36631374765e6ba301094fd6 100644 (file)
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-java-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.codehaus.sonar</groupId>
-      <artifactId>sonar-batch-plugin-api</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-plugin-api</artifactId>
index 538e3091e424d5a3f7aa7353295b4b7d220c3e94..b5979b998ea14d142160f1b2b2641e26d262e806 100644 (file)
@@ -19,6 +19,9 @@
  */
 package org.sonar.batch.bootstrap;
 
+import org.sonar.api.batch.analyzer.Analyzer;
+import org.sonar.api.batch.analyzer.AnalyzerContext;
+
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.ClassUtils;
 import org.sonar.api.batch.CheckProject;
@@ -26,8 +29,6 @@ import org.sonar.api.batch.Sensor;
 import org.sonar.api.batch.fs.FileSystem;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.resources.Project;
-import org.sonar.batch.api.analyzer.Analyzer;
-import org.sonar.batch.api.analyzer.AnalyzerContext;
 import org.sonar.batch.scan.SensorWrapper;
 
 import java.util.Collection;
index ae75f47f2a47d5b0e76bbecc59635d2d7bfa2757..2f35ec81bc0f9fbb69e7cc4cb2739bdef0a0d28e 100644 (file)
@@ -178,7 +178,7 @@ public class DefaultIndex extends SonarIndex {
   }
 
   @Override
-  public Measure getMeasure(Resource resource, org.sonar.batch.api.measures.Metric<?> metric) {
+  public Measure getMeasure(Resource resource, org.sonar.api.batch.measures.Metric<?> metric) {
     return getMeasures(resource, MeasuresFilters.metric(metric));
   }
 
index 1084b7d49a2d3f36ffadb07867c960ee09226dbf..ce8f60d9057ce914b42f885462ce41c814cb374f 100644 (file)
@@ -19,8 +19,9 @@
  */
 package org.sonar.batch.languages;
 
+import org.sonar.api.batch.languages.Language;
+
 import org.sonar.api.resources.Languages;
-import org.sonar.batch.api.languages.Language;
 
 import javax.annotation.CheckForNull;
 
index bf9fcd00de5255886edd4729af1b5e3ce062ffd1..761a03945c2a33eeac0a0ee287d86320f8114c9d 100644 (file)
@@ -19,8 +19,9 @@
  */
 package org.sonar.batch.languages;
 
+import org.sonar.api.batch.languages.Language;
+
 import org.sonar.api.BatchComponent;
-import org.sonar.batch.api.languages.Language;
 
 import javax.annotation.CheckForNull;
 
index 6328ac77a4614241527fe8846e42fa3738712a1b..169683b42354c5e42f26fa883266b3ef28974407 100644 (file)
  */
 package org.sonar.batch.phases;
 
+import org.sonar.api.batch.analyzer.Analyzer;
+
 import org.apache.commons.lang.ClassUtils;
 import org.sonar.api.BatchExtension;
 import org.sonar.api.batch.InstantiationStrategy;
 import org.sonar.api.batch.Sensor;
-import org.sonar.batch.api.analyzer.Analyzer;
 import org.sonar.batch.bootstrap.ExtensionMatcher;
 
 /**
index a7aea325d484545be71244d8676fb98fdc377620..49f762ef811d129fce5b928b1d2c746df52b9068 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import org.picocontainer.injectors.ProviderAdapter;
@@ -28,7 +30,6 @@ import org.sonar.api.batch.rule.internal.NewActiveRule;
 import org.sonar.api.rules.Rule;
 import org.sonar.api.rules.RuleFinder;
 import org.sonar.api.rules.RuleParam;
-import org.sonar.batch.api.rules.QProfile;
 import org.sonar.batch.rules.QProfileWithId;
 import org.sonar.core.qualityprofile.db.ActiveRuleDao;
 import org.sonar.core.qualityprofile.db.ActiveRuleDto;
index 674fbb59a564e059275045481ba48ff93e263e2b..6abaa3e4ef3aa6befe20996d6169644f647e332d 100644 (file)
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.languages.Language;
+import org.sonar.api.batch.rules.QProfile;
+
 import com.google.common.collect.ImmutableMap;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.BatchComponent;
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.MessageException;
-import org.sonar.batch.api.languages.Language;
-import org.sonar.batch.api.rules.QProfile;
 import org.sonar.batch.languages.LanguagesReferential;
 import org.sonar.batch.rules.QProfilesReferential;
 
index 10e110b6ee9e568c7ac3bb7974d4ee98eeda3b41..52004908844b2c66ff4158ec8f3563c0d0e7c843 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -27,7 +29,6 @@ import org.sonar.api.BatchComponent;
 import org.sonar.api.batch.fs.FileSystem;
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.MessageException;
-import org.sonar.batch.api.rules.QProfile;
 
 public class QProfileVerifier implements BatchComponent {
 
index 2c5ec75a2355b2c82782776a03b139254eaa5026..67c6a739f14827628e49604d0c5905200675df69 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.injectors.ProviderAdapter;
@@ -30,7 +32,6 @@ import org.sonar.api.rules.ActiveRule;
 import org.sonar.api.rules.Rule;
 import org.sonar.api.rules.RuleFinder;
 import org.sonar.api.rules.RulePriority;
-import org.sonar.batch.api.rules.QProfile;
 
 import java.util.Collection;
 import java.util.Map;
index 936b17e63fe8bd94b650595dbfd46e2ae0f8851c..c3d66b0df45ebe4b00fcd914f0148443e2694d54 100644 (file)
@@ -19,7 +19,8 @@
  */
 package org.sonar.batch.rules;
 
-import org.sonar.batch.api.rules.QProfile;
+import org.sonar.api.batch.rules.QProfile;
+
 import org.sonar.core.qualityprofile.db.QualityProfileDao;
 import org.sonar.core.qualityprofile.db.QualityProfileDto;
 
index 4d2511676a945357c058909055785059857f68fd..c441b7ff4e7c73de77ee73c6985735e3e86b63b9 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.batch.rules;
 
-import org.sonar.batch.api.rules.QProfile;
+import org.sonar.api.batch.rules.QProfile;
 
 public class QProfileWithId extends QProfile {
   private final int id;
index aec78dc14c82f73437cb4e0f6e8f41a8a5c849aa..5fc8085277897adf572dedcb6521701ea97783fc 100644 (file)
@@ -19,8 +19,9 @@
  */
 package org.sonar.batch.rules;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import org.sonar.api.BatchComponent;
-import org.sonar.batch.api.rules.QProfile;
 
 import javax.annotation.CheckForNull;
 
index a3f125d9c4fbd5cdf314afa101796e7c2d8162ba..97bf89d1aa99859336324e70b644fb02772cbfdc 100644 (file)
 package org.sonar.batch.scan;
 
 import org.sonar.api.batch.SensorContext;
+import org.sonar.api.batch.analyzer.AnalyzerContext;
+import org.sonar.api.batch.analyzer.issue.AnalyzerIssue;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasure;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasureBuilder;
+import org.sonar.api.batch.analyzer.measure.internal.DefaultAnalyzerMeasureBuilder;
 import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.measures.Metric;
 import org.sonar.api.component.ResourcePerspectives;
 import org.sonar.api.issue.Issuable;
 import org.sonar.api.measures.Measure;
@@ -29,10 +35,6 @@ import org.sonar.api.resources.File;
 import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.rule.RuleKey;
-import org.sonar.batch.api.analyzer.AnalyzerContext;
-import org.sonar.batch.api.analyzer.issue.AnalyzerIssue;
-import org.sonar.batch.api.analyzer.measure.AnalyzerMeasure;
-import org.sonar.batch.api.measures.Metric;
 
 import java.io.Serializable;
 import java.util.Collection;
@@ -51,6 +53,11 @@ public class AnalyzerContextAdaptor implements AnalyzerContext {
     this.perspectives = perspectives;
   }
 
+  @Override
+  public <G extends Serializable> AnalyzerMeasureBuilder<G> measureBuilder() {
+    return new DefaultAnalyzerMeasureBuilder<G>();
+  }
+
   @Override
   public AnalyzerMeasure<?> getMeasure(String metricKey) {
     Metric<?> m = metricFinder.findByKey(metricKey);
@@ -67,7 +74,7 @@ public class AnalyzerContextAdaptor implements AnalyzerContext {
     if (measure == null) {
       return null;
     }
-    return AnalyzerMeasure.<G>builder()
+    return this.<G>measureBuilder()
       .onProject()
       .forMetric(metric)
       .withValue(measure.value())
@@ -91,7 +98,7 @@ public class AnalyzerContextAdaptor implements AnalyzerContext {
     if (measure == null) {
       return null;
     }
-    return AnalyzerMeasure.<G>builder()
+    return this.<G>measureBuilder()
       .onFile(file)
       .forMetric(metric)
       .withValue(measure.value())
index 7f32e03e98e336fc39b9d7c6ca7231d86054f9b3..88cc4365beda3d86599e5aa0d9e853060d7245ab 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.scan;
 
+import org.sonar.api.batch.languages.Language;
+
 import org.picocontainer.Startable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,7 +28,6 @@ import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.fs.internal.DefaultFileSystem;
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.MessageException;
-import org.sonar.batch.api.languages.Language;
 import org.sonar.batch.languages.LanguagesReferential;
 
 /**
index 6b1e0e1a501cda3951b76ad18415f982144a31e9..a0584e490d93439d38f5590f73f3c394803ecc92 100644 (file)
@@ -200,8 +200,7 @@ public class ModuleScanContainer extends ComponentContainer {
           // Example : C# plugin adds sub-projects at runtime, even if they are not defined in root pom.
           return !ExtensionUtils.isMavenExtensionOnly(extension) || module.getPom() != null;
         }
-        return ExtensionUtils.isType(extension, org.sonar.batch.api.BatchComponent.class)
-          && ExtensionUtils.isInstantiationStrategy(extension, org.sonar.batch.api.InstantiationStrategy.PER_PROJECT);
+        return false;
       }
     });
   }
index 8d4dfa22df717f956fd5da0fa32fb8546878ac30..12eaf5aa3783e7355f02ba17b06110b9737f26da 100644 (file)
@@ -100,23 +100,26 @@ public class ProjectScanContainer extends ComponentContainer {
   }
 
   private void projectBootstrap() {
-    ProjectReactor reactor;
-    // OK, not present, so look for a custom ProjectBootstrapper
-    ProjectBootstrapper bootstrapper = getComponentByType(ProjectBootstrapper.class);
-    Settings settings = getComponentByType(Settings.class);
-    if (bootstrapper == null
-      // Starting from Maven plugin 2.3 then only DefaultProjectBootstrapper should be used.
-      || "true".equals(settings.getString("sonar.mojoUseRunner"))) {
-      // Use default SonarRunner project bootstrapper
-      ProjectReactorBuilder builder = getComponentByType(ProjectReactorBuilder.class);
-      reactor = builder.execute();
-    } else {
-      reactor = bootstrapper.bootstrap();
-    }
+    // Views pass a custom ProjectReactor
+    ProjectReactor reactor = getComponentByType(ProjectReactor.class);
     if (reactor == null) {
-      throw new SonarException(bootstrapper + " has returned null as ProjectReactor");
+      // OK, not present, so look for a deprecated custom ProjectBootstrapper for old versions of SQ Runner
+      ProjectBootstrapper bootstrapper = getComponentByType(ProjectBootstrapper.class);
+      Settings settings = getComponentByType(Settings.class);
+      if (bootstrapper == null
+        // Starting from Maven plugin 2.3 then only DefaultProjectBootstrapper should be used.
+        || "true".equals(settings.getString("sonar.mojoUseRunner"))) {
+        // Use default SonarRunner project bootstrapper
+        ProjectReactorBuilder builder = getComponentByType(ProjectReactorBuilder.class);
+        reactor = builder.execute();
+      } else {
+        reactor = bootstrapper.bootstrap();
+      }
+      if (reactor == null) {
+        throw new SonarException(bootstrapper + " has returned null as ProjectReactor");
+      }
+      add(reactor);
     }
-    add(reactor);
   }
 
   private void addBatchComponents() {
index 33285ae2be6741291f32d6eb1912af6bbbdb7cc0..0ff2d3be35255f5bdf555cadae153f75b317e6ac 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.scan;
 
+import org.sonar.batch.scan2.ProjectScanContainer;
+
 import org.sonar.api.CoreProperties;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.task.Task;
@@ -27,7 +29,6 @@ import org.sonar.batch.DefaultProjectTree;
 import org.sonar.batch.bootstrap.BootstrapProperties;
 import org.sonar.batch.bootstrap.TaskContainer;
 import org.sonar.batch.phases.Phases;
-import org.sonar.batch.scan2.ProjectScanContainer;
 
 public class ScanTask implements Task {
   public static final TaskDefinition DEFINITION = TaskDefinition.builder()
index ae9a25c59dc4b016d8badb7b2d95c614716f3909..ac53dbec1db9944bdf199aab2d98bb09a69eb47e 100644 (file)
@@ -23,11 +23,12 @@ import org.sonar.api.batch.DependedUpon;
 import org.sonar.api.batch.DependsUpon;
 import org.sonar.api.batch.Sensor;
 import org.sonar.api.batch.SensorContext;
+import org.sonar.api.batch.analyzer.Analyzer;
+import org.sonar.api.batch.analyzer.AnalyzerContext;
+import org.sonar.api.batch.analyzer.internal.DefaultAnalyzerDescriptor;
 import org.sonar.api.batch.fs.FileSystem;
+import org.sonar.api.batch.measures.Metric;
 import org.sonar.api.resources.Project;
-import org.sonar.batch.api.analyzer.Analyzer;
-import org.sonar.batch.api.analyzer.AnalyzerContext;
-import org.sonar.batch.api.measures.Metric;
 
 import java.util.Arrays;
 import java.util.List;
@@ -37,31 +38,34 @@ public class SensorWrapper implements Sensor {
   private Analyzer analyzer;
   private AnalyzerContext adaptor;
   private FileSystem fs;
+  private DefaultAnalyzerDescriptor descriptor;
 
   public SensorWrapper(Analyzer analyzer, AnalyzerContext adaptor, FileSystem fs) {
     this.analyzer = analyzer;
+    descriptor = new DefaultAnalyzerDescriptor();
+    analyzer.describe(descriptor);
     this.adaptor = adaptor;
     this.fs = fs;
   }
 
   @DependedUpon
   public List<Metric<?>> provides() {
-    return Arrays.asList(analyzer.describe().provides());
+    return Arrays.asList(descriptor.provides());
   }
 
   @DependsUpon
   public List<Metric<?>> depends() {
-    return Arrays.asList(analyzer.describe().dependsOn());
+    return Arrays.asList(descriptor.dependsOn());
   }
 
   @Override
   public boolean shouldExecuteOnProject(Project project) {
-    if (!analyzer.describe().languages().isEmpty()) {
-      if (project.getLanguageKey() != null && !analyzer.describe().languages().contains(project.getLanguageKey())) {
+    if (!descriptor.languages().isEmpty()) {
+      if (project.getLanguageKey() != null && !descriptor.languages().contains(project.getLanguageKey())) {
         return false;
       }
       boolean hasFile = false;
-      for (String languageKey : analyzer.describe().languages()) {
+      for (String languageKey : descriptor.languages()) {
         hasFile |= fs.hasFiles(fs.predicates().hasLanguage(languageKey));
       }
       if (!hasFile) {
index 7256c5592a3af88204ae3dc3738b8420f6430366..8bdddc89c903ef354770349483147018bec81636 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.scan.filesystem;
 
+import org.sonar.api.batch.languages.Language;
+
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -30,7 +32,6 @@ import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.PathPattern;
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.MessageException;
-import org.sonar.batch.api.languages.Language;
 import org.sonar.batch.languages.LanguagesReferential;
 
 import javax.annotation.CheckForNull;
diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan2/AnalyzerMeasureCache.java b/sonar-batch/src/main/java/org/sonar/batch/scan2/AnalyzerMeasureCache.java
new file mode 100644 (file)
index 0000000..593324a
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * 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.batch.scan2;
+
+import com.google.common.base.Preconditions;
+import org.sonar.api.BatchComponent;
+import org.sonar.api.batch.analyzer.measure.internal.DefaultAnalyzerMeasure;
+import org.sonar.batch.index.Cache;
+import org.sonar.batch.index.Cache.Entry;
+import org.sonar.batch.index.Caches;
+
+/**
+ * Cache of all measures. This cache is shared amongst all project modules.
+ */
+public class AnalyzerMeasureCache implements BatchComponent {
+
+  private final Cache<DefaultAnalyzerMeasure> cache;
+
+  public AnalyzerMeasureCache(Caches caches) {
+    cache = caches.createCache("measures");
+  }
+
+  public Iterable<Entry<DefaultAnalyzerMeasure>> entries() {
+    return cache.entries();
+  }
+
+  public DefaultAnalyzerMeasure<?> byMetric(String resourceKey, String metricKey) {
+    return cache.get(resourceKey, metricKey);
+  }
+
+  public AnalyzerMeasureCache put(String resourceKey, DefaultAnalyzerMeasure<?> measure) {
+    Preconditions.checkNotNull(resourceKey);
+    Preconditions.checkNotNull(measure.metricKey());
+    cache.put(resourceKey, measure.metricKey(), measure);
+    return this;
+  }
+
+  public boolean contains(String resourceKey, DefaultAnalyzerMeasure<?> measure) {
+    Preconditions.checkNotNull(resourceKey);
+    Preconditions.checkNotNull(measure);
+    return cache.containsKey(resourceKey, measure.metricKey());
+  }
+
+  public Iterable<DefaultAnalyzerMeasure> all() {
+    return cache.values();
+  }
+
+}
index c0ae6dbbaab9216894ec5f81d0c4d46cacd684fa..ce2d9e3effbc14cd885715730cb34d750414db31 100644 (file)
@@ -22,10 +22,10 @@ package org.sonar.batch.scan2;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.BatchComponent;
+import org.sonar.api.batch.analyzer.Analyzer;
+import org.sonar.api.batch.analyzer.AnalyzerContext;
+import org.sonar.api.batch.analyzer.internal.DefaultAnalyzerDescriptor;
 import org.sonar.api.platform.ComponentContainer;
-import org.sonar.batch.api.analyzer.Analyzer;
-import org.sonar.batch.api.analyzer.AnalyzerContext;
-import org.sonar.batch.api.analyzer.AnalyzerDescriptor;
 
 import java.util.Collection;
 
@@ -44,7 +44,8 @@ public class AnalyzersExecutor implements BatchComponent {
 
     for (Analyzer analyzer : analyzers) {
 
-      AnalyzerDescriptor descriptor = analyzer.describe();
+      DefaultAnalyzerDescriptor descriptor = new DefaultAnalyzerDescriptor();
+      analyzer.describe(descriptor);
 
       LOG.info("Execute analyzer: " + descriptor.name());
 
index 253bf0cab41cca4621c77e1bb2764e2409d2ece0..5fc2961ef843cf4988ec1fd603674b6f313217f9 100644 (file)
  */
 package org.sonar.batch.scan2;
 
+import org.sonar.api.batch.analyzer.AnalyzerContext;
+import org.sonar.api.batch.analyzer.issue.AnalyzerIssue;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasure;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasureBuilder;
+import org.sonar.api.batch.analyzer.measure.internal.DefaultAnalyzerMeasure;
+import org.sonar.api.batch.analyzer.measure.internal.DefaultAnalyzerMeasureBuilder;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.measures.Metric;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.rule.RuleKey;
-import org.sonar.batch.api.analyzer.AnalyzerContext;
-import org.sonar.batch.api.analyzer.issue.AnalyzerIssue;
-import org.sonar.batch.api.analyzer.measure.AnalyzerMeasure;
-import org.sonar.batch.api.measures.Metric;
 import org.sonar.batch.issue.ModuleIssues;
 import org.sonar.core.component.ComponentKeys;
 import org.sonar.core.issue.DefaultIssueBuilder;
@@ -36,16 +39,21 @@ import java.util.Collection;
 
 public class DefaultAnalyzerContext implements AnalyzerContext {
 
-  private final MeasureCache measureCache;
+  private final AnalyzerMeasureCache measureCache;
   private ProjectDefinition def;
   private ModuleIssues moduleIssues;
 
-  public DefaultAnalyzerContext(ProjectDefinition def, MeasureCache measureCache, ModuleIssues moduleIssues) {
+  public DefaultAnalyzerContext(ProjectDefinition def, AnalyzerMeasureCache measureCache, ModuleIssues moduleIssues) {
     this.def = def;
     this.measureCache = measureCache;
     this.moduleIssues = moduleIssues;
   }
 
+  @Override
+  public <G extends Serializable> AnalyzerMeasureBuilder<G> measureBuilder() {
+    return new DefaultAnalyzerMeasureBuilder<G>();
+  }
+
   @Override
   public AnalyzerMeasure getMeasure(String metricKey) {
     return measureCache.byMetric(def.getKey(), metricKey);
@@ -67,11 +75,11 @@ public class DefaultAnalyzerContext implements AnalyzerContext {
   }
 
   @Override
-  public void addMeasure(org.sonar.batch.api.analyzer.measure.AnalyzerMeasure<?> measure) {
+  public void addMeasure(AnalyzerMeasure<?> measure) {
     if (measure.inputFile() != null) {
-      measureCache.put(ComponentKeys.createEffectiveKey(def.getKey(), measure.inputFile()), measure);
+      measureCache.put(ComponentKeys.createEffectiveKey(def.getKey(), measure.inputFile()), (DefaultAnalyzerMeasure) measure);
     } else {
-      measureCache.put(def.getKey(), measure);
+      measureCache.put(def.getKey(), (DefaultAnalyzerMeasure) measure);
     }
   }
 
diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan2/MeasureCache.java b/sonar-batch/src/main/java/org/sonar/batch/scan2/MeasureCache.java
deleted file mode 100644 (file)
index 96ab8ad..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.batch.scan2;
-
-import com.google.common.base.Preconditions;
-import org.sonar.api.BatchComponent;
-import org.sonar.batch.api.analyzer.measure.AnalyzerMeasure;
-import org.sonar.batch.index.Cache;
-import org.sonar.batch.index.Cache.Entry;
-import org.sonar.batch.index.Caches;
-
-/**
- * Cache of all measures. This cache is shared amongst all project modules.
- */
-public class MeasureCache implements BatchComponent {
-
-  private final Cache<AnalyzerMeasure<?>> cache;
-
-  public MeasureCache(Caches caches) {
-    cache = caches.createCache("measures");
-  }
-
-  public Iterable<Entry<AnalyzerMeasure<?>>> entries() {
-    return cache.entries();
-  }
-
-  public AnalyzerMeasure<?> byMetric(String resourceKey, String metricKey) {
-    return cache.get(resourceKey, metricKey);
-  }
-
-  public MeasureCache put(String resourceKey, AnalyzerMeasure<?> measure) {
-    Preconditions.checkNotNull(resourceKey);
-    Preconditions.checkNotNull(measure.metricKey());
-    cache.put(resourceKey, measure.metricKey(), measure);
-    return this;
-  }
-
-  public boolean contains(String resourceKey, AnalyzerMeasure<?> measure) {
-    Preconditions.checkNotNull(resourceKey);
-    Preconditions.checkNotNull(measure);
-    return cache.containsKey(resourceKey, measure.metricKey());
-  }
-
-  public Iterable<AnalyzerMeasure<?>> all() {
-    return cache.values();
-  }
-
-}
index 24435c0dc555c211dab2b50c57ec46d5e774d05f..6982d3da3b28e1b0984140161f781422b79ce6e1 100644 (file)
@@ -21,12 +21,12 @@ package org.sonar.batch.scan2;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.sonar.api.BatchComponent;
+import org.sonar.api.batch.InstantiationStrategy;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.rule.CheckFactory;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.scan.filesystem.FileExclusions;
-import org.sonar.batch.api.BatchComponent;
-import org.sonar.batch.api.InstantiationStrategy;
 import org.sonar.batch.bootstrap.BatchExtensionDictionnary;
 import org.sonar.batch.bootstrap.ExtensionInstaller;
 import org.sonar.batch.bootstrap.ExtensionMatcher;
index fcbec9bf4b468e1176dbdaccbd0b5451d4f1c552..0b6f2071df9df87dc47365bb6160cbe133b9657b 100644 (file)
  */
 package org.sonar.batch.scan2;
 
+import org.sonar.api.batch.analyzer.AnalyzerContext;
+
 import com.google.common.collect.Lists;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
-import org.sonar.batch.api.analyzer.AnalyzerContext;
 import org.sonar.batch.issue.ignore.scanner.IssueExclusionsLoader;
 import org.sonar.batch.phases.SensorsExecutor;
 import org.sonar.batch.rule.QProfileVerifier;
index 6a3d9bfcfacf2083cceabca2769371edec266e71..f5dd041678eb9b8cf2d0d110fc8190db4614978d 100644 (file)
@@ -20,7 +20,9 @@
 package org.sonar.batch.scan2;
 
 import com.google.common.annotations.VisibleForTesting;
+import org.sonar.api.BatchComponent;
 import org.sonar.api.CoreProperties;
+import org.sonar.api.batch.InstantiationStrategy;
 import org.sonar.api.batch.bootstrap.ProjectBootstrapper;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.bootstrap.ProjectReactor;
@@ -28,8 +30,6 @@ import org.sonar.api.config.Settings;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.scan.filesystem.PathResolver;
 import org.sonar.api.utils.SonarException;
-import org.sonar.batch.api.BatchComponent;
-import org.sonar.batch.api.InstantiationStrategy;
 import org.sonar.batch.bootstrap.ExtensionInstaller;
 import org.sonar.batch.bootstrap.ExtensionMatcher;
 import org.sonar.batch.bootstrap.ExtensionUtils;
@@ -105,7 +105,7 @@ public class ProjectScanContainer extends ComponentContainer {
       ResourceCache.class,
       ComponentDataCache.class,
       ComponentDataPersister.class,
-      MeasureCache.class,
+      AnalyzerMeasureCache.class,
 
       // file system
       InputFileCache.class,
index 89f5c7694cc86cc5131cee1a4edc306f9b468b32..636ed9f34eda8d19a70d9d0e88fefb526e513c87 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.batch.scan2;
 
-import org.sonar.batch.api.BatchExtension;
+import org.sonar.api.BatchExtension;
 
 public interface ScanTaskObserver extends BatchExtension {
 
index d7f5df2e76138e487bce3e5db8bc5008ca4d35dc..ff878582c68ab479350933bf686674282bee6753 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.bootstrap;
 
+import org.sonar.api.batch.analyzer.AnalyzerContext;
+
 import org.junit.Test;
 import org.sonar.api.BatchExtension;
 import org.sonar.api.batch.Sensor;
@@ -26,7 +28,6 @@ import org.sonar.api.batch.SensorContext;
 import org.sonar.api.batch.fs.FileSystem;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.resources.Project;
-import org.sonar.batch.api.analyzer.AnalyzerContext;
 
 import java.util.Collection;
 
index 205fe2e8a8c3229286da3f52d8088ef9a6d4ceab..cf809549abdc7664d1021664a50fd020ec330845 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.sonar.api.batch.rule.ActiveRule;
@@ -27,7 +29,6 @@ import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.Severity;
 import org.sonar.api.rules.Rule;
 import org.sonar.api.rules.RuleFinder;
-import org.sonar.batch.api.rules.QProfile;
 import org.sonar.batch.rules.QProfileWithId;
 import org.sonar.core.persistence.AbstractDaoTestCase;
 import org.sonar.core.qualityprofile.db.ActiveRuleDao;
index 6b3102206f3be8f7a7fe59725acf2054fa74f4c1..60af454bf0b2df9fd5a4fc7e3ec3948b2b456672 100644 (file)
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import com.google.common.collect.Lists;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
 import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.utils.MessageException;
-import org.sonar.batch.api.rules.QProfile;
 import org.sonar.batch.languages.DeprecatedLanguagesReferential;
 import org.sonar.batch.languages.LanguagesReferential;
 import org.sonar.batch.rules.DefaultQProfileReferential;
index 04ba7b1c2515a6d1353159469884b396eeb86883..1bc8325f5315d0709f74fc7f0b2240bed5a1feb6 100644 (file)
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import org.junit.Test;
 import org.sonar.api.batch.SensorContext;
 import org.sonar.api.batch.fs.internal.DefaultFileSystem;
 import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.resources.Project;
 import org.sonar.api.test.IsMeasure;
-import org.sonar.batch.api.rules.QProfile;
 import org.sonar.batch.rules.QProfileWithId;
 import org.sonar.core.persistence.AbstractDaoTestCase;
 import org.sonar.core.qualityprofile.db.QualityProfileDao;
index 789f4a354854040778759a3eeeb68a476db23d5c..499e36052208f9a482e3a5704d9259f1f3d50743 100644 (file)
  */
 package org.sonar.batch.rule;
 
+import org.sonar.api.batch.rules.QProfile;
+
 import org.junit.Test;
 import org.sonar.api.batch.rule.ActiveRules;
 import org.sonar.api.config.Settings;
 import org.sonar.api.profiles.RulesProfile;
 import org.sonar.api.rules.RuleFinder;
-import org.sonar.batch.api.rules.QProfile;
 import org.sonar.batch.rules.QProfileWithId;
 
 import java.util.Arrays;
index c951512e8f6b269d2fc15d448556648d96a1704e..0e83d92f0be6bb30583f21826e314b6f2f4344e3 100644 (file)
@@ -24,13 +24,14 @@ import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.ClassUtils;
 import org.sonar.api.BatchExtension;
+import org.sonar.api.batch.analyzer.Analyzer;
+import org.sonar.api.batch.analyzer.internal.DefaultAnalyzerDescriptor;
 import org.sonar.api.batch.maven.DependsUponMavenPlugin;
 import org.sonar.api.batch.maven.MavenPluginHandler;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.resources.Project;
 import org.sonar.api.utils.AnnotationUtils;
 import org.sonar.api.utils.dag.DirectAcyclicGraph;
-import org.sonar.batch.api.analyzer.Analyzer;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Array;
@@ -99,7 +100,6 @@ public class BatchExtensionDictionnary {
   private static void completeBatchExtensions(ComponentContainer container, List<Object> extensions) {
     if (container != null) {
       extensions.addAll(container.getComponentsByType(BatchExtension.class));
-      extensions.addAll(container.getComponentsByType(org.sonar.batch.api.BatchExtension.class));
       completeBatchExtensions(container.getParent(), extensions);
     }
   }
@@ -147,7 +147,9 @@ public class BatchExtensionDictionnary {
     List<Object> result = new ArrayList<Object>();
     result.addAll(evaluateAnnotatedClasses(extension, DependsUpon.class));
     if (ClassUtils.isAssignable(extension.getClass(), Analyzer.class)) {
-      result.addAll(Arrays.asList(((Analyzer) extension).describe().dependsOn()));
+      DefaultAnalyzerDescriptor descriptor = new DefaultAnalyzerDescriptor();
+      ((Analyzer) extension).describe(descriptor);
+      result.addAll(Arrays.asList(descriptor.dependsOn()));
     }
     return result;
   }
@@ -159,7 +161,9 @@ public class BatchExtensionDictionnary {
     List<Object> result = new ArrayList<Object>();
     result.addAll(evaluateAnnotatedClasses(extension, DependedUpon.class));
     if (ClassUtils.isAssignable(extension.getClass(), Analyzer.class)) {
-      result.addAll(Arrays.asList(((Analyzer) extension).describe().provides()));
+      DefaultAnalyzerDescriptor descriptor = new DefaultAnalyzerDescriptor();
+      ((Analyzer) extension).describe(descriptor);
+      result.addAll(Arrays.asList(descriptor.provides()));
     }
     return result;
   }
index 165e9fc5eafd5cbd1554c70b520a595d87109d4c..09d12366d3f48a86c2056ceca71bd6bbdbedfc24 100644 (file)
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-check-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.codehaus.sonar</groupId>
-      <artifactId>sonar-batch-plugin-api</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-colorizer</artifactId>
index 1be238923aeb8674b56cfdb67fe4904ad2879640..b4cba728060101925a8447b374d4f74338bf3ddf 100644 (file)
@@ -120,7 +120,7 @@ public abstract class SonarIndex implements DirectedGraphAccessor<Resource, Depe
   public abstract Resource addResource(Resource resource);
 
   @CheckForNull
-  public abstract Measure getMeasure(Resource resource, org.sonar.batch.api.measures.Metric<?> metric);
+  public abstract Measure getMeasure(Resource resource, org.sonar.api.batch.measures.Metric<?> metric);
 
   @CheckForNull
   public abstract <M> M getMeasures(Resource resource, MeasuresFilter<M> filter);
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/Analyzer.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/Analyzer.java
new file mode 100644 (file)
index 0000000..6a67d29
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * 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.analyzer;
+
+import org.sonar.api.BatchExtension;
+
+/**
+ * <p>
+ * An Analyzer is invoked once during the analysis of a project. The analyzer can parse a flat file, connect to a web server... Analyzers are
+ * used to add measure and issues at file level.
+ * </p>
+ *
+ * <p>
+ * For example the Cobertura Analyzer parses Cobertura report and saves the first-level of measures on files.
+ * </p>
+ *
+ * @since 4.4
+ */
+public interface Analyzer extends BatchExtension {
+
+  /**
+   * Populate {@link AnalyzerDescriptor} of this analyzer.
+   */
+  void describe(AnalyzerDescriptor descriptor);
+
+  /**
+   * The actual analyzer code.
+   */
+  void analyse(AnalyzerContext context);
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerContext.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerContext.java
new file mode 100644 (file)
index 0000000..68e9a04
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * 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.analyzer;
+
+import org.sonar.api.batch.analyzer.issue.AnalyzerIssue;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasure;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasureBuilder;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.measures.Metric;
+
+import javax.annotation.CheckForNull;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * @since 4.4
+ */
+public interface AnalyzerContext {
+
+  // ----------- MEASURES --------------
+
+  /**
+   * Builder to create a new {@link AnalyzerMeasure}.
+   */
+  <G extends Serializable> AnalyzerMeasureBuilder<G> measureBuilder();
+
+  /**
+   * Find a project measure.
+   */
+  @CheckForNull
+  AnalyzerMeasure getMeasure(String metricKey);
+
+  /**
+   * Find a project measure.
+   */
+  @CheckForNull
+  <G extends Serializable> AnalyzerMeasure<G> getMeasure(Metric<G> metric);
+
+  /**
+   * Find a file measure.
+   */
+  @CheckForNull
+  AnalyzerMeasure getMeasure(InputFile file, String metricKey);
+
+  /**
+   * Find a file measure.
+   */
+  @CheckForNull
+  <G extends Serializable> AnalyzerMeasure<G> getMeasure(InputFile file, Metric<G> metric);
+
+  /**
+   * Add a measure. Use {@link #measureBuilder()} to create the new measure.
+   */
+  void addMeasure(AnalyzerMeasure<?> measure);
+
+  // ----------- ISSUES --------------
+
+  /**
+   * Add an issue.
+   */
+  void addIssue(AnalyzerIssue issue);
+
+  /**
+   * Add a list of issues.
+   */
+  void addIssues(Collection<AnalyzerIssue> issues);
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerDescriptor.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/AnalyzerDescriptor.java
new file mode 100644 (file)
index 0000000..f03c983
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * 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.analyzer;
+
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.measures.Metric;
+
+/**
+ * @since 4.4
+ */
+public interface AnalyzerDescriptor {
+
+  AnalyzerDescriptor name(String name);
+
+  AnalyzerDescriptor dependsOn(Metric<?>... metrics);
+
+  AnalyzerDescriptor provides(Metric<?>... metrics);
+
+  AnalyzerDescriptor runOnLanguages(String... languageKeys);
+
+  AnalyzerDescriptor runOnTypes(InputFile.Type... types);
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/internal/DefaultAnalyzerDescriptor.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/internal/DefaultAnalyzerDescriptor.java
new file mode 100644 (file)
index 0000000..9a28419
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * 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.analyzer.internal;
+
+import org.sonar.api.batch.analyzer.AnalyzerDescriptor;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.measures.Metric;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+public class DefaultAnalyzerDescriptor implements AnalyzerDescriptor {
+
+  private String name;
+  private Metric<?>[] dependsOn;
+  private Metric<?>[] provides;
+  private String[] languages;
+  private InputFile.Type[] types;
+
+  public String name() {
+    return name;
+  }
+
+  public Metric<?>[] dependsOn() {
+    return dependsOn;
+  }
+
+  public Metric<?>[] provides() {
+    return provides;
+  }
+
+  public Collection<String> languages() {
+    return Arrays.asList(languages);
+  }
+
+  public InputFile.Type[] types() {
+    return types;
+  }
+
+  @Override
+  public DefaultAnalyzerDescriptor name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  @Override
+  public DefaultAnalyzerDescriptor dependsOn(Metric<?>... metrics) {
+    this.dependsOn = metrics;
+    return this;
+  }
+
+  @Override
+  public DefaultAnalyzerDescriptor provides(Metric<?>... metrics) {
+    this.provides = metrics;
+    return this;
+  }
+
+  @Override
+  public DefaultAnalyzerDescriptor runOnLanguages(String... languageKeys) {
+    this.languages = languageKeys;
+    return this;
+  }
+
+  @Override
+  public DefaultAnalyzerDescriptor runOnTypes(InputFile.Type... types) {
+    this.types = types;
+    return this;
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/internal/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/internal/package-info.java
new file mode 100644 (file)
index 0000000..faacc1f
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.analyzer.internal;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/AnalyzerIssue.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/AnalyzerIssue.java
new file mode 100644 (file)
index 0000000..7aa2b2e
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * 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.analyzer.issue;
+
+import com.google.common.base.Preconditions;
+import org.sonar.api.batch.analyzer.Analyzer;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.rule.RuleKey;
+
+import javax.annotation.Nullable;
+
+/**
+ * Issue reported by an {@link Analyzer}
+ *
+ * @since 4.4
+ */
+public class AnalyzerIssue {
+
+  private final InputFile inputFile;
+  private final RuleKey ruleKey;
+  private final String message;
+  private final Integer line;
+  private final Double effortToFix;
+
+  private AnalyzerIssue(Builder builder) {
+    this.inputFile = builder.file;
+    this.ruleKey = builder.ruleKey;
+    this.message = builder.message;
+    this.line = builder.line;
+    this.effortToFix = builder.effortToFix;
+  }
+
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  @Nullable
+  public InputFile inputFile() {
+    return inputFile;
+  }
+
+  public RuleKey ruleKey() {
+    return ruleKey;
+  }
+
+  public String message() {
+    return message;
+  }
+
+  public Integer line() {
+    return line;
+  }
+
+  @Nullable
+  public Double effortToFix() {
+    return effortToFix;
+  }
+
+  public static class Builder {
+
+    private Boolean onProject = null;
+    private InputFile file;
+    private RuleKey ruleKey;
+    private String message;
+    private Integer line;
+    private Double effortToFix;
+
+    public AnalyzerIssue build() {
+      return new AnalyzerIssue(this);
+    }
+
+    public Builder ruleKey(RuleKey ruleKey) {
+      this.ruleKey = ruleKey;
+      return this;
+    }
+
+    public Builder onFile(InputFile file) {
+      Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
+      Preconditions.checkNotNull(file, "InputFile should be non null");
+      this.file = file;
+      this.onProject = false;
+      return this;
+    }
+
+    public Builder onProject() {
+      Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
+      this.file = null;
+      this.onProject = true;
+      return this;
+    }
+
+    public Builder atLine(int line) {
+      this.line = line;
+      return this;
+    }
+
+    public Builder effortToFix(@Nullable Double effortToFix) {
+      this.effortToFix = effortToFix;
+      return this;
+    }
+
+    public Builder message(String message) {
+      this.message = message;
+      return this;
+    }
+
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/internal/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/internal/package-info.java
new file mode 100644 (file)
index 0000000..382a419
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+/**
+ * 
+ */
+/**
+ * @author julien
+ *
+ */
+package org.sonar.api.batch.analyzer.issue.internal;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/issue/package-info.java
new file mode 100644 (file)
index 0000000..1f3b267
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.analyzer.issue;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasure.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasure.java
new file mode 100644 (file)
index 0000000..e0b89e1
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * 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.analyzer.measure;
+
+import org.sonar.api.batch.analyzer.Analyzer;
+import org.sonar.api.batch.fs.InputFile;
+
+import javax.annotation.Nullable;
+
+import java.io.Serializable;
+
+/**
+ * A measure produced by {@link Analyzer}.
+ * @since 4.4
+ */
+public interface AnalyzerMeasure<G extends Serializable> {
+
+  /**
+   * The {@link InputFile} this measure belongs to. Returns null if measure is global to the project.
+   */
+  @Nullable
+  InputFile inputFile();
+
+  String metricKey();
+
+  G value();
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasureBuilder.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/AnalyzerMeasureBuilder.java
new file mode 100644 (file)
index 0000000..7e94051
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * 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.analyzer.measure;
+
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.measures.Metric;
+
+import java.io.Serializable;
+
+/**
+ * Builder to create new {@link AnalyzerMeasure}
+ * @since 4.4
+ */
+public interface AnalyzerMeasureBuilder<G extends Serializable> {
+
+  /**
+   * The file the measure belongs to.
+   */
+  AnalyzerMeasureBuilder<G> onFile(InputFile file);
+
+  /**
+   * Tell that the measure is global to the project.
+   */
+  AnalyzerMeasureBuilder<G> onProject();
+
+  /**
+   * The metric this measure belong to.
+   */
+  AnalyzerMeasureBuilder<G> forMetric(Metric<G> metric);
+
+  /**
+   * Value of the measure.
+   */
+  AnalyzerMeasureBuilder<G> withValue(G value);
+
+  /**
+   * Build the measure.
+   */
+  AnalyzerMeasure<G> build();
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/DefaultAnalyzerMeasure.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/DefaultAnalyzerMeasure.java
new file mode 100644 (file)
index 0000000..63d9736
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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.analyzer.measure.internal;
+
+import com.google.common.base.Preconditions;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasure;
+import org.sonar.api.batch.fs.InputFile;
+
+import javax.annotation.Nullable;
+
+import java.io.Serializable;
+
+public class DefaultAnalyzerMeasure<G extends Serializable> implements AnalyzerMeasure<G>, Serializable {
+
+  private final InputFile inputFile;
+  private final String metricKey;
+  private final G value;
+
+  DefaultAnalyzerMeasure(DefaultAnalyzerMeasureBuilder<G> builder) {
+    Preconditions.checkNotNull(builder.value, "Measure value can't be null");
+    Preconditions.checkNotNull(builder.metricKey, "Measure metricKey can't be null");
+    this.inputFile = builder.file;
+    this.metricKey = builder.metricKey;
+    this.value = builder.value;
+  }
+
+  @Nullable
+  @Override
+  public InputFile inputFile() {
+    return inputFile;
+  }
+
+  @Override
+  public String metricKey() {
+    return metricKey;
+  }
+
+  @Override
+  public G value() {
+    return value;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (!(obj instanceof DefaultAnalyzerMeasure)) {
+      return false;
+    }
+    DefaultAnalyzerMeasure<?> other = (DefaultAnalyzerMeasure<?>) obj;
+    return metricKey.equals(other.metricKey)
+      && value.equals(other.value)
+      && (inputFile == null ? other.inputFile == null : inputFile.equals(other.inputFile));
+  }
+
+  @Override
+  public int hashCode() {
+    return metricKey.hashCode()
+      + value.hashCode()
+      + (inputFile != null ? inputFile.hashCode() : 0);
+  }
+
+  @Override
+  public String toString() {
+    return "AnalyzerMeasure[" + (inputFile != null ? "inputFile=" + inputFile.toString() : "onProject")
+      + ",metricKey=" + metricKey + ",value=" + value + "]";
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/DefaultAnalyzerMeasureBuilder.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/DefaultAnalyzerMeasureBuilder.java
new file mode 100644 (file)
index 0000000..3df03fb
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * 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.analyzer.measure.internal;
+
+import com.google.common.base.Preconditions;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasure;
+import org.sonar.api.batch.analyzer.measure.AnalyzerMeasureBuilder;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.batch.measures.Metric;
+
+import java.io.Serializable;
+
+public class DefaultAnalyzerMeasureBuilder<G extends Serializable> implements AnalyzerMeasureBuilder<G> {
+
+  Boolean onProject = null;
+  InputFile file;
+  String metricKey;
+  G value;
+
+  @Override
+  public AnalyzerMeasureBuilder<G> onFile(InputFile file) {
+    Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
+    Preconditions.checkNotNull(file, "InputFile should be non null");
+    this.file = file;
+    this.onProject = false;
+    return this;
+  }
+
+  @Override
+  public AnalyzerMeasureBuilder<G> onProject() {
+    Preconditions.checkState(onProject == null, "onFile or onProject can be called only once");
+    this.file = null;
+    this.onProject = true;
+    return this;
+  }
+
+  private AnalyzerMeasureBuilder<G> metricKey(String metricKey) {
+    Preconditions.checkState(metricKey != null, "Metric already defined");
+    this.metricKey = metricKey;
+    return this;
+  }
+
+  @Override
+  public AnalyzerMeasureBuilder<G> forMetric(Metric<G> metric) {
+    return metricKey(metric.key());
+  }
+
+  @Override
+  public AnalyzerMeasureBuilder<G> withValue(G value) {
+    Preconditions.checkState(value != null, "Measure value already defined");
+    Preconditions.checkNotNull(value, "Measure value can't be null");
+    this.value = value;
+    return this;
+  }
+
+  @Override
+  public AnalyzerMeasure<G> build() {
+    return new DefaultAnalyzerMeasure<G>(this);
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/internal/package-info.java
new file mode 100644 (file)
index 0000000..d948c6e
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.analyzer.measure.internal;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/measure/package-info.java
new file mode 100644 (file)
index 0000000..4262944
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.analyzer.measure;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/analyzer/package-info.java
new file mode 100644 (file)
index 0000000..02b956c
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.analyzer;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicate.java
new file mode 100644 (file)
index 0000000..830859e
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.fs;
+
+/**
+ * Determines if a file must be kept in search results. See {@link org.sonar.api.batch.fs.FileSystem}
+ * and {@link org.sonar.api.batch.fs.FilePredicates}.
+ * @since 4.2
+ */
+public interface FilePredicate {
+  boolean apply(InputFile inputFile);
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java
new file mode 100644 (file)
index 0000000..65a2e19
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * 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.fs;
+
+import java.io.File;
+import java.util.Collection;
+
+/**
+ * Factory of {@link org.sonar.api.batch.fs.FilePredicate}
+ *
+ * @since 4.2
+ */
+public interface FilePredicates {
+  /**
+   * Returns a predicate that always evaluates to true
+   */
+  FilePredicate all();
+
+  /**
+   * Returns a predicate that always evaluates to false
+   */
+  FilePredicate none();
+
+  /**
+   * Warning - not efficient because absolute path is not indexed yet.
+   */
+  FilePredicate hasAbsolutePath(String s);
+
+  /**
+   * TODO document that non-normalized path and Windows-style path are supported
+   */
+  FilePredicate hasRelativePath(String s);
+
+  FilePredicate matchesPathPattern(String inclusionPattern);
+
+  FilePredicate matchesPathPatterns(String[] inclusionPatterns);
+
+  FilePredicate doesNotMatchPathPattern(String exclusionPattern);
+
+  FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns);
+
+  FilePredicate hasPath(String s);
+
+  FilePredicate is(File ioFile);
+
+  FilePredicate hasLanguage(String language);
+
+  FilePredicate hasLanguages(Collection<String> languages);
+
+  FilePredicate hasLanguages(String... languages);
+
+  FilePredicate hasStatus(InputFile.Status status);
+
+  FilePredicate hasType(InputFile.Type type);
+
+  FilePredicate not(FilePredicate p);
+
+  FilePredicate or(Collection<FilePredicate> or);
+
+  FilePredicate or(FilePredicate... or);
+
+  FilePredicate or(FilePredicate first, FilePredicate second);
+
+  FilePredicate and(Collection<FilePredicate> and);
+
+  FilePredicate and(FilePredicate... and);
+
+  FilePredicate and(FilePredicate first, FilePredicate second);
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java
new file mode 100644 (file)
index 0000000..56fdc03
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * 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.fs;
+
+import org.sonar.api.BatchComponent;
+
+import javax.annotation.CheckForNull;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.SortedSet;
+
+/**
+ * The {@link FileSystem} manages all the source files to be analyzed.
+ * <p/>
+ * This is not an extension point so it must not be implemented by plugins. It must be injected as a
+ * constructor parameter :
+ * <pre>
+ * public class MySensor implements Sensor {
+ *   private final FileSystem fs;
+ *
+ *   public MySensor(FileSystem fs) {
+ *     this.fs = fs;
+ *   }
+ * }
+ * </pre>
+ *
+ * <h2>How to use in unit tests</h2>
+ * The unit tests needing an instance of FileSystem can use the implementation
+ * {@link org.sonar.api.batch.fs.internal.DefaultFileSystem} and the related {@link org.sonar.api.batch.fs.internal.DefaultInputFile},
+ * for example :
+ * <pre>
+ * DefaultFileSystem fs = new DefaultFileSystem();
+ * fs.add(new DefaultInputFile("src/foo/bar.php"));
+ * </pre>
+ *
+ * @since 4.2
+ */
+public interface FileSystem extends BatchComponent {
+
+  /**
+   * Absolute base directory of module
+   */
+  File baseDir();
+
+  /**
+   * Default encoding of input files. If it's not defined, then
+   * the platform default encoding is returned
+   */
+  Charset encoding();
+
+  /**
+   * Absolute work directory. It can be used to
+   * store third-party analysis reports.
+   * <p/>
+   * The work directory can be located outside {@link #baseDir()}.
+   */
+  File workDir();
+
+  /**
+   * Factory of {@link FilePredicate}
+   */
+  FilePredicates predicates();
+
+  /**
+   * Returns the single element matching the predicate. If more than one elements match
+   * the predicate, then {@link IllegalArgumentException} is thrown. Returns {@code null}
+   * if no files match.
+   *
+   * <p/>
+   * How to use :
+   * <pre>
+   * InputFile file = fs.inputFile(fs.predicates().hasRelativePath("src/Foo.php"));
+   * </pre>
+   *
+   * @see #predicates()
+   */
+  @CheckForNull
+  InputFile inputFile(FilePredicate predicate);
+
+  /**
+   * Input files matching the given attributes. Return all the files if the parameter
+   * <code>attributes</code> is empty.
+   * <p/>
+   * <b>Important</b> - result is an {@link java.lang.Iterable} to benefit from streaming and decreasing
+   * memory consumption. It should be iterated only once, else copy it into a list :
+   * {@code com.google.common.collect.Lists.newArrayList(inputFiles(predicate))}
+   * <p/>
+   * How to use :
+   * <pre>
+   * FilePredicates p = fs.predicates();
+   * Iterable<InputFile> files = fs.inputFiles(p.and(p.hasLanguage("java"), p.hasType(InputFile.Type.MAIN)));
+   * </pre>
+   *
+   * @see #predicates()
+   */
+  Iterable<InputFile> inputFiles(FilePredicate predicate);
+
+  /**
+   * Returns true if at least one {@link org.sonar.api.batch.fs.InputFile} matches
+   * the given predicate. This method can be faster than checking if {@link #inputFiles(org.sonar.api.batch.fs.FilePredicate)}
+   * has elements.
+   * @see #predicates()
+   */
+  boolean hasFiles(FilePredicate predicate);
+
+  /**
+   * Files matching the given predicate.
+   * @see #predicates()
+   */
+  Iterable<File> files(FilePredicate predicate);
+
+  /**
+   * Languages detected in all files, whatever their type (main or test)
+   */
+  SortedSet<String> languages();
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFile.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFile.java
new file mode 100644 (file)
index 0000000..83e9697
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * 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.fs;
+
+import java.io.File;
+import java.io.Serializable;
+
+/**
+ * This layer over {@link java.io.File} adds information for code analyzers.
+ *
+ * @since 4.2
+ */
+public interface InputFile extends Serializable {
+
+  enum Type {
+    MAIN, TEST
+  }
+
+  /** 
+   * Status regarding previous analysis
+   */
+  enum Status {
+    SAME, CHANGED, ADDED
+  }
+
+  /**
+   * Path relative to module base directory. Path is unique and identifies file
+   * within given <code>{@link FileSystem}</code>. File separator is the forward
+   * slash ('/'), even on Microsoft Windows.
+   * <p/>
+   * Returns <code>src/main/java/com/Foo.java</code> if module base dir is
+   * <code>/path/to/module</code> and if file is
+   * <code>/path/to/module/src/main/java/com/Foo.java</code>.
+   * <p/>
+   * Relative path is not null and is normalized ('foo/../foo' is replaced by 'foo').
+   */
+  String relativePath();
+
+  /**
+   * Normalized absolute path. File separator is forward slash ('/'), even on Microsoft Windows.
+   * <p/>
+   * This is not canonical path. Symbolic links are not resolved. For example if /project/src links
+   * to /tmp/src and basedir is /project, then this method returns /project/src/index.php. Use
+   * {@code file().getCanonicalPath()} to resolve symbolic link.
+   */
+  String absolutePath();
+
+  /**
+   * The underlying absolute {@link java.io.File}
+   */
+  File file();
+
+  /**
+   * Language, for example "java" or "php". It's automatically guessed if it is not
+   * set in project settings.
+   */
+  String language();
+
+  /**
+   * Does it contain main or test code ?
+   */
+  Type type();
+
+  /**
+   * Status regarding previous analysis
+   */
+  Status status();
+
+  /**
+   * Number of physical lines. This method supports all end-of-line characters. Returns
+   * zero if the file is empty.
+   */
+  int lines();
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFileFilter.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/InputFileFilter.java
new file mode 100644 (file)
index 0000000..1ece508
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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.fs;
+
+import org.sonar.api.BatchExtension;
+
+/**
+ * Extension point to exclude some files from inspection
+ * @since 4.2
+ */
+public interface InputFileFilter extends BatchExtension {
+
+  // TODO requires a context (FileSystem) ?
+  boolean accept(InputFile f);
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java
new file mode 100644 (file)
index 0000000..5090f09
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.utils.PathUtils;
+
+/**
+ * @since 4.2
+ */
+class AbsolutePathPredicate implements FilePredicate {
+
+  private final String path;
+
+  AbsolutePathPredicate(String path) {
+    this.path = PathUtils.sanitize(path);
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    return path.equals(f.absolutePath());
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java
new file mode 100644 (file)
index 0000000..0494ed5
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+import java.util.Collection;
+
+/**
+ * @since 4.2
+ */
+class AndPredicate implements FilePredicate {
+
+  private final Collection<FilePredicate> predicates;
+
+  AndPredicate(Collection<FilePredicate> predicates) {
+    this.predicates = predicates;
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    for (FilePredicate predicate : predicates) {
+      if (!predicate.apply(f)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java
new file mode 100644 (file)
index 0000000..8036d90
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.FilePredicates;
+import org.sonar.api.batch.fs.InputFile;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Factory of {@link org.sonar.api.batch.fs.FilePredicate}
+ *
+ * @since 4.2
+ */
+public class DefaultFilePredicates implements FilePredicates {
+  /**
+   * Client code should use {@link org.sonar.api.batch.fs.FileSystem#predicates()} to get an instance
+   */
+  DefaultFilePredicates() {
+  }
+
+  /**
+   * Returns a predicate that always evaluates to true
+   */
+  public FilePredicate all() {
+    return TruePredicate.TRUE;
+  }
+
+  /**
+   * Returns a predicate that always evaluates to false
+   */
+  public FilePredicate none() {
+    return FalsePredicate.FALSE;
+  }
+
+  /**
+   * Warning - not efficient because absolute path is not indexed yet.
+   */
+  public FilePredicate hasAbsolutePath(String s) {
+    return new AbsolutePathPredicate(s);
+  }
+
+  /**
+   * TODO document that non-normalized path and Windows-style path are supported
+   */
+  public FilePredicate hasRelativePath(String s) {
+    return new RelativePathPredicate(s);
+  }
+
+  public FilePredicate matchesPathPattern(String inclusionPattern) {
+    return new PathPatternPredicate(PathPattern.create(inclusionPattern));
+  }
+
+  public FilePredicate matchesPathPatterns(String[] inclusionPatterns) {
+    if (inclusionPatterns.length == 0) {
+      return TruePredicate.TRUE;
+    }
+    FilePredicate[] predicates = new FilePredicate[inclusionPatterns.length];
+    for (int i = 0; i < inclusionPatterns.length; i++) {
+      predicates[i] = new PathPatternPredicate(PathPattern.create(inclusionPatterns[i]));
+    }
+    return or(predicates);
+  }
+
+  public FilePredicate doesNotMatchPathPattern(String exclusionPattern) {
+    return not(matchesPathPattern(exclusionPattern));
+  }
+
+  public FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns) {
+    if (exclusionPatterns.length == 0) {
+      return TruePredicate.TRUE;
+    }
+    return not(matchesPathPatterns(exclusionPatterns));
+  }
+
+  public FilePredicate hasPath(String s) {
+    File file = new File(s);
+    if (file.isAbsolute()) {
+      return hasAbsolutePath(s);
+    }
+    return hasRelativePath(s);
+  }
+
+  public FilePredicate is(File ioFile) {
+    if (ioFile.isAbsolute()) {
+      return hasAbsolutePath(ioFile.getAbsolutePath());
+    }
+    return hasRelativePath(ioFile.getPath());
+  }
+
+  public FilePredicate hasLanguage(String language) {
+    return new LanguagePredicate(language);
+  }
+
+  public FilePredicate hasLanguages(Collection<String> languages) {
+    List<FilePredicate> list = new ArrayList<FilePredicate>();
+    for (String language : languages) {
+      list.add(hasLanguage(language));
+    }
+    return or(list);
+  }
+
+  public FilePredicate hasLanguages(String... languages) {
+    List<FilePredicate> list = new ArrayList<FilePredicate>();
+    for (String language : languages) {
+      list.add(hasLanguage(language));
+    }
+    return or(list);
+  }
+
+  public FilePredicate hasStatus(InputFile.Status status) {
+    return new StatusPredicate(status);
+  }
+
+  public FilePredicate hasType(InputFile.Type type) {
+    return new TypePredicate(type);
+  }
+
+  public FilePredicate not(FilePredicate p) {
+    return new NotPredicate(p);
+  }
+
+  public FilePredicate or(Collection<FilePredicate> or) {
+    return new OrPredicate(or);
+  }
+
+  public FilePredicate or(FilePredicate... or) {
+    return new OrPredicate(Arrays.asList(or));
+  }
+
+  public FilePredicate or(FilePredicate first, FilePredicate second) {
+    return new OrPredicate(Arrays.asList(first, second));
+  }
+
+  public FilePredicate and(Collection<FilePredicate> and) {
+    return new AndPredicate(and);
+  }
+
+  public FilePredicate and(FilePredicate... and) {
+    return new AndPredicate(Arrays.asList(and));
+  }
+
+  public FilePredicate and(FilePredicate first, FilePredicate second) {
+    return new AndPredicate(Arrays.asList(first, second));
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java
new file mode 100644 (file)
index 0000000..ac2abd6
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * 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.fs.internal;
+
+import com.google.common.base.Preconditions;
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.FilePredicates;
+import org.sonar.api.batch.fs.FileSystem;
+import org.sonar.api.batch.fs.InputFile;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ * @since 4.2
+ */
+public class DefaultFileSystem implements FileSystem {
+
+  private final Cache cache;
+  private final SortedSet<String> languages = new TreeSet<String>();
+  private File baseDir, workDir;
+  private Charset encoding;
+  private final FilePredicates predicates = new DefaultFilePredicates();
+
+  /**
+   * Only for testing
+   */
+  public DefaultFileSystem() {
+    this.cache = new MapCache();
+  }
+
+  protected DefaultFileSystem(Cache cache) {
+    this.cache = cache;
+  }
+
+  public DefaultFileSystem setBaseDir(File d) {
+    Preconditions.checkNotNull(d, "Base directory can't be null");
+    this.baseDir = d.getAbsoluteFile();
+    return this;
+  }
+
+  @Override
+  public File baseDir() {
+    return baseDir;
+  }
+
+  public DefaultFileSystem setEncoding(@Nullable Charset e) {
+    this.encoding = e;
+    return this;
+  }
+
+  @Override
+  public Charset encoding() {
+    return encoding == null ? Charset.defaultCharset() : encoding;
+  }
+
+  public boolean isDefaultJvmEncoding() {
+    return encoding == null;
+  }
+
+  public DefaultFileSystem setWorkDir(File d) {
+    this.workDir = d.getAbsoluteFile();
+    return this;
+  }
+
+  @Override
+  public File workDir() {
+    return workDir;
+  }
+
+  @Override
+  public InputFile inputFile(FilePredicate predicate) {
+    doPreloadFiles();
+    if (predicate instanceof RelativePathPredicate) {
+      return cache.inputFile((RelativePathPredicate) predicate);
+    }
+    Iterable<InputFile> files = inputFiles(predicate);
+    Iterator<InputFile> iterator = files.iterator();
+    if (!iterator.hasNext()) {
+      return null;
+    }
+    InputFile first = iterator.next();
+    if (!iterator.hasNext()) {
+      return first;
+    }
+
+    StringBuilder sb = new StringBuilder();
+    sb.append("expected one element but was: <" + first);
+    for (int i = 0; i < 4 && iterator.hasNext(); i++) {
+      sb.append(", " + iterator.next());
+    }
+    if (iterator.hasNext()) {
+      sb.append(", ...");
+    }
+    sb.append('>');
+
+    throw new IllegalArgumentException(sb.toString());
+
+  }
+
+  @Override
+  public Iterable<InputFile> inputFiles(FilePredicate predicate) {
+    doPreloadFiles();
+    return filter(cache.inputFiles(), predicate);
+  }
+
+  @Override
+  public boolean hasFiles(FilePredicate predicate) {
+    doPreloadFiles();
+    for (InputFile element : cache.inputFiles()) {
+      if (predicate.apply(element)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public Iterable<File> files(FilePredicate predicate) {
+    doPreloadFiles();
+    Collection<File> result = new ArrayList<File>();
+    for (InputFile element : inputFiles(predicate)) {
+      if (predicate.apply(element)) {
+        result.add(element.file());
+      }
+    }
+    return result;
+  }
+
+  public static Collection<InputFile> filter(Iterable<InputFile> target, FilePredicate predicate) {
+    Collection<InputFile> result = new ArrayList<InputFile>();
+    for (InputFile element : target) {
+      if (predicate.apply(element)) {
+        result.add(element);
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Adds InputFile to the list and registers its language, if present.
+   */
+  public DefaultFileSystem add(InputFile inputFile) {
+    cache.add(inputFile);
+    if (inputFile.language() != null) {
+      languages.add(inputFile.language());
+    }
+    return this;
+  }
+
+  /**
+   * Adds a language to the list. To be used only for unit tests that need to use {@link #languages()} without
+   * using {@link #add(org.sonar.api.batch.fs.InputFile)}.
+   */
+  public DefaultFileSystem addLanguages(String language, String... others) {
+    languages.add(language);
+    Collections.addAll(languages, others);
+    return this;
+  }
+
+  @Override
+  public SortedSet<String> languages() {
+    doPreloadFiles();
+    return languages;
+  }
+
+  @Override
+  public FilePredicates predicates() {
+    return predicates;
+  }
+
+  /**
+   * This method is called before each search of files.
+   */
+  protected void doPreloadFiles() {
+    // nothing to do by default
+  }
+
+  public static abstract class Cache {
+    protected abstract Iterable<InputFile> inputFiles();
+
+    @CheckForNull
+    protected abstract InputFile inputFile(RelativePathPredicate predicate);
+
+    protected abstract void doAdd(InputFile inputFile);
+
+    final void add(InputFile inputFile) {
+      doAdd(inputFile);
+    }
+  }
+
+  /**
+   * Used only for testing
+   */
+  private static class MapCache extends Cache {
+    private final Map<String, InputFile> fileMap = new HashMap<String, InputFile>();
+
+    @Override
+    public Iterable<InputFile> inputFiles() {
+      return new ArrayList<InputFile>(fileMap.values());
+    }
+
+    @Override
+    public InputFile inputFile(RelativePathPredicate predicate) {
+      return fileMap.get(predicate.path());
+    }
+
+    @Override
+    protected void doAdd(InputFile inputFile) {
+      fileMap.put(inputFile.relativePath(), inputFile);
+    }
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java
new file mode 100644 (file)
index 0000000..2e472ca
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * 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.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;
+
+/**
+ * @since 4.2
+ */
+public class DefaultInputFile implements InputFile, Serializable {
+
+  private final String relativePath;
+  private String absolutePath;
+  private String language;
+  private Type type = Type.MAIN;
+  private Status status;
+  private String hash;
+  private int lines;
+  private String key;
+
+  public DefaultInputFile(String relativePath) {
+    this.relativePath = PathUtils.sanitize(relativePath);
+  }
+
+  @Override
+  public String relativePath() {
+    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;
+  }
+
+  @Override
+  public File file() {
+    if (absolutePath == null) {
+      throw new IllegalStateException("Can not return the java.io.File because absolute path is not set (see method setFile(java.io.File))");
+    }
+    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;
+  }
+
+  @Override
+  public Type type() {
+    return type;
+  }
+
+  /**
+   * 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)}
+   */
+  @CheckForNull
+  public String hash() {
+    return hash;
+  }
+
+  @Override
+  public int lines() {
+    return lines;
+  }
+
+  /**
+   * Component key. It's marked as nullable just for the unit tests that
+   * do not previously call {@link #setKey(String)}.
+   */
+  @CheckForNull
+  public String key() {
+    return key;
+  }
+
+  public DefaultInputFile setAbsolutePath(String s) {
+    this.absolutePath = PathUtils.sanitize(s);
+    return this;
+  }
+
+  public DefaultInputFile setLanguage(String language) {
+    this.language = language;
+    return this;
+  }
+
+  public DefaultInputFile setFile(File file) {
+    setAbsolutePath(file.getAbsolutePath());
+    return this;
+  }
+
+  public DefaultInputFile setType(Type type) {
+    this.type = type;
+    return this;
+  }
+
+  public DefaultInputFile setStatus(Status status) {
+    this.status = status;
+    return this;
+  }
+
+  public DefaultInputFile setHash(String hash) {
+    this.hash = hash;
+    return this;
+  }
+
+  public DefaultInputFile setLines(int lines) {
+    this.lines = lines;
+    return this;
+  }
+
+  public DefaultInputFile setKey(String s) {
+    this.key = s;
+    return this;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DefaultInputFile)) {
+      return false;
+    }
+
+    DefaultInputFile that = (DefaultInputFile) o;
+    return relativePath.equals(that.relativePath);
+  }
+
+  @Override
+  public int hashCode() {
+    return relativePath.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return "[relative=" + relativePath + ", abs=" + absolutePath + "]";
+  }
+}
index fad4e6d43cee3290905f3ade9959a0e84be6821f..156e140fa57c3b330143fd4ab01e52f8381e3735 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.api.batch.fs.internal;
 
-import org.sonar.batch.api.internal.FilenameUtils;
+import org.sonar.api.utils.PathUtils;
 
 import java.io.BufferedInputStream;
 import java.io.File;
@@ -51,7 +51,7 @@ public class DeprecatedDefaultInputFile extends DefaultInputFile implements org.
   }
 
   public void setBasedir(File basedir) {
-    this.basedir = FilenameUtils.normalize(basedir.getAbsolutePath());
+    this.basedir = PathUtils.sanitize(basedir.getAbsolutePath());
   }
 
   /**
@@ -92,7 +92,7 @@ public class DeprecatedDefaultInputFile extends DefaultInputFile implements org.
   }
 
   public DeprecatedDefaultInputFile setSourceDirAbsolutePath(String s) {
-    this.sourceDirAbsolutePath = FilenameUtils.normalize(s);
+    this.sourceDirAbsolutePath = PathUtils.sanitize(s);
     return this;
   }
 
@@ -105,7 +105,7 @@ public class DeprecatedDefaultInputFile extends DefaultInputFile implements org.
   }
 
   public DeprecatedDefaultInputFile setPathRelativeToSourceDir(String s) {
-    this.pathRelativeToSourceDir = FilenameUtils.normalize(s);
+    this.pathRelativeToSourceDir = PathUtils.sanitize(s);
     return this;
   }
 
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java
new file mode 100644 (file)
index 0000000..b092f84
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+class FalsePredicate implements FilePredicate {
+
+  static final FilePredicate FALSE = new FalsePredicate();
+
+  @Override
+  public boolean apply(InputFile inputFile) {
+    return false;
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java
new file mode 100644 (file)
index 0000000..77d2f74
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+/**
+ * @since 4.2
+ */
+class LanguagePredicate implements FilePredicate {
+  private final String language;
+
+  LanguagePredicate(String language) {
+    this.language = language;
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    return language.equals(f.language());
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java
new file mode 100644 (file)
index 0000000..5f2359e
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+/**
+ * @since 4.2
+ */
+class NotPredicate implements FilePredicate {
+
+  private final FilePredicate predicate;
+
+  NotPredicate(FilePredicate predicate) {
+    this.predicate = predicate;
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    return !predicate.apply(f);
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java
new file mode 100644 (file)
index 0000000..a887c63
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+/**
+ * @since 4.2
+ */
+class OrPredicate implements FilePredicate {
+
+  private final Collection<FilePredicate> predicates;
+
+  OrPredicate(Collection<FilePredicate> predicates) {
+    if (predicates.isEmpty()) {
+      this.predicates = Arrays.asList(TruePredicate.TRUE);
+    } else {
+      this.predicates = predicates;
+    }
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    for (FilePredicate predicate : predicates) {
+      if (predicate.apply(f)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPattern.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPattern.java
new file mode 100644 (file)
index 0000000..c1b53b6
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * 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.fs.internal;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.utils.WildcardPattern;
+
+public abstract class PathPattern {
+
+  final WildcardPattern pattern;
+
+  PathPattern(String pattern) {
+    this.pattern = WildcardPattern.create(pattern);
+  }
+
+  public abstract boolean match(InputFile inputFile);
+
+  public abstract boolean match(InputFile inputFile, boolean caseSensitiveFileExtension);
+
+  public static PathPattern create(String s) {
+    String trimmed = StringUtils.trim(s);
+    if (StringUtils.startsWithIgnoreCase(trimmed, "file:")) {
+      return new AbsolutePathPattern(StringUtils.substring(trimmed, "file:".length()));
+    }
+    return new RelativePathPattern(trimmed);
+  }
+
+  public static PathPattern[] create(String[] s) {
+    PathPattern[] result = new PathPattern[s.length];
+    for (int i = 0; i < s.length; i++) {
+      result[i] = create(s[i]);
+    }
+    return result;
+  }
+
+  private static class AbsolutePathPattern extends PathPattern {
+    private AbsolutePathPattern(String pattern) {
+      super(pattern);
+    }
+
+    @Override
+    public boolean match(InputFile inputFile) {
+      return match(inputFile, true);
+    }
+
+    @Override
+    public boolean match(InputFile inputFile, boolean caseSensitiveFileExtension) {
+      String path = inputFile.absolutePath();
+      if (!caseSensitiveFileExtension) {
+        String extension = sanitizeExtension(FilenameUtils.getExtension(inputFile.file().getName()));
+        if (StringUtils.isNotBlank(extension)) {
+          path = StringUtils.removeEndIgnoreCase(path, extension);
+          path = path + extension;
+        }
+      }
+      return pattern.match(path);
+    }
+
+    @Override
+    public String toString() {
+      return "file:" + pattern.toString();
+    }
+  }
+
+  /**
+   * Path relative to module basedir
+   */
+  private static class RelativePathPattern extends PathPattern {
+    private RelativePathPattern(String pattern) {
+      super(pattern);
+    }
+
+    @Override
+    public boolean match(InputFile inputFile) {
+      return match(inputFile, true);
+    }
+
+    @Override
+    public boolean match(InputFile inputFile, boolean caseSensitiveFileExtension) {
+      String path = inputFile.relativePath();
+      if (!caseSensitiveFileExtension) {
+        String extension = sanitizeExtension(FilenameUtils.getExtension(inputFile.file().getName()));
+        if (StringUtils.isNotBlank(extension)) {
+          path = StringUtils.removeEndIgnoreCase(path, extension);
+          path = path + extension;
+        }
+      }
+      return path != null && pattern.match(path);
+    }
+
+    @Override
+    public String toString() {
+      return pattern.toString();
+    }
+  }
+
+  static String sanitizeExtension(String suffix) {
+    return StringUtils.lowerCase(StringUtils.removeStart(suffix, "."));
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java
new file mode 100644 (file)
index 0000000..0cf614b
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+/**
+ * @since 4.2
+ */
+class PathPatternPredicate implements FilePredicate {
+
+  private final PathPattern pattern;
+
+  PathPatternPredicate(PathPattern pattern) {
+    this.pattern = pattern;
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    return pattern.match(f);
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java
new file mode 100644 (file)
index 0000000..3763bcd
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+import org.sonar.api.utils.PathUtils;
+
+/**
+ * @since 4.2
+ */
+public class RelativePathPredicate implements FilePredicate {
+
+  private final String path;
+
+  RelativePathPredicate(String path) {
+    this.path = PathUtils.sanitize(path);
+  }
+
+  public String path() {
+    return path;
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    return path.equals(f.relativePath());
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java
new file mode 100644 (file)
index 0000000..fe7c934
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+/**
+ * @since 4.2
+ */
+class StatusPredicate implements FilePredicate {
+
+  private final InputFile.Status status;
+
+  StatusPredicate(InputFile.Status status) {
+    this.status = status;
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    return status == f.status();
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java
new file mode 100644 (file)
index 0000000..ec2aebd
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+class TruePredicate implements FilePredicate {
+
+  static final FilePredicate TRUE = new TruePredicate();
+
+  @Override
+  public boolean apply(InputFile inputFile) {
+    return true;
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java
new file mode 100644 (file)
index 0000000..ac8b6d5
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * 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.fs.internal;
+
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.InputFile;
+
+/**
+ * @since 4.2
+ */
+class TypePredicate implements FilePredicate {
+
+  private final InputFile.Type type;
+
+  TypePredicate(InputFile.Type type) {
+    this.type = type;
+  }
+
+  @Override
+  public boolean apply(InputFile f) {
+    return type == f.type();
+  }
+
+}
+
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/package-info.java
new file mode 100644 (file)
index 0000000..713fe61
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.api.batch.fs.internal;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/package-info.java
new file mode 100644 (file)
index 0000000..c97db58
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.api.batch.fs;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/languages/Language.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/languages/Language.java
new file mode 100644 (file)
index 0000000..726c951
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * 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.languages;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+public final class Language {
+
+  private final String key, name;
+  private final String[] fileSuffixes;
+
+  public Language(String key, String name, String... fileSuffixes) {
+    this.key = key;
+    this.name = name;
+    this.fileSuffixes = fileSuffixes;
+  }
+
+  /**
+   * For example "java".
+   */
+  public String key() {
+    return key;
+  }
+
+  /**
+   * For example "Java"
+   */
+  public String name() {
+    return name;
+  }
+
+  /**
+   * For example ["jav", "java"].
+   */
+  public Collection<String> fileSuffixes() {
+    return Arrays.asList(fileSuffixes);
+  }
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/languages/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/languages/package-info.java
new file mode 100644 (file)
index 0000000..40c79e6
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.languages;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/measures/Metric.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/measures/Metric.java
new file mode 100644 (file)
index 0000000..6b8d044
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.measures;
+
+import java.io.Serializable;
+
+public interface Metric<G extends Serializable> {
+
+  Class<G> type();
+
+  String key();
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/measures/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/measures/package-info.java
new file mode 100644 (file)
index 0000000..ae11775
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.measures;
\ No newline at end of file
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rules/QProfile.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rules/QProfile.java
new file mode 100644 (file)
index 0000000..1b4e947
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * 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.rules;
+
+public class QProfile {
+  private final String name, language;
+  private final Integer version;
+
+  public QProfile(String name, String language, Integer version) {
+    this.name = name;
+    this.language = language;
+    this.version = version;
+  }
+
+  public String name() {
+    return name;
+  }
+
+  public String language() {
+    return language;
+  }
+
+  public Integer version() {
+    return version;
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/rules/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/rules/package-info.java
new file mode 100644 (file)
index 0000000..ba4f7e4
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+@javax.annotation.ParametersAreNonnullByDefault
+package org.sonar.api.batch.rules;
\ No newline at end of file
index c51973b79b79b96069e1197d1815216afe6809f2..53407b9136dedbf49b7e3c087efe7bbfc90ac545 100644 (file)
@@ -51,7 +51,7 @@ public final class MeasuresFilters {
     };
   }
 
-  public static MeasuresFilter<Measure> metric(final org.sonar.batch.api.measures.Metric<?> metric) {
+  public static MeasuresFilter<Measure> metric(final org.sonar.api.batch.measures.Metric<?> metric) {
     return metric(metric.key());
   }
 
index 9ea0288fd0ab21e23cb070480d1c7d66ee11bea1..ccd4d8c8d50de7d0812265a8e0430ba48db3fa25 100644 (file)
@@ -46,7 +46,7 @@ import java.io.Serializable;
 @Table(name = "metrics")
 @Entity(name = "Metric")
 @InstantiationStrategy(InstantiationStrategy.PER_BATCH)
-public class Metric<G extends Serializable> implements ServerExtension, BatchExtension, Serializable, org.sonar.batch.api.measures.Metric<G> {
+public class Metric<G extends Serializable> implements ServerExtension, BatchExtension, Serializable, org.sonar.api.batch.measures.Metric<G> {
 
   /**
    * A metric bigger value means a degradation
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java
new file mode 100644 (file)
index 0000000..95888fe
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * 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.fs.internal;
+
+import org.fest.assertions.Assertions;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.fs.FilePredicate;
+import org.sonar.api.batch.fs.FilePredicates;
+import org.sonar.api.batch.fs.InputFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class DefaultFilePredicatesTest {
+
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
+  DefaultInputFile javaFile;
+  FilePredicates predicates = new DefaultFilePredicates();
+
+  @Before
+  public void before() throws IOException {
+    javaFile = new DefaultInputFile("src/main/java/struts/Action.java")
+      .setFile(temp.newFile("Action.java"))
+      .setLanguage("java")
+      .setStatus(InputFile.Status.ADDED);
+  }
+
+  @Test
+  public void all() throws Exception {
+    Assertions.assertThat(predicates.all().apply(javaFile)).isTrue();
+  }
+
+  @Test
+  public void none() throws Exception {
+    assertThat(predicates.none().apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void matches_inclusion_pattern() throws Exception {
+    assertThat(predicates.matchesPathPattern("src/main/**/Action.java").apply(javaFile)).isTrue();
+    assertThat(predicates.matchesPathPattern("Action.java").apply(javaFile)).isFalse();
+    assertThat(predicates.matchesPathPattern("src/**/*.php").apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void matches_inclusion_patterns() throws Exception {
+    assertThat(predicates.matchesPathPatterns(new String[] {"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isTrue();
+    assertThat(predicates.matchesPathPatterns(new String[] {}).apply(javaFile)).isTrue();
+    assertThat(predicates.matchesPathPatterns(new String[] {"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void does_not_match_exclusion_pattern() throws Exception {
+    assertThat(predicates.doesNotMatchPathPattern("src/main/**/Action.java").apply(javaFile)).isFalse();
+    assertThat(predicates.doesNotMatchPathPattern("Action.java").apply(javaFile)).isTrue();
+    assertThat(predicates.doesNotMatchPathPattern("src/**/*.php").apply(javaFile)).isTrue();
+  }
+
+  @Test
+  public void does_not_match_exclusion_patterns() throws Exception {
+    assertThat(predicates.doesNotMatchPathPatterns(new String[] {}).apply(javaFile)).isTrue();
+    assertThat(predicates.doesNotMatchPathPatterns(new String[] {"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isTrue();
+    assertThat(predicates.doesNotMatchPathPatterns(new String[] {"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void has_relative_path() throws Exception {
+    assertThat(predicates.hasRelativePath("src/main/java/struts/Action.java").apply(javaFile)).isTrue();
+    assertThat(predicates.hasRelativePath("src/main/java/struts/Other.java").apply(javaFile)).isFalse();
+
+    // path is normalized
+    assertThat(predicates.hasRelativePath("src/main/java/../java/struts/Action.java").apply(javaFile)).isTrue();
+
+    assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Action.java").apply(javaFile)).isTrue();
+    assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Other.java").apply(javaFile)).isFalse();
+    assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\..\\struts\\Action.java").apply(javaFile)).isTrue();
+  }
+
+  @Test
+  public void has_absolute_path() throws Exception {
+    String path = javaFile.file().getAbsolutePath();
+    assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue();
+    assertThat(predicates.hasAbsolutePath(path.replaceAll("/", "\\\\")).apply(javaFile)).isTrue();
+
+    assertThat(predicates.hasAbsolutePath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse();
+    assertThat(predicates.hasAbsolutePath("src/main/java/struts/Action.java").apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void has_path() throws Exception {
+    // is relative path
+    assertThat(predicates.hasPath("src/main/java/struts/Action.java").apply(javaFile)).isTrue();
+    assertThat(predicates.hasPath("src/main/java/struts/Other.java").apply(javaFile)).isFalse();
+
+    // is absolute path
+    String path = javaFile.file().getAbsolutePath();
+    assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue();
+    assertThat(predicates.hasPath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void is_file() throws Exception {
+    // relative file
+    assertThat(predicates.is(new File(javaFile.relativePath())).apply(javaFile)).isTrue();
+
+    // absolute file
+    assertThat(predicates.is(javaFile.file()).apply(javaFile)).isTrue();
+    assertThat(predicates.is(javaFile.file().getAbsoluteFile()).apply(javaFile)).isTrue();
+    assertThat(predicates.is(javaFile.file().getCanonicalFile()).apply(javaFile)).isTrue();
+    assertThat(predicates.is(new File(javaFile.file().toURI())).apply(javaFile)).isTrue();
+    assertThat(predicates.is(temp.newFile()).apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void has_language() throws Exception {
+    assertThat(predicates.hasLanguage("java").apply(javaFile)).isTrue();
+    assertThat(predicates.hasLanguage("php").apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void has_languages() throws Exception {
+    assertThat(predicates.hasLanguages(Arrays.asList("java", "php")).apply(javaFile)).isTrue();
+    assertThat(predicates.hasLanguages(Arrays.asList("cobol", "php")).apply(javaFile)).isFalse();
+    assertThat(predicates.hasLanguages(Collections.<String>emptyList()).apply(javaFile)).isTrue();
+  }
+
+  @Test
+  public void has_status() throws Exception {
+    assertThat(predicates.hasStatus(InputFile.Status.ADDED).apply(javaFile)).isTrue();
+    assertThat(predicates.hasStatus(InputFile.Status.CHANGED).apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void has_type() throws Exception {
+    assertThat(predicates.hasType(InputFile.Type.MAIN).apply(javaFile)).isTrue();
+    assertThat(predicates.hasType(InputFile.Type.TEST).apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void not() throws Exception {
+    assertThat(predicates.not(predicates.hasType(InputFile.Type.MAIN)).apply(javaFile)).isFalse();
+    assertThat(predicates.not(predicates.hasType(InputFile.Type.TEST)).apply(javaFile)).isTrue();
+  }
+
+  @Test
+  public void and() throws Exception {
+    // empty
+    assertThat(predicates.and().apply(javaFile)).isTrue();
+    assertThat(predicates.and(new FilePredicate[0]).apply(javaFile)).isTrue();
+    assertThat(predicates.and(Collections.<FilePredicate>emptyList()).apply(javaFile)).isTrue();
+
+    // two arguments
+    assertThat(predicates.and(predicates.all(), predicates.all()).apply(javaFile)).isTrue();
+    assertThat(predicates.and(predicates.all(), predicates.none()).apply(javaFile)).isFalse();
+    assertThat(predicates.and(predicates.none(), predicates.all()).apply(javaFile)).isFalse();
+
+    // collection
+    assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue();
+    assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isFalse();
+
+    // array
+    assertThat(predicates.and(new FilePredicate[] {predicates.all(), predicates.all()}).apply(javaFile)).isTrue();
+    assertThat(predicates.and(new FilePredicate[] {predicates.all(), predicates.none()}).apply(javaFile)).isFalse();
+  }
+
+  @Test
+  public void or() throws Exception {
+    // empty
+    assertThat(predicates.or().apply(javaFile)).isTrue();
+    assertThat(predicates.or(new FilePredicate[0]).apply(javaFile)).isTrue();
+    assertThat(predicates.or(Collections.<FilePredicate>emptyList()).apply(javaFile)).isTrue();
+
+    // two arguments
+    assertThat(predicates.or(predicates.all(), predicates.all()).apply(javaFile)).isTrue();
+    assertThat(predicates.or(predicates.all(), predicates.none()).apply(javaFile)).isTrue();
+    assertThat(predicates.or(predicates.none(), predicates.all()).apply(javaFile)).isTrue();
+    assertThat(predicates.or(predicates.none(), predicates.none()).apply(javaFile)).isFalse();
+
+    // collection
+    assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue();
+    assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isTrue();
+    assertThat(predicates.or(Arrays.asList(predicates.none(), predicates.none())).apply(javaFile)).isFalse();
+
+    // array
+    assertThat(predicates.or(new FilePredicate[] {predicates.all(), predicates.all()}).apply(javaFile)).isTrue();
+    assertThat(predicates.or(new FilePredicate[] {predicates.all(), predicates.none()}).apply(javaFile)).isTrue();
+    assertThat(predicates.or(new FilePredicate[] {predicates.none(), predicates.none()}).apply(javaFile)).isFalse();
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java
new file mode 100644 (file)
index 0000000..678fdc5
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * 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.fs.internal;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.nio.charset.Charset;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class DefaultFileSystemTest {
+
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
+  @Rule
+  public ExpectedException thrown = ExpectedException.none();
+
+  @Test
+  public void test_directories() throws Exception {
+    DefaultFileSystem fs = new DefaultFileSystem();
+
+    File basedir = temp.newFolder();
+    fs.setBaseDir(basedir);
+    assertThat(fs.baseDir()).isAbsolute().isDirectory().exists();
+    assertThat(fs.baseDir().getCanonicalPath()).isEqualTo(basedir.getCanonicalPath());
+
+    File workdir = temp.newFolder();
+    fs.setWorkDir(workdir);
+    assertThat(fs.workDir()).isAbsolute().isDirectory().exists();
+    assertThat(fs.workDir().getCanonicalPath()).isEqualTo(workdir.getCanonicalPath());
+  }
+
+  @Test
+  public void test_encoding() throws Exception {
+    DefaultFileSystem fs = new DefaultFileSystem();
+
+    assertThat(fs.isDefaultJvmEncoding()).isTrue();
+    assertThat(fs.encoding()).isEqualTo(Charset.defaultCharset());
+
+    fs.setEncoding(Charset.forName("ISO-8859-1"));
+    assertThat(fs.encoding()).isEqualTo(Charset.forName("ISO-8859-1"));
+    assertThat(fs.isDefaultJvmEncoding()).isFalse();
+  }
+
+  @Test
+  public void add_languages() throws Exception {
+    DefaultFileSystem fs = new DefaultFileSystem();
+
+    assertThat(fs.languages()).isEmpty();
+
+    fs.addLanguages("java", "php", "cobol");
+    assertThat(fs.languages()).containsOnly("cobol", "java", "php");
+  }
+
+  @Test
+  public void files() throws Exception {
+    DefaultFileSystem fs = new DefaultFileSystem();
+
+    assertThat(fs.inputFiles(fs.predicates().all())).isEmpty();
+
+    fs.add(new DefaultInputFile("src/Foo.php").setLanguage("php").setFile(temp.newFile()));
+    fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile()));
+    fs.add(new DefaultInputFile("src/Baz.java").setLanguage("java").setFile(temp.newFile()));
+
+    // no language
+    fs.add(new DefaultInputFile("src/readme.txt").setFile(temp.newFile()));
+
+    assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNotNull();
+    assertThat(fs.inputFile(fs.predicates().hasRelativePath("does/not/exist"))).isNull();
+
+    assertThat(fs.files(fs.predicates().all())).hasSize(4);
+    assertThat(fs.files(fs.predicates().hasLanguage("java"))).hasSize(2);
+    assertThat(fs.files(fs.predicates().hasLanguage("cobol"))).isEmpty();
+
+    assertThat(fs.hasFiles(fs.predicates().all())).isTrue();
+    assertThat(fs.hasFiles(fs.predicates().hasLanguage("java"))).isTrue();
+    assertThat(fs.hasFiles(fs.predicates().hasLanguage("cobol"))).isFalse();
+
+    assertThat(fs.inputFiles(fs.predicates().all())).hasSize(4);
+    assertThat(fs.inputFiles(fs.predicates().hasLanguage("php"))).hasSize(1);
+    assertThat(fs.inputFiles(fs.predicates().hasLanguage("java"))).hasSize(2);
+    assertThat(fs.inputFiles(fs.predicates().hasLanguage("cobol"))).isEmpty();
+
+    assertThat(fs.languages()).containsOnly("java", "php");
+  }
+
+  @Test
+  public void input_file_returns_null_if_file_not_found() throws Exception {
+    DefaultFileSystem fs = new DefaultFileSystem();
+    assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNull();
+    assertThat(fs.inputFile(fs.predicates().hasLanguage("cobol"))).isNull();
+  }
+
+  @Test
+  public void input_file_fails_if_too_many_results() throws Exception {
+    thrown.expect(IllegalArgumentException.class);
+    thrown.expectMessage("expected one element");
+
+    DefaultFileSystem fs = new DefaultFileSystem();
+    fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile()));
+    fs.add(new DefaultInputFile("src/Baz.java").setLanguage("java").setFile(temp.newFile()));
+
+    fs.inputFile(fs.predicates().all());
+  }
+
+  @Test
+  public void input_file_supports_non_indexed_predicates() throws Exception {
+    DefaultFileSystem fs = new DefaultFileSystem();
+    fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile()));
+
+    // it would fail if more than one java file
+    assertThat(fs.inputFile(fs.predicates().hasLanguage("java"))).isNotNull();
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultInputFileTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultInputFileTest.java
new file mode 100644 (file)
index 0000000..b96821f
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * 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.fs.internal;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.fs.InputFile;
+
+import java.io.File;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class DefaultInputFileTest {
+
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
+  @Test
+  public void test() throws Exception {
+    DefaultInputFile inputFile = new DefaultInputFile("src/Foo.php")
+      .setFile(temp.newFile("Foo.php"))
+      .setKey("ABCDE")
+      .setHash("1234")
+      .setLines(42)
+      .setLanguage("php")
+      .setStatus(InputFile.Status.ADDED)
+      .setType(InputFile.Type.TEST);
+
+    assertThat(inputFile.relativePath()).isEqualTo("src/Foo.php");
+    assertThat(new File(inputFile.relativePath())).isRelative();
+    assertThat(inputFile.absolutePath()).endsWith("Foo.php");
+    assertThat(new File(inputFile.absolutePath())).isAbsolute();
+    assertThat(inputFile.language()).isEqualTo("php");
+    assertThat(inputFile.status()).isEqualTo(InputFile.Status.ADDED);
+    assertThat(inputFile.type()).isEqualTo(InputFile.Type.TEST);
+    assertThat(inputFile.lines()).isEqualTo(42);
+    assertThat(inputFile.hash()).isEqualTo("1234");
+  }
+
+  @Test
+  public void test_equals_and_hashcode() throws Exception {
+    DefaultInputFile f1 = new DefaultInputFile("src/Foo.php");
+    DefaultInputFile f1a = new DefaultInputFile("src/Foo.php");
+    DefaultInputFile f2 = new DefaultInputFile("src/Bar.php");
+
+    assertThat(f1).isEqualTo(f1);
+    assertThat(f1).isEqualTo(f1a);
+    assertThat(f1).isNotEqualTo(f2);
+    assertThat(f1.equals("foo")).isFalse();
+    assertThat(f1.equals(null)).isFalse();
+
+    assertThat(f1.hashCode()).isEqualTo(f1.hashCode());
+    assertThat(f1.hashCode()).isEqualTo(f1a.hashCode());
+  }
+
+  @Test
+  public void test_toString() throws Exception {
+    DefaultInputFile file = new DefaultInputFile("src/Foo.php").setAbsolutePath("/path/to/src/Foo.php");
+    assertThat(file.toString()).isEqualTo("[relative=src/Foo.php, abs=/path/to/src/Foo.php]");
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/PathPatternTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/PathPatternTest.java
new file mode 100644 (file)
index 0000000..01d6dab
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * 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.fs.internal;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.fs.InputFile;
+
+import java.io.File;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class PathPatternTest {
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
+  @Test
+  public void match_relative_path() throws Exception {
+    PathPattern pattern = PathPattern.create("**/*Foo.java");
+    assertThat(pattern.toString()).isEqualTo("**/*Foo.java");
+
+    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.java");
+    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.java").setFile(file);
+    assertThat(pattern.match(inputFile)).isTrue();
+
+    // case sensitive by default
+    file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
+    inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
+    assertThat(pattern.match(inputFile)).isFalse();
+
+    file = new File(temp.newFolder(), "src/main/java/org/Other.java");
+    inputFile = new DefaultInputFile("src/main/java/org/Other.java").setFile(file);
+    assertThat(pattern.match(inputFile)).isFalse();
+  }
+
+  @Test
+  public void match_relative_path_and_insensitive_file_extension() throws Exception {
+    PathPattern pattern = PathPattern.create("**/*Foo.java");
+
+    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
+    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
+    assertThat(pattern.match(inputFile, false)).isTrue();
+
+    file = new File(temp.newFolder(), "src/main/java/org/Other.java");
+    inputFile = new DefaultInputFile("src/main/java/org/Other.java").setFile(file);
+    assertThat(pattern.match(inputFile, false)).isFalse();
+  }
+
+  @Test
+  public void match_absolute_path() throws Exception {
+    PathPattern pattern = PathPattern.create("file:**/src/main/**Foo.java");
+    assertThat(pattern.toString()).isEqualTo("file:**/src/main/**Foo.java");
+
+    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.java");
+    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.java").setFile(file);
+    assertThat(pattern.match(inputFile)).isTrue();
+
+    // case sensitive by default
+    file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
+    inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
+    assertThat(pattern.match(inputFile)).isFalse();
+
+    file = new File(temp.newFolder(), "src/main/java/org/Other.java");
+    inputFile = new DefaultInputFile("src/main/java/org/Other.java").setFile(file);
+    assertThat(pattern.match(inputFile)).isFalse();
+  }
+
+  @Test
+  public void match_absolute_path_and_insensitive_file_extension() throws Exception {
+    PathPattern pattern = PathPattern.create("file:**/src/main/**Foo.java");
+    assertThat(pattern.toString()).isEqualTo("file:**/src/main/**Foo.java");
+
+    File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.JAVA");
+    InputFile inputFile = new DefaultInputFile("src/main/java/org/MyFoo.JAVA").setFile(file);
+    assertThat(pattern.match(inputFile, false)).isTrue();
+
+    file = new File(temp.newFolder(), "src/main/java/org/Other.JAVA");
+    inputFile = new DefaultInputFile("src/main/java/org/Other.JAVA").setFile(file);
+    assertThat(pattern.match(inputFile, false)).isFalse();
+  }
+
+  @Test
+  public void create_array_of_patterns() throws Exception {
+    PathPattern[] patterns = PathPattern.create(new String[]{
+      "**/src/main/**Foo.java",
+      "file:**/src/main/**Bar.java"
+    });
+    assertThat(patterns).hasSize(2);
+    assertThat(patterns[0].toString()).isEqualTo("**/src/main/**Foo.java");
+    assertThat(patterns[1].toString()).isEqualTo("file:**/src/main/**Bar.java");
+  }
+}