private static void addFile(Node root, ScannerReport.Component file) { Preconditions.checkArgument(!StringUtils.isEmpty(file.getProjectRelativePath()), "Files should have a project relative path: " + file); String[] split = StringUtils.split(file.getProjectRelativePath(), '/'); Node currentNode = root; for (int i = 0; i < split.length; i++) { currentNode = currentNode.children().computeIfAbsent(split[i], k -> new Node()); } currentNode.reportComponent = file; }
/** * This should only be needed if we receive a report of the previous version without the path per module explicitly set * (due to blue/green deployment) * Can be removed in any future version */ private Map<String, String> collectModulesPathFromHierarchy(ScannerReport.Metadata metadata) { ScannerReport.Component root = reader.readComponent(metadata.getRootComponentRef()); Map<String, String> modulesPathByKey = new LinkedHashMap<>(); LinkedList<Integer> queue = new LinkedList<>(); queue.addAll(root.getChildRefList()); while (!queue.isEmpty()) { ScannerReport.Component component = reader.readComponent(queue.removeFirst()); if (component.getType() == ScannerReport.Component.ComponentType.MODULE) { queue.addAll(component.getChildRefList()); modulesPathByKey.put(component.getKey(), component.getProjectRelativePath()); } } return modulesPathByKey; }
@Test public void branch_represents_a_forked_project_with_different_key() { DefaultBranchImpl branch = new DefaultBranchImpl("bar"); // not a real branch. Parameter sonar.branch forks project. assertThat(branch.isMain()).isTrue(); assertThat(branch.getType()).isEqualTo(BranchType.LONG); assertThat(branch.getName()).isEqualTo("bar"); assertThat(branch.supportsCrossProjectCpd()).isFalse(); assertThat(branch.generateKey(PROJECT_KEY, null)).isEqualTo("P:bar"); assertThat(branch.generateKey(PROJECT_KEY, FILE.getProjectRelativePath())).isEqualTo("P:bar:src/Foo.js"); }
private static String getNodeName(Component component) { switch (component.getType()) { case PROJECT: case MODULE: return component.getName(); case DIRECTORY: case FILE: return component.getProjectRelativePath(); default: throw new IllegalArgumentException("Unknow component type: " + component.getType()); } }
private static ReportAttributes.Builder createAttributesBuilder(ScannerReport.Component component, @Nullable String scmBasePath) { return ReportAttributes.newBuilder(component.getRef()) .setVersion(trimToNull(component.getVersion())) .setPath(trimToNull(component.getPath())) .setScmPath(computeScmPath(scmBasePath, component.getProjectRelativePath())); }
@Test public void scanMultiModuleWithBranch() throws IOException { Path srcDir = baseDir.toPath().resolve("moduleA").resolve("src"); Files.createDirectories(srcDir); File xooFile = new File(srcDir.toFile(), "sample.xoo"); FileUtils.write(xooFile, "Sample xoo\ncontent"); AnalysisResult result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "branch") .put("sonar.modules", "moduleA") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("moduleA/src/sample.xoo").key()).isEqualTo("com.foo.project:moduleA/src/sample.xoo"); // no branch in the report DefaultInputFile inputfile = (DefaultInputFile) result.inputFile("moduleA/src/sample.xoo"); assertThat(result.getReportReader().readComponent(inputfile.scannerId()).getProjectRelativePath()).isEqualTo("moduleA/src/sample.xoo"); assertThat(result.getReportReader().readMetadata().getDeprecatedBranch()).isEqualTo("branch"); result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "") .put("sonar.modules", "moduleA") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("moduleA/src/sample.xoo").key()).isEqualTo("com.foo.project:moduleA/src/sample.xoo"); }
@Test public void scanProjectWithBranch() throws IOException { File srcDir = new File(baseDir, "src"); srcDir.mkdir(); File xooFile = new File(srcDir, "sample.xoo"); FileUtils.write(xooFile, "Sample xoo\ncontent"); AnalysisResult result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "branch") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("src/sample.xoo").key()).isEqualTo("com.foo.project:src/sample.xoo"); DefaultInputFile inputfile = (DefaultInputFile) result.inputFile("src/sample.xoo"); assertThat(result.getReportReader().readComponent(inputfile.scannerId()).getProjectRelativePath()).isEqualTo("src/sample.xoo"); assertThat(result.getReportReader().readMetadata().getDeprecatedBranch()).isEqualTo("branch"); result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("src/sample.xoo").key()).isEqualTo("com.foo.project:src/sample.xoo"); }
private ComponentImpl buildFile(ScannerReport.Component component) { String key = keyGenerator.generateKey(rootComponent.getKey(), component.getProjectRelativePath()); String publicKey = publicKeyGenerator.generateKey(rootComponent.getKey(), component.getProjectRelativePath()); return ComponentImpl.builder(Component.Type.FILE) .setUuid(uuidSupplier.apply(key)) .setDbKey(key) .setKey(publicKey) .setName(component.getProjectRelativePath()) .setShortName(FilenameUtils.getName(component.getProjectRelativePath())) .setStatus(convertStatus(component.getStatus())) .setDescription(trimToNull(component.getDescription())) .setReportAttributes(createAttributesBuilder(component.getRef(), component.getProjectRelativePath(), scmBasePath).build()) .setFileAttributes(createFileAttributes(component)) .build(); }
private Component buildProject(List<Component> children) { String projectKey = keyGenerator.generateKey(rootComponent.getKey(), null); String uuid = uuidSupplier.apply(projectKey); String projectPublicKey = publicKeyGenerator.generateKey(rootComponent.getKey(), null); ComponentImpl.Builder builder = ComponentImpl.builder(Component.Type.PROJECT) .setUuid(uuid) .setDbKey(projectKey) .setKey(projectPublicKey) .setStatus(convertStatus(rootComponent.getStatus())) .setProjectAttributes(new ProjectAttributes(createProjectVersion(rootComponent))) .setReportAttributes(createAttributesBuilder(rootComponent.getRef(), rootComponent.getProjectRelativePath(), scmBasePath).build()) .addChildren(children); setNameAndDescription(rootComponent, builder); return builder.build(); }
private ScannerReport.Changesets getChangesets(File baseDir, String path) { File reportDir = new File(baseDir, ".sonar/scanner-report"); ScannerReportReader reader = new ScannerReportReader(reportDir); Component project = reader.readComponent(reader.readMetadata().getRootComponentRef()); for (Integer fileRef : project.getChildRefList()) { Component file = reader.readComponent(fileRef); if (file.getProjectRelativePath().equals(path)) { return reader.readChangesets(file.getRef()); } } return null; }
@Test public void read_components() { ScannerReportWriter writer = new ScannerReportWriter(dir); ScannerReport.Component.Builder component = ScannerReport.Component.newBuilder() .setRef(1) .setProjectRelativePath("src/main/java/Foo.java"); writer.writeComponent(component.build()); assertThat(underTest.readComponent(1).getProjectRelativePath()).isEqualTo("src/main/java/Foo.java"); }
private static FileAttributes createFileAttributes(ScannerReport.Component component) { checkArgument(component.getType() == ScannerReport.Component.ComponentType.FILE); checkArgument(component.getLines() > 0, "File '%s' has no line", component.getProjectRelativePath()); return new FileAttributes( component.getIsTest(), trimToNull(component.getLanguage()), component.getLines()); }
@Test public void default_branch_represents_the_project() { DefaultBranchImpl branch = new DefaultBranchImpl(); assertThat(branch.isMain()).isTrue(); assertThat(branch.getType()).isEqualTo(BranchType.LONG); assertThat(branch.getName()).isEqualTo(BranchDto.DEFAULT_MAIN_BRANCH_NAME); assertThat(branch.supportsCrossProjectCpd()).isTrue(); assertThat(branch.generateKey(PROJECT_KEY, null)).isEqualTo("P"); assertThat(branch.generateKey(PROJECT_KEY, FILE.getProjectRelativePath())).isEqualTo("P:src/Foo.js"); }
private static ScannerReport.IssueLocation moveLocation(ScannerReport.Component root, ScannerReport.Component component, ScannerReport.IssueLocation location) { String msg = "[" + component.getProjectRelativePath() + "] " + location.getMsg(); return ScannerReport.IssueLocation.newBuilder() .setComponentRef(root.getRef()) .setMsg(msg) .build(); }
private static String getNodeName(Component component) { switch (component.getType()) { case PROJECT: case MODULE: return component.getName(); case DIRECTORY: case FILE: return component.getProjectRelativePath(); default: throw new IllegalArgumentException("Unknow component type: " + component.getType()); } }