From 5cf7d52c0172117aa11b0fa0e4cc08215628bc52 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Tue, 2 Jun 2015 13:34:07 +0200 Subject: [PATCH] SONAR-6568 SONAR-6569 refacto PersisteEventStep to use Component tree --- .../computation/step/PersistEventsStep.java | 140 ++++++++++-------- .../step/PersistEventsStepTest.java | 8 +- 2 files changed, 78 insertions(+), 70 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 e1a6af7af2e..b93863785ae 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 @@ -20,7 +20,10 @@ 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; @@ -33,14 +36,14 @@ import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.db.DbClient; -import static org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor.Order.PRE_ORDER; +import static com.google.common.collect.Iterables.transform; public class PersistEventsStep implements ComputationStep { private final DbClient dbClient; private final System2 system2; - private final TreeRootHolder treeRootHolder; private final BatchReportReader reportReader; + private final TreeRootHolder treeRootHolder; public PersistEventsStep(DbClient dbClient, System2 system2, TreeRootHolder treeRootHolder, BatchReportReader reportReader) { this.dbClient = dbClient; @@ -51,91 +54,98 @@ public class PersistEventsStep implements ComputationStep { @Override public void execute() { - DbSession session = dbClient.openSession(false); + final DbSession session = dbClient.openSession(false); try { - new EventVisitor(session, reportReader.readMetadata().getAnalysisDate()).visit(treeRootHolder.getRoot()); + 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()); session.commit(); } finally { MyBatis.closeQuietly(session); } } - private class EventVisitor extends DepthTraversalTypeAwareVisitor { - - private final DbSession session; - private final long analysisDate; - - private EventVisitor(DbSession session, long analysisDate) { - super(Component.Type.FILE, PRE_ORDER); - this.session = session; - this.analysisDate = analysisDate; - } - - @Override - public void visitModule(Component module) { - visitProjectOrModule(module); - } - - @Override - public void visitProject(Component project) { - visitProjectOrModule(project); - } + private void processComponent(Component component, DbSession session, long analysisDate) { + BatchReport.Component batchComponent = reportReader.readComponent(component.getRef()); + processEvents(session, batchComponent, component, analysisDate); + saveVersionEvent(session, batchComponent, component, analysisDate); + } - private void visitProjectOrModule(Component component) { - BatchReport.Component batchComponent = reportReader.readComponent(component.getRef()); - processEvents(batchComponent, component); - saveVersionEvent(batchComponent, component); + private void processEvents(DbSession session, final BatchReport.Component batchComponent, final Component component, final Long analysisDate) { + List events = batchComponent.getEventList(); + if (events.isEmpty()) { + return; } - private void processEvents(BatchReport.Component batchComponent, Component component) { - List events = batchComponent.getEventList(); - if (!events.isEmpty()) { - for (BatchReport.Event event : events) { - dbClient.eventDao().insert(session, newBaseEvent(component, batchComponent.getSnapshotId()) + List batchEventDtos = Lists.newArrayList(transform(events, new Function() { + @Override + public EventDto apply(@Nonnull BatchReport.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) - ); - } + .setData(event.hasEventData() ? event.getEventData() : null); } + })); + + for (EventDto batchEventDto : batchEventDtos) { + dbClient.eventDao().insert(session, batchEventDto); } + } - private void saveVersionEvent(BatchReport.Component batchComponent, Component component) { - if (batchComponent.hasVersion()) { - deletePreviousEventsHavingSameVersion(batchComponent, component); - dbClient.eventDao().insert(session, newBaseEvent(component, batchComponent.getSnapshotId()) - .setName(batchComponent.getVersion()) - .setCategory(EventDto.CATEGORY_VERSION) - ); - } + private void saveVersionEvent(DbSession session, BatchReport.Component batchComponent, Component component, Long analysisDate) { + if (batchComponent.hasVersion()) { + deletePreviousEventsHavingSameVersion(session, batchComponent, component); + dbClient.eventDao().insert(session, newBaseEvent(batchComponent, component, analysisDate) + .setName(batchComponent.getVersion()) + .setCategory(EventDto.CATEGORY_VERSION) + ); } + } - private void deletePreviousEventsHavingSameVersion(BatchReport.Component batchComponent, Component component) { - for (EventDto dto : dbClient.eventDao().selectByComponentUuid(session, component.getUuid())) { - if (dto.getCategory().equals(EventDto.CATEGORY_VERSION) && dto.getName().equals(batchComponent.getVersion())) { - dbClient.eventDao().delete(session, dto.getId()); - } + private void deletePreviousEventsHavingSameVersion(DbSession session, BatchReport.Component batchComponent, Component component) { + for (EventDto dto : dbClient.eventDao().selectByComponentUuid(session, component.getUuid())) { + if (dto.getCategory().equals(EventDto.CATEGORY_VERSION) && dto.getName().equals(batchComponent.getVersion())) { + dbClient.eventDao().delete(session, dto.getId()); } } + } - private EventDto newBaseEvent(Component component, long snapshotId) { - return new EventDto() - .setComponentUuid(component.getUuid()) - .setSnapshotId(snapshotId) - .setCreatedAt(system2.now()) - .setDate(analysisDate); - } + private EventDto newBaseEvent(BatchReport.Component batchComponent, Component component, Long analysisDate) { + return new EventDto() + .setComponentUuid(component.getUuid()) + .setSnapshotId(batchComponent.getSnapshotId()) + .setCreatedAt(system2.now()) + .setDate(analysisDate); + } - private String convertCategory(Constants.EventCategory category) { - switch (category) { - case ALERT: - return EventDto.CATEGORY_ALERT; - case PROFILE: - return EventDto.CATEGORY_PROFILE; - default: - throw new IllegalArgumentException(String.format("Unsupported category %s", category.name())); - } + private static String convertCategory(Constants.EventCategory category) { + switch (category) { + case ALERT: + return EventDto.CATEGORY_ALERT; + case PROFILE: + return EventDto.CATEGORY_PROFILE; + default: + throw new IllegalArgumentException(String.format("Unsupported category %s", category.name())); } } 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 d359abcec66..3e9835f25e1 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 @@ -47,12 +47,10 @@ public class PersistEventsStepTest extends BaseStepTest { @ClassRule public static DbTester dbTester = new DbTester(); - - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); - @Rule public BatchReportReaderRule reportReader = new BatchReportReaderRule(); + @Rule + public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); DbSession session; PersistEventsStep step; @@ -138,7 +136,7 @@ public class PersistEventsStepTest extends BaseStepTest { dbTester.prepareDbUnit(getClass(), "empty.xml"); treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", null, - new DumbComponent(Component.Type.MODULE, 2, "BCDE", null))); + new DumbComponent(Component.Type.MODULE, 2, "BCDE", null))); reportReader.setMetadata(BatchReport.Metadata.newBuilder() .setRootComponentRef(1) -- 2.39.5