/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jbpm.pvm.internal.identity.impl;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.jbpm.api.JbpmException;
import org.jbpm.api.identity.Group;
import org.jbpm.api.identity.User;
import org.jbpm.pvm.internal.identity.spi.IdentitySession;
/**
* @author Tom Baeyens
*/
public class IdentitySessionImpl implements IdentitySession {
protected Session session;
public String createUser(String userName, String givenName, String familyName,
String businessEmail) {
UserImpl user = new UserImpl(userName, givenName, familyName);
user.setBusinessEmail(businessEmail);
session.save(user);
return user.getId();
}
public User findUserById(String userId) {
return (User) session.createCriteria(UserImpl.class)
.add(Restrictions.eq("id", userId))
.uniqueResult();
}
public List<User> findUsersById(String... userIds) {
List<User> users = session.createCriteria(UserImpl.class)
.add(Restrictions.in("id", userIds))
.list();
if (userIds.length != users.size()) {
throw new JbpmException("not all users were found: " + Arrays.toString(userIds));
}
return users;
}
public List<User> findUsers() {
return session.createCriteria(UserImpl.class).list();
}
public void deleteUser(String userId) {
// lookup the user
User user = findUserById(userId);
// cascade the deletion to the memberships
List<MembershipImpl> memberships = session.createCriteria(MembershipImpl.class)
.add(Restrictions.eq("user", user))
.list();
// delete the related memberships
for (MembershipImpl membership : memberships) {
session.delete(membership);
}
// delete the user
session.delete(user);
}
public String createGroup(String groupName, String groupType, String parentGroupId) {
GroupImpl group = new GroupImpl();
String groupId = groupType != null ? groupType + "." + groupName : groupName;
group.setId(groupId);
group.setName(groupName);
group.setType(groupType);
if (parentGroupId != null) {
GroupImpl parentGroup = findGroupById(parentGroupId);
group.setParent(parentGroup);
}
session.save(group);
return group.getId();
}
public List<User> findUsersByGroup(String groupId) {
return session.createCriteria(MembershipImpl.class)
.createAlias("group", "g")
.add(Restrictions.eq("g.id", groupId))
.setProjection(Projections.property("user"))
.list();
}
public GroupImpl findGroupById(String groupId) {
return (GroupImpl) session.createCriteria(GroupImpl.class)
.add(Restrictions.eq("id", groupId))
.uniqueResult();
}
public List<Group> findGroupsByUserAndGroupType(String userId, String groupType) {
return session.createQuery("select distinct m.group"
+ " from "
+ MembershipImpl.class.getName()
+ " as m where m.user.id = :userId"
+ " and m.group.type = :groupType")
.setString("userId", userId)
.setString("groupType", groupType)
.list();
}
public List<Group> findGroupsByUser(String userId) {
return session.createQuery("select distinct m.group"
+ " from "
+ MembershipImpl.class.getName()
+ " as m where m.user.id = :userId").setString("userId", userId).list();
}
public List<Group> findGroups() {
return session.createCriteria(GroupImpl.class).list();
}
public void deleteGroup(String groupId) {
// look up the group
GroupImpl group = findGroupById(groupId);
// cascade the deletion to the memberships
List<MembershipImpl> memberships = session.createCriteria(MembershipImpl.class)
.add(Restrictions.eq("group", group))
.list();
// delete the related memberships
for (MembershipImpl membership : memberships) {
session.delete(membership);
}
// delete the group
session.delete(group);
}
public void createMembership(String userId, String groupId, String role) {
User user = findUserById(userId);
if (user == null) {
throw new JbpmException("user " + userId + " doesn't exist");
}
Group group = findGroupById(groupId);
if (group == null) {
throw new JbpmException("group " + groupId + " doesn't exist");
}
MembershipImpl membership = new MembershipImpl();
membership.setUser(user);
membership.setGroup(group);
membership.setRole(role);
session.save(membership);
}
public void deleteMembership(String userId, String groupId, String role) {
MembershipImpl membership = (MembershipImpl) session.createCriteria(MembershipImpl.class)
.createAlias("user", "u")
.createAlias("group", "g")
.add(Restrictions.eq("u.id", userId))
.add(Restrictions.eq("g.id", groupId))
.uniqueResult();
session.delete(membership);
}
public void setSession(Session session) {
this.session = session;
}
}