From 9085d2017cd7b381e77067a3a8ad70222a96689f Mon Sep 17 00:00:00 2001 From: Bruce Zu Date: Wed, 14 Dec 2011 13:27:43 +0800 Subject: [PATCH] Suggest parent for 'create-project' in the UI. It adds a list of parent suggestions for 'create project' in the UI, so the user can select a parent for the new project from a list of projects that are already parents to other projects. Change-Id: Ifb06a793717550bf99e4eaf64bb0d42b1ee1ceb0 --- .../common/data/ProjectAdminService.java | 1 + .../gerrit/client/admin/AdminConstants.java | 1 + .../client/admin/AdminConstants.properties | 1 + .../client/admin/CreateProjectScreen.java | 51 ++++++++++++++++++- .../rpc/project/ProjectAdminServiceImpl.java | 8 +++ .../httpd/rpc/project/ProjectModule.java | 1 + .../SuggestParentCandidatesHandler.java | 40 +++++++++++++++ .../server/config/GerritRequestModule.java | 4 +- ...ates.java => SuggestParentCandidates.java} | 46 ++++++++++++----- .../sshd/commands/CreateProjectCommand.java | 9 ++-- 10 files changed, 139 insertions(+), 23 deletions(-) create mode 100644 gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/SuggestParentCandidatesHandler.java rename gerrit-server/src/main/java/com/google/gerrit/server/project/{RetrieveParentCandidates.java => SuggestParentCandidates.java} (51%) diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java index 2d79759f6b..4d10a4244b 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java @@ -31,6 +31,7 @@ public interface ProjectAdminService extends RemoteJsonService { void visibleProjects(AsyncCallback callback); void visibleProjectDetails(AsyncCallback> callback); + void suggestParentCandidates(AsyncCallback> callback); void projectDetail(Project.NameKey projectName, AsyncCallback callback); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java index e08b03a99a..c928eb9169 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java @@ -48,6 +48,7 @@ public interface AdminConstants extends Constants { String descriptionNotifications(); String buttonSaveGroupOptions(); String suggestedGroupLabel(); + String parentSuggestions(); String headingGroupUUID(); String headingOwner(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties index 137f32df20..f2a8ad6604 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties @@ -26,6 +26,7 @@ isVisibleToAll = Make group visible to all registered users. buttonSaveGroupOptions = Save Group Options suggestedGroupLabel = group headingParentProjectName = Rights Inherit From +parentSuggestions = Parent Suggestion columnProjectName = Project Name emailOnlyAuthors = Authors diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java index 5f12e4dd2a..7f2ae079a1 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateProjectScreen.java @@ -20,6 +20,7 @@ import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.ui.HintTextBox; import com.google.gerrit.client.ui.ProjectNameSuggestOracle; +import com.google.gerrit.client.ui.ProjectsTable; import com.google.gerrit.client.ui.Screen; import com.google.gerrit.reviewdb.Project; import com.google.gwt.event.dom.client.ClickEvent; @@ -28,6 +29,7 @@ import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.user.client.History; +import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Grid; @@ -36,6 +38,8 @@ import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwtexpui.globalkey.client.NpTextBox; import com.google.gwtjsonrpc.client.VoidResult; +import java.util.List; + public class CreateProjectScreen extends Screen { private NpTextBox project; private Button create; @@ -43,6 +47,7 @@ public class CreateProjectScreen extends Screen { private SuggestBox sugestParent; private CheckBox emptyCommit; private CheckBox permissionsOnly; + private ProjectsTable suggestedParentsTab; public CreateProjectScreen() { super(); @@ -59,7 +64,6 @@ public class CreateProjectScreen extends Screen { protected void onInitUI() { super.onInitUI(); setPageTitle(Util.C.createProjectTitle()); - addCreateProjectPanel(); } @@ -78,7 +82,12 @@ public class CreateProjectScreen extends Screen { fp.add(emptyCommit); fp.add(permissionsOnly); fp.add(create); - add(fp); + VerticalPanel vp=new VerticalPanel(); + vp.add(fp); + initSuggestedParents(); + vp.add(suggestedParentsTab); + add(vp); + } private void initCreateTxt() { @@ -111,6 +120,44 @@ public class CreateProjectScreen extends Screen { parent.setVisibleLength(50); } + private void initSuggestedParents() { + suggestedParentsTab = new ProjectsTable() { + { + table.setText(0, 1, Util.C.parentSuggestions()); + } + + @Override + protected void populate(final int row, final Project k) { + final Anchor projectLink = new Anchor(k.getName()); + projectLink.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + sugestParent.setText(getRowItem(row).getName()); + } + }); + + table.setWidget(row, 1, projectLink); + table.setText(row, 2, k.getDescription()); + + setRowItem(row, k); + } + }; + suggestedParentsTab.setVisible(false); + + Util.PROJECT_SVC + .suggestParentCandidates(new GerritCallback>() { + @Override + public void onSuccess(List result) { + if (result != null && !result.isEmpty()) { + suggestedParentsTab.setVisible(true); + suggestedParentsTab.display(result); + suggestedParentsTab.finishDisplay(); + } + } + }); + } + private void addGrid(final VerticalPanel fp) { final Grid grid = new Grid(2, 2); grid.setStyleName(Gerrit.RESOURCES.css().infoBlock()); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java index 7c6584ae62..bf7eeae18a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java @@ -42,6 +42,7 @@ class ProjectAdminServiceImpl implements ProjectAdminService { private final ProjectAccessFactory.Factory projectAccessFactory; private final CreateProjectHandler.Factory createProjectHandlerFactory; private final ProjectDetailFactory.Factory projectDetailFactory; + private final SuggestParentCandidatesHandler.Factory suggestParentCandidatesHandlerFactory; @Inject ProjectAdminServiceImpl(final AddBranch.Factory addBranchFactory, @@ -53,6 +54,7 @@ class ProjectAdminServiceImpl implements ProjectAdminService { final VisibleProjectDetails.Factory visibleProjectDetailsFactory, final ProjectAccessFactory.Factory projectAccessFactory, final ProjectDetailFactory.Factory projectDetailFactory, + final SuggestParentCandidatesHandler.Factory parentCandidatesFactory, final CreateProjectHandler.Factory createNewProjectFactory) { this.addBranchFactory = addBranchFactory; this.changeProjectAccessFactory = changeProjectAccessFactory; @@ -64,6 +66,7 @@ class ProjectAdminServiceImpl implements ProjectAdminService { this.projectAccessFactory = projectAccessFactory; this.projectDetailFactory = projectDetailFactory; this.createProjectHandlerFactory = createNewProjectFactory; + this.suggestParentCandidatesHandlerFactory = parentCandidatesFactory; } @Override @@ -76,6 +79,11 @@ class ProjectAdminServiceImpl implements ProjectAdminService { visibleProjectDetailsFactory.create().to(callback); } + @Override + public void suggestParentCandidates(AsyncCallback> callback) { + suggestParentCandidatesHandlerFactory.create().to(callback); + } + @Override public void projectDetail(final Project.NameKey projectName, final AsyncCallback callback) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java index 5678045a09..2eb55b3d81 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java @@ -38,6 +38,7 @@ public class ProjectModule extends RpcServletModule { factory(VisibleProjectDetails.Factory.class); factory(ProjectAccessFactory.Factory.class); factory(ProjectDetailFactory.Factory.class); + factory(SuggestParentCandidatesHandler.Factory.class); } }); rpc(ProjectAdminServiceImpl.class); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/SuggestParentCandidatesHandler.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/SuggestParentCandidatesHandler.java new file mode 100644 index 0000000000..a6442e34b2 --- /dev/null +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/SuggestParentCandidatesHandler.java @@ -0,0 +1,40 @@ +// Copyright (C) 2011 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.httpd.rpc.project; + +import com.google.gerrit.httpd.rpc.Handler; +import com.google.gerrit.reviewdb.Project; +import com.google.gerrit.server.project.SuggestParentCandidates; +import com.google.inject.Inject; + +import java.util.List; + +public class SuggestParentCandidatesHandler extends Handler> { + interface Factory { + SuggestParentCandidatesHandler create(); + } + + private final SuggestParentCandidates suggestParentCandidates; + + @Inject + SuggestParentCandidatesHandler(final SuggestParentCandidates suggestParentCandidates) { + this.suggestParentCandidates = suggestParentCandidates; + } + + @Override + public List call() throws Exception { + return suggestParentCandidates.getProjects(); + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritRequestModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritRequestModule.java index 9e95dfeeed..2bc6d5fd7a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritRequestModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritRequestModule.java @@ -52,7 +52,7 @@ import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.CreateProject; import com.google.gerrit.server.project.PerRequestProjectControlCache; import com.google.gerrit.server.project.ProjectControl; -import com.google.gerrit.server.project.RetrieveParentCandidates; +import com.google.gerrit.server.project.SuggestParentCandidates; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryRewriter; import com.google.inject.servlet.RequestScoped; @@ -106,6 +106,6 @@ public class GerritRequestModule extends FactoryModule { factory(GroupMembers.Factory.class); factory(CreateProject.Factory.class); factory(Submit.Factory.class); - factory(RetrieveParentCandidates.Factory.class); + factory(SuggestParentCandidates.Factory.class); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RetrieveParentCandidates.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java similarity index 51% rename from gerrit-server/src/main/java/com/google/gerrit/server/project/RetrieveParentCandidates.java rename to gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java index ee0ac82125..9585e1ebf2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RetrieveParentCandidates.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java @@ -19,12 +19,15 @@ import com.google.gerrit.server.config.AllProjectsName; import com.google.gwtorm.client.OrmException; import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import java.util.Set; import java.util.TreeSet; -public class RetrieveParentCandidates { +public class SuggestParentCandidates { public interface Factory { - RetrieveParentCandidates create(); + SuggestParentCandidates create(); } private final ProjectControl.Factory projectControlFactory; @@ -32,32 +35,47 @@ public class RetrieveParentCandidates { private final AllProjectsName allProject; @Inject - RetrieveParentCandidates(final ProjectControl.Factory projectControlFactory, + SuggestParentCandidates(final ProjectControl.Factory projectControlFactory, final ProjectCache projectCache, final AllProjectsName allProject) { this.projectControlFactory = projectControlFactory; this.projectCache = projectCache; this.allProject = allProject; } - public Set get() throws OrmException { - final Set r = new TreeSet(); + public List getNameKeys() throws OrmException, + NoSuchProjectException { + List pList = getProjects(); + final List nameKeys = + new ArrayList(pList.size()); + for (Project p : pList) { + nameKeys.add(p.getNameKey()); + } + return nameKeys; + } + public List getProjects() throws OrmException, + NoSuchProjectException { + Set projects = new TreeSet(new Comparator() { + @Override + public int compare(Project o1, Project o2) { + return o1.getName().compareTo(o2.getName()); + } + }); for (Project.NameKey p : projectCache.all()) { try { - final ProjectControl project = projectControlFactory.controlFor(p); - final Project.NameKey parent = project.getProject().getParent(); - - if (parent != null) { - ProjectControl c = projectControlFactory.controlFor(parent); - if (c.isVisible() || c.isOwner()) { - r.add(parent); + final ProjectControl control = projectControlFactory.controlFor(p); + final Project.NameKey parentK = control.getProject().getParent(); + if (parentK != null) { + ProjectControl pControl = projectControlFactory.controlFor(parentK); + if (pControl.isVisible() || pControl.isOwner()) { + projects.add(pControl.getProject()); } } } catch (NoSuchProjectException e) { continue; } } - r.add(allProject); - return r; + projects.add(projectControlFactory.controlFor(allProject).getProject()); + return new ArrayList(projects); } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java index af888fd98e..f0327c5ae3 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java @@ -22,7 +22,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.project.CreateProject; import com.google.gerrit.server.project.CreateProjectArgs; import com.google.gerrit.server.project.ProjectControl; -import com.google.gerrit.server.project.RetrieveParentCandidates; +import com.google.gerrit.server.project.SuggestParentCandidates; import com.google.gerrit.sshd.BaseCommand; import com.google.inject.Inject; @@ -34,7 +34,6 @@ import org.kohsuke.args4j.Option; import java.io.PrintWriter; import java.util.List; -import java.util.Set; /** Create a new project. **/ final class CreateProjectCommand extends BaseCommand { @@ -104,7 +103,7 @@ final class CreateProjectCommand extends BaseCommand { private CreateProject.Factory CreateProjectFactory; @Inject - private RetrieveParentCandidates.Factory retrieveParentCandidatesFactory; + private SuggestParentCandidates.Factory suggestParentCandidatesFactory; @Override public void start(final Environment env) { @@ -143,8 +142,8 @@ final class CreateProjectCommand extends BaseCommand { CreateProjectFactory.create(args); createProject.createProject(); } else { - Set parentCandidates = - retrieveParentCandidatesFactory.create().get(); + List parentCandidates = + suggestParentCandidatesFactory.create().getNameKeys(); for (Project.NameKey parent : parentCandidates) { p.print(parent + "\n");