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:36 UTC

[26/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/AuditModPage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/AuditModPage.java b/src/main/java/org/apache/directory/fortress/web/AuditModPage.java
new file mode 100644
index 0000000..5601154
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/AuditModPage.java
@@ -0,0 +1,100 @@
+/*
+ *   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;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.directory.fortress.web.panel.AuditModDetailPanel;
+import org.apache.directory.fortress.web.panel.AuditModListPanel;
+import org.apache.directory.fortress.web.panel.Displayable;
+import org.apache.directory.fortress.web.panel.InfoPanel;
+import org.apache.directory.fortress.web.panel.NavPanel;
+import org.apache.directory.fortress.core.rbac.UserAudit;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * Date: 8/10/13
+ */
+public class AuditModPage extends FortressWebBasePage
+{
+    boolean firstLoad = true;
+
+    public AuditModPage()
+    {
+        UserAudit userAudit = new UserAudit();
+        init( userAudit );
+    }
+
+    public AuditModPage(final UserAudit userAudit)
+    {
+        boolean firstLoad = false;
+        init( userAudit );
+    }
+
+    private void init(final UserAudit userAudit)
+    {
+        add(new Label(GlobalIds.PAGE_HEADER, "Audit Modification Viewer"));
+        WebMarkupContainer container = new WebMarkupContainer(GlobalIds.LAYOUT);
+        FourWaySplitter splitter = new FourWaySplitter("55", "45");
+        splitter.addBorderLayout(container);
+
+        // Add the four necessary panels for Commander Page: 1. Nav,, 2. Info, 3. Detail, 4. List, .
+        // Nav and Info are generic and work across all entities, the others are specific to this entity type.
+
+        // 1. Nav Panel:
+        NavPanel navPanel = new NavPanel( GlobalIds.NAVPANEL );
+
+        // 2. Info Panel:
+        InfoPanel infoPanel;
+        if( firstLoad )
+        {
+            infoPanel = new InfoPanel(GlobalIds.INFOPANEL);
+        }
+        else
+        {
+            infoPanel = new InfoPanel(GlobalIds.INFOPANEL, "searching modification records...");
+        }
+
+        container.add(infoPanel);
+
+        // 3. Detail Panel:
+        Displayable display = infoPanel.getDisplay();
+        AuditModDetailPanel modDetail = new AuditModDetailPanel("moddetailpanel", display);
+        container.add(modDetail);
+
+        container.add(navPanel);
+
+        // 4. List Panel:
+        container.add(new AjaxLazyLoadPanel("modlistpanel")
+         {
+           @Override
+           public Component getLazyLoadComponent(String id)
+           {
+                //return new AuditAuthzListPanel(id);
+               return new AuditModListPanel( id, userAudit );
+           }
+         });
+
+        this.add(container);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/Authorizable.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/Authorizable.java b/src/main/java/org/apache/directory/fortress/web/Authorizable.java
new file mode 100644
index 0000000..97703ee
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/Authorizable.java
@@ -0,0 +1,40 @@
+/*
+ *   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;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * ...
+ *
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+
+@Retention( RetentionPolicy.RUNTIME)
+@Target( ElementType.TYPE)
+@Inherited
+public @interface Authorizable
+{
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/ContextMenuPage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/ContextMenuPage.java b/src/main/java/org/apache/directory/fortress/web/ContextMenuPage.java
new file mode 100644
index 0000000..32ea4e0
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/ContextMenuPage.java
@@ -0,0 +1,123 @@
+/*
+ * This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2014 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+
+package org.apache.directory.fortress.web;
+
+
+import com.googlecode.wicket.jquery.ui.JQueryIcon;
+import com.googlecode.wicket.jquery.ui.widget.menu.MenuItem;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.basic.Label;
+
+import com.googlecode.wicket.jquery.ui.widget.menu.ContextMenu;
+import com.googlecode.wicket.jquery.ui.widget.menu.ContextMenuBehavior;
+import com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem;
+import org.apache.wicket.model.Model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Kevin McKinney
+ * @version $Rev$
+ */
+public class ContextMenuPage extends FortressWebBasePage
+{
+    private static final long serialVersionUID = 1L;
+
+    public ContextMenuPage()
+    {
+        // Menu //
+        final ContextMenu menu = new ContextMenu( "menu", newMenuList() )
+        {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onContextMenu( AjaxRequestTarget target, Component component )
+            {
+                //the menu-item list can be modified here
+                //this.getItemList().add(new MenuItem("my new item"));
+            }
+
+            @Override
+            public void onClick( AjaxRequestTarget target, IMenuItem item )
+            {
+                this.debug( "Clicked " + item.getTitle().getObject() );
+
+                target.add( this );
+                //target.add(feedback);
+            }
+        };
+
+        this.add( menu );
+
+        // Labels //
+        final Label label1 = new Label( "label1", "my label 1" );
+        label1.add( new ContextMenuBehavior( menu ) );
+        this.add( label1 );
+
+        final Label label2 = new Label( "label2", "my label 2" );
+        label2.add( new ContextMenuBehavior( menu ) );
+        this.add( label2 );
+    }
+
+    private List<IMenuItem> newMenuList()
+    {
+        List<IMenuItem> list = new ArrayList<IMenuItem>();
+
+        list.add( new MenuItem( "Item with icon", JQueryIcon.FLAG ) );
+        list.add( new MenuItem( "Change the title" )
+        {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onClick( AjaxRequestTarget target )
+            {
+                this.setTitle( Model.of( "Title changed!" ) );
+            }
+        } );
+        list.add( new MenuItem( "Another menu item" ) );
+        list.add( new MenuItem( "Menu item, with sub-menu", JQueryIcon.BOOKMARK,
+            this.newSubMenuList() ) ); // css-class are also allowed
+        list.add( new MenuItem( "Desactivate me" )
+        {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onClick( AjaxRequestTarget target )
+            {
+                this.setEnabled( false );
+            }
+        } );
+
+        return list;
+    }
+
+    private List<IMenuItem> newSubMenuList()
+    {
+        List<IMenuItem> list = new ArrayList<IMenuItem>();
+
+        list.add( new MenuItem( "Sub-menu #1" ) );
+        list.add( new MenuItem( "Sub-menu #2" ) );
+        list.add( new MenuItem( "Sub-menu #3" ) );
+
+        return list;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/ErrorPage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/ErrorPage.java b/src/main/java/org/apache/directory/fortress/web/ErrorPage.java
new file mode 100644
index 0000000..0444230
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/ErrorPage.java
@@ -0,0 +1,43 @@
+/*
+ * This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2014 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+package org.apache.directory.fortress.web;
+
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class ErrorPage extends FortressWebBasePage
+{
+    public ErrorPage( Exception e )
+    {
+        add( new Label( "title", new Model<String>( "Runtime Exception Occurred" ) ) );
+        add( new Label( "message", new Model<String>( e.getLocalizedMessage() ) ) );
+        add( new BookmarkablePageLink( "homePage", getApplication().getHomePage() ) );
+    }
+
+    @Deprecated
+    public ErrorPage( final PageParameters parameters )
+    {
+        add( new Label( "title", new Model<String>( parameters.get( "title" ).toString() ) ) );
+        add( new Label( "message", new Model<String>( parameters.get( "message" ).toString() ) ) );
+        add( new BookmarkablePageLink( "homePage", getApplication().getHomePage() ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/FiveWaySplitter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/FiveWaySplitter.java b/src/main/java/org/apache/directory/fortress/web/FiveWaySplitter.java
new file mode 100644
index 0000000..8026b7c
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/FiveWaySplitter.java
@@ -0,0 +1,84 @@
+/*
+ * This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2014 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+
+package org.apache.directory.fortress.web;
+
+import com.googlecode.wicket.kendo.ui.widget.splitter.IBorderLayout;
+import com.googlecode.wicket.kendo.ui.widget.splitter.SplitterBehavior;
+import org.apache.wicket.MarkupContainer;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * Date: 5/21/13
+ */
+public class FiveWaySplitter implements IBorderLayout
+{
+    public void addBorderLayout(MarkupContainer container)
+    {
+        System.out.println("addBorderLayout");
+
+
+        container.add(new SplitterBehavior("#vertical").setOption("panes", this.getVerticalPanes()).setOption("orientation", "'vertical'"));
+        container.add(new SplitterBehavior("#horizontal").setOption("panes", this.getHorizontalPanes()));
+
+        /*
+        SplitterBehavior verticalSplitter = new SplitterBehavior("#vertical");
+        verticalSplitter.setOption("orientation", "'vertical'");
+        verticalSplitter.setOption("min", "'400px'");
+        verticalSplitter.setOption("max", "'800px'");
+        verticalSplitter.setOption("height", "'100%'");
+        verticalSplitter.setOption("size", "'60px'");
+        verticalSplitter.setOption("collapsible", "'false'");
+        container.add(verticalSplitter);
+        */
+
+        /*
+        SplitterBehavior horizontalSplitter = new SplitterBehavior("#horizontal");
+        horizontalSplitter.setOption("orientation", "'horizontal'");
+        horizontalSplitter.setOption("min", "'400px'");
+        horizontalSplitter.setOption("max", "'800px'");
+        horizontalSplitter.setOption("height", "'100%'");
+        horizontalSplitter.setOption("size", "'20%'");
+        horizontalSplitter.setOption("collapsible", "'true'");
+        container.add(horizontalSplitter);
+        */
+
+
+        //container.add(new SplitterBehavior("#vertical").setOption("panes", this.getVerticalPanes()).setOption("orientation", "'vertical'"));
+        //container.add(new SplitterBehavior("#horizontal").setOption("panes", this.getHorizontalPanes()));
+    }
+
+    @Override
+    public String getVerticalPanes()
+    {
+         System.out.println("getVerticalPanes");
+        //return "[ { resizable: false, size: '25%' }, {  }, { collapsible: true, size: '25%' } ]";
+        //return "[ { resizable: false, size: '15%' }, { resizable: true, size: '70%' }, { collapsible: true, size: '15%' } ]";
+        return "[ { collapsible: true, resizable: false, size: '50px', min: '50px', max: '50px', scrollable: false }, { resizable: true, size: '80%' }, { collapsible: true, size: '5%', min: '50px'} ]";
+        //return "vertical";
+    }
+
+    @Override
+    public String getHorizontalPanes()
+    {
+         System.out.println("getHorizontalPanes");
+        //return "[ { size: '15%' }, { }, { size: '15%' } ]";
+        //return "[ { collapsible: true, size: '78%' }, { size: '20%', max: '300px' } ]";
+        //return "[ { collapsible: true, size: '78%' }, { collapsible: true, size: '20%', min: '200px', max: '300px' } ]";
+        //return "[ { collapsible: true, resizable: false, size: '85px', min: '85x', max: '85px'}, { collapsible: true, size: '73%' }, { collapsible: true, size: '18%'} ]";
+        return "[ { collapsible: true, resizable: false, size: '85px', min: '85x', max: '85px'}, { collapsible: true, size: '70%' }, { collapsible: true, size: '21%'} ]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/FortressWebBasePage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/FortressWebBasePage.java b/src/main/java/org/apache/directory/fortress/web/FortressWebBasePage.java
new file mode 100644
index 0000000..41a7744
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/FortressWebBasePage.java
@@ -0,0 +1,175 @@
+/*
+ *   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;
+
+import org.apache.log4j.Logger;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.directory.fortress.core.*;
+import org.apache.directory.fortress.core.rbac.Session;
+
+import javax.servlet.http.HttpServletRequest;
+import java.security.Principal;
+
+/**
+ * Base class for Commander Web.  This class initializes Fortress RBAC context and so contains a synchronized block.
+ *
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public abstract class FortressWebBasePage extends WebPage
+{
+    @SpringBean
+    private AccessMgr accessMgr;
+    @SpringBean
+    private DelAccessMgr delAccessMgr;
+    private static final String CLS_NM = FortressWebBasePage.class.getName();
+    private static final Logger LOG = Logger.getLogger( CLS_NM );
+
+    public FortressWebBasePage()
+    {
+        SecureBookmarkablePageLink usersLink = new SecureBookmarkablePageLink( GlobalIds.USERS_PAGE, UserPage.class,
+            GlobalIds.ROLE_USERS );
+        add( usersLink );
+        PageParameters parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.RBAC_TYPE );
+        SecureBookmarkablePageLink rolesLink = new SecureBookmarkablePageLink( GlobalIds.ROLES_PAGE, RolePage.class,
+            parameters, GlobalIds.ROLE_ROLES );
+        add( rolesLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.ADMIN_TYPE );
+        SecureBookmarkablePageLink admrolesLink = new SecureBookmarkablePageLink( GlobalIds.ADMROLES_PAGE,
+            RoleAdminPage.class, parameters, GlobalIds.ROLE_ADMINROLES );
+        add( admrolesLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.RBAC_TYPE );
+        SecureBookmarkablePageLink objectsLink = new SecureBookmarkablePageLink( GlobalIds.POBJS_PAGE,
+            ObjectPage.class, parameters, GlobalIds.ROLE_PERMOBJS );
+        add( objectsLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.ADMIN_TYPE );
+        SecureBookmarkablePageLink admobjsLink = new SecureBookmarkablePageLink( GlobalIds.ADMPOBJS_PAGE,
+            ObjectAdminPage.class, parameters, GlobalIds.ROLE_ADMINOBJS );
+        add( admobjsLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.RBAC_TYPE );
+        SecureBookmarkablePageLink permsLink = new SecureBookmarkablePageLink( GlobalIds.PERMS_PAGE, PermPage.class,
+            parameters, GlobalIds.ROLE_PERMS );
+        add( permsLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.ADMIN_TYPE );
+        SecureBookmarkablePageLink admpermsLink = new SecureBookmarkablePageLink( GlobalIds.ADMPERMS_PAGE,
+            PermAdminPage.class, parameters, GlobalIds.ROLE_ADMINPERMS );
+        add( admpermsLink );
+        SecureBookmarkablePageLink policiesLink = new SecureBookmarkablePageLink( GlobalIds.PWPOLICIES_PAGE,
+            PwPolicyPage.class, GlobalIds.ROLE_POLICIES );
+        add( policiesLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.SSD );
+        SecureBookmarkablePageLink ssdsLink = new SecureBookmarkablePageLink( GlobalIds.SSDS_PAGE,
+            SdStaticPage.class, parameters, GlobalIds.ROLE_SSDS );
+        add( ssdsLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.DSD );
+        SecureBookmarkablePageLink dsdsLink = new SecureBookmarkablePageLink( GlobalIds.DSDS_PAGE,
+            SdDynamicPage.class, parameters, GlobalIds.ROLE_DSDS );
+        add( dsdsLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, GlobalIds.USEROUS );
+        SecureBookmarkablePageLink userouLink = new SecureBookmarkablePageLink( GlobalIds.USEROUS_PAGE,
+            OuUserPage.class, parameters, GlobalIds.ROLE_USEROUS );
+        add( userouLink );
+        parameters = new PageParameters();
+        //parameters.set( GlobalIds.PAGE_TYPE, "PERMOUS" );
+        SecureBookmarkablePageLink permouLink = new SecureBookmarkablePageLink( GlobalIds.PERMOUS_PAGE,
+            OuPermPage.class, parameters, GlobalIds.ROLE_PERMOUS );
+        add( permouLink );
+
+        add( new SecureBookmarkablePageLink( GlobalIds.GROUP_PAGE, GroupPage.class,
+            GlobalIds.ROLE_GROUPS ) );
+
+        add( new SecureBookmarkablePageLink( GlobalIds.AUDIT_BINDS_PAGE, AuditBindPage.class,
+            GlobalIds.ROLE_AUDIT_BINDS ) );
+
+        add( new SecureBookmarkablePageLink( GlobalIds.AUDIT_AUTHZS_PAGE, AuditAuthzPage.class,
+            GlobalIds.ROLE_AUDIT_AUTHZS ) );
+
+        add( new SecureBookmarkablePageLink( GlobalIds.AUDIT_MODS_PAGE, AuditModPage.class,
+            GlobalIds.ROLE_AUDIT_MODS ) );
+
+        add( new Label( "footer", "Copyright (c) 2003-2014, The Apache Software Foundation. All Rights Reserved." ) );
+
+        final Link actionLink = new Link( "logout" )
+        {
+            @Override
+            public void onClick()
+            {
+                HttpServletRequest servletReq = ( HttpServletRequest ) getRequest().getContainerRequest();
+                servletReq.getSession().invalidate();
+                getSession().invalidate();
+                setResponsePage( LaunchPage.class );
+            }
+        };
+        add( actionLink );
+        HttpServletRequest servletReq = ( HttpServletRequest ) getRequest().getContainerRequest();
+
+        // RBAC Security Processing:
+        Principal principal = servletReq.getUserPrincipal();
+        // Is this a Java EE secured page && has the User successfully authenticated already?
+        boolean isSecured = principal != null;
+        if( isSecured && !isLoggedIn( ) )
+        {
+            String szPrincipal = principal.toString();
+            // Pull the RBAC session from the realm and assert into the Web app's session:
+            Session realmSession = GlobalUtils.deserialize(szPrincipal, Session.class);
+
+            // If this is null, app in container that cannot share rbac session with app, Must now create session manually:
+            if(realmSession == null)
+            {
+                realmSession = GlobalUtils.createRbacSession( accessMgr, principal.getName() );
+            }
+            if(realmSession != null)
+            {
+                synchronized ( ( RbacSession ) RbacSession.get() )
+                {
+                    GlobalUtils.loadPermissionsIntoSession( delAccessMgr, realmSession );
+                }
+            }
+            // give up
+            else
+            {
+                throw new RuntimeException( "cannot create RBAC session for user: " + principal.getName() );
+            }
+        }
+    }
+
+    private boolean isLoggedIn( )
+    {
+        boolean isLoggedIn = false;
+        if ( GlobalUtils.getRbacSession( this ) != null )
+        {
+            isLoggedIn = true;
+        }
+        return isLoggedIn;
+    }
+}
\ 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/FourWaySplitter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/FourWaySplitter.java b/src/main/java/org/apache/directory/fortress/web/FourWaySplitter.java
new file mode 100644
index 0000000..f8edccf
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/FourWaySplitter.java
@@ -0,0 +1,117 @@
+/*
+ *   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;
+
+import com.googlecode.wicket.kendo.ui.widget.splitter.IBorderLayout;
+import com.googlecode.wicket.kendo.ui.widget.splitter.SplitterBehavior;
+import org.apache.wicket.MarkupContainer;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * Date: 5/21/13
+ */
+public class FourWaySplitter implements IBorderLayout
+{
+    private String listPercentage;
+    private String detailPercentage;
+
+    public FourWaySplitter()
+    {
+        //init( "65", "26" );
+        init( "64", "36" );
+    }
+
+    public FourWaySplitter(String listPercentage, String detailPercentage)
+    {
+        init(listPercentage, detailPercentage);
+    }
+
+    private void init(String listPercentage, String detailPercentage)
+    {
+        this.listPercentage = listPercentage;
+        this.detailPercentage = detailPercentage;
+
+    }
+
+    public void addBorderLayout(MarkupContainer container)
+    {
+        //container.add(new SplitterBehavior("#vertical").setOption("panes", this.getVerticalPanes()).setOption("orientation", "'vertical'"));
+        //new SplitterBehavior("#vertical").setOption("panes", this.getVerticalPanes()).setOption("orientation", "'vertical'")
+        SplitterBehavior vertical = new SplitterBehavior("#vertical");
+        vertical.setOption("panes", this.getVerticalPanes()).setOption("orientation", "'vertical'");
+        // This jumbles the splitter view:
+        //vertical.setOption("cookie", "splitter1");
+        container.add(vertical);
+        //container.add(new SplitterBehavior("#horizontal").setOption("panes", this.getHorizontalPanes()));
+        SplitterBehavior horizontal = new SplitterBehavior("#horizontal");
+        horizontal.setOption("panes", this.getHorizontalPanes());
+        container.add(horizontal);
+        // does not work:
+        //horizontal.setOption("cookie", "splitter2");
+        /*
+        SplitterBehavior verticalSplitter = new SplitterBehavior("#vertical");
+        verticalSplitter.setOption("orientation", "'vertical'");
+        verticalSplitter.setOption("min", "'400px'");
+        verticalSplitter.setOption("max", "'800px'");
+        verticalSplitter.setOption("height", "'100%'");
+        verticalSplitter.setOption("size", "'60px'");
+        verticalSplitter.setOption("collapsible", "'false'");
+        container.add(verticalSplitter);
+        */
+
+        /*
+        SplitterBehavior horizontalSplitter = new SplitterBehavior("#horizontal");
+        horizontalSplitter.setOption("orientation", "'horizontal'");
+        horizontalSplitter.setOption("min", "'400px'");
+        horizontalSplitter.setOption("max", "'800px'");
+        horizontalSplitter.setOption("height", "'100%'");
+        horizontalSplitter.setOption("size", "'20%'");
+        horizontalSplitter.setOption("collapsible", "'true'");
+        container.add(horizontalSplitter);
+        */
+
+
+        //container.add(new SplitterBehavior("#vertical").setOption("panes", this.getVerticalPanes()).setOption("orientation", "'vertical'"));
+        //container.add(new SplitterBehavior("#horizontal").setOption("panes", this.getHorizontalPanes()));
+    }
+
+    @Override
+    public String getVerticalPanes()
+    {
+        //return "[ { resizable: false, size: '25%' }, {  }, { collapsible: true, size: '25%' } ]";
+        //return "[ { resizable: false, size: '15%' }, { resizable: true, size: '70%' }, { collapsible: true, size: '15%' } ]";
+        //return "[ { collapsible: true, resizable: false, size: '50px', min: '50px', max: '50px', scrollable: false }, { resizable: true, size: '80%' }, { collapsible: true, size: '5%', min: '50px'} ]";
+        //return "vertical";
+        //return "[ { collapsible: true, resizable: false, size: '50px', min: '50px', max: '50px', scrollable: false }, { resizable: true, size: '80%' }, { collapsible: true, size: '5%', min: '50px'} ]";
+        return "[ { collapsible: true, size: '92%' }, { collapsible: true, size: '8%'} ]";
+    }
+
+    @Override
+    public String getHorizontalPanes()
+    {
+        //return "[ { size: '15%' }, { }, { size: '15%' } ]";
+        //return "[ { collapsible: true, size: '78%' }, { size: '20%', max: '300px' } ]";
+        //return "[ { collapsible: true, size: '78%' }, { collapsible: true, size: '20%', min: '200px', max: '300px' } ]";
+        //return "[ { collapsible: true, size: '80%' }, { collapsible: true, size: '18%'} ]";
+        //return "[ { collapsible: true, resizable: false, size: '85px', min: '85x', max: '85px'}, { collapsible: true, size: '65%' }, { collapsible: true, size: '26%'} ]";
+        return "[ { collapsible: true, resizable: false, size: '85px', min: '85x', max: '85px'}, { collapsible: true, size: '" + this.listPercentage + "%' }, { collapsible: true, size: '" + this.detailPercentage + "%'} ]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/GlobalIds.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/GlobalIds.java b/src/main/java/org/apache/directory/fortress/web/GlobalIds.java
new file mode 100644
index 0000000..186497f
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/GlobalIds.java
@@ -0,0 +1,231 @@
+/*
+ *   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;
+
+/**
+ *
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class GlobalIds
+{
+    public static final String ROLE_USERS = "ROLE_USERS";
+    public static final String ROLE_ROLES = "ROLE_ROLES";
+    public static final String ROLE_PERMOBJS = "ROLE_PERMOBJS";
+    public static final String ROLE_PERMS = "ROLE_PERMS";
+    public static final String ROLE_SSDS = "ROLE_SSDS";
+    public static final String ROLE_DSDS = "ROLE_DSDS";
+    public static final String ROLE_USEROUS = "ROLE_USEROUS";
+    public static final String ROLE_PERMOUS = "ROLE_PERMOUS";
+    public static final String ROLE_POLICIES = "ROLE_POLICIES";
+    public static final String ROLE_ADMINROLES = "ROLE_ADMINROLES";
+    public static final String ROLE_ADMINOBJS = "ROLE_ADMINOBJS";
+    public static final String ROLE_ADMINPERMS = "ROLE_ADMINPERMS";
+    public static final String ROLE_AUDIT_AUTHZS = "ROLE_AUDIT_AUTHZS";
+    public static final String ROLE_AUDIT_BINDS = "ROLE_AUDIT_BINDS";
+    public static final String ROLE_AUDIT_MODS = "ROLE_AUDIT_MODS";
+    public static final String ROLE_GROUPS = "ROLE_GROUPS";
+    public static final String SSD = "SSD";
+    public static final String DSD = "DSD";
+    public static final String PAGE_TYPE = "type";
+    public static final String ADMIN_MGR = "org.apache.directory.fortress.core.rbac.AdminMgrImpl";
+    public static final String REVIEW_MGR = "org.apache.directory.fortress.core.rbac.ReviewMgrImpl";
+    public static final String DEL_ADMIN_MGR = "org.apache.directory.fortress.core.rbac.DelAdminMgrImpl";
+    public static final String DEL_REVIEW_MGR = "org.apache.directory.fortress.core.rbac.DelReviewMgrImpl";
+    public static final String PWPOLICY_MGR = "org.apache.directory.fortress.core.rbac.PwPolicyMgrImpl";
+    public static final String AUDIT_MGR = "org.apache.directory.fortress.core.rbac.AuditMgrImpl";
+    public static final String GROUP_MGR = "org.apache.directory.fortress.core.ldap.group.GroupMgrImpl";
+    public static final String ASSIGN_USER = "assignUser";
+    public static final String ADD = "add";
+    public static final String COMMIT = "commit";
+    public static final String DELETE = "delete";
+    public static final String CANCEL = "cancel";
+    public static final String TIMEOUT_ARC = "timeoutARC";
+    public static final String BEGIN_TIME_ARC = "beginTimeARC";
+    public static final String END_TIME_ARC = "endTimeARC";
+    public static final String BEGIN_DATE_ARC = "beginDateARC";
+    public static final String END_DATE_ARC = "endDateARC";
+    public static final String BEGIN_LOCK_DATE_ARC = "beginLockDateARC";
+    public static final String END_LOCK_DATE_ARC = "endLockDateARC";
+    public static final String BEGIN_TIME_RC = "beginTimeRC";
+    public static final String END_TIME_RC = "endTimeRC";
+    public static final String BEGIN_DATE_RC = "beginDateRC";
+    public static final String END_DATE_RC = "endDateRC";
+    public static final String BEGIN_LOCK_DATE_RC = "beginLockDateRC";
+    public static final String END_LOCK_DATE_RC = "endLockDateRC";
+    public static final String TIMEOUT_RC = "timeoutRC";
+    public static final String SUNDAY_RC = "sundayRC";
+    public static final String MONDAY_RC = "mondayRC";
+    public static final String TUESDAY_RC = "tuesdayRC";
+    public static final String WEDNESDAY_RC = "wednesdayRC";
+    public static final String THURSDAY_RC = "thursdayRC";
+    public static final String FRIDAY_RC = "fridayRC";
+    public static final String SATURDAY_RC = "saturdayRC";
+    public static final String ASSIGN = "assign";
+    public static final String ROLE_ASSIGNMENTS_LABEL = "roleAssignmentsLabel";
+    public static final String SELECT = "select";
+    public static final String SEARCH = "search";
+    public static final String CLEAR = "clear";
+    public static final String SEARCH_VAL = "searchVal";
+    public static final String MONDAY_ARC = "mondayARC";
+    public static final String TUESDAY_ARC = "tuesdayARC";
+    public static final String WEDNESDAY_ARC = "wednesdayARC";
+    public static final String THURSDAY_ARC = "thursdayARC";
+    public static final String FRIDAY_ARC = "fridayARC";
+    public static final String ASSIGN_ADMIN_ROLE = "assignAdminRole";
+    public static final String DESCRIPTION = "description";
+    public static final String EMAILS = "emails";
+    public static final String PHONES = "phones";
+    public static final String MOBILES = "mobiles";
+    public static final String ADDRESS_ASSIGNMENTS_LABEL = "addressAssignmentsLabel";
+    public static final String ADDRESSES = "addresses";
+    public static final String ADDRESS_CITY = "address.city";
+    public static final String ADDRESS_STATE = "address.state";
+    public static final String ADDRESS_COUNTRY = "address.country";
+    public static final String ADDRESS_POSTAL_CODE = "address.postalCode";
+    public static final String ADDRESS_POST_OFFICE_BOX = "address.postOfficeBox";
+    public static final String ADDRESS_BUILDING = "address.building";
+    public static final String ADDRESS_DEPARTMENT_NUMBER = "address.departmentNumber";
+    public static final String ADDRESS_ROOM_NUMBER = "address.roomNumber";
+    public static final String TEMPORAL_CONSTRAINTS_LABEL = "temporalConstraintsLabel";
+    public static final String BEGIN_TIME_P = "beginTimeP";
+    public static final String END_TIME_P = "endTimeP";
+    public static final String BEGIN_DATE_P = "beginDateP";
+    public static final String END_DATE_P = "endDateP";
+    public static final String BEGIN_LOCK_DATE_P = "beginLockDateP";
+    public static final String END_LOCK_DATE_P = "endLockDateP";
+    public static final String TIMEOUT_P = "timeoutP";
+    public static final String SUNDAY_P = "sundayP";
+    public static final String MONDAY_P = "mondayP";
+    public static final String TUESDAY_P = "tuesdayP";
+    public static final String WEDNESDAY_P = "wednesdayP";
+    public static final String THURSDAY_P = "thursdayP";
+    public static final String FRIDAY_P = "fridayP";
+    public static final String SATURDAY_P = "saturdayP";
+    public static final String SYSTEM_INFO_LABEL = "systemInfoLabel";
+    public static final String SYSTEM = "system";
+    public static final String CN = "cn";
+    public static final String SN = "sn";
+    public static final String IMPORT_PHOTO_LABEL = "importPhotoLabel";
+    public static final String SAVE = "save";
+    public static final String NAME = "name";
+    public static final String USER_ID = "userId";
+    public static final String PSWD_FIELD = "pswdField";
+    public static final String LOGIN = "login";
+    public static final String EMPLOYEE_TYPE = "employeeType";
+    public static final String TITLE = "title";
+    public static final String GROUP_PAGE = "groups";
+    public static final String AUDIT_AUTHZS_PAGE = "authzs";
+    public static final String AUDIT_MODS_PAGE = "mods";
+    public static final String AUDIT_BINDS_PAGE = "binds";
+    public static final String JPEGPHOTO = "jpegPhoto";
+    public static final String OU = "ou";
+    public static final String REQ_AUTHZ_ID = "reqAuthzID";
+    public static final String REQ_DN = "reqDN";
+    public static final String REQ_RESULT = "reqResult";
+    public static final String REQ_START = "reqStart";
+    public static final String REQ_ATTR = "reqAttr";
+    public static final String REQ_ATTRS_ONLY = "reqAttrsOnly";
+    public static final String REQ_DEREF_ALIASES = "reqDerefAliases";
+    public static final String AUTHZ_SUCCESS_CODE = "6";
+    public static final String BIND_SUCCESS_CODE = "0";
+    public static final String SUCCESS = "SUCCESS";
+    public static final String FAILURE = "FAILURE";
+    public static final String AUDIT_TIMESTAMP_FORMAT = "MM/dd/yyyy HH:mm:ss";
+    public static final String FIND_USERS = "findUsers";
+    public static final String FIND_PERMISSIONS = "findPermissions";
+    public static final String ONBLUR = "onblur";
+    public static final String ADDRESS_ADDRESSES = "address.addresses";
+    public static final String FT_MOD_ID = "ftModId";
+    public static final String FT_MODIFIER = "ftModifier";
+    public static final String FT_MOD_CODE = "ftModCode";
+
+    public static final String OBJ_NAME = "objName";
+    public static final String OP_NAME = "opName";
+    public static final String FAILED_ONLY = "failedOnly";
+    public static final String ADMIN = "admin";
+    public static final String GET_USER_AUTHZS = "getUserAuthZs";
+    public static final String GET_USER_BINDS = "searchBinds";
+    public static final String OBJECT_ID = "objId";
+    public static final String USERS_PAGE = "users";
+    public static final String ROLES_PAGE = "roles";
+    public static final String ADMROLES_PAGE = "admroles";
+    public static final String POBJS_PAGE = "pobjs";
+    public static final String ADMPERMS_PAGE = "admperms";
+    public static final String PERMS_PAGE = "perms";
+    public static final String PWPOLICIES_PAGE = "pwpolicies";
+    public static final String SSDS_PAGE = "ssds";
+    public static final String DSDS_PAGE = "dsds";
+    public static final String USEROUS_PAGE = "userous";
+    public static final String PERMOUS_PAGE = "permous";
+    public static final String ADMPOBJS_PAGE = "admpobjs";
+    public static final String WINDOW_LOCATION_REPLACE_COMMANDER_HOME_HTML = "window.location.replace(\"/fortress-web/home.html\");";
+
+    public static final String WICKET_WINDOW_UNLOAD_CONFIRMATION_FALSE = "Wicket.Window.unloadConfirmation = false;";
+    public static final String ADD_USER = "addUser";
+    public static final String UPDATE_USER = "updateUser";
+    public static final String DELETE_USER = "deleteUser";
+    public static final String DEASSIGN = "deassign";
+    public static final String DEASSIGN_USER = "deassignUser";
+    public static final String NAVPANEL = "navpanel";
+    public static final String INFOPANEL = "infopanel";
+    public static final String OBJECTLISTPANEL = "objectlistpanel";
+    public static final String OBJECTDETAILPANEL = "objectdetailpanel";
+    public static final String OULISTPANEL = "oulistpanel";
+    public static final String OUDETAILPANEL = "oudetailpanel";
+    public static final String PERMLISTPANEL = "permlistpanel";
+    public static final String PERMDETAILPANEL = "permdetailpanel";
+    public static final String ROLELISTPANEL = "rolelistpanel";
+    public static final String ROLEDETAILPANEL = "roledetailpanel";
+    public static final String SDLISTPANEL = "sdlistpanel";
+    public static final String SDDETAILPANEL = "sddetailpanel";
+    public static final String GROUPLISTPANEL = "grouplistpanel";
+    public static final String GROUPDETAILPANEL = "groupdetailpanel";
+    public static final String LAYOUT = "layout";
+    public static final String PAGE_HEADER = "pageHeader";
+    public static final String DETAIL_FIELDS = "detailFields";
+    public static final String EDIT_FIELDS = "editFields";
+    public static final String USERAUDITDETAILPANEL = "userauditdetailpanel";
+    public static final String BEGIN_DATE = "beginDate";
+    public static final String END_DATE = "endDate";
+
+    public static final String FIND_ROLES = "findRoles";
+    public static final String ROLEAUXPANEL = "roleauxpanel";
+    public static final String ADD_ROLE = "addRole";
+    public static final String UPDATE_ROLE = "updateRole";
+    public static final String DELETE_ROLE = "deleteRole";
+    public static final String PARENTS = "parents";
+    public static final String OS_P = "osP";
+    public static final String OS_U = "osU";
+    public static final String BEGIN_RANGE = "beginRange";
+    public static final String BEGIN_INCLUSIVE = "beginInclusive";
+    public static final String END_RANGE = "endRange";
+    public static final String END_INCLUSIVE = "endInclusive";
+    public static final String PERMOU_SEARCH = "permou.search";
+    public static final String USEROU_SEARCH = "userou.search";
+    public static final String BEGIN_RANGE_SEARCH = "beginRange.search";
+    public static final String END_RANGE_SEARCH = "endRange.search";
+    public static final String PARENTROLES_SEARCH = "parentroles.search";
+    public static final String POLICY_SEARCH = "policy.search";
+    public static final String OU_SEARCH = "ou.search";
+    public static final String ROLES_SEARCH = "roles.search";
+    public static final String FIELD_2 = "field2";
+    public static final String FIELD_1 = "field1";
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/GlobalUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/GlobalUtils.java b/src/main/java/org/apache/directory/fortress/web/GlobalUtils.java
new file mode 100644
index 0000000..4a26bc7
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/GlobalUtils.java
@@ -0,0 +1,346 @@
+/*
+ *   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;
+
+import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
+import org.apache.directory.api.ldap.model.name.Rdn;
+import org.apache.directory.fortress.core.*;
+import org.apache.log4j.Logger;
+import org.apache.wicket.Component;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.string.StringValue;
+import org.apache.directory.api.ldap.model.name.Dn;
+import org.apache.directory.fortress.core.rbac.AuthZ;
+import org.apache.directory.fortress.core.rbac.Permission;
+import org.apache.directory.fortress.core.rbac.Session;
+import org.apache.directory.fortress.core.rbac.User;
+import org.apache.directory.fortress.core.util.attr.VUtil;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ *
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class GlobalUtils
+{
+    private static final Logger LOG = Logger.getLogger( GlobalUtils.class.getName() );
+
+    public static Session getRbacSession( Component component )
+    {
+        return ( ( RbacSession ) component.getSession() ).getRbacSession();
+    }
+
+    public static Session createRbacSession( AccessMgr accessMgr, String userId )
+    {
+        Session session;
+        try
+        {
+            // Create an RBAC session and attach to Wicket session:
+            session = accessMgr.createSession( new User( userId ), true );
+            String message = "RBAC Session successfully created for userId: " + session.getUserId();
+            LOG.debug( message );
+        }
+        catch ( org.apache.directory.fortress.core.SecurityException se )
+        {
+            String error = "createRbacSession caught SecurityException=" + se;
+            LOG.error( error );
+            throw new RuntimeException( error );
+        }
+        return session;
+    }
+
+    public static void loadPermissionsIntoSession( DelAccessMgr delAccessMgr, Session session)
+    {
+        try
+        {
+            // Retrieve user permissions and attach RBAC session to Wicket session:
+            ( ( RbacSession ) RbacSession.get() ).setSession( session );
+            List<Permission> permissions = delAccessMgr.sessionPermissions( session );
+            ( ( RbacSession ) RbacSession.get() ).setPermissions( permissions );
+            String message = "RBAC Session successfully created for userId: " + session.getUserId();
+            LOG.debug( message );
+        }
+        catch ( org.apache.directory.fortress.core.SecurityException se )
+        {
+            String error = "loadPermissionsIntoSession caught SecurityException=" + se;
+            LOG.error( error );
+            throw new RuntimeException( error );
+        }
+    }
+
+    public static List<Permission> getRbacPermissions( Component component )
+    {
+        return ( ( RbacSession ) component.getSession() ).getPermissions();
+    }
+
+    public static boolean isAuthorized( String roleName, HttpServletRequest servletReq )
+    {
+        boolean isAuthorized = false;
+        if ( servletReq.isUserInRole( roleName ) )
+        {
+            isAuthorized = true;
+        }
+        return isAuthorized;
+    }
+
+    public static boolean isFound( Permission permission, Component component )
+    {
+        List<Permission> permissions = GlobalUtils.getRbacPermissions( component );
+        return VUtil.isNotNullOrEmpty( permissions ) && permissions.contains( permission );
+    }
+
+    /**
+     * This utility method can deserialize any object but is used to convert java.security.Principal to Fortress RBAC session object.
+     *
+     * @param str contains String to deserialize
+     * @param cls contains class to use for destination object
+     * @return deserialization target object
+     */
+    public static <T> T deserialize(String str, Class<T> cls)
+    {
+        // deserialize the object
+        try
+        {
+            // This encoding induces a bijection between byte[] and String (unlike UTF-8)
+            byte b[] = str.getBytes("ISO-8859-1");
+            ByteArrayInputStream bi = new ByteArrayInputStream(b);
+            ObjectInputStream si = new ObjectInputStream(bi);
+            return cls.cast(si.readObject());
+        }
+        catch (java.io.UnsupportedEncodingException e)
+        {
+            LOG.warn( "deserialize caught UnsupportedEncodingException:" + e);
+        }
+        catch (IOException e)
+        {
+            LOG.warn( "deserialize caught IOException:" + e);
+        }
+        catch (ClassNotFoundException e)
+        {
+            LOG.warn( "deserialize caught ClassNotFoundException:" + e);
+        }
+        // this method failed so return null
+        return null;
+    }
+
+    public static String getPageType( PageParameters parameters )
+    {
+        String pageType = null;
+        if ( parameters != null )
+        {
+            List<StringValue> values = parameters.getValues( GlobalIds.PAGE_TYPE );
+            if ( values != null && values.size() > 0 )
+            {
+                pageType = values.get( 0 ).toString();
+            }
+        }
+        return pageType;
+    }
+
+    public static void mapAuthZPerm( AuthZ authZ )
+    {
+        //// ftOpNm=addUser,ftObjNm=org.apache.directory.fortress.core.rbac.AdminMgrImpl,ou=AdminPerms,ou=ARBAC,dc=jts,dc=us
+        // ftObjId=006+ftOpNm=TOP1_6,ftObjNm=TOB1_4,ou=Permissions,ou=RBAC,dc=jts,dc=us
+        String raw = authZ.getReqDN();
+
+        // TODO: use fortress GlobalIds instead:
+        final String OBJ_ID = "ftObjId";
+        final String OBJ_NM = "ftObjNm";
+        final String OP_NM = "ftOpNm";
+
+        // TODO: fix this mapping:
+        //reqDerefAliases
+        //reqAttr
+        //reqAttrsOnly
+
+        //Permission perm = new Permission();
+        int bindx = raw.indexOf( OBJ_ID );
+        if ( bindx != -1 )
+        {
+            int eindx = raw.indexOf( "+" );
+            if ( eindx != -1 )
+            {
+                authZ.setReqDerefAliases( raw.substring( bindx + OBJ_ID.length() + 1, eindx ) );
+            }
+        }
+        bindx = raw.indexOf( OBJ_NM );
+        if ( bindx != -1 )
+        {
+            int eindx = raw.substring( bindx ).indexOf( "," );
+            if ( eindx != -1 )
+            {
+                eindx += bindx;
+                authZ.setReqAttr( raw.substring( bindx + OBJ_NM.length() + 1, eindx ) );
+            }
+        }
+        bindx = raw.indexOf( OP_NM );
+        if ( bindx != -1 )
+        {
+            int eindx = raw.substring( bindx ).indexOf( "," );
+            if ( eindx != -1 )
+            {
+                eindx += bindx;
+                authZ.setReqAttrsOnly( raw.substring( bindx + OP_NM.length() + 1, eindx ) );
+            }
+        }
+    }
+
+    public static Permission getAuthZPerm( String raw )
+    {
+        //// ftOpNm=addUser,ftObjNm=org.apache.directory.fortress.core.rbac.AdminMgrImpl,ou=AdminPerms,ou=ARBAC,dc=jts,dc=us
+        // ftObjId=006+ftOpNm=TOP1_6,ftObjNm=TOB1_4,ou=Permissions,ou=RBAC,dc=jts,dc=us
+
+        // TODO: use fortress GlobalIds instead:
+        final String OBJ_ID = "ftObjId";
+        final String OBJ_NM = "ftObjNm";
+        final String OP_NM = "ftOpNm";
+        Permission perm = new Permission();
+        int bindx = raw.indexOf( OBJ_ID );
+        if ( bindx != -1 )
+        {
+            int eindx = raw.indexOf( "+" );
+            if ( eindx != -1 )
+            {
+                perm.setObjId( raw.substring( bindx + OBJ_ID.length() + 1, eindx ) );
+            }
+        }
+        bindx = raw.indexOf( OBJ_NM );
+        if ( bindx != -1 )
+        {
+            int eindx = raw.substring( bindx ).indexOf( "," );
+            if ( eindx != -1 )
+            {
+                eindx += bindx;
+                perm.setObjName( raw.substring( bindx + OBJ_NM.length() + 1, eindx ) );
+            }
+        }
+        bindx = raw.indexOf( OP_NM );
+        if ( bindx != -1 )
+        {
+            int eindx = raw.substring( bindx ).indexOf( "," );
+            if ( eindx != -1 )
+            {
+                eindx += bindx;
+                perm.setOpName( raw.substring( bindx + OP_NM.length() + 1, eindx ) );
+            }
+        }
+        return perm;
+    }
+
+    public static String getAuthZId( String inputString )
+    {
+        //reqAuthzID: uid=fttu3user4,ou=people,dc=jts,dc=com
+        String userId = null;
+        if ( inputString != null && inputString.length() > 0 )
+        {
+            StringTokenizer maxTkn = new StringTokenizer( inputString, "," );
+            if ( maxTkn.countTokens() > 0 )
+            {
+                String val = maxTkn.nextToken();
+                int indx = val.indexOf( '=' );
+                if ( indx >= 1 )
+                {
+                    userId = val.substring( indx + 1 );
+                }
+            }
+        }
+        return userId;
+    }
+
+    public static User getUser( ReviewMgr reviewMgr, String userId )
+    {
+        User user = null;
+        try
+        {
+            user = reviewMgr.readUser( new User( userId ) );
+        }
+        catch ( org.apache.directory.fortress.core.SecurityException se )
+        {
+            String error = "SecurityException=" + se;
+            LOG.warn( error );
+
+        }
+        return user;
+    }
+
+
+    public static User getUserByInternalId( ReviewMgr reviewMgr, String internalId )
+    {
+        User user = null;
+        try
+        {
+            User inUser = new User();
+            inUser.setInternalId( internalId );
+            List<User> users = reviewMgr.findUsers( inUser );
+            if ( VUtil.isNotNullOrEmpty( users ) )
+            {
+                if ( users.size() > 1 )
+                {
+                    String error = "Found: " + users.size() + " users matching internalId: " + internalId;
+                    LOG.warn( error );
+                }
+                user = users.get( 0 );
+            }
+            else
+            {
+                String error = "Can't find user matching internalId: " + internalId;
+                LOG.warn( error );
+            }
+        }
+        catch ( org.apache.directory.fortress.core.SecurityException se )
+        {
+            String error = "SecurityException=" + se;
+            LOG.warn( error );
+
+        }
+        return user;
+    }
+
+    /**
+     * Method will retrieve the relative distinguished name from a distinguished name variable.
+     *
+     * @param szDn contains ldap distinguished name.
+     * @return rDn as string.
+     */
+    public static String getRdn( String szDn )
+    {
+        String szRdn = null;
+        try
+        {
+            Dn dn = new Dn( szDn );
+            Rdn rDn = dn.getRdn();
+            szRdn = rDn.getName();
+        }
+        catch ( LdapInvalidDnException e )
+        {
+            String error = "GlobalUtils.getRdn dn: " + szDn + ", caught LdapInvalidDnException:" + e;
+            throw new RuntimeException( error );
+
+        }
+        return szRdn;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/GroupListModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/GroupListModel.java b/src/main/java/org/apache/directory/fortress/web/GroupListModel.java
new file mode 100644
index 0000000..0183da7
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/GroupListModel.java
@@ -0,0 +1,135 @@
+/*
+ *   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;
+
+import org.apache.log4j.Logger;
+import org.apache.wicket.injection.Injector;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.directory.fortress.core.ldap.group.Group;
+import org.apache.directory.fortress.core.ldap.group.GroupMgr;
+import org.apache.directory.fortress.core.rbac.Session;
+import org.apache.directory.fortress.core.rbac.User;
+import org.apache.directory.fortress.core.util.attr.VUtil;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * @param <T>
+ */
+public class GroupListModel<T extends Serializable> extends Model
+{
+    @SpringBean
+    private GroupMgr groupMgr;
+    private static final Logger log = Logger.getLogger(GroupListModel.class.getName());
+    private transient Group group;
+    private transient List<Group> groups = null;
+
+    /**
+     * Default constructor
+     */
+    public GroupListModel(final Session session)
+    {
+        Injector.get().inject(this);
+        this.groupMgr.setAdmin( session );
+    }
+
+    /**
+     * Group contains the search arguments.
+     *
+     * @param group
+     */
+    public GroupListModel(Group group, final Session session)
+    {
+        Injector.get().inject(this);
+        this.group = group;
+        this.groupMgr.setAdmin( session );
+    }
+
+    /**
+     * This data is bound for {@link org.apache.directory.fortress.web.panel.ObjectListPanel}
+     *
+     * @return T extends List<User> users data will be bound to panel data view component.
+     */
+    @Override
+    public T getObject()
+    {
+        if (groups != null)
+        {
+            log.debug(".getObject count: " + group != null ? groups.size() : "null");
+            return (T) groups;
+        }
+        if (group == null)
+        {
+            log.debug(".getObject null");
+            groups = new ArrayList<Group>();
+        }
+        else
+        {
+            log.debug(".getObject group name: " + group != null ? group.getName() : "null");
+            groups = getList(group);
+        }
+        return (T) groups;
+    }
+
+    @Override
+    public void setObject(Object object)
+    {
+        log.debug(".setObject count: " + object != null ? ((List<Group>)object).size() : "null");
+        this.groups = (List<Group>) object;
+    }
+
+    @Override
+    public void detach()
+    {
+        //log.debug(".detach");
+        this.groups = null;
+        this.group = null;
+    }
+
+    public List<Group> getList(Group group)
+    {
+        List<Group> groupList = null;
+        try
+        {
+            if( VUtil.isNotNullOrEmpty( group.getMembers() ))
+            {
+                String userId = group.getMembers().get( 0 );
+                log.debug(".getList group name: " + group != null ? group.getName() : "null");
+                groupList = groupMgr.find( new User( userId ) );
+            }
+            else
+            {
+                log.debug(".getList group name: " + group != null ? group.getName() : "null");
+                groupList = groupMgr.find( group );
+            }
+        }
+        catch (org.apache.directory.fortress.core.SecurityException se)
+        {
+            String error = ".getList caught SecurityException=" + se;
+            log.warn(error);
+        }
+        return groupList;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/GroupPage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/GroupPage.java b/src/main/java/org/apache/directory/fortress/web/GroupPage.java
new file mode 100644
index 0000000..835d7cd
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/GroupPage.java
@@ -0,0 +1,75 @@
+/*
+ *   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;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.directory.fortress.web.panel.Displayable;
+import org.apache.directory.fortress.web.panel.GroupDetailPanel;
+import org.apache.directory.fortress.web.panel.GroupListPanel;
+import org.apache.directory.fortress.web.panel.InfoPanel;
+import org.apache.directory.fortress.web.panel.NavPanel;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class GroupPage extends FortressWebBasePage
+{
+    private String label = "LDAP Group Page";
+    public GroupPage(PageParameters parameters)
+    {
+        add(new Label(GlobalIds.PAGE_HEADER, label));
+        WebMarkupContainer container = new WebMarkupContainer(GlobalIds.LAYOUT);
+        FourWaySplitter splitter = new FourWaySplitter();
+        splitter.addBorderLayout(container);
+
+        // Add the four necessary panels for Commander Page: 1. Nav,, 2. List, 3. Info, 4. Detail
+        // Nav and Info are generic and work across all entities, the others are specific to this entity type.
+
+        // 1. Nav Panel:
+        NavPanel navPanel = new NavPanel(GlobalIds.NAVPANEL);
+
+        // 2. List Panel:
+        container.add(new AjaxLazyLoadPanel(GlobalIds.GROUPLISTPANEL)
+         {
+           @Override
+           public Component getLazyLoadComponent(String id)
+           {
+                return new GroupListPanel( id );
+           }
+         });
+
+        // 3. Info Panel:
+        InfoPanel infoPanel = new InfoPanel(GlobalIds.INFOPANEL);
+        container.add(infoPanel);
+
+        // 4. Detail Panel:
+        Displayable display = infoPanel.getDisplay();
+        GroupDetailPanel groupDetail = new GroupDetailPanel( GlobalIds.GROUPDETAILPANEL, display );
+        container.add(groupDetail);
+
+        container.add(navPanel);
+        this.add(container);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/HomePageApplication.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/HomePageApplication.java b/src/main/java/org/apache/directory/fortress/web/HomePageApplication.java
new file mode 100644
index 0000000..9ba9196
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/HomePageApplication.java
@@ -0,0 +1,47 @@
+/*
+ *   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;
+
+import org.apache.wicket.Page;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class HomePageApplication extends ApplicationContext
+{
+	/**
+	 * @see org.apache.wicket.Application#getHomePage()
+	 */
+	@Override
+	public Class<? extends Page> getHomePage()
+	{
+        return LaunchPage.class;
+	}
+
+	@Override
+	public void init()
+	{
+		super.init();
+        //mountPage("index.html", LoginPage.class);
+        mountPage("index.html", LaunchPage.class);
+        mountPage("home.html", LaunchPage.class);
+	}
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/LaunchPage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/LaunchPage.java b/src/main/java/org/apache/directory/fortress/web/LaunchPage.java
new file mode 100644
index 0000000..44dc874
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/LaunchPage.java
@@ -0,0 +1,44 @@
+/*
+ *   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;
+
+
+import org.apache.wicket.markup.html.basic.Label;
+
+import javax.servlet.http.HttpServletRequest;
+import java.security.Principal;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class LaunchPage extends FortressWebBasePage
+{
+    public LaunchPage()
+    {
+        HttpServletRequest servletReq = (HttpServletRequest)getRequest().getContainerRequest();
+        Principal principal = servletReq.getUserPrincipal();
+        if(principal == null)
+        {
+            setResponsePage(LoginPage.class);
+        }
+        add(new Label("label1", "Click on a link above for RBAC administration."));
+    }
+}
\ 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/LoginPage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/LoginPage.java b/src/main/java/org/apache/directory/fortress/web/LoginPage.java
new file mode 100644
index 0000000..d5c98a3
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/LoginPage.java
@@ -0,0 +1,105 @@
+/*
+ *   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;
+
+import org.apache.log4j.Logger;
+import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.PasswordTextField;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.request.http.handler.RedirectRequestHandler;
+import org.apache.directory.fortress.core.util.attr.VUtil;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import java.security.Principal;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public final class LoginPage extends FortressWebBasePage
+{
+    private static final Logger LOG = Logger.getLogger( LoginPage.class.getName() );
+
+    public LoginPage()
+    {
+        LoginPageForm loginForm = new LoginPageForm( "loginFields" );
+        add( loginForm );
+    }
+
+    public class LoginPageForm extends Form
+    {
+        private String pswdField;
+        private String userId;
+
+        public LoginPageForm( String id )
+        {
+            super( id );
+            HttpServletRequest servletReq = ( HttpServletRequest ) getRequest().getContainerRequest();
+            Principal principal = servletReq.getUserPrincipal();
+            if ( principal != null )
+            {
+                LOG.info( "user already logged in, route to launch page instead" );
+                setResponsePage( LaunchPage.class );
+            }
+            add( new Button( "login" ) );
+            TextField userId = new TextField( "userId", new PropertyModel<String>( this, "userId" ) );
+            add( userId );
+            PasswordTextField pw = new PasswordTextField( "pswdField", new PropertyModel<String>( this, "pswdField" ) );
+            pw.setRequired( false );
+            add( pw );
+        }
+
+        @Override
+        protected void onSubmit()
+        {
+            System.out.println( "form was submitted!" );
+            HttpServletRequest servletReq = ( HttpServletRequest ) getRequest().getContainerRequest();
+            Principal principal = servletReq.getUserPrincipal();
+            if ( principal == null )
+            {
+                if ( VUtil.isNotNullOrEmpty( userId ) && VUtil.isNotNullOrEmpty( pswdField ) )
+                {
+                    try
+                    {
+                        servletReq.login( userId, pswdField );
+                        setResponsePage( LaunchPage.class );
+                    }
+                    catch ( ServletException se )
+                    {
+                        String error = "Login form caught ServletException=" + se;
+                        LOG.error( error );
+                        getRequestCycle().replaceAllRequestHandlers(new RedirectRequestHandler("/login/error.html"));
+                    }
+                }
+                else
+                {
+                    LOG.debug( "null userid or password detected" );
+                }
+            }
+            else
+            {
+                setResponsePage( LaunchPage.class );
+            }
+        }
+    }
+}
\ 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/OUListModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/OUListModel.java b/src/main/java/org/apache/directory/fortress/web/OUListModel.java
new file mode 100644
index 0000000..9350eb5
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/OUListModel.java
@@ -0,0 +1,125 @@
+/*
+ *   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;
+
+import org.apache.log4j.Logger;
+import org.apache.wicket.injection.Injector;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.directory.fortress.core.DelReviewMgr;
+import org.apache.directory.fortress.core.rbac.OrgUnit;
+import org.apache.directory.fortress.core.rbac.Session;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * @param <T>
+ */
+public class OUListModel<T extends Serializable> extends Model
+{
+    @SpringBean
+    private DelReviewMgr delReviewMgr;
+    private static final Logger log = Logger.getLogger( OUListModel.class.getName() );
+    private transient OrgUnit orgUnit;
+    private transient List<OrgUnit> orgUnits = null;
+
+    /**
+     * Default constructor
+     */
+    public OUListModel( boolean isUser, final Session session )
+    {
+        Injector.get().inject( this );
+        this.delReviewMgr.setAdmin( session );
+    }
+
+    /**
+     * User contains the search arguments.
+     *
+     * @param orgUnit
+     */
+    public OUListModel( OrgUnit orgUnit, final Session session )
+    {
+        Injector.get().inject( this );
+        this.orgUnit = orgUnit;
+        this.delReviewMgr.setAdmin( session );
+    }
+
+    /**
+     * This data is bound for SDListPanel
+     *
+     * @return T extends List<OrgUnit> orgUnits data will be bound to panel data view component.
+     */
+    @Override
+    public T getObject()
+    {
+        if ( orgUnits != null )
+        {
+            log.debug( ".getObject count: " + orgUnit != null ? orgUnits.size() : "null" );
+            return ( T ) orgUnits;
+        }
+        if ( orgUnit == null )
+        {
+            log.debug( ".getObject null" );
+            orgUnits = new ArrayList<OrgUnit>();
+        }
+        else
+        {
+            log.debug( ".getObject orgUnitNm: " + orgUnit != null ? orgUnit.getName() : "null" );
+            orgUnits = getList( orgUnit );
+        }
+        return ( T ) orgUnits;
+    }
+
+    @Override
+    public void setObject( Object object )
+    {
+        log.debug( ".setObject count: " + object != null ? ( ( List<OrgUnit> ) object ).size() : "null" );
+        this.orgUnits = ( List<OrgUnit> ) object;
+    }
+
+    @Override
+    public void detach()
+    {
+        //log.debug( ".detach" );
+        this.orgUnits = null;
+        this.orgUnit = null;
+    }
+
+    private List<OrgUnit> getList( OrgUnit orgUnit )
+    {
+        List<OrgUnit> orgUnitList = null;
+        try
+        {
+            String szOrgUnitNm = orgUnit != null && orgUnit.getName() != null ? orgUnit.getName() : "";
+            log.debug( ".getList orgUnitNm: " + szOrgUnitNm );
+            orgUnitList = delReviewMgr.search( orgUnit.getType(), orgUnit.getName() );
+        }
+        catch ( org.apache.directory.fortress.core.SecurityException se )
+        {
+            String error = ".getList caught SecurityException=" + se;
+            log.warn( error );
+        }
+        return orgUnitList;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-commander/blob/547b9ccd/src/main/java/org/apache/directory/fortress/web/ObjectAdminPage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/ObjectAdminPage.java b/src/main/java/org/apache/directory/fortress/web/ObjectAdminPage.java
new file mode 100644
index 0000000..a8e6bac
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/ObjectAdminPage.java
@@ -0,0 +1,76 @@
+/*
+ *   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;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.directory.fortress.web.panel.Displayable;
+import org.apache.directory.fortress.web.panel.InfoPanel;
+import org.apache.directory.fortress.web.panel.NavPanel;
+import org.apache.directory.fortress.web.panel.ObjectDetailPanel;
+import org.apache.directory.fortress.web.panel.ObjectListPanel;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ */
+public class ObjectAdminPage extends FortressWebBasePage
+{
+    private boolean isAdmin = true;
+    private String label = "Administrative Permission Object Page";
+    public ObjectAdminPage(PageParameters parameters)
+    {
+        add(new Label(GlobalIds.PAGE_HEADER, label));
+        WebMarkupContainer container = new WebMarkupContainer(GlobalIds.LAYOUT);
+        FourWaySplitter splitter = new FourWaySplitter();
+        splitter.addBorderLayout(container);
+
+        // Add the four necessary panels for Commander Page: 1. Nav,, 2. List, 3. Info, 4. Detail
+        // Nav and Info are generic and work across all entities, the others are specific to this entity type.
+
+        // 1. Nav Panel:
+        NavPanel navPanel = new NavPanel(GlobalIds.NAVPANEL);
+
+        // 2. List Panel:
+        container.add(new AjaxLazyLoadPanel( GlobalIds.OBJECTLISTPANEL )
+         {
+           @Override
+           public Component getLazyLoadComponent(String id)
+           {
+                return new ObjectListPanel( id, isAdmin );
+           }
+         });
+
+        // 3. Info Panel:
+        InfoPanel infoPanel = new InfoPanel(GlobalIds.INFOPANEL);
+        container.add(infoPanel);
+
+        // 4. Detail Panel:
+        Displayable display = infoPanel.getDisplay();
+        ObjectDetailPanel objectDetail = new ObjectDetailPanel( GlobalIds.OBJECTDETAILPANEL, display, isAdmin );
+        container.add(objectDetail);
+
+        container.add(navPanel);
+        this.add(container);
+    }
+}
\ 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/ObjectListModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/web/ObjectListModel.java b/src/main/java/org/apache/directory/fortress/web/ObjectListModel.java
new file mode 100644
index 0000000..c0efe84
--- /dev/null
+++ b/src/main/java/org/apache/directory/fortress/web/ObjectListModel.java
@@ -0,0 +1,143 @@
+/*
+ *   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;
+
+import org.apache.log4j.Logger;
+import org.apache.wicket.injection.Injector;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.directory.fortress.core.ReviewMgr;
+import org.apache.directory.fortress.core.rbac.OrgUnit;
+import org.apache.directory.fortress.core.rbac.PermObj;
+import org.apache.directory.fortress.core.rbac.Session;
+import org.apache.directory.fortress.core.util.attr.VUtil;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Shawn McKinney
+ * @version $Rev$
+ * @param <T>
+ */
+public class ObjectListModel<T extends Serializable> extends Model
+{
+    @SpringBean
+    private ReviewMgr reviewMgr;
+    private static final Logger log = Logger.getLogger(ObjectListModel.class.getName());
+    private transient PermObj permObj;
+    private transient List<PermObj> permObjs = null;
+    private boolean isAdmin;
+
+    /**
+     * Default constructor
+     */
+    public ObjectListModel(final boolean isAdmin, final Session session)
+    {
+        Injector.get().inject(this);
+        this.isAdmin = isAdmin;
+        this.reviewMgr.setAdmin( session );
+    }
+
+    /**
+     * User contains the search arguments.
+     *
+     * @param permObj
+     */
+    public ObjectListModel(PermObj permObj, final boolean isAdmin, final Session session)
+    {
+        Injector.get().inject(this);
+        this.permObj = permObj;
+        this.isAdmin = isAdmin;
+        this.reviewMgr.setAdmin( session );
+    }
+
+
+
+    /**
+     * This data is bound for {@link org.apache.directory.fortress.web.panel.ObjectListPanel}
+     *
+     * @return T extends List<User> users data will be bound to panel data view component.
+     */
+    @Override
+    public T getObject()
+    {
+        if (permObjs != null)
+        {
+            log.debug(".getObject count: " + permObj != null ? permObjs.size() : "null");
+            return (T) permObjs;
+        }
+        if (permObj == null)
+        {
+            log.debug(".getObject null");
+            permObjs = new ArrayList<PermObj>();
+        }
+        else
+        {
+            log.debug(".getObject userId: " + permObj != null ? permObj.getObjName() : "null");
+            permObjs = getList(permObj);
+        }
+        return (T) permObjs;
+    }
+
+    @Override
+    public void setObject(Object object)
+    {
+        log.debug(".setObject count: " + object != null ? ((List<PermObj>)object).size() : "null");
+        this.permObjs = (List<PermObj>) object;
+    }
+
+    @Override
+    public void detach()
+    {
+        //log.debug(".detach");
+        this.permObjs = null;
+        this.permObj = null;
+    }
+
+    public List<PermObj> getList(PermObj permObj)
+    {
+        List<PermObj> permObjList = null;
+        try
+        {
+            log.debug(".getList permObjectName: " + permObj != null ? permObj.getObjName() : "null");
+            if(VUtil.isNotNullOrEmpty(permObj.getOu()))
+            {
+                // TODO: make this work with administrative permissions:
+                permObjList = reviewMgr.findPermObjs( new OrgUnit( permObj.getOu() ) );
+            }
+            else
+            {
+                if(isAdmin)
+                {
+                    permObj.setAdmin( true );
+                }
+                permObjList = reviewMgr.findPermObjs( permObj );
+            }
+        }
+        catch (org.apache.directory.fortress.core.SecurityException se)
+        {
+            String error = ".getList caught SecurityException=" + se;
+            log.warn(error);
+        }
+        return permObjList;
+    }
+}