/*
* Copyright 2012
* Ubiquitous Knowledge Processing (UKP) Lab and FG Language Technology
* Technische Universität Darmstadt
*
* 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 de.tudarmstadt.ukp.clarin.webanno.ui.project;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.ListChoice;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import de.tudarmstadt.ukp.clarin.webanno.api.ProjectService;
import de.tudarmstadt.ukp.clarin.webanno.model.PermissionLevel;
import de.tudarmstadt.ukp.clarin.webanno.model.Project;
import de.tudarmstadt.ukp.clarin.webanno.model.ProjectPermission;
import de.tudarmstadt.ukp.clarin.webanno.security.UserDao;
import de.tudarmstadt.ukp.clarin.webanno.security.model.User;
import de.tudarmstadt.ukp.clarin.webanno.ui.core.settings.ProjectSettingsPanel;
import de.tudarmstadt.ukp.clarin.webanno.ui.core.settings.ProjectSettingsPanelBase;
/**
* A Panel used to add user permissions to a selected {@link Project}
*/
@ProjectSettingsPanel(label="Users", prio=100)
public class ProjectUsersPanel
extends ProjectSettingsPanelBase
{
private static final long serialVersionUID = 875749625429630464L;
private @SpringBean ProjectService projectRepository;
private @SpringBean UserDao userRepository;
private User selectedUser;
private ListChoice<User> users;
private CheckBoxMultipleChoice<PermissionLevel> permissionLevels;
private UserSelectionForm userSelectionForm;
private PermissionLevelDetailForm permissionLevelDetailForm;
private UserDetailForm userDetailForm;
public ProjectUsersPanel(String id, IModel<Project> aProject)
{
super(id, aProject);
userSelectionForm = new UserSelectionForm("userSelectionForm");
permissionLevelDetailForm = new PermissionLevelDetailForm("permissionLevelDetailForm");
permissionLevelDetailForm.setVisible(false);
userDetailForm = new UserDetailForm("userDetailForm");
userDetailForm.setVisible(false);
add(userSelectionForm);
add(permissionLevelDetailForm);
add(userDetailForm);
}
private class UserSelectionForm
extends Form<SelectionModel>
{
private static final long serialVersionUID = -1L;
List<User> userLists = new ArrayList<User>();
public UserSelectionForm(String id)
{
super(id, new CompoundPropertyModel<SelectionModel>(new SelectionModel()));
add(users = new ListChoice<User>("user")
{
private static final long serialVersionUID = 1L;
{
setChoices(new LoadableDetachableModel<List<User>>()
{
private static final long serialVersionUID = 1L;
@Override
protected List<User> load()
{
userLists = projectRepository.listProjectUsersWithPermissions(
ProjectUsersPanel.this.getModelObject());
return userLists;
}
});
setChoiceRenderer(new ChoiceRenderer<User>()
{
private static final long serialVersionUID = 4607720784161484145L;
@Override
public Object getDisplayValue(User aObject)
{
List<ProjectPermission> projectPermissions = projectRepository
.listProjectPermissionLevel(aObject,
ProjectUsersPanel.this.getModelObject());
List<String> permissionLevels = new ArrayList<String>();
for (ProjectPermission projectPermission : projectPermissions) {
permissionLevels.add(projectPermission.getLevel().getName());
}
return aObject.getUsername() + " " + permissionLevels
+ (aObject.isEnabled() ? "" : " (login disabled)");
}
});
setNullValid(false);
}
@Override
protected void onSelectionChanged(User aNewSelection)
{
if (aNewSelection == null) {
return;
}
selectedUser = aNewSelection;
// Clear old selections
permissionLevelDetailForm.setModelObject(null);
List<ProjectPermission> projectPermissions = projectRepository
.listProjectPermissionLevel(selectedUser,
ProjectUsersPanel.this.getModelObject());
List<PermissionLevel> levels = new ArrayList<PermissionLevel>();
for (ProjectPermission permission : projectPermissions) {
levels.add(permission.getLevel());
}
SelectionModel newSelectionModel = new SelectionModel();
newSelectionModel.permissionLevels.addAll(levels);
permissionLevelDetailForm.setModelObject(newSelectionModel);
}
@Override
protected boolean wantOnSelectionChangedNotifications()
{
return true;
}
@Override
protected CharSequence getDefaultChoice(String aSelectedValue)
{
return "";
}
});
users.setOutputMarkupId(true).add(new AttributeModifier("style", "width:100%"));
users.setMaxRows(15);
add(new Button("addUser", new StringResourceModel("label"))
{
private static final long serialVersionUID = 1L;
@Override
public void onSubmit()
{
userDetailForm.setVisible(true);
}
});
Button removeUserButton = new Button("removeUser", new StringResourceModel("label"))
{
private static final long serialVersionUID = 5032883366656500162L;
@Override
public void onSubmit()
{
if (selectedUser == null) {
info("No user is selected to remove");
return;
}
List<ProjectPermission> projectPermissions = projectRepository
.listProjectPermissionLevel(selectedUser,
ProjectUsersPanel.this.getModelObject());
for (ProjectPermission projectPermission : projectPermissions) {
projectRepository.removeProjectPermission(projectPermission);
}
userLists.remove(selectedUser);
}
};
// Add check to prevent accidental delete operation
removeUserButton.add(new AttributeModifier("onclick",
"if(!confirm('Do you really want to remove this User?')) return false;"));
add(removeUserButton);
// add(new Button("removeUser", new ResourceModel("label"))
// {
// private static final long serialVersionUID = 1L;
//
// @Override
// public void onSubmit()
// {
// if (selectedUser == null) {
// info("No user is selected to remove");
// return;
// }
// List<ProjectPermission> projectPermissions = projectRepository
// .listProjectPermisionLevel(selectedUser, selectedProject.getObject());
// for (ProjectPermission projectPermission : projectPermissions) {
// try {
// projectRepository.removeProjectPermission(projectPermission);
// }
// catch (IOException e) {
// error("Unable to remove project permission level "
// + ExceptionUtils.getRootCauseMessage(e));
// }
// }
// userLists.remove(selectedUser);
// }
// });
add(new Button("addPermissionLevel", new StringResourceModel("label"))
{
private static final long serialVersionUID = 1L;
@Override
public void onSubmit()
{
if (selectedUser != null) {
permissionLevelDetailForm.setVisible(true);
}
else {
info("Please Select a User First");
}
}
});
}
}
public class SelectionModel
implements Serializable
{
private static final long serialVersionUID = 9137613222721590389L;
public List<PermissionLevel> permissionLevels = new ArrayList<PermissionLevel>();
public User user;
public List<User> users = new ArrayList<User>();
}
private class PermissionLevelDetailForm
extends Form<SelectionModel>
{
private static final long serialVersionUID = -1L;
public PermissionLevelDetailForm(String id)
{
super(id, new CompoundPropertyModel<SelectionModel>(new SelectionModel()));
add(permissionLevels = new CheckBoxMultipleChoice<PermissionLevel>("permissionLevels")
{
private static final long serialVersionUID = 1L;
{
setSuffix("<br>");
setChoices(new LoadableDetachableModel<List<PermissionLevel>>()
{
private static final long serialVersionUID = 1L;
@Override
protected List<PermissionLevel> load()
{
return Arrays.asList(new PermissionLevel[] { PermissionLevel.ADMIN,
PermissionLevel.CURATOR, PermissionLevel.USER });
}
});
setChoiceRenderer(new ChoiceRenderer<PermissionLevel>()
{
private static final long serialVersionUID = 9050427999256764850L;
@Override
public Object getDisplayValue(PermissionLevel aObject)
{
return aObject.getName();
}
});
}
});
permissionLevels.setOutputMarkupId(true);
add(new Button("update", new StringResourceModel("label"))
{
private static final long serialVersionUID = 1L;
@Override
public void onSubmit()
{
if (selectedUser != null) {
Project project = ProjectUsersPanel.this.getModelObject();
List<ProjectPermission> projectPermissions = projectRepository
.listProjectPermissionLevel(selectedUser, project);
// Remove old permissionLevels
for (ProjectPermission ExistingProjectPermission : projectPermissions) {
projectRepository.removeProjectPermission(ExistingProjectPermission);
}
for (PermissionLevel level : PermissionLevelDetailForm.this
.getModelObject().permissionLevels) {
if (!projectRepository.existsProjectPermissionLevel(selectedUser,
project, level)) {
ProjectPermission projectPermission = new ProjectPermission();
projectPermission.setLevel(level);
projectPermission.setUser(selectedUser.getUsername());
projectPermission.setProject(project);
projectRepository.createProjectPermission(projectPermission);
}
}
}
PermissionLevelDetailForm.this.setVisible(false);
}
});
add(new Button("cancel", new StringResourceModel("label"))
{
private static final long serialVersionUID = 1L;
@Override
public void onSubmit()
{
PermissionLevelDetailForm.this.setVisible(false);
}
});
}
}
private class UserDetailForm
extends Form<SelectionModel>
{
private static final long serialVersionUID = -1L;
private CheckBoxMultipleChoice<User> users;
public UserDetailForm(String id)
{
super(id, new CompoundPropertyModel<SelectionModel>(new SelectionModel()));
add(users = (CheckBoxMultipleChoice<User>) new CheckBoxMultipleChoice<User>("users",
new LoadableDetachableModel<List<User>>()
{
private static final long serialVersionUID = 1L;
@Override
protected List<User> load()
{
List<User> allUSers = userRepository.list();
allUSers.removeAll(projectRepository.listProjectUsersWithPermissions(
ProjectUsersPanel.this.getModelObject()));
return allUSers;
}
}, new ChoiceRenderer<User>("username", "username")));
users.setSuffix("<br>");
add(new Button("add")
{
private static final long serialVersionUID = 1L;
@Override
public void onSubmit()
{
if (users.getModelObject() != null) {
for (User user : users.getModelObject()) {
ProjectPermission projectPermission = new ProjectPermission();
projectPermission.setProject(ProjectUsersPanel.this.getModelObject());
projectPermission.setUser(user.getUsername());
projectPermission.setLevel(PermissionLevel.USER);
projectRepository.createProjectPermission(projectPermission);
selectedUser = user;
}
SelectionModel userSelectionModel = new SelectionModel();
userSelectionModel.user = selectedUser;
userSelectionModel.permissionLevels.clear();
userSelectionModel.permissionLevels.add(PermissionLevel.USER);
userSelectionForm.setModelObject(userSelectionModel);
permissionLevelDetailForm.setModelObject(userSelectionModel);
UserDetailForm.this.setVisible(false);
}
else {
info("No user is selected");
}
}
});
add(new Button("cancel")
{
private static final long serialVersionUID = 1L;
@Override
public void onSubmit()
{
UserDetailForm.this.setVisible(false);
}
});
}
}
}