diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-09-04 15:42:52 +0200 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-09-04 16:16:54 +0200 |
commit | a973701504df1d3c04ebdc43903a0fd496d6e4da (patch) | |
tree | 04652d72400d3157bd705e4de15db7b771830eea /server | |
parent | 2a44995355d5adce63fa52cebe2c04caf3a169fc (diff) | |
download | sonarqube-a973701504df1d3c04ebdc43903a0fd496d6e4da.tar.gz sonarqube-a973701504df1d3c04ebdc43903a0fd496d6e4da.zip |
SONAR-6495 WS permissions/search_templates add default templates
Diffstat (limited to 'server')
8 files changed, 149 insertions, 12 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/DefaultPermissionTemplateFinder.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/DefaultPermissionTemplateFinder.java index 1f6c8536408..d3a08cfd1eb 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/DefaultPermissionTemplateFinder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/DefaultPermissionTemplateFinder.java @@ -21,14 +21,15 @@ package org.sonar.server.permission.ws; import com.google.common.base.Function; -import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableSet; +import java.util.List; import java.util.Set; import javax.annotation.Nonnull; import org.sonar.api.config.Settings; import org.sonar.api.resources.ResourceTypes; import static com.google.common.base.Objects.firstNonNull; +import static com.google.common.collect.FluentIterable.from; import static org.sonar.server.permission.DefaultPermissionTemplates.DEFAULT_TEMPLATE_PROPERTY; import static org.sonar.server.permission.DefaultPermissionTemplates.defaultRootQualifierTemplateProperty; import static org.sonar.server.permission.ws.ResourceTypeToQualifier.RESOURCE_TYPE_TO_QUALIFIER; @@ -42,10 +43,10 @@ public class DefaultPermissionTemplateFinder { this.resourceTypes = resourceTypes; } - public Set<String> getDefaultTemplateUuids() { + Set<String> getDefaultTemplateUuids() { return ImmutableSet.<String>builder() .addAll( - FluentIterable.from(resourceTypes.getRoots()) + from(resourceTypes.getRoots()) .transform(RESOURCE_TYPE_TO_QUALIFIER) .transform(new QualifierToDefaultTemplate(settings)) .toSet()) @@ -53,6 +54,31 @@ public class DefaultPermissionTemplateFinder { .build(); } + List<TemplateUuidQualifier> getDefaultTemplatesByQualifier() { + return from(resourceTypes.getRoots()) + .transform(RESOURCE_TYPE_TO_QUALIFIER) + .transform(new QualifierToTemplateUuidQualifier(settings)) + .toList(); + } + + static class TemplateUuidQualifier { + private final String templateUuid; + private final String qualifier; + + TemplateUuidQualifier(String templateUuid, String qualifier) { + this.templateUuid = templateUuid; + this.qualifier = qualifier; + } + + public String getTemplateUuid() { + return templateUuid; + } + + public String getQualifier() { + return qualifier; + } + } + private static class QualifierToDefaultTemplate implements Function<String, String> { private final Settings settings; @@ -67,4 +93,21 @@ public class DefaultPermissionTemplateFinder { } } + private static class QualifierToTemplateUuidQualifier implements Function<String, TemplateUuidQualifier> { + private final Settings settings; + + QualifierToTemplateUuidQualifier(Settings settings) { + this.settings = settings; + } + + @Override + public TemplateUuidQualifier apply(@Nonnull String qualifier) { + String qualifierTemplateUuid = firstNonNull( + settings.getString(defaultRootQualifierTemplateProperty(qualifier)), + settings.getString(DEFAULT_TEMPLATE_PROPERTY)); + + return new TemplateUuidQualifier(qualifierTemplateUuid, qualifier); + } + } + } diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesAction.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesAction.java index 3fd79917648..e84e5058423 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesAction.java @@ -32,6 +32,7 @@ import org.sonar.server.user.UserSession; import org.sonarqube.ws.Permissions.Permission; import org.sonarqube.ws.Permissions.PermissionTemplate; import org.sonarqube.ws.Permissions.WsSearchTemplatesResponse; +import org.sonarqube.ws.Permissions.WsSearchTemplatesResponse.TemplateIdQualifier; import static org.sonar.api.utils.DateUtils.formatDateTime; import static org.sonar.server.permission.PermissionPrivilegeChecker.checkGlobalAdminUser; @@ -80,9 +81,28 @@ public class SearchTemplatesAction implements PermissionsWsAction { private WsSearchTemplatesResponse buildResponse(SearchTemplatesData data) { WsSearchTemplatesResponse.Builder response = WsSearchTemplatesResponse.newBuilder(); - Permission.Builder permissionResponse = Permission.newBuilder(); + buildTemplatesResponse(response, data); + buildDefaultTemplatesResponse(response, data); + buildPermissionsResponse(response); + + return response.build(); + } + + private void buildDefaultTemplatesResponse(WsSearchTemplatesResponse.Builder response, SearchTemplatesData data) { + TemplateIdQualifier.Builder templateUuidQualifierBuilder = TemplateIdQualifier.newBuilder(); + for (DefaultPermissionTemplateFinder.TemplateUuidQualifier templateUuidQualifier : data.defaultTempltes()) { + response.addDefaultTemplates(templateUuidQualifierBuilder + .clear() + .setQualifier(templateUuidQualifier.getQualifier()) + .setTemplateId(templateUuidQualifier.getTemplateUuid())); + } + } + + private void buildTemplatesResponse(WsSearchTemplatesResponse.Builder response, SearchTemplatesData data) { + Permission.Builder permissionResponse = Permission.newBuilder(); PermissionTemplate.Builder templateBuilder = PermissionTemplate.newBuilder(); + for (PermissionTemplateDto templateDto : data.templates()) { templateBuilder .clear() @@ -106,7 +126,10 @@ public class SearchTemplatesAction implements PermissionsWsAction { } response.addPermissionTemplates(templateBuilder); } + } + private void buildPermissionsResponse(WsSearchTemplatesResponse.Builder response) { + Permission.Builder permissionResponse = Permission.newBuilder(); for (String permissionKey : ProjectPermissions.ALL) { response.addPermissions( permissionResponse @@ -116,8 +139,6 @@ public class SearchTemplatesAction implements PermissionsWsAction { .setDescription(i18nDescriptionMessage(permissionKey)) ); } - - return response.build(); } private String i18nDescriptionMessage(String permissionKey) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesData.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesData.java index 5ef26407b63..dac2868fca4 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesData.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesData.java @@ -26,6 +26,7 @@ import com.google.common.collect.Table; import java.util.List; import java.util.Set; import org.sonar.db.permission.PermissionTemplateDto; +import org.sonar.server.permission.ws.DefaultPermissionTemplateFinder.TemplateUuidQualifier; import static com.google.common.base.Objects.firstNonNull; import static com.google.common.base.Preconditions.checkState; @@ -34,12 +35,14 @@ import static com.google.common.collect.ImmutableTable.copyOf; import static com.google.common.collect.Ordering.natural; class SearchTemplatesData { - private final List<PermissionTemplateDto> paginatedTemplates; + private final List<PermissionTemplateDto> templates; + private final List<TemplateUuidQualifier> defaultTemplates; private final Table<Long, String, Integer> userCountByTemplateIdAndPermission; private final Table<Long, String, Integer> groupCountByTemplateIdAndPermission; private SearchTemplatesData(Builder builder) { - this.paginatedTemplates = copyOf(builder.templates); + this.templates = copyOf(builder.templates); + this.defaultTemplates = copyOf(builder.defaultTemplates); this.userCountByTemplateIdAndPermission = copyOf(builder.userCountByTemplateIdAndPermission); this.groupCountByTemplateIdAndPermission = copyOf(builder.groupCountByTemplateIdAndPermission); } @@ -49,7 +52,11 @@ class SearchTemplatesData { } public List<PermissionTemplateDto> templates() { - return paginatedTemplates; + return templates; + } + + public List<TemplateUuidQualifier> defaultTempltes() { + return defaultTemplates; } public int userCount(long templateId, String permission) { @@ -71,6 +78,7 @@ class SearchTemplatesData { public static class Builder { private List<PermissionTemplateDto> templates; + private List<TemplateUuidQualifier> defaultTemplates; private Table<Long, String, Integer> userCountByTemplateIdAndPermission; private Table<Long, String, Integer> groupCountByTemplateIdAndPermission; @@ -80,6 +88,7 @@ class SearchTemplatesData { public SearchTemplatesData build() { checkState(templates != null); + checkState(defaultTemplates != null); checkState(userCountByTemplateIdAndPermission != null); checkState(groupCountByTemplateIdAndPermission != null); @@ -91,6 +100,11 @@ class SearchTemplatesData { return this; } + public Builder defaultTemplates(List<TemplateUuidQualifier> defaultTemplates) { + this.defaultTemplates = defaultTemplates; + return this; + } + public Builder userCountByTemplateIdAndPermission(Table<Long, String, Integer> userCountByTemplateIdAndPermission) { this.userCountByTemplateIdAndPermission = userCountByTemplateIdAndPermission; return this; diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesDataLoader.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesDataLoader.java index f6cce2bff16..79a2984efdc 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesDataLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchTemplatesDataLoader.java @@ -33,15 +33,18 @@ import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.permission.CountByTemplateAndPermissionDto; import org.sonar.db.permission.PermissionTemplateDto; +import org.sonar.server.permission.ws.DefaultPermissionTemplateFinder.TemplateUuidQualifier; import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY; import static org.sonar.server.permission.ws.SearchTemplatesData.newBuilder; public class SearchTemplatesDataLoader { private final DbClient dbClient; + private final DefaultPermissionTemplateFinder defaultPermissionTemplateFinder; - public SearchTemplatesDataLoader(DbClient dbClient) { + public SearchTemplatesDataLoader(DbClient dbClient, DefaultPermissionTemplateFinder defaultPermissionTemplateFinder) { this.dbClient = dbClient; + this.defaultPermissionTemplateFinder = defaultPermissionTemplateFinder; } public SearchTemplatesData load(Request wsRequest) { @@ -50,8 +53,10 @@ public class SearchTemplatesDataLoader { SearchTemplatesData.Builder data = newBuilder(); List<PermissionTemplateDto> templates = searchTemplates(dbSession, wsRequest); List<Long> templateIds = Lists.transform(templates, TemplateToIdFunction.INSTANCE); + List<TemplateUuidQualifier> defaultTemplates = defaultPermissionTemplateFinder.getDefaultTemplatesByQualifier(); data.templates(templates) + .defaultTemplates(defaultTemplates) .userCountByTemplateIdAndPermission(userCountByTemplateIdAndPermission(dbSession, templateIds)) .groupCountByTemplateIdAndPermission(groupCountByTemplateIdAndPermission(dbSession, templateIds)); diff --git a/server/sonar-server/src/main/resources/org/sonar/server/permission/ws/search_templates-example.json b/server/sonar-server/src/main/resources/org/sonar/server/permission/ws/search_templates-example.json index bfdcf0828fc..523c5ebf1d3 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/permission/ws/search_templates-example.json +++ b/server/sonar-server/src/main/resources/org/sonar/server/permission/ws/search_templates-example.json @@ -59,6 +59,20 @@ ] } ], + "defaultTemplates": [ + { + "templateId": "AU-Tpxb--iU5OvuD2FLy", + "qualifier": "TRK" + }, + { + "templateId": "AU-TpxcA-iU5OvuD2FLz", + "qualifier": "VW" + }, + { + "templateId": "AU-TpxcA-iU5OvuD2FL0", + "qualifier": "DEV" + } + ], "permissions": [ { "key": "user", diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java index 95f36fd1ce3..aead1d2453e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java @@ -75,7 +75,7 @@ public class SearchProjectPermissionsActionTest { I18nRule i18n = new I18nRule(); DbClient dbClient = db.getDbClient(); DbSession dbSession = db.getSession(); - ResourceTypes resourceTypes; + ResourceTypes resourceTypes = mock(ResourceTypes.class); SearchProjectPermissionsDataLoader dataLoader; SearchProjectPermissionsAction underTest; diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchTemplatesActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchTemplatesActionTest.java index 2db0f1a2c95..dcda8000a5e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchTemplatesActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/SearchTemplatesActionTest.java @@ -21,6 +21,7 @@ package org.sonar.server.permission.ws; import java.util.Date; +import java.util.List; import javax.annotation.Nullable; import org.junit.Before; import org.junit.ClassRule; @@ -28,6 +29,10 @@ import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.ExpectedException; +import org.sonar.api.config.Settings; +import org.sonar.api.resources.Qualifiers; +import org.sonar.api.resources.ResourceType; +import org.sonar.api.resources.ResourceTypes; import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; import org.sonar.core.permission.GlobalPermissions; @@ -44,7 +49,10 @@ import org.sonar.server.tester.UserSessionRule; import org.sonar.server.ws.WsActionTester; import org.sonar.test.DbTests; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY; import static org.sonar.core.permission.GlobalPermissions.QUALITY_PROFILE_ADMIN; import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01; @@ -53,6 +61,7 @@ import static org.sonar.core.util.Uuids.UUID_EXAMPLE_03; import static org.sonar.db.permission.PermissionTemplateTesting.newPermissionTemplateDto; import static org.sonar.db.user.GroupTesting.newGroupDto; import static org.sonar.db.user.UserTesting.newUserDto; +import static org.sonar.server.permission.DefaultPermissionTemplates.defaultRootQualifierTemplateProperty; import static org.sonar.test.JsonAssert.assertJson; @Category(DbTests.class) @@ -68,6 +77,7 @@ public class SearchTemplatesActionTest { I18nRule i18n = new I18nRule(); DbClient dbClient = db.getDbClient(); DbSession dbSession = db.getSession(); + ResourceTypes resourceTypes = mock(ResourceTypes.class); SearchTemplatesDataLoader dataLoader; SearchTemplatesAction underTest; @@ -76,8 +86,16 @@ public class SearchTemplatesActionTest { public void setUp() { db.truncateTables(); i18n.setProjectPermissions(); + when(resourceTypes.getRoots()).thenReturn(rootResourceTypes()); - dataLoader = new SearchTemplatesDataLoader(dbClient); + Settings settings = new Settings(); + settings.setProperty(defaultRootQualifierTemplateProperty(Qualifiers.PROJECT), UUID_EXAMPLE_01); + settings.setProperty(defaultRootQualifierTemplateProperty(Qualifiers.VIEW), UUID_EXAMPLE_02); + settings.setProperty(defaultRootQualifierTemplateProperty("DEV"), UUID_EXAMPLE_03); + + DefaultPermissionTemplateFinder defaultPermissionTemplateFinder = new DefaultPermissionTemplateFinder(settings, resourceTypes); + + dataLoader = new SearchTemplatesDataLoader(dbClient, defaultPermissionTemplateFinder); underTest = new SearchTemplatesAction(dbClient, userSession, i18n, dataLoader); ws = new WsActionTester(underTest); @@ -220,4 +238,12 @@ public class SearchTemplatesActionTest { private void commit() { dbSession.commit(); } + + private static List<ResourceType> rootResourceTypes() { + ResourceType project = ResourceType.builder(Qualifiers.PROJECT).build(); + ResourceType view = ResourceType.builder(Qualifiers.VIEW).build(); + ResourceType dev = ResourceType.builder("DEV").build(); + + return asList(project, view, dev); + } } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/permission/ws/SearchTemplatesActionTest/empty.json b/server/sonar-server/src/test/resources/org/sonar/server/permission/ws/SearchTemplatesActionTest/empty.json index ea5874c276f..985f39eaa92 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/permission/ws/SearchTemplatesActionTest/empty.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/permission/ws/SearchTemplatesActionTest/empty.json @@ -1,5 +1,19 @@ { "permissionTemplates": [], + "defaultTemplates": [ + { + "templateId": "AU-Tpxb--iU5OvuD2FLy", + "qualifier": "TRK" + }, + { + "templateId": "AU-TpxcA-iU5OvuD2FLz", + "qualifier": "VW" + }, + { + "templateId": "AU-TpxcA-iU5OvuD2FL0", + "qualifier": "DEV" + } + ], "permissions": [ { "key": "user", |