package org.aperteworkflow.editor.ui.permission; import com.vaadin.ui.*; import org.aperteworkflow.editor.domain.Permission; import org.aperteworkflow.editor.vaadin.DataHandler; import org.aperteworkflow.util.vaadin.VaadinUtility; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import java.util.*; public class PermissionEditor extends VerticalLayout implements DataHandler { private PermissionProvider provider; private List<PrivilegeNameEditor> privilegeNameEditors; private TextField newPrivilegeNameField; private Button newPrivilegeNameButton; private HorizontalLayout newPrivilegeNameLayout; private Label descriptionLabel; public PermissionEditor() { privilegeNameEditors = new ArrayList<PrivilegeNameEditor>(); initComponent(); } private void initComponent() { I18NSource messages = I18NSource.ThreadUtil.getThreadI18nSource(); descriptionLabel = new Label(messages.getMessage("permission.editor.description")); newPrivilegeNameField = new TextField(); newPrivilegeNameField.setNullRepresentation(""); newPrivilegeNameButton = VaadinUtility.button( messages.getMessage("permission.editor.new.privilege"), new Runnable() { @Override public void run() { String privilegeName = (String) newPrivilegeNameField.getValue(); PermissionDefinition definition = new PermissionDefinition(privilegeName); if (getUsedPermissionDefinition().contains(definition)) { // this definition is already used return; } newPrivilegeNameField.setValue(null); addNewPrivilegeEditor(definition); } } ); newPrivilegeNameLayout = new HorizontalLayout(); newPrivilegeNameLayout.setSpacing(true); newPrivilegeNameLayout.addComponent(newPrivilegeNameField); newPrivilegeNameLayout.addComponent(newPrivilegeNameButton); setSpacing(true); } public PermissionProvider getProvider() { return provider; } public void setProvider(PermissionProvider provider) { this.provider = provider; } @Override public void loadData() { removeAllComponents(); privilegeNameEditors.clear(); addComponent(descriptionLabel); if (provider.isNewPermissionDefinitionAllowed()) { addComponent(newPrivilegeNameLayout); } for (PermissionDefinition definition : getUniqueProvidedPermissionDefinitions()) { addNewPrivilegeEditor(definition); } } private void addNewPrivilegeEditor(PermissionDefinition definition) { PrivilegeNameEditor editor = new PrivilegeNameEditor(definition); editor.setProvider(new PrivilegeNamePermissionProvider(definition.getKey(), provider)); editor.loadData(); addComponent(editor); privilegeNameEditors.add(editor); } private List<PermissionDefinition> getUsedPermissionDefinition() { List<PermissionDefinition> list = new ArrayList<PermissionDefinition>(); Iterator<Component> it = getComponentIterator(); while (it.hasNext()) { Component c = it.next(); if (c instanceof PrivilegeNameEditor) { PrivilegeNameEditor editor = (PrivilegeNameEditor) c; list.add(editor.getPermissionDefinition()); } } Collections.sort(list); return list; } private Set<PermissionDefinition> getUniqueProvidedPermissionDefinitions() { // use set to get unique permission definitions Set<PermissionDefinition> set = new TreeSet<PermissionDefinition>(); // first add the definitions, they are more important if (provider.getPermissionDefinitions() != null) { set.addAll(provider.getPermissionDefinitions()); } // now add all the definitions that are provided by the actual permissions // if a definition exists it is not replaced by new object if (provider.getPermissions() != null) { for (Permission permission : provider.getPermissions()) { set.add(new PermissionDefinition(permission)); } } return set; } @Override public void saveData() { // do nothing } @Override public Collection<String> validateData() { return null; } public List<Permission> getPermissions() { List<Permission> list = new ArrayList<Permission>(); for (PrivilegeNameEditor privilegeNameEditor : privilegeNameEditors) { list.addAll(privilegeNameEditor.getPermissions()); } return list; } }