| /* | |
| * Copyright 2011 gitblit.com. | |
| * | |
| * 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.gitblit.wicket.pages; | |
| import java.text.MessageFormat; | |
| import java.util.ArrayList; | |
| import java.util.Collections; | |
| import java.util.Comparator; | |
| import java.util.HashSet; | |
| import java.util.Iterator; | |
| import java.util.List; | |
| import java.util.Set; | |
| import org.apache.wicket.PageParameters; | |
| import org.apache.wicket.behavior.SimpleAttributeModifier; | |
| import org.apache.wicket.extensions.markup.html.form.palette.Palette; | |
| import org.apache.wicket.markup.html.form.Button; | |
| import org.apache.wicket.markup.html.form.CheckBox; | |
| import org.apache.wicket.markup.html.form.ChoiceRenderer; | |
| import org.apache.wicket.markup.html.form.Form; | |
| import org.apache.wicket.markup.html.form.TextField; | |
| import org.apache.wicket.model.CompoundPropertyModel; | |
| import org.apache.wicket.model.IModel; | |
| import org.apache.wicket.model.Model; | |
| import org.apache.wicket.model.util.CollectionModel; | |
| import org.apache.wicket.model.util.ListModel; | |
| import com.gitblit.Constants.RegistrantType; | |
| import com.gitblit.Constants.Role; | |
| import com.gitblit.GitBlitException; | |
| import com.gitblit.Keys; | |
| import com.gitblit.models.RegistrantAccessPermission; | |
| import com.gitblit.models.TeamModel; | |
| import com.gitblit.models.UserChoice; | |
| import com.gitblit.models.UserModel; | |
| import com.gitblit.utils.StringUtils; | |
| import com.gitblit.wicket.RequiresAdminRole; | |
| import com.gitblit.wicket.StringChoiceRenderer; | |
| import com.gitblit.wicket.WicketUtils; | |
| import com.gitblit.wicket.panels.BulletListPanel; | |
| import com.gitblit.wicket.panels.RegistrantPermissionsPanel; | |
| @RequiresAdminRole | |
| public class EditTeamPage extends RootSubPage { | |
| private final boolean isCreate; | |
| private IModel<String> mailingLists; | |
| public EditTeamPage() { | |
| // create constructor | |
| super(); | |
| isCreate = true; | |
| setupPage(new TeamModel("")); | |
| setStatelessHint(false); | |
| setOutputMarkupId(true); | |
| } | |
| public EditTeamPage(PageParameters params) { | |
| // edit constructor | |
| super(params); | |
| isCreate = false; | |
| String name = WicketUtils.getTeamname(params); | |
| TeamModel model = app().users().getTeamModel(name); | |
| setupPage(model); | |
| setStatelessHint(false); | |
| setOutputMarkupId(true); | |
| } | |
| @Override | |
| protected boolean requiresPageMap() { | |
| return true; | |
| } | |
| @Override | |
| protected Class<? extends BasePage> getRootNavPageClass() { | |
| return TeamsPage.class; | |
| } | |
| protected void setupPage(final TeamModel teamModel) { | |
| if (isCreate) { | |
| super.setupPage(getString("gb.newTeam"), ""); | |
| } else { | |
| super.setupPage(getString("gb.edit"), teamModel.name); | |
| } | |
| CompoundPropertyModel<TeamModel> model = new CompoundPropertyModel<TeamModel>(teamModel); | |
| List<String> repos = getAccessRestrictedRepositoryList(true, null); | |
| List<String> teamUsers = new ArrayList<String>(teamModel.users); | |
| List<String> preReceiveScripts = new ArrayList<String>(); | |
| List<String> postReceiveScripts = new ArrayList<String>(); | |
| final String oldName = teamModel.name; | |
| final List<RegistrantAccessPermission> permissions = teamModel.getRepositoryPermissions(); | |
| // users palette | |
| final Palette<UserChoice> users = new Palette<UserChoice>("users", new ListModel<UserChoice>( | |
| getTeamUsers(teamUsers)), new CollectionModel<UserChoice>(sortByDisplayName(getTeamUsers(app().users().getAllUsernames()))), new ChoiceRenderer<UserChoice>(null, "userId"), 10, false); | |
| // pre-receive palette | |
| if (teamModel.preReceiveScripts != null) { | |
| preReceiveScripts.addAll(teamModel.preReceiveScripts); | |
| } | |
| final Palette<String> preReceivePalette = new Palette<String>("preReceiveScripts", | |
| new ListModel<String>(preReceiveScripts), new CollectionModel<String>(app().repositories() | |
| .getPreReceiveScriptsUnused(null)), new StringChoiceRenderer(), | |
| 12, true); | |
| // post-receive palette | |
| if (teamModel.postReceiveScripts != null) { | |
| postReceiveScripts.addAll(teamModel.postReceiveScripts); | |
| } | |
| final Palette<String> postReceivePalette = new Palette<String>("postReceiveScripts", | |
| new ListModel<String>(postReceiveScripts), new CollectionModel<String>(app().repositories() | |
| .getPostReceiveScriptsUnused(null)), new StringChoiceRenderer(), | |
| 12, true); | |
| Form<TeamModel> form = new Form<TeamModel>("editForm", model) { | |
| private static final long serialVersionUID = 1L; | |
| /* | |
| * (non-Javadoc) | |
| * | |
| * @see org.apache.wicket.markup.html.form.Form#onSubmit() | |
| */ | |
| @Override | |
| protected void onSubmit() { | |
| String teamname = teamModel.name; | |
| if (StringUtils.isEmpty(teamname)) { | |
| error(getString("gb.pleaseSetTeamName")); | |
| return; | |
| } | |
| if (isCreate) { | |
| TeamModel model = app().users().getTeamModel(teamname); | |
| if (model != null) { | |
| error(MessageFormat.format(getString("gb.teamNameUnavailable"), teamname)); | |
| return; | |
| } | |
| } | |
| // update team permissions | |
| for (RegistrantAccessPermission repositoryPermission : permissions) { | |
| teamModel.setRepositoryPermission(repositoryPermission.registrant, repositoryPermission.permission); | |
| } | |
| Iterator<UserChoice> selectedUsers = users.getSelectedChoices(); | |
| List<String> members = new ArrayList<String>(); | |
| while (selectedUsers.hasNext()) { | |
| members.add(selectedUsers.next().getUserId().toLowerCase()); | |
| } | |
| teamModel.users.clear(); | |
| teamModel.users.addAll(members); | |
| // set mailing lists | |
| String ml = mailingLists.getObject(); | |
| if (!StringUtils.isEmpty(ml)) { | |
| Set<String> list = new HashSet<String>(); | |
| for (String address : ml.split("(,|\\s)")) { | |
| if (StringUtils.isEmpty(address)) { | |
| continue; | |
| } | |
| list.add(address.toLowerCase()); | |
| } | |
| teamModel.mailingLists.clear(); | |
| teamModel.mailingLists.addAll(list); | |
| } | |
| // pre-receive scripts | |
| List<String> preReceiveScripts = new ArrayList<String>(); | |
| Iterator<String> pres = preReceivePalette.getSelectedChoices(); | |
| while (pres.hasNext()) { | |
| preReceiveScripts.add(pres.next()); | |
| } | |
| teamModel.preReceiveScripts.clear(); | |
| teamModel.preReceiveScripts.addAll(preReceiveScripts); | |
| // post-receive scripts | |
| List<String> postReceiveScripts = new ArrayList<String>(); | |
| Iterator<String> post = postReceivePalette.getSelectedChoices(); | |
| while (post.hasNext()) { | |
| postReceiveScripts.add(post.next()); | |
| } | |
| teamModel.postReceiveScripts.clear(); | |
| teamModel.postReceiveScripts.addAll(postReceiveScripts); | |
| try { | |
| if (isCreate) { | |
| app().gitblit().addTeam(teamModel); | |
| } else { | |
| app().gitblit().reviseTeam(oldName, teamModel); | |
| } | |
| } catch (GitBlitException e) { | |
| error(e.getMessage()); | |
| return; | |
| } | |
| setRedirect(false); | |
| if (isCreate) { | |
| // create another team | |
| info(MessageFormat.format(getString("gb.teamCreated"), | |
| teamModel.name)); | |
| } | |
| // back to users page | |
| setResponsePage(TeamsPage.class); | |
| } | |
| }; | |
| // do not let the browser pre-populate these fields | |
| form.add(new SimpleAttributeModifier("autocomplete", "off")); | |
| // not all user providers support manipulating team memberships | |
| boolean editMemberships = app().authentication().supportsTeamMembershipChanges(teamModel); | |
| // not all user providers support manipulating the admin role | |
| boolean changeAdminRole = app().authentication().supportsRoleChanges(teamModel, Role.ADMIN); | |
| // not all user providers support manipulating the create role | |
| boolean changeCreateRole = app().authentication().supportsRoleChanges(teamModel, Role.CREATE); | |
| // not all user providers support manipulating the fork role | |
| boolean changeForkRole = app().authentication().supportsRoleChanges(teamModel, Role.FORK); | |
| // field names reflective match TeamModel fields | |
| form.add(new TextField<String>("name")); | |
| form.add(new CheckBox("canAdmin").setEnabled(changeAdminRole)); | |
| form.add(new CheckBox("canFork").setEnabled(app().settings().getBoolean(Keys.web.allowForking, true) && changeForkRole)); | |
| form.add(new CheckBox("canCreate").setEnabled(changeCreateRole)); | |
| form.add(users.setEnabled(editMemberships)); | |
| mailingLists = new Model<String>(teamModel.mailingLists == null ? "" | |
| : StringUtils.flattenStrings(teamModel.mailingLists, " ")); | |
| form.add(new TextField<String>("mailingLists", mailingLists)); | |
| form.add(new RegistrantPermissionsPanel("repositories", RegistrantType.REPOSITORY, | |
| repos, permissions, getAccessPermissions())); | |
| form.add(preReceivePalette); | |
| form.add(new BulletListPanel("inheritedPreReceive", "inherited", app().repositories() | |
| .getPreReceiveScriptsInherited(null))); | |
| form.add(postReceivePalette); | |
| form.add(new BulletListPanel("inheritedPostReceive", "inherited", app().repositories() | |
| .getPostReceiveScriptsInherited(null))); | |
| form.add(new Button("save")); | |
| Button cancel = new Button("cancel") { | |
| private static final long serialVersionUID = 1L; | |
| @Override | |
| public void onSubmit() { | |
| setResponsePage(TeamsPage.class); | |
| } | |
| }; | |
| cancel.setDefaultFormProcessing(false); | |
| form.add(cancel); | |
| add(form); | |
| } | |
| private List<UserChoice> getTeamUsers(List<String> teamUserIds) { | |
| List<UserChoice> teamUsers = new ArrayList<UserChoice>(); | |
| for (String teamUserId : teamUserIds) { | |
| UserModel userModel = app().users().getUserModel(teamUserId); | |
| if (userModel!=null) { | |
| teamUsers.add(new UserChoice(userModel.displayName, userModel.username, userModel.emailAddress)); | |
| } | |
| } | |
| return sortByDisplayName(teamUsers); | |
| } | |
| private List<UserChoice> sortByDisplayName(List<UserChoice> teamUsers) { | |
| Collections.sort(teamUsers, new Comparator<UserChoice>() { | |
| @Override | |
| public int compare(UserChoice o1, UserChoice o2) { | |
| return o1.getDisplayNameOrUserId().compareTo(o2.getDisplayNameOrUserId()); | |
| } | |
| }); | |
| return teamUsers; | |
| } | |
| } |