]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6236 Apply feedback from PR 149/head
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 18 Mar 2015 09:53:00 +0000 (10:53 +0100)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 18 Mar 2015 12:19:48 +0000 (13:19 +0100)
server/sonar-server/src/main/java/org/sonar/server/dashboard/db/WidgetPropertyDao.java
server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDashboards.java
server/sonar-server/src/main/java/org/sonar/server/startup/RenameIssueWidgets.java
server/sonar-server/src/test/java/org/sonar/server/startup/RenameIssueWidgetsTest.java
server/sonar-server/src/test/resources/org/sonar/server/startup/RenameIssueWidgetsTest/after.xml
server/sonar-server/src/test/resources/org/sonar/server/startup/RenameIssueWidgetsTest/empty.xml [deleted file]

index 763d1843469795c99160cee770aba20d4d07bb28..46ec46113b8dba4544b676aabaf9cae7b13bc572 100644 (file)
  */
 package org.sonar.server.dashboard.db;
 
+import com.google.common.base.Function;
 import org.sonar.core.dashboard.WidgetPropertyDto;
 import org.sonar.core.dashboard.WidgetPropertyMapper;
 import org.sonar.core.persistence.DaoComponent;
+import org.sonar.core.persistence.DaoUtils;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
@@ -73,8 +76,14 @@ public class WidgetPropertyDao implements DaoComponent {
     return mapper(session).selectByDashboard(dashboardKey);
   }
 
-  public void deleteByWidgetIds(DbSession session, List<Long> widgetIdsWithPropertiesToDelete) {
-    mapper(session).deleteByWidgetIds(widgetIdsWithPropertiesToDelete);
+  public void deleteByWidgetIds(final DbSession session, List<Long> widgetIdsWithPropertiesToDelete) {
+    DaoUtils.executeLargeInputs(widgetIdsWithPropertiesToDelete, new Function<List<Long>, List<Void>>() {
+      @Override
+      public List<Void> apply(List<Long> input) {
+        mapper(session).deleteByWidgetIds(input);
+        return Arrays.asList();
+      }
+    });
   }
 
   private WidgetPropertyMapper mapper(DbSession session) {
index 1d9da7f47f44bfd3085053c8c782d2245bc492c4..50644f9683d9cc8c5ef9a5c4a3e5b4c4c00522c8 100644 (file)
@@ -563,7 +563,6 @@ class ServerComponents {
     pico.addSingleton(IssueFilterSerializer.class);
     pico.addSingleton(IssueFilterWs.class);
     pico.addSingleton(IssueFilterWriter.class);
-    pico.addSingleton(RegisterIssueFilters.class);
     pico.addSingleton(org.sonar.server.issue.filter.AppAction.class);
     pico.addSingleton(org.sonar.server.issue.filter.ShowAction.class);
     pico.addSingleton(org.sonar.server.issue.filter.FavoritesAction.class);
@@ -709,6 +708,7 @@ class ServerComponents {
     startupContainer.addSingleton(RegisterServletFilters.class);
     startupContainer.addSingleton(CopyRequirementsFromCharacteristicsToRules.class);
     startupContainer.addSingleton(ReportQueueCleaner.class);
+    startupContainer.addSingleton(RegisterIssueFilters.class);
     startupContainer.addSingleton(RenameIssueWidgets.class);
 
     DoPrivileged.execute(new DoPrivileged.Task() {
index 084820d0a64c056af0c67a90b4625d2ec4eef0ea..f291915fdf0eb273702a4ae3c50b27b917fb7d1a 100644 (file)
@@ -56,6 +56,7 @@ public class RegisterDashboards implements Startable {
     this.dashboardDao = dashboardDao;
     this.activeDashboardDao = activeDashboardDao;
     this.loadedTemplateDao = loadedTemplateDao;
+    // RegisterIssueFilters must be run before this task, to be able to reference issue filters in widget properties
   }
 
   /**
index 92be64913334a1004afc2413844a4cfca4c460f9..d63c5db20e078c27a5430ace16a086ab5f65bace 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.server.startup;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import org.picocontainer.Startable;
 import org.sonar.api.utils.System2;
@@ -30,13 +31,22 @@ import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.template.LoadedTemplateDto;
 import org.sonar.server.db.DbClient;
+import org.sonar.server.issue.filter.RegisterIssueFilters;
 
-import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 public class RenameIssueWidgets implements Startable {
 
-  private static final String PROJECT_ISSUE_FILTER_WIDGET_KEY = "project_issue_filter";
+  private final static String TASK_KEY = "RenameIssueWidgets";
+
+  private static final String WIDGET_FALSE_POSITIVES = "false_positive_reviews";
+  private static final String WIDGET_MY_UNRESOLVED = "my_reviews";
+  private static final String WIDGET_UNRESOLVED_BY_DEVELOPER = "reviews_per_developer";
+  private static final String WIDGET_UNRESOLVED_BY_STATUS = "unresolved_issues_statuses";
+
+  private static final String WIDGET_PROJECT_ISSUE_FILTER = "project_issue_filter";
+
   private static final String FILTER_PROPERTY = "filter";
   private static final String DISTRIBUTION_AXIS_PROPERTY = "distributionAxis";
 
@@ -44,9 +54,10 @@ public class RenameIssueWidgets implements Startable {
 
   private final System2 system;
 
-  public RenameIssueWidgets(DbClient dbClient, System2 system) {
+  public RenameIssueWidgets(DbClient dbClient, System2 system, RegisterIssueFilters startupDependency) {
     this.dbClient = dbClient;
     this.system = system;
+    // RegisterIssueFilters must be run before this task, to be able to reference issue filters in widget properties
   }
 
   @Override
@@ -54,87 +65,41 @@ public class RenameIssueWidgets implements Startable {
     DbSession session = dbClient.openSession(false);
 
     try {
-      if (dbClient.loadedTemplateDao().countByTypeAndKey(LoadedTemplateDto.ONE_SHOT_TASK_TYPE, getClass().getSimpleName()) != 0) {
+      if (dbClient.loadedTemplateDao().countByTypeAndKey(LoadedTemplateDto.ONE_SHOT_TASK_TYPE, TASK_KEY) != 0) {
         // Already done
         return;
       }
 
-      IssueFilterDto unresolvedIssues = dbClient.issueFilterDao().selectProvidedFilterByName("Unresolved Issues");
-      IssueFilterDto hiddenDebt = dbClient.issueFilterDao().selectProvidedFilterByName("False Positive and Won't Fix Issues");
-      IssueFilterDto myUnresolvedIssues = dbClient.issueFilterDao().selectProvidedFilterByName("My Unresolved Issues");
+      Map<String, IssueFilterDto> filterByWidgetKey = loadRequiredIssueFilters();
 
-      if (unresolvedIssues == null || hiddenDebt == null || myUnresolvedIssues == null) {
-        // One of the filter has been deleted, no need to do anything
-        return;
-      }
+      Map<String, String> distributionAxisByWidgetKey = ImmutableMap.of(
+        WIDGET_FALSE_POSITIVES, "resolutions",
+        WIDGET_MY_UNRESOLVED, "severities",
+        WIDGET_UNRESOLVED_BY_DEVELOPER, "assignees",
+        WIDGET_UNRESOLVED_BY_STATUS, "statuses"
+      );
 
       Loggers.get(getClass()).info("Replacing issue related widgets with issue filter widgets");
 
-      List<Long> widgetIdsWithPropertiesToDelete = Lists.newArrayList();
-      List<WidgetPropertyDto> widgetPropertiesToCreate = Lists.newArrayList();
-      Date now = system.newDate();
+      List<Long> updatedWidgetIds = Lists.newArrayList();
+      List<WidgetPropertyDto> newWidgetProperties = Lists.newArrayList();
 
       for (WidgetDto widget : dbClient.widgetDao().findAll(session)) {
-        switch (widget.getWidgetKey()) {
-          case "false_positive_reviews":
-            widgetPropertiesToCreate.add(
-              new WidgetPropertyDto()
-                .setWidgetId(widget.getId())
-                .setPropertyKey(FILTER_PROPERTY)
-                .setTextValue(hiddenDebt.getId().toString()));
-            widgetPropertiesToCreate.add(
-              new WidgetPropertyDto()
-                .setWidgetId(widget.getId())
-                .setPropertyKey(DISTRIBUTION_AXIS_PROPERTY)
-                .setTextValue("resolutions"));
-            updateWidget(session, widgetIdsWithPropertiesToDelete, widget);
-            break;
-          case "my_reviews":
-            widgetPropertiesToCreate.add(
-              new WidgetPropertyDto()
-                .setWidgetId(widget.getId())
-                .setPropertyKey(FILTER_PROPERTY)
-                .setTextValue(myUnresolvedIssues.getId().toString()));
-            updateWidget(session, widgetIdsWithPropertiesToDelete, widget);
-            break;
-          case "reviews_per_developer":
-            widgetPropertiesToCreate.add(
-              new WidgetPropertyDto()
-                .setWidgetId(widget.getId())
-                .setPropertyKey(FILTER_PROPERTY)
-                .setTextValue(unresolvedIssues.getId().toString()));
-            widgetPropertiesToCreate.add(
-              new WidgetPropertyDto()
-                .setWidgetId(widget.getId())
-                .setPropertyKey(DISTRIBUTION_AXIS_PROPERTY)
-                .setTextValue("assignees"));
-            updateWidget(session, widgetIdsWithPropertiesToDelete, widget);
-            break;
-          case "unresolved_issues_statuses":
-            widgetPropertiesToCreate.add(
-              new WidgetPropertyDto()
-                .setWidgetId(widget.getId())
-                .setPropertyKey(FILTER_PROPERTY)
-                .setTextValue(unresolvedIssues.getId().toString()));
-            widgetPropertiesToCreate.add(
-              new WidgetPropertyDto()
-                .setWidgetId(widget.getId())
-                .setPropertyKey(DISTRIBUTION_AXIS_PROPERTY)
-                .setTextValue("statuses"));
-            updateWidget(session, widgetIdsWithPropertiesToDelete, widget);
-            break;
-          default:
-            // Nothing to do, move along
-            break;
+        String widgetKey = widget.getWidgetKey();
+        if (filterByWidgetKey.keySet().contains(widgetKey)) {
+          newWidgetProperties.add(createFilterProperty(filterByWidgetKey.get(widgetKey), widget));
+          newWidgetProperties.add(createDistributionAxisProperty(distributionAxisByWidgetKey.get(widgetKey), widget));
+          updateWidget(session, widget);
+          updatedWidgetIds.add(widget.getId());
         }
       }
 
-      dbClient.widgetPropertyDao().deleteByWidgetIds(session, widgetIdsWithPropertiesToDelete);
-      dbClient.widgetPropertyDao().insert(session, widgetPropertiesToCreate);
+      dbClient.widgetPropertyDao().deleteByWidgetIds(session, updatedWidgetIds);
+      dbClient.widgetPropertyDao().insert(session, newWidgetProperties);
 
       dbClient.loadedTemplateDao().insert(new LoadedTemplateDto()
         .setType(LoadedTemplateDto.ONE_SHOT_TASK_TYPE)
-        .setKey(getClass().getSimpleName()), session);
+        .setKey(TASK_KEY), session);
 
       session.commit();
     } finally {
@@ -142,12 +107,41 @@ public class RenameIssueWidgets implements Startable {
     }
   }
 
-  private void updateWidget(DbSession session, List<Long> widgetIdsWithPropertiesToDelete, WidgetDto widget) {
+  protected Map<String, IssueFilterDto> loadRequiredIssueFilters() {
+    IssueFilterDto unresolvedIssues = dbClient.issueFilterDao().selectProvidedFilterByName("Unresolved Issues");
+    IssueFilterDto hiddenDebt = dbClient.issueFilterDao().selectProvidedFilterByName("False Positive and Won't Fix Issues");
+    IssueFilterDto myUnresolvedIssues = dbClient.issueFilterDao().selectProvidedFilterByName("My Unresolved Issues");
+
+    Map<String, IssueFilterDto> filterByWidgetKey = ImmutableMap.of(
+      WIDGET_FALSE_POSITIVES, hiddenDebt,
+      WIDGET_MY_UNRESOLVED, myUnresolvedIssues,
+      WIDGET_UNRESOLVED_BY_DEVELOPER, unresolvedIssues,
+      WIDGET_UNRESOLVED_BY_STATUS, unresolvedIssues
+    );
+
+    return filterByWidgetKey;
+  }
+
+  private WidgetPropertyDto createFilterProperty(IssueFilterDto issueFilter, WidgetDto widget) {
+    return createWidgetProperty(FILTER_PROPERTY, issueFilter.getId().toString(), widget);
+  }
+
+  private WidgetPropertyDto createDistributionAxisProperty(String distributionAxis, WidgetDto widget) {
+    return createWidgetProperty(DISTRIBUTION_AXIS_PROPERTY, distributionAxis, widget);
+  }
+
+  private WidgetPropertyDto createWidgetProperty(String key, String value, WidgetDto widget) {
+    return new WidgetPropertyDto()
+      .setWidgetId(widget.getId())
+      .setPropertyKey(key)
+      .setTextValue(value);
+  }
+
+  private void updateWidget(DbSession session, WidgetDto widget) {
     dbClient.widgetDao().update(session,
-      widget.setWidgetKey(PROJECT_ISSUE_FILTER_WIDGET_KEY)
+      widget.setWidgetKey(WIDGET_PROJECT_ISSUE_FILTER)
         .setUpdatedAt(system.newDate())
         .setConfigured(true));
-    widgetIdsWithPropertiesToDelete.add(widget.getId());
   }
 
   @Override
index 92d8e2c5ca8ca1d361af0dab61d39a3da702f6cf..5e79b405e343978dd35472fba5a4a9441e920dd0 100644 (file)
@@ -52,18 +52,13 @@ public class RenameIssueWidgetsTest {
     dbTester.assertDbUnit(this.getClass(), "after.xml", "widgets", "widget_properties", "loaded_templates");
   }
 
-  @Test
-  public void should_skip_when_filter_removed() throws Exception {
-    dbTester.prepareDbUnit(this.getClass(), "empty.xml");
-
-    doStart();
-  }
-
   @Test
   public void should_skip_when_already_executed() throws Exception {
     dbTester.prepareDbUnit(this.getClass(), "after.xml");
 
     doStart();
+
+    dbTester.assertDbUnit(this.getClass(), "after.xml", "widgets", "widget_properties", "loaded_templates");
   }
 
   private void doStart() {
@@ -80,7 +75,8 @@ public class RenameIssueWidgetsTest {
         new IssueFilterDao(dbTester.myBatis()),
         new LoadedTemplateDao(dbTester.myBatis())
       ),
-      system2);
+      system2,
+      null);
 
     task.start();
     task.stop();
index ab8310df45a792fc8352b3f5eef7d23c1c1ce79d..2cab15849f1e1a82cc38553d27b86b1a81c450f8 100644 (file)
@@ -53,7 +53,8 @@
 
   <!-- filter = 'My Unresolved Issues' -->
   <widget_properties id="5" widget_id="3" kee="filter" text_value="3"/>
-  <!-- distributionAxis is 'default', no other config -->
+  <!-- distributionAxis is 'severities' -->
+  <widget_properties id="6" widget_id="3" kee="distributionAxis" text_value="severities"/>
 
 
   <!-- 'Unresolved Issues Per Developer' - replaced by project_issue_filter w/ 'Unresolved Issues' filter -->
@@ -61,9 +62,9 @@
      column_index="1" row_index="4" configured="true" created_at="[null]" updated_at="2003-03-23 01:23:45" resource_id="[null]"/>
 
   <!-- filter = 'Unresolved Issues' -->
-  <widget_properties id="6" widget_id="4" kee="filter" text_value="1"/>
+  <widget_properties id="7" widget_id="4" kee="filter" text_value="1"/>
   <!-- distributionAxis is 'assignees' -->
-  <widget_properties id="7" widget_id="4" kee="distributionAxis" text_value="assignees"/>
+  <widget_properties id="8" widget_id="4" kee="distributionAxis" text_value="assignees"/>
 
 
   <!-- 'Unresolved Issues Per Status' - replaced by project_issue_filter w/ 'Unresolved Issues' filter -->
@@ -71,9 +72,9 @@
      column_index="1" row_index="5" configured="true" created_at="[null]" updated_at="2003-03-23 01:23:45" resource_id="[null]"/>
 
   <!-- filter = 'Unresolved Issues' -->
-  <widget_properties id="8" widget_id="5" kee="filter" text_value="1"/>
+  <widget_properties id="9" widget_id="5" kee="filter" text_value="1"/>
   <!-- distributionAxis is 'assignees' -->
-  <widget_properties id="9" widget_id="5" kee="distributionAxis" text_value="statuses"/>
+  <widget_properties id="10" widget_id="5" kee="distributionAxis" text_value="statuses"/>
 
 
   <loaded_templates id="1" template_type="ONE_SHOT_TASK" kee="RenameIssueWidgets"/>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/startup/RenameIssueWidgetsTest/empty.xml b/server/sonar-server/src/test/resources/org/sonar/server/startup/RenameIssueWidgetsTest/empty.xml
deleted file mode 100644 (file)
index 871dedc..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<dataset>
-
-</dataset>