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
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();
}
}
*/
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;
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();
assertThat(structure.fileFor(FileStructure.Domain.ISSUES, 3)).exists().isFile();
assertThat(structure.fileFor(FileStructure.Domain.ISSUES, 42)).doesNotExist();
}
+
}