Activiti 5 自定义用户管理 修改

刚接触activiti 5 ,怎么把业务的用户和流程关联起来是个重大的问题,经过探索,得到了实现的方法。

 

1.spring 配置文件

	<!-- Activiti begin -->
	<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
		<property name="dataSource" ref="dataSource" />
		<property name="transactionManager" ref="transactionManager" />
		<property name="databaseSchemaUpdate" value="true" />
		<property name="jobExecutorActivate" value="false" />
		<property name="history" value="full" />
		
		<!-- 自动部署 -->
		<property name="deploymentResources">
			<list>
				<value>classpath*:/deployments/*</value>
			</list>
		</property>
		
		<!-- 自定义表单字段类型 -->
		<property name="customFormTypes">
			<list>
				<bean class="me.kafeitu.demo.activiti.activiti.form.UsersFormType" />
			</list>
		</property>
		
		<property name="customSessionFactories">
			<list>
            	<bean class="com.sanshen.workflow.activiti.CustomUserEntityManagerFactory" />
            	<bean class="com.sanshen.workflow.activiti.CustomGroupEntityManagerFactory" />
			</list>
      </property>
	</bean>

 其中增加了customSessionFactories的配置。

 

2.用户管理和用户组管理工厂类实现org.activiti.engine.impl.interceptor.SessionFactory接口

public class CustomGroupEntityManagerFactory implements SessionFactory {
	private GroupEntityManager groupEntityManager;

	@Autowired
	public void setGroupEntityManager(GroupEntityManager groupEntityManager) {
		this.groupEntityManager = groupEntityManager;
	}

	public Class<?> getSessionType() {
		// 返回原始的GroupEntityManager类型
		return GroupEntityManager.class;
	}

	public Session openSession() {
		// 返回自定义的GroupEntityManager实例
		return groupEntityManager;
	}
}

 

public class CustomUserEntityManagerFactory implements SessionFactory {
	private UserEntityManager userEntityManager;

	@Autowired
	public void setUserEntityManager(UserEntityManager userEntityManager) {
		this.userEntityManager = userEntityManager;
	}

	public Class<?> getSessionType() {
		// 返回原始的UserManager类型
		return UserEntityManager.class;
	}

	public Session openSession() {
		// 返回自定义的UserManager实例
		return userEntityManager;
	}
}

 3.覆盖用户管理和用户组管理的类

/**
 * 
 */
package com.sanshen.workflow.activiti;

import java.util.List;


import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.UserQueryImpl;
import org.activiti.engine.impl.persistence.entity.IdentityInfoEntity;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.impl.persistence.entity.UserEntityManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;

import com.sanshen.js.service.account.AccountManager;

/**
 * 自定义的Activiti用户管理器
 * 
 * @author dragon
 * 
 */

@Service
public class CustomUserEntityManager extends UserEntityManager {
	private static final Log logger = LogFactory
			.getLog(CustomUserEntityManager.class);

	@Autowired
	private AccountManager accountManager;

	@Override
	public UserEntity findUserById(final String userCode) {
		if (userCode == null)
			return null;

		try {
			UserEntity userEntity = null;
			com.sanshen.js.entity.account.User bUser = accountManager.getUser(Long.valueOf(userCode));
			userEntity = ActivitiUtils.toActivitiUser(bUser);
			return userEntity;
		} catch (EmptyResultDataAccessException e) {
			return null;
		}
	}

	@Override
	public List<Group> findGroupsByUser(final String userCode) {
		if (userCode == null)
			return null;

			List<com.sanshen.js.entity.account.Group> bGroups = accountManager.getUser(Long.valueOf(userCode)).getGroupList();
			
			List<Group> gs = null;
			gs = ActivitiUtils.toActivitiGroups(bGroups);
			return gs;
			
	}

	@Override
	public List<User> findUserByQueryCriteria(UserQueryImpl query, Page page) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public IdentityInfoEntity findUserInfoByUserIdAndKey(String userId,
			String key) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public List<String> findUserInfoKeysByUserIdAndType(String userId,
			String type) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public long findUserCountByQueryCriteria(UserQueryImpl query) {
		throw new RuntimeException("not implement method.");
	}
}
package com.sanshen.workflow.activiti;

import java.util.ArrayList;
import java.util.List;

import org.activiti.engine.identity.Group;
import org.activiti.engine.impl.GroupQueryImpl;
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.activiti.engine.impl.persistence.entity.GroupEntityManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;
@Service
public class CustomGroupEntityManager extends GroupEntityManager {
	private static final Log logger = LogFactory
			.getLog(CustomGroupEntityManager.class);

	@Autowired
	private AccountManager accountManager;

	@Override
	public GroupEntity findGroupById(final String groupCode) {
		if (groupCode == null)
			return null;
		
			try {
				com.sanshen.js.entity.account.Group bGroup = accountManager.getGroupByGroupId(groupCode);
				
				GroupEntity e = new GroupEntity();
				e.setRevision(1);

				// activiti有3种预定义的组类型:security-role、assignment、user
				// 如果使用Activiti
				// Explorer,需要security-role才能看到manage页签,需要assignment才能claim任务
				e.setType("assignment");

				e.setId(bGroup.getGroupId());
				e.setName(bGroup.getName());
				return e;
			} catch (EmptyResultDataAccessException e) {
				return null;
			}
			
	}

	@Override
	public List<Group> findGroupsByUser(final String userCode) {
		if (userCode == null)
			return null;

		List<com.sanshen.js.entity.account.Group> bGroupList = accountManager.getUser(Long.valueOf(userCode)).getGroupList();
		
		List<Group> gs = new ArrayList<Group>();
		GroupEntity g;
		for (com.sanshen.js.entity.account.Group bGroup : bGroupList) {
			g = new GroupEntity();
			g.setRevision(1);
			g.setType("assignment");

			g.setId(bGroup.getGroupId());
			g.setName(bGroup.getName());
			gs.add(g);
		}
		return gs;
	}

	@Override
	public List<Group> findGroupByQueryCriteria(GroupQueryImpl query, Page page) {
		throw new RuntimeException("not implement method.");
	}

	@Override
	public long findGroupCountByQueryCriteria(GroupQueryImpl query) {
		throw new RuntimeException("not implement method.");
	}
}

 其中CustomUserEntityManager和CustomGroupEntityManager有些方法没有实现,所有在使用中要防止调用到那些方法,不然会报错。

提供一个拷贝工具类

public class ActivitiUtils {
	
	public static UserEntity  toActivitiUser(User bUser){
		UserEntity userEntity = new UserEntity();
		userEntity.setId(bUser.getId().toString());
		userEntity.setFirstName(bUser.getName());
		userEntity.setLastName(bUser.getLoginName());
		userEntity.setPassword(bUser.getPassword());
		userEntity.setEmail(bUser.getEmail());
		userEntity.setRevision(1);
		return userEntity;
	}
	
	public static GroupEntity  toActivitiGroup(Group bGroup){
		GroupEntity groupEntity = new GroupEntity();
		groupEntity.setRevision(1);
		groupEntity.setType("assignment");

		groupEntity.setId(bGroup.getGroupId());
		groupEntity.setName(bGroup.getName());
		return groupEntity;
	}
	
	public static List<org.activiti.engine.identity.Group> toActivitiGroups(List<Group> bGroups){
		
		List<org.activiti.engine.identity.Group> groupEntitys = new ArrayList<org.activiti.engine.identity.Group>();
		
		for (Group bGroup : bGroups) {
			GroupEntity groupEntity = toActivitiGroup(bGroup);
			groupEntitys.add(groupEntity);
		}
		return groupEntitys;
	}
}

这样,自身的用户就可以充当activiti的用户了

修改后,activiti的相关ACT_ID_XXX表就可以删除了。

 

 参考

 

http://rongjih.blog.163.com/blog/static/335744612012631112640968/

http://forums.activiti.org/en/viewtopic.php?f=6&t=2439&hilit=UserManager

http://www.kafeitu.me/activiti/2012/04/23/synchronize-or-redesign-user-and-role-for-activiti.html

 

猜你喜欢

转载自124444154-qq-com.iteye.com/blog/1830995