diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2017-09-08 10:09:50 +0200 |
---|---|---|
committer | Stas Vilchik <stas.vilchik@sonarsource.com> | 2017-09-11 11:28:29 +0200 |
commit | 0ec5f41e2973a1d277e55b44ec7d435dba1be95b (patch) | |
tree | 29bdbee2ca77e1034f75884245c66b0b9b14d116 | |
parent | 3ac9340f013701017f8dbab5b0686d2682f1768f (diff) | |
download | sonarqube-0ec5f41e2973a1d277e55b44ec7d435dba1be95b.tar.gz sonarqube-0ec5f41e2973a1d277e55b44ec7d435dba1be95b.zip |
SONAR-9181 WS bulk_apply_template accepts several qualifiers
7 files changed, 61 insertions, 36 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/BulkApplyTemplateAction.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/BulkApplyTemplateAction.java index e56b103db7b..5d17a3eb34a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/BulkApplyTemplateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/BulkApplyTemplateAction.java @@ -19,11 +19,9 @@ */ package org.sonar.server.permission.ws.template; -import com.google.common.collect.Collections2; import java.util.List; -import javax.annotation.Nullable; import org.sonar.api.i18n.I18n; -import org.sonar.api.resources.ResourceType; +import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.ResourceTypes; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; @@ -40,15 +38,17 @@ import org.sonar.server.permission.ws.PermissionsWsAction; import org.sonar.server.user.UserSession; import org.sonarqube.ws.client.permission.BulkApplyTemplateWsRequest; +import static org.sonar.core.util.Protobuf.setNullable; import static org.sonar.server.permission.PermissionPrivilegeChecker.checkGlobalAdmin; import static org.sonar.server.permission.ws.PermissionsWsParametersBuilder.createTemplateParameters; import static org.sonar.server.permission.ws.template.WsTemplateRef.newTemplateRef; -import static org.sonar.server.ws.WsParameterBuilder.createRootQualifierParameter; +import static org.sonar.server.ws.WsParameterBuilder.createRootQualifiersParameter; import static org.sonar.server.ws.WsParameterBuilder.QualifierParameterContext.newQualifierParameterContext; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_ORGANIZATION; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_QUALIFIER; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_QUALIFIERS; public class BulkApplyTemplateAction implements PermissionsWsAction { @@ -69,15 +69,6 @@ public class BulkApplyTemplateAction implements PermissionsWsAction { this.resourceTypes = resourceTypes; } - private static BulkApplyTemplateWsRequest toBulkApplyTemplateWsRequest(Request request) { - return new BulkApplyTemplateWsRequest() - .setTemplateId(request.param(PARAM_TEMPLATE_ID)) - .setOrganization(request.param(PARAM_ORGANIZATION)) - .setTemplateName(request.param(PARAM_TEMPLATE_NAME)) - .setQualifier(request.param(PARAM_QUALIFIER)) - .setQuery(request.param(Param.TEXT_QUERY)); - } - @Override public void define(WebService.NewController context) { WebService.NewAction action = context.createAction("bulk_apply_template") @@ -94,7 +85,11 @@ public class BulkApplyTemplateAction implements PermissionsWsAction { "<li>project keys that are exactly the same as the supplied string</li>" + "</ul>") .setExampleValue("apac"); - createRootQualifierParameter(action, newQualifierParameterContext(i18n, resourceTypes)); + + createRootQualifiersParameter(action, newQualifierParameterContext(i18n, resourceTypes)) + .setDefaultValue(Qualifiers.PROJECT) + .setDeprecatedKey(PARAM_QUALIFIER, "6.6"); + createTemplateParameters(action); } @@ -110,19 +105,28 @@ public class BulkApplyTemplateAction implements PermissionsWsAction { request.getTemplateId(), request.getOrganization(), request.getTemplateName())); checkGlobalAdmin(userSession, template.getOrganizationUuid()); - ComponentQuery componentQuery = ComponentQuery.builder() - .setNameOrKeyQuery(request.getQuery()) - .setQualifiers(qualifiers(request.getQualifier())) - .build(); + ComponentQuery componentQuery = buildDbQuery(request); List<ComponentDto> projects = dbClient.componentDao().selectByQuery(dbSession, template.getOrganizationUuid(), componentQuery, 0, Integer.MAX_VALUE); permissionTemplateService.applyAndCommit(dbSession, template, projects); } } - private String[] qualifiers(@Nullable String qualifier) { - return qualifier == null - ? Collections2.transform(resourceTypes.getRoots(), ResourceType::getQualifier).toArray(new String[resourceTypes.getRoots().size()]) - : (new String[] {qualifier}); + private static BulkApplyTemplateWsRequest toBulkApplyTemplateWsRequest(Request request) { + return new BulkApplyTemplateWsRequest() + .setOrganization(request.param(PARAM_ORGANIZATION)) + .setTemplateId(request.param(PARAM_TEMPLATE_ID)) + .setTemplateName(request.param(PARAM_TEMPLATE_NAME)) + .setQualifiers(request.mandatoryParamAsStrings(PARAM_QUALIFIERS)) + .setQuery(request.param(Param.TEXT_QUERY)); } + + private static ComponentQuery buildDbQuery(BulkApplyTemplateWsRequest request) { + ComponentQuery.Builder dbQuery = ComponentQuery.builder() + .setNameOrKeyQuery(request.getQuery()); + setNullable(request.getQualifiers(), l -> dbQuery.setQualifiers(l.toArray(new String[0]))); + + return dbQuery.build(); + } + } diff --git a/server/sonar-server/src/main/java/org/sonar/server/ws/WsParameterBuilder.java b/server/sonar-server/src/main/java/org/sonar/server/ws/WsParameterBuilder.java index d1cae3abacf..ce05d9354aa 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ws/WsParameterBuilder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ws/WsParameterBuilder.java @@ -45,6 +45,13 @@ public class WsParameterBuilder { .setPossibleValues(getRootQualifiers(context.getResourceTypes())); } + public static WebService.NewParam createRootQualifiersParameter(WebService.NewAction action, QualifierParameterContext context) { + return action.createParam(PARAM_QUALIFIERS) + .setDescription("Comma-separated list of component qualifiers. Filter the results with the specified qualifiers. " + + "Possible values are:" + buildRootQualifiersDescription(context)) + .setPossibleValues(getRootQualifiers(context.getResourceTypes())); + } + public static WebService.NewParam createDefaultTemplateQualifierParameter(WebService.NewAction action, QualifierParameterContext context) { return action.createParam(PARAM_QUALIFIER) .setDescription("Project qualifier. Filter the results with the specified qualifier. Possible values are:" + buildDefaultTemplateQualifiersDescription(context)) diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionTest.java index 18a6b2423c7..ac6fffb08d5 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionTest.java @@ -22,6 +22,7 @@ package org.sonar.server.permission.ws.template; import java.util.List; import org.junit.Before; import org.junit.Test; +import org.sonar.api.resources.Qualifiers; import org.sonar.api.server.ws.WebService.Param; import org.sonar.api.web.UserRole; import org.sonar.db.component.ComponentDto; @@ -40,11 +41,12 @@ import org.sonar.server.permission.PermissionTemplateService; import org.sonar.server.permission.ws.BasePermissionWsTest; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.db.component.ComponentTesting.newApplication; import static org.sonar.db.component.ComponentTesting.newView; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_ORGANIZATION; -import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_QUALIFIER; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_QUALIFIERS; public class BulkApplyTemplateActionTest extends BasePermissionWsTest<BulkApplyTemplateAction> { @@ -104,7 +106,10 @@ public class BulkApplyTemplateActionTest extends BasePermissionWsTest<BulkApplyT ComponentDto view = db.components().insertView(organization); loginAsAdmin(organization); - newRequest().setParam(PARAM_TEMPLATE_ID, template1.getUuid()).execute(); + newRequest() + .setParam(PARAM_TEMPLATE_ID, template1.getUuid()) + .setParam(PARAM_QUALIFIERS, String.join(",", Qualifiers.PROJECT, Qualifiers.VIEW)) + .execute(); assertTemplate1AppliedToPrivateProject(privateProject); assertTemplate1AppliedToPublicProject(publicProject); @@ -142,18 +147,21 @@ public class BulkApplyTemplateActionTest extends BasePermissionWsTest<BulkApplyT } @Test - public void apply_template_by_qualifier() throws Exception { + public void apply_template_by_qualifiers() throws Exception { ComponentDto publicProject = db.components().insertPublicProject(organization); ComponentDto privateProject = db.components().insertPrivateProject(organization); ComponentDto view = db.components().insertComponent(newView(organization)); + ComponentDto application = db.components().insertComponent(newApplication(organization)); loginAsAdmin(organization); newRequest() .setParam(PARAM_TEMPLATE_ID, template1.getUuid()) - .setParam(PARAM_QUALIFIER, privateProject.qualifier()).execute(); + .setParam(PARAM_QUALIFIERS, String.join(",", Qualifiers.PROJECT, Qualifiers.APP)) + .execute(); assertTemplate1AppliedToPrivateProject(privateProject); assertTemplate1AppliedToPublicProject(publicProject); + assertTemplate1AppliedToPublicProject(application); assertNoPermissionOnProject(view); } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java index 9d5f9e9ce39..4c6a0e9449e 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java @@ -22,7 +22,7 @@ package org.sonarqube.ws.client; import com.google.protobuf.Message; import com.google.protobuf.Parser; import java.io.InputStream; -import java.util.List; +import java.util.Collection; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.apache.commons.io.IOUtils; @@ -67,7 +67,7 @@ public abstract class BaseService { } @CheckForNull - protected static String inlineMultipleParamValue(@Nullable List<String> values) { + protected static String inlineMultipleParamValue(@Nullable Collection<String> values) { return values == null ? null : String.join(",", values); } } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/BulkApplyTemplateWsRequest.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/BulkApplyTemplateWsRequest.java index 5fdc4d31623..77d7eff64b2 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/BulkApplyTemplateWsRequest.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/BulkApplyTemplateWsRequest.java @@ -19,15 +19,18 @@ */ package org.sonarqube.ws.client.permission; +import java.util.Collection; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import static java.util.Objects.requireNonNull; + public class BulkApplyTemplateWsRequest { private String templateId; private String organization; private String templateName; private String query; - private String qualifier; + private Collection<String> qualifiers; @CheckForNull public String getTemplateId() { @@ -70,12 +73,12 @@ public class BulkApplyTemplateWsRequest { } @CheckForNull - public String getQualifier() { - return qualifier; + public Collection<String> getQualifiers() { + return qualifiers; } - public BulkApplyTemplateWsRequest setQualifier(@Nullable String qualifier) { - this.qualifier = qualifier; + public BulkApplyTemplateWsRequest setQualifiers(Collection<String> qualifiers) { + this.qualifiers = requireNonNull(qualifiers); return this; } } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsService.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsService.java index 81cccb39e9f..97802e65da7 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsService.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/permission/PermissionsService.java @@ -45,6 +45,7 @@ import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_Q import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_USER_LOGIN; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_QUALIFIERS; public class PermissionsService extends BaseService { @@ -123,7 +124,7 @@ public class PermissionsService extends BaseService { .setParam(PARAM_TEMPLATE_ID, request.getTemplateId()) .setParam(PARAM_TEMPLATE_NAME, request.getTemplateName()) .setParam("q", request.getQuery()) - .setParam(PARAM_QUALIFIER, request.getQualifier())); + .setParam(PARAM_QUALIFIERS, inlineMultipleParamValue(request.getQualifiers()))); } public CreateTemplateWsResponse createTemplate(CreateTemplateWsRequest request) { diff --git a/sonar-ws/src/test/java/org/sonarqube/ws/client/permission/PermissionsServiceTest.java b/sonar-ws/src/test/java/org/sonarqube/ws/client/permission/PermissionsServiceTest.java index fd4dbf4ac27..b83868acfa5 100644 --- a/sonar-ws/src/test/java/org/sonarqube/ws/client/permission/PermissionsServiceTest.java +++ b/sonar-ws/src/test/java/org/sonarqube/ws/client/permission/PermissionsServiceTest.java @@ -19,6 +19,7 @@ */ package org.sonarqube.ws.client.permission; +import java.util.Arrays; import org.junit.Rule; import org.junit.Test; import org.sonarqube.ws.WsPermissions; @@ -43,6 +44,7 @@ import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_Q import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_USER_LOGIN; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_QUALIFIERS; public class PermissionsServiceTest { private static final String ORGANIZATION_VALUE = "organization value"; @@ -217,7 +219,7 @@ public class PermissionsServiceTest { .setOrganization(ORGANIZATION_VALUE) .setTemplateId(TEMPLATE_ID_VALUE) .setTemplateName(TEMPLATE_NAME_VALUE) - .setQualifier(QUALIFIER_VALUE) + .setQualifiers(Arrays.asList("TRK", "VW")) .setQuery(QUERY_VALUE)); assertThat(serviceTester.getPostParser()).isNull(); @@ -228,7 +230,7 @@ public class PermissionsServiceTest { .hasParam(PARAM_TEMPLATE_ID, TEMPLATE_ID_VALUE) .hasParam(PARAM_TEMPLATE_NAME, TEMPLATE_NAME_VALUE) .hasParam("q", QUERY_VALUE) - .hasParam(PARAM_QUALIFIER, QUALIFIER_VALUE) + .hasParam(PARAM_QUALIFIERS, "TRK,VW") .andNoOtherParam(); } |