]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6568 SONAR-6569 persist CE events to DB 354/head
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 2 Jun 2015 12:08:01 +0000 (14:08 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Thu, 4 Jun 2015 12:36:03 +0000 (14:36 +0200)
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

server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistEventsStepTest.java

index b93863785aeb9942ba1930f93bf2982bd84b7de8..9c256def314b039c35e3bb6dd038af27080992a7 100644 (file)
 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<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);
     }
   }
@@ -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);
+    }
+  }
 }
index 3e9835f25e1e8d6436306ce3842f4704cd562d21..41e4c8f8749d29895d663a0718b30b1c3d19ffcc 100644 (file)
@@ -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.<Event>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");