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;
return Arrays.asList(
// shared components
DefaultPeriodCleaner.class,
- DbCleanerCommands.class,
// purges
PurgeOrphanResources.class, PurgeEntities.class, PurgeRuleMeasures.class, PurgeUnprocessed.class, PurgeDeletedResources.class,
+++ /dev/null
-/*
- * 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;
- }
-}
*/
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
*/
/**
* Delete DUPLICATIONS_INDEX table
- *
+ *
* @since 2.11
*/
private static void deleteDuplicationBlocks(DatabaseSession session, List<Integer> snapshotIds) {
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
*/
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;
*/
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() {
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;
*/
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) {
" 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);
}
}
}
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;
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
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");
}
}
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 {
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");
}
}
dashboard.Hotspots.name=Hotspots
dashboard.Hotspots.description=Most useful hotspots widgets
+#------------------------------------------------------------------------------
+#
+# SEARCH ENGINE FOR RESOURCES
+#
+#------------------------------------------------------------------------------
+search.results=results
+search.duration=({0} seconds)
#------------------------------------------------------------------------------
#
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) {
void deleteByResourceId(int resourceId);
- void deleteByResourceIds(@Param("resourceIds") List<Integer> resourceIds);
-
void insert(ResourceIndexDto dto);
}
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})
checkTables("shouldReindexProjectAfterRenaming", "resource_index");
}
-
- @Test
- public void shouldDeleteIndexes() {
- setupData("shouldDeleteIndexes");
-
- dao.delete(Arrays.asList(3, 4, 5, 6));
-
- checkTables("shouldDeleteIndexes", "resource_index");
- }
}
+++ /dev/null
-<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>
+++ /dev/null
-<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>
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
-<% 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