Skip to content

Commit

Permalink
SONAR-6495 WS permissions/search_templates add default templates
Browse files Browse the repository at this point in the history
  • Loading branch information
teryk committed Sep 4, 2015
1 parent 2a44995 commit a973701
Show file tree
Hide file tree
Showing 10 changed files with 1,249 additions and 98 deletions.
Expand Up @@ -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;
Expand All @@ -42,17 +43,42 @@ public DefaultPermissionTemplateFinder(Settings settings, ResourceTypes resource
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())
.add(settings.getString(DEFAULT_TEMPLATE_PROPERTY))
.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;

Expand All @@ -67,4 +93,21 @@ public String apply(@Nonnull String qualifier) {
}
}

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);
}
}

}
Expand Up @@ -32,6 +32,7 @@
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;
Expand Down Expand Up @@ -80,9 +81,28 @@ public void handle(Request wsRequest, Response wsResponse) throws Exception {

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()
Expand All @@ -106,7 +126,10 @@ private WsSearchTemplatesResponse buildResponse(SearchTemplatesData data) {
}
response.addPermissionTemplates(templateBuilder);
}
}

private void buildPermissionsResponse(WsSearchTemplatesResponse.Builder response) {
Permission.Builder permissionResponse = Permission.newBuilder();
for (String permissionKey : ProjectPermissions.ALL) {
response.addPermissions(
permissionResponse
Expand All @@ -116,8 +139,6 @@ private WsSearchTemplatesResponse buildResponse(SearchTemplatesData data) {
.setDescription(i18nDescriptionMessage(permissionKey))
);
}

return response.build();
}

private String i18nDescriptionMessage(String permissionKey) {
Expand Down
Expand Up @@ -26,6 +26,7 @@
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;
Expand All @@ -34,12 +35,14 @@
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);
}
Expand All @@ -49,7 +52,11 @@ public static Builder newBuilder() {
}

public List<PermissionTemplateDto> templates() {
return paginatedTemplates;
return templates;
}

public List<TemplateUuidQualifier> defaultTempltes() {
return defaultTemplates;
}

public int userCount(long templateId, String permission) {
Expand All @@ -71,6 +78,7 @@ public Set<String> permissions(long templateId) {

public static class Builder {
private List<PermissionTemplateDto> templates;
private List<TemplateUuidQualifier> defaultTemplates;
private Table<Long, String, Integer> userCountByTemplateIdAndPermission;
private Table<Long, String, Integer> groupCountByTemplateIdAndPermission;

Expand All @@ -80,6 +88,7 @@ private Builder() {

public SearchTemplatesData build() {
checkState(templates != null);
checkState(defaultTemplates != null);
checkState(userCountByTemplateIdAndPermission != null);
checkState(groupCountByTemplateIdAndPermission != null);

Expand All @@ -91,6 +100,11 @@ public Builder templates(List<PermissionTemplateDto> templates) {
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;
Expand Down
Expand Up @@ -33,15 +33,18 @@
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) {
Expand All @@ -50,8 +53,10 @@ public SearchTemplatesData load(Request wsRequest) {
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));

Expand Down
Expand Up @@ -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",
Expand Down
Expand Up @@ -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;
Expand Down
Expand Up @@ -21,13 +21,18 @@
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;
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;
Expand All @@ -44,7 +49,10 @@
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;
Expand All @@ -53,6 +61,7 @@
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)
Expand All @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -220,4 +238,12 @@ private void addUserToTemplate(long templateId, long userId, String permission)
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);
}
}
@@ -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",
Expand Down

0 comments on commit a973701

Please sign in to comment.