]> source.dussan.org Git - sonarqube.git/commitdiff
Rework file indexing
authorJulien HENRY <julien.henry@sonarsource.com>
Mon, 31 Jul 2017 11:12:10 +0000 (13:12 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Fri, 4 Aug 2017 12:58:16 +0000 (14:58 +0200)
  * Drop cycle ModuleFileSystem -> FileIndexer -> ModuleFileSystem
  * Ensure basedir is initialized once
  * Drop useless FileSystemLogger, and log in ModuleFileSystemInitializer

59 files changed:
plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/lang/SymbolReferencesSensorTest.java
sonar-core/src/main/java/org/sonar/core/util/FileUtils.java
sonar-core/src/test/java/org/sonar/core/util/FileUtilsTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputModule.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TestInputFileBuilder.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/SensorContextTester.java
sonar-plugin-api/src/main/java/org/sonar/api/scan/filesystem/PathResolver.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultInputModuleTest.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/TestInputFileBuilderTest.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/SensorContextTesterTest.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/measure/internal/DefaultMeasureTest.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/AnalysisTempFolderProvider.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/tracking/IssueTransition.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/mediumtest/TaskResult.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/phases/AbstractPhaseExecutor.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/phases/IssuesPhaseExecutor.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/phases/PublishPhaseExecutor.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/DefaultInputModuleHierarchy.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleScanContainer.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectLock.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/WorkDirectoryCleaner.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultModuleFileSystem.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileIndexer.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileSystemLogger.java [deleted file]
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputFileBuilder.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleFileSystemInitializer.java
sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmConfiguration.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/analysis/AnalysisTempFolderProviderTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerExtensionDictionnaryTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/index/DefaultIndexTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/DeprecatedIssueAdapterForFilterTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/IssuableFactoryTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/tracking/SourceHashHolderTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/PostJobsExecutorTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/SensorsExecutorTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/profiling/PhasesSumUpTimeProfilerTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/AnalysisContextReportPublisherTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/DefaultComponentTreeTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/DefaultInputModuleHierarchyTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectLockTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/WorkDirectoryCleanerTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputFileBuilderTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/MetadataGeneratorProviderTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/MetadataGeneratorTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleFileSystemInitializerTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/report/JSONReportTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorStorageTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/source/HighlightableBuilderTest.java
sonar-scanner-engine/src/test/java/org/sonar/scanner/source/SymbolizableBuilderTest.java
sonar-scanner-protocol/src/main/java/org/sonar/scanner/protocol/output/ScannerReportWriter.java

index ecddb37cba9a9f397a5488028b5ea9ce2b8abe76..851bf8903d33ceb417f80b6fae3054753d0b7552 100644 (file)
  */
 package org.sonar.xoo.lang;
 
+import java.io.File;
+import java.io.IOException;
 import org.apache.commons.io.FileUtils;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.fs.InputFile;
-import org.sonar.api.batch.fs.internal.DefaultFileSystem;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
-import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
+import org.sonar.api.batch.sensor.internal.SensorContextTester;
 import org.sonar.api.component.ResourcePerspectives;
 import org.sonar.api.source.Symbol;
 import org.sonar.api.source.Symbolizable;
 
-import java.io.File;
-import java.io.IOException;
-
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -43,8 +41,7 @@ import static org.mockito.Mockito.when;
 public class SymbolReferencesSensorTest {
 
   private SymbolReferencesSensor sensor;
-  private SensorContext context = mock(SensorContext.class);
-  private DefaultFileSystem fileSystem;
+  private SensorContextTester context;
 
   @Rule
   public TemporaryFolder temp = new TemporaryFolder();
@@ -56,8 +53,7 @@ public class SymbolReferencesSensorTest {
     baseDir = temp.newFolder();
     perspectives = mock(ResourcePerspectives.class);
     sensor = new SymbolReferencesSensor(perspectives);
-    fileSystem = new DefaultFileSystem(baseDir.toPath());
-    when(context.fileSystem()).thenReturn(fileSystem);
+    context = SensorContextTester.create(baseDir);
   }
 
   @Test
@@ -68,7 +64,7 @@ public class SymbolReferencesSensorTest {
   @Test
   public void testNoExecutionIfNoSymbolFile() {
     InputFile inputFile = new TestInputFileBuilder("foo", "src/foo.xoo").setLanguage("xoo").setModuleBaseDir(baseDir.toPath()).build();
-    fileSystem.add(inputFile);
+    context.fileSystem().add(inputFile);
     sensor.execute(context);
   }
 
@@ -77,7 +73,7 @@ public class SymbolReferencesSensorTest {
     File symbol = new File(baseDir, "src/foo.xoo.symbol");
     FileUtils.write(symbol, "1:4,7\n12:15,23:33\n\n#comment");
     InputFile inputFile = new TestInputFileBuilder("foo", "src/foo.xoo").setLanguage("xoo").setModuleBaseDir(baseDir.toPath()).build();
-    fileSystem.add(inputFile);
+    context.fileSystem().add(inputFile);
     Symbolizable symbolizable = mock(Symbolizable.class);
     when(perspectives.as(Symbolizable.class, inputFile)).thenReturn(symbolizable);
     Symbolizable.SymbolTableBuilder symbolTableBuilder = mock(Symbolizable.SymbolTableBuilder.class);
index 2608f6d3bbc6c3482b21c95778a8615051b03fd1..04aa4980808a00bcc001031c2d8178c8ee3135b4 100644 (file)
@@ -55,10 +55,20 @@ public final class FileUtils {
    */
   public static void deleteDirectory(File directory) throws IOException {
     requireNonNull(directory, DIRECTORY_CAN_NOT_BE_NULL);
-
     deleteDirectoryImpl(directory.toPath());
   }
 
+  /**
+   * Deletes a directory recursively.
+   *
+   * @param directory  directory to delete
+   * @throws IOException in case deletion is unsuccessful
+   */
+  public static void deleteDirectory(Path directory) throws IOException {
+    requireNonNull(directory, DIRECTORY_CAN_NOT_BE_NULL);
+    deleteDirectoryImpl(directory);
+  }
+
   /**
    * Cleans a directory recursively.
    *
@@ -92,12 +102,31 @@ public final class FileUtils {
     if (file == null) {
       return false;
     }
+    return deleteQuietly(file.toPath());
+  }
+
+  /**
+   * Deletes a file, never throwing an exception. If file is a directory, delete it and all sub-directories.
+   * <p>
+   * The difference between File.delete() and this method are:
+   * <ul>
+   * <li>A directory to be deleted does not have to be empty.</li>
+   * <li>No exceptions are thrown when a file or directory cannot be deleted.</li>
+   * </ul>
+   *
+   * @param file  file or directory to delete, can be {@code null}
+   * @return {@code true} if the file or directory was deleted, otherwise {@code false}
+   */
+  public static boolean deleteQuietly(@Nullable Path path) {
+    if (path == null) {
+      return false;
+    }
 
     try {
-      if (file.isDirectory()) {
-        deleteDirectory(file);
+      if (Files.isDirectory(path)) {
+        deleteDirectory(path);
       } else {
-        Files.delete(file.toPath());
+        Files.delete(path);
       }
       return true;
     } catch (IOException | SecurityException ignored) {
index 38df109b40242e9b1fa282d75dc7305ca8488a88..a1054b47650f7898bae35804880d1308ae55d602 100644 (file)
@@ -124,7 +124,8 @@ public class FileUtilsTest {
 
   @Test
   public void deleteQuietly_does_not_fail_if_argument_is_null() {
-    FileUtils.deleteQuietly(null);
+    FileUtils.deleteQuietly((File) null);
+    FileUtils.deleteQuietly((Path) null);
   }
 
   @Test
@@ -178,7 +179,7 @@ public class FileUtilsTest {
   public void deleteDirectory_throws_NPE_if_argument_is_null() throws IOException {
     expectDirectoryCanNotBeNullNPE();
 
-    FileUtils.deleteDirectory(null);
+    FileUtils.deleteDirectory((File) null);
   }
 
   @Test
index f7d2858a7a30789f98bdb83e90c65238163decd7..a3922b5ee643946de2604299e07d251b2944ec8a 100644 (file)
@@ -24,7 +24,6 @@ import com.google.common.collect.SetMultimap;
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
-import java.nio.file.LinkOption;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -60,23 +59,18 @@ public class DefaultFileSystem implements FileSystem {
    * Only for testing
    */
   public DefaultFileSystem(Path baseDir) {
-    this(baseDir.toFile(), new MapCache());
+    this(baseDir, new MapCache());
   }
 
   /**
    * Only for testing
    */
   public DefaultFileSystem(File baseDir) {
-    this(baseDir, new MapCache());
+    this(baseDir.toPath(), new MapCache());
   }
 
-  protected DefaultFileSystem(@Nullable File baseDir, Cache cache) {
-    // Basedir can be null with views
-    try {
-      this.baseDir = baseDir != null ? baseDir.toPath().toRealPath(LinkOption.NOFOLLOW_LINKS) : new File(".").toPath().toAbsolutePath().normalize();
-    } catch (IOException e) {
-      throw new IllegalStateException(e);
-    }
+  protected DefaultFileSystem(Path baseDir, Cache cache) {
+    this.baseDir = baseDir;
     this.cache = cache;
     this.predicates = new DefaultFilePredicates(this.baseDir);
   }
@@ -90,22 +84,18 @@ public class DefaultFileSystem implements FileSystem {
     return baseDir.toFile();
   }
 
-  public DefaultFileSystem setEncoding(@Nullable Charset e) {
+  public DefaultFileSystem setEncoding(Charset e) {
     this.encoding = e;
     return this;
   }
 
   @Override
   public Charset encoding() {
-    return encoding == null ? Charset.defaultCharset() : encoding;
-  }
-
-  public boolean isDefaultJvmEncoding() {
-    return encoding == null;
+    return encoding;
   }
 
-  public DefaultFileSystem setWorkDir(File d) {
-    this.workDir = d.getAbsoluteFile().toPath().normalize();
+  public DefaultFileSystem setWorkDir(Path d) {
+    this.workDir = d;
     return this;
   }
 
@@ -150,13 +140,11 @@ public class DefaultFileSystem implements FileSystem {
    * Default predicate is used when some files/dirs should not be processed by sensors.
    */
   public Iterable<InputFile> inputFiles() {
-    doPreloadFiles();
     return OptimizedFilePredicateAdapter.create(predicates.all()).get(cache);
   }
 
   @Override
   public Iterable<InputFile> inputFiles(FilePredicate predicate) {
-    doPreloadFiles();
     Iterable<InputFile> iterable = OptimizedFilePredicateAdapter.create(predicate).get(cache);
     if (defaultPredicate != null) {
       return StreamSupport.stream(iterable.spliterator(), false)
@@ -172,7 +160,6 @@ public class DefaultFileSystem implements FileSystem {
 
   @Override
   public Iterable<File> files(FilePredicate predicate) {
-    doPreloadFiles();
     return () -> StreamSupport.stream(inputFiles(predicate).spliterator(), false)
       .map(InputFile::file)
       .iterator();
@@ -180,7 +167,6 @@ public class DefaultFileSystem implements FileSystem {
 
   @Override
   public InputDir inputDir(File dir) {
-    doPreloadFiles();
     String relativePath = PathUtils.sanitize(new PathResolver().relativePath(baseDir.toFile(), dir));
     if (relativePath == null) {
       return null;
@@ -200,7 +186,6 @@ public class DefaultFileSystem implements FileSystem {
 
   @Override
   public SortedSet<String> languages() {
-    doPreloadFiles();
     return cache.languages();
   }
 
@@ -209,13 +194,6 @@ public class DefaultFileSystem implements FileSystem {
     return predicates;
   }
 
-  /**
-   * This method is called before each search of files.
-   */
-  protected void doPreloadFiles() {
-    // nothing to do by default
-  }
-
   public abstract static class Cache implements Index {
 
     protected abstract void doAdd(InputFile inputFile);
index 1165e54d4945d068d7c9f646ded7ba9ef9ec1078..e5d8a5c060be5455bbc9e0b5f90d1d5cb939c88b 100644 (file)
 package org.sonar.api.batch.fs.internal;
 
 import java.io.File;
+import java.io.IOException;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import javax.annotation.CheckForNull;
 import javax.annotation.concurrent.Immutable;
-
+import org.apache.commons.io.FileUtils;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputModule;
 
@@ -37,8 +39,8 @@ import org.sonar.api.batch.fs.InputModule;
  */
 @Immutable
 public class DefaultInputModule extends DefaultInputComponent implements InputModule {
-  private final File baseDir;
-  private final File workDir;
+  private final Path baseDir;
+  private final Path workDir;
   private final String name;
   private final String version;
   private final String originalName;
@@ -53,13 +55,6 @@ public class DefaultInputModule extends DefaultInputComponent implements InputMo
   private final String moduleKey;
   private final ProjectDefinition definition;
 
-  /**
-   * For testing only!
-   */
-  public DefaultInputModule(String moduleKey) {
-    this(ProjectDefinition.create().setKey(moduleKey), TestInputFileBuilder.nextBatchId());
-  }
-  
   /**
    * For testing only!
    */
@@ -69,8 +64,8 @@ public class DefaultInputModule extends DefaultInputComponent implements InputMo
 
   public DefaultInputModule(ProjectDefinition definition, int batchId) {
     super(batchId);
-    this.baseDir = definition.getBaseDir();
-    this.workDir = definition.getWorkDir();
+    this.baseDir = initBaseDir(definition);
+    this.workDir = initWorkingDir(definition);
     this.name = definition.getName();
     this.originalName = definition.getOriginalName();
     this.version = definition.getVersion();
@@ -86,6 +81,26 @@ public class DefaultInputModule extends DefaultInputComponent implements InputMo
     this.moduleKey = definition.getKey();
   }
 
+  private static Path initBaseDir(ProjectDefinition module) {
+    Path result;
+    try {
+      result = module.getBaseDir().toPath().toRealPath(LinkOption.NOFOLLOW_LINKS);
+    } catch (IOException e) {
+      throw new IllegalStateException("Unable to resolve module baseDir", e);
+    }
+    return result;
+  }
+
+  private static Path initWorkingDir(ProjectDefinition module) {
+    File workingDirAsFile = module.getWorkDir();
+    try {
+      FileUtils.forceMkdir(workingDirAsFile);
+    } catch (Exception e) {
+      throw new IllegalStateException("Fail to create working dir: " + workingDirAsFile.getAbsolutePath(), e);
+    }
+    return workingDirAsFile.getAbsoluteFile().toPath().normalize();
+  }
+
   /**
    * Module key without branch
    */
@@ -102,12 +117,12 @@ public class DefaultInputModule extends DefaultInputComponent implements InputMo
   public ProjectDefinition definition() {
     return definition;
   }
-  
-  public File getBaseDir() {
+
+  public Path getBaseDir() {
     return baseDir;
   }
 
-  public File getWorkDir() {
+  public Path getWorkDir() {
     return workDir;
   }
 
index fa86a9e17e6864d740dc4e18f7d5b9763065fd20..c06e1ec4c307b32c8fba617a53c6caf6bee54089 100644 (file)
@@ -26,9 +26,7 @@ import java.nio.charset.Charset;
 import java.nio.file.LinkOption;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-
 import javax.annotation.Nullable;
-
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.utils.PathUtils;
@@ -205,7 +203,7 @@ public class TestInputFileBuilder {
   }
 
   public static DefaultInputModule newDefaultInputModule(String moduleKey, File baseDir) {
-    ProjectDefinition definition = ProjectDefinition.create().setKey(moduleKey).setBaseDir(baseDir);
+    ProjectDefinition definition = ProjectDefinition.create().setKey(moduleKey).setBaseDir(baseDir).setWorkDir(new File(baseDir, ".sonar"));
     return newDefaultInputModule(definition);
   }
 
index 711821e7909be688e12a53dc8f4fa4b23174f127..edfa364511223500e8d6548a39c880342114b5b6 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.api.batch.sensor.internal;
 
 import java.io.File;
 import java.io.Serializable;
+import java.nio.charset.Charset;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -34,6 +35,7 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 import org.sonar.api.SonarQubeSide;
 import org.sonar.api.SonarRuntime;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.InputModule;
 import org.sonar.api.batch.fs.TextRange;
@@ -104,10 +106,10 @@ public class SensorContextTester implements SensorContext {
 
   private SensorContextTester(Path moduleBaseDir) {
     this.settings = new MapSettings();
-    this.fs = new DefaultFileSystem(moduleBaseDir);
+    this.fs = new DefaultFileSystem(moduleBaseDir).setEncoding(Charset.defaultCharset());
     this.activeRules = new ActiveRulesBuilder().build();
     this.sensorStorage = new InMemorySensorStorage();
-    this.module = new DefaultInputModule("projectKey");
+    this.module = new DefaultInputModule(ProjectDefinition.create().setKey("projectKey").setBaseDir(moduleBaseDir.toFile()).setWorkDir(moduleBaseDir.resolve(".sonar").toFile()));
     this.runtime = SonarRuntimeImpl.forSonarQube(ApiVersion.load(System2.INSTANCE), SonarQubeSide.SCANNER);
   }
 
index 17698835e8e4bcf6fa038e6f4e931422efcb40e9..692fd5427daa38a4b7b725a671727ed160f0537e 100644 (file)
@@ -26,7 +26,6 @@ import java.util.Collection;
 import java.util.List;
 import javax.annotation.CheckForNull;
 import javax.annotation.concurrent.Immutable;
-
 import org.apache.commons.io.FilenameUtils;
 import org.sonar.api.batch.ScannerSide;
 import org.sonar.api.utils.PathUtils;
@@ -40,7 +39,10 @@ import static java.util.stream.Collectors.joining;
 @Immutable
 public class PathResolver {
 
-  public File relativeFile(File dir, String path) {
+  /**
+   * Static since 6.6
+   */
+  public static File relativeFile(File dir, String path) {
     return dir.toPath().resolve(path).normalize().toFile();
   }
 
@@ -77,10 +79,11 @@ public class PathResolver {
    *   <li>null is returned if file is not a child of dir
    *   <li>the resulting path is converted to use Unix separators
    *   </ul> 
+   *   Static since 6.6
    * @since 6.0
    */
   @CheckForNull
-  public String relativePath(Path dir, Path file) {
+  public static String relativePath(Path dir, Path file) {
     Path baseDir = dir.normalize();
     Path path = file.normalize();
     if (!path.startsWith(baseDir)) {
index 1fcc28e032222e046568efd8ab4bd704ab67c178..d3ba5dbbf8633a6b436113cc92a203da1d0c60e6 100644 (file)
  */
 package org.sonar.api.batch.fs.internal;
 
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.Iterator;
 import org.junit.Before;
 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 java.util.Iterator;
-
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class DefaultFileSystemTest {
@@ -55,19 +54,15 @@ public class DefaultFileSystemTest {
     assertThat(fs.baseDir().getCanonicalPath()).isEqualTo(basedir.getCanonicalPath());
 
     File workdir = temp.newFolder();
-    fs.setWorkDir(workdir);
+    fs.setWorkDir(workdir.toPath());
     assertThat(fs.workDir()).isAbsolute().isDirectory().exists();
     assertThat(fs.workDir().getCanonicalPath()).isEqualTo(workdir.getCanonicalPath());
   }
 
   @Test
   public void test_encoding() throws Exception {
-    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
index 34fe36b38a00288a3758c885c6cec388433b8309..bb67cdc92d8e0374d70db16d0960800b6c4ee381 100644 (file)
  */
 package org.sonar.api.batch.fs.internal;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import java.io.File;
+import java.io.IOException;
 import java.util.Collections;
-
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 public class DefaultInputModuleTest {
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   @Test
-  public void testGetters() {
+  public void testGetters() throws IOException {
     ProjectDefinition def = ProjectDefinition.create();
     def.setKey("projectKey");
     def.setName("projectName");
-    def.setBaseDir(new File("baseDir"));
+    File baseDir = temp.newFolder();
+    def.setBaseDir(baseDir);
     def.setVersion("version");
     def.setDescription("desc");
-    def.setWorkDir(new File("workDir"));
+    File workDir = temp.newFolder();
+    def.setWorkDir(workDir);
     def.setSources("file1");
     def.setTests("test1");
     DefaultInputModule module = new DefaultInputModule(def);
@@ -47,12 +54,12 @@ public class DefaultInputModuleTest {
     assertThat(module.getOriginalName()).isEqualTo("projectName");
     assertThat(module.definition()).isEqualTo(def);
     assertThat(module.getBranch()).isNull();
-    assertThat(module.getBaseDir()).isEqualTo(new File("baseDir"));
+    assertThat(module.getBaseDir()).isEqualTo(baseDir.toPath());
     assertThat(module.getKeyWithBranch()).isEqualTo("projectKey");
     assertThat(module.getVersion()).isEqualTo("version");
     assertThat(module.getOriginalVersion()).isEqualTo("version");
     assertThat(module.getDescription()).isEqualTo("desc");
-    assertThat(module.getWorkDir()).isEqualTo(new File("workDir"));
+    assertThat(module.getWorkDir()).isEqualTo(workDir.toPath());
     assertThat(module.sources()).isEqualTo(Collections.singletonList("file1"));
     assertThat(module.tests()).isEqualTo(Collections.singletonList("test1"));
 
index 6f12bf92ccbca1285014f318b5041655af7d879e..b6dc6a38d65570f3357a2b2608b9dca501e5add1 100644 (file)
  */
 package org.sonar.api.batch.fs.internal;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-
 import org.apache.commons.io.IOUtils;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.fs.InputFile.Status;
 import org.sonar.api.batch.fs.InputFile.Type;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 public class TestInputFileBuilderTest {
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   @Test
   public void setContent() throws IOException {
     DefaultInputFile file = TestInputFileBuilder.create("module", "invalidPath")
@@ -59,9 +63,10 @@ public class TestInputFileBuilderTest {
   }
 
   @Test
-  public void testCreateInputModule() {
-    DefaultInputModule module = TestInputFileBuilder.newDefaultInputModule("key", new File("baseDir"));
+  public void testCreateInputModule() throws IOException {
+    File baseDir = temp.newFolder();
+    DefaultInputModule module = TestInputFileBuilder.newDefaultInputModule("key", baseDir);
     assertThat(module.key()).isEqualTo("key");
-    assertThat(module.getBaseDir()).isEqualTo(new File("baseDir"));
+    assertThat(module.getBaseDir()).isEqualTo(baseDir.toPath());
   }
 }
index 566facb4a1afef09de92e07511bce01a04cec567..7f801cd641b7164ab00cc5221d642057fffb7537 100644 (file)
 package org.sonar.api.batch.sensor.internal;
 
 import java.io.File;
+import java.io.IOException;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultFileSystem;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
@@ -124,7 +126,7 @@ public class SensorContextTesterTest {
   }
 
   @Test
-  public void testMeasures() {
+  public void testMeasures() throws IOException {
     assertThat(tester.measures("foo:src/Foo.java")).isEmpty();
     assertThat(tester.measure("foo:src/Foo.java", "ncloc")).isNull();
     tester.<Integer>newMeasure()
@@ -143,7 +145,7 @@ public class SensorContextTesterTest {
     assertThat(tester.measure("foo:src/Foo.java", "ncloc")).isNotNull();
     assertThat(tester.measure("foo:src/Foo.java", "lines")).isNotNull();
     tester.<Integer>newMeasure()
-      .on(new DefaultInputModule("foo"))
+      .on(new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())))
       .forMetric(CoreMetrics.DIRECTORIES)
       .withValue(4)
       .save();
index c88e06b0b48cb828e0cb7d4bffe639adfc64df19..30e35f36a28016e682fdc58078440d6799f87c97 100644 (file)
  */
 package org.sonar.api.batch.sensor.issue.internal;
 
+import java.io.IOException;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputDir;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
@@ -34,6 +38,9 @@ import static org.mockito.Mockito.verify;
 
 public class DefaultIssueTest {
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   private DefaultInputFile inputFile = new TestInputFileBuilder("foo", "src/Foo.php")
     .initMetadata("Foo\nBar\n")
     .build();
@@ -82,16 +89,17 @@ public class DefaultIssueTest {
   }
 
   @Test
-  public void build_project_issue() {
+  public void build_project_issue() throws IOException {
     SensorStorage storage = mock(SensorStorage.class);
+    DefaultInputModule inputModule = new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     DefaultIssue issue = new DefaultIssue(storage)
       .at(new DefaultIssueLocation()
-        .on(new DefaultInputModule("foo"))
+        .on(inputModule)
         .message("Wrong way!"))
       .forRule(RuleKey.of("repo", "rule"))
       .effortToFix(10.0);
 
-    assertThat(issue.primaryLocation().inputComponent()).isEqualTo(new DefaultInputModule("foo"));
+    assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputModule);
     assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("repo", "rule"));
     assertThat(issue.primaryLocation().textRange()).isNull();
     assertThat(issue.effortToFix()).isEqualTo(10.0);
index 3419141324ad651b78cfe59785928b3951e6678e..afa9490368e6001242dc481bb9e0fd244a80c01a 100644 (file)
  */
 package org.sonar.api.batch.sensor.measure.internal;
 
+import java.io.IOException;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.sonar.api.batch.fs.internal.DefaultInputFile;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
 import org.sonar.api.batch.sensor.internal.SensorStorage;
@@ -37,6 +39,9 @@ public class DefaultMeasureTest {
   @Rule
   public ExpectedException thrown = ExpectedException.none();
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   @Test
   public void build_file_measure() {
     SensorStorage storage = mock(SensorStorage.class);
@@ -55,15 +60,15 @@ public class DefaultMeasureTest {
   }
 
   @Test
-  public void build_project_measure() {
+  public void build_project_measure() throws IOException {
     SensorStorage storage = mock(SensorStorage.class);
-    DefaultInputModule module = new DefaultInputModule("foo");
+    DefaultInputModule module = new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     DefaultMeasure<Integer> newMeasure = new DefaultMeasure<Integer>(storage)
       .forMetric(CoreMetrics.LINES)
       .on(module)
       .withValue(3);
 
-    assertThat(newMeasure.inputComponent()).isEqualTo(new DefaultInputModule("foo"));
+    assertThat(newMeasure.inputComponent()).isEqualTo(module);
     assertThat(newMeasure.metric()).isEqualTo(CoreMetrics.LINES);
     assertThat(newMeasure.value()).isEqualTo(3);
 
@@ -73,11 +78,11 @@ public class DefaultMeasureTest {
   }
 
   @Test
-  public void not_allowed_to_call_on_twice() {
+  public void not_allowed_to_call_on_twice() throws IOException {
     thrown.expect(IllegalStateException.class);
     thrown.expectMessage("on() already called");
     new DefaultMeasure<Integer>()
-      .on(new DefaultInputModule("foo"))
+      .on(new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())))
       .on(new TestInputFileBuilder("foo", "src/Foo.php").build())
       .withValue(3)
       .save();
index 1c0ec317ad74759af9bf48de1d4aeb1119246cc1..6114108cc26f78b0890ae49f8ce76adad7308524 100644 (file)
@@ -22,7 +22,6 @@ package org.sonar.scanner.analysis;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-
 import org.picocontainer.ComponentLifecycle;
 import org.picocontainer.PicoContainer;
 import org.picocontainer.injectors.ProviderAdapter;
@@ -37,7 +36,7 @@ public class AnalysisTempFolderProvider extends ProviderAdapter implements Compo
 
   public TempFolder provide(InputModuleHierarchy moduleHierarchy) {
     if (projectTempFolder == null) {
-      Path workingDir = moduleHierarchy.root().getWorkDir().toPath();
+      Path workingDir = moduleHierarchy.root().getWorkDir();
       Path tempDir = workingDir.normalize().resolve(TMP_NAME);
       try {
         Files.deleteIfExists(tempDir);
index 8dffa1f7015f931798dc5458cfbae02b45d00391..02bf0524150e0cfc0b8fea9a1b85bd4af75e7225 100644 (file)
@@ -65,7 +65,7 @@ public class IssueTransition {
       localIssueTracking.init();
     }
 
-    ScannerReportReader reader = new ScannerReportReader(reportPublisher.getReportDir());
+    ScannerReportReader reader = new ScannerReportReader(reportPublisher.getReportDir().toFile());
     int nbComponents = inputComponentStore.all().size();
 
     if (nbComponents == 0) {
index e5f17cbb4431919157f19b2dc5ed8e499a3351b1..d9f1e193a78b95868a2702ac573f63af9102f8b4 100644 (file)
@@ -73,7 +73,7 @@ public class TaskResult implements org.sonar.scanner.mediumtest.ScanTaskObserver
     }
 
     ReportPublisher reportPublisher = container.getComponentByType(ReportPublisher.class);
-    reader = new ScannerReportReader(reportPublisher.getReportDir());
+    reader = new ScannerReportReader(reportPublisher.getReportDir().toFile());
     if (!container.getComponentByType(AnalysisMode.class).isIssues()) {
       Metadata readMetadata = getReportReader().readMetadata();
       int rootComponentRef = readMetadata.getRootComponentRef();
index e4e5c81356e12995dc35e9b8d339eab22b7349da..c759111ae381a25b9668f70fa25da7c6f720c89e 100644 (file)
@@ -28,7 +28,7 @@ import org.sonar.scanner.events.EventBus;
 import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader;
 import org.sonar.scanner.rule.QProfileVerifier;
 import org.sonar.scanner.scan.filesystem.DefaultModuleFileSystem;
-import org.sonar.scanner.scan.filesystem.FileSystemLogger;
+import org.sonar.scanner.scan.filesystem.FileIndexer;
 
 public abstract class AbstractPhaseExecutor {
 
@@ -37,25 +37,25 @@ public abstract class AbstractPhaseExecutor {
   private final InitializersExecutor initializersExecutor;
   private final SensorsExecutor sensorsExecutor;
   private final SensorContext sensorContext;
-  private final FileSystemLogger fsLogger;
   private final DefaultModuleFileSystem fs;
   private final QProfileVerifier profileVerifier;
   private final IssueExclusionsLoader issueExclusionsLoader;
   private final InputModuleHierarchy hierarchy;
+  private final FileIndexer fileIndexer;
 
   public AbstractPhaseExecutor(InitializersExecutor initializersExecutor, PostJobsExecutor postJobsExecutor, SensorsExecutor sensorsExecutor,
-    SensorContext sensorContext, InputModuleHierarchy hierarchy, EventBus eventBus, FileSystemLogger fsLogger, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier,
-    IssueExclusionsLoader issueExclusionsLoader) {
+    SensorContext sensorContext, InputModuleHierarchy hierarchy, EventBus eventBus, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier,
+    IssueExclusionsLoader issueExclusionsLoader, FileIndexer fileIndexer) {
     this.postJobsExecutor = postJobsExecutor;
     this.initializersExecutor = initializersExecutor;
     this.sensorsExecutor = sensorsExecutor;
     this.sensorContext = sensorContext;
     this.eventBus = eventBus;
-    this.fsLogger = fsLogger;
     this.fs = fs;
     this.profileVerifier = profileVerifier;
     this.issueExclusionsLoader = issueExclusionsLoader;
     this.hierarchy = hierarchy;
+    this.fileIndexer = fileIndexer;
   }
 
   /**
@@ -107,12 +107,11 @@ public abstract class AbstractPhaseExecutor {
   private void indexFs() {
     String stepName = "Index filesystem";
     eventBus.fireEvent(new BatchStepEvent(stepName, true));
-    fs.index();
+    fileIndexer.index();
     eventBus.fireEvent(new BatchStepEvent(stepName, false));
   }
 
   private void executeInitializersPhase() {
     initializersExecutor.execute();
-    fsLogger.log();
   }
 }
index b82ca8961a719bbe91ccdff084a60ff3798c1012..50ef68ab33f1e9da449b5e754f21ec8deeea0eb6 100644 (file)
@@ -29,7 +29,7 @@ import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader;
 import org.sonar.scanner.issue.tracking.IssueTransition;
 import org.sonar.scanner.rule.QProfileVerifier;
 import org.sonar.scanner.scan.filesystem.DefaultModuleFileSystem;
-import org.sonar.scanner.scan.filesystem.FileSystemLogger;
+import org.sonar.scanner.scan.filesystem.FileIndexer;
 import org.sonar.scanner.scan.report.IssuesReports;
 
 public final class IssuesPhaseExecutor extends AbstractPhaseExecutor {
@@ -41,9 +41,9 @@ public final class IssuesPhaseExecutor extends AbstractPhaseExecutor {
   private final IssueTransition localIssueTracking;
 
   public IssuesPhaseExecutor(InitializersExecutor initializersExecutor, PostJobsExecutor postJobsExecutor, SensorsExecutor sensorsExecutor, SensorContext sensorContext,
-    EventBus eventBus, FileSystemLogger fsLogger, IssuesReports jsonReport, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier,
-    IssueExclusionsLoader issueExclusionsLoader, IssueTransition localIssueTracking, InputModuleHierarchy moduleHierarchy) {
-    super(initializersExecutor, postJobsExecutor, sensorsExecutor, sensorContext, moduleHierarchy, eventBus, fsLogger, fs, profileVerifier, issueExclusionsLoader);
+    EventBus eventBus, IssuesReports jsonReport, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier,
+    IssueExclusionsLoader issueExclusionsLoader, IssueTransition localIssueTracking, InputModuleHierarchy moduleHierarchy, FileIndexer fileIndexer) {
+    super(initializersExecutor, postJobsExecutor, sensorsExecutor, sensorContext, moduleHierarchy, eventBus, fs, profileVerifier, issueExclusionsLoader, fileIndexer);
     this.eventBus = eventBus;
     this.issuesReport = jsonReport;
     this.localIssueTracking = localIssueTracking;
index 84ff4b4d4bc3e2267f9ea606ca31b4323529e21f..e0c22ad936eb2d5eb1d0b1167578b73ef5b1aebe 100644 (file)
@@ -28,7 +28,7 @@ import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader;
 import org.sonar.scanner.report.ReportPublisher;
 import org.sonar.scanner.rule.QProfileVerifier;
 import org.sonar.scanner.scan.filesystem.DefaultModuleFileSystem;
-import org.sonar.scanner.scan.filesystem.FileSystemLogger;
+import org.sonar.scanner.scan.filesystem.FileIndexer;
 import org.sonar.scanner.scm.ScmPublisher;
 
 public final class PublishPhaseExecutor extends AbstractPhaseExecutor {
@@ -39,9 +39,9 @@ public final class PublishPhaseExecutor extends AbstractPhaseExecutor {
   private final ScmPublisher scm;
 
   public PublishPhaseExecutor(InitializersExecutor initializersExecutor, PostJobsExecutor postJobsExecutor, SensorsExecutor sensorsExecutor, SensorContext sensorContext,
-    EventBus eventBus, ReportPublisher reportPublisher, FileSystemLogger fsLogger, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier, 
-    IssueExclusionsLoader issueExclusionsLoader, CpdExecutor cpdExecutor, ScmPublisher scm, InputModuleHierarchy hierarchy) {
-    super(initializersExecutor, postJobsExecutor, sensorsExecutor, sensorContext, hierarchy, eventBus, fsLogger, fs, profileVerifier, issueExclusionsLoader);
+    EventBus eventBus, ReportPublisher reportPublisher, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier,
+    IssueExclusionsLoader issueExclusionsLoader, CpdExecutor cpdExecutor, ScmPublisher scm, InputModuleHierarchy hierarchy, FileIndexer fileIndexer) {
+    super(initializersExecutor, postJobsExecutor, sensorsExecutor, sensorContext, hierarchy, eventBus, fs, profileVerifier, issueExclusionsLoader, fileIndexer);
     this.eventBus = eventBus;
     this.reportPublisher = reportPublisher;
     this.cpdExecutor = cpdExecutor;
index a909a9a4acaf3791133e9a55f288546deb9de154..84eeab591f422dad22190373c202a26c5f4736a0 100644 (file)
@@ -74,7 +74,7 @@ public class ReportPublisher implements Startable {
   private final ReportPublisherStep[] publishers;
   private final Server server;
 
-  private File reportDir;
+  private Path reportDir;
   private ScannerReportWriter writer;
 
   public ReportPublisher(Configuration settings, ScannerWsClient wsClient, Server server, AnalysisContextReportPublisher contextPublisher,
@@ -91,8 +91,8 @@ public class ReportPublisher implements Startable {
 
   @Override
   public void start() {
-    reportDir = new File(moduleHierarchy.root().getWorkDir(), "scanner-report");
-    writer = new ScannerReportWriter(reportDir);
+    reportDir = moduleHierarchy.root().getWorkDir().resolve("scanner-report");
+    writer = new ScannerReportWriter(reportDir.toFile());
     contextPublisher.init(writer);
 
     if (!analysisMode.isIssues() && !analysisMode.isMediumTest()) {
@@ -110,7 +110,7 @@ public class ReportPublisher implements Startable {
     }
   }
 
-  public File getReportDir() {
+  public Path getReportDir() {
     return reportDir;
   }
 
@@ -144,11 +144,11 @@ public class ReportPublisher implements Startable {
         publisher.publish(writer);
       }
       long stopTime = System.currentTimeMillis();
-      LOG.info("Analysis report generated in {}ms, dir size={}", stopTime - startTime, FileUtils.byteCountToDisplaySize(FileUtils.sizeOfDirectory(reportDir)));
+      LOG.info("Analysis report generated in {}ms, dir size={}", stopTime - startTime, FileUtils.byteCountToDisplaySize(FileUtils.sizeOfDirectory(reportDir.toFile())));
 
       startTime = System.currentTimeMillis();
-      File reportZip = temp.newFile("batch-report", ".zip");
-      ZipUtils.zipDir(reportDir, reportZip);
+      File reportZip = temp.newFile("scanner-report", ".zip");
+      ZipUtils.zipDir(reportDir.toFile(), reportZip);
       stopTime = System.currentTimeMillis();
       LOG.info("Analysis reports compressed in {}ms, zip size={}", stopTime - startTime, FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(reportZip)));
       return reportZip;
@@ -228,7 +228,7 @@ public class ReportPublisher implements Startable {
   }
 
   private void dumpMetadata(Map<String, String> metadata) {
-    Path file = moduleHierarchy.root().getWorkDir().toPath().resolve(METADATA_DUMP_FILENAME);
+    Path file = moduleHierarchy.root().getWorkDir().resolve(METADATA_DUMP_FILENAME);
     try (Writer output = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
       for (Map.Entry<String, String> entry : metadata.entrySet()) {
         output.write(entry.getKey());
index 4cf6dcbcab8385457efbeb24ec9d65bd36970b05..46ae0a0e28c533b49035995c4f895e56311554e6 100644 (file)
  */
 package org.sonar.scanner.scan;
 
+import com.google.common.collect.ImmutableMultimap;
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.annotation.CheckForNull;
 import javax.annotation.concurrent.Immutable;
-
 import org.sonar.api.batch.fs.InputModule;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
 import org.sonar.api.scan.filesystem.PathResolver;
 
-import com.google.common.collect.ImmutableMultimap;
-
 @Immutable
 public class DefaultInputModuleHierarchy implements InputModuleHierarchy {
   private final PathResolver pathResolver = new PathResolver();
@@ -111,8 +108,8 @@ public class DefaultInputModuleHierarchy implements InputModuleHierarchy {
       return null;
     }
     DefaultInputModule inputModule = (DefaultInputModule) module;
-    Path parentBaseDir = parent.getBaseDir().toPath();
-    Path moduleBaseDir = inputModule.getBaseDir().toPath();
+    Path parentBaseDir = parent.getBaseDir();
+    Path moduleBaseDir = inputModule.getBaseDir();
 
     return pathResolver.relativePath(parentBaseDir, moduleBaseDir);
   }
index dbb3862d8319a6923538bd0df958970f1229b1e8..d43666bf93f4dcac98e6797aa66de9f4a1231a8d 100644 (file)
@@ -60,7 +60,6 @@ import org.sonar.scanner.rule.RulesProfileProvider;
 import org.sonar.scanner.scan.filesystem.DefaultModuleFileSystem;
 import org.sonar.scanner.scan.filesystem.ExclusionFilters;
 import org.sonar.scanner.scan.filesystem.FileIndexer;
-import org.sonar.scanner.scan.filesystem.FileSystemLogger;
 import org.sonar.scanner.scan.filesystem.InputFileBuilder;
 import org.sonar.scanner.scan.filesystem.LanguageDetection;
 import org.sonar.scanner.scan.filesystem.MetadataGeneratorProvider;
@@ -124,7 +123,6 @@ public class ModuleScanContainer extends ComponentContainer {
       LanguageDetection.class,
       FileIndexer.class,
       InputFileBuilder.class,
-      FileSystemLogger.class,
       DefaultModuleFileSystem.class,
       ModuleFileSystemInitializer.class,
       QProfileVerifier.class,
index d8af158590dc9a171bf553ae734e0aefbd666700..ff9265a7f595808ad2612392c2ebfe97ed830020 100644 (file)
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.nio.channels.OverlappingFileLockException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-
 import org.picocontainer.Startable;
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
 import org.sonar.home.cache.DirectoryLock;
@@ -33,7 +32,7 @@ public class ProjectLock implements Startable {
   private final DirectoryLock lock;
 
   public ProjectLock(InputModuleHierarchy moduleHierarchy) {
-    Path directory = moduleHierarchy.root().getWorkDir().toPath();
+    Path directory = moduleHierarchy.root().getWorkDir();
     try {
       if (!directory.toFile().exists()) {
         Files.createDirectories(directory);
@@ -43,7 +42,7 @@ public class ProjectLock implements Startable {
     }
     this.lock = new DirectoryLock(directory.toAbsolutePath(), new Slf4jLogger());
   }
-  
+
   public void tryLock() {
     try {
       if (!lock.tryLock()) {
index 277b230fd88973d3eccc24a80cc422ac275c576b..83a9e8650f34ef85c5a6e38205a8af263838f814 100644 (file)
@@ -24,7 +24,6 @@ import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Iterator;
-
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
 import org.sonar.core.util.FileUtils;
 import org.sonar.home.cache.DirectoryLock;
@@ -33,7 +32,7 @@ public class WorkDirectoryCleaner {
   private final Path workDir;
 
   public WorkDirectoryCleaner(InputModuleHierarchy moduleHierarchy) {
-    workDir = moduleHierarchy.root().getWorkDir().toPath();
+    workDir = moduleHierarchy.root().getWorkDir();
   }
 
   public void execute() {
index e01e5202401a8c364adb141fef0536a6207247af..c2eed43a10887afedcce9f925175215407aac044 100644 (file)
 package org.sonar.scanner.scan.filesystem;
 
 import com.google.common.annotations.VisibleForTesting;
-import java.io.File;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.lang.StringUtils;
-import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.fs.internal.DefaultFileSystem;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
-import org.sonar.api.config.Configuration;
-import org.sonar.api.utils.MessageException;
 import org.sonar.scanner.analysis.DefaultAnalysisMode;
 import org.sonar.scanner.repository.ProjectRepositories;
 
-/**
- * @since 3.5
- */
 public class DefaultModuleFileSystem extends DefaultFileSystem {
 
-  private String moduleKey;
-  private FileIndexer indexer;
-  private Configuration settings;
-
-  private List<File> sourceDirsOrFiles = new ArrayList<>();
-  private List<File> testDirsOrFiles = new ArrayList<>();
-  private boolean initialized;
-  private Charset charset = null;
-
-  public DefaultModuleFileSystem(ModuleInputComponentStore moduleInputFileCache, DefaultInputModule module,
-    Configuration settings, FileIndexer indexer, ModuleFileSystemInitializer initializer, DefaultAnalysisMode mode,
+  public DefaultModuleFileSystem(ModuleInputComponentStore moduleInputFileCache, DefaultInputModule module, ModuleFileSystemInitializer initializer, DefaultAnalysisMode mode,
     ProjectRepositories projectRepositories) {
-    super(initializer.baseDir(), moduleInputFileCache);
-    setFields(module, settings, indexer, initializer, mode, projectRepositories);
+    super(module.getBaseDir(), moduleInputFileCache);
+    setFields(module, initializer, mode, projectRepositories);
   }
 
   @VisibleForTesting
-  public DefaultModuleFileSystem(DefaultInputModule module,
-    Configuration settings, FileIndexer indexer, ModuleFileSystemInitializer initializer, DefaultAnalysisMode mode,
-    ProjectRepositories projectRepositories) {
-    super(initializer.baseDir().toPath());
-    setFields(module, settings, indexer, initializer, mode, projectRepositories);
+  public DefaultModuleFileSystem(DefaultInputModule module, ModuleFileSystemInitializer initializer, DefaultAnalysisMode mode, ProjectRepositories projectRepositories) {
+    super(module.getBaseDir());
+    setFields(module, initializer, mode, projectRepositories);
   }
 
-  private void setFields(DefaultInputModule module,
-    Configuration settings, FileIndexer indexer, ModuleFileSystemInitializer initializer, DefaultAnalysisMode mode,
-    ProjectRepositories projectRepositories) {
-    this.moduleKey = module.key();
-    this.settings = settings;
-    this.indexer = indexer;
-    setWorkDir(initializer.workingDir());
-    this.sourceDirsOrFiles = initializer.sources();
-    this.testDirsOrFiles = initializer.tests();
+  private void setFields(DefaultInputModule module, ModuleFileSystemInitializer initializer, DefaultAnalysisMode mode, ProjectRepositories projectRepositories) {
+    setWorkDir(module.getWorkDir());
+    setEncoding(initializer.defaultEncoding());
 
     // filter the files sensors have access to
     if (!mode.scanAllFiles()) {
@@ -78,69 +49,4 @@ public class DefaultModuleFileSystem extends DefaultFileSystem {
     }
   }
 
-  public boolean isInitialized() {
-    return initialized;
-  }
-
-  public String moduleKey() {
-    return moduleKey;
-  }
-
-  public List<File> sources() {
-    return sourceDirsOrFiles;
-  }
-
-  public List<File> tests() {
-    return testDirsOrFiles;
-  }
-
-  @Override
-  public Charset encoding() {
-    if (charset == null) {
-      String encoding = settings.get(CoreProperties.ENCODING_PROPERTY).orElse(null);
-      if (StringUtils.isNotEmpty(encoding)) {
-        charset = Charset.forName(StringUtils.trim(encoding));
-      } else {
-        charset = Charset.defaultCharset();
-      }
-    }
-    return charset;
-  }
-
-  @Override
-  public boolean isDefaultJvmEncoding() {
-    return !settings.hasKey(CoreProperties.ENCODING_PROPERTY);
-  }
-
-  @Override
-  protected void doPreloadFiles() {
-    if (!initialized) {
-      throw MessageException.of("Accessing the filesystem before the Sensor phase is not supported. Please update your plugin.");
-    }
-  }
-
-  public void index() {
-    if (initialized) {
-      throw MessageException.of("Module filesystem can only be indexed once");
-    }
-    initialized = true;
-    indexer.index(this);
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    DefaultModuleFileSystem that = (DefaultModuleFileSystem) o;
-    return moduleKey.equals(that.moduleKey);
-  }
-
-  @Override
-  public int hashCode() {
-    return moduleKey.hashCode();
-  }
 }
index 3af3741e987b61f229d645ddd238d6393b742a88..6e00933fbd51a75ac70d59b38fa8678594e1b451 100644 (file)
@@ -20,7 +20,6 @@
 package org.sonar.scanner.scan.filesystem;
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.FileSystemLoopException;
 import java.nio.file.FileVisitOption;
@@ -70,29 +69,34 @@ public class FileIndexer {
   private final DefaultInputModule module;
   private final BatchIdGenerator batchIdGenerator;
   private final InputComponentStore componentStore;
+  private final ModuleFileSystemInitializer moduleFileSystemInitializer;
   private ExecutorService executorService;
   private final List<Future<Void>> tasks;
+  private final DefaultModuleFileSystem defaultModuleFileSystem;
 
   private ProgressReport progressReport;
 
   public FileIndexer(BatchIdGenerator batchIdGenerator, InputComponentStore componentStore, DefaultInputModule module, ExclusionFilters exclusionFilters,
-    DefaultComponentTree componentTree, InputFileBuilder inputFileBuilder, InputFileFilter[] filters) {
+    DefaultComponentTree componentTree, InputFileBuilder inputFileBuilder, ModuleFileSystemInitializer initializer, DefaultModuleFileSystem defaultModuleFileSystem,
+    InputFileFilter[] filters) {
     this.batchIdGenerator = batchIdGenerator;
     this.componentStore = componentStore;
     this.module = module;
     this.componentTree = componentTree;
     this.inputFileBuilder = inputFileBuilder;
+    this.moduleFileSystemInitializer = initializer;
+    this.defaultModuleFileSystem = defaultModuleFileSystem;
     this.filters = filters;
     this.exclusionFilters = exclusionFilters;
     this.tasks = new ArrayList<>();
   }
 
   public FileIndexer(BatchIdGenerator batchIdGenerator, InputComponentStore componentStore, DefaultInputModule module, ExclusionFilters exclusionFilters,
-    DefaultComponentTree componentTree, InputFileBuilder inputFileBuilder) {
-    this(batchIdGenerator, componentStore, module, exclusionFilters, componentTree, inputFileBuilder, new InputFileFilter[0]);
+    DefaultComponentTree componentTree, InputFileBuilder inputFileBuilder, ModuleFileSystemInitializer initializer, DefaultModuleFileSystem defaultModuleFileSystem) {
+    this(batchIdGenerator, componentStore, module, exclusionFilters, componentTree, inputFileBuilder, initializer, defaultModuleFileSystem, new InputFileFilter[0]);
   }
 
-  void index(DefaultModuleFileSystem fileSystem) {
+  public void index() {
     int threads = Math.max(1, Runtime.getRuntime().availableProcessors() - 1);
     this.executorService = Executors.newFixedThreadPool(threads, new ThreadFactoryBuilder().setNameFormat("FileIndexer-%d").build());
 
@@ -102,8 +106,8 @@ public class FileIndexer {
 
     Progress progress = new Progress();
 
-    indexFiles(fileSystem, progress, fileSystem.sources(), InputFile.Type.MAIN);
-    indexFiles(fileSystem, progress, fileSystem.tests(), InputFile.Type.TEST);
+    indexFiles(moduleFileSystemInitializer.sources(), InputFile.Type.MAIN, progress);
+    indexFiles(moduleFileSystemInitializer.tests(), InputFile.Type.TEST, progress);
 
     waitForTasksToComplete();
 
@@ -132,13 +136,13 @@ public class FileIndexer {
     return count == 1 ? "file" : "files";
   }
 
-  private void indexFiles(DefaultModuleFileSystem fileSystem, Progress progress, List<File> sources, InputFile.Type type) {
+  private void indexFiles(List<Path> sources, InputFile.Type type, Progress progress) {
     try {
-      for (File dirOrFile : sources) {
-        if (dirOrFile.isDirectory()) {
-          indexDirectory(fileSystem, progress, dirOrFile.toPath(), type);
+      for (Path dirOrFile : sources) {
+        if (dirOrFile.toFile().isDirectory()) {
+          indexDirectory(dirOrFile, type, progress);
         } else {
-          tasks.add(executorService.submit(() -> indexFile(fileSystem, progress, dirOrFile.toPath(), type)));
+          tasks.add(executorService.submit(() -> indexFile(dirOrFile, type, progress)));
         }
       }
     } catch (IOException e) {
@@ -146,21 +150,20 @@ public class FileIndexer {
     }
   }
 
-  private void indexDirectory(final DefaultModuleFileSystem fileSystem, final Progress status, final Path dirToIndex, final InputFile.Type type) throws IOException {
+  private void indexDirectory(Path dirToIndex, InputFile.Type type, Progress progress) throws IOException {
     Files.walkFileTree(dirToIndex.normalize(), Collections.singleton(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
-      new IndexFileVisitor(fileSystem, status, type));
+      new IndexFileVisitor(type, progress));
   }
 
-  private Void indexFile(DefaultModuleFileSystem fileSystem, Progress progress, Path sourceFile, InputFile.Type type) throws IOException {
+  private Void indexFile(Path sourceFile, InputFile.Type type, Progress progress) throws IOException {
     // get case of real file without resolving link
     Path realFile = sourceFile.toRealPath(LinkOption.NOFOLLOW_LINKS);
-    DefaultInputFile inputFile = inputFileBuilder.create(realFile, type, fileSystem.encoding());
+    DefaultInputFile inputFile = inputFileBuilder.create(realFile, type);
     if (inputFile != null) {
       if (exclusionFilters.accept(inputFile, type) && accept(inputFile)) {
-        String parentRelativePath = getParentRelativePath(fileSystem, inputFile);
+        String parentRelativePath = getParentRelativePath(inputFile);
         synchronized (this) {
-          fileSystem.add(inputFile);
-          indexParentDir(fileSystem, inputFile, parentRelativePath);
+          indexParentDir(inputFile, parentRelativePath);
           progress.markAsIndexed(inputFile);
         }
         LOG.debug("'{}' indexed {}with language '{}'", inputFile.relativePath(), type == Type.TEST ? "as test " : "", inputFile.language());
@@ -172,31 +175,32 @@ public class FileIndexer {
     return null;
   }
 
-  private static String getParentRelativePath(DefaultModuleFileSystem fileSystem, InputFile inputFile) {
+  private String getParentRelativePath(InputFile inputFile) {
     Path parentDir = inputFile.path().getParent();
-    String relativePath = new PathResolver().relativePath(fileSystem.baseDirPath(), parentDir);
+    String relativePath = PathResolver.relativePath(module.getBaseDir(), parentDir);
     if (relativePath == null) {
       throw new IllegalStateException("Failed to compute relative path of file: " + inputFile);
     }
     return relativePath;
   }
 
-  private void indexParentDir(DefaultModuleFileSystem fileSystem, InputFile inputFile, String parentRelativePath) {
+  private void indexParentDir(InputFile inputFile, String parentRelativePath) {
     DefaultInputDir inputDir = (DefaultInputDir) componentStore.getDir(module.key(), parentRelativePath);
     if (inputDir == null) {
-      inputDir = new DefaultInputDir(fileSystem.moduleKey(), parentRelativePath, batchIdGenerator.get());
-      inputDir.setModuleBaseDir(fileSystem.baseDirPath());
-      fileSystem.add(inputDir);
+      inputDir = new DefaultInputDir(module.key(), parentRelativePath, batchIdGenerator.get());
+      inputDir.setModuleBaseDir(module.getBaseDir());
       componentTree.index(inputDir, module);
+      defaultModuleFileSystem.add(inputDir);
     }
     componentTree.index(inputFile, inputDir);
+    defaultModuleFileSystem.add(inputFile);
   }
 
   private boolean accept(InputFile indexedFile) {
     // InputFileFilter extensions. Might trigger generation of metadata
     for (InputFileFilter filter : filters) {
       if (!filter.accept(indexedFile)) {
-        LOG.debug("'{}' excluded by {}", indexedFile.relativePath(), filter.getClass().getName());
+        LOG.debug("'{}' excluded by {}", indexedFile.toString(), filter.getClass().getName());
         return false;
       }
     }
@@ -204,12 +208,10 @@ public class FileIndexer {
   }
 
   private class IndexFileVisitor implements FileVisitor<Path> {
-    private DefaultModuleFileSystem fileSystem;
-    private Progress status;
-    private Type type;
+    private final Progress status;
+    private final Type type;
 
-    IndexFileVisitor(DefaultModuleFileSystem fileSystem, Progress status, InputFile.Type type) {
-      this.fileSystem = fileSystem;
+    IndexFileVisitor(InputFile.Type type, Progress status) {
       this.status = status;
       this.type = type;
     }
@@ -230,7 +232,7 @@ public class FileIndexer {
     @Override
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
       if (!Files.isHidden(file)) {
-        tasks.add(executorService.submit(() -> indexFile(fileSystem, status, file, type)));
+        tasks.add(executorService.submit(() -> indexFile(file, type, status)));
       }
       return FileVisitResult.CONTINUE;
     }
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileSystemLogger.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileSystemLogger.java
deleted file mode 100644 (file)
index 3fde8e4..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2017 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program 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.
- *
- * This program 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.scanner.scan.filesystem;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.io.File;
-import java.nio.charset.Charset;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import javax.annotation.Nullable;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.batch.ScannerSide;
-import org.sonar.api.scan.filesystem.PathResolver;
-
-@ScannerSide
-public class FileSystemLogger {
-
-  private final DefaultModuleFileSystem fs;
-
-  public FileSystemLogger(DefaultModuleFileSystem fs) {
-    this.fs = fs;
-  }
-
-  public void log() {
-    doLog(LoggerFactory.getLogger(getClass()));
-  }
-
-  @VisibleForTesting
-  void doLog(Logger logger) {
-    logDir(logger, "Base dir: ", fs.baseDir());
-    logDir(logger, "Working dir: ", fs.workDir());
-    logPaths(logger, "Source paths: ", fs.baseDir(), fs.sources());
-    logPaths(logger, "Test paths: ", fs.baseDir(), fs.tests());
-    logEncoding(logger, fs.encoding());
-  }
-
-  private void logEncoding(Logger logger, Charset charset) {
-    if (!fs.isDefaultJvmEncoding()) {
-      logger.info("Source encoding: {}, default locale: {}", charset.displayName(), Locale.getDefault());
-    } else {
-      logger.warn("Source encoding is platform dependent ({}), default locale: {}", charset.displayName(), Locale.getDefault());
-    }
-  }
-
-  private static void logPaths(Logger logger, String label, File baseDir, List<File> paths) {
-    if (!paths.isEmpty()) {
-      PathResolver resolver = new PathResolver();
-      StringBuilder sb = new StringBuilder(label);
-      for (Iterator<File> it = paths.iterator(); it.hasNext();) {
-        File file = it.next();
-        String relativePathToBaseDir = resolver.relativePath(baseDir, file);
-        if (relativePathToBaseDir == null) {
-          sb.append(file);
-        } else if (StringUtils.isBlank(relativePathToBaseDir)) {
-          sb.append(".");
-        } else {
-          sb.append(relativePathToBaseDir);
-        }
-        if (it.hasNext()) {
-          sb.append(", ");
-        }
-      }
-      logger.info(sb.toString());
-    }
-  }
-
-  private static void logDir(Logger logger, String label, @Nullable File dir) {
-    if (dir != null) {
-      logger.info(label + dir.getAbsolutePath());
-    }
-  }
-}
index 6726cba970b43f313300c2aa837328ef13acec65..ffc0b2f7a0b441dc5dfd8b1958a4f19f97f9e4ae 100644 (file)
@@ -159,7 +159,7 @@ public class InputComponentStore {
   }
 
   private Path getProjectBaseDir() {
-    return ((DefaultInputModule) root).getBaseDir().toPath();
+    return ((DefaultInputModule) root).getBaseDir();
   }
 
   @CheckForNull
index fe8d125a5e9640e0b0c3eeb845de3f23f4b81cb5..7913cb711f9ada87d1b0f6c5dfbb0a692f0079b1 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.scanner.scan.filesystem;
 
-import java.nio.charset.Charset;
 import java.nio.file.Path;
 import javax.annotation.CheckForNull;
 import org.slf4j.Logger;
@@ -36,17 +35,17 @@ public class InputFileBuilder {
   private static final Logger LOG = LoggerFactory.getLogger(InputFileBuilder.class);
   private final String moduleKey;
   private final Path moduleBaseDir;
-  private final PathResolver pathResolver;
   private final LanguageDetection langDetection;
   private final BatchIdGenerator idGenerator;
   private final MetadataGenerator metadataGenerator;
   private final boolean preloadMetadata;
+  private final ModuleFileSystemInitializer moduleFileSystemInitializer;
 
-  public InputFileBuilder(DefaultInputModule module, PathResolver pathResolver, LanguageDetection langDetection, MetadataGenerator metadataGenerator,
-    BatchIdGenerator idGenerator, Configuration settings) {
+  public InputFileBuilder(DefaultInputModule module, LanguageDetection langDetection, MetadataGenerator metadataGenerator,
+    BatchIdGenerator idGenerator, Configuration settings, ModuleFileSystemInitializer moduleFileSystemInitializer) {
+    this.moduleFileSystemInitializer = moduleFileSystemInitializer;
     this.moduleKey = module.key();
-    this.moduleBaseDir = module.definition().getBaseDir().toPath();
-    this.pathResolver = pathResolver;
+    this.moduleBaseDir = module.getBaseDir();
     this.langDetection = langDetection;
     this.metadataGenerator = metadataGenerator;
     this.idGenerator = idGenerator;
@@ -54,8 +53,8 @@ public class InputFileBuilder {
   }
 
   @CheckForNull
-  DefaultInputFile create(Path file, InputFile.Type type, Charset defaultEncoding) {
-    String relativePath = pathResolver.relativePath(moduleBaseDir, file);
+  DefaultInputFile create(Path file, InputFile.Type type) {
+    String relativePath = PathResolver.relativePath(moduleBaseDir, file);
     if (relativePath == null) {
       LOG.warn("File '{}' is ignored. It is not located in module basedir '{}'.", file.toAbsolutePath(), moduleBaseDir);
       return null;
@@ -67,7 +66,7 @@ public class InputFileBuilder {
     }
 
     DefaultIndexedFile indexedFile = new DefaultIndexedFile(moduleKey, moduleBaseDir, relativePath, type, language, idGenerator.get());
-    DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> metadataGenerator.setMetadata(f, defaultEncoding));
+    DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> metadataGenerator.setMetadata(f, moduleFileSystemInitializer.defaultEncoding()));
     if (language != null) {
       inputFile.setPublish(true);
     }
index f13b39b5325ed0e4d4e7009409b8c4bac92d483c..f5828172008aaba0ce936a36309ab201706e3708 100644 (file)
 package org.sonar.scanner.scan.filesystem;
 
 import java.io.File;
+import java.nio.charset.Charset;
+import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
-
-import org.apache.commons.io.FileUtils;
+import java.util.Locale;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.ScannerSide;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
+import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.scan.filesystem.PathResolver;
-import org.sonar.api.utils.TempFolder;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import static org.sonar.scanner.config.DefaultConfiguration.parseAsCsv;
 
-/**
- * @since 3.5
- */
 @ScannerSide
+@Immutable
 public class ModuleFileSystemInitializer {
 
-  private File baseDir;
-  private File workingDir;
-  private List<File> sourceDirsOrFiles = new ArrayList<>();
-  private List<File> testDirsOrFiles = new ArrayList<>();
+  private static final Logger LOG = Loggers.get(ModuleFileSystemInitializer.class);
 
-  public ModuleFileSystemInitializer(ProjectDefinition module, TempFolder tempUtils, PathResolver pathResolver) {
-    baseDir = module.getBaseDir();
-    initWorkingDir(module, tempUtils);
-    initSources(module, pathResolver);
-    initTests(module, pathResolver);
-  }
+  private final List<Path> sourceDirsOrFiles;
+  private final List<Path> testDirsOrFiles;
+  private final Charset encoding;
 
-  private void initWorkingDir(ProjectDefinition module, TempFolder tempUtils) {
-    workingDir = module.getWorkDir();
-    if (workingDir == null) {
-      workingDir = tempUtils.newDir("work");
-    } else {
-      try {
-        FileUtils.forceMkdir(workingDir);
-      } catch (Exception e) {
-        throw new IllegalStateException("Fail to create working dir: " + workingDir.getAbsolutePath(), e);
-      }
-    }
+  public ModuleFileSystemInitializer(DefaultInputModule inputModule, ProjectDefinition module) {
+    logDir("Base dir: ", inputModule.getBaseDir());
+    logDir("Working dir: ", inputModule.getWorkDir());
+    sourceDirsOrFiles = initSources(module, inputModule.getBaseDir(), ProjectDefinition.SOURCES_PROPERTY, "Source paths: ");
+    testDirsOrFiles = initSources(module, inputModule.getBaseDir(), ProjectDefinition.TESTS_PROPERTY, "Test paths: ");
+    encoding = initEncoding(module);
   }
 
-  private void initSources(ProjectDefinition module, PathResolver pathResolver) {
-    String srcPropValue = module.properties().get(ProjectDefinition.SOURCES_PROPERTY);
+  private static List<Path> initSources(ProjectDefinition module, Path baseDir, String propertyKey, String logLabel) {
+    List<Path> result = new ArrayList<>();
+    String srcPropValue = module.properties().get(propertyKey);
     if (srcPropValue != null) {
-      for (String sourcePath : parseAsCsv(ProjectDefinition.SOURCES_PROPERTY, srcPropValue)) {
-        File dirOrFile = pathResolver.relativeFile(module.getBaseDir(), sourcePath);
+      for (String sourcePath : parseAsCsv(propertyKey, srcPropValue)) {
+        File dirOrFile = PathResolver.relativeFile(module.getBaseDir(), sourcePath);
         if (dirOrFile.exists()) {
-          sourceDirsOrFiles.add(dirOrFile);
+          result.add(dirOrFile.toPath());
         }
       }
     }
+    logPaths(logLabel, baseDir, result);
+    return result;
   }
 
-  private void initTests(ProjectDefinition module, PathResolver pathResolver) {
-    String testPropValue = module.properties().get(ProjectDefinition.TESTS_PROPERTY);
-    if (testPropValue != null) {
-      for (String testPath : parseAsCsv(ProjectDefinition.TESTS_PROPERTY, testPropValue)) {
-        File dirOrFile = pathResolver.relativeFile(module.getBaseDir(), testPath);
-        if (dirOrFile.exists()) {
-          testDirsOrFiles.add(dirOrFile);
-        }
-      }
+  private static Charset initEncoding(ProjectDefinition module) {
+    String encodingStr = module.properties().get(CoreProperties.ENCODING_PROPERTY);
+    Charset result;
+    if (StringUtils.isNotEmpty(encodingStr)) {
+      result = Charset.forName(StringUtils.trim(encodingStr));
+      LOG.info("Source encoding: {}, default locale: {}", result.displayName(), Locale.getDefault());
+    } else {
+      result = Charset.defaultCharset();
+      LOG.warn("Source encoding is platform dependent ({}), default locale: {}", result.displayName(), Locale.getDefault());
     }
+    return result;
   }
 
-  File baseDir() {
-    return baseDir;
+  List<Path> sources() {
+    return sourceDirsOrFiles;
   }
 
-  File workingDir() {
-    return workingDir;
+  List<Path> tests() {
+    return testDirsOrFiles;
   }
 
-  List<File> sources() {
-    return sourceDirsOrFiles;
+  public Charset defaultEncoding() {
+    return encoding;
   }
 
-  List<File> tests() {
-    return testDirsOrFiles;
+  private static void logPaths(String label, Path baseDir, List<Path> paths) {
+    if (!paths.isEmpty()) {
+      StringBuilder sb = new StringBuilder(label);
+      for (Iterator<Path> it = paths.iterator(); it.hasNext();) {
+        Path file = it.next();
+        String relativePathToBaseDir = PathResolver.relativePath(baseDir, file);
+        if (relativePathToBaseDir == null) {
+          sb.append(file);
+        } else if (StringUtils.isBlank(relativePathToBaseDir)) {
+          sb.append(".");
+        } else {
+          sb.append(relativePathToBaseDir);
+        }
+        if (it.hasNext()) {
+          sb.append(", ");
+        }
+      }
+      LOG.info(sb.toString());
+    }
+  }
+
+  private static void logDir(String label, @Nullable Path dir) {
+    if (dir != null) {
+      LOG.info(label + dir.toAbsolutePath().toString());
+    }
   }
 
 }
index 73f29557bc0b2af79d9d42e045976c7219971b19..ef380a0c74e90c05f0ab660ef8f7ff55f3f00250 100644 (file)
@@ -19,9 +19,9 @@
  */
 package org.sonar.scanner.scm;
 
+import com.google.common.base.Joiner;
 import java.util.LinkedHashMap;
 import java.util.Map;
-
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
 import org.sonar.api.CoreProperties;
@@ -37,8 +37,6 @@ import org.sonar.api.config.Configuration;
 import org.sonar.api.utils.log.Logger;
 import org.sonar.api.utils.log.Loggers;
 
-import com.google.common.base.Joiner;
-
 @Properties({
   @Property(
     key = ScmConfiguration.FORCE_RELOAD_KEY,
@@ -123,7 +121,7 @@ public final class ScmConfiguration implements Startable {
 
   private void autodetection() {
     for (ScmProvider installedProvider : providerPerKey.values()) {
-      if (installedProvider.supports(moduleHierarchy.root().getBaseDir())) {
+      if (installedProvider.supports(moduleHierarchy.root().getBaseDir().toFile())) {
         if (this.provider == null) {
           this.provider = installedProvider;
         } else {
index ce458c8bb3a13fb5d431dbda684a58eb47e6f750..8b45a3637a9a16fcf3b8461b63f4a1aeda3ab617 100644 (file)
  */
 package org.sonar.scanner.analysis;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.File;
 import java.io.IOException;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -34,6 +29,10 @@ import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
 import org.sonar.api.utils.TempFolder;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 public class AnalysisTempFolderProviderTest {
 
   @Rule
@@ -48,7 +47,7 @@ public class AnalysisTempFolderProviderTest {
     moduleHierarchy = mock(InputModuleHierarchy.class);
     DefaultInputModule module = mock(DefaultInputModule.class);
     when(moduleHierarchy.root()).thenReturn(module);
-    when(module.getWorkDir()).thenReturn(temp.getRoot());
+    when(module.getWorkDir()).thenReturn(temp.getRoot().toPath());
   }
 
   @Test
index c3c8b131b6a38183f2d193c6620cd1cedc0781c1..54a254b433304769cbd1d498207a516fa7ab4d05 100644 (file)
 package org.sonar.scanner.bootstrap;
 
 import com.google.common.collect.Lists;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.sonar.api.BatchExtension;
 import org.sonar.api.batch.BuildBreaker;
 import org.sonar.api.batch.CheckProject;
@@ -34,6 +37,7 @@ import org.sonar.api.batch.Phase;
 import org.sonar.api.batch.PostJob;
 import org.sonar.api.batch.Sensor;
 import org.sonar.api.batch.SensorContext;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.postjob.PostJobContext;
 import org.sonar.api.batch.sensor.SensorDescriptor;
@@ -49,6 +53,9 @@ import static org.mockito.Mockito.mock;
 
 public class ScannerExtensionDictionnaryTest {
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   private ScannerExtensionDictionnary newSelector(Object... extensions) {
     ComponentContainer iocContainer = new ComponentContainer();
     for (Object extension : extensions) {
@@ -232,12 +239,13 @@ public class ScannerExtensionDictionnaryTest {
   }
 
   @Test
-  public void checkProject() {
+  public void checkProject() throws IOException {
     BatchExtension ok = new CheckProjectOK();
     BatchExtension ko = new CheckProjectKO();
 
     ScannerExtensionDictionnary selector = newSelector(ok, ko);
-    List<BatchExtension> extensions = Lists.newArrayList(selector.select(BatchExtension.class, new DefaultInputModule("foo"), true, null));
+    List<BatchExtension> extensions = Lists.newArrayList(selector.select(BatchExtension.class,
+      new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())), true, null));
 
     assertThat(extensions).hasSize(1);
     assertThat(extensions.get(0)).isInstanceOf(CheckProjectOK.class);
index d7d16341d8fe3ec8c497e0db4d66d28382d832a9..235e14c26217cabd59b37b23428039743fa30817 100644 (file)
  */
 package org.sonar.scanner.index;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.IOException;
 import java.util.Collections;
 import org.junit.Before;
@@ -48,6 +44,10 @@ import org.sonar.scanner.scan.filesystem.InputComponentStore;
 import org.sonar.scanner.scan.measure.MeasureCache;
 import org.sonar.scanner.sensor.DefaultSensorStorage;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 public class DefaultIndexTest {
 
   @org.junit.Rule
@@ -74,10 +74,16 @@ public class DefaultIndexTest {
 
     baseDir = temp.newFolder();
 
-    ProjectDefinition rootDef = ProjectDefinition.create().setKey("project").setBaseDir(baseDir);
-    ProjectDefinition moduleADef = ProjectDefinition.create().setKey("moduleA").setBaseDir(new java.io.File(baseDir, "moduleA"));
-    ProjectDefinition moduleBDef = ProjectDefinition.create().setKey("moduleB").setBaseDir(new java.io.File(baseDir, "moduleB"));
-    ProjectDefinition moduleB1Def = ProjectDefinition.create().setKey("moduleB1").setBaseDir(new java.io.File(baseDir, "moduleB/moduleB1"));
+    ProjectDefinition rootDef = ProjectDefinition.create().setKey("project").setBaseDir(baseDir).setWorkDir(temp.newFolder());
+    java.io.File moduleABaseDir = new java.io.File(baseDir, "moduleA");
+    moduleABaseDir.mkdir();
+    ProjectDefinition moduleADef = ProjectDefinition.create().setKey("moduleA").setBaseDir(moduleABaseDir).setWorkDir(temp.newFolder());
+    java.io.File moduleBBaseDir = new java.io.File(baseDir, "moduleB");
+    moduleBBaseDir.mkdir();
+    ProjectDefinition moduleBDef = ProjectDefinition.create().setKey("moduleB").setBaseDir(moduleBBaseDir).setWorkDir(temp.newFolder());
+    java.io.File moduleB1BaseDir = new java.io.File(baseDir, "moduleB/moduleB1");
+    moduleB1BaseDir.mkdir();
+    ProjectDefinition moduleB1Def = ProjectDefinition.create().setKey("moduleB1").setBaseDir(moduleB1BaseDir).setWorkDir(temp.newFolder());
 
     rootDef.addSubProject(moduleADef);
     rootDef.addSubProject(moduleBDef);
@@ -96,8 +102,8 @@ public class DefaultIndexTest {
   }
 
   @Test
-  public void shouldGetHierarchy() {
-    InputComponent component = new DefaultInputModule("module1");
+  public void shouldGetHierarchy() throws IOException {
+    InputComponent component = new DefaultInputModule(ProjectDefinition.create().setKey("module1").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     InputFile file1 = new TestInputFileBuilder("module1", "src/org/foo/Bar.java").build();
 
     when(componentStore.getByKey("module1")).thenReturn(component);
@@ -113,10 +119,12 @@ public class DefaultIndexTest {
   }
 
   @Test
-  public void shouldTransformToResource() {
+  public void shouldTransformToResource() throws IOException {
     DefaultInputModule component = new DefaultInputModule(ProjectDefinition.create()
       .setKey("module1")
-      .setProperty(CoreProperties.PROJECT_BRANCH_PROPERTY, "branch1"), 1);
+      .setProperty(CoreProperties.PROJECT_BRANCH_PROPERTY, "branch1")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder()), 1);
     InputFile file1 = new TestInputFileBuilder("module1", "src/org/foo/Bar.java").build();
     InputDir dir = new DefaultInputDir("module1", "src");
 
index 19585cbab0866817e9e9c3316de27730c5af538a..39d5571e8a668a02a5e8e7cef1d7c6b2b7017fce 100644 (file)
  */
 package org.sonar.scanner.issue;
 
+import java.io.IOException;
 import java.util.Date;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.rule.RuleKey;
@@ -35,13 +39,16 @@ import static org.mockito.Mockito.when;
 
 public class DeprecatedIssueAdapterForFilterTest {
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   private static final String PROJECT_KEY = "foo";
   private static final Date ANALYSIS_DATE = new Date();
   private static final String COMPONENT_KEY = "foo:src/Foo.java";
 
   @Test
-  public void improve_coverage() {
-    DefaultInputModule module = new DefaultInputModule(PROJECT_KEY);
+  public void improve_coverage() throws IOException {
+    DefaultInputModule module = new DefaultInputModule(ProjectDefinition.create().setKey(PROJECT_KEY).setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     ProjectAnalysisInfo projectAnalysisInfo = mock(ProjectAnalysisInfo.class);
     when(projectAnalysisInfo.analysisDate()).thenReturn(ANALYSIS_DATE);
 
index 27084d321a63c146d572284e815396b66bf6fa27..e5cd4fc19ef62646304c9f598d092230c7657187 100644 (file)
  */
 package org.sonar.scanner.issue;
 
+import java.io.IOException;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
 import org.sonar.api.issue.Issuable;
@@ -30,7 +34,8 @@ import static org.mockito.Mockito.mock;
 
 public class IssuableFactoryTest {
 
-  ModuleIssues moduleIssues = mock(ModuleIssues.class);
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
 
   @Test
   public void file_should_be_issuable() {
@@ -42,9 +47,10 @@ public class IssuableFactoryTest {
   }
 
   @Test
-  public void project_should_be_issuable() {
+  public void project_should_be_issuable() throws IOException {
     IssuableFactory factory = new IssuableFactory(mock(DefaultSensorContext.class));
-    Issuable issuable = factory.loadPerspective(Issuable.class, new DefaultInputModule("foo"));
+    Issuable issuable = factory.loadPerspective(Issuable.class,
+      new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())));
 
     assertThat(issuable).isNotNull();
     assertThat(issuable.issues()).isEmpty();
index dde76bf67229ea47a25618ad14a123d930eae10e..3f4b49ad00781bc111627272556e35e5c62e1a43 100644 (file)
  */
 package org.sonar.scanner.issue.tracking;
 
-import static org.apache.commons.codec.digest.DigestUtils.md5Hex;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 import java.io.File;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.util.Collections;
-
 import org.apache.commons.io.FileUtils;
 import org.junit.Before;
 import org.junit.Rule;
@@ -42,6 +34,12 @@ import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 
+import static org.apache.commons.codec.digest.DigestUtils.md5Hex;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 public class SourceHashHolderTest {
 
   @Rule
@@ -57,7 +55,7 @@ public class SourceHashHolderTest {
 
   @Before
   public void setUp() throws Exception {
-    def = mock(ProjectDefinition.class);
+    def = ProjectDefinition.create().setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder());
     lastSnapshots = mock(ServerLineHashesLoader.class);
     file = mock(DefaultInputFile.class);
     ioFile = temp.newFile();
@@ -86,7 +84,7 @@ public class SourceHashHolderTest {
   public void should_lazy_load_reference_hashes_when_status_changed() throws Exception {
     final String source = "source";
     FileUtils.write(ioFile, source, StandardCharsets.UTF_8);
-    when(def.getKeyWithBranch()).thenReturn("foo");
+    def.setKey("foo");
     when(file.relativePath()).thenReturn("src/Foo.java");
     String key = "foo:src/Foo.java";
     when(file.status()).thenReturn(InputFile.Status.CHANGED);
@@ -103,8 +101,8 @@ public class SourceHashHolderTest {
   public void should_lazy_load_reference_hashes_when_status_changed_on_branch() throws Exception {
     final String source = "source";
     FileUtils.write(ioFile, source, StandardCharsets.UTF_8);
-    when(def.getKeyWithBranch()).thenReturn("foo:myBranch");
-    when(def.properties()).thenReturn(Collections.singletonMap(CoreProperties.PROJECT_BRANCH_PROPERTY, "myBranch"));
+    def.setKey("foo");
+    def.setProperty(CoreProperties.PROJECT_BRANCH_PROPERTY, "myBranch");
     when(file.relativePath()).thenReturn("src/Foo.java");
     String key = "foo:myBranch:src/Foo.java";
     when(file.status()).thenReturn(InputFile.Status.CHANGED);
index 488d9694763991421b1242e8cf8c7cee608c64ce..d3e87cdc613eb6d0fdf22c6e0ff9c436667f0717 100644 (file)
  */
 package org.sonar.scanner.phases;
 
+import java.io.IOException;
 import java.util.Arrays;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.PostJob;
 import org.sonar.api.batch.SensorContext;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.resources.Project;
 import org.sonar.scanner.bootstrap.ScannerExtensionDictionnary;
@@ -36,16 +40,20 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 public class PostJobsExecutorTest {
-  PostJobsExecutor executor;
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
 
-  DefaultInputModule module = new DefaultInputModule("project");
-  ScannerExtensionDictionnary selector = mock(ScannerExtensionDictionnary.class);
-  PostJob job1 = mock(PostJob.class);
-  PostJob job2 = mock(PostJob.class);
-  SensorContext context = mock(SensorContext.class);
+  private PostJobsExecutor executor;
+
+  private DefaultInputModule module;
+  private ScannerExtensionDictionnary selector = mock(ScannerExtensionDictionnary.class);
+  private PostJob job1 = mock(PostJob.class);
+  private PostJob job2 = mock(PostJob.class);
+  private SensorContext context = mock(SensorContext.class);
 
   @Before
-  public void setUp() {
+  public void setUp() throws IOException {
+    module = new DefaultInputModule(ProjectDefinition.create().setKey("project").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     executor = new PostJobsExecutor(selector, module, mock(EventBus.class));
   }
 
index dcea19af2854b383f49916de685e4d071dc19cdf..2a68b02aa1635422bceb0bba8435b60cfcf94c1d 100644 (file)
  */
 package org.sonar.scanner.phases;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.IOException;
 import java.util.Collections;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -43,6 +36,12 @@ import org.sonar.scanner.bootstrap.ScannerExtensionDictionnary;
 import org.sonar.scanner.events.EventBus;
 import org.sonar.scanner.sensor.SensorStrategy;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 public class SensorsExecutorTest {
   @Rule
   public TemporaryFolder temp = new TemporaryFolder();
@@ -86,8 +85,8 @@ public class SensorsExecutorTest {
     when(selector.selectSensors(any(DefaultInputModule.class), eq(false))).thenReturn(Collections.singleton(perModuleSensor));
     when(selector.selectSensors(any(DefaultInputModule.class), eq(true))).thenReturn(Collections.singleton(globalSensor));
 
-    ProjectDefinition childDef = ProjectDefinition.create().setKey("sub").setBaseDir(temp.newFolder());
-    ProjectDefinition rootDef = ProjectDefinition.create().setKey("root").setBaseDir(temp.newFolder());
+    ProjectDefinition childDef = ProjectDefinition.create().setKey("sub").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder());
+    ProjectDefinition rootDef = ProjectDefinition.create().setKey("root").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder());
 
     DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(rootDef);
     DefaultInputModule subModule = TestInputFileBuilder.newDefaultInputModule(childDef);
index b2853116007c750121229fd9761f0380a69f0242..a07f07a27c972de3c815522db8299d752fdae5ff 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.scanner.profiling;
 
 import com.google.common.collect.Maps;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import org.junit.Before;
@@ -67,7 +68,7 @@ public class PhasesSumUpTimeProfilerTest {
   }
 
   @Test
-  public void testSimpleProject() throws InterruptedException {
+  public void testSimpleProject() throws Exception {
 
     final Project project = mockProject("my:project", true);
 
@@ -80,7 +81,7 @@ public class PhasesSumUpTimeProfilerTest {
   }
 
   @Test
-  public void testMultimoduleProject() throws InterruptedException {
+  public void testMultimoduleProject() throws Exception {
     final Project project = mockProject("project root", true);
     final Project moduleA = mockProject("moduleA", false);
     final Project moduleB = mockProject("moduleB", false);
@@ -132,8 +133,8 @@ public class PhasesSumUpTimeProfilerTest {
     }
   }
 
-  private Project mockProject(String name, boolean isRoot) {
-    return new Project(new DefaultInputModule(ProjectDefinition.create().setName(name).setKey(name)));
+  private Project mockProject(String name, boolean isRoot) throws IOException {
+    return new Project(new DefaultInputModule(ProjectDefinition.create().setName(name).setKey(name).setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())));
   }
 
   private void fakeAnalysis(PhasesSumUpTimeProfiler profiler, final Project module) {
index 77fc6206b24730397da477f221c5f6e560a5a124..68a39bf1f1f18db9bc0e1aeb99f296496821ca05 100644 (file)
@@ -99,7 +99,7 @@ public class AnalysisContextReportPublisherTest {
 
     ScannerReportWriter writer = new ScannerReportWriter(temp.newFolder());
     publisher.init(writer);
-    publisher.dumpModuleSettings(new DefaultInputModule("foo"));
+    publisher.dumpModuleSettings(new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())));
 
     assertThat(writer.getFileStructure().analysisLog()).doesNotExist();
   }
@@ -126,7 +126,7 @@ public class AnalysisContextReportPublisherTest {
     when(projectRepos.moduleExists("foo")).thenReturn(true);
     when(projectRepos.settings("foo")).thenReturn(ImmutableMap.of(COM_FOO, "bar", SONAR_SKIP, "true"));
 
-    publisher.dumpModuleSettings(new DefaultInputModule("foo"));
+    publisher.dumpModuleSettings(new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())));
 
     String content = FileUtils.readFileToString(writer.getFileStructure().analysisLog());
     assertThat(content).doesNotContain(COM_FOO);
@@ -148,6 +148,8 @@ public class AnalysisContextReportPublisherTest {
     assertThat(content).doesNotContain(SONAR_SKIP);
 
     publisher.dumpModuleSettings(new DefaultInputModule(ProjectDefinition.create()
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder())
       .setProperty("sonar.projectKey", "foo")
       .setProperty(COM_FOO, "bar")
       .setProperty(SONAR_SKIP, "true")));
@@ -174,6 +176,8 @@ public class AnalysisContextReportPublisherTest {
     assertThat(content).containsSequence(BIZ, FOO);
 
     publisher.dumpModuleSettings(new DefaultInputModule(ProjectDefinition.create()
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder())
       .setProperty("sonar.projectKey", "foo")
       .setProperty("env." + FOO, "BAR")));
 
@@ -191,6 +195,8 @@ public class AnalysisContextReportPublisherTest {
     assertThat(writer.getFileStructure().analysisLog()).exists();
 
     publisher.dumpModuleSettings(new DefaultInputModule(ProjectDefinition.create()
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder())
       .setProperty("sonar.projectKey", "foo")
       .setProperty("sonar.projectKey", "foo")
       .setProperty("sonar.login", "my_token")
@@ -226,10 +232,14 @@ public class AnalysisContextReportPublisherTest {
     publisher.init(writer);
 
     DefaultInputModule module = new DefaultInputModule(ProjectDefinition.create()
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder())
       .setProperty("sonar.projectKey", "foo")
       .setProperty(SONAR_SKIP, "true"));
 
     DefaultInputModule parent = new DefaultInputModule(ProjectDefinition.create()
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder())
       .setProperty("sonar.projectKey", "parent")
       .setProperty(SONAR_SKIP, "true"));
 
index 2f1a13d1d949473e12c71d355447195a0486032b..9170a07fbac3e6331c4f16b724eaa273bd7eb14b 100644 (file)
@@ -77,13 +77,17 @@ public class ComponentsPublisherTest {
       .setKey("foo")
       .setProperty(CoreProperties.PROJECT_VERSION_PROPERTY, "1.0")
       .setName("Root project")
-      .setDescription("Root description");
+      .setDescription("Root description")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder());
     DefaultInputModule root = new DefaultInputModule(rootDef, 1);
 
     ProjectDefinition module1Def = ProjectDefinition.create()
       .setKey("module1")
       .setName("Module1")
-      .setDescription("Module description");
+      .setDescription("Module description")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder());
     rootDef.addSubProject(module1Def);
 
     DefaultInputModule module1 = new DefaultInputModule(module1Def, 2);
@@ -137,7 +141,7 @@ public class ComponentsPublisherTest {
   }
 
   @Test
-  public void should_skip_dir_without_published_files() {
+  public void should_skip_dir_without_published_files() throws IOException {
     ProjectAnalysisInfo projectAnalysisInfo = mock(ProjectAnalysisInfo.class);
     when(projectAnalysisInfo.analysisDate()).thenReturn(DateUtils.parseDate("2012-12-12"));
 
@@ -145,7 +149,9 @@ public class ComponentsPublisherTest {
       .setKey("foo")
       .setProperty(CoreProperties.PROJECT_VERSION_PROPERTY, "1.0")
       .setName("Root project")
-      .setDescription("Root description");
+      .setDescription("Root description")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder());
     DefaultInputModule root = new DefaultInputModule(rootDef, 1);
 
     moduleHierarchy = mock(InputModuleHierarchy.class);
@@ -196,12 +202,16 @@ public class ComponentsPublisherTest {
 
     ProjectDefinition rootDef = ProjectDefinition.create()
       .setKey("foo")
-      .setDescription("Root description");
+      .setDescription("Root description")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder());
     DefaultInputModule root = new DefaultInputModule(rootDef, 1);
 
     ProjectDefinition module1Def = ProjectDefinition.create()
       .setKey("module1")
-      .setDescription("Module description");
+      .setDescription("Module description")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder());
     rootDef.addSubProject(module1Def);
     DefaultInputModule module1 = new DefaultInputModule(module1Def, 2);
 
@@ -261,14 +271,18 @@ public class ComponentsPublisherTest {
       .setProperty(CoreProperties.PROJECT_BRANCH_PROPERTY, "my_branch")
       .setName("Root project")
       .setProperty(CoreProperties.LINKS_HOME_PAGE, "http://home")
-      .setDescription("Root description");
+      .setDescription("Root description")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder());
     DefaultInputModule root = new DefaultInputModule(rootDef, 1);
 
     ProjectDefinition module1Def = ProjectDefinition.create()
       .setKey("module1")
       .setName("Module1")
       .setProperty(CoreProperties.LINKS_CI, "http://ci")
-      .setDescription("Module description");
+      .setDescription("Module description")
+      .setBaseDir(temp.newFolder())
+      .setWorkDir(temp.newFolder());
     rootDef.addSubProject(module1Def);
     DefaultInputModule module1 = new DefaultInputModule(module1Def, 2);
 
index 3d3dddfe821e137aab0d7ec1170ac7b7b2296833..b804fd08df2b0ff25a33a2ddaca372fa387dc7a2 100644 (file)
  */
 package org.sonar.scanner.report;
 
-import static java.util.Arrays.asList;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.entry;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.File;
+import java.io.IOException;
 import java.util.Date;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -46,6 +40,12 @@ import org.sonar.scanner.protocol.output.ScannerReportWriter;
 import org.sonar.scanner.rule.ModuleQProfiles;
 import org.sonar.scanner.rule.QProfile;
 
+import static java.util.Arrays.asList;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.entry;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 public class MetadataPublisherTest {
 
   @Rule
@@ -60,7 +60,7 @@ public class MetadataPublisherTest {
   private InputModuleHierarchy inputModuleHierarchy;
 
   @Before
-  public void prepare() {
+  public void prepare() throws IOException {
     projectAnalysisInfo = mock(ProjectAnalysisInfo.class);
     cpdSettings = mock(CpdSettings.class);
     when(projectAnalysisInfo.analysisDate()).thenReturn(new Date(1234567L));
@@ -69,8 +69,8 @@ public class MetadataPublisherTest {
     createPublisher(ProjectDefinition.create().setKey("foo"));
   }
 
-  private void createPublisher(ProjectDefinition def) {
-    rootModule = new DefaultInputModule(def, TestInputFileBuilder.nextBatchId());
+  private void createPublisher(ProjectDefinition def) throws IOException {
+    rootModule = new DefaultInputModule(def.setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()), TestInputFileBuilder.nextBatchId());
     inputModuleHierarchy = mock(InputModuleHierarchy.class);
     when(inputModuleHierarchy.root()).thenReturn(rootModule);
     underTest = new MetadataPublisher(projectAnalysisInfo, inputModuleHierarchy, settings.asConfig(), qProfiles, cpdSettings);
index e4d6c615339565d6e135cc87153f71c68cc531cb..2a2651e162f7d75e6d0694f22cac8f3b4fd01232 100644 (file)
@@ -79,9 +79,9 @@ public class ReportPublisherTest {
   AnalysisContextReportPublisher contextPublisher = mock(AnalysisContextReportPublisher.class);
 
   @Before
-  public void setUp() {
+  public void setUp() throws IOException {
     wsClient = mock(ScannerWsClient.class, Mockito.RETURNS_DEEP_STUBS);
-    root = new DefaultInputModule(ProjectDefinition.create().setKey("struts").setWorkDir(temp.getRoot()));
+    root = new DefaultInputModule(ProjectDefinition.create().setKey("struts").setBaseDir(temp.newFolder()).setWorkDir(temp.getRoot()));
     when(moduleHierarchy.root()).thenReturn(root);
     when(server.getPublicRootUrl()).thenReturn("https://localhost");
     when(server.getVersion()).thenReturn("6.4");
index e60b3303d4028060786b83ddf4b623beed3764bd..562c7d58395c79fe9832002fde10f646c6535a5c 100644 (file)
  */
 package org.sonar.scanner.scan;
 
+import java.io.IOException;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputComponent;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class DefaultComponentTreeTest {
+
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   private DefaultComponentTree tree;
 
   @Before
@@ -35,12 +43,12 @@ public class DefaultComponentTreeTest {
   }
 
   @Test
-  public void test() {
-    DefaultInputComponent root = new DefaultInputModule("root");
-    DefaultInputComponent mod1 = new DefaultInputModule("mod1");
-    DefaultInputComponent mod2 = new DefaultInputModule("mod2");
-    DefaultInputComponent mod3 = new DefaultInputModule("mod3");
-    DefaultInputComponent mod4 = new DefaultInputModule("mod4");
+  public void test() throws IOException {
+    DefaultInputComponent root = new DefaultInputModule(ProjectDefinition.create().setKey("root").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputComponent mod1 = new DefaultInputModule(ProjectDefinition.create().setKey("mod1").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputComponent mod2 = new DefaultInputModule(ProjectDefinition.create().setKey("mod2").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputComponent mod3 = new DefaultInputModule(ProjectDefinition.create().setKey("mod3").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputComponent mod4 = new DefaultInputModule(ProjectDefinition.create().setKey("mod4").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
 
     tree.index(mod1, root);
     tree.index(mod2, mod1);
index 977fdc6a67c9af4144ae0186150617bf4e459f6c..d9e5650dc9dc725bd56eb7c9d17ddfab35350e27 100644 (file)
  */
 package org.sonar.scanner.scan;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
-
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 public class DefaultInputModuleHierarchyTest {
+
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   private DefaultInputModuleHierarchy moduleHierarchy;
 
   @Test
-  public void test() {
-    DefaultInputModule root = new DefaultInputModule("root");
-    DefaultInputModule mod1 = new DefaultInputModule("mod1");
-    DefaultInputModule mod2 = new DefaultInputModule("mod2");
-    DefaultInputModule mod3 = new DefaultInputModule("mod3");
-    DefaultInputModule mod4 = new DefaultInputModule("mod4");
+  public void test() throws IOException {
+    DefaultInputModule root = new DefaultInputModule(ProjectDefinition.create().setKey("root").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputModule mod1 = new DefaultInputModule(ProjectDefinition.create().setKey("mod1").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputModule mod2 = new DefaultInputModule(ProjectDefinition.create().setKey("mod2").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputModule mod3 = new DefaultInputModule(ProjectDefinition.create().setKey("mod3").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputModule mod4 = new DefaultInputModule(ProjectDefinition.create().setKey("mod4").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
 
     Map<DefaultInputModule, DefaultInputModule> parents = new HashMap<>();
 
@@ -60,8 +67,8 @@ public class DefaultInputModuleHierarchyTest {
   }
 
   @Test
-  public void testOnlyRoot() {
-    DefaultInputModule root = new DefaultInputModule("root");
+  public void testOnlyRoot() throws IOException {
+    DefaultInputModule root = new DefaultInputModule(ProjectDefinition.create().setKey("root").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     moduleHierarchy = new DefaultInputModuleHierarchy(root);
 
     assertThat(moduleHierarchy.children(root)).isEmpty();
@@ -70,9 +77,9 @@ public class DefaultInputModuleHierarchyTest {
   }
 
   @Test
-  public void testParentChild() {
-    DefaultInputModule root = new DefaultInputModule("root");
-    DefaultInputModule mod1 = new DefaultInputModule("mod1");
+  public void testParentChild() throws IOException {
+    DefaultInputModule root = new DefaultInputModule(ProjectDefinition.create().setKey("root").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
+    DefaultInputModule mod1 = new DefaultInputModule(ProjectDefinition.create().setKey("mod1").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     moduleHierarchy = new DefaultInputModuleHierarchy(root, mod1);
 
     assertThat(moduleHierarchy.children(root)).containsOnly(mod1);
index af46b5edd7bc59a55e41e9af1d5ac57322e27061..b27f6b7aa1da74d5607eb8ad836f6ee4fb6652b8 100644 (file)
  */
 package org.sonar.scanner.scan;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -36,6 +31,10 @@ import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
 import org.sonar.home.cache.DirectoryLock;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 public class ProjectLockTest {
   @Rule
   public TemporaryFolder tempFolder = new TemporaryFolder();
@@ -53,7 +52,7 @@ public class ProjectLockTest {
     InputModuleHierarchy hierarchy = mock(InputModuleHierarchy.class);
     DefaultInputModule root = mock(DefaultInputModule.class);
     when(hierarchy.root()).thenReturn(root);
-    when(root.getWorkDir()).thenReturn(file);
+    when(root.getWorkDir()).thenReturn(file.toPath());
 
     return new ProjectLock(hierarchy);
   }
index aa824ab9abcf22d6d3a845cee3a9c6a7d4f3c730..82886823190da5031aa5f26a8f2168ef7dccb75e 100644 (file)
  */
 package org.sonar.scanner.scan;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.File;
 import java.io.IOException;
-
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -34,6 +29,10 @@ import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
 import org.sonar.home.cache.DirectoryLock;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 public class WorkDirectoryCleanerTest {
   private WorkDirectoryCleaner cleaner;
   @Rule
@@ -54,7 +53,7 @@ public class WorkDirectoryCleanerTest {
     InputModuleHierarchy hierarchy = mock(InputModuleHierarchy.class);
     DefaultInputModule root = mock(DefaultInputModule.class);
     when(hierarchy.root()).thenReturn(root);
-    when(root.getWorkDir()).thenReturn(temp.getRoot());
+    when(root.getWorkDir()).thenReturn(temp.getRoot().toPath());
 
     assertThat(temp.getRoot().list().length).isGreaterThan(1);
     cleaner = new WorkDirectoryCleaner(hierarchy);
index 9a82a623f55df211d751103097a620d1e070fc50..38e480e8b7d1fdf05b239882be681ebdd8fed959 100644 (file)
@@ -51,9 +51,9 @@ public class InputComponentStoreTest {
     File rootBaseDir = temp.newFolder();
 
     ProjectDefinition moduleDef = ProjectDefinition.create()
-      .setKey(subModuleKey).setBaseDir(rootBaseDir);
+      .setKey(subModuleKey).setBaseDir(rootBaseDir).setWorkDir(temp.newFolder());
     ProjectDefinition rootDef = ProjectDefinition.create()
-      .setKey(rootModuleKey).setBaseDir(rootBaseDir).addSubProject(moduleDef);
+      .setKey(rootModuleKey).setBaseDir(rootBaseDir).setWorkDir(temp.newFolder()).addSubProject(moduleDef);
 
     DefaultInputModule rootModule = TestInputFileBuilder.newDefaultInputModule(rootDef);
     DefaultInputModule subModule = TestInputFileBuilder.newDefaultInputModule(moduleDef);
index bf8091f5853a0910e855450bf0f5b68b1cc7c5cd..d6b5ac300750d4c60e6249c6267d2b90a2ef4a93 100644 (file)
@@ -31,37 +31,41 @@ import org.sonar.api.batch.fs.InputFile.Type;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.config.internal.MapSettings;
-import org.sonar.api.scan.filesystem.PathResolver;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public class InputFileBuilderTest {
   @Rule
   public TemporaryFolder temp = new TemporaryFolder();
 
   private Path baseDir;
+  private Path workDir;
   private InputFileBuilder builder;
 
   @Before
   public void setUp() throws IOException {
     baseDir = temp.newFolder().toPath();
+    workDir = temp.newFolder().toPath();
     DefaultInputModule module = new DefaultInputModule(ProjectDefinition.create()
-      .setKey("module1")
-      .setBaseDir(baseDir.toFile()), 0);
+      .setBaseDir(baseDir.toFile())
+      .setWorkDir(workDir.toFile())
+      .setKey("module1"), 0);
 
-    PathResolver pathResolver = new PathResolver();
     LanguageDetection langDetection = mock(LanguageDetection.class);
     MetadataGenerator metadataGenerator = mock(MetadataGenerator.class);
     BatchIdGenerator idGenerator = new BatchIdGenerator();
     MapSettings settings = new MapSettings();
-    builder = new InputFileBuilder(module, pathResolver, langDetection, metadataGenerator, idGenerator, settings.asConfig());
+    ModuleFileSystemInitializer moduleFileSystemInitializer = mock(ModuleFileSystemInitializer.class);
+    when(moduleFileSystemInitializer.defaultEncoding()).thenReturn(StandardCharsets.UTF_8);
+    builder = new InputFileBuilder(module, langDetection, metadataGenerator, idGenerator, settings.asConfig(), moduleFileSystemInitializer);
   }
 
   @Test
   public void testBuild() {
     Path filePath = baseDir.resolve("src/File1.xoo");
-    DefaultInputFile inputFile = builder.create(filePath, Type.MAIN, StandardCharsets.UTF_8);
+    DefaultInputFile inputFile = builder.create(filePath, Type.MAIN);
 
     assertThat(inputFile.moduleKey()).isEqualTo("module1");
     assertThat(inputFile.absolutePath()).isEqualTo(filePath.toString().replaceAll("\\\\", "/"));
index c9c7312fab5bad54e901ce12e6e01fd3072ad80c..5ebded1daec798313c6624fba28c7c70d1375d63 100644 (file)
  */
 package org.sonar.scanner.scan.filesystem;
 
+import java.io.IOException;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.mockito.Mockito;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer;
@@ -31,12 +35,17 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 public class MetadataGeneratorProviderTest {
+
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   @Test
-  public void create_builder() {
+  public void create_builder() throws IOException {
     StatusDetectionFactory statusDetectionFactory = mock(StatusDetectionFactory.class, Mockito.RETURNS_MOCKS);
     IssueExclusionsLoader issueExclusionsLoader = new IssueExclusionsLoader(mock(IssueExclusionPatternInitializer.class), mock(PatternMatcher.class));
 
     MetadataGeneratorProvider factory = new MetadataGeneratorProvider();
-    assertThat(factory.provide(new DefaultInputModule("module"), statusDetectionFactory, new FileMetadata(), issueExclusionsLoader)).isNotNull();
+    assertThat(factory.provide(new DefaultInputModule(ProjectDefinition.create().setKey("module").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())),
+      statusDetectionFactory, new FileMetadata(), issueExclusionsLoader)).isNotNull();
   }
 }
index b9a9723e0ebabbeaf8025d1e3785fbe3e17f6179..27fa5362f54839c3af525629b71164c82f9a4f5a 100644 (file)
@@ -31,6 +31,7 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
@@ -59,11 +60,12 @@ public class MetadataGeneratorTest {
   private MetadataGenerator generator;
 
   @Before
-  public void setUp() {
+  public void setUp() throws IOException {
     MockitoAnnotations.initMocks(this);
     metadata = new FileMetadata();
     IssueExclusionsLoader issueExclusionsLoader = new IssueExclusionsLoader(mock(IssueExclusionPatternInitializer.class), mock(PatternMatcher.class));
-    generator = new MetadataGenerator(new DefaultInputModule("module"), statusDetection, metadata, issueExclusionsLoader);
+    generator = new MetadataGenerator(new DefaultInputModule(ProjectDefinition.create().setKey("module").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())),
+      statusDetection, metadata, issueExclusionsLoader);
   }
 
   @Test
index 454223ad846fe46a8accb55ee5e6dd684641f986..0d915fb747fa2f3995e8d767265804bce4ef26b2 100644 (file)
  */
 package org.sonar.scanner.scan.filesystem;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-
 import java.io.File;
 import java.io.IOException;
-
+import java.nio.file.Path;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
-import org.sonar.api.scan.filesystem.PathResolver;
-import org.sonar.api.utils.TempFolder;
+import org.sonar.api.batch.fs.internal.DefaultInputModule;
+import org.sonar.api.utils.log.LogTester;
+import org.sonar.api.utils.log.LoggerLevel;
+
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class ModuleFileSystemInitializerTest {
 
   @Rule
   public TemporaryFolder temp = new TemporaryFolder();
 
-  PathResolver pathResolver = new PathResolver();
+  @Rule
+  public LogTester logTester = new LogTester();
 
   @Test
   public void test_default_directories() throws Exception {
@@ -47,10 +48,10 @@ public class ModuleFileSystemInitializerTest {
     File workDir = temp.newFolder("work");
     ProjectDefinition module = ProjectDefinition.create().setBaseDir(baseDir).setWorkDir(workDir);
 
-    ModuleFileSystemInitializer initializer = new ModuleFileSystemInitializer(module, mock(TempFolder.class), pathResolver);
+    ModuleFileSystemInitializer initializer = new ModuleFileSystemInitializer(new DefaultInputModule(module), module);
 
-    assertThat(initializer.baseDir().getCanonicalPath()).isEqualTo(baseDir.getCanonicalPath());
-    assertThat(initializer.workingDir().getCanonicalPath()).isEqualTo(workDir.getCanonicalPath());
+    assertThat(logTester.logs(LoggerLevel.INFO)).contains("Base dir: " + baseDir.toPath().toAbsolutePath().toString());
+    assertThat(logTester.logs(LoggerLevel.INFO)).contains("Working dir: " + workDir.toPath().toAbsolutePath().toString());
     assertThat(initializer.sources()).isEmpty();
     assertThat(initializer.tests()).isEmpty();
   }
@@ -58,6 +59,7 @@ public class ModuleFileSystemInitializerTest {
   @Test
   public void should_init_directories() throws IOException {
     File baseDir = temp.newFolder("base");
+    File workDir = temp.newFolder("work");
     File sourceDir = new File(baseDir, "src/main/java");
     FileUtils.forceMkdir(sourceDir);
     File testDir = new File(baseDir, "src/test/java");
@@ -67,12 +69,12 @@ public class ModuleFileSystemInitializerTest {
 
     ProjectDefinition project = ProjectDefinition.create()
       .setBaseDir(baseDir)
+      .setWorkDir(workDir)
       .addSources("src/main/java", "src/main/unknown")
       .addTests("src/test/java", "src/test/unknown");
 
-    ModuleFileSystemInitializer initializer = new ModuleFileSystemInitializer(project, mock(TempFolder.class), pathResolver);
+    ModuleFileSystemInitializer initializer = new ModuleFileSystemInitializer(new DefaultInputModule(project), project);
 
-    assertThat(initializer.baseDir().getCanonicalPath()).isEqualTo(baseDir.getCanonicalPath());
     assertThat(initializer.sources()).hasSize(1);
     assertThat(path(initializer.sources().get(0))).endsWith("src/main/java");
     assertThat(initializer.tests()).hasSize(1);
@@ -82,6 +84,7 @@ public class ModuleFileSystemInitializerTest {
   @Test
   public void supportFilenamesWithComma() throws IOException {
     File baseDir = temp.newFolder("base");
+    File workDir = temp.newFolder("work");
     File sourceFile = new File(baseDir, "my,File.cs");
     sourceFile.createNewFile();
     File testFile = new File(baseDir, "my,TestFile.cs");
@@ -89,20 +92,20 @@ public class ModuleFileSystemInitializerTest {
 
     ProjectDefinition project = ProjectDefinition.create()
       .setBaseDir(baseDir)
+      .setWorkDir(workDir)
       .addSources("\"my,File.cs\"")
       .addTests("\"my,TestFile.cs\"");
 
-    ModuleFileSystemInitializer initializer = new ModuleFileSystemInitializer(project, mock(TempFolder.class), pathResolver);
+    ModuleFileSystemInitializer initializer = new ModuleFileSystemInitializer(new DefaultInputModule(project), project);
 
-    assertThat(initializer.baseDir().getCanonicalPath()).isEqualTo(baseDir.getCanonicalPath());
     assertThat(initializer.sources()).hasSize(1);
-    assertThat(initializer.sources().get(0)).isEqualTo(sourceFile);
+    assertThat(initializer.sources().get(0)).isEqualTo(sourceFile.toPath());
     assertThat(initializer.tests()).hasSize(1);
-    assertThat(initializer.tests().get(0)).isEqualTo(testFile);
+    assertThat(initializer.tests().get(0)).isEqualTo(testFile.toPath());
   }
 
-  private String path(File f) throws IOException {
-    return FilenameUtils.separatorsToUnix(f.getCanonicalPath());
+  private String path(Path f) throws IOException {
+    return FilenameUtils.separatorsToUnix(f.toString());
   }
 
 }
index 42d4c443c72b9da5f35fd593d597e3b9bea1ede9..65af751088f023e10bf0089369f7e32189c9e375 100644 (file)
  */
 package org.sonar.scanner.scan.report;
 
-import static net.javacrumbs.jsonunit.assertj.JsonAssert.assertThatJson;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.StringWriter;
@@ -32,7 +26,6 @@ import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.TimeZone;
-
 import org.apache.commons.io.IOUtils;
 import org.junit.Before;
 import org.junit.Rule;
@@ -58,6 +51,12 @@ import org.sonar.scanner.issue.tracking.TrackedIssue;
 import org.sonar.scanner.scan.DefaultComponentTree;
 import org.sonar.scanner.scan.filesystem.InputComponentStore;
 
+import static net.javacrumbs.jsonunit.assertj.JsonAssert.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
 public class JSONReportTest {
 
   private SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
@@ -82,13 +81,13 @@ public class JSONReportTest {
     when(server.getVersion()).thenReturn("3.6");
 
     DefaultComponentTree inputComponentTree = new DefaultComponentTree();
-    ProjectDefinition def = ProjectDefinition.create().setBaseDir(projectBaseDir).setKey("struts");
+    ProjectDefinition def = ProjectDefinition.create().setBaseDir(projectBaseDir).setWorkDir(temp.newFolder()).setKey("struts");
     DefaultInputModule rootModule = new DefaultInputModule(def, 1);
     InputComponentStore inputComponentStore = new InputComponentStore(new PathResolver(), rootModule);
 
-    DefaultInputModule moduleA = new DefaultInputModule("struts-core");
+    DefaultInputModule moduleA = new DefaultInputModule(ProjectDefinition.create().setKey("struts-core").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     inputComponentTree.index(moduleA, rootModule);
-    DefaultInputModule moduleB = new DefaultInputModule("struts-ui");
+    DefaultInputModule moduleB = new DefaultInputModule(ProjectDefinition.create().setKey("struts-ui").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
     inputComponentTree.index(moduleB, rootModule);
 
     DefaultInputDir inputDir = new DefaultInputDir("struts", "src/main/java/org/apache/struts", TestInputFileBuilder.nextBatchId())
@@ -163,7 +162,7 @@ public class JSONReportTest {
   @Test
   public void should_not_export_by_default() throws IOException {
     File workDir = temp.newFolder("sonar");
-    fs.setWorkDir(workDir);
+    fs.setWorkDir(workDir.toPath());
 
     jsonReport.execute();
 
@@ -173,7 +172,7 @@ public class JSONReportTest {
   @Test
   public void should_export_issues_to_file() throws IOException {
     File workDir = temp.newFolder("sonar");
-    fs.setWorkDir(workDir);
+    fs.setWorkDir(workDir.toPath());
 
     when(issueCache.all()).thenReturn(Collections.<TrackedIssue>emptyList());
 
index 2c375606ae95a2f07b7a166da27c3d6d4e9a28d6..11101d722ef4ad4e79aaf151cffc1cf221eb692b 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.scanner.sensor;
 
 import com.google.common.collect.ImmutableMap;
+import java.io.IOException;
 import java.util.Map;
 import org.junit.Before;
 import org.junit.Rule;
@@ -27,6 +28,7 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
 import org.mockito.ArgumentCaptor;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
@@ -114,9 +116,9 @@ public class DefaultSensorStorageTest {
   }
 
   @Test
-  public void shouldSaveProjectMeasureToSensorContext() {
+  public void shouldSaveProjectMeasureToSensorContext() throws IOException {
     String projectKey = "myProject";
-    DefaultInputModule module = new DefaultInputModule(projectKey);
+    DefaultInputModule module = new DefaultInputModule(ProjectDefinition.create().setKey(projectKey).setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()));
 
     ArgumentCaptor<DefaultMeasure> argumentCaptor = ArgumentCaptor.forClass(DefaultMeasure.class);
     when(measureCache.put(eq(module.key()), eq(CoreMetrics.NCLOC_KEY), argumentCaptor.capture())).thenReturn(null);
index dea24cd457103c03d4f44436e5866013886dccc6..c22963136d89b993bfe098af8bc17a38a4e353f3 100644 (file)
  */
 package org.sonar.scanner.source;
 
+import java.io.IOException;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.AnalysisMode;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
 import org.sonar.api.batch.sensor.internal.SensorStorage;
@@ -31,6 +35,9 @@ import static org.mockito.Mockito.mock;
 
 public class HighlightableBuilderTest {
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   @Test
   public void should_load_default_perspective() {
     HighlightableBuilder builder = new HighlightableBuilder(mock(SensorStorage.class), mock(AnalysisMode.class));
@@ -40,9 +47,10 @@ public class HighlightableBuilderTest {
   }
 
   @Test
-  public void project_should_not_be_highlightable() {
+  public void project_should_not_be_highlightable() throws IOException {
     HighlightableBuilder builder = new HighlightableBuilder(mock(SensorStorage.class), mock(AnalysisMode.class));
-    Highlightable perspective = builder.loadPerspective(Highlightable.class, new DefaultInputModule("struts"));
+    Highlightable perspective = builder.loadPerspective(Highlightable.class,
+      new DefaultInputModule(ProjectDefinition.create().setKey("struts").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())));
 
     assertThat(perspective).isNull();
   }
index e6531257a2a92297cbb87cd9d99e42a5f11ba73b..0b202db20855a6fac0ff59bcc6073df840451917 100644 (file)
  */
 package org.sonar.scanner.source;
 
+import java.io.IOException;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.AnalysisMode;
+import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.batch.fs.internal.DefaultInputModule;
 import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
 import org.sonar.api.component.Perspective;
@@ -32,6 +36,9 @@ import static org.mockito.Mockito.mock;
 
 public class SymbolizableBuilderTest {
 
+  @Rule
+  public TemporaryFolder temp = new TemporaryFolder();
+
   @Test
   public void should_load_perspective() {
     SymbolizableBuilder perspectiveBuilder = new SymbolizableBuilder(mock(DefaultSensorStorage.class), mock(AnalysisMode.class));
@@ -41,9 +48,10 @@ public class SymbolizableBuilderTest {
   }
 
   @Test
-  public void project_should_not_be_highlightable() {
+  public void project_should_not_be_highlightable() throws IOException {
     SymbolizableBuilder builder = new SymbolizableBuilder(mock(DefaultSensorStorage.class), mock(AnalysisMode.class));
-    Perspective perspective = builder.loadPerspective(Symbolizable.class, new DefaultInputModule("struts"));
+    Perspective perspective = builder.loadPerspective(Symbolizable.class,
+      new DefaultInputModule(ProjectDefinition.create().setKey("struts").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())));
 
     assertThat(perspective).isNull();
   }
index 9ce6547ff5230ee06532e54cf8265c3d3a895f38..a47964f50b3ef4a145748e9d1584634ebf399174 100644 (file)
@@ -23,9 +23,7 @@ import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
-
 import javax.annotation.concurrent.Immutable;
-
 import org.sonar.core.util.ContextException;
 import org.sonar.core.util.Protobuf;