Repository: kylin Updated Branches: refs/heads/2.x-staging cd5e21b4c -> bda79cac4
KYLIN-1341, display model json and update project permission Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/bda79cac Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/bda79cac Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/bda79cac Branch: refs/heads/2.x-staging Commit: bda79cac47b944e8ea0caaf83c4038dac5d4a60a Parents: 85319c0 Author: janzhongi <jiazh...@ebay.com> Authored: Wed Jan 27 19:33:42 2016 +0800 Committer: janzhongi <jiazh...@ebay.com> Committed: Wed Jan 27 19:33:57 2016 +0800 ---------------------------------------------------------------------- .../rest/controller/ProjectController.java | 83 ++++++++++---------- webapp/app/js/controllers/cubeModel.js | 7 +- webapp/app/partials/cubes/cube_detail.html | 6 -- webapp/app/partials/jobs/jobs.html | 6 +- webapp/app/partials/models/model_detail.html | 13 ++- webapp/app/partials/models/models.html | 4 +- webapp/app/partials/models/models_tree.html | 2 +- webapp/app/partials/query/query.html | 4 +- 8 files changed, 61 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java b/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java index 5e65b3b..980ec8c 100644 --- a/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java +++ b/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java @@ -66,13 +66,14 @@ public class ProjectController extends BasicController { private AccessService accessService; @Autowired private CubeService cubeService; + /** * Get available project list - * + * * @return Table metadata array * @throws IOException */ - @RequestMapping(value = "", method = { RequestMethod.GET }) + @RequestMapping(value = "", method = {RequestMethod.GET}) @ResponseBody public List<ProjectInstance> getProjects(@RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset) { return projectService.listAllProjects(limit, offset); @@ -110,71 +111,72 @@ public class ProjectController extends BasicController { } String userName = userDetails.getUsername(); for (ProjectInstance projectInstance : projectInstances) { + if (projectInstance == null) { + continue; + } boolean hasProjectPermission = false; AclEntity ae = accessService.getAclEntity("ProjectInstance", projectInstance.getId()); Acl projectAcl = accessService.getAcl(ae); //project no Acl info will be skipped - if(projectAcl == null){ - continue; - } + if (projectAcl != null) { - //project owner has permission - if (((PrincipalSid)projectAcl.getOwner()).getPrincipal().equals(userName)) { - readableProjects.add(projectInstance); - continue; - } - - //check project permission and role - for (AccessControlEntry ace : projectAcl.getEntries()) { - if( ace.getSid() instanceof PrincipalSid && ((PrincipalSid)ace.getSid()).getPrincipal().equals(userName)) { - hasProjectPermission = true; + //project owner has permission + if (((PrincipalSid) projectAcl.getOwner()).getPrincipal().equals(userName)) { readableProjects.add(projectInstance); - break; + continue; + } - }else if(ace.getSid() instanceof GrantedAuthoritySid){ - String projectAuthority = ((GrantedAuthoritySid) ace.getSid()).getGrantedAuthority(); - if(userAuthority.contains(projectAuthority)){ + //check project permission and role + for (AccessControlEntry ace : projectAcl.getEntries()) { + if (ace.getSid() instanceof PrincipalSid && ((PrincipalSid) ace.getSid()).getPrincipal().equals(userName)) { hasProjectPermission = true; readableProjects.add(projectInstance); break; + + } else if (ace.getSid() instanceof GrantedAuthoritySid) { + String projectAuthority = ((GrantedAuthoritySid) ace.getSid()).getGrantedAuthority(); + if (userAuthority.contains(projectAuthority)) { + hasProjectPermission = true; + readableProjects.add(projectInstance); + break; + } + } } - } + if (!hasProjectPermission) { List<CubeInstance> cubeInstances = cubeService.listAllCubes(projectInstance.getName()); for (CubeInstance cubeInstance : cubeInstances) { - if(cubeInstance == null){ + if (cubeInstance == null) { continue; } boolean hasCubePermission = false; AclEntity cubeAe = accessService.getAclEntity("CubeInstance", cubeInstance.getId()); Acl cubeAcl = accessService.getAcl(cubeAe); //cube no Acl info will not be used to filter project - if(cubeAcl == null){ - continue; - } - //cube owner will have permission to read project - if (((PrincipalSid)cubeAcl.getOwner()).getPrincipal().equals(userName)) { - hasProjectPermission = true; - break; - } - for (AccessControlEntry cubeAce : cubeAcl.getEntries()) { - - if (cubeAce.getSid() instanceof PrincipalSid && ((PrincipalSid)cubeAce.getSid()).getPrincipal().equals(userName)) { - hasCubePermission = true; + if (cubeAcl != null) { + //cube owner will have permission to read project + if (((PrincipalSid) cubeAcl.getOwner()).getPrincipal().equals(userName)) { + hasProjectPermission = true; break; } - else if(cubeAce.getSid() instanceof GrantedAuthoritySid) { - String cubeAuthority = ((GrantedAuthoritySid) cubeAce.getSid()).getGrantedAuthority(); - if(userAuthority.contains(cubeAuthority)){ + for (AccessControlEntry cubeAce : cubeAcl.getEntries()) { + + if (cubeAce.getSid() instanceof PrincipalSid && ((PrincipalSid) cubeAce.getSid()).getPrincipal().equals(userName)) { hasCubePermission = true; break; - } + } else if (cubeAce.getSid() instanceof GrantedAuthoritySid) { + String cubeAuthority = ((GrantedAuthoritySid) cubeAce.getSid()).getGrantedAuthority(); + if (userAuthority.contains(cubeAuthority)) { + hasCubePermission = true; + break; + } + } } } if (hasCubePermission) { @@ -192,7 +194,7 @@ public class ProjectController extends BasicController { return readableProjects; } - @RequestMapping(value = "", method = { RequestMethod.POST }) + @RequestMapping(value = "", method = {RequestMethod.POST}) @ResponseBody public ProjectInstance saveProject(@RequestBody CreateProjectRequest projectRequest) { if (StringUtils.isEmpty(projectRequest.getName())) { @@ -210,7 +212,7 @@ public class ProjectController extends BasicController { return createdProj; } - @RequestMapping(value = "", method = { RequestMethod.PUT }) + @RequestMapping(value = "", method = {RequestMethod.PUT}) @ResponseBody public ProjectInstance updateProject(@RequestBody UpdateProjectRequest projectRequest) { if (StringUtils.isEmpty(projectRequest.getFormerProjectName())) { @@ -229,7 +231,7 @@ public class ProjectController extends BasicController { return updatedProj; } - @RequestMapping(value = "/{projectName}", method = { RequestMethod.DELETE }) + @RequestMapping(value = "/{projectName}", method = {RequestMethod.DELETE}) @ResponseBody public void deleteProject(@PathVariable String projectName) { try { @@ -245,6 +247,7 @@ public class ProjectController extends BasicController { public void setProjectService(ProjectService projectService) { this.projectService = projectService; } + public void setAccessService(AccessService accessService) { this.accessService = accessService; } http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/webapp/app/js/controllers/cubeModel.js ---------------------------------------------------------------------- diff --git a/webapp/app/js/controllers/cubeModel.js b/webapp/app/js/controllers/cubeModel.js index b2e2c64..a96edc5 100644 --- a/webapp/app/js/controllers/cubeModel.js +++ b/webapp/app/js/controllers/cubeModel.js @@ -29,18 +29,19 @@ KylinApp.controller('CubeModelCtrl', function ($location,$scope, $modal,cubeConf }; $scope.cleanStatus = function(model){ + var _model = angular.copy(model); - if (!model) + if (!_model) { return; } - var newModel = jQuery.extend(true, {}, model); + var newModel = jQuery.extend(true, {}, _model); delete newModel.project; delete newModel.accessEntities; delete newModel.visiblePage; delete newModel.cubes; - return newModel; + return angular.toJson(newModel,true); }; $scope.cubeConfig = cubeConfig; http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/webapp/app/partials/cubes/cube_detail.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/cubes/cube_detail.html b/webapp/app/partials/cubes/cube_detail.html index 49e2578..b10a08c 100755 --- a/webapp/app/partials/cubes/cube_detail.html +++ b/webapp/app/partials/cubes/cube_detail.html @@ -21,8 +21,6 @@ <li class="{{(!cube.visiblePage || cube.visiblePage=='metadata')? 'active':''}}"> <a href="" ng-click="cube.visiblePage='metadata'">Grid</a> </li> - <!--<li class="{{cube.visiblePage=='graph'? 'active':''}}">--> - <!--<a href="" ng-click="cube.visiblePage='graph';buildGraph(cube);">Visualization</a>--> <!--</li>--> <li class="{{cube.visiblePage=='sql'? 'active':''}}"> <a href="" ng-click="cube.visiblePage='sql';getCubeSql(cube)">SQL</a> @@ -31,10 +29,6 @@ ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cube, 16) && !newAccess"> <a href="" ng-click="cube.visiblePage='json';">JSON(Cube)</a> </li> - <!--<li class="{{cube.visiblePage=='json_model'? 'active':''}}"--> - <!--ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cube, 16) && !newAccess">--> - <!--<a href="" ng-click="cube.visiblePage='json_model';">JSON(Model)</a>--> - <!--</li>--> <li class="{{cube.visiblePage=='access'? 'active':''}}"> <a href="" ng-click="cube.visiblePage='access';listAccess(cube, 'CubeInstance');">Access</a> </li> http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/webapp/app/partials/jobs/jobs.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/jobs/jobs.html b/webapp/app/partials/jobs/jobs.html index 124a1f6..4c2ebc3 100644 --- a/webapp/app/partials/jobs/jobs.html +++ b/webapp/app/partials/jobs/jobs.html @@ -20,9 +20,9 @@ <!--Project: --> <div class="col-xs-3"> <form ng-if="userService.isAuthorized()"> - <div class="form-group"> - <a class="btn btn-xs btn-info" href="projects" tooltip="Manage Project"><i class="fa fa-gears"></i></a> - <a class="btn btn-xs btn-primary" style="width: 29px" ng-if="userService.hasRole('ROLE_ADMIN')||userService.hasRole('ROLE_MODELER')&&kylinConfig.getDeployEnv()!=='PROD'" tooltip="Add Project" ng-click="toCreateProj()"> + <div class="form-group" ng-if="userService.hasRole('ROLE_MODELER')" > + <a class="btn btn-xs btn-info" ng-if="Manage Project" href="projects" tooltip="Manage Project"><i class="fa fa-gears"></i></a> + <a class="btn btn-xs btn-primary" style="width: 29px" tooltip="Add Project" ng-click="toCreateProj()"> <i class="fa fa-plus"></i> </a> </div> http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/webapp/app/partials/models/model_detail.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/models/model_detail.html b/webapp/app/partials/models/model_detail.html index df42fde..dcf782a 100644 --- a/webapp/app/partials/models/model_detail.html +++ b/webapp/app/partials/models/model_detail.html @@ -29,10 +29,9 @@ <li class="{{modelsManager.selectedModel.visiblePage=='graph'? 'active':''}}"> <a href="" ng-click="modelsManager.selectedModel.visiblePage='graph';buildGraph(modelsManager.selectedModel);$event.stopPropagation();">Visualization</a> </li> - <li class="{{modelsManager.selectedModel.visiblePage=='json_model'? 'active':''}}" - ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(modelsManager.selectedModel, 16) && !newAccess"> - <a href="" ng-click="modelsManager.selectedModel.visiblePage='json_model';">JSON</a> - </li> + <li class="{{modelsManager.selectedModel.visiblePage=='json_model'? 'active':''}}"> + <a href="" ng-click="modelsManager.selectedModel.visiblePage='json_model';">JSON</a> + </li> <li class="dropdown" ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(modelsManager.selectedModel, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask, permissions.OPERATION.mask)"> <a class="dropdown-toggle highlight-bule" data-toggle="dropdown" href="#" aria-expanded="true"> <i class="fa fa-star"> Action </i> <span class="caret"></span> @@ -59,9 +58,9 @@ </div> <div ng-show="modelsManager.selectedModel.visiblePage=='graph'" id="model_graph_{{modelsManager.selectedModel.name}}" class="model-detail model_graph"> </div> - <div ng-show="modelsManager.selectedModel.visiblePage=='json_model'" class="model-detail"> - <pre ng-if="!state.jsonEdit" - style="background-color: white;border: 0px">{{angular.toJson(cleanStatus(modelsManager.selectedModel), true)}}</pre> + <div ng-show="modelsManager.selectedModel.visiblePage=='json_model'" class="cube-detail"> + <pre + style="background-color: white;border: 0px">{{cleanStatus(modelsManager.selectedModel)}}</pre> </div> </div> http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/webapp/app/partials/models/models.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/models/models.html b/webapp/app/partials/models/models.html index 4d8c7ac..c0b7a05 100644 --- a/webapp/app/partials/models/models.html +++ b/webapp/app/partials/models/models.html @@ -19,9 +19,9 @@ <div class="page-header" style="height: 50px;"> <!--Project--> <form class="navbar-form navbar-left" style="margin-top: 0px !important;" ng-if="userService.isAuthorized()"> - <div class="form-group"> + <div class="form-group" ng-if="userService.hasRole('ROLE_MODELER')" > <a class="btn btn-xs btn-info" href="projects" tooltip="Manage Project"><i class="fa fa-gears"></i></a> - <a class="btn btn-xs btn-primary" ng-if="userService.hasRole('ROLE_ADMIN')||userService.hasRole('ROLE_MODELER')&&kylinConfig.getDeployEnv()!=='PROD'" style="width: 29px" tooltip="Add Project" ng-click="toCreateProj()"> + <a class="btn btn-xs btn-primary" style="width: 29px" tooltip="Add Project" ng-click="toCreateProj()"> <i class="fa fa-plus"></i> </a> </div> http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/webapp/app/partials/models/models_tree.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/models/models_tree.html b/webapp/app/partials/models/models_tree.html index 9d32c9f..e84f082 100644 --- a/webapp/app/partials/models/models_tree.html +++ b/webapp/app/partials/models/models_tree.html @@ -20,7 +20,7 @@ <div class="row"> <div class="col-xs-12" style="margin-top:10px;"> <!--<i class="fa fa-plus fa-2x" style="color:green;"> New</i>--> - <a class="dropdown-toggle" data-toggle="dropdown" href="#" aria-expanded="true"> + <a ng-if="userService.hasRole('ROLE_MODELER')" class="dropdown-toggle" data-toggle="dropdown" href="#" aria-expanded="true"> <i class="fa fa-plus fa-2x" style="color:#2e8965;"> New<span class="caret"></span></i> <!--<i> New </i> <span class="caret"></span>--> </a> http://git-wip-us.apache.org/repos/asf/kylin/blob/bda79cac/webapp/app/partials/query/query.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/query/query.html b/webapp/app/partials/query/query.html index d34dbc7..7b865fc 100644 --- a/webapp/app/partials/query/query.html +++ b/webapp/app/partials/query/query.html @@ -19,9 +19,9 @@ <div class="page-header" style="height: 50px;"> <!--Project--> <form class="navbar-form navbar-left" style="margin-top: 0px !important;" ng-if="userService.isAuthorized()"> - <div class="form-group"> + <div class="form-group" ng-if="userService.hasRole('ROLE_MODELER')"> <a class="btn btn-xs btn-info" href="projects" tooltip="Manage Project"><i class="fa fa-gears"></i></a> - <a class="btn btn-xs btn-primary" ng-if="userService.hasRole('ROLE_ADMIN')||userService.hasRole('ROLE_MODELER')&&kylinConfig.getDeployEnv()!=='PROD'" style="width: 29px" tooltip="Add Project" ng-click="toCreateProj()"> + <a class="btn btn-xs btn-primary" style="width: 29px" tooltip="Add Project" ng-click="toCreateProj()"> <i class="fa fa-plus"></i> </a> </div>