From c938464d1eedf63277e5dcc96d0a22519911bf1b Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Fri, 28 Apr 2017 15:14:32 +0200 Subject: [PATCH] =?utf8?q?fix=20quality=20flaws:=20use=20a=20constant=20in?= =?utf8?q?stead=20of=20literal=20=E2=80=9Cprivate=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../ws/ComponentDtoToWsComponent.java | 3 +- .../component/ws/SearchProjectsAction.java | 3 +- .../ws/UpdateProjectVisibilityAction.java | 5 +- .../org/sonar/server/project/Visibility.java | 70 +++++++++++++++++++ .../sonar/server/project/package-info.java | 23 ++++++ .../sonar/server/project/ws/CreateAction.java | 7 +- .../project/ws/UpdateVisibilityAction.java | 7 +- .../sonar/server/ui/ws/ComponentAction.java | 6 +- .../server/ui/ws/OrganizationAction.java | 3 +- .../server/project/ws/CreateActionTest.java | 3 +- .../ws/UpdateVisibilityActionTest.java | 4 +- 11 files changed, 116 insertions(+), 18 deletions(-) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/project/Visibility.java create mode 100644 server/sonar-server/src/main/java/org/sonar/server/project/package-info.java diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentDtoToWsComponent.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentDtoToWsComponent.java index aba5592ff21..5c2c0c8d563 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentDtoToWsComponent.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentDtoToWsComponent.java @@ -25,6 +25,7 @@ import org.sonar.api.resources.Qualifiers; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.server.project.Visibility; import org.sonarqube.ws.WsComponents; import static com.google.common.base.Preconditions.checkArgument; @@ -58,7 +59,7 @@ class ComponentDtoToWsComponent { setTags(dto, wsComponent); lastAnalysis.ifPresent(analysis -> wsComponent.setAnalysisDate(formatDateTime(analysis.getCreatedAt()))); if (Qualifiers.PROJECT.equals(dto.qualifier())) { - wsComponent.setVisibility(dto.isPrivate() ? "private" : "public"); + wsComponent.setVisibility(Visibility.getLabel(dto.isPrivate())); } return wsComponent; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java index 9472247dc75..e8cb88abc4f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java @@ -54,6 +54,7 @@ import org.sonar.server.es.SearchOptions; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.measure.index.ProjectMeasuresIndex; import org.sonar.server.measure.index.ProjectMeasuresQuery; +import org.sonar.server.project.Visibility; import org.sonar.server.user.UserSession; import org.sonarqube.ws.Common; import org.sonarqube.ws.WsComponents.Component; @@ -412,7 +413,7 @@ public class SearchProjectsAction implements ComponentsWsAction { .setId(dbComponent.uuid()) .setKey(dbComponent.key()) .setName(dbComponent.name()) - .setVisibility(dbComponent.isPrivate() ? "private" : "public"); + .setVisibility(Visibility.getLabel(dbComponent.isPrivate())); wsComponent.getTagsBuilder().addAllTags(dbComponent.getTags()); SnapshotDto snapshotDto = analysisByProjectUuid.get(dbComponent.uuid()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateProjectVisibilityAction.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateProjectVisibilityAction.java index 64c195c7ac3..6beec1aa8ef 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateProjectVisibilityAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateProjectVisibilityAction.java @@ -28,6 +28,7 @@ import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.server.project.Visibility; import org.sonar.server.user.UserSession; import static org.sonar.server.organization.ws.OrganizationsWsSupport.PARAM_ORGANIZATION; @@ -62,13 +63,13 @@ public class UpdateProjectVisibilityAction implements OrganizationsWsAction { action.createParam(PARAM_PROJECT_VISIBILITY) .setRequired(true) .setDescription("Default visibility for projects") - .setPossibleValues("private", "public"); + .setPossibleValues(Visibility.getLabels()); } @Override public void handle(Request request, Response response) throws Exception { String organizationKey = request.mandatoryParam(PARAM_ORGANIZATION); - boolean newProjectsPrivate = "private".equals(request.mandatoryParam(PARAM_PROJECT_VISIBILITY)); + boolean newProjectsPrivate = Visibility.isPrivate(request.mandatoryParam(PARAM_PROJECT_VISIBILITY)); try (DbSession dbSession = dbClient.openSession(false)) { Optional optionalOrganization = dbClient.organizationDao().selectByKey(dbSession, organizationKey); OrganizationDto organization = checkFoundWithOptional(optionalOrganization, "No organization with key '" + organizationKey + "' can be found."); diff --git a/server/sonar-server/src/main/java/org/sonar/server/project/Visibility.java b/server/sonar-server/src/main/java/org/sonar/server/project/Visibility.java new file mode 100644 index 00000000000..514aa8569b0 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/project/Visibility.java @@ -0,0 +1,70 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.server.project; + +import java.util.List; + +import static java.util.Arrays.stream; +import static org.sonar.core.util.stream.MoreCollectors.toList; + +public enum Visibility { + + PRIVATE(true, "private"), + PUBLIC(false, "public"); + + private static final List LABELS = stream(values()).map(Visibility::getLabel).collect(toList(values().length)); + + private final boolean isPrivate; + private final String label; + + Visibility(boolean isPrivate, String label) { + this.isPrivate = isPrivate; + this.label = label; + } + + public String getLabel() { + return label; + } + + boolean isPrivate() { + return isPrivate; + } + + public static String getLabel(boolean isPrivate) { + return stream(values()) + .filter(v -> v.isPrivate == isPrivate) + .map(Visibility::getLabel) + .findAny() + .orElseThrow(() -> new IllegalStateException("Invalid visibility boolean '" + isPrivate + "'")); + } + + public static boolean isPrivate(String label) { + return stream(values()) + .filter(v -> v.label.equals(label)) + .map(Visibility::isPrivate) + .findAny() + .orElseThrow(() -> new IllegalStateException("Invalid visibility label '" + label + "'")); + } + + public static List getLabels() { + return LABELS; + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/project/package-info.java b/server/sonar-server/src/main/java/org/sonar/server/project/package-info.java new file mode 100644 index 00000000000..f4805a377f4 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/project/package-info.java @@ -0,0 +1,23 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +@ParametersAreNonnullByDefault +package org.sonar.server.project; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java b/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java index 45d0c69a3cc..fe17b6d4c3d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java @@ -29,6 +29,7 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.server.component.ComponentUpdater; import org.sonar.server.organization.DefaultOrganizationProvider; +import org.sonar.server.project.Visibility; import org.sonar.server.user.UserSession; import org.sonarqube.ws.WsProjects.CreateWsResponse; import org.sonarqube.ws.client.project.CreateRequest; @@ -100,7 +101,7 @@ public class CreateAction implements ProjectsWsAction { .setRequired(false) .setInternal(true) .setSince("6.4") - .setPossibleValues("private", "public"); + .setPossibleValues(Visibility.getLabels()); support.addOrganizationParam(action); } @@ -122,7 +123,7 @@ public class CreateAction implements ProjectsWsAction { .setKey(request.getKey()) .setName(request.getName()) .setBranch(request.getBranch()) - .setPrivate(request.getVisibility().map("private"::equals).orElseGet(() -> dbClient.organizationDao().getNewProjectPrivate(dbSession, organization))) + .setPrivate(request.getVisibility().map(Visibility::isPrivate).orElseGet(() -> dbClient.organizationDao().getNewProjectPrivate(dbSession, organization))) .setQualifier(PROJECT) .build(), userSession.isLoggedIn() ? userSession.getUserId() : null); @@ -146,7 +147,7 @@ public class CreateAction implements ProjectsWsAction { .setKey(componentDto.key()) .setName(componentDto.name()) .setQualifier(componentDto.qualifier()) - .setVisibility(componentDto.isPrivate() ? "private" : "public")) + .setVisibility(Visibility.getLabel(componentDto.isPrivate()))) .build(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java b/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java index df819ed4de5..3302a35e8f0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java @@ -34,6 +34,7 @@ import org.sonar.db.permission.GroupPermissionDto; import org.sonar.db.permission.UserPermissionDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.permission.index.PermissionIndexer; +import org.sonar.server.project.Visibility; import org.sonar.server.user.UserSession; import static java.util.Collections.singletonList; @@ -45,8 +46,6 @@ import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT public class UpdateVisibilityAction implements ProjectsWsAction { private static final String ACTION = "update_visibility"; private static final String PARAM_VISIBILITY = "visibility"; - private static final String PUBLIC_VISIBILITY = "public"; - private static final String PRIVATE_VISIBILITY = "private"; private static final Set ALLOWED_QUALIFIERS = ImmutableSet.of(Qualifiers.PROJECT, Qualifiers.VIEW); private final DbClient dbClient; @@ -77,7 +76,7 @@ public class UpdateVisibilityAction implements ProjectsWsAction { action.createParam(PARAM_VISIBILITY) .setDescription("new visibility of the project or view") - .setPossibleValues(PUBLIC_VISIBILITY, PRIVATE_VISIBILITY) + .setPossibleValues(Visibility.getLabels()) .setRequired(true); } @@ -86,7 +85,7 @@ public class UpdateVisibilityAction implements ProjectsWsAction { userSession.checkLoggedIn(); String projectKey = request.mandatoryParam(PARAM_PROJECT); - boolean changeToPrivate = PRIVATE_VISIBILITY.equals(request.mandatoryParam(PARAM_VISIBILITY)); + boolean changeToPrivate = Visibility.isPrivate(request.mandatoryParam(PARAM_VISIBILITY)); try (DbSession dbSession = dbClient.openSession(false)) { ComponentDto component = componentFinder.getByKey(dbSession, projectKey); diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java index 9d31390107a..417d9e973fa 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java @@ -52,6 +52,7 @@ import org.sonar.db.property.PropertyDto; import org.sonar.db.property.PropertyQuery; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.server.component.ComponentFinder; +import org.sonar.server.project.Visibility; import org.sonar.server.qualitygate.QualityGateFinder; import org.sonar.server.qualityprofile.QPMeasureData; import org.sonar.server.qualityprofile.QualityProfile; @@ -121,8 +122,7 @@ public class ComponentAction implements NavigationWsAction { .setResponseExample(getClass().getResource("component-example.json")) .setSince("5.2") .setChangelog( - new Change("6.4" ,"The 'visibility' field is added") - ); + new Change("6.4", "The 'visibility' field is added")); projectNavigation.createParam(PARAM_COMPONENT) .setDescription("A component key.") @@ -166,7 +166,7 @@ public class ComponentAction implements NavigationWsAction { .prop("description", component.description()) .prop("isFavorite", isFavourite(session, component)); if (Qualifiers.PROJECT.equals(component.qualifier())) { - json.prop("visibility", component.isPrivate() ? "private" : "public"); + json.prop("visibility", Visibility.getLabel(component.isPrivate())); } List pages = pageRepository.getComponentPages(false, component.qualifier()); writeExtensions(json, component, pages); diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java index 61025dccae3..f52bdf87b56 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java @@ -33,6 +33,7 @@ import org.sonar.db.DbSession; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; import org.sonar.server.organization.DefaultOrganizationProvider; +import org.sonar.server.project.Visibility; import org.sonar.server.ui.PageRepository; import org.sonar.server.user.UserSession; @@ -97,7 +98,7 @@ public class OrganizationAction implements NavigationWsAction { .prop("canProvisionProjects", userSession.hasPermission(OrganizationPermission.PROVISION_PROJECTS, organization)) .prop("canDelete", organization.isGuarded() ? userSession.isSystemAdministrator() : userSession.hasPermission(OrganizationPermission.ADMINISTER, organization)) .prop("isDefault", organization.getKey().equals(defaultOrganizationProvider.get().getKey())) - .prop("projectVisibility", newProjectPrivate ? "private" : "public"); + .prop("projectVisibility", Visibility.getLabel(newProjectPrivate)); Predicate personalOrgForBilling = page -> organization.getUserId() == null || !page.getKey().startsWith("billing/"); List pages = pageRepository.getOrganizationPages(false).stream().filter(personalOrgForBilling).collect(toList()); json.name("pages"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/project/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/project/ws/CreateActionTest.java index 9d725c79277..897741709cf 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/project/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/project/ws/CreateActionTest.java @@ -51,6 +51,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.sonar.core.util.Protobuf.setNullable; import static org.sonar.db.permission.OrganizationPermission.PROVISION_PROJECTS; +import static org.sonar.server.project.Visibility.PRIVATE; import static org.sonar.server.project.ws.CreateAction.PARAM_VISIBILITY; import static org.sonar.server.project.ws.ProjectsWsSupport.PARAM_ORGANIZATION; import static org.sonar.test.JsonAssert.assertJson; @@ -207,7 +208,7 @@ public class CreateActionTest { .setParam("key", DEFAULT_PROJECT_KEY) .setParam("name", DEFAULT_PROJECT_NAME) .setParam("organization", organization.getKey()) - .setParam("visibility", "private") + .setParam("visibility", PRIVATE.getLabel()) .executeProtobuf(CreateWsResponse.class); assertThat(result.getProject().getVisibility()).isEqualTo("private"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java index 6e2b392307b..e661b3426cc 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java @@ -136,7 +136,7 @@ public class UpdateVisibilityActionTest { .setParam(PARAM_VISIBILITY, ""); expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Value of parameter '" + PARAM_VISIBILITY + "' () must be one of: [public, private]"); + expectedException.expectMessage("Value of parameter '" + PARAM_VISIBILITY + "' () must be one of: [private, public]"); request.execute(); } @@ -151,7 +151,7 @@ public class UpdateVisibilityActionTest { request.setParam(PARAM_VISIBILITY, visibility).execute(); fail("An exception should have been raised"); } catch (IllegalArgumentException e) { - assertThat(e.getMessage()).isEqualTo(format("Value of parameter '%s' (%s) must be one of: %s", PARAM_VISIBILITY, visibility, "[public, private]")); + assertThat(e.getMessage()).isEqualTo(format("Value of parameter '%s' (%s) must be one of: [private, public]", PARAM_VISIBILITY, visibility)); } }); } -- 2.39.5