/* * Copyright (c) 2008 TouK.pl * 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 pl.touk.wonderfulsecurity.beans; import javax.persistence.*; import java.io.Serializable; import java.util.Set; import java.util.HashSet; import java.util.Iterator; import pl.touk.wonderfulsecurity.exceptions.PermissionCollisionException; import pl.touk.wonderfulsecurity.helpers.PermissionExclusion; /** * Model object that represents group of users. Navigation from group to users is not needed. * * @author Lukasz Kucharski - lkc@touk.pl */ @Entity @Table(name = "WSEC_GROUP", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})}) public class WsecGroup implements Serializable { // ------------------------------ FIELDS ------------------------------ @Id @GeneratedValue(strategy = GenerationType.AUTO) protected Long id; protected String name; protected String description; @ManyToMany @JoinTable(name = "WSEC_GROUP_ROLE", joinColumns = {@JoinColumn(name = "GROUP_ID")}, inverseJoinColumns = {@JoinColumn(name = "ROLE_ID")}) protected Set<WsecRole> roles = new HashSet<WsecRole>(); @ManyToMany @JoinTable(name = "WSEC_GROUP_PERMISSION", joinColumns = {@JoinColumn(name = "GROUP_ID")}, inverseJoinColumns = {@JoinColumn(name = "PERMISSION_ID")}) protected Set<WsecPermission> permissions = new HashSet<WsecPermission>(); @ManyToMany(mappedBy="groups") protected Set<WsecUser> users = new HashSet<WsecUser>(); // --------------------------- CONSTRUCTORS --------------------------- /** * Copy constructor * */ public WsecGroup(WsecGroup group) { this(group.getId(), group.getName(), group.getDescription()); } public WsecGroup(Long id, String name, String description) { this.id = id; this.name = name; this.description = description; } public WsecGroup() { } public WsecGroup(String name, String description) { this.name = name; this.description = description; } // --------------------- GETTER / SETTER METHODS --------------------- public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<WsecRole> getRoles() { return roles; } public void setRoles(Set<WsecRole> roles) { this.roles = roles; } public Set<WsecPermission> getPermissions() { return permissions; } public void setPermissions(Set<WsecPermission> permissions) { this.permissions = permissions; } public Set<WsecUser> getUsers() { return users; } public void setUsers(Set<WsecUser> users) { this.users = users; } // ------------------------ CANONICAL METHODS ------------------------ public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof WsecGroup)) { return false; } WsecGroup rhs = (WsecGroup) obj; return ((rhs.id == null ? this.id == null : rhs.id.equals(this.id)) && (rhs.name == null ? this.name == null : rhs.name.equals(this.name))); } public int hashCode() { int result = 17; result = 31 * result + (id==null ? 0 : id.hashCode()); result = 31 * result + (name == null ? 0 : name.hashCode()); return result; } public String toString() { return new StringBuilder().append("id:").append(id).append("\nname:").append(name).toString(); } // -------------------------- OTHER METHODS -------------------------- public boolean addUser(WsecUser user){ PermissionExclusion.checkIfConflicts(user, this); user.getGroups().add(this); return users.add(user); } public boolean removeUser(WsecUser user){ user.getGroups().remove(this); return users.remove(user); } public boolean addRole(WsecRole role) throws PermissionCollisionException{ PermissionExclusion.checkIfConflicts(this, role); return roles.add(role); } public boolean deleteRole(WsecRole wsecRole) { return roles.remove(wsecRole); } public Set<WsecRole> getAllRoles() { return roles; } public boolean addPermission(WsecPermission permission) throws PermissionCollisionException{ PermissionExclusion.checkIfConflicts(this, permission); permission.getReceivingGroups().add(this); return permissions.add(permission); } public boolean removePermission(WsecPermission permission) { permission.getReceivingGroups().remove(this); return permissions.remove(permission); } public Set<WsecPermission> getAllPermissions() { Set<WsecPermission> result = new HashSet<WsecPermission>(); result.addAll(getPermissionsInheritedFromRoles()); result.addAll(this.permissions); return result; } public Set<WsecPermission> getPermissionsInheritedFromRoles() { Set<WsecPermission> result = new HashSet<WsecPermission>(); for (WsecRole role : roles) { result.addAll(role.getPermissions()); } return result; } public Set<WsecPermission> getAllPermissionExcludes() { Set<WsecPermission> result = new HashSet<WsecPermission>(); Set<WsecPermission> perms = getAllPermissions(); for (WsecPermission permission : perms) { result.addAll(permission.getExcludes()); } return result; } public boolean hasPermission(WsecPermission permission){ return permissions.contains(permission); } }