]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-983 i18n, better purge, fix NPE when deleted resource
authorsimonbrandhof <simon.brandhof@gmail.com>
Wed, 21 Dec 2011 22:03:58 +0000 (23:03 +0100)
committersimonbrandhof <simon.brandhof@gmail.com>
Wed, 21 Dec 2011 22:03:58 +0000 (23:03 +0100)
17 files changed:
plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DbCleanerPlugin.java
plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/DbCleanerCommands.java [deleted file]
plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/PurgeUtils.java
plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/purges/PurgeDisabledResources.java
plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/purges/PurgeOrphanResources.java
plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/api/PurgeUtilsTest.java
plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/purges/PurgeDisabledResourcesTest.java
plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/purges/PurgeOrphanResourcesTest.java
plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties
sonar-core/src/main/java/org/sonar/persistence/resource/ResourceIndexerDao.java
sonar-core/src/main/java/org/sonar/persistence/resource/ResourceIndexerMapper.java
sonar-core/src/main/resources/org/sonar/persistence/resource/ResourceIndexerMapper.xml
sonar-core/src/test/java/org/sonar/persistence/resource/ResourceIndexerDaoTest.java
sonar-core/src/test/resources/org/sonar/persistence/resource/ResourceIndexerDaoTest/shouldDeleteIndexes-result.xml [deleted file]
sonar-core/src/test/resources/org/sonar/persistence/resource/ResourceIndexerDaoTest/shouldDeleteIndexes.xml [deleted file]
sonar-server/src/main/webapp/WEB-INF/app/models/project.rb
sonar-server/src/main/webapp/WEB-INF/app/views/search/_autocomplete.html.erb

index f449b5c38e04bd1a1c73ec7fafcddee9cc51ee95..f8454462dde8856f1ee657d06a311cd45e6e2ea9 100644 (file)
@@ -22,7 +22,6 @@ package org.sonar.plugins.dbcleaner;
 import org.sonar.api.Properties;
 import org.sonar.api.Property;
 import org.sonar.api.SonarPlugin;
-import org.sonar.plugins.dbcleaner.api.DbCleanerCommands;
 import org.sonar.plugins.dbcleaner.api.DbCleanerConstants;
 import org.sonar.plugins.dbcleaner.period.DefaultPeriodCleaner;
 import org.sonar.plugins.dbcleaner.period.PeriodPurge;
@@ -50,7 +49,6 @@ public final class DbCleanerPlugin extends SonarPlugin {
     return Arrays.asList(
       // shared components
       DefaultPeriodCleaner.class,
-      DbCleanerCommands.class,
 
       // purges
       PurgeOrphanResources.class, PurgeEntities.class, PurgeRuleMeasures.class, PurgeUnprocessed.class, PurgeDeletedResources.class,
diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/DbCleanerCommands.java b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/DbCleanerCommands.java
deleted file mode 100644 (file)
index b010988..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2008-2011 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
- */
-package org.sonar.plugins.dbcleaner.api;
-
-import org.sonar.api.BatchExtension;
-import org.sonar.api.database.DatabaseSession;
-import org.sonar.api.database.model.ResourceModel;
-import org.sonar.persistence.resource.ResourceIndexerDao;
-
-import java.util.List;
-
-/**
- * @since 2.13
- */
-public class DbCleanerCommands implements BatchExtension {
-
-  private DatabaseSession session;
-  private ResourceIndexerDao resourceIndexer;
-
-  public DbCleanerCommands(DatabaseSession session, ResourceIndexerDao resourceIndexer) {
-    this.session = session;
-    this.resourceIndexer = resourceIndexer;
-  }
-
-  public DbCleanerCommands deleteSnapshots(List<Integer> snapshotIds, boolean includeDependents) {
-    if (includeDependents) {
-      PurgeUtils.deleteSnapshotsData(session, snapshotIds);
-    } else {
-      PurgeUtils.deleteSnapshots(session, snapshotIds);
-    }
-    return this;
-  }
-
-  public DbCleanerCommands deleteResources(List<Integer> resourceIds) {
-    PurgeUtils.executeQuery(session, "", resourceIds, "DELETE FROM " + ResourceModel.class.getSimpleName() + " WHERE id in (:ids)");
-    resourceIndexer.delete(resourceIds);
-    return this;
-  }
-}
index 93ec2d859eeed7f9f8c337359b7c9249896ea8d5..390f4f0736fb128ae6e847b89f7aa6f3288adda0 100644 (file)
  */
 package org.sonar.plugins.dbcleaner.api;
 
-import java.util.List;
-
-import javax.persistence.Query;
-
 import org.apache.commons.configuration.Configuration;
 import org.sonar.api.batch.Event;
 import org.sonar.api.database.DatabaseSession;
-import org.sonar.api.database.model.MeasureData;
-import org.sonar.api.database.model.MeasureModel;
-import org.sonar.api.database.model.RuleFailureModel;
-import org.sonar.api.database.model.Snapshot;
-import org.sonar.api.database.model.SnapshotSource;
+import org.sonar.api.database.model.*;
 import org.sonar.api.design.DependencyDto;
 import org.sonar.api.utils.TimeProfiler;
 
+import javax.persistence.Query;
+import java.util.List;
+
 /**
  * @since 2.5
  */
@@ -106,7 +101,7 @@ public final class PurgeUtils {
 
   /**
    * Delete DUPLICATIONS_INDEX table
-   * 
+   *
    * @since 2.11
    */
   private static void deleteDuplicationBlocks(DatabaseSession session, List<Integer> snapshotIds) {
@@ -127,6 +122,18 @@ public final class PurgeUtils {
     executeQuery(session, "delete snapshots", snapshotIds, "delete from " + Snapshot.class.getSimpleName() + " s where s.id in (:ids)");
   }
 
+  public static void deleteResources(DatabaseSession session, List<Integer> ids) {
+    executeQuery(session, "", ids, "DELETE FROM " + ResourceModel.class.getSimpleName() + " WHERE id in (:ids)");
+    deleteResourceIndex(session, ids);
+  }
+
+  /**
+   * Delete RESOURCE_INDEX table
+   */
+  public static void deleteResourceIndex(DatabaseSession session, List<Integer> resourceIds) {
+    executeNativeQuery(session, "delete resource_index", resourceIds, "delete from resource_index where resource_id in (:ids)");
+  }
+
   /**
    * Paginate execution of SQL requests to avoid exceeding size of rollback segment
    */
index dbf22a5004d4ffeb044c5882d5da1c41d17e81b4..94d809c9bc4da65718674f91afbe6077811ff5c9 100644 (file)
@@ -22,9 +22,9 @@ package org.sonar.plugins.dbcleaner.purges;
 import org.sonar.api.database.DatabaseSession;
 import org.sonar.api.database.model.ResourceModel;
 import org.sonar.api.database.model.Snapshot;
-import org.sonar.plugins.dbcleaner.api.DbCleanerCommands;
 import org.sonar.plugins.dbcleaner.api.Purge;
 import org.sonar.plugins.dbcleaner.api.PurgeContext;
+import org.sonar.plugins.dbcleaner.api.PurgeUtils;
 
 import javax.persistence.Query;
 import java.util.List;
@@ -34,16 +34,13 @@ import java.util.List;
  */
 public final class PurgeDisabledResources extends Purge {
 
-  private DbCleanerCommands dbCleanerCommands;
-
-  public PurgeDisabledResources(DatabaseSession session, DbCleanerCommands dbCleanerCommands) {
+  public PurgeDisabledResources(DatabaseSession session) {
     super(session);
-    this.dbCleanerCommands = dbCleanerCommands;
   }
 
   public void purge(PurgeContext context) {
-    dbCleanerCommands.deleteSnapshots(getSnapshotIds(), true);
-    dbCleanerCommands.deleteResources(getResourceIds());
+    PurgeUtils.deleteSnapshotsData(getSession(), getSnapshotIds());
+    PurgeUtils.deleteResources(getSession(), getResourceIds());
   }
 
   private List<Integer> getResourceIds() {
index a38ead16fbb8267c247b9bf2a1f7a54d44fd08d6..0e20f75598d7bec0ade3173652cdf38b8043d114 100644 (file)
@@ -21,9 +21,9 @@ package org.sonar.plugins.dbcleaner.purges;
 
 import org.sonar.api.database.DatabaseSession;
 import org.sonar.api.database.model.ResourceModel;
-import org.sonar.plugins.dbcleaner.api.DbCleanerCommands;
 import org.sonar.plugins.dbcleaner.api.Purge;
 import org.sonar.plugins.dbcleaner.api.PurgeContext;
+import org.sonar.plugins.dbcleaner.api.PurgeUtils;
 
 import javax.persistence.Query;
 import java.util.List;
@@ -33,11 +33,8 @@ import java.util.List;
  */
 public final class PurgeOrphanResources extends Purge {
 
-  private DbCleanerCommands dbCleanerCommands;
-
-  public PurgeOrphanResources(DatabaseSession session, DbCleanerCommands dbCleanerCommands) {
+  public PurgeOrphanResources(DatabaseSession session) {
     super(session);
-    this.dbCleanerCommands = dbCleanerCommands;
   }
 
   public void purge(PurgeContext context) {
@@ -45,7 +42,7 @@ public final class PurgeOrphanResources extends Purge {
       " r1 WHERE r1.rootId IS NOT NULL AND NOT EXISTS(FROM " + ResourceModel.class.getSimpleName() + " r2 WHERE r1.rootId=r2.id)");
     List<Integer> idsToDelete = query.getResultList();
     if (!idsToDelete.isEmpty()) {
-      dbCleanerCommands.deleteResources(idsToDelete);
+      PurgeUtils.deleteResources(getSession(), idsToDelete);
     }
   }
 }
index 97918dd30305febc22a283fb482fe4d5eeb52791..2b34186a8a5f36081e9cbbd918fcd59a980d72fd 100644 (file)
@@ -22,7 +22,6 @@ package org.sonar.plugins.dbcleaner.api;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.junit.Test;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
-import org.sonar.plugins.dbcleaner.api.PurgeUtils;
 
 import java.sql.SQLException;
 import java.util.Arrays;
index 2e87714e2e80e751257f5c69dbe57241f953e14b..8ff3d3d84c36de43385c6c479fa07f678cbab2b3 100644 (file)
@@ -21,13 +21,9 @@ package org.sonar.plugins.dbcleaner.purges;
 
 import org.junit.Test;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
-import org.sonar.persistence.resource.ResourceIndexerDao;
-import org.sonar.plugins.dbcleaner.api.DbCleanerCommands;
 
 import java.sql.SQLException;
 
-import static org.mockito.Mockito.mock;
-
 public class PurgeDisabledResourcesTest extends AbstractDbUnitTestCase {
 
   @Test
@@ -47,7 +43,7 @@ public class PurgeDisabledResourcesTest extends AbstractDbUnitTestCase {
 
   private void assertPurge(String testName) {
     setupData("sharedFixture", testName);
-    new PurgeDisabledResources(getSession(), new DbCleanerCommands(getSession(), mock(ResourceIndexerDao.class))).purge(null);
+    new PurgeDisabledResources(getSession()).purge(null);
     checkTables(testName, "snapshots", "project_measures");
   }
 }
index 5f443998ce3950fb15175645eb6b83f3924e8c20..87ba7fb9c8b4bac208834cb4220972c909defe99 100644 (file)
@@ -21,13 +21,9 @@ package org.sonar.plugins.dbcleaner.purges;
 
 import org.junit.Test;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
-import org.sonar.persistence.resource.ResourceIndexerDao;
-import org.sonar.plugins.dbcleaner.api.DbCleanerCommands;
 
 import java.sql.SQLException;
 
-import static org.mockito.Mockito.mock;
-
 public class PurgeOrphanResourcesTest extends AbstractDbUnitTestCase {
   @Test
   public void purgeOrphanResources() throws SQLException {
@@ -36,7 +32,7 @@ public class PurgeOrphanResourcesTest extends AbstractDbUnitTestCase {
 
   private void assertPurge(String testName) {
     setupData(testName);
-    new PurgeOrphanResources(getSession(), new DbCleanerCommands(getSession(), mock(ResourceIndexerDao.class))).purge(null);
+    new PurgeOrphanResources(getSession()).purge(null);
     checkTables(testName, "projects");
   }
 }
index 772bec2e4c7f9f005dc84131733b1a9770676bbc..165578cefb247f7ed694dacbf677e6bc7cc47ab7 100644 (file)
@@ -536,6 +536,13 @@ dashboard.Dashboard.description=Default dashboard
 dashboard.Hotspots.name=Hotspots
 dashboard.Hotspots.description=Most useful hotspots widgets
 
+#------------------------------------------------------------------------------
+#
+# SEARCH ENGINE FOR RESOURCES
+#
+#------------------------------------------------------------------------------
+search.results=results
+search.duration=({0} seconds)
 
 #------------------------------------------------------------------------------
 #
index 68561370ab7fe8afda042941a3c26a8a08349d34..99b9ebe845c9f4acead7d31db60683928934ccf5 100644 (file)
@@ -77,24 +77,6 @@ public class ResourceIndexerDao {
     return this;
   }
 
-  public ResourceIndexerDao delete(List<Integer> resourceIds) {
-    final SqlSession sqlSession = mybatis.openSession();
-    try {
-      ResourceIndexerMapper mapper = sqlSession.getMapper(ResourceIndexerMapper.class);
-      List<List<Integer>> partitionsOfResourceIds = Lists.partition(resourceIds, DatabaseUtils.MAX_IN_ELEMENTS);
-      for (List<Integer> partitionOfResourceIds : partitionsOfResourceIds) {
-        if (!partitionOfResourceIds.isEmpty()) {
-          mapper.deleteByResourceIds(partitionOfResourceIds);
-        }
-      }
-      sqlSession.commit();
-
-    } finally {
-      sqlSession.close();
-    }
-    return this;
-  }
-
   void index(ResourceDto resource, SqlSession session, boolean correctProjectRootId) {
     String name = resource.getName();
     if (StringUtils.isBlank(name) || resource.getId() == null) {
index beec37e4bfd660e8e8beb253e4f20eaae132f38f..2fd1ad13fe5c8d9eaeafb4276ff3f992e9066f5e 100644 (file)
@@ -31,7 +31,5 @@ public interface ResourceIndexerMapper {
 
   void deleteByResourceId(int resourceId);
 
-  void deleteByResourceIds(@Param("resourceIds") List<Integer> resourceIds);
-
   void insert(ResourceIndexDto dto);
 }
index bae19fea41a737726f662bcdb8bdcbe669f6fb58..62e58dfcd519eeb7baebabebeb3ccb4448503a13 100644 (file)
     where resource_id=#{id}
   </delete>
 
-  <delete id="deleteByResourceIds" parameterType="map">
-    delete from resource_index
-    where resource_id in
-    <foreach item="i" index="index" collection="resourceIds" open="(" separator="," close=")">#{i}</foreach>
-  </delete>
-
-
   <insert id="insert" parameterType="ResourceIndex" useGeneratedKeys="false">
     insert into resource_index (kee, position, name_size, resource_id, root_project_id, qualifier)
     values (#{key}, #{position}, #{nameSize}, #{resourceId}, #{rootProjectId}, #{qualifier})
index 7312b15b0885d7afaa48093a8cc81f29888e59ae..c23b4dd554c2340279e5c3a18b9e25c8ac099c21 100644 (file)
@@ -69,13 +69,4 @@ public class ResourceIndexerDaoTest extends DaoTestCase {
 
     checkTables("shouldReindexProjectAfterRenaming", "resource_index");
   }
-
-  @Test
-  public void shouldDeleteIndexes() {
-    setupData("shouldDeleteIndexes");
-
-    dao.delete(Arrays.asList(3, 4, 5, 6));
-
-    checkTables("shouldDeleteIndexes", "resource_index");
-  }
 }
diff --git a/sonar-core/src/test/resources/org/sonar/persistence/resource/ResourceIndexerDaoTest/shouldDeleteIndexes-result.xml b/sonar-core/src/test/resources/org/sonar/persistence/resource/ResourceIndexerDaoTest/shouldDeleteIndexes-result.xml
deleted file mode 100644 (file)
index 1eb9d33..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<dataset>
-
-  <resource_index kee="struts" position="0" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-  <resource_index kee="truts" position="1" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-  <resource_index kee="ruts" position="2" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-  <resource_index kee="uts" position="3" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-
-</dataset>
diff --git a/sonar-core/src/test/resources/org/sonar/persistence/resource/ResourceIndexerDaoTest/shouldDeleteIndexes.xml b/sonar-core/src/test/resources/org/sonar/persistence/resource/ResourceIndexerDaoTest/shouldDeleteIndexes.xml
deleted file mode 100644 (file)
index 535c13f..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<dataset>
-
-  <!-- Struts -->
-  <resource_index kee="struts" position="0" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-  <resource_index kee="truts" position="1" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-  <resource_index kee="ruts" position="2" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-  <resource_index kee="uts" position="3" name_size="6" resource_id="1" root_project_id="1" qualifier="TRK"/>
-
-  <!-- RequestContext -->
-  <resource_index kee="requestcontext" position="0" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="equestcontext" position="1" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="questcontext" position="2" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="uestcontext" position="3" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="estcontext" position="4" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="stcontext" position="5" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="tcontext" position="6" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="context" position="7" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="ontext" position="8" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="ntext" position="9" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="text" position="10" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="ext" position="11" name_size="14" resource_id="3" root_project_id="1" qualifier="FIL"/>
-
-  <!-- ZipUtils -->
-  <resource_index kee="ziputils" position="0" name_size="8" resource_id="6" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="iputils" position="1" name_size="8" resource_id="6" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="putils" position="2" name_size="8" resource_id="6" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="utils" position="3" name_size="8" resource_id="6" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="tils" position="4" name_size="8" resource_id="6" root_project_id="1" qualifier="FIL"/>
-  <resource_index kee="ils" position="5" name_size="8" resource_id="6" root_project_id="1" qualifier="FIL"/>
-
-</dataset>
index 01b358e17ce747bb149394bfe98cc263fc1f91f4..0a4028f22b77b3710adc5f0aab9fe75899d9c522 100644 (file)
@@ -44,6 +44,7 @@ class Project < ActiveRecord::Base
     if project
       Snapshot.update_all(['islast=?', false], ['(root_project_id=? OR project_id=?) AND islast=?', project.id, project.id, true])
       Project.delete_all(['id=? OR root_id=? or copy_resource_id=?', project.id, project.id, project.id])
+      ResourceIndex.delete_all(['root_project_id=?', project.id])
     end
   end
 
index e17bcfba88370c95724978b007afafda8975df0f..029e8a7d3b65637e5c4f63746706e791537ee02e 100644 (file)
@@ -1,24 +1,27 @@
-<% search = params[:s] %>
 <% unless @results_by_qualifier.empty? %>
   <ul>
     <%
        @results_by_qualifier.keys.each do |qualifier|
     %>
-      <%
-         @results_by_qualifier[qualifier].each_with_index do |resource_index, index|
+<%
+         first=true
+         @results_by_qualifier[qualifier].each do |resource_index|
            resource=@resources_by_id[resource_index.resource_id]
-      %>
+           if resource
+%>
         <li id="<%= resource.id -%>">
-          <div class="q"><%= index==0 ? message("qualifiers.#{qualifier}") : '' -%></div>
-
-          <%= qualifier_icon resource -%> <%= highlight(resource.name(true), search) -%>
+          <div class="q"><%= message("qualifiers.#{qualifier}") if first -%></div>
+          <%= qualifier_icon resource -%> <%= highlight(truncate(resource.name(true), :length => 65), params[:s]) -%>
         </li>
-      <% end %>
-    <% end %>
+<%           first=false
+           end
+         end
+       end
+%>
   </ul>
 <% else %>
   <ul>
-    <li>No results</li>
+    <li><%= message('no_results') -%></li>
   </ul>
 <% end %>
-<div class="autocompleteNote"><%= @total -%> results (<%= Time.now - @start_time -%> seconds)</div>
\ No newline at end of file
+<div class="autocompleteNote"><%= @total -%> <%= message('search.results') -%> <%= message('search.duration', :params => [Time.now - @start_time]) -%></div>
\ No newline at end of file