Convert ListDashboards to PermissionBackend
Change the getState() on ProjectResource to instead return ProjectState object from the ProjectCache, which is much more useful to callers. Change-Id: Ib448c0ad41bc31f5a70907cabba2bb5e0c58ed4c
This commit is contained in:
		 Shawn Pearce
					Shawn Pearce
				
			
				
					committed by
					
						 David Pursehouse
						David Pursehouse
					
				
			
			
				
	
			
			
			 David Pursehouse
						David Pursehouse
					
				
			
						parent
						
							8ea6df30a2
						
					
				
				
					commit
					17ab8ce41e
				
			| @@ -19,12 +19,20 @@ import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS; | |||||||
| import com.google.gerrit.extensions.restapi.ResourceNotFoundException; | import com.google.gerrit.extensions.restapi.ResourceNotFoundException; | ||||||
| import com.google.gerrit.extensions.restapi.RestReadView; | import com.google.gerrit.extensions.restapi.RestReadView; | ||||||
| import com.google.gerrit.reviewdb.client.Project; | import com.google.gerrit.reviewdb.client.Project; | ||||||
|  | import com.google.gerrit.server.CurrentUser; | ||||||
| import com.google.gerrit.server.git.GitRepositoryManager; | import com.google.gerrit.server.git.GitRepositoryManager; | ||||||
|  | import com.google.gerrit.server.permissions.PermissionBackend; | ||||||
|  | import com.google.gerrit.server.permissions.PermissionBackendException; | ||||||
|  | import com.google.gerrit.server.permissions.ProjectPermission; | ||||||
| import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; | import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; | ||||||
| import com.google.inject.Inject; | import com.google.inject.Inject; | ||||||
|  | import com.google.inject.Provider; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.LinkedHashMap; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
| import org.eclipse.jgit.errors.ConfigInvalidException; | import org.eclipse.jgit.errors.ConfigInvalidException; | ||||||
| import org.eclipse.jgit.errors.RepositoryNotFoundException; | import org.eclipse.jgit.errors.RepositoryNotFoundException; | ||||||
| import org.eclipse.jgit.lib.BlobBasedConfig; | import org.eclipse.jgit.lib.BlobBasedConfig; | ||||||
| @@ -41,29 +49,34 @@ class ListDashboards implements RestReadView<ProjectResource> { | |||||||
|   private static final Logger log = LoggerFactory.getLogger(ListDashboards.class); |   private static final Logger log = LoggerFactory.getLogger(ListDashboards.class); | ||||||
|  |  | ||||||
|   private final GitRepositoryManager gitManager; |   private final GitRepositoryManager gitManager; | ||||||
|  |   private final PermissionBackend permissionBackend; | ||||||
|  |   private final Provider<CurrentUser> user; | ||||||
|  |  | ||||||
|   @Option(name = "--inherited", usage = "include inherited dashboards") |   @Option(name = "--inherited", usage = "include inherited dashboards") | ||||||
|   private boolean inherited; |   private boolean inherited; | ||||||
|  |  | ||||||
|   @Inject |   @Inject | ||||||
|   ListDashboards(GitRepositoryManager gitManager) { |   ListDashboards( | ||||||
|  |       GitRepositoryManager gitManager, | ||||||
|  |       PermissionBackend permissionBackend, | ||||||
|  |       Provider<CurrentUser> user) { | ||||||
|     this.gitManager = gitManager; |     this.gitManager = gitManager; | ||||||
|  |     this.permissionBackend = permissionBackend; | ||||||
|  |     this.user = user; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
|   public List<?> apply(ProjectResource resource) throws ResourceNotFoundException, IOException { |   public List<?> apply(ProjectResource rsrc) | ||||||
|     ProjectControl ctl = resource.getControl(); |       throws ResourceNotFoundException, IOException, PermissionBackendException { | ||||||
|     String project = ctl.getProject().getName(); |     String project = rsrc.getName(); | ||||||
|     if (!inherited) { |     if (!inherited) { | ||||||
|       return scan(resource.getControl(), project, true); |       return scan(rsrc.getControl(), project, true); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     List<List<DashboardInfo>> all = new ArrayList<>(); |     List<List<DashboardInfo>> all = new ArrayList<>(); | ||||||
|     boolean setDefault = true; |     boolean setDefault = true; | ||||||
|     for (ProjectState ps : ctl.getProjectState().tree()) { |     for (ProjectState ps : tree(rsrc)) { | ||||||
|       ctl = ps.controlFor(ctl.getUser()); |       List<DashboardInfo> list = scan(ps.controlFor(user.get()), project, setDefault); | ||||||
|       if (ctl.isVisible()) { |  | ||||||
|         List<DashboardInfo> list = scan(ctl, project, setDefault); |  | ||||||
|       for (DashboardInfo d : list) { |       for (DashboardInfo d : list) { | ||||||
|         if (d.isDefault != null && Boolean.TRUE.equals(d.isDefault)) { |         if (d.isDefault != null && Boolean.TRUE.equals(d.isDefault)) { | ||||||
|           setDefault = false; |           setDefault = false; | ||||||
| @@ -73,10 +86,19 @@ class ListDashboards implements RestReadView<ProjectResource> { | |||||||
|         all.add(list); |         all.add(list); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     } |  | ||||||
|     return all; |     return all; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   private Collection<ProjectState> tree(ProjectResource rsrc) throws PermissionBackendException { | ||||||
|  |     Map<Project.NameKey, ProjectState> tree = new LinkedHashMap<>(); | ||||||
|  |     for (ProjectState ps : rsrc.getProjectState().tree()) { | ||||||
|  |       tree.put(ps.getProject().getNameKey(), ps); | ||||||
|  |     } | ||||||
|  |     tree.keySet() | ||||||
|  |         .retainAll(permissionBackend.user(user).filter(ProjectPermission.ACCESS, tree.keySet())); | ||||||
|  |     return tree.values(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   private List<DashboardInfo> scan(ProjectControl ctl, String project, boolean setDefault) |   private List<DashboardInfo> scan(ProjectControl ctl, String project, boolean setDefault) | ||||||
|       throws ResourceNotFoundException, IOException { |       throws ResourceNotFoundException, IOException { | ||||||
|     Project.NameKey projectName = ctl.getProject().getNameKey(); |     Project.NameKey projectName = ctl.getProject().getNameKey(); | ||||||
|   | |||||||
| @@ -14,7 +14,6 @@ | |||||||
|  |  | ||||||
| package com.google.gerrit.server.project; | package com.google.gerrit.server.project; | ||||||
|  |  | ||||||
| import com.google.gerrit.extensions.client.ProjectState; |  | ||||||
| import com.google.gerrit.extensions.restapi.RestResource; | import com.google.gerrit.extensions.restapi.RestResource; | ||||||
| import com.google.gerrit.extensions.restapi.RestView; | import com.google.gerrit.extensions.restapi.RestView; | ||||||
| import com.google.gerrit.reviewdb.client.Project; | import com.google.gerrit.reviewdb.client.Project; | ||||||
| @@ -42,8 +41,8 @@ public class ProjectResource implements RestResource { | |||||||
|     return control.getProject().getNameKey(); |     return control.getProject().getNameKey(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public ProjectState getState() { |   public ProjectState getProjectState() { | ||||||
|     return control.getProject().getState(); |     return control.getProjectState(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public ProjectControl getControl() { |   public ProjectControl getControl() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user