This repository has been archived on 2024-04-22. You can view files and clone it, but cannot push or open issues or pull requests.
SecureUML-GUI/src/ch/ethz/infsec/secureumlgui/gui/SecureUmlComponent.java

423 lines
14 KiB
Java

/**
*
*/
package ch.ethz.infsec.secureumlgui.gui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.TableColumn;
import org.apache.log4j.Logger;
import org.argouml.uml.diagram.ui.UMLDiagram;
import org.omg.uml.foundation.core.UmlClass;
import ch.ethz.infsec.secureumlgui.ModuleController;
import ch.ethz.infsec.secureumlgui.ResourceFilesManager;
import ch.ethz.infsec.secureumlgui.modelmapping.permissions.ActionPermissionSet;
import ch.ethz.infsec.secureumlgui.modelmapping.permissions.HierarchicalPolicyExplorer;
import ch.ethz.infsec.secureumlgui.wrapper.ActionWrapper;
import ch.ethz.infsec.secureumlgui.wrapper.AtomicActionWrapper;
import ch.ethz.infsec.secureumlgui.wrapper.CompositeActionWrapper;
import ch.ethz.infsec.secureumlgui.wrapper.PolicyWrapper;
import ch.ethz.infsec.secureumlgui.securemodel.dialects.metamodel.ResourceType;
import ch.ethz.infsec.secureumlgui.wrapper.ResourceWrapper;
/**
* generic SecureUML properties component for Resources.
*
* Displays which roles have which permissions for which actions on this resource.
* distinguishes between explicit, implicit, and inherited permissions.
*
*/
public class SecureUmlComponent
extends AbstractSecureUmlComponent
//implements MouseListener
implements ChangeListener
{
/**
*
*/
public SecureUmlComponent()
{
super();
initComponents();
}
private String NEW_ROLE_NAME = "NewRole";
private JTabbedPane tabPane;
//private Map<String, PolicyWrapper> polices;
//private List<PolicyWrapper> policies = new ArrayList<PolicyWrapper>();
private List<UmlClass> policies = new ArrayList<UmlClass>();
private List<JTable> tables = new ArrayList<JTable>();
private PolicyLevelCreator policyCreator;
// private JScrollPane jScrollPane;
// private JTable tblPermissions;
private TableSorter tableSorter;
private JTextField txName;
private JLabel lbType;
private JLabel lbName;
private ResourceWrapper displayedResourceWrapper = null;
private GenericResourcePermissionsTableModel tableModel;
private static Logger aLog = Logger.getLogger(SecureUmlComponent.class);
public void initComponents()
{
JButton btNewRole = new JButton("New Role");
btNewRole.setToolTipText("New Role");
btNewRole.addActionListener(new createRoleActionListener());
try
{ //SecureUmlComponent.class
ResourceFilesManager resourceFilesManager =
new ResourceFilesManager();
ImageIcon icon = resourceFilesManager.getCreateRoleIcon();
if (icon != null)
{
btNewRole.setIcon(icon);
}
else
{
logger.warn(logger.STARTUP,
"Image File for Button 'New Role' " +
"not found - showing Text only");
}
}
catch (Exception e)
{
logger.logException(e);
}
/* NOTE: If a JTable is put on a JScrollPane, the Header
* is displayed automatically (otherwise this needs to be
* done manually). The Column Names are fetched from the
* Method 'TableModel.getColumnName(int col)'
*/
// tblPermissions = new JTable();
// tblPermissions.setColumnSelectionAllowed(false);
// tblPermissions.setDragEnabled(false);
tableSorter = new TableSorter();
//tblPermissions.getTableHeader().setSize(200, 50);
tabPane = new JTabbedPane(SwingConstants.LEFT);
tabPane.addChangeListener(this);
//JScrollPane jScrollPane = new JScrollPane(tblPermissions);
tabPane.add("Create Policy", policyCreator);
// int dummyPol = 4;
// policies = new PolicyWrapper[dummyPol+1];
// for ( int i = 0 ; i < dummyPol; ++i ) {
// tabPane.add("policy Name " + i, new JScrollPane(tblPermissions) );
// policies[i+1] = null;
// }
policyCreator = new PolicyLevelCreator();
// tblPermissions.setFillsViewportHeight(true);
lbName=new JLabel("SecureUML Resource:");
txName= new JTextField();
txName.setEditable(false);
lbType = new JLabel("unknown Resource");
JPanel topPane = new JPanel();
JPanel labels = new JPanel();
labels.add(lbName,BorderLayout.LINE_START);
labels.add(lbType,BorderLayout.LINE_START);
labels.add(txName,BorderLayout.LINE_START);
topPane.add(labels,BorderLayout.LINE_START);
topPane.add(btNewRole,BorderLayout.CENTER);
this.add(topPane,BorderLayout.PAGE_START);
//this.add(jScrollPane,BorderLayout.CENTER);
this.add(tabPane,BorderLayout.CENTER);
}
//protected void setDisplayedResourceWrapper(AbstractPermissionsTableModel tableModel)
protected void setDisplayedResourceWrapper()
{
int selectedTab = tabPane.getSelectedIndex();
if ( selectedTab < 0 || selectedTab >= policies.size()) {
//no policies, create Policy is selected
return;
}
//PolicyWrapper currentPolicy = policies.get(selectedTab); //policies[tabPane.getSelectedIndex()];
UmlClass currentPolicy = policies.get(selectedTab); //policies[tabPane.getSelectedIndex()];
JTable tblPermissions = tables.get(selectedTab);
txName.setText(displayedResourceWrapper.getResourcePath());
aLog.debug("setDisplayedResourceWrapper tab: " + selectedTab + " policy: " + currentPolicy.getName());
try
{
//tblPermissions.setModel(tableModel);
tableSorter.setTableModel(tableModel);
tblPermissions.setModel(tableSorter);
tableSorter.setTableHeader(tblPermissions.getTableHeader());
tblPermissions.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
//tblPermissions.setAutoResizeMode(
// JTable.AUTO_RESIZE_OFF);
tblPermissions.setCellSelectionEnabled(true);
tblPermissions.setColumnSelectionAllowed(false);
tblPermissions.setRowSelectionAllowed(false);
initTableCellDimensions(tblPermissions);
// tblPermissions.getColumnModel().getColumn(0).
// setCellRenderer(
// new ActionNameTableCellRenderer());
// tblPermissions.getColumnModel().getColumn(1).
// setCellRenderer(
// new ActionPermissionTableCellRenderer());
tblPermissions.setDefaultRenderer(
ActionPermissionSet.class,
new ActionPermissionTableCellRenderer(currentPolicy));
tblPermissions.setDefaultEditor(
ActionPermissionSet.class,
new ActionPermissionTableCellRenderer(currentPolicy));
tblPermissions.setDefaultRenderer(
ActionWrapper.class,
new ActionNameTableCellRenderer());
tblPermissions.setDefaultEditor(
ActionWrapper.class,
new ActionNameTableCellRenderer());
tblPermissions.setDefaultRenderer(
AtomicActionWrapper.class,
new ActionNameTableCellRenderer());
tblPermissions.setDefaultRenderer(
CompositeActionWrapper.class,
new ActionNameTableCellRenderer());
tblPermissions.getColumnModel().
getColumn(0).setCellRenderer(
new ActionNameTableCellRenderer());
//(new ActionPermissionTableCellRenderer()).addCellEditorListener(l)
//tblPermissions.addMouseListener(l);
tblPermissions.getTableHeader().
setToolTipText("SecureUML Roles");
// logger.info("tableCellRenderer(1,0): "
// + tblPermissions.getCellRenderer(1, 0));
//
// int columnCount = tableModel.getColumnCount();
//
tableModel.fireManually();
tblPermissions.getTableHeader().addMouseListener(tableModel);
// tblPermissions.repaint();
// tblPermissions.setValueAt(tblPermissions.getValueAt(1, 0),1,0);
//
// throws NullpointerException only when a first
// UML Element is selected
//jScrollPane.getColumnHeader().setVisible(true);
}
catch (Exception e)
{
logger.logException(e);
}
}
/**
*
*/
private void initTableCellDimensions(JTable tblPermissions)
{
// hack
tblPermissions.setRowHeight(26);
tblPermissions.getColumnModel().getColumn(0).setMaxWidth(52);
for (Enumeration<TableColumn> cols = tblPermissions.getColumnModel().getColumns(); cols.hasMoreElements();)
{
TableColumn col = (TableColumn) cols.nextElement();
col.setMinWidth(525);
}
}
private class createRoleActionListener implements ActionListener
{
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e)
{
ModuleController.getInstance().addRole(
NEW_ROLE_NAME,
displayedResourceWrapper);
}
}
private void updatePolicyTabs () {
aLog.debug("updatePolicyTabs");
boolean rebuild = false;
//List<PolicyWrapper> sortedPolicies = HierarchicalPolicyExplorer.getInstance().getSortedPolicies();
List<UmlClass> sortedPolicies = HierarchicalPolicyExplorer.getInstance().getSortedPolicies();
int policiesCount = 0;
int tabCount = tabPane.getTabCount();
if ( sortedPolicies != null ) {
policiesCount = sortedPolicies.size();
}
if ( tabPane.getTabCount()-1 != policiesCount ) {
rebuild = true;
} else {
for (int i = 0; i < policiesCount && i < tabCount; ++i) {
if ( ! sortedPolicies.get(i).getName().equals(tabPane.getTitleAt(i))) {
rebuild = true;
break;
}
}
}
aLog.debug("updatePolicyTabs: tabCount: " + tabCount+ ", policiesCount: " + policiesCount + " rebuild: " + rebuild);
if ( rebuild ) {
for ( int i = 0; i < policiesCount && i < tabCount - 1; ++i) {
tabPane.setTitleAt(i, sortedPolicies.get(i).getName());
policies.set(i, sortedPolicies.get(i));
aLog.debug("set permissonPanel at index " + i +" for policy " + sortedPolicies.get(i).getName());
}
if ( policiesCount > (tabCount - 1)) {
//remove (the last) create policy tab
tabPane.remove(tabCount - 1);
//for (int i = policiesCount; i < (tabCount - 1); ++i) {
for (int i = tabCount - 1; i < policiesCount; ++i) {
JTable tblPermissions;
if (tables.size() > i && tables.get(i) != null) {
tblPermissions = tables.get(i);
} else {
tblPermissions = new JTable();
tblPermissions.setColumnSelectionAllowed(false);
tblPermissions.setDragEnabled(false);
}
JScrollPane jScrollPane = new JScrollPane(tblPermissions);
tabPane.add(sortedPolicies.get(i).getName(), jScrollPane);
policies.add(i, sortedPolicies.get(i)); //#
tables.add(i, tblPermissions);
aLog.debug("added permissonPanel at index " + i +" for policy " + sortedPolicies.get(i).getName());
}
tabPane.add("Create Policy", policyCreator);
} else if ( policiesCount < (tabCount - 1) ) {
for (int i = policiesCount; i < (tabCount - 1); ++i) {
tabPane.remove(i);
policies.remove(i);
aLog.debug("removed permission panel from index " + i);
}
}
aLog.debug("updatePolicyTabs: done");
}
// if ( sortedPolicies != null) {
// policies = new PolicyWrapper[sortedPolicies.size()];
// for (int i = 0 ; i < sortedPolicies.size(); ++i) {
// tabPane.add(sortedPolicies.get(i).getName(), new JScrollPane(tblPermissions));
// policies[i] = sortedPolicies.get(i);
// }
// }
}
public void setDisplayedSecureUmlElement(
Object suElement, ResourceType rt)
{
aLog.debug("setDisplayedSecureUmlElement");
updatePolicyTabs();
super.setDisplayedSecureUmlElement(suElement, rt);
lbType.setText(rt.getName());
this.displayedResourceWrapper = new ResourceWrapper(suElement);
this.tableModel = new GenericResourcePermissionsTableModel(displayedResourceWrapper);
//setDisplayedResourceWrapper(tableModel);
setDisplayedResourceWrapper();
}
public void stateChanged(ChangeEvent arg0) {
if (tableModel != null) {
setDisplayedResourceWrapper();
}
}
}