/** * */ package org.js.model.adaptation.ui; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jwt.meta.model.core.Model; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.feature.model.utilities.WorkbenchUtil; import org.js.graph.transform.stagemodel.Stage; import org.js.graph.transform.stagemodel.StageModel; import org.js.graph.transform.stagemodel.StageModelLabelProvider; import org.js.model.rbac.AccessControlModel; import org.js.model.rbac.Group; import org.js.model.rbac.Role; import org.js.model.rbac.edit.RBACLabelProvider; import org.js.model.workflow.util.AccessControlModelUtil; import org.js.model.workflow.util.StageModelUtil; import org.js.model.workflow.util.WorkflowUtil; /** * @author Julia * */ public class AddRoleDialog extends MessageDialog { private Text stakeholderName; private Text stakeholderId; // private Combo stakeholderTypeCombo; // private Combo stakeholderGroupCombo; private AccessControlModel accessControlModel; private StageModel stageModel; private UserInputAddRole roleInput; private ComboViewer stakeholderType; private Label msg; private ComboViewer stakeholderGroup; public AddRoleDialog() { super(WorkbenchUtil.getShell(), "Add Stakeholder", null, "Add a Stakeholder", MessageDialog.CONFIRM, new String[] { "Ok", "Cancel" }, 0); } @Override protected Control createCustomArea(Composite parent) { Composite composite = parent; Label dummy = new Label(composite, SWT.NONE); dummy.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); msg = new Label(composite, SWT.NONE); msg.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); Display display = getShell().getDisplay(); msg.setForeground(new Color(display, 250, 0, 0)); msg.setText(""); Label lblNewLabel = new Label(composite, SWT.NONE); lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); lblNewLabel.setText("Name"); stakeholderName = new Text(composite, SWT.BORDER); stakeholderName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblIdLabel = new Label(composite, SWT.NONE); lblIdLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); lblIdLabel.setText("Id"); stakeholderId = new Text(composite, SWT.BORDER); stakeholderId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblNewLabel_1 = new Label(composite, SWT.NONE); lblNewLabel_1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); lblNewLabel_1.setText("Stage"); stakeholderType = new ComboViewer(composite, SWT.READ_ONLY); stakeholderType.setLabelProvider(new StageModelLabelProvider()); stakeholderType.setContentProvider(new DialogContentProvider()); stakeholderType.addFilter(new StageInputFilter(accessControlModel)); Combo stakeholderTypeCombo = stakeholderType.getCombo(); stakeholderTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); stakeholderType.setInput(stageModel); Label stakeholerGroupComboLabel = new Label(composite, SWT.NONE); stakeholerGroupComboLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); stakeholerGroupComboLabel.setText("Role Owner"); stakeholderGroup = new ComboViewer(composite, SWT.READ_ONLY); stakeholderGroup.setLabelProvider(new RBACLabelProvider()); stakeholderGroup.setContentProvider(new DialogContentProvider()); Combo stakeholderGroupCombo = stakeholderGroup.getCombo(); stakeholderGroupCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); stakeholderGroup.setInput(new RoleInput()); // stakeholderGroupCombo = new Combo(composite, SWT.READ_ONLY); // stakeholderGroupCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); // new Label(composite, SWT.NONE); // // Composite composite_1 = new Composite(composite, SWT.NONE); // composite_1.setLayout(new RowLayout(SWT.HORIZONTAL)); // composite_1.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); addComboSelectionListener(); return composite; } private void addComboSelectionListener() { stakeholderName.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String name = stakeholderName.getText(); roleInput.setRoleName(name); validateInput(); } }); stakeholderId.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String id = stakeholderId.getText(); roleInput.setRoleId(id); validateInput(); } }); stakeholderType.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (selection instanceof StructuredSelection) { StructuredSelection structSelection = (StructuredSelection) selection; Object element = structSelection.getFirstElement(); if (element instanceof Stage) { Stage stage = (Stage) element; Role abstractParentRole = AccessControlModelUtil.getCorrespondingAbstractRole(stage, accessControlModel); roleInput.setAbstractParentRole(abstractParentRole); } } setOwnerInput(); validateInput(); } }); stakeholderGroup.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (selection instanceof StructuredSelection) { StructuredSelection structSelection = (StructuredSelection) selection; Object element = structSelection.getFirstElement(); if (element instanceof Role) { Role stakeholder = (Role) element; roleInput.setGroupOwner(stakeholder); } } validateInput(); } }); } private void validateInput() { String roleId = roleInput.getRoleId(); Role owner = roleInput.getGroupOwner(); Role abstractRole = roleInput.getAbstractParentRole(); String message = validateRoleId(roleId); if (message.isEmpty()) { message = validateAbstractRole(abstractRole); } if (message.isEmpty()) { message = validateOwnerRole(owner, abstractRole); } msg.setText(message); msg.pack(); setOkButtonEnabled(); } private String validateOwnerRole(Role owner, Role abstractRole) { String message = ""; if (owner == null) { Stage stage = StageModelUtil.getStageForId(abstractRole.getId(), stageModel); if (!StageModelUtil.isFirstStage(stage)) { message = "Specify role owner"; } } return message; } private String validateAbstractRole(Role abstractRole) { String message = ""; if (abstractRole == null) { message = "Select a stage."; } return message; } private String validateRoleId(String roleId) { String message = ""; // role Id must not be null or empty if (roleId != null && !roleId.isEmpty()) { // role Id must not contain whitespace for (char c : roleId.toCharArray()) { if (c == ' ') { message = "Role id must not contain whitespace."; break; } } if (message.isEmpty()) { // role Id must be unique EList<Role> roles = accessControlModel.getRoles(); for (Role role : roles) { String existingRoleId = role.getId(); if (existingRoleId.equals(roleId)) { message = "Role id is already used."; break; } } } } else { message = "Specify role id."; } return message; } private void setOkButtonEnabled() { boolean enabled = msg.getText() == ""; Button okButton = getButton(IDialogConstants.OK_ID); okButton.setEnabled(enabled); } public void setWorkflow(Model workflowModel) { accessControlModel = WorkflowUtil.getAccessControlModel(workflowModel); stageModel = WorkflowUtil.getStageModel(workflowModel); } public void setUserInput(UserInputAddRole roleInput) { this.roleInput = roleInput; } private void setOwnerInput() { RoleInput input = new RoleInput(); // find group owners that belong to the predecessor stage Role abstractRole = roleInput.getAbstractParentRole(); if (abstractRole != null) { Stage stage = StageModelUtil.getStageForId(abstractRole.getId(), stageModel); Stage predecessor = stage.getPredecessor(); if (predecessor != null) { Role parentRole = AccessControlModelUtil.getCorrespondingAbstractRole(predecessor, accessControlModel); EList<Group> groups = accessControlModel.getGroups(); for (Group group : groups) { Role owner = group.getOwner(); EList<Role> parentOwnerRoles = owner.getParentRoles(); if (parentOwnerRoles.contains(parentRole)) { input.addRole(owner); } } } } stakeholderGroup.setInput(input); roleInput.setGroupOwner(null); } }