/*
|
* 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.ArrayList;
|
import java.util.Collection;
|
import java.util.List;
|
import java.util.StringTokenizer;
|
|
import org.jboss.identity.idm.api.Attribute;
|
import org.jboss.identity.idm.api.AttributesManager;
|
import org.jboss.identity.idm.api.IdentitySearchCriteria;
|
import org.jboss.identity.idm.api.IdentitySession;
|
import org.jboss.identity.idm.api.RoleType;
|
import org.jboss.identity.idm.common.exception.FeatureNotSupportedException;
|
import org.jboss.identity.idm.common.exception.IdentityException;
|
import org.jboss.identity.idm.common.p3p.P3PConstants;
|
import org.jboss.identity.idm.impl.api.SimpleAttribute;
|
import org.jboss.identity.idm.impl.api.model.GroupId;
|
import org.jbpm.api.JbpmException;
|
import org.jbpm.api.identity.Group;
|
import org.jbpm.api.identity.User;
|
|
/**
|
* @author Tom Baeyens
|
* @author Jeff Yu
|
*/
|
public class JBossIdmIdentitySessionImpl implements org.jbpm.pvm.internal.identity.spi.IdentitySession {
|
|
protected IdentitySession identitySession;
|
|
public String DEFAULT_JBPM_MEMBER_ROLE = "default_jBPM_member_role";
|
|
public String DEFAUL_JBPM_GROUP_TYPE = "default_jBPM_Group_Type";
|
|
public JBossIdmIdentitySessionImpl(IdentitySession identitySession) {
|
this.identitySession = identitySession;
|
}
|
|
public String createUser(String userName, String givenName, String familyName, String businessEmail) {
|
try {
|
|
org.jboss.identity.idm.api.User idUser= identitySession.getPersistenceManager().createUser(userName);
|
|
List<Attribute> attrs = new ArrayList<Attribute>();
|
if (givenName != null) {
|
attrs.add(new SimpleAttribute(P3PConstants.INFO_USER_NAME_GIVEN, givenName));
|
}
|
if (familyName != null) {
|
attrs.add(new SimpleAttribute(P3PConstants.INFO_USER_NAME_FAMILY, familyName));
|
}
|
if (businessEmail != null) {
|
attrs.add(new SimpleAttribute(P3PConstants.INFO_USER_BUSINESS_INFO_ONLINE_EMAIL, businessEmail));
|
}
|
|
identitySession.getAttributesManager().addAttributes(idUser, attrs.toArray(new Attribute[attrs.size()]));
|
return idUser.getId();
|
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't create user "+userName, e);
|
}
|
|
}
|
|
|
public List<User> findUsers() {
|
try {
|
Collection<org.jboss.identity.idm.api.User> idUsers =
|
identitySession.getPersistenceManager().findUser((IdentitySearchCriteria)null);
|
|
List<User> users = new ArrayList<User>();
|
for (org.jboss.identity.idm.api.User idUser : idUsers) {
|
users.add(getUserInfo(idUser));
|
}
|
|
return users;
|
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't get users from identity component", e);
|
}
|
}
|
|
public User findUserById(String userId) {
|
try {
|
org.jboss.identity.idm.api.User idUser = identitySession.getPersistenceManager().findUser(userId);
|
if (idUser != null) {
|
return getUserInfo(idUser);
|
}
|
return null;
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't get user from id of " + userId, e);
|
}
|
}
|
|
private User getUserInfo(org.jboss.identity.idm.api.User idUser) throws IdentityException {
|
String name = idUser.getId();
|
String givenName = getAttributeString(idUser, P3PConstants.INFO_USER_NAME_GIVEN);
|
String familyName = getAttributeString(idUser, P3PConstants.INFO_USER_NAME_FAMILY);
|
String businessEmail = getAttributeString(idUser, P3PConstants.INFO_USER_BUSINESS_INFO_ONLINE_EMAIL);
|
|
UserImpl user = new UserImpl(name, givenName, familyName);
|
user.setBusinessEmail(businessEmail);
|
return user;
|
}
|
|
public List<User> findUsersById(String... userIds) {
|
List<User> users = new ArrayList<User>();
|
for (String userId : userIds){
|
User user = findUserById(userId);
|
if (user != null) {
|
users.add(user);
|
}
|
}
|
|
return users;
|
}
|
|
public List<User> findUsersByGroup(String groupId) {
|
try {
|
List<User> users = new ArrayList<User>();
|
org.jboss.identity.idm.api.Group idGroup = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
|
if (idGroup == null){
|
return users;
|
}
|
Collection<org.jboss.identity.idm.api.User> idusers =
|
identitySession.getRoleManager().findUsersWithRelatedRole(idGroup, null);
|
for (org.jboss.identity.idm.api.User iduser : idusers) {
|
users.add(findUserById(iduser.getId()));
|
}
|
|
return users;
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't find users by groupid: " + groupId, e);
|
} catch (FeatureNotSupportedException e) {
|
throw new JbpmException("couldn't find users by groupid: " + groupId, e);
|
}
|
|
}
|
|
public void deleteUser(String userName) {
|
try {
|
identitySession.getPersistenceManager().removeUser(userName, true);
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't delete user ["+userName + "]", e);
|
}
|
}
|
|
public String createGroup(String groupName, String groupType, String parentGroupId) {
|
|
try {
|
String gtype = groupType;
|
if (gtype == null) {
|
gtype = DEFAUL_JBPM_GROUP_TYPE;
|
}
|
org.jboss.identity.idm.api.Group group = identitySession.getPersistenceManager().createGroup(groupName, gtype);
|
String groupId = group.getId();
|
|
if (parentGroupId!=null) {
|
org.jboss.identity.idm.api.Group parentGroup = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(parentGroupId));
|
if (parentGroup==null) {
|
throw new JbpmException("parent group "+parentGroupId+" doesn't exist");
|
}
|
identitySession.getRelationshipManager().associateGroups(parentGroup, group);
|
}
|
return convertIdmGroupId2jbpmGroupId(groupId);
|
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't create group "+groupName, e);
|
}
|
|
}
|
|
public Group findGroupById(String groupId) {
|
try {
|
org.jboss.identity.idm.api.Group idGroup = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
|
if (idGroup == null) {
|
return null;
|
}
|
GroupImpl group = new GroupImpl();
|
group.setId(convertIdmGroupId2jbpmGroupId(idGroup.getId()));
|
group.setType(idGroup.getGroupType());
|
group.setName(idGroup.getName());
|
|
Collection<org.jboss.identity.idm.api.Group> idParentGroups =
|
identitySession.getRelationshipManager().findAssociatedGroups(idGroup, null, false, false);
|
|
if (idParentGroups.size() > 0) {
|
org.jboss.identity.idm.api.Group idParent = idParentGroups.iterator().next();
|
GroupImpl parentGroup = new GroupImpl();
|
parentGroup.setId(convertIdmGroupId2jbpmGroupId(idParent.getId()));
|
parentGroup.setType(idParent.getGroupType());
|
parentGroup.setName(idParent.getName());
|
|
group.setParent(parentGroup);
|
}
|
|
return group;
|
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't find group by id [" + groupId + "]", e);
|
}
|
}
|
|
public List<Group> findGroupsByGroupType(String groupType) {
|
try {
|
Collection<org.jboss.identity.idm.api.Group> idGroups = identitySession.getPersistenceManager().
|
findGroup(groupType);
|
|
List<Group> groups = new ArrayList<Group>();
|
for (org.jboss.identity.idm.api.Group idGroup: idGroups) {
|
groups.add(findGroupById(convertIdmGroupId2jbpmGroupId(idGroup.getId())));
|
}
|
|
return groups;
|
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't get groups from identity component, groupType [" + groupType + "]", e);
|
}
|
}
|
|
public List<Group> findGroupsByUser(String userId) {
|
|
try {
|
Collection<org.jboss.identity.idm.api.Group> idGroups = identitySession.getRoleManager()
|
.findGroupsWithRelatedRole(userId, null);
|
|
List<Group> groups = new ArrayList<Group>();
|
for (org.jboss.identity.idm.api.Group idGroup : idGroups) {
|
groups.add(findGroupById(convertIdmGroupId2jbpmGroupId(idGroup.getId())));
|
}
|
return groups;
|
} catch (Exception e) {
|
throw new JbpmException("Couldn't get Groups by userId [" + userId + "]", e);
|
|
}
|
}
|
|
public List<Group> findGroupsByUserAndGroupType(String userName, String groupType) {
|
try {
|
org.jboss.identity.idm.api.User idUser = identitySession.getPersistenceManager().findUser(userName);
|
|
Collection<org.jboss.identity.idm.api.Group> idGroups = identitySession.getRoleManager()
|
.findGroupsWithRelatedRole(idUser, groupType, null);
|
List<Group> groups = new ArrayList<Group>();
|
|
for (org.jboss.identity.idm.api.Group idGroup : idGroups) {
|
groups.add(findGroupById(convertIdmGroupId2jbpmGroupId(idGroup.getId())));
|
}
|
return groups;
|
} catch (Exception e) {
|
throw new JbpmException("couldn't get groups for user "+userName+" and groupType "+groupType, e);
|
}
|
}
|
|
public void deleteGroup(String groupId) {
|
try {
|
org.jboss.identity.idm.api.Group group = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
|
|
if (group==null) {
|
return;
|
}
|
|
identitySession.getPersistenceManager().removeGroup(group, true);
|
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't delete group "+groupId, e);
|
}
|
}
|
|
public void createMembership(String userId, String groupId, String role) {
|
try {
|
org.jboss.identity.idm.api.Group group = findIdmGroupByIdmGroupId(convertjbpmGroupId2IdmGroupId(groupId));
|
if (group==null) {
|
throw new JbpmException("group "+groupId+" doesn't exist");
|
}
|
|
org.jboss.identity.idm.api.User idUser = identitySession.getPersistenceManager().findUser(userId);
|
if (idUser==null) {
|
throw new JbpmException("user "+userId+" doesn't exist");
|
}
|
|
if (role == null) {
|
role = DEFAULT_JBPM_MEMBER_ROLE;
|
}
|
RoleType roleType = identitySession.getRoleManager().getRoleType(role);
|
System.out.println("The Role Type is: " + roleType);
|
if (roleType == null) {
|
roleType = identitySession.getRoleManager().createRoleType(role);
|
}
|
identitySession.getRoleManager().createRole(roleType, idUser, group);
|
|
} catch (Exception e) {
|
throw new JbpmException("couldn't create membership "+userId+", "+groupId+", "+role, e);
|
}
|
}
|
|
public void deleteMembership(String userId, String groupId, String role) {
|
try {
|
RoleType rtype = identitySession.getRoleManager().getRoleType(role);
|
identitySession.getRoleManager().removeRole(rtype.getName(), userId, convertjbpmGroupId2IdmGroupId(groupId));
|
} catch (Exception e) {
|
throw new JbpmException("couldn't delete the membership [" + userId + "," + groupId + "," + role + "]", e);
|
}
|
|
}
|
|
protected org.jboss.identity.idm.api.Group findIdmGroupByIdmGroupId(String groupId) {
|
try {
|
return identitySession.getPersistenceManager().findGroupById(groupId);
|
} catch (IdentityException e) {
|
throw new JbpmException("couldn't find the group by groupId: " + groupId, e);
|
}
|
}
|
|
protected String getAttributeString(org.jboss.identity.idm.api.User idUser, String attributeName) throws IdentityException {
|
return getAttributeString(idUser, null, attributeName);
|
}
|
|
protected String getAttributeString(org.jboss.identity.idm.api.Group idGroup, String attributeName) throws IdentityException {
|
return getAttributeString(null, idGroup, attributeName);
|
}
|
|
protected String getAttributeString(org.jboss.identity.idm.api.User idUser, org.jboss.identity.idm.api.Group idGroup, String attributeName) throws IdentityException {
|
AttributesManager attributesManager = identitySession.getAttributesManager();
|
Attribute attribute = null;
|
if (idUser !=null) {
|
attribute = attributesManager.getAttribute(idUser, attributeName);
|
} else {
|
attribute = attributesManager.getAttribute(idGroup, attributeName);
|
}
|
if (attribute!=null) {
|
return (String) attribute.getValue();
|
}
|
return null;
|
}
|
|
|
/**
|
* Return jBPM groupId, which is: GroupType.GroupName, from IDM GroupId
|
*
|
* @param groupId
|
* @return
|
*/
|
private String convertIdmGroupId2jbpmGroupId(String groupId) {
|
GroupId theGroupId = new GroupId(groupId);
|
if (this.DEFAUL_JBPM_GROUP_TYPE.equals(theGroupId.getType()) || theGroupId.getType() == null) {
|
return theGroupId.getName();
|
}
|
return theGroupId.getType() + "." + theGroupId.getName();
|
}
|
|
/**
|
* Convert the jBPM GroupId to IDM GroupId.
|
*
|
* @param jbpmGroupId
|
* @return
|
*/
|
private String convertjbpmGroupId2IdmGroupId(String jbpmGroupId) {
|
StringTokenizer st = new StringTokenizer(jbpmGroupId, ".");
|
String type = DEFAUL_JBPM_GROUP_TYPE;
|
if (st.countTokens() > 1) {
|
type = st.nextToken();
|
}
|
String name = st.nextToken();
|
|
return new GroupId(name, type).getId();
|
}
|
|
public IdentitySession getIdentitySession() {
|
return identitySession;
|
}
|
|
public void setIdentitySession(IdentitySession identitySession) {
|
this.identitySession = identitySession;
|
}
|
|
|
}
|