blob: dcecf6135e1c1cc4ade86bf3e5ee97bba90d011f [file] [log] [blame]
/*
* Copyright (c) 2013-2014, JoshuaTree Software. All rights reserved.
*/
package us.jts.commander.panel;
import com.inmethod.grid.IGridColumn;
import com.inmethod.grid.SizeUnit;
import com.inmethod.grid.column.PropertyColumn;
import com.inmethod.grid.treegrid.TreeGrid;
import org.apache.log4j.Logger;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxCallListener;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.form.FormComponentPanel;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import us.jts.commander.GlobalIds;
import us.jts.commander.GlobalUtils;
import us.jts.commander.PermListModel;
import us.jts.commander.SaveModelEvent;
import us.jts.commander.SecureIndicatingAjaxButton;
import us.jts.commander.SecureIndicatingAjaxLink;
import us.jts.commander.SelectModelEvent;
import us.jts.fortress.rbac.FortEntity;
import us.jts.fortress.rbac.PermObj;
import us.jts.fortress.rbac.Permission;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.Model;
import us.jts.fortress.util.attr.VUtil;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
*
* @author Shawn McKinney
* @version $Rev$
*/
public class PermListPanel extends FormComponentPanel
{
private static final Logger log = Logger.getLogger(PermListPanel.class.getName());
private Form listForm;
private DefaultTreeModel treeModel;
private DefaultMutableTreeNode node;
private TreeGrid<DefaultTreeModel, DefaultMutableTreeNode, String> grid;
private DefaultMutableTreeNode rootNode;
private String permOperation;
private String permObject;
private TextField permObjectFld;
private boolean isAdmin;
public PermListPanel(String id, final boolean isAdmin)
{
super(id);
this.isAdmin = isAdmin;
PermListModel permListModel = new PermListModel(new Permission("", ""), isAdmin, GlobalUtils.getRbacSession(
this ));
setDefaultModel(permListModel);
List<IGridColumn<DefaultTreeModel, DefaultMutableTreeNode, String>> columns =
new ArrayList<IGridColumn<DefaultTreeModel, DefaultMutableTreeNode, String>>();
PropertyColumn objectName = new PropertyColumn(new Model("Object Name"), "userObject.ObjectName");
objectName.setInitialSize( 250 );
columns.add(objectName);
columns.add(new PropertyColumn(new Model("Object Id"), "userObject.ObjectId"));
columns.add(new PropertyColumn(new Model("Operation Name"), "userObject.OpName"));
String roleAssignLabel;
if(isAdmin)
{
roleAssignLabel = "Admin Role Assignments";
}
else
{
roleAssignLabel = "RBAC Role Assignments";
}
PropertyColumn roles = new PropertyColumn(new Model(roleAssignLabel), "userObject.Roles");
roles.setInitialSize(500);
columns.add(roles);
PropertyColumn abstractPermName = new PropertyColumn(new Model("Abstract Perm Name"), "userObject.AbstractName");
abstractPermName.setInitialSize( 300 );
columns.add(abstractPermName);
List<Permission> perms = (List<Permission>) getDefaultModel().getObject();
treeModel = createTreeModel(perms);
grid = new TreeGrid<DefaultTreeModel, DefaultMutableTreeNode, String>("permtreegrid", treeModel, columns)
{
@Override
public void selectItem(IModel itemModel, boolean selected)
{
node = (DefaultMutableTreeNode) itemModel.getObject();
if(!node.isRoot())
{
Permission perm = (Permission) node.getUserObject();
log.debug("TreeGrid.addGrid.selectItem selected perm objNm: " + perm.getObjectName() + " opNm: " + perm.getOpName());
if (super.isItemSelected(itemModel))
{
log.debug("TreeGrid.addGrid.selectItem item is selected");
super.selectItem(itemModel, false);
}
else
{
super.selectItem(itemModel, true);
SelectModelEvent.send(getPage(), this, perm);
}
}
}
};
grid.setContentHeight(50, SizeUnit.EM);
grid.setAllowSelectMultiple(false);
grid.setClickRowToSelect(true);
grid.setClickRowToDeselect(false);
grid.setSelectToEdit(false);
// expand the root node
grid.getTreeState().expandNode((TreeNode) treeModel.getRoot());
this.listForm = new Form("form");
this.listForm.add(grid);
grid.setOutputMarkupId(true);
add(this.listForm);
permObjectFld = new TextField("permObject", new PropertyModel<String>(this, "permObject"));
permObjectFld.setOutputMarkupId( true );
AjaxFormComponentUpdatingBehavior ajaxUpdater = new AjaxFormComponentUpdatingBehavior(GlobalIds.ONBLUR)
{
@Override
protected void onUpdate(final AjaxRequestTarget target)
{
target.add( permObjectFld );
}
};
permObjectFld.add( ajaxUpdater );
this.listForm.add(permObjectFld);
TextField permOperationFld = new TextField("permOperation", new PropertyModel<String>(this, "permOperation"));
this.listForm.add(permOperationFld);
addObjectSearchModal();
this.listForm.add( new SecureIndicatingAjaxButton( GlobalIds.SEARCH, GlobalIds.REVIEW_MGR, GlobalIds.FIND_PERMISSIONS )
{
@Override
protected void onSubmit( AjaxRequestTarget target, Form form )
{
log.debug( ".search onSubmit" );
info( "Searching Perms..." );
if ( !VUtil.isNotNullOrEmpty( permObject ) )
{
permObject = "";
}
if ( !VUtil.isNotNullOrEmpty( permOperation ) )
{
permOperation = "";
}
Permission srchPerm = new Permission( permObject, permOperation );
setDefaultModel( new PermListModel( srchPerm, isAdmin, GlobalUtils.getRbacSession( this ) ) );
treeModel.reload();
rootNode.removeAllChildren();
List<Permission> perms = ( List<Permission> ) getDefaultModelObject();
if ( VUtil.isNotNullOrEmpty( perms ) )
{
for ( Permission perm : perms )
rootNode.add( new DefaultMutableTreeNode( perm ) );
info( "Search returned " + perms.size() + " matching objects" );
}
else
{
info( "No matching objects found" );
}
target.add( grid );
}
@Override
public void onError( AjaxRequestTarget target, Form form )
{
log.warn( ".search.onError" );
target.add();
}
@Override
protected void updateAjaxAttributes( AjaxRequestAttributes attributes )
{
super.updateAjaxAttributes( attributes );
AjaxCallListener ajaxCallListener = new AjaxCallListener()
{
@Override
public CharSequence getFailureHandler( Component component )
{
return GlobalIds.WINDOW_LOCATION_REPLACE_COMMANDER_HOME_HTML;
}
};
attributes.getAjaxCallListeners().add( ajaxCallListener );
}
} );
}
private void addObjectSearchModal()
{
final ModalWindow objectsModalWindow;
listForm.add( objectsModalWindow = new ModalWindow( "objectsearchmodal" ) );
final ObjectSearchModalPanel objectSearchModalPanel = new ObjectSearchModalPanel( objectsModalWindow.getContentId(), objectsModalWindow, isAdmin );
objectsModalWindow.setContent( objectSearchModalPanel );
objectsModalWindow.setWindowClosedCallback( new ModalWindow.WindowClosedCallback()
{
@Override
public void onClose( AjaxRequestTarget target )
{
PermObj permObj = objectSearchModalPanel.getSelection();
if ( permObj != null )
{
permObject = permObj.getObjectName();
target.add( permObjectFld );
}
}
} );
listForm.add( new SecureIndicatingAjaxLink( "objectAssignLinkLbl", GlobalIds.REVIEW_MGR, "findPermObjs" )
{
public void onClick( AjaxRequestTarget target )
{
String msg = "clicked on object search";
msg += "objectSelection: " + permObject;
objectSearchModalPanel.setSearchVal( permObject );
objectSearchModalPanel.setAdmin( isAdmin );
log.debug( msg );
target.prependJavaScript( GlobalIds.WICKET_WINDOW_UNLOAD_CONFIRMATION_FALSE );
objectsModalWindow.show( target );
}
@Override
protected void updateAjaxAttributes( AjaxRequestAttributes attributes )
{
super.updateAjaxAttributes( attributes );
AjaxCallListener ajaxCallListener = new AjaxCallListener()
{
@Override
public CharSequence getFailureHandler( Component component )
{
return GlobalIds.WINDOW_LOCATION_REPLACE_COMMANDER_HOME_HTML;
}
};
attributes.getAjaxCallListeners().add( ajaxCallListener );
}
} );
String modalLabel;
if(isAdmin)
{
modalLabel = "Admin Permission Object Search Modal";
}
else
{
modalLabel = "RBAC Permission Object Search Modal";
}
objectsModalWindow.setTitle( modalLabel );
objectsModalWindow.setInitialWidth( 700 );
objectsModalWindow.setInitialHeight( 450 );
objectsModalWindow.setCookieName( "objects-modal" );
}
@Override
public void onEvent(IEvent event)
{
if (event.getPayload() instanceof SaveModelEvent)
{
SaveModelEvent modelEvent = (SaveModelEvent) event.getPayload();
switch(modelEvent.getOperation())
{
case ADD:
add(modelEvent.getEntity());
break;
case UPDATE:
/*
grid.markItemDirty(itemThatHasChanged);
grid.update();
*/
modelChanged();
break;
case DELETE:
prune();
break;
case SEARCH:
setDefaultModel(new PermListModel((Permission) modelEvent.getEntity(), isAdmin, GlobalUtils.getRbacSession( this )));
treeModel.reload();
rootNode.removeAllChildren();
for (Permission perm : (List<Permission>) getDefaultModelObject())
rootNode.add(new DefaultMutableTreeNode(perm));
break;
default:
break;
}
AjaxRequestTarget target = ((SaveModelEvent) event.getPayload()).getAjaxRequestTarget();
target.add(grid);
log.debug(".onEvent SaveModelEvent: " + target.toString());
}
}
private void removeSelectedItems(TreeGrid<DefaultTreeModel, DefaultMutableTreeNode, String> grid)
{
Collection<IModel<DefaultMutableTreeNode>> selected = grid.getSelectedItems();
for (IModel<DefaultMutableTreeNode> model : selected)
{
DefaultMutableTreeNode node = model.getObject();
treeModel.removeNodeFromParent(node);
Permission perm = (Permission) node.getUserObject();
log.debug(".removeSelectedItems perm objNm: " + perm.getObjectName() + " opNm: " + perm.getOpName());
List<Permission> perms = ((List<Permission>) getDefaultModel().getObject());
perms.remove(perm);
}
}
private DefaultTreeModel createTreeModel(List<Permission> perms)
{
DefaultTreeModel model;
//Permission root = new Permission("Perms");
Permission root = new Permission();
rootNode = new DefaultMutableTreeNode(root);
model = new DefaultTreeModel(rootNode);
if (perms == null)
log.debug(".createTreeModel no Perms found");
else
{
log.debug(".createTreeModel Perms found:" + perms.size());
for (Permission perm : perms)
rootNode.add(new DefaultMutableTreeNode(perm));
}
return model;
}
public void add(FortEntity entity)
{
if (getDefaultModelObject() != null)
{
List<Permission> perms = ((List<Permission>) getDefaultModelObject());
perms.add((Permission) entity);
treeModel.insertNodeInto(new DefaultMutableTreeNode(entity), rootNode, perms.size());
}
}
public void prune()
{
removeSelectedItems(grid);
}
}