]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6941 Partition files of scanner report in different folders 852/head
authorJulien HENRY <julien.henry@sonarsource.com>
Fri, 18 Mar 2016 16:17:47 +0000 (17:17 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Fri, 18 Mar 2016 16:36:03 +0000 (17:36 +0100)
sonar-scanner-protocol/src/main/java/org/sonar/scanner/protocol/output/FileStructure.java
sonar-scanner-protocol/src/test/java/org/sonar/scanner/protocol/output/FileStructureTest.java

index c4d3197cb43a2c5a7911b6aa909b3c17bc94d504..551ed3ea4dc5a4d1d7ecec09c23e7d1be4f65509 100644 (file)
 package org.sonar.scanner.protocol.output;
 
 import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 /**
  * Structure of files in the zipped report
@@ -71,8 +75,30 @@ public class FileStructure {
     return new File(dir, "activerules.pb");
   }
 
+  /**
+   * Too many files in the same folder is a problem. We need to partition the report
+   * by putting component specific files in subdirectories.
+   * The partitionning algorithm is very basic:
+   *   - Breadth-first to not generate deep folder for small projects
+   *   - easy to understand
+   */
+  public static Path getSubDirFor(int componentRef) {
+    String componentRefAsStr = String.valueOf(componentRef);
+    Path result = Paths.get("");
+    for (char c : componentRefAsStr.toCharArray()) {
+      result = result.resolve(String.valueOf(c));
+    }
+    return result;
+  }
+
   public File fileFor(Domain domain, int componentRef) {
-    return new File(dir, domain.filePrefix + componentRef + domain.fileSuffix);
+    Path parent = dir.toPath().resolve(getSubDirFor(componentRef));
+    try {
+      Files.createDirectories(parent);
+    } catch (IOException e) {
+      throw new IllegalStateException("Unable to create subdirectory for component " + componentRef, e);
+    }
+    return parent.resolve(domain.filePrefix + componentRef + domain.fileSuffix).toFile();
   }
 
 }
index 69d5266cf50b849fdd9a7d8c1910a2d10c2ee198..2a0890bace8a1f4947dc7db82d3cf5066fec3af9 100644 (file)
  */
 package org.sonar.scanner.protocol.output;
 
+import java.io.File;
 import org.apache.commons.io.FileUtils;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
-import org.sonar.scanner.protocol.output.FileStructure;
-import java.io.File;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -62,8 +61,8 @@ public class FileStructureTest {
   public void locate_files() throws Exception {
     File dir = temp.newFolder();
     FileUtils.write(new File(dir, "metadata.pb"), "metadata content");
-    FileUtils.write(new File(dir, "issues-3.pb"), "issues of component 3");
-    FileUtils.write(new File(dir, "component-42.pb"), "details of component 42");
+    FileUtils.write(new File(dir, "3/issues-3.pb"), "issues of component 3");
+    FileUtils.write(new File(dir, "4/2/component-42.pb"), "details of component 42");
 
     FileStructure structure = new FileStructure(dir);
     assertThat(structure.metadataFile()).exists().isFile();
@@ -71,4 +70,5 @@ public class FileStructureTest {
     assertThat(structure.fileFor(FileStructure.Domain.ISSUES, 3)).exists().isFile();
     assertThat(structure.fileFor(FileStructure.Domain.ISSUES, 42)).doesNotExist();
   }
+
 }