This repository has been archived on 2018-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
SecureBPMN/designer/src/org.activiti.designer.gui/src/main/java/org/activiti/designer/security/property/PropertyRbacSection.java

540 lines
17 KiB
Java

/* Copyright 2012-2015 SAP SE
*
* 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 org.activiti.designer.security.property;
import java.util.List;
import java.util.UUID;
import org.activiti.designer.util.eclipse.ActivitiUiUtil;
import org.activiti.designer.util.property.ActivitiPropertySection;
import org.eclipse.bpmn2.Activity;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.ui.editor.DiagramEditor;
import org.eclipse.securebpmn2.Action;
import org.eclipse.securebpmn2.ActivityAction;
import org.eclipse.securebpmn2.Permission;
import org.eclipse.securebpmn2.Role;
import org.eclipse.securebpmn2.Securebpmn2Factory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import eu.aniketos.securebpmn.util.SecurityUtil;
/**
*
*/
public class PropertyRbacSection extends ActivitiPropertySection implements ITabbedPropertyConstants {
private CCombo actionCombo;
private CCombo roleCombo;
private String[] titles = {" ","PermissionId","Permission Name", "Action", "Roles"};
private SelectionListener selectionListener;
private Button addButton;
private Button removeButton;
private Table table;
private Composite buttonBox;
private int checkCount=0;
@Override
public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
super.createControls(parent, tabbedPropertySheetPage);
TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
Composite composite = factory.createFlatFormComposite(parent);
FormData data;
actionCombo = factory.createCCombo(composite, SWT.NONE);
List<Action> actionList=SecurityUtil.getActivityActions();
for (int i = 0; i < actionList.size(); i++) {
actionCombo.add(actionList.get(i).getActionName());
}
data = new FormData();
data.left = new FormAttachment(0, 120);
data.right = new FormAttachment(80, 0);
data.top = new FormAttachment(0, VSPACE);
actionCombo.setLayoutData(data);
actionCombo.addFocusListener(listener);
CLabel actionLabel = factory.createCLabel(composite, "Action :"); //$NON-NLS-1$
data = new FormData();
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(actionCombo, -HSPACE);
data.top = new FormAttachment(actionCombo, 0, SWT.CENTER);
actionLabel.setLayoutData(data);
roleCombo = factory.createCCombo(composite, SWT.NONE);
data = new FormData();
data.left = new FormAttachment(0, 120);
data.right = new FormAttachment(80, 0);
data.top = new FormAttachment(actionCombo, VSPACE);
roleCombo.setLayoutData(data);
roleCombo.addFocusListener(listener);
CLabel roleLabel = factory.createCLabel(composite, "Role :"); //$NON-NLS-1$
data = new FormData();
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(roleCombo, -HSPACE);
data.top = new FormAttachment(roleCombo, 0, SWT.CENTER);
roleLabel.setLayoutData(data);
CLabel tableLabel = factory.createCLabel(composite, "Permissions :"); //$NON-NLS-1$
data = new FormData();
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(0, 100);
data.top = new FormAttachment(roleCombo, VSPACE);
tableLabel.setLayoutData(data);
data = new FormData(200,170);
data.left = new FormAttachment(tableLabel, 10);
data.right = new FormAttachment(80, 0);
data.top = new FormAttachment(roleCombo, VSPACE);
table = new Table (composite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
table.setLayoutData(data);
//Layout layout=table.getLayout();
table.setLinesVisible (true);
table.setHeaderVisible (true);
/*GridData griddata = new GridData(SWT.FILL, SWT.FILL, true, true);
layout. = 100;
table.setLayoutData(griddata);
//table.setLayout(layout);
*
*/
buttonBox = getButtonBoxControl(composite);
data = new FormData();
data.left = new FormAttachment(table, -HSPACE);
data.right = new FormAttachment(100, 0);
data.top = new FormAttachment(roleLabel, 0);
buttonBox.setLayoutData(data);
buttonBox.setVisible(true);
buttonBox.addFocusListener(listener);
for (int i=0; i<titles.length; i++) {
TableColumn column = new TableColumn (table, SWT.NONE);
column.setText (titles [i]);
column.setWidth(170);
}
table.getColumn(0).setWidth(30);
table.getColumn(1).setWidth(0);
/*int count = 128;
for (int i=0; i<count; i++) {
TableItem item = new TableItem (table, SWT.NONE);
item.setText (0, "");
item.setText (1, "this stuff behaves the way I expect");
item.setText (2, "almost everywhere");
item.setText (3, "some.folder");
}*/
/*for (int i=0; i<titles.length; i++) {
table.getColumn (i).pack ();
} */
table.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
String string = event.detail == SWT.CHECK ? "Checked" : "Selected";
// System.out.println (event.item + " " + string);
if(event.detail == SWT.CHECK){
TableItem item= (TableItem)event.item;
if(item.getChecked()==true){
checkCount++;
}
else{
checkCount--;
}
}
selectionChanged();
}
});
composite.pack ();
//composite.open ();
}
@Override
public void refresh() {
actionCombo.removeFocusListener(listener);
roleCombo.removeFocusListener(listener);
buttonBox.removeFocusListener(listener);
checkCount=0;
PictogramElement pe = getSelectedPictogramElement();
if (pe != null) {
Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pe);
if (bo == null)
return;
Activity activity = (Activity) bo;
displayPermissions(activity);
actionCombo.addFocusListener(listener);
roleCombo.addFocusListener(listener);
buttonBox.addFocusListener(listener);
roleCombo.removeAll();
List<Role> roleList=SecurityUtil.getRoles(getDiagram());
for (int i = 0; i < roleList.size(); i++) {
roleCombo.add(roleList.get(i).getName());
}
}
}
private FocusListener listener = new FocusListener() {
public void focusGained(final FocusEvent e) {
}
public void focusLost(final FocusEvent e) {
PictogramElement pe = getSelectedPictogramElement();
if (pe != null) {
Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pe);
if (bo instanceof Activity) {
DiagramEditor diagramEditor = (DiagramEditor) getDiagramEditor();
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(getSelectedPictogramElement());
if (bo == null) {
return;
}
Activity activity=(Activity) bo;
displayPermissions(activity);
}
}, editingDomain, "Model Update");
}
}
}
};
/**
* Helper method to create a push button.
*
* @param parent
* the parent control
* @param key
* the resource name used to supply the button's label text
* @return Button
*/
private Button createPushButton(Composite parent, String key) {
Button button = new Button(parent, SWT.PUSH);
button.setText(key);
button.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
/* int widthHint = convertHorizontalDLUsToPixels(button,
IDialogConstants.BUTTON_WIDTH);
data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
SWT.DEFAULT, true).x);*/
data.widthHint=40;
button.setLayoutData(data);
button.addSelectionListener(getSelectionListener());
return button;
}
/**
* Returns this field editor's selection listener. The listener is created
* if necessary.
*
* @return the selection listener
*/
private SelectionListener getSelectionListener() {
if (selectionListener == null) {
createSelectionListener();
}
return selectionListener;
}
/**
* Creates a selection listener.
*/
public void createSelectionListener() {
selectionListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
Widget widget = event.widget;
if (widget == addButton) {
addPressed();
} else if (widget == removeButton) {
removePressed();
}
else if (widget == table) {
selectionChanged();
}
}
};
}
/**
* Creates the Add, Remove, Up, and Down button in the given button box.
*
* @param box
* the box for the buttons
*/
private void createButtons(Composite box) {
box.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
addButton = createPushButton(box, "Add");
removeButton = createPushButton(box, "Remove");
}
/**
* Notifies that the Add button has been pressed.
*/
private void addPressed() {
if(actionCombo.getText()=="" || roleCombo.getText()==""){
return;
}
PictogramElement pe = getSelectedPictogramElement();
if (pe != null) {
Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pe);
if (bo instanceof Activity) {
DiagramEditor diagramEditor = (DiagramEditor) getDiagramEditor();
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(getSelectedPictogramElement());
if (bo == null) {
return;
}
else{
//get the selected action
Activity activity= (Activity)bo;
List<ActivityAction> availableActions =activity.getActivityActions();
ActivityAction selectedAction=null;
if(availableActions.size()!=0){
for (ActivityAction temp : availableActions) {
if(temp.getActionName()!=null){
if(temp.getActionName().equals(actionCombo.getText())){
selectedAction=temp;
break;
}
}
}
}
//selected action not available
if(selectedAction==null){
selectedAction = Securebpmn2Factory.eINSTANCE.createAtomicActivityAction();
selectedAction.setId(UUID.randomUUID().toString());
selectedAction.setActionName(actionCombo.getText());
getDiagram().eResource().getContents().add(selectedAction);
activity.getActivityActions().add(selectedAction);
Permission newPermission=Securebpmn2Factory.eINSTANCE.createPermission();
newPermission.setId(UUID.randomUUID().toString());
newPermission.setPName("Perm-"+activity.getId()+"-"+actionCombo.getText());
getDiagram().eResource().getContents().add(newPermission);
selectedAction.getPermissions().add(newPermission);
Role selectedRole=getSelectedRole(roleCombo.getText());
if(getDiagram().eResource().getContents().contains(selectedRole)==false)
getDiagram().eResource().getContents().add(selectedRole);
newPermission.getRoles().add(selectedRole);
}
//selected action is available
else{
//get the associated permission
Permission availablePermission = selectedAction.getPermissions().get(0);
//get the roles to check if the role is already associated
List<Role> availableRoles=availablePermission.getRoles();
Role targetRole=null;
for (Role temp : availableRoles) {
if(temp.getName().equals(roleCombo.getText())){
targetRole=temp;
break;
}
}
if(targetRole==null){
// add role selected to the permission
Role selectedRole=getSelectedRole(roleCombo.getText());
if(getDiagram().eResource().getContents().contains(selectedRole)==false)
getDiagram().eResource().getContents().add(selectedRole);
availablePermission.getRoles().add(selectedRole);
}
}
displayPermissions(activity);
}
}
}, editingDomain, "Model Update");
}
}
}
/**
* Notifies that the Remove button has been pressed.
*/
private void removePressed() {
PictogramElement pe = getSelectedPictogramElement();
if (pe != null) {
Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pe);
if (bo instanceof Activity) {
DiagramEditor diagramEditor = (DiagramEditor) getDiagramEditor();
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
Object bobj = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(getSelectedPictogramElement());
if (bobj == null) {
return;
}
else{
//get the selected action
Activity activity= (Activity)bobj;
List<ActivityAction> availableActions =activity.getActivityActions();
for(TableItem temp:table.getItems()){
if(temp.getChecked()){
for(ActivityAction aa:availableActions){
if(temp.getText(3).equals(aa.getActionName())){
aa.getPermissions().remove(0);
activity.getActivityActions().remove(aa);
break;
}
}
}
}
displayPermissions(activity);
}
}
}, editingDomain, "Model Update");
}
}
}
protected void selectionChanged() {
TableItem[] items = table.getSelection();
//int size = table.getItemCount();
//editButton.setEnabled(index >= 0);
removeButton.setEnabled(checkCount > 0);
// upButton.setEnabled(size > 1 && index > 0);
//downButton.setEnabled(size > 1 && index >= 0 && index < size - 1);
}
public Composite getButtonBoxControl(Composite parent) {
if (buttonBox == null) {
buttonBox = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
buttonBox.setLayout(layout);
createButtons(buttonBox);
buttonBox.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
addButton = null;
//editButton = null;
removeButton = null;
// upButton = null;
//downButton = null;
buttonBox = null;
}
});
} else {
//checkParent(buttonBox, parent);
}
selectionChanged();
return buttonBox;
}
private Role getSelectedRole(String roleName){
List<Role> roleList=SecurityUtil.getRoles(getDiagram());
Role role=null;
for (int i = 0; i < roleList.size(); i++) {
role=roleList.get(i);
if(role.getName().equals(roleName))
{
break;
}
}
return role;
}
private void displayPermissions(Activity activity){
table.removeAll();
Permission permission=null;
List<Role> roles=null;
List<ActivityAction> availableActions =activity.getActivityActions();
StringBuilder st=new StringBuilder();
for (ActivityAction temp : availableActions) {
if(temp!=null){
permission=temp.getPermissions().get(0);
roles=permission.getRoles();
for (int i = 0; i < roles.size(); i++) {
st.append(roles.get(i).getName());
if(i!=roles.size()-1)
{
st.append(",");
}
}
}
TableItem tableItem = new TableItem(table, SWT.NONE);
tableItem.setText(new String[] {"",permission.getId(),permission.getPName(),temp.getActionName(),st.toString()});
selectionChanged();
st.delete(0, st.length());
}
}
}