/*! * 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.util.ArrayList; import java.util.List; import org.pentaho.di.repository.ObjectRecipient; import org.pentaho.di.repository.ObjectRecipient.Type; import org.pentaho.di.repository.pur.model.ObjectAce; import org.pentaho.di.repository.pur.model.RepositoryObjectAce; import org.pentaho.di.repository.pur.model.RepositoryObjectRecipient; import org.pentaho.ui.xul.XulEventSourceAdapter; public class UIRepositoryObjectAclModel extends XulEventSourceAdapter implements java.io.Serializable { private static final long serialVersionUID = 2403228456811971640L; /* EESOURCE: UPDATE SERIALVERUID */ private List<String> masterAvailableUserList; private List<String> masterAvailableRoleList; private UIRepositoryObjectAcls selectedAcls; private List<String> selectedAvailableRoles = new ArrayList<String>(); private List<String> selectedAvailableUsers = new ArrayList<String>(); private List<UIRepositoryObjectAcl> selectedAssignedRoles = new ArrayList<UIRepositoryObjectAcl>(); private List<UIRepositoryObjectAcl> selectedAssignedUsers = new ArrayList<UIRepositoryObjectAcl>(); private List<UIRepositoryObjectAcl> aclsToAdd; private List<UIRepositoryObjectAcl> aclsToRemove; private List<String> availableUserList; private List<String> availableRoleList; private boolean userAssignmentPossible; private boolean userUnassignmentPossible; private boolean roleAssignmentPossible; private boolean roleUnassignmentPossible; public UIRepositoryObjectAclModel( UIRepositoryObjectAcls acls ) { availableUserList = new ArrayList<String>(); availableRoleList = new ArrayList<String>(); masterAvailableUserList = new ArrayList<String>(); masterAvailableRoleList = new ArrayList<String>(); aclsToAdd = new ArrayList<UIRepositoryObjectAcl>(); aclsToRemove = new ArrayList<UIRepositoryObjectAcl>(); selectedAcls = acls; } public List<UIRepositoryObjectAcl> getAclsToAdd() { return aclsToAdd; } public void setAclsToRemove( List<UIRepositoryObjectAcl> aclsToRemove ) { this.aclsToRemove = aclsToRemove; } public List<String> getSelectedAvailableRoles() { return selectedAvailableRoles; } public void setSelectedAvailableRoles( List<String> selectedAvailableRoles ) { if ( this.selectedAvailableRoles != null && this.selectedAvailableRoles.equals( selectedAvailableRoles ) ) { return; } List<String> previousVal = new ArrayList<String>(); previousVal.addAll( this.selectedAvailableRoles ); this.selectedAvailableRoles.clear(); for ( String role : selectedAvailableRoles ) { this.selectedAvailableRoles.add( role ); } this.firePropertyChange( "selectedAvailableRoles", previousVal, this.selectedAvailableRoles ); //$NON-NLS-1$ fireAssignPropertyChangeEvent( Type.ROLE ); } public void setSelectedAvailableRole( String selectedAvailableRole ) { this.selectedAvailableRoles.add( selectedAvailableRole ); } public List<String> getSelectedAvailableUsers() { return selectedAvailableUsers; } public void setSelectedAvailableUsers( List<String> selectedAvailableUsers ) { if ( this.selectedAvailableUsers != null && this.selectedAvailableUsers.equals( selectedAvailableUsers ) ) { return; } List<String> previousVal = new ArrayList<String>(); previousVal.addAll( this.selectedAvailableUsers ); this.selectedAvailableUsers.clear(); for ( String user : selectedAvailableUsers ) { this.selectedAvailableUsers.add( user ); } this.firePropertyChange( "selectedAvailableUsers", previousVal, this.selectedAvailableUsers ); //$NON-NLS-1$ fireAssignPropertyChangeEvent( Type.USER ); } public void setSelectedAvailableUser( String selectedAvailableUser ) { this.selectedAvailableUsers.add( selectedAvailableUser ); } public List<UIRepositoryObjectAcl> getSelectedAssignedRoles() { return selectedAssignedRoles; } public void setSelectedAssignedRoles( List<UIRepositoryObjectAcl> selectedAssignedRoles ) { if ( this.selectedAssignedRoles != null && this.selectedAssignedRoles.equals( selectedAssignedRoles ) ) { return; } List<UIRepositoryObjectAcl> previousVal = new ArrayList<UIRepositoryObjectAcl>(); previousVal.addAll( this.selectedAssignedRoles ); this.selectedAssignedRoles.clear(); for ( UIRepositoryObjectAcl role : selectedAssignedRoles ) { this.selectedAssignedRoles.add( role ); } this.firePropertyChange( "selectedAssignedRoles", previousVal, this.selectedAssignedRoles ); //$NON-NLS-1$ fireUnassignPropertyChangeEvent( Type.ROLE ); } public List<UIRepositoryObjectAcl> getSelectedAssignedUsers() { return selectedAssignedUsers; } public void setSelectedAssignedUsers( List<UIRepositoryObjectAcl> selectedAssignedUsers ) { if ( this.selectedAssignedUsers != null && this.selectedAssignedUsers.equals( selectedAssignedUsers ) ) { return; } List<UIRepositoryObjectAcl> previousVal = new ArrayList<UIRepositoryObjectAcl>(); previousVal.addAll( this.selectedAssignedUsers ); this.selectedAssignedUsers.clear(); for ( UIRepositoryObjectAcl user : selectedAssignedUsers ) { this.selectedAssignedUsers.add( user ); } this.firePropertyChange( "selectedAssignedUsers", previousVal, this.selectedAssignedUsers ); //$NON-NLS-1$ fireUnassignPropertyChangeEvent( Type.USER ); } public void setSelectedAssignedUser( UIRepositoryObjectAcl selectedAssignedUser ) { this.selectedAssignedUsers.add( selectedAssignedUser ); } public List<String> getAvailableUserList() { return availableUserList; } public boolean isUserAssignmentPossible() { return userAssignmentPossible; } public void setUserAssignmentPossible( boolean userAssignmentPossible ) { this.userAssignmentPossible = userAssignmentPossible; fireAssignPropertyChangeEvent( Type.USER ); } public boolean isUserUnassignmentPossible() { return userUnassignmentPossible; } public void setUserUnassignmentPossible( boolean userUnassignmentPossible ) { this.userUnassignmentPossible = userUnassignmentPossible; fireUnassignPropertyChangeEvent( Type.USER ); } public boolean isRoleAssignmentPossible() { return roleAssignmentPossible; } public void setRoleAssignmentPossible( boolean roleAssignmentPossible ) { this.roleAssignmentPossible = roleAssignmentPossible; fireAssignPropertyChangeEvent( Type.ROLE ); } public boolean isRoleUnassignmentPossible() { return roleUnassignmentPossible; } public void setRoleUnassignmentPossible( boolean roleUnassignmentPossible ) { this.roleUnassignmentPossible = roleUnassignmentPossible; fireUnassignPropertyChangeEvent( Type.ROLE ); } // Set the initial acl list placing available acl in the available column // and selected acls in selected column public void setAclsList( List<String> userList, List<String> roleList ) { if ( userList != null && userList.size() > 0 ) { setAvailableUserList( userList ); setSelectedAvailableUser( userList.get( 0 ) ); masterAvailableUserList.addAll( availableUserList ); } if ( roleList != null && roleList.size() > 0 ) { setAvailableRoleList( roleList ); setSelectedAvailableRole( roleList.get( 0 ) ); masterAvailableRoleList.addAll( availableRoleList ); } setSelectedAcls( selectedAcls ); } public void setAvailableUserList( List<String> userList ) { List<String> previousVal = new ArrayList<String>(); previousVal.addAll( this.availableUserList ); this.availableUserList.clear(); this.availableUserList.addAll( userList ); this.firePropertyChange( "availableUserList", previousVal, availableUserList ); //$NON-NLS-1$ } public List<String> getAvailableRoleList() { return availableRoleList; } public void setAvailableRoleList( List<String> roleList ) { List<String> previousVal = new ArrayList<String>(); previousVal.addAll( this.availableRoleList ); this.availableRoleList.clear(); this.availableRoleList.addAll( roleList ); this.firePropertyChange( "availableRoleList", previousVal, availableRoleList ); //$NON-NLS-1$ } public void assignRoles( List<Object> rolesToAssign ) { List<UIRepositoryObjectAcl> acls = new ArrayList<UIRepositoryObjectAcl>(); for ( Object role : rolesToAssign ) { if ( role instanceof String ) { String roleToAssign = (String) role; acls.add( assignRole( roleToAssign ) ); } } this.firePropertyChange( "selectedRoleList", null, getSelectedRoleList() ); //$NON-NLS-1$ setSelectedAssignedRoles( acls ); setSelectedAvailableRoles( new ArrayList<String>() ); } public UIRepositoryObjectAcl assignRole( String roleToAssign ) { UIRepositoryObjectAcl acl = createAclFromRole( roleToAssign ); aclsToAdd.add( acl ); removeFromAvailableRoles( roleToAssign ); return acl; } public UIRepositoryObjectAcl getAcl( String aclName ) { for ( UIRepositoryObjectAcl selected : this.selectedAcls.getAcls() ) { if ( selected.getRecipientName().equals( aclName ) ) { return selected; } } for ( UIRepositoryObjectAcl selected : aclsToAdd ) { if ( selected.getRecipientName().equals( aclName ) ) { return selected; } } return null; } public void unassign( List<Object> toUnassign ) { Type type = null; List<String> unassignList = new ArrayList<String>(); for ( Object obj : toUnassign ) { if ( obj instanceof UIRepositoryObjectAcl ) { UIRepositoryObjectAcl acl = (UIRepositoryObjectAcl) obj; type = acl.getRecipientType(); unassign( acl.getRecipientName() ); unassignList.add( acl.getRecipientName() ); } } if ( type == Type.ROLE ) { setSelectedAvailableRoles( unassignList ); setSelectedAssignedRoles( new ArrayList<UIRepositoryObjectAcl>() ); } else { setSelectedAvailableUsers( unassignList ); setSelectedAssignedUsers( new ArrayList<UIRepositoryObjectAcl>() ); } } private void unassign( String toUnassign ) { UIRepositoryObjectAcl selectedAcl = getAcl( toUnassign ); if ( selectedAcl != null ) { unassign( selectedAcl ); if ( selectedAcl.getRecipientType() == ObjectRecipient.Type.USER ) { addToAvailableUsers( selectedAcl.getRecipientName() ); } else if ( selectedAcl.getRecipientType() == ObjectRecipient.Type.ROLE ) { addToAvailableRoles( selectedAcl.getRecipientName() ); } } } private void unassign( UIRepositoryObjectAcl toUnassign ) { if ( aclsToAdd.contains( toUnassign ) ) { aclsToAdd.remove( toUnassign ); } else { aclsToRemove.add( toUnassign ); } if ( toUnassign.getRecipientType() == ObjectRecipient.Type.ROLE ) { this.firePropertyChange( "selectedRoleList", null, getSelectedRoleList() ); //$NON-NLS-1$ } else if ( toUnassign.getRecipientType() == ObjectRecipient.Type.USER ) { this.firePropertyChange( "selectedUserList", null, getSelectedUserList() ); //$NON-NLS-1$ } } public void assignUsers( List<Object> usersToAssign ) { List<UIRepositoryObjectAcl> previousVal = new ArrayList<UIRepositoryObjectAcl>(); previousVal.addAll( getSelectedUserList() ); List<UIRepositoryObjectAcl> assignList = new ArrayList<UIRepositoryObjectAcl>(); for ( Object user : usersToAssign ) { if ( user instanceof String ) assignList.add( assignUser( (String) user ) ); } this.firePropertyChange( "selectedUserList", null, getSelectedUserList() ); //$NON-NLS-1$ setSelectedAssignedUsers( assignList ); setSelectedAvailableUsers( new ArrayList<String>() ); } public UIRepositoryObjectAcl assignUser( String userToAssign ) { UIRepositoryObjectAcl acl = createAclFromUser( userToAssign ); aclsToAdd.add( acl ); removeFromAvailableUsers( userToAssign ); return acl; } private void removeFromAvailableAcls( UIRepositoryObjectAcl acl ) { if ( acl.getRecipientType().equals( Type.ROLE ) ) { removeFromAvailableRoles( acl.getRecipientName() ); } else if ( acl.getRecipientType().equals( Type.USER ) ) { removeFromAvailableUsers( acl.getRecipientName() ); } } public UIRepositoryObjectAcls getSelectedAcls() { return selectedAcls; } public void setSelectedAcls( UIRepositoryObjectAcls selectedAcls ) { this.selectedAcls = selectedAcls; for ( UIRepositoryObjectAcl acl : this.selectedAcls.getAcls() ) { removeFromAvailableAcls( acl ); } this.firePropertyChange( "selectedUserList", null, getSelectedUserList() ); //$NON-NLS-1$ this.firePropertyChange( "selectedRoleList", null, getSelectedRoleList() ); //$NON-NLS-1$ } public List<UIRepositoryObjectAcl> getSelectedUserList() { if ( selectedAcls != null && selectedAcls.getAcls() != null ) { List<UIRepositoryObjectAcl> selectedUserList = new ArrayList<UIRepositoryObjectAcl>(); // Add all the acls from the initial list and remove the one that are marked for removal for ( UIRepositoryObjectAcl selectedAcl : selectedAcls.getAcls() ) { if ( !findByRecipientName( selectedAcl.getRecipientName() ) ) { if ( selectedAcl.getRecipientType().equals( ObjectRecipient.Type.USER ) ) { selectedUserList.add( selectedAcl ); } } } // Now add the acls that are marked for addition for ( UIRepositoryObjectAcl acl : aclsToAdd ) { if ( acl.getRecipientType().equals( ObjectRecipient.Type.USER ) ) { selectedUserList.add( acl ); } } return selectedUserList; } else { return null; } } public List<UIRepositoryObjectAcl> getSelectedRoleList() { if ( selectedAcls != null && selectedAcls.getAcls() != null ) { List<UIRepositoryObjectAcl> selectedRoleList = new ArrayList<UIRepositoryObjectAcl>(); // Add all the acls from the initial list and remove the one that are marked for removal for ( UIRepositoryObjectAcl selectedAcl : this.selectedAcls.getAcls() ) { if ( !findByRecipientName( selectedAcl.getRecipientName() ) ) { if ( selectedAcl.getRecipientType().equals( ObjectRecipient.Type.ROLE ) ) { selectedRoleList.add( selectedAcl ); } } } // Now add the acls that are marked for addition for ( UIRepositoryObjectAcl acl : aclsToAdd ) { if ( acl.getRecipientType().equals( ObjectRecipient.Type.ROLE ) ) { selectedRoleList.add( acl ); } } return selectedRoleList; } else { return null; } } public String getAvailableUser( int index ) { return availableUserList.get( index ); } public int getAvailableUserIndex( String user ) { for ( int i = 0; i < availableUserList.size(); i++ ) { String u = availableUserList.get( i ); if ( u.equals( user ) ) { return i; } } return -1; } public String getAvailableRole( int index ) { return availableRoleList.get( index ); } public int getAvailableRoleIndex( String role ) { for ( int i = 0; i < availableRoleList.size(); i++ ) { String r = availableRoleList.get( i ); if ( r.equals( role ) ) { return i; } } return -1; } private UIRepositoryObjectAcl createAclFromRole( String role ) { ObjectAce ace = new RepositoryObjectAce( new RepositoryObjectRecipient( role, ObjectRecipient.Type.ROLE ) ); return new UIRepositoryObjectAcl( ace ); } private UIRepositoryObjectAcl createAclFromUser( String user ) { ObjectAce ace = new RepositoryObjectAce( new RepositoryObjectRecipient( user, ObjectRecipient.Type.USER ) ); return new UIRepositoryObjectAcl( ace ); } private void removeFromAvailableUsers( String name ) { for ( String user : availableUserList ) { if ( user.equals( name ) ) { availableUserList.remove( user ); break; } } this.firePropertyChange( "availableUserList", null, availableUserList ); //$NON-NLS-1$ } private void removeFromAvailableRoles( String name ) { for ( String role : availableRoleList ) { if ( role.equals( name ) ) { availableRoleList.remove( role ); break; } } this.firePropertyChange( "availableRoleList", null, availableRoleList ); //$NON-NLS-1$ } private void addToAvailableUsers( String name ) { for ( String user : masterAvailableUserList ) { if ( user.equals( name ) ) { availableUserList.add( user ); break; } } this.firePropertyChange( "availableUserList", null, availableUserList ); //$NON-NLS-1$ fireAssignPropertyChangeEvent( Type.USER ); } private void addToAvailableRoles( String name ) { for ( String role : masterAvailableRoleList ) { if ( role.equals( name ) ) { availableRoleList.add( role ); break; } } this.firePropertyChange( "availableRoleList", null, availableRoleList ); //$NON-NLS-1$ fireAssignPropertyChangeEvent( Type.ROLE ); } public boolean findByRecipientName( String recipientName ) { for ( UIRepositoryObjectAcl acl : aclsToRemove ) { if ( acl.getRecipientName().equals( recipientName ) ) { return true; } } return false; } public void clear() { aclsToAdd.clear(); aclsToRemove.clear(); masterAvailableRoleList.clear(); masterAvailableUserList.clear(); availableRoleList.clear(); availableUserList.clear(); selectedAvailableRoles.clear(); selectedAvailableUsers.clear(); selectedAssignedRoles.clear(); selectedAssignedUsers.clear(); setRoleAssignmentPossible( false ); setRoleUnassignmentPossible( false ); setUserAssignmentPossible( false ); setUserUnassignmentPossible( false ); } public void updateSelectedAcls() { selectedAcls.addDefaultAcls( aclsToAdd ); selectedAcls.removeAcls( aclsToRemove ); } public UIRepositoryObjectAcl getSelectedUser( int index ) { return getSelectedUserList().get( index ); } public int getSelectedUserIndex( UIRepositoryObjectAcl user ) { List<UIRepositoryObjectAcl> userList = getSelectedUserList(); for ( int i = 0; i < userList.size(); i++ ) { UIRepositoryObjectAcl u = userList.get( i ); if ( u.getRecipientName().equals( user.getRecipientName() ) ) { return i; } } return -1; } public UIRepositoryObjectAcl getSelectedRole( int index ) { return getSelectedRoleList().get( index ); } public int getSelectedRoleIndex( UIRepositoryObjectAcl role ) { List<UIRepositoryObjectAcl> roleList = getSelectedRoleList(); for ( int i = 0; i < roleList.size(); i++ ) { UIRepositoryObjectAcl r = roleList.get( i ); if ( r.getRecipientName().equals( role.getRecipientName() ) ) { return i; } } return -1; } private void fireUnassignPropertyChangeEvent( Type type ) { if ( type == Type.USER ) { if ( isUnAssignmentPossible( type ) ) { this.firePropertyChange( "userUnassignmentPossible", null, true ); //$NON-NLS-1$ } else { this.firePropertyChange( "userUnassignmentPossible", null, false ); //$NON-NLS-1$ } } else { if ( isUnAssignmentPossible( type ) ) { this.firePropertyChange( "roleUnassignmentPossible", null, true ); //$NON-NLS-1$ } else { this.firePropertyChange( "roleUnassignmentPossible", null, false ); //$NON-NLS-1$ } } } private void fireAssignPropertyChangeEvent( Type type ) { if ( type == Type.USER ) { if ( isAssignmentPossible( type ) ) { this.firePropertyChange( "userAssignmentPossible", null, true ); //$NON-NLS-1$ } else { this.firePropertyChange( "userAssignmentPossible", null, false ); //$NON-NLS-1$ } } else { if ( isAssignmentPossible( type ) ) { this.firePropertyChange( "roleAssignmentPossible", null, true ); //$NON-NLS-1$ } else { this.firePropertyChange( "roleAssignmentPossible", null, false ); //$NON-NLS-1$ } } } private boolean isUnAssignmentPossible( Type type ) { if ( type == Type.USER ) { return ( selectedAssignedUsers != null && selectedAssignedUsers.size() > 0 ); } else { return ( selectedAssignedRoles != null && selectedAssignedRoles.size() > 0 ); } } private boolean isAssignmentPossible( Type type ) { if ( type == Type.USER ) { return ( selectedAvailableUsers != null && selectedAvailableUsers.size() > 0 ); } else { return ( selectedAvailableRoles != null && selectedAvailableRoles.size() > 0 ); } } }