Package org.openfaces.demo.beans.selectbooleancheckbox

Source Code of org.openfaces.demo.beans.selectbooleancheckbox.PermissionSchema$State

/*
* OpenFaces - JSF Component Library 2.0
* Copyright (C) 2007-2013, TeamDev Ltd.
* licensing@openfaces.org
* Unless agreed in writing the contents of this file are subject to
* the GNU Lesser General Public License Version 2.1 (the "LGPL" License).
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* Please visit http://openfaces.org/licensing/ for more details.
*/

package org.openfaces.demo.beans.selectbooleancheckbox;

import org.openfaces.component.select.SelectBooleanCheckbox;
import static org.openfaces.demo.beans.selectbooleancheckbox.Permission.*;
import org.openfaces.demo.beans.util.FacesUtils;

import javax.faces.event.ActionEvent;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class PermissionSchema {

    private static final String SEPARATOR = "Separator";

    public PermissionSchema() {
        setAssigned(Permission.VIEW_POSTS, PermissionGroup.ANONYMOUS, true);
        setAssigned(Permission.CREATE_POSTS, PermissionGroup.USER, true);
        setAssigned(Permission.EDIT_ANY_POST, PermissionGroup.ADMINISTRATOR, true);
        setAssigned(Permission.DELETE_OWN_POST, PermissionGroup.USER, true);
        setAssigned(Permission.DELETE_ANY_POST, PermissionGroup.ADMINISTRATOR, true);
        setAssigned(Permission.CREATE_ATTACHEMENTS, PermissionGroup.USER, true);
        setAssigned(Permission.REMOVE_ATTACHEMENTS, PermissionGroup.ADMINISTRATOR, true);
        setAssigned(Permission.CREATE_NEWS, PermissionGroup.ADMINISTRATOR, true);
        setAssigned(Permission.VIEW_HIDDEN_TIMED_NEWS, PermissionGroup.ADMINISTRATOR, true);
        setAssigned(Permission.DELETE_NEWS, PermissionGroup.ADMINISTRATOR, true);
        setAssigned(Permission.ADD_COMMENTS, PermissionGroup.USER, true);
        setAssigned(Permission.REMOVE_COMMENTS, PermissionGroup.ADMINISTRATOR, true);
    }

    private Map<PermissionGroup, Map<Permission, State>> permissionsAssignment;
    private Map<PermissionGroup, Map<Permission, Iterable<String>>> stateList;
    private Iterable<String> defaultStateList;
    private Iterable<String> dependentStateList;


    public Map<PermissionGroup, Map<Permission, State>> getPermissionsAssignment() {
        if (permissionsAssignment == null) {
            permissionsAssignment = new PermissionAssigmnent();
        }
        return permissionsAssignment;
    }

    public Collection<?> getPermissions() {

        return Arrays.asList(
                VIEW_POSTS,
                CREATE_POSTS,
                EDIT_ANY_POST,
                DELETE_OWN_POST,
                DELETE_ANY_POST,
                SEPARATOR,
                CREATE_ATTACHEMENTS,
                REMOVE_ATTACHEMENTS,
                SEPARATOR,
                CREATE_NEWS,
                VIEW_HIDDEN_TIMED_NEWS,
                DELETE_NEWS,
                SEPARATOR,
                ADD_COMMENTS,
                REMOVE_COMMENTS);

        //return EnumSet.allOf(Permission.class);
    }

    public HashMap<Object, Boolean> getIsSeparator() {
        return new HashMap<Object, Boolean>() {
            @Override
            public Boolean get(Object permission) {
                return permission.equals(SEPARATOR);
            }
        };
    }

    public HashMap<String, PermissionGroup> getPermissionGroup() {
        return new HashMap<String, PermissionGroup>() {
            @Override
            public PermissionGroup get(Object permissionGroup) {
                return PermissionGroup.valueOf(String.valueOf(permissionGroup));
            }
        };
    }

    public boolean isAssigned(Permission permission, PermissionGroup permissionGroup) {
        Boolean state = getPermissionsAssignment().get(permissionGroup).get(permission).getState();
        return state == null || state;
    }

    public void setAssigned(Permission permission, PermissionGroup permissionGroup, Boolean state) {
        getPermissionsAssignment().get(permissionGroup).get(permission).setState(state);
    }


    private class PermissionAssigmnent extends HashMap<PermissionGroup, Map<Permission, State>> {
        @Override
        public Map<Permission, State> get(final Object key) {
            if (key == null) {
                return null;
            }
            final PermissionGroup permissionGroup;
            if (key instanceof PermissionGroup) {
                permissionGroup = (PermissionGroup) key;
            } else {
                permissionGroup = PermissionGroup.valueOf(String.valueOf(key));
            }
            Map<Permission, State> value = super.get(permissionGroup);
            if (value == null) {
                value = new HashMap<Permission, State>() {

                    @Override
                    public State get(Object key) {
                        if (key == null) {
                            return null;
                        }
                        final Permission permission;
                        if (key instanceof Permission) {
                            permission = (Permission) key;
                        } else {
                            permission = Permission.valueOf(String.valueOf(key));
                        }
                        State result = super.get(permission);
                        if (result == null) {
                            result = new State() {
                                @Override
                                public void setState(Boolean state) {
                                    super.setState(state);
                                    if (state != null) {
                                        setDependentPermissions(state);
                                    }
                                }

                                @Override
                                public void setDependent(boolean dependent) {
                                    super.setDependent(dependent);
                                    setDependentPermissions(dependent);

                                }

                                private void setDependentPermissions(boolean value) {
                                    Collection<Permission> dependentPermissions = permission.getDependent();
                                    for (Permission dependentPermission : dependentPermissions) {
                                        get(dependentPermission).setDependent(value);
                                    }
                                    Collection<PermissionGroup> dependentPermissionGroups = permissionGroup.getDependent();
                                    for (PermissionGroup dependentPermissionGroup : dependentPermissionGroups) {
                                        PermissionAssigmnent.this.get(dependentPermissionGroup).get(permission).setDependent(value);
                                    }
                                }
                            };
                            super.put(permission, result);
                        }
                        return result;
                    }
                };
                super.put(permissionGroup, value);
            }
            return value;
        }
    }

    public class State {

        private Boolean state = false;
        private Boolean outputState = false;
        private int dependent = 0;

        public Boolean getState() {
            return state;
        }

        public void setState(Boolean state) {
            this.state = state;
        }

        public Boolean getOutputState() {
            return state;
        }

        public void setOutputState(Boolean outputState) {
            this.outputState = outputState;
        }

        private void submitState() {
            setState(outputState);
        }

        public boolean isDependent() {
            return dependent != 0;
        }

        public void setDependent(boolean dependent) {

            if (dependent) {
                this.dependent++;
            } else {
                this.dependent--;
            }
            if (!isDependent()) {
                if (state == null) {
                    state = false;
                }
            } else {
                if (state != null && !state) {
                    state = null;
                }
            }

        }

    }

    public void updateAssignment(ActionEvent event) {

        String groupString = String.valueOf(FacesUtils.getEventParameter(event, "group"));
        PermissionGroup permissionGroup = PermissionGroup.valueOf(groupString);
        String permissionString = String.valueOf(FacesUtils.getEventParameter(event, "permission"));
        Permission permission = Permission.valueOf(permissionString);

        getPermissionsAssignment().get(permissionGroup).get(permission).submitState();
    }


    public Iterable<String> getDefaultStateList() {
        if (defaultStateList == null) {
            defaultStateList = Arrays.asList(SelectBooleanCheckbox.SELECTED_STATE, SelectBooleanCheckbox.UNSELECTED_STATE);
        }
        return defaultStateList;
    }

    public Iterable<String> getDependentStateList() {
        if (dependentStateList == null) {
            dependentStateList = Arrays.asList(SelectBooleanCheckbox.SELECTED_STATE, SelectBooleanCheckbox.UNDEFINED_STATE);
        }
        return dependentStateList;
    }

    public Map<PermissionGroup, Map<Permission, Iterable<String>>> getStateList() {
        if (stateList == null) {
            stateList = new HashMap<PermissionGroup, Map<Permission, Iterable<String>>>() {
                @Override
                public Map<Permission, Iterable<String>> get(final Object group) {
                    return new HashMap<Permission, Iterable<String>>() {
                        @Override
                        public Iterable<String> get(final Object permission) {
                            if (permissionsAssignment.get(group).get(permission).isDependent()) {
                                return getDependentStateList();
                            } else {
                                return getDefaultStateList();
                            }
                        }
                    };
                }
            };
        }
        return stateList;
    }

}
TOP

Related Classes of org.openfaces.demo.beans.selectbooleancheckbox.PermissionSchema$State

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.