/*! * 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.controller; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Set; import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission; import org.pentaho.ui.xul.components.XulCheckbox; /** * This class aims to handle the enabling, disabling, checking and unchecking of the permissions checkboxes for the * PurRepository * * @author bryan */ public class PermissionsCheckboxHandler { /** * Class to keep track of relevant checkbox, as well as which checkboxes should be disabled and enabled when this is * the highest permission the user has * * @author bryan */ private static class PermissionsCheckboxes { public final RepositoryFilePermission repositoryFilePermission; public final XulCheckbox permissionCheckbox; public final Set<XulCheckbox> enabledBoxes; public final Set<XulCheckbox> disabledBoxes; /** * @param repositoryFilePermission * the permission that this object is associated with * @param permissionCheckbox * the checkbox for the permission * @param enabledBoxes * the checkboxes that should be enabled when this is the highest permission * @param disabledBoxes * the checkboxes that should be disabled when this is the highest permission */ public PermissionsCheckboxes( RepositoryFilePermission repositoryFilePermission, XulCheckbox permissionCheckbox, Collection<XulCheckbox> enabledBoxes, Collection<XulCheckbox> disabledBoxes ) { this.repositoryFilePermission = repositoryFilePermission; this.permissionCheckbox = permissionCheckbox; this.enabledBoxes = Collections.unmodifiableSet( new HashSet<XulCheckbox>( enabledBoxes ) ); this.disabledBoxes = Collections.unmodifiableSet( new HashSet<XulCheckbox>( disabledBoxes ) ); } } private final List<PermissionsCheckboxes> ALL_PERMISSIONS; /** * Constructs the PermissionsCheckboxHandler by giving it references to the relevant checkboxes The ALL_PERMISSIONS * list is used to do cascading permissions, it is important that the permissions are in it in order of highest to * lowest */ public PermissionsCheckboxHandler( XulCheckbox readCheckbox, XulCheckbox writeCheckbox, XulCheckbox deleteCheckbox, XulCheckbox manageCheckbox ) { List<PermissionsCheckboxes> permissionsList = new ArrayList<PermissionsCheckboxes>(); permissionsList.add( new PermissionsCheckboxes( RepositoryFilePermission.ACL_MANAGEMENT, manageCheckbox, Arrays .asList( manageCheckbox ), Arrays.asList( readCheckbox, writeCheckbox, deleteCheckbox ) ) ); permissionsList.add( new PermissionsCheckboxes( RepositoryFilePermission.DELETE, deleteCheckbox, Arrays.asList( manageCheckbox, deleteCheckbox ), Arrays.asList( readCheckbox, writeCheckbox ) ) ); permissionsList.add( new PermissionsCheckboxes( RepositoryFilePermission.WRITE, writeCheckbox, Arrays.asList( writeCheckbox, deleteCheckbox ), Arrays.asList( readCheckbox, manageCheckbox ) ) ); permissionsList.add( new PermissionsCheckboxes( RepositoryFilePermission.READ, readCheckbox, Arrays .asList( writeCheckbox ), Arrays.asList( readCheckbox, deleteCheckbox, manageCheckbox ) ) ); ALL_PERMISSIONS = Collections.unmodifiableList( permissionsList ); } /** * Controls the enabling and disabling of the checkboxes based on the permission level * * @param enableAppropriate * boolean indicating whether the appropriate boxes should be enabled (set to false to disable all) * @param permissionsCheckboxes * the permission level object */ private void enableDisableBoxes( boolean enableAppropriate, PermissionsCheckboxes permissionsCheckboxes ) { for ( XulCheckbox checkbox : permissionsCheckboxes.disabledBoxes ) { checkbox.setDisabled( true ); } for ( XulCheckbox checkbox : permissionsCheckboxes.enabledBoxes ) { checkbox.setDisabled( !enableAppropriate ); } } /** * Goes through the checkboxes and returns the resulting set of permissions * * @return the resulting set of permissions */ public EnumSet<RepositoryFilePermission> processCheckboxes() { return processCheckboxes( false ); } /** * Goes through the checkboxes and returns the resulting set of permissions * * @param enableAppropriate * boolean indicating whether the appropriate boxes should be enabled (set to false to disable all) * @return the resulting set of permissions */ public EnumSet<RepositoryFilePermission> processCheckboxes( boolean enableAppropriate ) { EnumSet<RepositoryFilePermission> result = EnumSet.noneOf( RepositoryFilePermission.class ); boolean foundMaxPermission = false; for ( PermissionsCheckboxes permissionsCheckboxes : ALL_PERMISSIONS ) { if ( foundMaxPermission ) { result.add( permissionsCheckboxes.repositoryFilePermission ); } else if ( permissionsCheckboxes.permissionCheckbox.isChecked() ) { enableDisableBoxes( enableAppropriate, permissionsCheckboxes ); foundMaxPermission = true; result.add( permissionsCheckboxes.repositoryFilePermission ); } } if ( !foundMaxPermission ) { setAllDisabled( true ); if ( enableAppropriate ) { ALL_PERMISSIONS.get( ALL_PERMISSIONS.size() - 1 ).permissionCheckbox.setDisabled( false ); } } return result; } /** * Updates the checkboxes so they reflect the current permissions * * @param permissionEnumSet * the current permissions */ public void updateCheckboxes( EnumSet<RepositoryFilePermission> permissionEnumSet ) { updateCheckboxes( false, permissionEnumSet ); } /** * Updates the checkboxes so they reflect the current permissions * * @param enableAppropriate * boolean indicating whether the appropriate boxes should be enabled (set to false to disable all) * @param permissionEnumSet * the current permissions */ public void updateCheckboxes( boolean enableAppropriate, EnumSet<RepositoryFilePermission> permissionEnumSet ) { Set<RepositoryFilePermission> permissions = new HashSet<RepositoryFilePermission>( Arrays.asList( permissionEnumSet .toArray( new RepositoryFilePermission[permissionEnumSet.size()] ) ) ); boolean foundMaxPermission = false; if ( permissions.remove( RepositoryFilePermission.ALL ) ) { permissions.add( ALL_PERMISSIONS.get( 0 ).repositoryFilePermission ); } for ( PermissionsCheckboxes permissionsCheckboxes : ALL_PERMISSIONS ) { if ( foundMaxPermission ) { permissionsCheckboxes.permissionCheckbox.setChecked( true ); } else { if ( permissions.contains( permissionsCheckboxes.repositoryFilePermission ) ) { foundMaxPermission = true; permissionsCheckboxes.permissionCheckbox.setChecked( true ); enableDisableBoxes( enableAppropriate, permissionsCheckboxes ); } else { permissionsCheckboxes.permissionCheckbox.setChecked( false ); } } } if ( !foundMaxPermission ) { setAllDisabled( true ); if ( enableAppropriate ) { ALL_PERMISSIONS.get( ALL_PERMISSIONS.size() - 1 ).permissionCheckbox.setDisabled( false ); } } } /** * Sets the checked value of all the checkboxes * * @param value * the value */ public void setAllChecked( boolean value ) { for ( PermissionsCheckboxes permissionsCheckboxes : ALL_PERMISSIONS ) { permissionsCheckboxes.permissionCheckbox.setChecked( value ); } } /** * Sets the disabled value of all the checkboxes * * @param value * the value */ public void setAllDisabled( boolean value ) { for ( PermissionsCheckboxes permissionsCheckboxes : ALL_PERMISSIONS ) { permissionsCheckboxes.permissionCheckbox.setDisabled( value ); } } }