]> source.dussan.org Git - sonarqube.git/commitdiff
fix quality flaws: use a constant instead of literal “private”
authorDaniel Schwarz <daniel.schwarz@sonarsource.com>
Fri, 28 Apr 2017 13:14:32 +0000 (15:14 +0200)
committerDaniel Schwarz <bartfastiel@users.noreply.github.com>
Fri, 28 Apr 2017 14:20:03 +0000 (16:20 +0200)
server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentDtoToWsComponent.java
server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java
server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateProjectVisibilityAction.java
server/sonar-server/src/main/java/org/sonar/server/project/Visibility.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/project/package-info.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/project/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java
server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java
server/sonar-server/src/test/java/org/sonar/server/project/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java

index aba5592ff219f91c0a739a5b22a9eb86c8cdd9d0..5c2c0c8d563edc04ee32dc177e6b3038320c90ea 100644 (file)
@@ -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;
   }
index 9472247dc75f543fc43a43b849db4977a9547677..e8cb88abc4f95998d31245deec97e29a0b00d741 100644 (file)
@@ -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());
index 64c195c7ac34ffad98a3dfc3194483104a280c6b..6beec1aa8efa381c32cd31c26cf46fe923425281 100644 (file)
@@ -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<OrganizationDto> 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 (file)
index 0000000..514aa85
--- /dev/null
@@ -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<String> 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<String> 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 (file)
index 0000000..f4805a3
--- /dev/null
@@ -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;
index 45d0c69a3cca3f185a09ae49a98a6f86338a1b40..fe17b6d4c3d9703513186d223e81471c7d7909ca 100644 (file)
@@ -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();
   }
 
index df819ed4de54d9609fb9ce385fbf3980ad230860..3302a35e8f06c480d0eab2e22138a39e986ad7db 100644 (file)
@@ -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<String> 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);
index 9d31390107adf829992ae2de2f19e02719f19071..417d9e973fa7aa121da8e8b18e86bab392ddd199 100644 (file)
@@ -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<Page> pages = pageRepository.getComponentPages(false, component.qualifier());
     writeExtensions(json, component, pages);
index 61025dccae356a3336cbb1e4a9a44e6cfabe565f..f52bdf87b561d34dc6f7bed3dff7ed90de2b3bb4 100644 (file)
@@ -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<Page> personalOrgForBilling = page -> organization.getUserId() == null || !page.getKey().startsWith("billing/");
     List<Page> pages = pageRepository.getOrganizationPages(false).stream().filter(personalOrgForBilling).collect(toList());
     json.name("pages");
index 9d725c7927717e18433fc261aed49fed46239c6e..897741709cf1e6a0e9bb86602e5ff2acbbcf04d3 100644 (file)
@@ -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");
index 6e2b392307be99be378dfa6ed6673cae786adc2e..e661b3426cc3b29f1a461c41dc3701a9d7c5c867 100644 (file)
@@ -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));
         }
       });
   }