@CheckForNull private SourceHashHolder loadSourceHashes(InputComponent component) { SourceHashHolder sourceHashHolder = null; if (component.isFile()) { DefaultInputFile file = (DefaultInputFile) component; sourceHashHolder = new SourceHashHolder(project, file, lastLineHashes); } return sourceHashHolder; }
public List<TrackedIssue> trackIssues(InputComponent component, Collection<ScannerReport.Issue> reportIssues, Date analysisDate) { List<TrackedIssue> trackedIssues = new LinkedList<>(); if (hasServerAnalysis) { // all the issues that are not closed in db before starting this module scan, including manual issues Collection<ServerIssueFromWs> serverIssues = loadServerIssues(component); if (shouldCopyServerIssues(component)) { // raw issues should be empty, we just need to deal with server issues (SONAR-6931) copyServerIssues(serverIssues, trackedIssues, component.key()); } else { SourceHashHolder sourceHashHolder = loadSourceHashes(component); Collection<TrackedIssue> rIssues = IssueTransformer.toTrackedIssue(component, reportIssues, sourceHashHolder); Input<ServerIssueFromWs> baseIssues = createBaseInput(serverIssues, sourceHashHolder); Input<TrackedIssue> rawIssues = createRawInput(rIssues, sourceHashHolder); Tracking<TrackedIssue, ServerIssueFromWs> track = tracker.trackNonClosed(rawIssues, baseIssues); addUnmatchedFromServer(track.getUnmatchedBases(), trackedIssues, component.key()); mergeMatched(track, trackedIssues, rIssues); addUnmatchedFromReport(track.getUnmatchedRaws(), trackedIssues, analysisDate); } } if (hasServerAnalysis && !component.isFile()) { Preconditions.checkState(component instanceof InputModule, "Object without parent is of type: " + component.getClass()); // issues that relate to deleted components addIssuesOnDeletedComponents(trackedIssues, component.key()); } return trackedIssues; }
@Override public String componentKey() { return component.key(); }
@Before public void setUp() { mockedProject = mock(DefaultInputProject.class); projectAnalysisInfo = mock(ProjectAnalysisInfo.class); component = mock(InputComponent.class); when(component.key()).thenReturn("foo"); }
@Override public DefaultIssueLocation at(TextRange location) { Preconditions.checkState(this.component != null, "at() should be called after on()"); Preconditions.checkState(this.component.isFile(), "at() should be called only for an InputFile."); DefaultInputFile file = (DefaultInputFile) this.component; file.validate(location); this.textRange = location; return this; }
private void saveMeasure(InputComponent component, DefaultMeasure<?> measure) { if (component.isFile()) { DefaultInputFile defaultInputFile = (DefaultInputFile) component; defaultInputFile.setPublished(true); logOnce(metric.key(), "Coverage measure for metric '{}' should not be saved directly by a Sensor. Plugin should be updated to use SensorContext::newCoverage instead.", metric.key()); if (!component.isFile()) { throw new UnsupportedOperationException("Saving coverage measure is only allowed on files. Attempt to save '" + metric.key() + "' on '" + component.key() + "'"); if (measureCache.contains(component.key(), metric.key())) { throw new UnsupportedOperationException("Can not add the same measure twice on " + component + ": " + measure); measureCache.put(component.key(), metric.key(), measureToSave);
@Override public void store(Measure measure) { // Emulate duplicate measure check String componentKey = measure.inputComponent().key(); String metricKey = measure.metric().key(); if (measuresByComponentAndMetric.contains(componentKey, metricKey)) { throw new IllegalStateException("Can not add the same measure twice"); } measuresByComponentAndMetric.row(componentKey).put(metricKey, measure); }
@Override public void doSave() { requireNonNull(this.engineId, "Engine id is mandatory on external issue"); requireNonNull(this.ruleId, "Rule id is mandatory on external issue"); checkState(primaryLocation != null, "Primary location is mandatory on every external issue"); checkState(primaryLocation.inputComponent().isFile(), "External issues must be located in files"); checkState(primaryLocation.message() != null, "External issues must have a message"); checkState(severity != null, "Severity is mandatory on every external issue"); checkState(type != null, "Type is mandatory on every external issue"); storage.store(this); }
public List<TrackedIssue> trackIssues(InputComponent component, Collection<ScannerReport.Issue> reportIssues, Date analysisDate) { List<TrackedIssue> trackedIssues = new LinkedList<>(); if (hasServerAnalysis) { // all the issues that are not closed in db before starting this module scan, including manual issues Collection<ServerIssueFromWs> serverIssues = loadServerIssues(component); if (shouldCopyServerIssues(component)) { // raw issues should be empty, we just need to deal with server issues (SONAR-6931) copyServerIssues(serverIssues, trackedIssues, component.key()); } else { SourceHashHolder sourceHashHolder = loadSourceHashes(component); Collection<TrackedIssue> rIssues = IssueTransformer.toTrackedIssue(component, reportIssues, sourceHashHolder); Input<ServerIssueFromWs> baseIssues = createBaseInput(serverIssues, sourceHashHolder); Input<TrackedIssue> rawIssues = createRawInput(rIssues, sourceHashHolder); Tracking<TrackedIssue, ServerIssueFromWs> track = tracker.trackNonClosed(rawIssues, baseIssues); addUnmatchedFromServer(track.getUnmatchedBases(), trackedIssues, component.key()); mergeMatched(track, trackedIssues, rIssues); addUnmatchedFromReport(track.getUnmatchedRaws(), trackedIssues, analysisDate); } } if (hasServerAnalysis && !component.isFile()) { Preconditions.checkState(component instanceof InputModule, "Object without parent is of type: " + component.getClass()); // issues that relate to deleted components addIssuesOnDeletedComponents(trackedIssues, component.key()); } return trackedIssues; }
private DefaultIssueLocation rewriteLocation(DefaultIssueLocation location) { InputComponent component = location.inputComponent(); Optional<Path> dirOrModulePath = Optional.empty(); if (component instanceof DefaultInputDir) { DefaultInputDir dirComponent = (DefaultInputDir) component; dirOrModulePath = Optional.of(project.getBaseDir().relativize(dirComponent.path())); } else if (component instanceof DefaultInputModule && !Objects.equals(project.key(), component.key())) { DefaultInputModule moduleComponent = (DefaultInputModule) component; dirOrModulePath = Optional.of(project.getBaseDir().relativize(moduleComponent.getBaseDir())); } if (dirOrModulePath.isPresent()) { String path = PathUtils.sanitize(dirOrModulePath.get().toString()); DefaultIssueLocation fixedLocation = new DefaultIssueLocation(); fixedLocation.on(project); StringBuilder fullMessage = new StringBuilder(); if (!isNullOrEmpty(path)) { fullMessage.append("[").append(path).append("] "); } fullMessage.append(location.message()); fixedLocation.message(fullMessage.toString()); return fixedLocation; } else { return location; } } }
@CheckForNull @Override public MutableTestable loadPerspective(Class<MutableTestable> perspectiveClass, InputComponent component) { if (component.isFile()) { InputFile inputFile = (InputFile) component; if (inputFile.type() == Type.MAIN) { return new DefaultTestable((DefaultInputFile) inputFile); } } return null; } }
private void saveMeasure(InputComponent component, DefaultMeasure<?> measure) { if (component.isFile()) { DefaultInputFile defaultInputFile = (DefaultInputFile) component; defaultInputFile.setPublished(true); logOnce(metric.key(), "Coverage measure for metric '{}' should not be saved directly by a Sensor. Plugin should be updated to use SensorContext::newCoverage instead.", metric.key()); if (!component.isFile()) { throw new UnsupportedOperationException("Saving coverage measure is only allowed on files. Attempt to save '" + metric.key() + "' on '" + component.key() + "'"); if (measureCache.contains(component.key(), metric.key())) { throw new UnsupportedOperationException("Can not add the same measure twice on " + component + ": " + measure); measureCache.put(component.key(), metric.key(), measureToSave);
public static TrackedIssue toTrackedIssue(InputComponent component, ScannerReport.Issue rawIssue, @Nullable SourceHashHolder hashes) { RuleKey ruleKey = RuleKey.of(rawIssue.getRuleRepository(), rawIssue.getRuleKey()); Preconditions.checkNotNull(component.key(), "Component key must be set"); Preconditions.checkNotNull(ruleKey, "Rule key must be set"); TrackedIssue issue = new TrackedIssue(hashes != null ? hashes.getHashedSource() : null); issue.setKey(Uuids.createFast()); issue.setComponentKey(component.key()); issue.setRuleKey(ruleKey); issue.setGap(rawIssue.getGap() != 0 ? rawIssue.getGap() : null); issue.setSeverity(rawIssue.getSeverity().name()); issue.setMessage(StringUtils.trimToNull(rawIssue.getMsg())); issue.setResolution(null); issue.setStatus(Issue.STATUS_OPEN); issue.setNew(true); if (rawIssue.hasTextRange()) { TextRange r = rawIssue.getTextRange(); issue.setStartLine(r.getStartLine()); issue.setStartLineOffset(r.getStartOffset()); issue.setEndLine(r.getEndLine()); issue.setEndLineOffset(r.getEndOffset()); } return issue; }
private boolean shouldCopyServerIssues(InputComponent component) { if (!mode.scanAllFiles() && component.isFile()) { InputFile inputFile = (InputFile) component; if (inputFile.status() == Status.SAME) { return true; } } return false; }
if (!component.key().equals(componentKey)) { DefaultInputComponent sameProjectComponent = (DefaultInputComponent) componentStore.getByKey(componentKey); blockBuilder.setOtherFileRef(sameProjectComponent.scannerId());
@CheckForNull @Override public MutableTestPlan loadPerspective(Class<MutableTestPlan> perspectiveClass, InputComponent component) { if (component.isFile()) { DefaultInputFile inputFile = (DefaultInputFile) component; if (inputFile.type() == Type.TEST) { inputFile.setPublished(true); if (!testPlanByFile.containsKey(inputFile)) { testPlanByFile.put(inputFile, new DefaultTestPlan()); } return testPlanByFile.get(inputFile); } } return null; }
@Override public String componentKey() { return inputComponent.key(); }
@Override public boolean accept(FilterableIssue issue, IssueFilterChain chain) { InputComponent component = ((DefaultFilterableIssue) issue).getComponent(); if (component.isFile() && ((DefaultInputFile) component).isIgnoreAllIssues()) { return false; } if (component.isFile() && ((DefaultInputFile) component).isIgnoreAllIssuesOnLine(issue.line())) { return false; } if (hasRuleMatchFor(component, issue)) { return false; } return chain.accept(issue); }
@Override public String componentKey() { return component.key(); }
atLeastOneRuleMatched = true; InputComponent component = ((DefaultFilterableIssue) issue).getComponent(); if (component.isFile()) { DefaultInputFile file = (DefaultInputFile) component; if (pattern.matchFile(file.getProjectRelativePath())) {