From: Jean-Baptiste Lievremont Date: Tue, 4 Nov 2014 09:34:50 +0000 (+0100) Subject: SONAR-5747 Replace componentRootUuids (modules) facet with projectUuids (project... X-Git-Tag: 5.0-RC1~420 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a128cf14122b65557268a90e6f6873b14b4fc8ae;p=sonarqube.git SONAR-5747 Replace componentRootUuids (modules) facet with projectUuids (project) facet --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java b/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java index 66952cc3f46..7359066af74 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java @@ -30,6 +30,7 @@ import org.sonar.server.db.BaseDao; import org.sonar.server.exceptions.NotFoundException; import javax.annotation.CheckForNull; + import java.util.Collection; import java.util.Collections; import java.util.List; diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java index 7f8a5e28b73..865bedc73a2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java @@ -59,6 +59,7 @@ public class IssueQuery { private final Collection resolutions; private final Collection components; private final Collection componentRoots; + private final Collection projects; private final Collection rules; private final Collection actionPlans; private final Collection reporters; @@ -81,6 +82,7 @@ public class IssueQuery { this.resolutions = defaultCollection(builder.resolutions); this.components = defaultCollection(builder.components); this.componentRoots = defaultCollection(builder.componentRoots); + this.projects = defaultCollection(builder.projects); this.rules = defaultCollection(builder.rules); this.actionPlans = defaultCollection(builder.actionPlans); this.reporters = defaultCollection(builder.reporters); @@ -121,6 +123,10 @@ public class IssueQuery { return componentRoots; } + public Collection projectUuids() { + return projects; + } + public Collection rules() { return rules; } @@ -205,6 +211,7 @@ public class IssueQuery { private Collection resolutions; private Collection components; private Collection componentRoots; + private Collection projects; private Collection rules; private Collection actionPlans; private Collection reporters; @@ -253,6 +260,11 @@ public class IssueQuery { return this; } + public Builder projectUuids(@Nullable Collection l) { + this.projects = l; + return this; + } + public Builder rules(@Nullable Collection rules) { this.rules = rules; return this; diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java index a69321e8139..931e15fc888 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java @@ -75,6 +75,8 @@ public class IssueQueryService implements ServerComponent { .createdAt(RubyUtils.toDate(params.get(IssueFilterParameters.CREATED_AT))) .createdAfter(RubyUtils.toDate(params.get(IssueFilterParameters.CREATED_AFTER))) .createdBefore(RubyUtils.toDate(params.get(IssueFilterParameters.CREATED_BEFORE))); + addProjectUuids(builder, session, + RubyUtils.toStrings(params.get(IssueFilterParameters.PROJECT_UUIDS)), RubyUtils.toStrings(params.get(IssueFilterParameters.PROJECTS))); addComponentUuids(builder, session, RubyUtils.toStrings(params.get(IssueFilterParameters.COMPONENT_UUIDS)), RubyUtils.toStrings(params.get(IssueFilterParameters.COMPONENTS))); addComponentRootUuids(builder, session, @@ -110,6 +112,8 @@ public class IssueQueryService implements ServerComponent { .createdAt(request.paramAsDateTime(IssueFilterParameters.CREATED_AT)) .createdAfter(request.paramAsDateTime(IssueFilterParameters.CREATED_AFTER)) .createdBefore(request.paramAsDateTime(IssueFilterParameters.CREATED_BEFORE)); + addProjectUuids(builder, session, + request.paramAsStrings(IssueFilterParameters.PROJECT_UUIDS), request.paramAsStrings(IssueFilterParameters.PROJECTS)); addComponentUuids(builder, session, request.paramAsStrings(IssueFilterParameters.COMPONENT_UUIDS), request.paramAsStrings(IssueFilterParameters.COMPONENTS)); addComponentRootUuids(builder, session, @@ -126,6 +130,17 @@ public class IssueQueryService implements ServerComponent { } } + private void addProjectUuids(IssueQuery.Builder builder, DbSession session, @Nullable Collection projectUuids, @Nullable Collection projects) { + if (projectUuids != null) { + if (projects != null) { + throw new IllegalArgumentException("projects and projectUuids cannot be set simultaneously"); + } + builder.projectUuids(projectUuids); + } else { + builder.projectUuids(componentUuids(session, projects)); + } + } + private void addComponentUuids(IssueQuery.Builder builder, DbSession session, @Nullable Collection componentUuids, @Nullable Collection components) { if (componentUuids != null) { if (components != null) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java b/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java index 1e3ec734057..2993965d56f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java @@ -42,6 +42,8 @@ public class IssueFilterParameters { public static final String COMPONENT_UUIDS = "componentUuids"; public static final String COMPONENT_ROOTS = "componentRoots"; public static final String COMPONENT_ROOT_UUIDS = "componentRootUuids"; + public static final String PROJECTS = "projects"; + public static final String PROJECT_UUIDS = "projectUuids"; public static final String RULES = "rules"; public static final String ACTION_PLANS = "actionPlans"; public static final String REPORTERS = "reporters"; @@ -59,7 +61,8 @@ public class IssueFilterParameters { public static final String ASC = "asc"; public static final List ALL = ImmutableList.of(ISSUES, SEVERITIES, STATUSES, RESOLUTIONS, RESOLVED, COMPONENTS, COMPONENT_ROOTS, RULES, ACTION_PLANS, REPORTERS, - ASSIGNEES, LANGUAGES, ASSIGNED, PLANNED, HIDE_RULES, CREATED_AT, CREATED_AFTER, CREATED_BEFORE, PAGE_SIZE, PAGE_INDEX, SORT, ASC, COMPONENT_UUIDS, COMPONENT_ROOT_UUIDS); + ASSIGNEES, LANGUAGES, ASSIGNED, PLANNED, HIDE_RULES, CREATED_AT, CREATED_AFTER, CREATED_BEFORE, PAGE_SIZE, PAGE_INDEX, SORT, ASC, COMPONENT_UUIDS, COMPONENT_ROOT_UUIDS, + PROJECTS, PROJECT_UUIDS); public static final List ALL_WITHOUT_PAGINATION = newArrayList(Iterables.filter(ALL, new Predicate() { @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java index a9f0b3903e2..d348c3e6a7d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java @@ -285,6 +285,7 @@ public class IssueIndex extends BaseIndex { filters.put(IssueNormalizer.IssueField.ASSIGNEE.field(), matchFilter(IssueNormalizer.IssueField.ASSIGNEE, query.assignees())); filters.put(IssueNormalizer.IssueField.MODULE_PATH.field(), matchFilter(IssueNormalizer.IssueField.MODULE_PATH, query.componentRootUuids())); filters.put(IssueNormalizer.IssueField.COMPONENT.field(), matchFilter(IssueNormalizer.IssueField.COMPONENT, query.componentUuids())); + filters.put(IssueNormalizer.IssueField.PROJECT.field(), matchFilter(IssueNormalizer.IssueField.PROJECT, query.projectUuids())); filters.put(IssueNormalizer.IssueField.LANGUAGE.field(), matchFilter(IssueNormalizer.IssueField.LANGUAGE, query.languages())); filters.put(IssueNormalizer.IssueField.RESOLUTION.field(), matchFilter(IssueNormalizer.IssueField.RESOLUTION, query.resolutions())); filters.put(IssueNormalizer.IssueField.REPORTER.field(), matchFilter(IssueNormalizer.IssueField.REPORTER, query.reporters())); @@ -345,10 +346,10 @@ public class IssueIndex extends BaseIndex { IssueFilterParameters.STATUSES, IssueNormalizer.IssueField.STATUS.field(), 0); addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch, IssueFilterParameters.ACTION_PLANS, IssueNormalizer.IssueField.ACTION_PLAN.field(), 1, query.actionPlans().toArray()); - addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch, - IssueFilterParameters.COMPONENT_ROOT_UUIDS, IssueNormalizer.IssueField.MODULE_PATH.field(), 1, query.componentRootUuids().toArray()); addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch, IssueFilterParameters.COMPONENT_UUIDS, IssueNormalizer.IssueField.COMPONENT.field(), 1, query.componentUuids().toArray()); + addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch, + IssueFilterParameters.PROJECT_UUIDS, IssueNormalizer.IssueField.PROJECT.field(), 1, query.projectUuids().toArray()); addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch, IssueFilterParameters.LANGUAGES, IssueNormalizer.IssueField.LANGUAGE.field(), 0, query.languages().toArray()); addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch, diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java index 7c55aa257bf..eae90769d0a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java @@ -140,6 +140,10 @@ public class SearchAction extends SearchRequestHandler { "Issues associated to its sub-components (such as files, packages, etc.) are not retrieved. See also componentRoots. " + "If this parameter is set, componentUuids must not be set.") .setExampleValue("org.apache.struts:struts:org.apache.struts.Action"); + action.createParam(IssueFilterParameters.PROJECTS) + .setDescription("To retrieve issues associated to a specific list of projects (comma-separated list of project keys). " + + "If this parameter is set, projectUuids must not be set.") + .setExampleValue("org.apache.struts:struts:org.apache.struts.Action"); action.createParam(IssueFilterParameters.COMPONENT_ROOTS) .setDescription("To retrieve issues associated to a specific list of components and their sub-components (comma-separated list of component keys). " + "Views are not supported. If this parameter is set, componentRootUuids must not be set.") @@ -154,6 +158,10 @@ public class SearchAction extends SearchRequestHandler { .setDescription("To retrieve issues associated to a specific list of components and their sub-components (comma-separated list of component UUIDs). " + "Views are not supported. If this parameter is set, componentRoots must not be set.") .setExampleValue("7d8749e8-3070-4903-9188-bdd82933bb92"); + action.createParam(IssueFilterParameters.PROJECT_UUIDS) + .setDescription("To retrieve issues associated to a specific list of projects (comma-separated list of project UUIDs). " + + "Views are not supported. If this parameter is set, projects must not be set.") + .setExampleValue("7d8749e8-3070-4903-9188-bdd82933bb92"); action.createParam(IssueFilterParameters.RULES) .setDescription("Comma-separated list of coding rule keys. Format is :") .setExampleValue("squid:AvoidCycles"); @@ -231,7 +239,7 @@ public class SearchAction extends SearchRequestHandler { IssueFilterParameters.STATUSES, IssueFilterParameters.RESOLUTIONS, IssueFilterParameters.ACTION_PLANS, - IssueFilterParameters.COMPONENT_ROOT_UUIDS, + IssueFilterParameters.PROJECT_UUIDS, IssueFilterParameters.RULES, IssueFilterParameters.ASSIGNEES, IssueFilterParameters.REPORTERS, @@ -277,7 +285,7 @@ public class SearchAction extends SearchRequestHandler { } } - collectFacetKeys(result, IssueFilterParameters.COMPONENT_ROOT_UUIDS, projectUuids); + collectFacetKeys(result, IssueFilterParameters.PROJECT_UUIDS, projectUuids); collectFacetKeys(result, IssueFilterParameters.COMPONENT_UUIDS, componentUuids); collectFacetKeys(result, IssueFilterParameters.ASSIGNEES, userLogins); collectFacetKeys(result, IssueFilterParameters.REPORTERS, userLogins); @@ -293,11 +301,15 @@ public class SearchAction extends SearchRequestHandler { List fileDtos = dbClient.componentDao().getByUuids(session, componentUuids); List subProjectDtos = dbClient.componentDao().findSubProjectsByComponentUuids(session, componentUuids); - projectDtos = dbClient.componentDao().getByUuids(session, projectUuids); componentDtos.addAll(fileDtos); componentDtos.addAll(subProjectDtos); - componentDtos.addAll(projectDtos); + for (ComponentDto component: componentDtos) { + projectUuids.add(component.projectUuid()); + } + + projectDtos = dbClient.componentDao().getByUuids(session, projectUuids); + componentDtos.addAll(projectDtos); for (ComponentDto componentDto : componentDtos) { componentsByUuid.put(componentDto.uuid(), componentDto); } @@ -595,7 +607,7 @@ public class SearchAction extends SearchRequestHandler { throw new IllegalStateException("Component has no UUID: " + component.getKey()); } if (!projectsByUuid.containsKey(component.projectUuid())) { - throw new IllegalStateException("Project cannot be found for component: " + component.getKey()); + throw new IllegalStateException("Project cannot be found for component: " + component.getKey() + " / " + component.uuid()); } projectsByComponentUuid.put(component.uuid(), projectsByUuid.get(component.projectUuid())); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java index b8b20f21555..58b57a54c50 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java @@ -128,7 +128,7 @@ public class SearchActionMediumTest { assertThat(show.isPost()).isFalse(); assertThat(show.isInternal()).isFalse(); assertThat(show.responseExampleAsString()).isNotEmpty(); - assertThat(show.params()).hasSize(28); + assertThat(show.params()).hasSize(30); } @Test @@ -378,7 +378,7 @@ public class SearchActionMediumTest { WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION) .setParam("resolved", "false") - .setParam(SearchAction.PARAM_FACETS, "statuses,severities,resolutions,componentRootUuids,rules,componentUuids,assignees,languages") + .setParam(SearchAction.PARAM_FACETS, "statuses,severities,resolutions,projectUuids,rules,componentUuids,assignees,languages") .execute(); result.assertJson(this.getClass(), "display_facets.json", false); } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_facets.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_facets.json index 11b25073b4b..fae2761ffcc 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_facets.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/display_facets.json @@ -40,10 +40,10 @@ ] }, { - "property": "componentRootUuids", + "property": "projectUuids", "values": [ { - "val": "abcd", + "val": "ABCD", "count": 1 } ] diff --git a/server/sonar-web/src/main/coffee/issues/controller.coffee b/server/sonar-web/src/main/coffee/issues/controller.coffee index 2c00adf1641..44f4a4d133b 100644 --- a/server/sonar-web/src/main/coffee/issues/controller.coffee +++ b/server/sonar-web/src/main/coffee/issues/controller.coffee @@ -13,10 +13,10 @@ define [ $ = jQuery EXTRA_FIELDS = 'actions,transitions,assigneeName,reporterName,actionPlanName' PAGE_SIZE = 50 - ALL_FACETS = ['severities', 'statuses', 'resolutions', 'componentRootUuids', 'assignees', 'reporters', 'rules', + ALL_FACETS = ['severities', 'statuses', 'resolutions', 'projectUuids', 'assignees', 'reporters', 'rules', 'languages', 'actionPlans', 'componentUuids', 'creationDate'] FACET_DATA_FIELDS = ['components', 'projects', 'users', 'rules', 'actionPlans', 'languages'] - FACETS_FROM_SERVER = ['severities', 'statuses', 'resolutions', 'actionPlans', 'componentRootUuids', 'rules', + FACETS_FROM_SERVER = ['severities', 'statuses', 'resolutions', 'actionPlans', 'projectUuids', 'rules', 'assignees', 'reporters', 'componentUuids', 'languages'] diff --git a/server/sonar-web/src/main/coffee/issues/facets-view.coffee b/server/sonar-web/src/main/coffee/issues/facets-view.coffee index a36652b06a1..6ffd106f947 100644 --- a/server/sonar-web/src/main/coffee/issues/facets-view.coffee +++ b/server/sonar-web/src/main/coffee/issues/facets-view.coffee @@ -40,7 +40,7 @@ define [ when 'assignees' then AssigneeFacet when 'resolutions' then ResolutionFacet when 'creationDate' then CreationDateFacet - when 'componentRootUuids' then ProjectFacet + when 'projectUuids' then ProjectFacet when 'rules' then RuleFacet when 'actionPlans' then ActionPlanFacet when 'componentUuids' then ComponentFacet @@ -61,4 +61,3 @@ define [ enabledFacets = @collection.filter (model) -> model.get('enabled') enabledFacetIds = enabledFacets.map (model) -> model.id @options.app.state.set facets: enabledFacetIds - diff --git a/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java b/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java index 4f25ede6e8f..37c0a894ae8 100644 --- a/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java @@ -23,6 +23,7 @@ import org.apache.ibatis.annotations.Param; import org.sonar.core.component.ComponentDto; import javax.annotation.CheckForNull; + import java.util.Collection; import java.util.List; diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index 61e917b5c76..6ab436ff08a 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -773,7 +773,7 @@ issues.found=Found # #------------------------------------------------------------------------------ issues.facet.severities=Severity -issues.facet.componentRootUuids=Project +issues.facet.projectUuids=Project issues.facet.statuses=Status issues.facet.actionPlans=Action Plan issues.facet.assignees=Assignee