/*! * 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.IUser; import org.pentaho.di.repository.RepositorySecurityManager; import org.pentaho.di.repository.pur.model.IEEUser; import org.pentaho.di.ui.repository.pur.repositoryexplorer.IUIEEUser; import org.pentaho.di.ui.repository.pur.repositoryexplorer.IUIRole; import org.pentaho.di.ui.repository.pur.repositoryexplorer.UIEEObjectRegistery; import org.pentaho.di.ui.repository.repositoryexplorer.model.IUIUser; import org.pentaho.di.ui.repository.repositoryexplorer.model.UISecurityUser; import org.pentaho.ui.xul.util.AbstractModelList; public class UIEESecurityUser extends UISecurityUser implements java.io.Serializable { private static final long serialVersionUID = 3632015987344690267L; /* EESOURCE: UPDATE SERIALVERUID */ private AbstractModelList<IUIRole> availableRoles; private AbstractModelList<IUIRole> assignedRoles; private List<IUIRole> availableSelectedRoles = new ArrayList<IUIRole>(); private List<IUIRole> assignedSelectedRoles = new ArrayList<IUIRole>(); private boolean roleAssignmentPossible; private boolean roleUnassignmentPossible; public UIEESecurityUser( RepositorySecurityManager rsm ) { super( rsm ); availableRoles = new AbstractModelList<IUIRole>(); availableRoles.addPropertyChangeListener( "children", new PropertyChangeListener() { //$NON-NLS-1$ public void propertyChange( PropertyChangeEvent evt ) { UIEESecurityUser.this.firePropertyChange( "availableRoles", null, availableRoles ); //$NON-NLS-1$ } } ); assignedRoles = new AbstractModelList<IUIRole>(); assignedRoles.addPropertyChangeListener( "children", new PropertyChangeListener() { //$NON-NLS-1$ public void propertyChange( PropertyChangeEvent evt ) { UIEESecurityUser.this.firePropertyChange( "assignedRoles", null, assignedRoles ); //$NON-NLS-1$ } } ); } public void setUser( IUIUser user, List<IUIRole> roles ) throws Exception { super.setUser( user ); setAvailableRoles( roles ); if ( user instanceof IUIEEUser ) { for ( IUIRole role : ( (IUIEEUser) user ).getRoles() ) { removeFromAvailableRoles( role.getName() ); addToAssignedRoles( UIEEObjectRegistery.getInstance().constructUIRepositoryRole( role.getRole() ) ); } } } public List<IUIRole> getAvailableSelectedRoles() { return availableSelectedRoles; } public void setAvailableSelectedRoles( List<Object> availableSelectedRoles ) { List<Object> previousVal = new ArrayList<Object>(); previousVal.addAll( this.availableSelectedRoles ); this.availableSelectedRoles.clear(); if ( availableSelectedRoles != null && availableSelectedRoles.size() > 0 ) { for ( Object role : availableSelectedRoles ) { this.availableSelectedRoles.add( (IUIRole) role ); } } this.firePropertyChange( "availableSelectedRoles", previousVal, this.availableSelectedRoles ); //$NON-NLS-1$ fireRoleAssignmentPropertyChange(); } public List<IUIRole> getAssignedSelectedRoles() { return assignedSelectedRoles; } public void setAssignedSelectedRoles( List<Object> assignedSelectedRoles ) { List<Object> previousVal = new ArrayList<Object>(); previousVal.addAll( this.assignedSelectedRoles ); this.assignedSelectedRoles.clear(); if ( assignedSelectedRoles != null && assignedSelectedRoles.size() > 0 ) { for ( Object role : assignedSelectedRoles ) { this.assignedSelectedRoles.add( (IUIRole) role ); } } this.firePropertyChange( "assignedSelectedRoles", previousVal, this.assignedSelectedRoles ); //$NON-NLS-1$ fireRoleUnassignmentPropertyChange(); } public UIEESecurityUser getUISecurityUser() { return this; } public List<IUIRole> getAvailableRoles() { return availableRoles; } public void setAvailableRoles( List<IUIRole> availableRoles ) { List<IUIRole> previousValue = getPreviousAvailableRoles(); this.availableRoles.clear(); if ( availableRoles != null ) { this.availableRoles.addAll( availableRoles ); } this.firePropertyChange( "availableRoles", previousValue, this.availableRoles ); //$NON-NLS-1$ } public List<IUIRole> getAssignedRoles() { return assignedRoles; } public void updateAssignedRoles( List<IUIRole> assignedRoles ) { for ( IUIRole role : assignedRoles ) { assignRole( role ); } } public void setAssignedRoles( List<IUIRole> selectedRoles ) { List<IUIRole> previousValue = getPreviousAssignedRoles(); this.assignedRoles.clear(); if ( selectedRoles != null ) { this.assignedRoles.addAll( selectedRoles ); } this.firePropertyChange( "assignedRoles", previousValue, this.assignedRoles ); //$NON-NLS-1$ } @Override public void clear() { super.clear(); setAssignedSelectedRoles( null ); setAvailableSelectedRoles( null ); setAvailableRoles( null ); setAssignedRoles( null ); setRoleAssignmentPossible( false ); setRoleUnassignmentPossible( false ); } public void assignRoles( List<Object> rolesToAssign ) { for ( Object roleToAssign : rolesToAssign ) { assignRole( (IUIRole) roleToAssign ); } setAssignedSelectedRoles( rolesToAssign ); setAvailableSelectedRoles( new ArrayList<Object>() ); this.firePropertyChange( "roleAssignmentPossible", null, false ); //$NON-NLS-1$ } public void assignRole( IUIRole roleToAssign ) { addToAssignedRoles( roleToAssign ); removeFromAvailableRoles( roleToAssign.getName() ); } public void unassignRoles( List<Object> rolesToUnAssign ) { for ( Object roleToUnAssign : rolesToUnAssign ) { unassignRole( (IUIRole) roleToUnAssign ); } setAvailableSelectedRoles( rolesToUnAssign ); setAssignedSelectedRoles( new ArrayList<Object>() ); this.firePropertyChange( "roleUnassignmentPossible", null, false ); //$NON-NLS-1$ } public void unassignRole( IUIRole roleToUnAssign ) { removeFromAssignedRoles( roleToUnAssign.getName() ); addToAvailableRoles( roleToUnAssign ); } public boolean isRoleAssignmentPossible() { return roleAssignmentPossible; } public void setRoleAssignmentPossible( boolean roleAssignmentPossible ) { this.roleAssignmentPossible = roleAssignmentPossible; fireRoleAssignmentPropertyChange(); } public boolean isRoleUnassignmentPossible() { return roleUnassignmentPossible; } public void setRoleUnassignmentPossible( boolean roleUnassignmentPossible ) { this.roleUnassignmentPossible = roleUnassignmentPossible; fireRoleUnassignmentPropertyChange(); } @Override public IUser getUserInfo() throws KettleException { IUser userInfo = rsm.constructUser(); userInfo.setDescription( getDescription() ); userInfo.setLogin( getName() ); userInfo.setName( getName() ); userInfo.setUsername( getName() ); userInfo.setPassword( getPassword() ); if ( userInfo instanceof IEEUser ) { for ( IUIRole role : getAssignedRoles() ) { ( (IEEUser) userInfo ).addRole( role.getRole() ); } } return userInfo; } private void addToAssignedRoles( IUIRole roleToAdd ) { List<IUIRole> previousValue = getPreviousAssignedRoles(); assignedRoles.add( roleToAdd ); this.firePropertyChange( "assignedRoles", previousValue, assignedRoles ); //$NON-NLS-1$ if ( assignedRoles.size() == 1 ) { setRoleUnassignmentPossible( true ); } fireRoleUnassignmentPropertyChange(); } private void addToAvailableRoles( IUIRole roleToAdd ) { List<IUIRole> previousValue = getPreviousAvailableRoles(); availableRoles.add( roleToAdd ); if ( availableRoles.size() == 1 ) { setRoleAssignmentPossible( true ); } this.firePropertyChange( "availableRoles", previousValue, availableRoles ); //$NON-NLS-1$ fireRoleAssignmentPropertyChange(); } private void removeFromAvailableRoles( String roleName ) { List<IUIRole> previousValue = getPreviousAvailableRoles(); availableRoles.remove( getAvailableRole( roleName ) ); if ( availableRoles.size() == 0 ) { setRoleAssignmentPossible( false ); } this.firePropertyChange( "availableRoles", previousValue, availableRoles ); //$NON-NLS-1$ fireRoleAssignmentPropertyChange(); } private void removeFromAssignedRoles( String roleName ) { List<IUIRole> previousValue = getPreviousAssignedRoles(); assignedRoles.remove( getSelectedRole( roleName ) ); if ( assignedRoles.size() == 0 ) { setRoleUnassignmentPossible( false ); } this.firePropertyChange( "assignedRoles", previousValue, assignedRoles ); //$NON-NLS-1$ fireRoleUnassignmentPropertyChange(); } private void fireRoleUnassignmentPropertyChange() { if ( roleUnassignmentPossible && assignedRoles.size() > 0 && assignedSelectedRoles.size() > 0 ) { this.firePropertyChange( "roleUnassignmentPossible", null, true ); //$NON-NLS-1$ } else { this.firePropertyChange( "roleUnassignmentPossible", null, false ); //$NON-NLS-1$ } } private void fireRoleAssignmentPropertyChange() { if ( roleAssignmentPossible && availableRoles.size() > 0 && availableSelectedRoles.size() > 0 ) { this.firePropertyChange( "roleAssignmentPossible", null, true ); //$NON-NLS-1$ } else { this.firePropertyChange( "roleAssignmentPossible", null, false ); //$NON-NLS-1$ } } private IUIRole getSelectedRole( String name ) { for ( IUIRole role : assignedRoles ) { if ( role.getName().equals( name ) ) { return role; } } return null; } private IUIRole getAvailableRole( String name ) { for ( IUIRole role : availableRoles ) { if ( role.getName().equals( name ) ) { return role; } } return null; } private List<IUIRole> getPreviousAvailableRoles() { List<IUIRole> previousValue = new ArrayList<IUIRole>(); for ( IUIRole ru : availableRoles ) { previousValue.add( ru ); } return previousValue; } private List<IUIRole> getPreviousAssignedRoles() { List<IUIRole> previousValue = new ArrayList<IUIRole>(); for ( IUIRole ru : assignedRoles ) { previousValue.add( ru ); } return previousValue; } }