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