package org.sonar.server.computation.step;
import com.google.common.base.Function;
-import com.google.common.collect.Lists;
import java.util.List;
import javax.annotation.Nonnull;
import org.sonar.api.utils.System2;
-import org.sonar.batch.protocol.Constants;
import org.sonar.batch.protocol.output.BatchReport;
import org.sonar.core.event.EventDto;
import org.sonar.core.persistence.DbSession;
import org.sonar.server.computation.component.Component;
import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor;
import org.sonar.server.computation.component.TreeRootHolder;
+import org.sonar.server.computation.event.Event;
+import org.sonar.server.computation.event.EventRepository;
import org.sonar.server.db.DbClient;
import static com.google.common.collect.Iterables.transform;
private final System2 system2;
private final BatchReportReader reportReader;
private final TreeRootHolder treeRootHolder;
+ private final EventRepository eventRepository;
- public PersistEventsStep(DbClient dbClient, System2 system2, TreeRootHolder treeRootHolder, BatchReportReader reportReader) {
+ public PersistEventsStep(DbClient dbClient, System2 system2, TreeRootHolder treeRootHolder, BatchReportReader reportReader,
+ EventRepository eventRepository) {
this.dbClient = dbClient;
this.system2 = system2;
this.treeRootHolder = treeRootHolder;
this.reportReader = reportReader;
+ this.eventRepository = eventRepository;
}
@Override
public void execute() {
final DbSession session = dbClient.openSession(false);
try {
- final long analysisDate = reportReader.readMetadata().getAnalysisDate();
- new DepthTraversalTypeAwareVisitor(Component.Type.FILE, DepthTraversalTypeAwareVisitor.Order.PRE_ORDER) {
- @Override
- public void visitProject(Component project) {
- processComponent(project, session, analysisDate);
- }
-
- @Override
- public void visitModule(Component module) {
- processComponent(module, session, analysisDate);
- }
-
- @Override
- public void visitDirectory(Component directory) {
- processComponent(directory, session, analysisDate);
- }
-
- @Override
- public void visitFile(Component file) {
- processComponent(file, session, analysisDate);
- }
- }.visit(treeRootHolder.getRoot());
+ long analysisDate = reportReader.readMetadata().getAnalysisDate();
+ new PersistEventComponentVisitor(session, analysisDate).visit(treeRootHolder.getRoot());
session.commit();
} finally {
MyBatis.closeQuietly(session);
}
private void processEvents(DbSession session, final BatchReport.Component batchComponent, final Component component, final Long analysisDate) {
- List<BatchReport.Event> events = batchComponent.getEventList();
+ final List<BatchReport.Event> events = batchComponent.getEventList();
if (events.isEmpty()) {
return;
}
- List<EventDto> batchEventDtos = Lists.newArrayList(transform(events, new Function<BatchReport.Event, EventDto>() {
+ Function<Event, EventDto> eventToEventDto = new Function<Event, EventDto>() {
@Override
- public EventDto apply(@Nonnull BatchReport.Event event) {
+ public EventDto apply(@Nonnull Event event) {
return newBaseEvent(batchComponent, component, analysisDate)
.setName(event.getName())
.setCategory(convertCategory(event.getCategory()))
- .setDescription(event.hasDescription() ? event.getDescription() : null)
- .setData(event.hasEventData() ? event.getEventData() : null);
+ .setDescription(event.getDescription())
+ .setData(event.getData());
}
- }));
-
- for (EventDto batchEventDto : batchEventDtos) {
+ };
+ for (EventDto batchEventDto : transform(eventRepository.getEvents(component), eventToEventDto)) {
dbClient.eventDao().insert(session, batchEventDto);
}
}
.setDate(analysisDate);
}
- private static String convertCategory(Constants.EventCategory category) {
+ private static String convertCategory(Event.Category category) {
switch (category) {
case ALERT:
return EventDto.CATEGORY_ALERT;
public String getDescription() {
return "Persist component links";
}
+
+ private class PersistEventComponentVisitor extends DepthTraversalTypeAwareVisitor {
+ private final DbSession session;
+ private final long analysisDate;
+
+ public PersistEventComponentVisitor(DbSession session, long analysisDate) {
+ super(Component.Type.FILE, Order.PRE_ORDER);
+ this.session = session;
+ this.analysisDate = analysisDate;
+ }
+
+ @Override
+ public void visitProject(Component project) {
+ processComponent(project, session, analysisDate);
+ }
+
+ @Override
+ public void visitModule(Component module) {
+ processComponent(module, session, analysisDate);
+ }
+
+ @Override
+ public void visitDirectory(Component directory) {
+ processComponent(directory, session, analysisDate);
+ }
+
+ @Override
+ public void visitFile(Component file) {
+ processComponent(file, session, analysisDate);
+ }
+ }
}
package org.sonar.server.computation.step;
+import com.google.common.collect.ImmutableList;
+import java.util.Collections;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.sonar.server.computation.batch.TreeRootHolderRule;
import org.sonar.server.computation.component.Component;
import org.sonar.server.computation.component.DumbComponent;
+import org.sonar.server.computation.event.Event;
+import org.sonar.server.computation.event.EventRepository;
import org.sonar.server.db.DbClient;
import org.sonar.server.event.db.EventDao;
import org.sonar.test.DbTests;
+import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
DbSession session;
+ EventRepository eventRepository = mock(EventRepository.class);
PersistEventsStep step;
@Before
System2 system2 = mock(System2.class);
when(system2.now()).thenReturn(1225630680000L);
- step = new PersistEventsStep(dbClient, system2, treeRootHolder, reportReader);
+ step = new PersistEventsStep(dbClient, system2, treeRootHolder, reportReader, eventRepository);
+
+ when(eventRepository.getEvents(any(Component.class))).thenReturn(Collections.<Event>emptyList());
}
@Override
public void persist_report_events() throws Exception {
dbTester.prepareDbUnit(getClass(), "empty.xml");
- treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", null));
+ DumbComponent root = new DumbComponent(Component.Type.PROJECT, 1, "ABCD", null);
+ treeRootHolder.setRoot(root);
reportReader.setMetadata(BatchReport.Metadata.newBuilder()
.setRootComponentRef(1)
)
.build());
+ when(eventRepository.getEvents(root)).thenReturn(ImmutableList.of(
+ Event.createAlert("Red (was Orange)", null, "Open issues > 0"),
+ Event.createProfile("Changes in 'Default' (Java)", "from=2014-10-12T08:36:25+0000;key=java-default;to=2014-10-12T10:36:25+0000", null))
+ );
+
+ treeRootHolder.setRoot(root);
step.execute();
dbTester.assertDbUnit(getClass(), "add_events-result.xml", "events");
public void persist_report_events_with_component_children() throws Exception {
dbTester.prepareDbUnit(getClass(), "empty.xml");
- treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", null,
- new DumbComponent(Component.Type.MODULE, 2, "BCDE", null)));
+ DumbComponent root = new DumbComponent(Component.Type.PROJECT, 1, "ABCD", null,
+ new DumbComponent(Component.Type.MODULE, 2, "BCDE", null));
+ treeRootHolder.setRoot(root);
reportReader.setMetadata(BatchReport.Metadata.newBuilder()
.setRootComponentRef(1)
.build()
).build());
+ Component child = root.getChildren().get(0);
+
+ when(eventRepository.getEvents(root)).thenReturn(ImmutableList.of(Event.createAlert("Red (was Orange)", null, "Open issues > 0")));
+ when(eventRepository.getEvents(child)).thenReturn(ImmutableList.of(Event.createAlert("Red (was Orange)", null, "Open issues > 0")));
+
+ treeRootHolder.setRoot(root);
step.execute();
dbTester.assertDbUnit(getClass(), "persist_report_events_with_component_children-result.xml", "events");