发现JBPM4的权限方面略差一些以后,还是觉得可以续写接口,实现自定义用户组
贴出以下几个关键文件:
jbpm.identity.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <jbpm-configuration> <transaction-context> <object class="com.squall.jbpm.test.MesIdentitySessionImpl"/> </transaction-context> </jbpm-configuration>
MesUser.java
package com.squall.jbpm.test;
import java.io.Serializable;
import java.sql.Blob;
import org.jbpm.api.identity.User;
public class MesUser implements Serializable, User {
private static final long serialVersionUID = 1L;
private String id;
private String userNo;// 员工工号
private String userName;// 员工姓名
private String userSex;// 性别
private String userPassword;// 密码
private String userType;// 类型
private String userMail;// 电子邮件
private String isValid;// 是否有效Y/N
private Blob signaturePic;// 电子签名
private String remarks;// 备注
protected long dbid; // 数据库内部自生成的ID
protected int dbversion;
public int getDbversion() {
return dbversion;
}
public MesUser() {
}
public MesUser(String id, String userName, String userMail) {
this.id = id;
this.userName = userName;
this.userMail = userMail;
}
public void setDbversion(int dbversion) {
this.dbversion = dbversion;
}
public long getDbid() {
return dbid;
}
public void setDbid(long dbid) {
this.dbid = dbid;
}
public void setId(String id) {
this.id = id;
}
public String getUserNo() {
return userNo;
}
public void setUserNo(String userNo) {
this.userNo = userNo;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserType() {
return userType;
}
public void setUserType(String userType) {
this.userType = userType;
}
public String getUserMail() {
return userMail;
}
public void setUserMail(String userMail) {
this.userMail = userMail;
}
public String getIsValid() {
return isValid;
}
public void setIsValid(String isValid) {
this.isValid = isValid;
}
public Blob getSignaturePic() {
return signaturePic;
}
public void setSignaturePic(Blob signaturePic) {
this.signaturePic = signaturePic;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
public String getDisplayName() {
return userName + "(" + id + ")";
}
// 实现User接口所必须实现的几个方法
public String getId() {
return this.id;
}
public String getGivenName() {
return null;
}
public String getFamilyName() {
return null;
}
public String getBusinessEmail() {
return this.userMail;
}
}
MesGroup.java
package com.squall.jbpm.test;
import java.io.Serializable;
import org.jbpm.api.identity.Group;
public class MesGroup implements Serializable, Group {
private static final long serialVersionUID = 1L;
private String id;
private String groupName;// 组织名称
private String groupType;// 组织类型
private MesGroup parentGroup;// 父组织
private String remarks;// 备注
protected long dbid;
protected int dbversion;
public int getDbversion() {
return dbversion;
}
public void setDbversion(int dbversion) {
this.dbversion = dbversion;
}
public long getDbid() {
return dbid;
}
public void setDbid(long dbid) {
this.dbid = dbid;
}
public String getParentGroupID() {
return parentGroup != null ? parentGroup.getId() : null;
}
public String getParentGroupName() {
return parentGroup == null ? "xxx" : parentGroup.getGroupName();
}
public void setId(String id) {
this.id = id;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public String getGroupType() {
return groupType;
}
public void setGroupType(String groupType) {
this.groupType = groupType;
}
public MesGroup getParentGroup() {
return parentGroup;
}
public void setParentGroup(MesGroup parentGroup) {
this.parentGroup = parentGroup;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
// 实现Group接口必须的几个方法
public String getName() {
return this.groupName;
}
public String getType() {
return this.groupType;
}
public String getId() {
return id;
}
}
MesGroupMember.java
package com.squall.jbpm.test;
import java.io.Serializable;
public class MesGroupMember implements Serializable {
private static final long serialVersionUID = 1L;
protected long dbid;
protected int dbversion;
private MesUser user;
private MesGroup group;
protected String role;
public int getDbversion() {
return dbversion;
}
public void setDbversion(int dbversion) {
this.dbversion = dbversion;
}
public long getDbid() {
return dbid;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public void setDbid(long dbid) {
this.dbid = dbid;
}
public MesGroup getGroup() {
return group;
}
public void setGroup(MesGroup group) {
this.group = group;
}
public String getUserNo() {
return user.getUserNo();
}
public String getUserID() {
return user.getId();
}
public String getUserName() {
return user.getUserName();
}
public MesUser getUser() {
return user;
}
public void setUser(MesUser user) {
this.user = user;
}
}
MesIdentitySessionImpl.java
package com.squall.jbpm.test;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
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.env.BasicEnvironment;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.id.DbidGenerator;
import org.jbpm.pvm.internal.identity.spi.IdentitySession;
@SuppressWarnings("unchecked")
public class MesIdentitySessionImpl implements IdentitySession {
protected Session session;
public MesIdentitySessionImpl() {
this.session = BasicEnvironment.getFromCurrent(Session.class);
}
/*
public String createH() {
Test t = new Test();
long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
t.setDbid(dbid);
t.setId("abc");
return null;
}
*/
public String createUser(String id, String userName,
String businessEmail, String familName) {
MesUser user = new MesUser(id, userName, businessEmail);
long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class).getNextId();
user.setDbid(dbid);
session.save(user);
return user.getId();
}
public MesUser findUserById(String userId) {
return (MesUser) session.createCriteria(MesUser.class).add(
Restrictions.eq("id", userId)).uniqueResult();
}
public List<User> findUsersById(String... userIds) {
List<User> users = session.createCriteria(MesUser.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(MesUser.class).list();
}
public void deleteUser(String userId) {
// lookup the user
MesUser user = findUserById(userId);
// cascade the deletion to the memberships
List<MesGroupMember> memberships = session.createCriteria(
MesGroupMember.class).add(Restrictions.eq("user", user)).list();
// delete the related memberships
for (MesGroupMember membership : memberships) {
session.delete(membership);
}
// delete the user
session.delete(user);
}
public String createGroup(String groupName, String groupType,
String parentGroupId) {
MesGroup group = new MesGroup();
String groupId = groupType != null ? groupType + "." + groupName
: groupName;
group.setId(groupId);
long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class)
.getNextId();
group.setDbid(dbid);
group.setGroupName(groupName);
group.setGroupType(groupType);
if (parentGroupId != null) {
MesGroup parentGroup = findGroupById(parentGroupId);
group.setParentGroup(parentGroup);
}
session.save(group);
return group.getId();
}
public List<User> findUsersByGroup(String groupId) {
return session.createCriteria(MesGroupMember.class).createAlias(
"group", "g").add(Restrictions.eq("g.id", groupId))
.setProjection(Projections.property("user")).list();
}
public MesGroup findGroupById(String groupId) {
return (MesGroup) session.createCriteria(MesGroup.class).add(
Restrictions.eq("id", groupId)).uniqueResult();
}
public List<Group> findGroupsByUserAndGroupType(String userId,
String groupType) {
return session.createQuery(
"select distinct m.group" + " from "
+ MesGroupMember.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) {
List<Group> gList = session.createQuery(
"select distinct m.group" + " from "
+ MesGroupMember.class.getName()
+ " as m where m.user.id = :userId").setString(
"userId", userId).list();
return gList;
}
public List<Group> findGroups() {
return session.createCriteria(MesGroup.class).list();
}
public void deleteGroup(String groupId) {
// look up the group
MesGroup group = findGroupById(groupId);
// cascade the deletion to the memberships
List<MesGroupMember> memberships = session.createCriteria(
MesGroupMember.class).add(Restrictions.eq("group", group))
.list();
// delete the related memberships
for (MesGroupMember membership : memberships) {
session.delete(membership);
}
// delete the group
session.delete(group);
}
public void createMembership(String userId, String groupId, String role) {
MesUser user = findUserById(userId);
if (user == null) {
throw new JbpmException("user " + userId + " doesn't exist");
}
MesGroup group = findGroupById(groupId);
if (group == null) {
throw new JbpmException("group " + groupId + " doesn't exist");
}
MesGroupMember membership = new MesGroupMember();
membership.setUser(user);
membership.setGroup(group);
membership.setRole(role);
long dbid = EnvironmentImpl.getFromCurrent(DbidGenerator.class)
.getNextId();
membership.setDbid(dbid);
session.save(membership);
}
public void deleteMembership(String userId, String groupId, String role) {
MesGroupMember membership = (MesGroupMember) session.createCriteria(
MesGroupMember.class).createAlias("user", "u").createAlias(
"group", "g").add(Restrictions.eq("u.id", userId)).add(
Restrictions.eq("g.id", groupId)).uniqueResult();
session.delete(membership);
}
}
applicationContext-hibernate.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config />
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="hibernate.properties"
p:ignoreUnresolvablePlaceholders="true" />
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>jbpm.repository.hbm.xml</value>
<value>jbpm.execution.hbm.xml</value>
<value>jbpm.history.hbm.xml</value>
<value>jbpm.task.hbm.xml</value>
<value>jbpm.identity.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${dataSource.driverClassName}" />
<property name="url" value="${dataSource.url}" />
<property name="username" value="${dataSource.username}" />
<property name="password" value="${dataSource.password}" />
</bean>
</beans>
customize.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.jbpm.pvm.internal.identity.impl" default-access="field"> <!-- ### USER ########################################################### --> <class name="com.squall.jbpm.test.MesUser" table="JBPM4_CUSTOMIZE_USER"> <id name="dbid" column="DBID"> <generator class="assigned" /> </id> <version name="dbversion" column="DBVERSION_" /> <property name="id" column="USERID_" /> <!-- 登陆ID --> <property name="userNo" column="USERNO_" /> <!-- 员工工号 --> <property name="userName" column="USERNAME_" /> <!-- 姓名 --> <property name="userSex" column="USERSEX_" /> <!-- 性别 --> <property name="userPassword" column="USERPASSWORD_" /> <!-- 密码 --> <property name="userType" column="USERTYPE_" /> <!-- 类型 --> <property name="userMail" column="USERMAIL_" /> <!-- 电子邮件 --> <property name="signaturePic" column="SIGNATUREPIC_" /> <!-- 电子签名 --> <property name="remarks" column="REMARKS_" /> <!-- 备注 --> </class> <!-- ### MEMBERSHIP ##################################################### --> <class name="com.squall.jbpm.test.MesGroupMember" table="JBPM4_CUSTOMIZE_MEMBERSHIP"> <id name="dbid" column="DBID_"> <generator class="assigned" /> </id> <version name="dbversion" column="DBVERSION_" /> <many-to-one name="user" column="USER_" class="com.squall.jbpm.test.MesUser" foreign-key="FK_MEM_USER" index="IDX_MEM_USER" /> <many-to-one name="group" column="GROUP_" class="com.squall.jbpm.test.MesGroup" foreign-key="FK_MEM_GROUP" index="IDX_MEM_GROUP" /> <property name="role" column="NAME_" /> </class> <!-- ### GROUP ########################################################### --> <class name="com.squall.jbpm.test.MesGroup" table="JBPM4_CUSTOMIZE_GROUP"> <id name="dbid" column="DBID_"> <generator class="assigned" /> </id> <version name="dbversion" column="DBVERSION_" /> <!-- private String groupID;//数据库内部ID号 private String groupName;//组织名称 private String groupType;//组织类型 private MesGroup parentGroup;//父组织 private String remarks;//备注 --> <property name="id" column="ID_" /> <property name="groupName" column="NAME_" /> <property name="groupType" column="TYPE_" /> <property name="remarks" column="REMARKS_" /> <many-to-one name="parentGroup" column="PARENT_" class="com.squall.jbpm.test.MesGroup" foreign-key="FK_GROUP_PARENT" index="IDX_GROUP_PARENT" /> </class> </hibernate-mapping>
自己看看,懂了就OK了!