From 376dadea6735cf4e2004e11cc7c9b137bbdaa907 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Tue, 10 Feb 2015 15:52:44 +0100 Subject: [PATCH] SONAR-6065 Simplify handling of component related parameters --- .../sonar/server/issue/IssueQueryService.java | 152 ++++++++---------- 1 file changed, 64 insertions(+), 88 deletions(-) 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 c2a59641dc5..ea8b19c55bb 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 @@ -39,7 +39,6 @@ import org.sonar.core.component.ComponentDto; import org.sonar.core.persistence.DbSession; import org.sonar.server.component.ComponentService; import org.sonar.server.db.DbClient; -import org.sonar.server.issue.IssueQuery.Builder; import org.sonar.server.issue.filter.IssueFilterParameters; import org.sonar.server.search.ws.SearchRequestHandler; import org.sonar.server.user.UserSession; @@ -93,7 +92,8 @@ public class IssueQueryService implements ServerComponent { .createdBefore(RubyUtils.toDate(params.get(IssueFilterParameters.CREATED_BEFORE))); Set allComponentUuids = Sets.newHashSet(); - boolean effectiveOnComponentOnly = mergeComponentParameters(session, RubyUtils.toBoolean(params.get(IssueFilterParameters.ON_COMPONENT_ONLY)), + boolean effectiveOnComponentOnly = mergeDeprecatedComponentParameters(session, + RubyUtils.toBoolean(params.get(IssueFilterParameters.ON_COMPONENT_ONLY)), RubyUtils.toStrings(params.get(IssueFilterParameters.COMPONENTS)), RubyUtils.toStrings(params.get(IssueFilterParameters.COMPONENT_UUIDS)), RubyUtils.toStrings(params.get(IssueFilterParameters.COMPONENT_KEYS)), @@ -155,7 +155,8 @@ public class IssueQueryService implements ServerComponent { .ignorePaging(request.paramAsBoolean(IssueFilterParameters.IGNORE_PAGING)); Set allComponentUuids = Sets.newHashSet(); - boolean effectiveOnComponentOnly = mergeComponentParameters(session, request.paramAsBoolean(IssueFilterParameters.ON_COMPONENT_ONLY), + boolean effectiveOnComponentOnly = mergeDeprecatedComponentParameters(session, + request.paramAsBoolean(IssueFilterParameters.ON_COMPONENT_ONLY), request.paramAsStrings(IssueFilterParameters.COMPONENTS), request.paramAsStrings(IssueFilterParameters.COMPONENT_UUIDS), request.paramAsStrings(IssueFilterParameters.COMPONENT_KEYS), @@ -184,7 +185,7 @@ public class IssueQueryService implements ServerComponent { } } - private boolean mergeComponentParameters(DbSession session, Boolean onComponentOnly, + private boolean mergeDeprecatedComponentParameters(DbSession session, Boolean onComponentOnly, @Nullable Collection components, @Nullable Collection componentUuids, @Nullable Collection componentKeys, @@ -193,7 +194,9 @@ public class IssueQueryService implements ServerComponent { Set allComponentUuids) { boolean effectiveOnComponentOnly = false; - failOnIncompatibleParameters(components, componentUuids, componentKeys, componentRootUuids, componentRoots); + failIfBothParametersSet(componentRootUuids, componentRoots, "componentRoots and componentRootUuids cannot be set simultaneously"); + failIfBothParametersSet(componentUuids, components, "components and componentUuids cannot be set simultaneously"); + failIfBothParametersSet(componentKeys, componentUuids, "componentKeys and componentUuids cannot be set simultaneously"); if (componentRootUuids != null) { allComponentUuids.addAll(componentRootUuids); @@ -214,17 +217,6 @@ public class IssueQueryService implements ServerComponent { return effectiveOnComponentOnly; } - protected void failOnIncompatibleParameters( - @Nullable Collection components, - @Nullable Collection componentUuids, - @Nullable Collection componentKeys, - @Nullable Collection componentRootUuids, - @Nullable Collection componentRoots) { - failIfBothParametersSet(componentRootUuids, componentRoots, "componentRoots and componentRootUuids cannot be set simultaneously"); - failIfBothParametersSet(componentUuids, components, "components and componentUuids cannot be set simultaneously"); - failIfBothParametersSet(componentKeys, componentUuids, "componentKeys and componentUuids cannot be set simultaneously"); - } - private void failIfBothParametersSet(@Nullable Collection uuids, @Nullable Collection keys, String message) { if (uuids != null && keys != null) { throw new IllegalArgumentException(message); @@ -232,38 +224,53 @@ public class IssueQueryService implements ServerComponent { } private void addComponentParameters(IssueQuery.Builder builder, DbSession session, - boolean effectiveOnComponentOnly, - Collection allComponentUuids, + boolean onComponentOnly, + Collection componentUuids, @Nullable Collection projectUuids, @Nullable Collection projects, @Nullable Collection moduleUuids, @Nullable Collection directories, @Nullable Collection fileUuids, @Nullable Collection authors) { - builder.onComponentOnly(effectiveOnComponentOnly); + builder.onComponentOnly(onComponentOnly); + if (onComponentOnly) { + builder.componentUuids(componentUuids); + return; + } - if (allComponentUuids.isEmpty()) { - addComponentsBelowView(builder, session, authors, projects, projectUuids, moduleUuids, directories, fileUuids); + builder.authors(authors); + failIfBothParametersSet(projectUuids, projects, "projects and projectUuids cannot be set simultaneously"); + if (projectUuids != null) { + builder.projectUuids(projectUuids); } else { - if (effectiveOnComponentOnly) { - builder.componentUuids(allComponentUuids); - return; - } + builder.projectUuids(componentUuids(session, projects)); + } + builder.moduleUuids(moduleUuids); + builder.directories(directories); + builder.fileUuids(fileUuids); - Set qualifiers = componentService.getDistinctQualifiers(session, allComponentUuids); - if (qualifiers.isEmpty()) { - // Qualifier not found, defaulting to componentUuids (e.g ) - builder.componentUuids(allComponentUuids); - return; - } - if (qualifiers.size() > 1) { - throw new IllegalArgumentException("All components must have the same qualifier, found " + Joiner.on(',').join(qualifiers)); - } + if (!componentUuids.isEmpty()) { + addComponentsBasedOnQualifier(builder, session, componentUuids, authors); + } + } + + protected void addComponentsBasedOnQualifier(IssueQuery.Builder builder, DbSession session, Collection componentUuids, Collection authors) { + Set qualifiers = componentService.getDistinctQualifiers(session, componentUuids); + if (qualifiers.isEmpty()) { + // Qualifier not found, defaulting to componentUuids (e.g ) + builder.componentUuids(componentUuids); + return; + } + if (qualifiers.size() > 1) { + throw new IllegalArgumentException("All components must have the same qualifier, found " + Joiner.on(',').join(qualifiers)); + } - String uniqueQualifier = qualifiers.iterator().next(); - if (Qualifiers.VIEW.equals(uniqueQualifier) || Qualifiers.SUBVIEW.equals(uniqueQualifier)) { + String uniqueQualifier = qualifiers.iterator().next(); + switch(uniqueQualifier) { + case Qualifiers.VIEW: + case Qualifiers.SUBVIEW: List filteredViewUuids = newArrayList(); - for (String viewUuid : allComponentUuids) { + for (String viewUuid : componentUuids) { if ((Qualifiers.VIEW.equals(uniqueQualifier) && UserSession.get().hasProjectPermissionByUuid(UserRole.USER, viewUuid)) || (Qualifiers.SUBVIEW.equals(uniqueQualifier) && UserSession.get().hasComponentUuidPermission(UserRole.USER, viewUuid))) { filteredViewUuids.add(viewUuid); @@ -273,66 +280,35 @@ public class IssueQueryService implements ServerComponent { filteredViewUuids.add(UNKNOWN); } builder.viewUuids(filteredViewUuids); - addComponentsBelowView(builder, session, authors, projects, projectUuids, moduleUuids, directories, fileUuids); - } else if ("DEV".equals(uniqueQualifier)) { + break; + case "DEV": // XXX No constant for developer !!! - Collection actualAuthors = authors == null ? dbClient.authorDao().selectScmAccountsByDeveloperUuids(session, allComponentUuids) : authors; - addComponentsBelowView(builder, session, actualAuthors, projects, projectUuids, moduleUuids, directories, fileUuids); - } else if (Qualifiers.PROJECT.equals(uniqueQualifier)) { - builder.projectUuids(allComponentUuids); - addComponentsBelowModule(builder, moduleUuids, directories, fileUuids); - } else if (Qualifiers.MODULE.equals(uniqueQualifier)) { - builder.moduleRootUuids(allComponentUuids); - addComponentsBelowModule(builder, moduleUuids, directories, fileUuids); - } else if (Qualifiers.DIRECTORY.equals(uniqueQualifier)) { + Collection actualAuthors = authors == null ? dbClient.authorDao().selectScmAccountsByDeveloperUuids(session, componentUuids) : authors; + builder.authors(actualAuthors); + break; + case Qualifiers.PROJECT: + builder.projectUuids(componentUuids); + break; + case Qualifiers.MODULE: + builder.moduleRootUuids(componentUuids); + break; + case Qualifiers.DIRECTORY: Collection directoryModuleUuids = Sets.newHashSet(); Collection directoryPaths = Sets.newHashSet(); - for (ComponentDto directory : componentService.getByUuids(session, allComponentUuids)) { + for (ComponentDto directory : componentService.getByUuids(session, componentUuids)) { directoryModuleUuids.add(directory.moduleUuid()); directoryPaths.add(directory.path()); } builder.moduleUuids(directoryModuleUuids); builder.directories(directoryPaths); - addComponentsBelowDirectory(builder, fileUuids); - } else if (Qualifiers.FILE.equals(uniqueQualifier) || Qualifiers.UNIT_TEST_FILE.equals(uniqueQualifier)) { - builder.fileUuids(allComponentUuids); - } else { - throw new IllegalArgumentException("Unable to set search root context for components " + Joiner.on(',').join(allComponentUuids)); - } - } - } - - private void addComponentsBelowView(Builder builder, DbSession session, @Nullable Collection authors, - @Nullable Collection projects, @Nullable Collection projectUuids, - @Nullable Collection moduleUuids, Collection directories, Collection fileUuids) { - - builder.authors(authors); - - failIfBothParametersSet(projectUuids, projects, "projects and projectUuids cannot be set simultaneously"); - - if (projectUuids != null) { - builder.projectUuids(projectUuids); - } else { - builder.projectUuids(componentUuids(session, projects)); + break; + case Qualifiers.FILE: + case Qualifiers.UNIT_TEST_FILE: + builder.fileUuids(componentUuids); + break; + default: + throw new IllegalArgumentException("Unable to set search root context for components " + Joiner.on(',').join(componentUuids)); } - addComponentsBelowModule(builder, moduleUuids, directories, fileUuids); - } - - private void addComponentsBelowModule(Builder builder, - @Nullable Collection moduleUuids, @Nullable Collection directories, @Nullable Collection fileUuids) { - builder.moduleUuids(moduleUuids); - addComponentsBelowModule(builder, directories, fileUuids); - } - - private void addComponentsBelowModule(Builder builder, - @Nullable Collection directories, @Nullable Collection fileUuids) { - builder.directories(directories); - addComponentsBelowDirectory(builder, fileUuids); - } - - private void addComponentsBelowDirectory(Builder builder, - @Nullable Collection fileUuids) { - builder.fileUuids(fileUuids); } private Collection componentUuids(DbSession session, @Nullable Collection componentKeys) { -- 2.39.5