/*!
* Copyright 2010 - 2015 Pentaho Corporation. All rights reserved.
*
* Licensed 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.pentaho.di.ui.repository.pur.repositoryexplorer.model;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.repository.pur.model.IRole;
import org.pentaho.di.ui.repository.pur.repositoryexplorer.IUIRole;
import org.pentaho.di.ui.repository.pur.services.IRoleSupportSecurityManager;
import org.pentaho.di.ui.repository.repositoryexplorer.model.IUIUser;
import org.pentaho.di.ui.repository.repositoryexplorer.model.UISecurity.Mode;
import org.pentaho.ui.xul.XulEventSourceAdapter;
import org.pentaho.ui.xul.util.AbstractModelList;
public class UISecurityRole extends XulEventSourceAdapter implements java.io.Serializable {
private static final long serialVersionUID = -2525642001107996480L; /* EESOURCE: UPDATE SERIALVERUID */
private Mode mode;
private List<IUIUser> availableUsers;
private AbstractModelList<IUIUser> assignedUsers;
private List<IUIUser> availableSelectedUsers = new ArrayList<IUIUser>();
private List<IUIUser> assignedSelectedUsers = new ArrayList<IUIUser>();
private boolean userAssignmentPossible;
private boolean userUnassignmentPossible;
private String name;
private String description;
public UISecurityRole() {
availableUsers = new ArrayList<IUIUser>();
assignedUsers = new AbstractModelList<IUIUser>();
assignedUsers.addPropertyChangeListener( "children", //$NON-NLS-1$
new PropertyChangeListener() {
public void propertyChange( PropertyChangeEvent evt ) {
List<IUIUser> previousValue = getPreviousSelectedUsers();
UISecurityRole.this.firePropertyChange( "selectedUsers", //$NON-NLS-1$
previousValue, assignedUsers );
}
} );
description = null;
name = null;
}
public List<IUIUser> getAvailableSelectedUsers() {
return availableSelectedUsers;
}
public void setAvailableSelectedUsers( List<Object> availableSelectedUsers ) {
List<Object> previousVal = new ArrayList<Object>();
previousVal.addAll( this.availableSelectedUsers );
this.availableSelectedUsers.clear();
if ( availableSelectedUsers != null && availableSelectedUsers.size() > 0 ) {
for ( Object user : availableSelectedUsers ) {
this.availableSelectedUsers.add( (IUIUser) user );
}
}
this.firePropertyChange( "availableSelectedUsers", previousVal, this.availableSelectedUsers ); //$NON-NLS-1$
fireUserAssignmentPropertyChange();
}
public List<IUIUser> getAssignedSelectedUsers() {
return assignedSelectedUsers;
}
public void setAssignedSelectedUsers( List<Object> assignedSelectedUsers ) {
List<Object> previousVal = new ArrayList<Object>();
previousVal.addAll( this.assignedSelectedUsers );
this.assignedSelectedUsers.clear();
if ( assignedSelectedUsers != null && assignedSelectedUsers.size() > 0 ) {
for ( Object user : assignedSelectedUsers ) {
this.assignedSelectedUsers.add( (IUIUser) user );
}
}
this.firePropertyChange( "assignedSelectedUsers", previousVal, this.assignedSelectedUsers ); //$NON-NLS-1$
fireUserUnassignmentPropertyChange();
}
public UISecurityRole getUISecurityRole() {
return this;
}
public void setRole( IUIRole role, List<IUIUser> users ) {
setAvailableUsers( users );
setDescription( role.getDescription() );
setName( role.getName() );
for ( IUIUser user : role.getUsers() ) {
removeFromAvailableUsers( user.getName() );
addToAssignedUsers( user );
}
}
public Mode getMode() {
return mode;
}
public void setMode( Mode mode ) {
this.mode = mode;
this.firePropertyChange( "mode", null, mode ); //$NON-NLS-1$
}
public List<IUIUser> getAvailableUsers() {
return availableUsers;
}
public void setAvailableUsers( List<IUIUser> availableUsers ) {
List<IUIUser> previousValue = getPreviousAvailableUsers();
this.availableUsers.clear();
if ( availableUsers != null ) {
this.availableUsers.addAll( availableUsers );
}
this.firePropertyChange( "availableUsers", previousValue, this.availableUsers ); //$NON-NLS-1$
}
public List<IUIUser> getAssignedUsers() {
return assignedUsers;
}
public void setAssignedUsers( AbstractModelList<IUIUser> selectedUsers ) {
List<IUIUser> previousValue = getPreviousSelectedUsers();
this.assignedUsers.clear();
if ( selectedUsers != null ) {
this.assignedUsers.addAll( selectedUsers );
}
this.firePropertyChange( "assignedUsers", previousValue, this.assignedUsers ); //$NON-NLS-1$
}
public String getName() {
return name;
}
public void setName( String name ) {
String previousVal = this.name;
this.name = name;
this.firePropertyChange( "name", previousVal, name ); //$NON-NLS-1$
}
public String getDescription() {
return description;
}
public void setDescription( String description ) {
String previousVal = this.description;
this.description = description;
this.firePropertyChange( "description", previousVal, description ); //$NON-NLS-1$
}
public void clear() {
setMode( Mode.ADD );
setName( "" );//$NON-NLS-1$
setDescription( "" ); //$NON-NLS-1$
setAvailableUsers( null );
setAssignedSelectedUsers( null );
setAvailableSelectedUsers( null );
setAssignedUsers( null );
setUserAssignmentPossible( false );
setUserUnassignmentPossible( false );
}
public void assignUsers( List<Object> usersToAssign ) {
for ( Object userToAssign : usersToAssign ) {
assignUser( (IUIUser) userToAssign );
}
setAssignedSelectedUsers( usersToAssign );
setAvailableSelectedUsers( new ArrayList<Object>() );
this.firePropertyChange( "userAssignmentPossible", null, false ); //$NON-NLS-1$
}
public void assignUser( IUIUser userToAssign ) {
addToAssignedUsers( userToAssign );
removeFromAvailableUsers( userToAssign.getName() );
}
public void unassignUsers( List<Object> usersToUnAssign ) {
for ( Object userToUnAssign : usersToUnAssign ) {
unassignUser( (IUIUser) userToUnAssign );
}
setAvailableSelectedUsers( usersToUnAssign );
setAssignedSelectedUsers( new ArrayList<Object>() );
this.firePropertyChange( "userUnassignmentPossible", null, false ); //$NON-NLS-1$
}
public void unassignUser( IUIUser userToUnAssign ) {
removeFromAssignedUsers( userToUnAssign.getName() );
addToAvailableUsers( userToUnAssign );
}
public boolean isUserAssignmentPossible() {
return userAssignmentPossible;
}
public void setUserAssignmentPossible( boolean userAssignmentPossible ) {
this.userAssignmentPossible = userAssignmentPossible;
fireUserAssignmentPropertyChange();
}
public boolean isUserUnassignmentPossible() {
return userUnassignmentPossible;
}
public void setUserUnassignmentPossible( boolean userUnassignmentPossible ) {
this.userUnassignmentPossible = userUnassignmentPossible;
fireUserUnassignmentPropertyChange();
}
public IRole getRole( IRoleSupportSecurityManager rsm ) {
IRole roleInfo = null;
try {
roleInfo = rsm.constructRole();
} catch ( KettleException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
roleInfo.setDescription( description );
roleInfo.setName( name );
for ( IUIUser user : getAssignedUsers() ) {
roleInfo.addUser( user.getUserInfo() );
}
return roleInfo;
}
private void addToAssignedUsers( IUIUser userToAdd ) {
List<IUIUser> previousValue = getPreviousSelectedUsers();
assignedUsers.add( userToAdd );
if ( assignedUsers.size() == 1 ) {
setUserUnassignmentPossible( true );
}
this.firePropertyChange( "assignedUsers", previousValue, assignedUsers ); //$NON-NLS-1$
}
private void addToAvailableUsers( IUIUser userToAdd ) {
List<IUIUser> previousValue = getPreviousAvailableUsers();
availableUsers.add( userToAdd );
if ( availableUsers.size() == 1 ) {
setUserAssignmentPossible( true );
}
this.firePropertyChange( "availableUsers", previousValue, availableUsers ); //$NON-NLS-1$
}
private void removeFromAvailableUsers( String userName ) {
List<IUIUser> previousValue = getPreviousAvailableUsers();
availableUsers.remove( getAvailableUser( userName ) );
if ( availableUsers.size() == 0 ) {
setUserAssignmentPossible( false );
}
this.firePropertyChange( "availableUsers", previousValue, availableUsers ); //$NON-NLS-1$
fireUserAssignmentPropertyChange();
}
private void removeFromAssignedUsers( String userName ) {
List<IUIUser> previousValue = getPreviousSelectedUsers();
assignedUsers.remove( getSelectedUser( userName ) );
if ( assignedUsers.size() == 0 ) {
setUserUnassignmentPossible( false );
}
this.firePropertyChange( "assignedUsers", previousValue, assignedUsers ); //$NON-NLS-1$
fireUserUnassignmentPropertyChange();
}
private IUIUser getSelectedUser( String userName ) {
for ( IUIUser user : assignedUsers ) {
if ( user.getName().equals( userName ) ) {
return user;
}
}
return null;
}
private void fireUserUnassignmentPropertyChange() {
if ( userUnassignmentPossible && assignedUsers.size() > 0 && assignedSelectedUsers.size() > 0 ) {
this.firePropertyChange( "userUnassignmentPossible", null, true ); //$NON-NLS-1$
} else {
this.firePropertyChange( "userUnassignmentPossible", null, false ); //$NON-NLS-1$
}
}
private void fireUserAssignmentPropertyChange() {
if ( userAssignmentPossible && availableUsers.size() > 0 && availableSelectedUsers.size() > 0 ) {
this.firePropertyChange( "userAssignmentPossible", null, true ); //$NON-NLS-1$
} else {
this.firePropertyChange( "userAssignmentPossible", null, false ); //$NON-NLS-1$
}
}
private IUIUser getAvailableUser( String userName ) {
for ( IUIUser user : availableUsers ) {
if ( user.getName().equals( userName ) ) {
return user;
}
}
return null;
}
private List<IUIUser> getPreviousAvailableUsers() {
List<IUIUser> previousValue = new ArrayList<IUIUser>();
for ( IUIUser ru : availableUsers ) {
previousValue.add( ru );
}
return previousValue;
}
private List<IUIUser> getPreviousSelectedUsers() {
List<IUIUser> previousValue = new ArrayList<IUIUser>();
for ( IUIUser ru : assignedUsers ) {
previousValue.add( ru );
}
return previousValue;
}
}