minor, project renaming also copy ACL information
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/450845c6 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/450845c6 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/450845c6 Branch: refs/heads/master Commit: 450845c6377c131db801f9eca9c4e062fd67fc0e Parents: 6f8a91c Author: Roger Shi <rogershijich...@hotmail.com> Authored: Mon Jun 26 21:19:43 2017 +0800 Committer: Hongbin Ma <m...@kyligence.io> Committed: Tue Jun 27 11:18:03 2017 +0800 ---------------------------------------------------------------------- .../kylin/metadata/project/ProjectManager.java | 52 +++++++++++--------- .../rest/controller/ProjectController.java | 6 ++- .../rest/controller2/ProjectControllerV2.java | 10 ++-- .../java/org/apache/kylin/rest/msg/Message.java | 4 -- .../kylin/rest/service/ProjectService.java | 24 ++++++++- 5 files changed, 62 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/450845c6/core-metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java b/core-metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java index d4b3ff4..213b136 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java @@ -47,6 +47,7 @@ import org.apache.kylin.metadata.realization.RealizationType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -216,35 +217,40 @@ public class ProjectManager { } } - //update project itself - public ProjectInstance updateProject(ProjectInstance project, String newName, String newDesc, + // rename project + public ProjectInstance renameProject(ProjectInstance project, String newName, String newDesc, LinkedHashMap<String, String> overrideProps) throws IOException { - if (!project.getName().equals(newName)) { - ProjectInstance newProject = this.createProject(newName, project.getOwner(), newDesc, overrideProps); - - newProject.setCreateTimeUTC(project.getCreateTimeUTC()); - newProject.recordUpdateTime(System.currentTimeMillis()); - newProject.setRealizationEntries(project.getRealizationEntries()); - newProject.setTables(project.getTables()); - newProject.setModels(project.getModels()); - newProject.setExtFilters(project.getExtFilters()); + Preconditions.checkArgument(!project.getName().equals(newName)); + ProjectInstance newProject = this.createProject(newName, project.getOwner(), newDesc, overrideProps); + + newProject.setUuid(project.getUuid()); + newProject.setCreateTimeUTC(project.getCreateTimeUTC()); + newProject.recordUpdateTime(System.currentTimeMillis()); + newProject.setRealizationEntries(project.getRealizationEntries()); + newProject.setTables(project.getTables()); + newProject.setModels(project.getModels()); + newProject.setExtFilters(project.getExtFilters()); + + removeProject(project); + updateProject(newProject); - removeProject(project); - updateProject(newProject); + return newProject; + } - return newProject; - } else { - project.setName(newName); - project.setDescription(newDesc); - project.setOverrideKylinProps(overrideProps); + //update project itself + public ProjectInstance updateProject(ProjectInstance project, String newName, String newDesc, + LinkedHashMap<String, String> overrideProps) throws IOException { + Preconditions.checkArgument(project.getName().equals(newName)); + project.setName(newName); + project.setDescription(newDesc); + project.setOverrideKylinProps(overrideProps); - if (project.getUuid() == null) - project.updateRandomUuid(); + if (project.getUuid() == null) + project.updateRandomUuid(); - updateProject(project); + updateProject(project); - return project; - } + return project; } private void updateProject(ProjectInstance prj) throws IOException { http://git-wip-us.apache.org/repos/asf/kylin/blob/450845c6/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java index 89c8b23..74e806e 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java @@ -172,7 +172,11 @@ public class ProjectController extends BasicController { throw new InternalErrorException("The project named " + formerProjectName + " does not exists"); } - updatedProj = projectService.updateProject(projectDesc, currentProject); + if (projectDesc.getName().equals(currentProject.getName())) { + updatedProj = projectService.updateProject(projectDesc, currentProject); + } else { + updatedProj = projectService.renameProject(projectDesc, currentProject); + } } catch (Exception e) { logger.error("Failed to deal with the request.", e); throw new InternalErrorException(e.getLocalizedMessage()); http://git-wip-us.apache.org/repos/asf/kylin/blob/450845c6/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java b/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java index 6dea4e3..a25e5b1 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java @@ -138,12 +138,12 @@ public class ProjectControllerV2 extends BasicController { throw new BadRequestException(String.format(msg.getPROJECT_NOT_FOUND(), formerProjectName)); } - // cannot modify project name if it's not empty - if (!currentProject.getName().equals(projectDesc.getName()) && !isProjectEmpty(currentProject.getName())) { - throw new BadRequestException(msg.getRENAME_PROJECT_NOT_EMPTY()); + ProjectInstance updatedProj; + if (projectDesc.getName().equals(currentProject.getName())) { + updatedProj = projectService.updateProject(projectDesc, currentProject); + } else { + updatedProj = projectService.renameProject(projectDesc, currentProject); } - - ProjectInstance updatedProj = projectService.updateProject(projectDesc, currentProject); return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, updatedProj, ""); } http://git-wip-us.apache.org/repos/asf/kylin/blob/450845c6/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java b/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java index 9ed38bb..45c1a65 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java +++ b/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java @@ -249,10 +249,6 @@ public class Message { return "Cannot delete non-empty project"; } - public String getRENAME_PROJECT_NOT_EMPTY() { - return "Cannot rename non-empty project"; - } - // Table public String getHIVE_TABLE_NOT_FOUND() { return "Cannot find Hive table '%s'."; http://git-wip-us.apache.org/repos/asf/kylin/blob/450845c6/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java b/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java index f71097b..c6bd6cf 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/ProjectService.java @@ -28,6 +28,7 @@ import javax.annotation.Nullable; import org.apache.directory.api.util.Strings; import org.apache.kylin.cube.CubeInstance; +import org.apache.kylin.metadata.draft.Draft; import org.apache.kylin.metadata.project.ProjectInstance; import org.apache.kylin.metadata.project.ProjectManager; import org.apache.kylin.metadata.realization.RealizationType; @@ -94,6 +95,10 @@ public class ProjectService extends BasicService { @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#currentProject, 'ADMINISTRATION') or hasPermission(#currentProject, 'MANAGEMENT')") public ProjectInstance updateProject(ProjectInstance newProject, ProjectInstance currentProject) throws IOException { + if (!newProject.getName().equals(currentProject.getName())) { + return renameProject(newProject, currentProject); + } + String newProjectName = newProject.getName(); String newDescription = newProject.getDescription(); LinkedHashMap<String, String> overrideProps = newProject.getOverrideKylinProps(); @@ -101,10 +106,27 @@ public class ProjectService extends BasicService { ProjectInstance updatedProject = getProjectManager().updateProject(currentProject, newProjectName, newDescription, overrideProps); logger.debug("Project updated."); - return updatedProject; } + @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#currentProject, 'ADMINISTRATION')") + public ProjectInstance renameProject(ProjectInstance newProject, ProjectInstance currentProject) throws IOException { + String newProjectName = newProject.getName(); + String newDescription = newProject.getDescription(); + LinkedHashMap<String, String> overrideProps = newProject.getOverrideKylinProps(); + + // rename project but keep UUID, acl keeps the same + ProjectInstance renamedProject = getProjectManager().renameProject(currentProject, newProjectName, newDescription, overrideProps); + + // rebind draft and project + for (Draft draft : getDraftManager().list(currentProject.getName())) { + draft.setProject(newProjectName); + } + + logger.debug("Project rename."); + return renamedProject; + } + @PostFilter(Constant.ACCESS_POST_FILTER_READ) public List<ProjectInstance> listProjects(final Integer limit, final Integer offset) { List<ProjectInstance> projects = listAllProjects(limit, offset);