You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by sm...@apache.org on 2014/11/11 21:35:29 UTC

[19/27] directory-fortress-commander git commit: change package structure and names, pom improvements, license

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/panel/RoleSearchModalPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/panel/RoleSearchModalPanel.java b/src/main/java/org/apache/directory/fortress/web/panel/RoleSearchModalPanel.java
new file mode 100644
index 0000000..ad85a0f
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/panel/RoleSearchModalPanel.java
@@ -0,0 +1,211 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *   or more contributor license agreements.  See the NOTICE file
+ *   distributed with this work for additional information
+ *   regarding copyright ownership.  The ASF licenses this file
+ *   to you 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.apache.directory.fortress.web.panel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.PageableListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.directory.fortress.web.GlobalUtils;
+import org.apache.directory.fortress.core.DelReviewMgr;
+import org.apache.directory.fortress.core.ReviewMgr;
+import org.apache.directory.fortress.core.rbac.Role;
+import org.apache.directory.fortress.core.rbac.UserAdminRole;
+import org.apache.directory.fortress.core.rbac.UserRole;
+import org.apache.directory.fortress.core.util.time.CUtil;
+import org.apache.directory.fortress.core.util.time.Constraint;
+
+/**
+ *
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class RoleSearchModalPanel extends Panel
+{
+    @SpringBean
+    private ReviewMgr reviewMgr;
+    @SpringBean
+    private DelReviewMgr delReviewMgr;
+    private static final Logger LOG = Logger.getLogger(RoleSearchModalPanel.class.getName());
+    private ModalWindow window;
+    private Constraint roleSelection;
+    private String roleSearchVal;
+    private boolean isAdmin;
+
+    private boolean isParentSearch;
+    /**
+     * @param id
+     */
+    public RoleSearchModalPanel( String id, ModalWindow window, boolean isAdmin)
+    {
+        super( id );
+        this.window = window;
+        this.isAdmin = isAdmin;
+        this.delReviewMgr.setAdmin( GlobalUtils.getRbacSession( this ) );
+        loadPanel();
+    }
+
+    public void loadPanel()
+    {
+        LoadableDetachableModel requests = getListViewModel();
+        PageableListView roleView = createListView( requests );
+        add( roleView );
+        add( new AjaxPagingNavigator( "navigator", roleView ) );
+    }
+
+    private PageableListView createListView( final LoadableDetachableModel requests )
+    {
+        final PageableListView listView = new PageableListView( "dataview", requests, 16 )
+        {
+            @Override
+            protected void populateItem( final ListItem item )
+            {
+                final Constraint modelObject = ( Constraint ) item.getModelObject();
+                item.add( new AjaxLink<Void>( "select" )
+                {
+                    private static final long serialVersionUID = 1L;
+
+                    @Override
+                    public void onClick(AjaxRequestTarget target)
+                    {
+                        roleSelection = modelObject;
+                        window.close( target );
+                    }
+                } );
+                item.add( new Label( "name", new PropertyModel( item.getModel(), "name" ) ) );
+                item.add( new Label( "beginTime", new PropertyModel( item.getModel(), "beginTime" ) ) );
+                item.add( new Label( "endTime", new PropertyModel( item.getModel(), "endTime" ) ) );
+                item.add( new Label( "beginDate", new PropertyModel( item.getModel(), "beginDate" ) ) );
+                item.add( new Label( "endDate", new PropertyModel( item.getModel(), "endDate" ) ) );
+                item.add( new Label( "beginLockDate", new PropertyModel( item.getModel(), "beginLockDate" ) ) );
+                item.add( new Label( "endLockDate", new PropertyModel( item.getModel(), "endLockDate" ) ) );
+                item.add( new Label( "timeout", new PropertyModel( item.getModel(), "timeout" ) ) );
+                item.add( new Label( "dayMask", new PropertyModel( item.getModel(), "dayMask" ) ) );
+            }
+        };
+        return listView;
+    }
+
+    private LoadableDetachableModel getListViewModel()
+    {
+        final LoadableDetachableModel ret = new LoadableDetachableModel()
+        {
+            @Override
+            protected Object load()
+            {
+                List<?> roles = null;
+                try
+                {
+                    roleSelection = null;
+                    if(roleSearchVal == null)
+                        roleSearchVal = "";
+
+                    if(isParentSearch)
+                     {
+                         Role childRole = reviewMgr.readRole( new Role(roleSearchVal) );
+                         if(childRole != null)
+                         {
+                             List<Role> parentRoles = new ArrayList<Role>();
+                             for(String role : childRole.getParents() )
+                             {
+                                 Role parent = reviewMgr.readRole( new Role(role) );
+                                 parentRoles.add( parent );
+                             }
+                             roles = parentRoles;
+                         }
+                     }
+                     else if(isAdmin)
+                    {
+                        roles = delReviewMgr.findRoles( roleSearchVal );
+                    }
+
+                    else
+                        roles = reviewMgr.findRoles( roleSearchVal );
+                }
+                catch ( org.apache.directory.fortress.core.SecurityException se )
+                {
+                    String error = "loadPanel caught SecurityException=" + se;
+                    LOG.error( error );
+                }
+                return roles;
+            }
+        };
+        return ret;
+    }
+
+    public UserRole getRoleSelection()
+    {
+        UserRole userRoleSelection = new UserRole(  );
+        if(this.roleSelection != null)
+        {
+            userRoleSelection.setName( this.roleSelection.getName() );
+            CUtil.copy(this.roleSelection, userRoleSelection);
+        }
+        return userRoleSelection;
+    }
+
+    public UserAdminRole getAdminRoleSelection()
+    {
+        UserAdminRole userRoleSelection = new UserAdminRole(  );
+        if(this.roleSelection != null)
+        {
+            userRoleSelection.setName( this.roleSelection.getName() );
+            CUtil.copy(this.roleSelection, userRoleSelection);
+        }
+        return userRoleSelection;
+    }
+
+    public void setRoleSearchVal( String roleSearchVal )
+    {
+        this.roleSearchVal = roleSearchVal;
+    }
+
+    public boolean isAdmin()
+    {
+        return isAdmin;
+    }
+
+    public void setAdmin( boolean admin )
+    {
+        isAdmin = admin;
+    }
+
+    public boolean isParentSearch()
+    {
+        return isParentSearch;
+    }
+
+    public void setParentSearch( boolean parentSearch )
+    {
+        isParentSearch = parentSearch;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/panel/SDDetailPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/panel/SDDetailPanel.java b/src/main/java/org/apache/directory/fortress/web/panel/SDDetailPanel.java
new file mode 100644
index 0000000..568ff6c
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/panel/SDDetailPanel.java
@@ -0,0 +1,496 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *   or more contributor license agreements.  See the NOTICE file
+ *   distributed with this work for additional information
+ *   regarding copyright ownership.  The ASF licenses this file
+ *   to you 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.apache.directory.fortress.web.panel;
+
+import com.googlecode.wicket.jquery.ui.form.spinner.Spinner;
+import com.googlecode.wicket.kendo.ui.form.button.AjaxButton;
+import com.googlecode.wicket.kendo.ui.form.combobox.ComboBox;
+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.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.directory.fortress.web.GlobalIds;
+import org.apache.directory.fortress.web.GlobalUtils;
+import org.apache.directory.fortress.web.SaveModelEvent;
+import org.apache.directory.fortress.web.SecureIndicatingAjaxButton;
+import org.apache.directory.fortress.web.SelectModelEvent;
+import org.apache.directory.fortress.core.AdminMgr;
+import org.apache.directory.fortress.core.rbac.SDSet;
+import org.apache.directory.fortress.core.rbac.UserRole;
+import org.apache.directory.fortress.core.util.attr.VUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * Date: 6/13/13
+ */
+public class SDDetailPanel extends FormComponentPanel
+{
+    @SpringBean
+    private AdminMgr adminMgr;
+    private static final String MEMBERS_SELECTION = "membersSelection";
+    private static final Logger log = Logger.getLogger(SDDetailPanel.class.getName());
+    private Form editForm;
+    private Displayable display;
+    private boolean isStatic;
+
+    public Form getForm()
+    {
+        return this.editForm;
+    }
+
+    public SDDetailPanel(String id, Displayable display, boolean isStatic)
+    {
+        super(id);
+        this.adminMgr.setAdmin( GlobalUtils.getRbacSession( this ) );
+        this.isStatic = isStatic;
+        this.editForm = new SDDetailForm(GlobalIds.EDIT_FIELDS, new CompoundPropertyModel<SDSet>(new SDSet()));
+        this.display = display;
+        add(editForm);
+    }
+
+    public class SDDetailForm extends Form
+    {
+        private String internalId;
+        private ComboBox<String> membersCB;
+        private String membersSelection;
+        private Component component;
+        private List<String> members = new ArrayList<String>();
+        private UserRole roleConstraint = new UserRole();
+
+        public SDDetailForm(String id, final IModel<SDSet> model)
+        {
+            super(id, model);
+            String opNameAdd;
+            String opNameUpdate;
+            String opNameDelete;
+            if(isStatic)
+            {
+                opNameAdd = "createSsdSet";
+                opNameUpdate = "updateSsdSet";
+                opNameDelete = "deleteSsdSet";
+            }
+            else
+            {
+                opNameAdd = "createDsdSet";
+                opNameUpdate = "updateDsdSet";
+                opNameDelete = "deleteDsdSet";
+            }
+
+            add( new SecureIndicatingAjaxButton( GlobalIds.ADD, GlobalIds.ADMIN_MGR, opNameAdd )
+            {
+                @Override
+                protected void onSubmit(AjaxRequestTarget target, Form form)
+                {
+                    log.debug(".onSubmit Add");
+                    SDSet sdSet = (SDSet)form.getModel().getObject();
+                    updateEntityWithComboData(sdSet);
+                    try
+                    {
+                        if(isStatic)
+                        {
+                            adminMgr.createSsdSet(sdSet);
+                        }
+                        else
+                        {
+                            adminMgr.createDsdSet(sdSet);
+                        }
+                        SaveModelEvent.send(getPage(), this, sdSet, target, SaveModelEvent.Operations.ADD);
+                        component = editForm;
+                        String msg = "SDSet: " + sdSet.getName() + " has been added";
+                        display.setMessage(msg);
+                    }
+                    catch (org.apache.directory.fortress.core.SecurityException se)
+                    {
+                        String error = ".onSubmit caught SecurityException=" + se;
+                        log.error(error);
+                        display.setMessage(error);
+                        display.display();
+                    }
+                }
+
+                @Override
+                public void onError(AjaxRequestTarget target, Form form)
+                {
+                    log.info("SDDetailPanel.add.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 );
+                }
+            });
+            add( new SecureIndicatingAjaxButton( GlobalIds.COMMIT, GlobalIds.ADMIN_MGR, opNameUpdate )
+            {
+                @Override
+                protected void onSubmit(AjaxRequestTarget target, Form form)
+                {
+                    log.debug(".onSubmit Commit");
+                    SDSet sdSet = (SDSet)form.getModel().getObject();
+                    try
+                    {
+                        updateEntityWithComboData(sdSet);
+                        if(isStatic)
+                            adminMgr.updateSsdSet(sdSet);
+                        else
+                            adminMgr.updateDsdSet(sdSet);
+                        String msg = "SDSet: " + sdSet.getName() + " has been updated";
+                        SaveModelEvent.send(getPage(), this, sdSet, target, SaveModelEvent.Operations.UPDATE);
+                        component = editForm;
+                        display.setMessage(msg);
+                        membersSelection = "";
+                    }
+                    catch (org.apache.directory.fortress.core.SecurityException se)
+                    {
+                        String error = ".onSubmit caught SecurityException=" + se;
+                        log.error(error);
+                        display.setMessage(error);
+                        display.display();
+                    }
+                }
+
+                @Override
+                public void onError(AjaxRequestTarget target, Form form)
+                {
+                    log.warn("SDDetailPanel.commmit.onError");
+                }
+                @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 );
+                }
+            });
+
+            add( new SecureIndicatingAjaxButton( GlobalIds.DELETE, GlobalIds.ADMIN_MGR, opNameDelete )
+            {
+                @Override
+                protected void onSubmit(AjaxRequestTarget target, Form form)
+                {
+                    log.debug(".onSubmit Delete");
+                    SDSet sdSet = (SDSet)form.getModel().getObject();
+
+                    try
+                    {
+                        SDSet newSdSet = new SDSet();
+                        if(isStatic)
+                        {
+                            adminMgr.deleteSsdSet(sdSet);
+                            newSdSet.setType(SDSet.SDType.STATIC);
+                        }
+                        else
+                        {
+                            adminMgr.deleteDsdSet(sdSet);
+                            newSdSet.setType(SDSet.SDType.DYNAMIC);
+                        }
+                        form.setModelObject( newSdSet );
+                        modelChanged();
+                        String msg = "SDSet: " + sdSet.getName() + " has been deleted";
+                        membersSelection = "";
+                        members = new ArrayList<String>();
+                        membersCB = new ComboBox<String>( "members", new PropertyModel<String>( editForm, MEMBERS_SELECTION ),members );
+                        editForm.addOrReplace( membersCB );
+                        component = editForm;
+                        SaveModelEvent.send(getPage(), this, sdSet, target, SaveModelEvent.Operations.DELETE);
+                        display.setMessage(msg);
+                    }
+                    catch (org.apache.directory.fortress.core.SecurityException se)
+                    {
+                        String error = ".onSubmit caught SecurityException=" + se;
+                        log.error(error);
+                        display.setMessage(error);
+                        display.display();
+                    }
+                }
+
+                @Override
+                public void onError(AjaxRequestTarget target, Form form)
+                {
+                    log.warn("SDDetailPanel.delete.onError");
+                }
+                @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 );
+                }
+            });
+
+            add(new AjaxSubmitLink(GlobalIds.CANCEL)
+            {
+                @Override
+                protected void onSubmit(AjaxRequestTarget target, Form form)
+                {
+                    SDSet sdSet = new SDSet();
+                    if(isStatic)
+                        sdSet.setType(SDSet.SDType.STATIC);
+                    else
+                        sdSet.setType(SDSet.SDType.DYNAMIC);
+                    setModelObject(sdSet);
+                    membersSelection = "";
+                    members = new ArrayList<String>();
+                    membersCB = new ComboBox<String>( "members", new PropertyModel<String>( form, MEMBERS_SELECTION ),members );
+                    editForm.addOrReplace( membersCB );
+                    component = editForm;
+                    String msg = "SDSet cancelled input form";
+                    display.setMessage(msg);
+                }
+
+                @Override
+                public void onError(AjaxRequestTarget target, Form form)
+                {
+                    log.warn("SDDetailPanel.cancel.onError");
+                }
+                @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 );
+                }
+            });
+
+            if(isStatic)
+            {
+                add( new Label( "sdAssignmentsLabel", "Static Separation of Duties Detail" ) );
+            }
+            else
+            {
+                add( new Label( "sdAssignmentsLabel", "Dynamic Separation of Duties Detail" ) );
+            }
+
+            TextField name = new TextField("name");
+            add(name);
+            TextField description = new TextField("description");
+            description.setRequired(false);
+            add(description);
+            add(new Spinner<Integer>("cardinality"));
+            Label iid = new Label("id");
+            add(iid);
+            membersCB = new ComboBox<String>( "members", new PropertyModel<String>( this, MEMBERS_SELECTION ), members );
+            membersCB.setOutputMarkupId(true);
+            add(membersCB);
+            addRoleSearchModal();
+
+            add( new AjaxButton( "members.delete" )
+            {
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                protected void onSubmit( AjaxRequestTarget target, Form<?> form )
+                {
+                    String msg = "clicked on members.delete";
+                    if ( VUtil.isNotNullOrEmpty( membersSelection ) )
+                    {
+                        msg += " selection:" + membersSelection;
+                        SDSet sdSet = ( SDSet ) form.getModel().getObject();
+                        if ( sdSet.getMembers() != null )
+                        {
+                            sdSet.getMembers().remove( membersSelection );
+                            members.remove(  membersSelection );
+                            membersSelection = "";
+                            component = editForm;
+                            msg += ", was removed from local, commit to persist changes on server";
+                        }
+                        else
+                        {
+                            msg += ", no action taken because role does not have members set";
+                        }
+                    }
+                    else
+                    {
+                        msg += ", no action taken because members selection is empty";
+                    }
+                    display.setMessage( msg );
+                    log.debug( msg );
+                }
+                @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 addRoleSearchModal()
+        {
+            final ModalWindow rolesModalWindow;
+            add( rolesModalWindow = new ModalWindow( "rolesmodal" ) );
+            final RoleSearchModalPanel roleSearchModalPanel = new RoleSearchModalPanel( rolesModalWindow.getContentId(), rolesModalWindow, false );
+            rolesModalWindow.setContent( roleSearchModalPanel );
+            rolesModalWindow.setWindowClosedCallback( new ModalWindow.WindowClosedCallback()
+            {
+                @Override
+                public void onClose( AjaxRequestTarget target )
+                {
+                    roleConstraint = roleSearchModalPanel.getRoleSelection();
+                    if ( roleConstraint != null )
+                    {
+                        membersSelection = roleConstraint.getName();
+                        component = editForm;
+                        //target.add( membersCB );
+                    }
+                }
+            } );
+
+            add( new AjaxButton( "roles.search" )
+            {
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                protected void onSubmit( AjaxRequestTarget target, Form<?> form )
+                {
+                    String msg = "clicked on roles search";
+                    msg += membersSelection != null ? ": " + membersSelection : "";
+                    roleSearchModalPanel.setRoleSearchVal( membersSelection );
+                    display.setMessage( msg );
+                    log.debug( msg );
+                    target.prependJavaScript( GlobalIds.WICKET_WINDOW_UNLOAD_CONFIRMATION_FALSE );
+                    rolesModalWindow.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 );
+                }
+            } );
+
+            rolesModalWindow.setTitle( "RBAC Role Selection Modal" );
+            rolesModalWindow.setInitialWidth( 700 );
+            rolesModalWindow.setInitialHeight( 450 );
+            rolesModalWindow.setCookieName( "role-assign-modal" );
+        }
+
+        private void updateEntityWithComboData(SDSet sdSet)
+        {
+            if(VUtil.isNotNullOrEmpty(membersSelection))
+            {
+                sdSet.setMember(membersSelection);
+                members.add( membersSelection );
+            }
+        }
+
+        @Override
+        public void onEvent(final IEvent<?> event)
+        {
+            if (event.getPayload() instanceof SelectModelEvent)
+            {
+                SelectModelEvent modelEvent = (SelectModelEvent) event.getPayload();
+                SDSet sdSet = (SDSet) modelEvent.getEntity();
+                this.setModelObject(sdSet);
+                if(VUtil.isNotNullOrEmpty(sdSet.getMembers()))
+                {
+                    members = new ArrayList<String>(sdSet.getMembers());
+                    membersCB = new ComboBox<String>( "members", new PropertyModel<String>( this, MEMBERS_SELECTION ),members );
+                }
+                else
+                {
+                    members = new ArrayList<String>();
+                    membersCB = new ComboBox<String>( "members", new PropertyModel<String>( this, MEMBERS_SELECTION ),members );
+                }
+                editForm.addOrReplace(membersCB);
+                String msg = "SDSet: " + sdSet.getName() + " has been selected";
+                log.debug(msg);
+                display.setMessage(msg);
+                component = editForm;
+            }
+            else if (event.getPayload() instanceof AjaxRequestTarget)
+            {
+                // only add the form to ajax target if something has changed...
+                if (component != null)
+                {
+                    AjaxRequestTarget target = ((AjaxRequestTarget) event.getPayload());
+                    log.debug(".onEvent AjaxRequestTarget: " + target.toString());
+                    target.add(component);
+                    component = null;
+                }
+
+                display.display((AjaxRequestTarget) event.getPayload());
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/panel/SDListPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/panel/SDListPanel.java b/src/main/java/org/apache/directory/fortress/web/panel/SDListPanel.java
new file mode 100644
index 0000000..e1ef2ab
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/panel/SDListPanel.java
@@ -0,0 +1,383 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *   or more contributor license agreements.  See the NOTICE file
+ *   distributed with this work for additional information
+ *   regarding copyright ownership.  The ASF licenses this file
+ *   to you 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.apache.directory.fortress.web.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.Radio;
+import org.apache.wicket.markup.html.form.RadioGroup;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.directory.fortress.web.GlobalIds;
+import org.apache.directory.fortress.web.GlobalUtils;
+import org.apache.directory.fortress.web.SDListModel;
+import org.apache.directory.fortress.web.SaveModelEvent;
+import org.apache.directory.fortress.web.SecureIndicatingAjaxButton;
+import org.apache.directory.fortress.web.SecureIndicatingAjaxLink;
+import org.apache.directory.fortress.web.SelectModelEvent;
+import org.apache.directory.fortress.core.rbac.FortEntity;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.Model;
+import org.apache.directory.fortress.core.rbac.SDSet;
+import org.apache.directory.fortress.core.rbac.UserRole;
+import org.apache.directory.fortress.core.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 SDListPanel extends FormComponentPanel
+{
+    private static final Logger log = Logger.getLogger(SDListPanel.class.getName());
+    private Form listForm;
+    private DefaultTreeModel treeModel;
+    private DefaultMutableTreeNode node;
+    private TreeGrid<DefaultTreeModel, DefaultMutableTreeNode, String> grid;
+    private DefaultMutableTreeNode rootNode;
+    private String searchVal;
+    private String searchLabel;
+    private String opName;
+    private char selectedRadioButton;
+    private TextField searchValFld;
+    private RadioGroup radioGroup;
+    private static final char NAMES = 'N';
+    private static final char ROLES = 'R';
+
+    public SDListPanel(String id, final boolean isStatic)
+    {
+        super(id);
+        SDSet sdSet = new SDSet();
+        sdSet.setName("");
+        if(isStatic)
+        {
+            sdSet.setType(SDSet.SDType.STATIC);
+            searchLabel = "SSD Name";
+            opName = "ssdRoleSets";
+        }
+        else
+        {
+            sdSet.setType(SDSet.SDType.DYNAMIC);
+            searchLabel = "DSD Name";
+            opName = "dsdRoleSets";
+        }
+        SDListModel sdListModel = new SDListModel(sdSet, GlobalUtils.getRbacSession( this ));
+        setDefaultModel(sdListModel);
+        List<IGridColumn<DefaultTreeModel, DefaultMutableTreeNode, String>> columns =
+            new ArrayList<IGridColumn<DefaultTreeModel, DefaultMutableTreeNode, String>>();
+        columns.add(new PropertyColumn<DefaultTreeModel, DefaultMutableTreeNode, String, String>(
+            Model.of(searchLabel), "userObject.name"));
+
+        PropertyColumn description = new PropertyColumn<DefaultTreeModel, DefaultMutableTreeNode, String, String>(
+                    Model.of("Description"), "userObject.Description");
+
+        description.setInitialSize(300);
+        columns.add(description);
+
+        PropertyColumn cardinality = new PropertyColumn<DefaultTreeModel, DefaultMutableTreeNode, String, String>(
+                    Model.of("Cardinality"), "userObject.Cardinality");
+        cardinality.setInitialSize(100);
+        columns.add(cardinality);
+
+        PropertyColumn members = new PropertyColumn<DefaultTreeModel, DefaultMutableTreeNode, String, String>(
+                    Model.of("Members"), "userObject.members");
+        members.setInitialSize(600);
+        columns.add(members);
+
+        List<SDSet> sdSets = (List<SDSet>) getDefaultModel().getObject();
+        treeModel = createTreeModel(sdSets);
+        grid = new TreeGrid<DefaultTreeModel, DefaultMutableTreeNode, String>("sdtreegrid", treeModel, columns)
+        {
+            @Override
+            public void selectItem(IModel itemModel, boolean selected)
+            {
+                node = (DefaultMutableTreeNode) itemModel.getObject();
+                if(!node.isRoot())
+                {
+                    SDSet sdSet = (SDSet) node.getUserObject();
+                    log.debug("TreeGrid.addGrid.selectItem selected sdSet =" + sdSet.getName());
+                    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, sdSet);
+                    }
+                }
+            }
+        };
+        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);
+
+        radioGroup = new RadioGroup("searchOptions",  new PropertyModel(this, "selectedRadioButton"));
+        add(radioGroup);
+        Radio nameRb = new Radio("nameRb", new Model(new Character(NAMES)));
+        radioGroup.add(nameRb);
+        Radio roleRb = new Radio("roleRb", new Model(new Character(ROLES)));
+        radioGroup.add(roleRb);
+        addRoleSearchModal(roleRb);
+        radioGroup.setOutputMarkupId( true );
+        radioGroup.setRenderBodyOnly( false );
+        searchValFld = new TextField(GlobalIds.SEARCH_VAL, new PropertyModel<String>(this, GlobalIds.SEARCH_VAL));
+        searchValFld.setOutputMarkupId( true );
+        AjaxFormComponentUpdatingBehavior ajaxUpdater = new AjaxFormComponentUpdatingBehavior(GlobalIds.ONBLUR)
+        {
+          @Override
+          protected void onUpdate(final AjaxRequestTarget target)
+          {
+              target.add( searchValFld );
+          }
+        };
+        searchValFld.add(ajaxUpdater);
+        radioGroup.add( searchValFld );
+        this.listForm.add(radioGroup);
+        selectedRadioButton = NAMES;
+        this.listForm.add( new SecureIndicatingAjaxButton( GlobalIds.SEARCH, GlobalIds.REVIEW_MGR, opName )
+        {
+            @Override
+            protected void onSubmit(AjaxRequestTarget target, Form form)
+            {
+                log.debug(".search onSubmit");
+                info("Searching SDSets...");
+                if(!VUtil.isNotNullOrEmpty(searchVal))
+                {
+                    searchVal = "";
+                }
+                final SDSet srchSd = new SDSet();
+                if(isStatic)
+                {
+                    srchSd.setType(SDSet.SDType.STATIC);
+                }
+                else
+                {
+                    srchSd.setType(SDSet.SDType.DYNAMIC);
+                }
+                switch(selectedRadioButton)
+                {
+                    case NAMES:
+                        log.debug(".onSubmit NAMES RB selected");
+                        srchSd.setName(searchVal);
+                        break;
+                    case ROLES:
+                        log.debug(".onSubmit ROLES RB selected");
+                        srchSd.setMember(searchVal);
+                        break;
+                }
+
+                setDefaultModel(new SDListModel(srchSd, GlobalUtils.getRbacSession( this )));
+                treeModel.reload();
+                rootNode.removeAllChildren();
+                List<SDSet> sdSets = (List<SDSet>) getDefaultModelObject();
+                if(VUtil.isNotNullOrEmpty(sdSets))
+                {
+                    for (SDSet sdSet : sdSets)
+                        rootNode.add(new DefaultMutableTreeNode(sdSet));
+                    info("Search returned " + sdSets.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 );
+            }
+        });
+        add(this.listForm);
+    }
+
+    private void addRoleSearchModal(Radio roleRb)
+    {
+        final ModalWindow rolesModalWindow;
+        listForm.add( rolesModalWindow = new ModalWindow( "rolesearchmodal" ) );
+        final RoleSearchModalPanel roleSearchModalPanel = new RoleSearchModalPanel( rolesModalWindow.getContentId(), rolesModalWindow, false );
+        rolesModalWindow.setContent( roleSearchModalPanel );
+        rolesModalWindow.setWindowClosedCallback( new ModalWindow.WindowClosedCallback()
+        {
+            @Override
+            public void onClose( AjaxRequestTarget target )
+            {
+                UserRole roleConstraint = roleSearchModalPanel.getRoleSelection();
+                if ( roleConstraint != null )
+                {
+                    log.debug( "modal selected:" + roleConstraint.getName());
+                    searchVal = roleConstraint.getName();
+                    selectedRadioButton = ROLES;
+                    target.add( radioGroup );
+                }
+            }
+        } );
+
+        roleRb.add( new SecureIndicatingAjaxLink( "roleAssignLinkLbl", GlobalIds.REVIEW_MGR, "findRoles" )
+        {
+            public void onClick(AjaxRequestTarget target)
+            {
+                String msg = "clicked on roles search";
+                msg += "roleSelection: " + searchVal;
+                roleSearchModalPanel.setRoleSearchVal( searchVal );
+                log.debug( msg );
+                target.prependJavaScript( GlobalIds.WICKET_WINDOW_UNLOAD_CONFIRMATION_FALSE );
+                rolesModalWindow.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 );
+            }
+        });
+
+        rolesModalWindow.setTitle( "RBAC Role Search Modal" );
+        rolesModalWindow.setInitialWidth( 700 );
+        rolesModalWindow.setInitialHeight( 450 );
+        rolesModalWindow.setCookieName( "role-assign-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:
+                    modelChanged();
+                    break;
+                case DELETE:
+                    prune();
+                    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);
+            SDSet sdSet = (SDSet) node.getUserObject();
+            log.debug(".removeSelectedItems sdset node: " + sdSet.getName());
+            List<SDSet> sdSets = ((List<SDSet>) getDefaultModel().getObject());
+            sdSets.remove(sdSet.getName());
+        }
+    }
+
+    private DefaultTreeModel createTreeModel(List<SDSet> sdSets)
+    {
+        DefaultTreeModel model;
+        SDSet root = new SDSet();
+        //root.setName(searchLabel);
+        rootNode = new DefaultMutableTreeNode(root);
+        model = new DefaultTreeModel(rootNode);
+        if (sdSets == null)
+            log.debug("no SDSets found");
+        else
+        {
+            log.debug("SDSets found:" + sdSets.size());
+            for (SDSet sdSet : sdSets)
+                rootNode.add(new DefaultMutableTreeNode(sdSet));
+        }
+        return model;
+    }
+
+    public void add(FortEntity entity)
+    {
+        if (getDefaultModelObject() != null)
+        {
+            List<SDSet> sdSets = ((List<SDSet>) getDefaultModelObject());
+            sdSets.add((SDSet) entity);
+            treeModel.insertNodeInto(new DefaultMutableTreeNode(entity), rootNode, sdSets.size());
+        }
+    }
+
+    public void prune()
+    {
+        removeSelectedItems(grid);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/panel/UserAuditDetailPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/panel/UserAuditDetailPanel.java b/src/main/java/org/apache/directory/fortress/web/panel/UserAuditDetailPanel.java
new file mode 100644
index 0000000..cdedb84
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/panel/UserAuditDetailPanel.java
@@ -0,0 +1,64 @@
+/*
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *   or more contributor license agreements.  See the NOTICE file
+ *   distributed with this work for additional information
+ *   regarding copyright ownership.  The ASF licenses this file
+ *   to you 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.apache.directory.fortress.web.panel;
+
+import org.apache.log4j.Logger;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.apache.wicket.model.IModel;
+import org.apache.directory.fortress.web.GlobalIds;
+import org.apache.directory.fortress.core.rbac.User;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * Date: 8/10/13
+ */
+public class UserAuditDetailPanel extends FormComponentPanel
+{
+    private static final Logger LOG = Logger.getLogger(UserAuditDetailPanel.class.getName());
+
+    public UserAuditDetailPanel(String id, final IModel userModel)
+    {
+        super(id, userModel);
+        add( new Label( GlobalIds.USER_ID ) );
+        add( new Label( GlobalIds.DESCRIPTION ) );
+        add( new Label( GlobalIds.NAME ) );
+        add( new Label( GlobalIds.OU ) );
+        add( new Label( GlobalIds.TITLE ) );
+        add( new Label( GlobalIds.ADDRESS_ADDRESSES ) );
+        add( new Label( GlobalIds.ADDRESS_CITY ) );
+        add( new Label( GlobalIds.ADDRESS_STATE ) );
+        add( new Label( GlobalIds.ADDRESS_COUNTRY ) );
+        add( new JpegImage( GlobalIds.JPEGPHOTO )
+        {
+            @Override
+            protected byte[] getPhoto()
+            {
+                User user = (User)getModelObject();
+                return user.getJpegPhoto();
+            }
+        } );
+        setOutputMarkupId( true );
+
+    }
+
+}
\ No newline at end of file