/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.security.web.role;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.geoserver.security.impl.GeoServerRole;
import org.geoserver.web.GeoServerApplication;
/**
* A form component that can be used to edit user/rule role lists
*/
@SuppressWarnings("serial")
public class RuleRolesFormComponent extends RolePaletteFormComponent {
static final Set<String> ANY_ROLE = Collections.singleton("*");
public RuleRolesFormComponent(String id, IModel<Collection<String>> roleNamesModel) {
super(id, new RolesModel(roleNamesModel), new RuleRolesModel());
boolean anyRolesEnabled = ANY_ROLE.equals(roleNamesModel.getObject());
add(new AjaxCheckBox("anyRole", new Model(anyRolesEnabled)) {
@Override
protected void onUpdate(AjaxRequestTarget target) {
palette.setEnabled(!getModelObject());
target.add(palette);
}
});
palette.setEnabled(!anyRolesEnabled);
}
public RuleRolesFormComponent setHasAnyRole(boolean hasAny) {
get("anyRole").setDefaultModelObject(hasAny);
palette.setEnabled(!hasAny);
return this;
}
public boolean isHasAnyRole() {
return (Boolean) get("anyRole").getDefaultModelObject();
}
@Override
protected String getSelectedHeaderPropertyKey() {
return "RuleRolesFormComponent.selectedHeader";
}
@Override
protected String getAvaliableHeaderPropertyKey() {
return "RuleRolesFormComponent.availableHeader";
}
//
// add(hasAnyBox);
// if (hasStoredAnyRole(rootObject)) {
// rolePalette.setEnabled(false);
// rolePalette.add(new AttributeAppender("disabled", true, new Model<String>("disabled"), " "));
// hasAnyBox.setDefaultModelObject(Boolean.TRUE);
// }
// else {
// rolePalette.setEnabled(true);
// rolePalette.add(new AttributeAppender("enabled", true, new Model<String>("enabled"), " "));
// hasAnyBox.setDefaultModelObject(Boolean.FALSE);
// }
//
// }
//
// public abstract boolean hasStoredAnyRole(T rootObject);
//
// public boolean hasAnyRole() {
// return (Boolean) hasAnyBox.getDefaultModelObject();
// }
//
public Set<GeoServerRole> getRolesForStoring() {
Set<GeoServerRole> result = new HashSet<GeoServerRole>();
if (isHasAnyRole()) {
result.add(GeoServerRole.ANY_ROLE);
}
else {
result.addAll(getSelectedRoles());
}
return result;
}
public Set<String> getRolesNamesForStoring() {
Set<String> result = new HashSet<String>();
for (GeoServerRole role : getRolesForStoring()) {
result.add(role.getAuthority());
}
return result;
}
static class RolesModel extends LoadableDetachableModel<List<GeoServerRole>>{
IModel<Collection<String>> roleNamesModel;
RolesModel(IModel<Collection<String>> roleNamesModel) {
this.roleNamesModel = roleNamesModel;
}
@Override
protected List<GeoServerRole> load() {
Map<String,GeoServerRole> roleMap;
roleMap=new HashMap<String,GeoServerRole>();
try {
for (GeoServerRole role : GeoServerApplication.get().getSecurityManager().getRolesForAccessControl())
roleMap.put(role.getAuthority(), role);
} catch (IOException e) {
throw new RuntimeException(e);
}
List<GeoServerRole> roles = new ArrayList<GeoServerRole>();
for (String roleName : roleNamesModel.getObject()) {
GeoServerRole role = roleMap.get(roleName);
if (role!=null)
roles.add(role);
}
return roles;
}
@Override
public void setObject(List<GeoServerRole> object) {
super.setObject(object);
//set back to the delegate model
Collection<String> roleNames = roleNamesModel.getObject();
roleNames.clear();
for (GeoServerRole role : object) {
roleNames.add(role.getAuthority());
}
//roleNamesModel.setObject(roleNames);
}
}
// public boolean isHasAny() {
// return hasAny;
// }
//
// public void setHasAny(boolean hasAny) {
// this.hasAny = hasAny;
// }
//
// @Override
// public void updateModel() {
// super.updateModel();
// hasAnyBox.updateModel();
// }
}