diff options
Diffstat (limited to 'java/com/google/gerrit/server/api/projects/ProjectApiImpl.java')
-rw-r--r-- | java/com/google/gerrit/server/api/projects/ProjectApiImpl.java | 649 |
1 files changed, 649 insertions, 0 deletions
diff --git a/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java new file mode 100644 index 0000000000..354331efcf --- /dev/null +++ b/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java @@ -0,0 +1,649 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.api.projects; + +import static com.google.gerrit.server.api.ApiUtil.asRestApiException; +import static com.google.gerrit.server.restapi.project.DashboardsCollection.DEFAULT_DASHBOARD_NAME; +import static java.util.stream.Collectors.toList; + +import com.google.gerrit.extensions.api.access.ProjectAccessInfo; +import com.google.gerrit.extensions.api.access.ProjectAccessInput; +import com.google.gerrit.extensions.api.config.AccessCheckInfo; +import com.google.gerrit.extensions.api.config.AccessCheckInput; +import com.google.gerrit.extensions.api.projects.BranchApi; +import com.google.gerrit.extensions.api.projects.BranchInfo; +import com.google.gerrit.extensions.api.projects.CheckProjectInput; +import com.google.gerrit.extensions.api.projects.CheckProjectResultInfo; +import com.google.gerrit.extensions.api.projects.ChildProjectApi; +import com.google.gerrit.extensions.api.projects.CommitApi; +import com.google.gerrit.extensions.api.projects.ConfigInfo; +import com.google.gerrit.extensions.api.projects.ConfigInput; +import com.google.gerrit.extensions.api.projects.DashboardApi; +import com.google.gerrit.extensions.api.projects.DashboardInfo; +import com.google.gerrit.extensions.api.projects.DeleteBranchesInput; +import com.google.gerrit.extensions.api.projects.DeleteTagsInput; +import com.google.gerrit.extensions.api.projects.DescriptionInput; +import com.google.gerrit.extensions.api.projects.HeadInput; +import com.google.gerrit.extensions.api.projects.IndexProjectInput; +import com.google.gerrit.extensions.api.projects.ParentInput; +import com.google.gerrit.extensions.api.projects.ProjectApi; +import com.google.gerrit.extensions.api.projects.ProjectInput; +import com.google.gerrit.extensions.api.projects.TagApi; +import com.google.gerrit.extensions.api.projects.TagInfo; +import com.google.gerrit.extensions.common.ChangeInfo; +import com.google.gerrit.extensions.common.ProjectInfo; +import com.google.gerrit.extensions.restapi.BadRequestException; +import com.google.gerrit.extensions.restapi.IdString; +import com.google.gerrit.extensions.restapi.NotImplementedException; +import com.google.gerrit.extensions.restapi.ResourceConflictException; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; +import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.extensions.restapi.TopLevelResource; +import com.google.gerrit.server.permissions.GlobalPermission; +import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.project.ProjectJson; +import com.google.gerrit.server.project.ProjectResource; +import com.google.gerrit.server.restapi.project.Check; +import com.google.gerrit.server.restapi.project.CheckAccess; +import com.google.gerrit.server.restapi.project.ChildProjectsCollection; +import com.google.gerrit.server.restapi.project.CommitsCollection; +import com.google.gerrit.server.restapi.project.CreateAccessChange; +import com.google.gerrit.server.restapi.project.CreateProject; +import com.google.gerrit.server.restapi.project.DeleteBranches; +import com.google.gerrit.server.restapi.project.DeleteTags; +import com.google.gerrit.server.restapi.project.GetAccess; +import com.google.gerrit.server.restapi.project.GetConfig; +import com.google.gerrit.server.restapi.project.GetDescription; +import com.google.gerrit.server.restapi.project.GetHead; +import com.google.gerrit.server.restapi.project.GetParent; +import com.google.gerrit.server.restapi.project.Index; +import com.google.gerrit.server.restapi.project.ListBranches; +import com.google.gerrit.server.restapi.project.ListDashboards; +import com.google.gerrit.server.restapi.project.ListTags; +import com.google.gerrit.server.restapi.project.ProjectsCollection; +import com.google.gerrit.server.restapi.project.PutConfig; +import com.google.gerrit.server.restapi.project.PutDescription; +import com.google.gerrit.server.restapi.project.SetAccess; +import com.google.gerrit.server.restapi.project.SetHead; +import com.google.gerrit.server.restapi.project.SetParent; +import com.google.inject.Provider; +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import java.util.Collections; +import java.util.List; + +public class ProjectApiImpl implements ProjectApi { + interface Factory { + ProjectApiImpl create(ProjectResource project); + + ProjectApiImpl create(String name); + } + + private final PermissionBackend permissionBackend; + private final CreateProject createProject; + private final ProjectApiImpl.Factory projectApi; + private final ProjectsCollection projects; + private final GetDescription getDescription; + private final PutDescription putDescription; + private final ChildProjectApiImpl.Factory childApi; + private final ChildProjectsCollection children; + private final ProjectResource project; + private final ProjectJson projectJson; + private final String name; + private final BranchApiImpl.Factory branchApi; + private final TagApiImpl.Factory tagApi; + private final GetAccess getAccess; + private final SetAccess setAccess; + private final CreateAccessChange createAccessChange; + private final GetConfig getConfig; + private final PutConfig putConfig; + private final Provider<ListBranches> listBranches; + private final Provider<ListTags> listTags; + private final DeleteBranches deleteBranches; + private final DeleteTags deleteTags; + private final CommitsCollection commitsCollection; + private final CommitApiImpl.Factory commitApi; + private final DashboardApiImpl.Factory dashboardApi; + private final CheckAccess checkAccess; + private final Check check; + private final Provider<ListDashboards> listDashboards; + private final GetHead getHead; + private final SetHead setHead; + private final GetParent getParent; + private final SetParent setParent; + private final Index index; + + @AssistedInject + ProjectApiImpl( + PermissionBackend permissionBackend, + CreateProject createProject, + ProjectApiImpl.Factory projectApi, + ProjectsCollection projects, + GetDescription getDescription, + PutDescription putDescription, + ChildProjectApiImpl.Factory childApi, + ChildProjectsCollection children, + ProjectJson projectJson, + BranchApiImpl.Factory branchApiFactory, + TagApiImpl.Factory tagApiFactory, + GetAccess getAccess, + SetAccess setAccess, + CreateAccessChange createAccessChange, + GetConfig getConfig, + PutConfig putConfig, + Provider<ListBranches> listBranches, + Provider<ListTags> listTags, + DeleteBranches deleteBranches, + DeleteTags deleteTags, + CommitsCollection commitsCollection, + CommitApiImpl.Factory commitApi, + DashboardApiImpl.Factory dashboardApi, + CheckAccess checkAccess, + Check check, + Provider<ListDashboards> listDashboards, + GetHead getHead, + SetHead setHead, + GetParent getParent, + SetParent setParent, + Index index, + @Assisted ProjectResource project) { + this( + permissionBackend, + createProject, + projectApi, + projects, + getDescription, + putDescription, + childApi, + children, + projectJson, + branchApiFactory, + tagApiFactory, + getAccess, + setAccess, + createAccessChange, + getConfig, + putConfig, + listBranches, + listTags, + deleteBranches, + deleteTags, + project, + commitsCollection, + commitApi, + dashboardApi, + checkAccess, + check, + listDashboards, + getHead, + setHead, + getParent, + setParent, + index, + null); + } + + @AssistedInject + ProjectApiImpl( + PermissionBackend permissionBackend, + CreateProject createProject, + ProjectApiImpl.Factory projectApi, + ProjectsCollection projects, + GetDescription getDescription, + PutDescription putDescription, + ChildProjectApiImpl.Factory childApi, + ChildProjectsCollection children, + ProjectJson projectJson, + BranchApiImpl.Factory branchApiFactory, + TagApiImpl.Factory tagApiFactory, + GetAccess getAccess, + SetAccess setAccess, + CreateAccessChange createAccessChange, + GetConfig getConfig, + PutConfig putConfig, + Provider<ListBranches> listBranches, + Provider<ListTags> listTags, + DeleteBranches deleteBranches, + DeleteTags deleteTags, + CommitsCollection commitsCollection, + CommitApiImpl.Factory commitApi, + DashboardApiImpl.Factory dashboardApi, + CheckAccess checkAccess, + Check check, + Provider<ListDashboards> listDashboards, + GetHead getHead, + SetHead setHead, + GetParent getParent, + SetParent setParent, + Index index, + @Assisted String name) { + this( + permissionBackend, + createProject, + projectApi, + projects, + getDescription, + putDescription, + childApi, + children, + projectJson, + branchApiFactory, + tagApiFactory, + getAccess, + setAccess, + createAccessChange, + getConfig, + putConfig, + listBranches, + listTags, + deleteBranches, + deleteTags, + null, + commitsCollection, + commitApi, + dashboardApi, + checkAccess, + check, + listDashboards, + getHead, + setHead, + getParent, + setParent, + index, + name); + } + + private ProjectApiImpl( + PermissionBackend permissionBackend, + CreateProject createProject, + ProjectApiImpl.Factory projectApi, + ProjectsCollection projects, + GetDescription getDescription, + PutDescription putDescription, + ChildProjectApiImpl.Factory childApi, + ChildProjectsCollection children, + ProjectJson projectJson, + BranchApiImpl.Factory branchApiFactory, + TagApiImpl.Factory tagApiFactory, + GetAccess getAccess, + SetAccess setAccess, + CreateAccessChange createAccessChange, + GetConfig getConfig, + PutConfig putConfig, + Provider<ListBranches> listBranches, + Provider<ListTags> listTags, + DeleteBranches deleteBranches, + DeleteTags deleteTags, + ProjectResource project, + CommitsCollection commitsCollection, + CommitApiImpl.Factory commitApi, + DashboardApiImpl.Factory dashboardApi, + CheckAccess checkAccess, + Check check, + Provider<ListDashboards> listDashboards, + GetHead getHead, + SetHead setHead, + GetParent getParent, + SetParent setParent, + Index index, + String name) { + this.permissionBackend = permissionBackend; + this.createProject = createProject; + this.projectApi = projectApi; + this.projects = projects; + this.getDescription = getDescription; + this.putDescription = putDescription; + this.childApi = childApi; + this.children = children; + this.projectJson = projectJson; + this.project = project; + this.branchApi = branchApiFactory; + this.tagApi = tagApiFactory; + this.getAccess = getAccess; + this.setAccess = setAccess; + this.getConfig = getConfig; + this.putConfig = putConfig; + this.listBranches = listBranches; + this.listTags = listTags; + this.deleteBranches = deleteBranches; + this.deleteTags = deleteTags; + this.commitsCollection = commitsCollection; + this.commitApi = commitApi; + this.createAccessChange = createAccessChange; + this.dashboardApi = dashboardApi; + this.checkAccess = checkAccess; + this.check = check; + this.listDashboards = listDashboards; + this.getHead = getHead; + this.setHead = setHead; + this.getParent = getParent; + this.setParent = setParent; + this.name = name; + this.index = index; + } + + @Override + public ProjectApi create() throws RestApiException { + return create(new ProjectInput()); + } + + @Override + public ProjectApi create(ProjectInput in) throws RestApiException { + try { + if (name == null) { + throw new ResourceConflictException("Project already exists"); + } + if (in.name != null && !name.equals(in.name)) { + throw new BadRequestException("name must match input.name"); + } + permissionBackend + .currentUser() + .checkAny(GlobalPermission.fromAnnotation(createProject.getClass())); + createProject.apply(TopLevelResource.INSTANCE, IdString.fromDecoded(name), in); + return projectApi.create(projects.parse(name)); + } catch (Exception e) { + throw asRestApiException("Cannot create project: " + e.getMessage(), e); + } + } + + @Override + public ProjectInfo get() throws RestApiException { + if (project == null) { + throw new ResourceNotFoundException(name); + } + return projectJson.format(project.getProjectState()); + } + + @Override + public String description() throws RestApiException { + return getDescription.apply(checkExists()); + } + + @Override + public ProjectAccessInfo access() throws RestApiException { + try { + return getAccess.apply(checkExists()); + } catch (Exception e) { + throw asRestApiException("Cannot get access rights", e); + } + } + + @Override + public ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException { + try { + return setAccess.apply(checkExists(), p); + } catch (Exception e) { + throw asRestApiException("Cannot put access rights", e); + } + } + + @Override + public ChangeInfo accessChange(ProjectAccessInput p) throws RestApiException { + try { + return createAccessChange.apply(checkExists(), p).value(); + } catch (Exception e) { + throw asRestApiException("Cannot put access right change", e); + } + } + + @Override + public AccessCheckInfo checkAccess(AccessCheckInput in) throws RestApiException { + try { + return checkAccess.apply(checkExists(), in); + } catch (Exception e) { + throw asRestApiException("Cannot check access rights", e); + } + } + + @Override + public CheckProjectResultInfo check(CheckProjectInput in) throws RestApiException { + try { + return check.apply(checkExists(), in); + } catch (Exception e) { + throw asRestApiException("Cannot check project", e); + } + } + + @Override + public void description(DescriptionInput in) throws RestApiException { + try { + putDescription.apply(checkExists(), in); + } catch (Exception e) { + throw asRestApiException("Cannot put project description", e); + } + } + + @Override + public ConfigInfo config() throws RestApiException { + return getConfig.apply(checkExists()); + } + + @Override + public ConfigInfo config(ConfigInput in) throws RestApiException { + try { + return putConfig.apply(checkExists(), in); + } catch (Exception e) { + throw asRestApiException("Cannot list tags", e); + } + } + + @Override + public ListRefsRequest<BranchInfo> branches() { + return new ListRefsRequest<BranchInfo>() { + @Override + public List<BranchInfo> get() throws RestApiException { + try { + return listBranches.get().request(this).apply(checkExists()); + } catch (Exception e) { + throw asRestApiException("Cannot list branches", e); + } + } + }; + } + + @Override + public ListRefsRequest<TagInfo> tags() { + return new ListRefsRequest<TagInfo>() { + @Override + public List<TagInfo> get() throws RestApiException { + try { + return listTags.get().request(this).apply(checkExists()); + } catch (Exception e) { + throw asRestApiException("Cannot list tags", e); + } + } + }; + } + + @Override + public List<ProjectInfo> children() throws RestApiException { + return children(false); + } + + @Override + public List<ProjectInfo> children(boolean recursive) throws RestApiException { + try { + return children.list().withRecursive(recursive).apply(checkExists()); + } catch (Exception e) { + throw asRestApiException("Cannot list children", e); + } + } + + @Override + public List<ProjectInfo> children(int limit) throws RestApiException { + try { + return children.list().withLimit(limit).apply(checkExists()); + } catch (Exception e) { + throw asRestApiException("Cannot list children", e); + } + } + + @Override + public ChildProjectApi child(String name) throws RestApiException { + try { + return childApi.create(children.parse(checkExists(), IdString.fromDecoded(name))); + } catch (Exception e) { + throw asRestApiException("Cannot parse child project", e); + } + } + + @Override + public BranchApi branch(String ref) throws ResourceNotFoundException { + return branchApi.create(checkExists(), ref); + } + + @Override + public TagApi tag(String ref) throws ResourceNotFoundException { + return tagApi.create(checkExists(), ref); + } + + @Override + public void deleteBranches(DeleteBranchesInput in) throws RestApiException { + try { + deleteBranches.apply(checkExists(), in); + } catch (Exception e) { + throw asRestApiException("Cannot delete branches", e); + } + } + + @Override + public void deleteTags(DeleteTagsInput in) throws RestApiException { + try { + deleteTags.apply(checkExists(), in); + } catch (Exception e) { + throw asRestApiException("Cannot delete tags", e); + } + } + + @Override + public CommitApi commit(String commit) throws RestApiException { + try { + return commitApi.create(commitsCollection.parse(checkExists(), IdString.fromDecoded(commit))); + } catch (Exception e) { + throw asRestApiException("Cannot parse commit", e); + } + } + + @Override + public DashboardApi dashboard(String name) throws RestApiException { + try { + return dashboardApi.create(checkExists(), name); + } catch (Exception e) { + throw asRestApiException("Cannot parse dashboard", e); + } + } + + @Override + public DashboardApi defaultDashboard() throws RestApiException { + return dashboard(DEFAULT_DASHBOARD_NAME); + } + + @Override + public void defaultDashboard(String name) throws RestApiException { + try { + dashboardApi.create(checkExists(), name).setDefault(); + } catch (Exception e) { + throw asRestApiException("Cannot set default dashboard", e); + } + } + + @Override + public void removeDefaultDashboard() throws RestApiException { + try { + dashboardApi.create(checkExists(), null).setDefault(); + } catch (Exception e) { + throw asRestApiException("Cannot remove default dashboard", e); + } + } + + @Override + public ListDashboardsRequest dashboards() throws RestApiException { + return new ListDashboardsRequest() { + @Override + public List<DashboardInfo> get() throws RestApiException { + try { + List<?> r = listDashboards.get().apply(checkExists()); + if (r.isEmpty()) { + return Collections.emptyList(); + } + if (r.get(0) instanceof DashboardInfo) { + return r.stream().map(i -> (DashboardInfo) i).collect(toList()); + } + throw new NotImplementedException("list with inheritance"); + } catch (Exception e) { + throw asRestApiException("Cannot list dashboards", e); + } + } + }; + } + + @Override + public String head() throws RestApiException { + try { + return getHead.apply(checkExists()); + } catch (Exception e) { + throw asRestApiException("Cannot get HEAD", e); + } + } + + @Override + public void head(String head) throws RestApiException { + HeadInput input = new HeadInput(); + input.ref = head; + try { + setHead.apply(checkExists(), input); + } catch (Exception e) { + throw asRestApiException("Cannot set HEAD", e); + } + } + + @Override + public String parent() throws RestApiException { + try { + return getParent.apply(checkExists()); + } catch (Exception e) { + throw asRestApiException("Cannot get parent", e); + } + } + + @Override + public void parent(String parent) throws RestApiException { + try { + ParentInput input = new ParentInput(); + input.parent = parent; + setParent.apply(checkExists(), input); + } catch (Exception e) { + throw asRestApiException("Cannot set parent", e); + } + } + + @Override + public void index(boolean indexChildren) throws RestApiException { + try { + IndexProjectInput input = new IndexProjectInput(); + input.indexChildren = indexChildren; + index.apply(checkExists(), input); + } catch (Exception e) { + throw asRestApiException("Cannot index project", e); + } + } + + private ProjectResource checkExists() throws ResourceNotFoundException { + if (project == null) { + throw new ResourceNotFoundException(name); + } + return project; + } +} |