/* * 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 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 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 model = new CompoundPropertyModel(teamModel); List repos = getAccessRestrictedRepositoryList(true, null); List teamUsers = new ArrayList(teamModel.users); List preReceiveScripts = new ArrayList(); List postReceiveScripts = new ArrayList(); final String oldName = teamModel.name; final List permissions = teamModel.getRepositoryPermissions(); // users palette final Palette users = new Palette("users", new ListModel( getTeamUsers(teamUsers)), new CollectionModel(sortByDisplayName(getTeamUsers(app().users().getAllUsernames()))), new ChoiceRenderer(null, "userId"), 10, false); // pre-receive palette if (teamModel.preReceiveScripts != null) { preReceiveScripts.addAll(teamModel.preReceiveScripts); } final Palette preReceivePalette = new Palette("preReceiveScripts", new ListModel(preReceiveScripts), new CollectionModel(app().repositories() .getPreReceiveScriptsUnused(null)), new StringChoiceRenderer(), 12, true); // post-receive palette if (teamModel.postReceiveScripts != null) { postReceiveScripts.addAll(teamModel.postReceiveScripts); } final Palette postReceivePalette = new Palette("postReceiveScripts", new ListModel(postReceiveScripts), new CollectionModel(app().repositories() .getPostReceiveScriptsUnused(null)), new StringChoiceRenderer(), 12, true); Form form = new Form("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 selectedUsers = users.getSelectedChoices(); List members = new ArrayList(); 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 list = new HashSet(); 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 preReceiveScripts = new ArrayList(); Iterator pres = preReceivePalette.getSelectedChoices(); while (pres.hasNext()) { preReceiveScripts.add(pres.next()); } teamModel.preReceiveScripts.clear(); teamModel.preReceiveScripts.addAll(preReceiveScripts); // post-receive scripts List postReceiveScripts = new ArrayList(); Iterator 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("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(teamModel.mailingLists == null ? "" : StringUtils.flattenStrings(teamModel.mailingLists, " ")); form.add(new TextField("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 getTeamUsers(List teamUserIds) { List teamUsers = new ArrayList(); 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 sortByDisplayName(List teamUsers) { Collections.sort(teamUsers, new Comparator() { @Override public int compare(UserChoice o1, UserChoice o2) { return o1.getDisplayNameOrUserId().compareTo(o2.getDisplayNameOrUserId()); } }); return teamUsers; } }