001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    package org.apache.shiro.authz;
020    
021    import java.io.Serializable;
022    import java.util.Collection;
023    import java.util.LinkedHashSet;
024    import java.util.Set;
025    
026    /**
027     * A simple representation of a security role that has a name and a collection of permissions.  This object can be
028     * used internally by Realms to maintain authorization state.
029     *
030     * @since 0.2
031     */
032    public class SimpleRole implements Serializable {
033    
034        protected String name = null;
035        protected Set<Permission> permissions;
036    
037        public SimpleRole() {
038        }
039    
040        public SimpleRole(String name) {
041            setName(name);
042        }
043    
044        public SimpleRole(String name, Set<Permission> permissions) {
045            setName(name);
046            setPermissions(permissions);
047        }
048    
049        public String getName() {
050            return name;
051        }
052    
053        public void setName(String name) {
054            this.name = name;
055        }
056    
057        public Set<Permission> getPermissions() {
058            return permissions;
059        }
060    
061        public void setPermissions(Set<Permission> permissions) {
062            this.permissions = permissions;
063        }
064    
065        public void add(Permission permission) {
066            Set<Permission> permissions = getPermissions();
067            if (permissions == null) {
068                permissions = new LinkedHashSet<Permission>();
069                setPermissions(permissions);
070            }
071            permissions.add(permission);
072        }
073    
074        public void addAll(Collection<Permission> perms) {
075            if (perms != null && !perms.isEmpty()) {
076                Set<Permission> permissions = getPermissions();
077                if (permissions == null) {
078                    permissions = new LinkedHashSet<Permission>(perms.size());
079                    setPermissions(permissions);
080                }
081                permissions.addAll(perms);
082            }
083        }
084    
085        public boolean isPermitted(Permission p) {
086            Collection<Permission> perms = getPermissions();
087            if (perms != null && !perms.isEmpty()) {
088                for (Permission perm : perms) {
089                    if (perm.implies(p)) {
090                        return true;
091                    }
092                }
093            }
094            return false;
095        }
096    
097        public int hashCode() {
098            return (getName() != null ? getName().hashCode() : 0);
099        }
100    
101        public boolean equals(Object o) {
102            if (o == this) {
103                return true;
104            }
105            if (o instanceof SimpleRole) {
106                SimpleRole sr = (SimpleRole) o;
107                //only check name, since role names should be unique across an entire application:
108                return (getName() != null ? getName().equals(sr.getName()) : sr.getName() == null);
109            }
110            return false;
111        }
112    
113        public String toString() {
114            return getName();
115        }
116    }