/**
* Copyright (c) 2011, Thilo Planz. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package v7cr;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import org.bson.BSONObject;
import v7cr.v7db.AccountInfo;
import v7cr.v7db.BSONBackedObject;
import v7cr.v7db.Role;
import v7cr.v7db.Roles;
import v7cr.v7db.SchemaDefinition;
import v7cr.vaadin.LocalizedStringColumnGenerator;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.vaadin.data.util.BeanContainer;
import com.vaadin.data.util.BeanItem;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.TwinColSelect;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
@SuppressWarnings("serial")
class RoleEditor extends CustomComponent implements ItemClickListener,
ClickListener {
private final Table rolesTab = new Table();
private final TwinColSelect memberSelect = new TwinColSelect();
private final BeanContainer<String, Role> roles = new BeanContainer<String, Role>(
Role.class);
RoleEditor(V7CR v7) {
setCaption(v7.getMessage("roleEditor.name"));
setIcon(new ThemeResource("../runo/icons/16/users.png"));
this.roles.setBeanIdProperty("id");
for (BSONBackedObject b : v7.find("roles")) {
roles.addBean(new Role(b));
}
SchemaDefinition sd = Role.getRoleSchemaDefinition();
Locale l = v7.getLocale();
rolesTab.setContainerDataSource(this.roles);
rolesTab.addGeneratedColumn("name", new LocalizedStringColumnGenerator(
l));
rolesTab.setVisibleColumns(new Object[] { "id", "name" });
rolesTab.setColumnHeaders(new String[] { sd.getFieldCaption("_id", l),
sd.getFieldCaption("name", l) });
rolesTab.setSelectable(true);
rolesTab.setImmediate(true);
rolesTab.addListener(this);
Panel rightSide = new Panel();
memberSelect.setRightColumnCaption(sd.getFieldCaption("member", l));
memberSelect.setLeftColumnCaption(v7
.getMessage("roleEditor.nonMembers"));
rightSide.addComponent(memberSelect);
Button commitButton = new Button(v7.getMessage("button.submit"));
commitButton.addListener(this);
rightSide.addComponent(commitButton);
rightSide.setWidth("500");
HorizontalLayout hl = new HorizontalLayout();
hl.addComponent(rolesTab);
hl.addComponent(rightSide);
setCompositionRoot(hl);
}
public void itemClick(ItemClickEvent event) {
String roleId = (String) event.getItemId();
Role r = Roles.load(((V7CR) getApplication()).getDBCollection("roles"),
roleId);
if (r == null)
return;
BeanItem<Role> role = new BeanItem<Role>(r);
BeanContainer<String, AccountInfo> members = new BeanContainer<String, AccountInfo>(
AccountInfo.class);
members.setBeanIdProperty("id");
members.addAll(r.getMembers().values());
for (String rid : roles.getItemIds()) {
Role rr = roles.getItem(rid).getBean();
members.addAll(rr.getMembers().values());
members.addBean(rr.getAccountInfo());
}
members.removeItem(roleId);
memberSelect.setContainerDataSource(members);
for (String rid : role.getBean().getMembers().keySet()) {
memberSelect.select(rid);
}
}
public void buttonClick(ClickEvent event) {
String roleId = (String) rolesTab.getValue();
BeanItem<Role> role = roles.getItem(roleId);
if (role == null)
return;
DBCollection db = V7CR.getInstance().getDBCollection("roles");
Role r = Roles.load(db, roleId);
Collection<?> selected = (Collection<?>) memberSelect.getValue();
DBObject o = new BasicDBObject(r.getBSONObject());
List<BSONObject> members = new ArrayList<BSONObject>();
for (Object s : selected) {
BeanItem<AccountInfo> biai = (BeanItem<AccountInfo>) memberSelect
.getContainerDataSource().getItem(s);
members.add(biai.getBean().getBSONObject());
}
o.put("member", members);
db.save(o);
}
}