import org.sonar.api.batch.Event;
import org.sonar.api.batch.SonarIndex;
import org.sonar.api.database.model.ResourceModel;
-import org.sonar.api.database.model.RuleFailureModel;
import org.sonar.api.design.Dependency;
import org.sonar.api.measures.*;
import org.sonar.api.profiles.RulesProfile;
private Set<Dependency> dependencies = Sets.newHashSet();
private Map<Resource, Map<Resource, Dependency>> outgoingDependenciesByResource = Maps.newHashMap();
private Map<Resource, Map<Resource, Dependency>> incomingDependenciesByResource = Maps.newHashMap();
- private Map<Resource, List<RuleFailureModel>> violationsByResource = Maps.newHashMap();
private ProjectTree projectTree;
public DefaultIndex(PersistenceManager persistence, DefaultResourceCreationLock lock, ProjectTree projectTree, MetricFinder metricFinder) {
if (!StringUtils.equals(Resource.SCOPE_SET, resource.getScope())) {
// not a project nor a library
effectiveKey = new StringBuilder(ResourceModel.KEY_SIZE)
- .append(project.getKey())
- .append(':')
- .append(resource.getKey())
- .toString();
+ .append(project.getKey())
+ .append(':')
+ .append(resource.getKey())
+ .toString();
}
return effectiveKey;
}
}
private void doAddViolation(Violation violation, Bucket bucket) {
- Resource resource = violation.getResource();
- if (!violationsByResource.containsKey(resource)) {
- violationsByResource.put(resource, persistence.loadPreviousViolations(resource));
- }
- RuleFailureModel found = null;
- List<RuleFailureModel> pastViolations = violationsByResource.get(resource);
- for (RuleFailureModel pastViolation : pastViolations) {
- // TODO Compare pastViolation to violation
- if (pastViolation.getLine() == violation.getLineId() && StringUtils.equals(pastViolation.getMessage(), violation.getMessage())) {
- found = pastViolation;
- break;
- }
- }
bucket.addViolation(violation);
- persistence.saveOrUpdateViolation(currentProject, violation, found);
+ persistence.saveViolation(currentProject, violation);
}
//
package org.sonar.batch.index;
import org.sonar.api.batch.Event;
-import org.sonar.api.database.model.RuleFailureModel;
import org.sonar.api.database.model.Snapshot;
import org.sonar.api.design.Dependency;
import org.sonar.api.measures.Measure;
dependencyPersister.saveDependency(project, dependency, parentDependency);
}
- public List<RuleFailureModel> loadPreviousViolations(Resource resource) {
- return violationPersister.getPreviousViolations(resource);
- }
-
- public void saveOrUpdateViolation(Project project, Violation violation, RuleFailureModel oldModel) {
- violationPersister.saveOrUpdateViolation(project, violation, oldModel);
+ public void saveViolation(Project project, Violation violation) {
+ violationPersister.saveViolation(project, violation);
}
public void saveLink(Project project, ProjectLink link) {
package org.sonar.batch.index;
import org.sonar.api.batch.Event;
-import org.sonar.api.database.model.RuleFailureModel;
import org.sonar.api.database.model.Snapshot;
import org.sonar.api.design.Dependency;
import org.sonar.api.measures.Measure;
void saveDependency(Project project, Dependency dependency, Dependency parentDependency);
- List<RuleFailureModel> loadPreviousViolations(Resource resource);
-
- void saveOrUpdateViolation(Project project, Violation violation, RuleFailureModel oldModel);
+ void saveViolation(Project project, Violation violation);
void saveLink(Project project, ProjectLink link);
private DatabaseSession session;
private ResourcePersister resourcePersister;
- private RuleFinder ruleFinder;
+ private RuleFinder ruleFinder;
public ViolationPersister(DatabaseSession session, ResourcePersister resourcePersister, RuleFinder ruleFinder) {
this.session = session;
return session.getResults(RuleFailureModel.class, "snapshotId", previousLastSnapshot.getId());
}
+ public void saveViolation(Project project, Violation violation) {
+ saveOrUpdateViolation(project, violation, null);
+ }
+
public void saveOrUpdateViolation(Project project, Violation violation, RuleFailureModel oldModel) {
Snapshot snapshot = resourcePersister.saveResource(project, violation.getResource());
- if (snapshot == null) {
- return; // TODO Godin why ? when?
- }
RuleFailureModel model;
if (oldModel != null) {
// update
/**
* Barriers are used to define the order of execution of Decorators.
- *
+ *
* @since 2.3
*/
public interface DecoratorBarriers {
-
String START_VIOLATIONS_GENERATION = "START_VIOLATIONS_GENERATION";
/**
* This barrier is used by a decorator in order to :
* <ul>
- * <li>be executed after all the decorators which generate violations : <code>@DependsUpon(value=DecoratorBarriers.END_OF_VIOLATIONS_GENERATION</code></li>
+ * <li>be executed after all the decorators which generate violations :
+ * <code>@DependsUpon(value=DecoratorBarriers.END_OF_VIOLATIONS_GENERATION</code></li>
* <li>declare that it generates violations : <code>@DependedUpon(value=DecoratorBarriers.END_OF_VIOLATIONS_GENERATION</code></li>
* </ul>
*/
/**
* Any kinds of time machine data are calculated before this barrier. Decorators executed after this barrier can use
- * Measure#getDiffValueX() and Measure#getTendency() methods
+ * Measure#getDiffValueX() and Measure#getTendency() methods.
+ *
+ * @since 2.5
*/
String END_OF_TIME_MACHINE = "END_OF_TIME_MACHINE";
}