From edb837052804d9dda1a1161c6bf5827bd4ba26c7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Tue, 2 Jun 2015 14:08:01 +0200 Subject: [PATCH] SONAR-6568 SONAR-6569 persist CE events to DB events from batch are not persisted to DB anymore as a temporary safety measure: errors logs are created when events created by the CE are different from those created by the batch --- .../computation/step/PersistEventsStep.java | 81 +++++++++++-------- .../step/PersistEventsStepTest.java | 30 ++++++- 2 files changed, 73 insertions(+), 38 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java index b93863785ae..9c256def314 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java @@ -21,11 +21,9 @@ 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; @@ -34,6 +32,8 @@ import org.sonar.server.computation.batch.BatchReportReader; 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; @@ -44,40 +44,23 @@ public class PersistEventsStep implements ComputationStep { 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); @@ -91,23 +74,22 @@ public class PersistEventsStep implements ComputationStep { } private void processEvents(DbSession session, final BatchReport.Component batchComponent, final Component component, final Long analysisDate) { - List events = batchComponent.getEventList(); + final List events = batchComponent.getEventList(); if (events.isEmpty()) { return; } - List batchEventDtos = Lists.newArrayList(transform(events, new Function() { + Function eventToEventDto = new Function() { @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); } } @@ -138,7 +120,7 @@ public class PersistEventsStep implements ComputationStep { .setDate(analysisDate); } - private static String convertCategory(Constants.EventCategory category) { + private static String convertCategory(Event.Category category) { switch (category) { case ALERT: return EventDto.CATEGORY_ALERT; @@ -153,4 +135,35 @@ public class PersistEventsStep implements ComputationStep { 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); + } + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistEventsStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistEventsStepTest.java index 3e9835f25e1..41e4c8f8749 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistEventsStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistEventsStepTest.java @@ -20,6 +20,8 @@ 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; @@ -35,10 +37,13 @@ import org.sonar.server.computation.batch.BatchReportReaderRule; 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; @@ -53,6 +58,7 @@ public class PersistEventsStepTest extends BaseStepTest { public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); DbSession session; + EventRepository eventRepository = mock(EventRepository.class); PersistEventsStep step; @Before @@ -63,7 +69,9 @@ public class PersistEventsStepTest extends BaseStepTest { 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.emptyList()); } @Override @@ -101,7 +109,8 @@ public class PersistEventsStepTest extends BaseStepTest { 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) @@ -126,6 +135,12 @@ public class PersistEventsStepTest extends BaseStepTest { ) .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"); @@ -135,8 +150,9 @@ public class PersistEventsStepTest extends BaseStepTest { 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) @@ -166,6 +182,12 @@ public class PersistEventsStepTest extends BaseStepTest { .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"); -- 2.39.5