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;
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;
}
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;
.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());
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;
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.");
--- /dev/null
+/*
+ * 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;
+ }
+}
--- /dev/null
+/*
+ * 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;
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;
.setRequired(false)
.setInternal(true)
.setSince("6.4")
- .setPossibleValues("private", "public");
+ .setPossibleValues(Visibility.getLabels());
support.addOrganizationParam(action);
}
.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);
.setKey(componentDto.key())
.setName(componentDto.name())
.setQualifier(componentDto.qualifier())
- .setVisibility(componentDto.isPrivate() ? "private" : "public"))
+ .setVisibility(Visibility.getLabel(componentDto.isPrivate())))
.build();
}
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;
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;
action.createParam(PARAM_VISIBILITY)
.setDescription("new visibility of the project or view")
- .setPossibleValues(PUBLIC_VISIBILITY, PRIVATE_VISIBILITY)
+ .setPossibleValues(Visibility.getLabels())
.setRequired(true);
}
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);
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;
.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.")
.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);
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;
.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");
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;
.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");
.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();
}
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));
}
});
}