/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.basesecurity.manager; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.EntityManager; import org.olat.basesecurity.Grant; import org.olat.basesecurity.Group; import org.olat.basesecurity.GroupMembership; import org.olat.basesecurity.IdentityRef; import org.olat.basesecurity.model.GrantImpl; import org.olat.basesecurity.model.GroupImpl; import org.olat.basesecurity.model.GroupMembershipImpl; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; import org.olat.resource.OLATResource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * * Initial date: 20.02.2014<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ @Service("groupDao") public class GroupDAO { @Autowired private DB dbInstance; public Group createGroup() { GroupImpl group = new GroupImpl(); group.setCreationDate(new Date()); dbInstance.getCurrentEntityManager().persist(group); return group; } public Group createGroup(String name) { GroupImpl group = new GroupImpl(); group.setCreationDate(new Date()); group.setName(name); dbInstance.getCurrentEntityManager().persist(group); return group; } public Group removeGroup(Group group) { EntityManager em = dbInstance.getCurrentEntityManager(); GroupImpl reloadedGroup = em.getReference(GroupImpl.class, group.getKey()); em.remove(reloadedGroup); return group; } public Group loadGroup(Long key) { Group group = dbInstance.getCurrentEntityManager().find(GroupImpl.class, key); return group; } /** * Add a membership to the group, in the set of the group too which can be * reloaded. */ public GroupMembership addMembershipTwoWay(Group group, Identity identity, String role) { GroupMembershipImpl membership = new GroupMembershipImpl(); membership.setCreationDate(new Date()); membership.setLastModified(new Date()); membership.setGroup(group); membership.setIdentity(identity); membership.setRole(role); dbInstance.getCurrentEntityManager().persist(membership); Set<GroupMembership> members = ((GroupImpl)group).getMembers(); if(members == null) { members = new HashSet<>(); ((GroupImpl)group).setMembers(members); } members.add(membership); return membership; } /** * Create a membership without updating the set in the group. */ public void addMembershipOneWay(Group group, Identity identity, String role) { GroupMembershipImpl membership = new GroupMembershipImpl(); membership.setCreationDate(new Date()); membership.setLastModified(new Date()); membership.setGroup(group); membership.setIdentity(identity); membership.setRole(role); dbInstance.getCurrentEntityManager().persist(membership); } public int removeMemberships(Group group) { EntityManager em = dbInstance.getCurrentEntityManager(); List<GroupMembership> memberships = em.createNamedQuery("membershipsByGroup", GroupMembership.class) .setParameter("groupKey", group.getKey()) .getResultList(); for(GroupMembership membership:memberships) { em.remove(membership); } return memberships.size(); } public int removeMemberships(Group group, String role) { return dbInstance.getCurrentEntityManager().createNamedQuery("deleteMembershipsByGroupAndRole") .setParameter("groupKey", group.getKey()) .setParameter("role", role) .executeUpdate(); } public int removeMembership(Group group, Identity identity) { EntityManager em = dbInstance.getCurrentEntityManager(); List<GroupMembership> memberships = em.createNamedQuery("membershipsByGroupAndIdentity", GroupMembership.class) .setParameter("groupKey", group.getKey()) .setParameter("identityKey", identity.getKey()) .getResultList(); for(GroupMembership membership:memberships) { em.remove(membership); } return memberships.size(); } public int removeMembership(Group group, IdentityRef identity, String role) { EntityManager em = dbInstance.getCurrentEntityManager(); List<GroupMembership> memberships = em.createNamedQuery("membershipsByGroupIdentityAndRole", GroupMembership.class) .setParameter("groupKey", group.getKey()) .setParameter("identityKey", identity.getKey()) .setParameter("role", role) .getResultList(); for(GroupMembership membership:memberships) { em.remove(membership); } return memberships.size(); } public int removeMemberships(IdentityRef identity) { String deleteQuery = "delete from bgroupmember as membership where membership.identity.key=:identityKey"; return dbInstance.getCurrentEntityManager() .createQuery(deleteQuery).setParameter("identityKey", identity.getKey()) .executeUpdate(); } public int countMembers(Group group) { Number count = dbInstance.getCurrentEntityManager() .createNamedQuery("countMembersByGroup", Number.class) .setParameter("groupKey", group.getKey()) .getSingleResult(); return count == null ? 0 : count.intValue(); } public boolean hasRole(Group group, Identity identity, String role) { Number count = dbInstance.getCurrentEntityManager() .createNamedQuery("hasRoleByGroupIdentityAndRole", Number.class) .setParameter("groupKey", group.getKey()) .setParameter("identityKey", identity.getKey()) .setParameter("role", role) .getSingleResult(); return count == null ? false : count.intValue() > 0; } public List<Identity> getMembers(Group group, String role) { return dbInstance.getCurrentEntityManager() .createNamedQuery("membersByGroupAndRole", Identity.class) .setParameter("groupKey", group.getKey()) .setParameter("role", role) .getResultList(); } public List<GroupMembership> getMemberships(Group group, String role) { return dbInstance.getCurrentEntityManager() .createNamedQuery("membershipsByGroupAndRole", GroupMembership.class) .setParameter("groupKey", group.getKey()) .setParameter("role", role) .getResultList(); } public boolean hasGrant(IdentityRef identity, String permission, OLATResource resource) { StringBuilder sb = new StringBuilder(); sb.append("select count(grant) from bgrant as grant") .append(" inner join grant.group as baseGroup") .append(" inner join baseGroup.members as membership") .append(" where membership.identity.key=:identityKey and grant.resource.key=:resourceKey") .append(" and grant.permission=:permission and membership.role=grant.role"); Number count = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Number.class) .setParameter("identityKey", identity.getKey()) .setParameter("resourceKey", resource.getKey()) .setParameter("permission", permission) .getSingleResult(); return count == null ? false: count.intValue() > 0; } public List<String> getPermissions(IdentityRef identity, OLATResource resource) { return dbInstance.getCurrentEntityManager() .createNamedQuery("grantedPermissionByIdentityAndResource", String.class) .setParameter("identityKey", identity.getKey()) .setParameter("resourceKey", resource.getKey()) .getResultList(); } public List<Grant> getGrants(Group group, String role) { StringBuilder sb = new StringBuilder(); sb.append("select grant from bgrant as grant") .append(" inner join fetch grant.group as baseGroup") .append(" inner join fetch grant.resource as res") .append(" where baseGroup.key=:groupKey and grant.role=:role"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Grant.class) .setParameter("groupKey", group.getKey()) .setParameter("role", role) .getResultList(); } public List<Grant> getGrants(List<Group> groups) { if(groups == null || groups.isEmpty()) return Collections.emptyList(); StringBuilder sb = new StringBuilder(); sb.append("select grant from bgrant as grant") .append(" inner join fetch grant.group as baseGroup") .append(" inner join fetch grant.resource as res") .append(" where baseGroup in (:groups)"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Grant.class) .setParameter("groups", groups) .getResultList(); } public List<Grant> getGrants(List<Group> groups, OLATResource resource) { if(groups == null || resource == null || groups.isEmpty()) return Collections.emptyList(); StringBuilder sb = new StringBuilder(); sb.append("select grant from bgrant as grant") .append(" inner join fetch grant.group as baseGroup") .append(" inner join fetch grant.resource as res") .append(" where baseGroup in (:groups) and res.key=:resourceKey"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Grant.class) .setParameter("groups", groups) .setParameter("resourceKey", resource.getKey()) .getResultList(); } public List<Grant> getGrants(Group group, String role, OLATResource resource) { StringBuilder sb = new StringBuilder(); sb.append("select grant from bgrant as grant") .append(" inner join fetch grant.group as baseGroup") .append(" inner join fetch grant.resource as res") .append(" where baseGroup=:group and res.key=:resourceKey and grant.role=:role"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Grant.class) .setParameter("group", group) .setParameter("resourceKey", resource.getKey()) .setParameter("role", role) .getResultList(); } public void addGrant(Group group, String role, String permission, OLATResource resource) { GrantImpl grant = new GrantImpl(); grant.setCreationDate(new Date()); grant.setGroup(group); grant.setPermission(permission); grant.setRole(role); grant.setResource(resource); dbInstance.getCurrentEntityManager().persist(grant); } public void removeGrant(Group group, String role, String permission, OLATResource resource) { StringBuilder sb = new StringBuilder(); sb.append("select grant from bgrant as grant") .append(" inner join fetch grant.group as baseGroup") .append(" inner join fetch grant.resource as res") .append(" where baseGroup=:group and res.key=:resourceKey and grant.permission=:permission and grant.role=:role"); EntityManager em = dbInstance.getCurrentEntityManager(); List<Grant> grantToDelete = em.createQuery(sb.toString(), Grant.class) .setParameter("group", group) .setParameter("resourceKey", resource.getKey()) .setParameter("role", role) .setParameter("permission", permission) .getResultList(); for(Grant grant:grantToDelete) { em.remove(grant); } } public void removeGrants(Group group, String role, OLATResource resource) { StringBuilder sb = new StringBuilder(); sb.append("select grant from bgrant as grant") .append(" inner join fetch grant.group as baseGroup") .append(" inner join fetch grant.resource as res") .append(" where baseGroup=:group and res.key=:resourceKey and grant.role=:role"); EntityManager em = dbInstance.getCurrentEntityManager(); List<Grant> grantToDelete = em.createQuery(sb.toString(), Grant.class) .setParameter("group", group) .setParameter("resourceKey", resource.getKey()) .setParameter("role", role) .getResultList(); for(Grant grant:grantToDelete) { em.remove(grant); } } }