Liferay7 BPM門戶開發之46: 集成Activiti用戶、用戶組、成員關系同步


在實際的BPM集成開發過程中,Liferay和Activiti這兩個異構的系統之間,用戶、組的同步需求非常重要,用來實現簽收組的概念,比如指定簽收組、會簽、搶簽都需要用到。

Activiti可以通過自定義實現SessionFactory,實現customUserManager和customRoleManager的方式集成第三方的用戶關系。

這里我介紹一個方法,可以借助Liferay的實體監聽器來做用戶、組、用戶-組成員關系的三種同步。

其實實現原理非常簡單

用戶組的同步,就是實現 BaseModelListener 泛型接口

package com.lifiti.hooks;

import org.osgi.service.component.annotations.Component;
import com.liferay.portal.kernel.exception.ModelListenerException;
import com.liferay.portal.kernel.model.BaseModelListener;
import com.liferay.portal.kernel.model.ModelListener;
import com.liferay.portal.kernel.model.UserGroup;
import com.lifiti.util.IdentifyHelper;

@Component(immediate = true, service = ModelListener.class)
public class UserGroupListener extends BaseModelListener<UserGroup>{
    
    @Override
    public void onAfterCreate(UserGroup ug) throws ModelListenerException{
        System.out.println(ug.getUuid()+ug.getName() + " Added.");
        IdentifyHelper.saveGroup(ug.getUuid(), ug.getName(), 1);
    }
    
    @Override
    public void onAfterRemove(UserGroup ug) throws ModelListenerException {
        System.out.println(ug.getName() + " Deleted.");
        IdentifyHelper.delGroup(ug.getUuid());
    }

    @Override
    public void onAfterUpdate(UserGroup ug) throws ModelListenerException {
        System.out.println(ug.getName() + " Modified.");
        IdentifyHelper.delGroup(ug.getUuid());
        IdentifyHelper.saveGroup(ug.getUuid(), ug.getName(), 1);
    }


}

 

用戶,成員關系的同步

其中onAfterAddAssociation 就是監聽成員關系,可以在liferay的users_usergroups表和activiti的act_id_membership查看

實際上就是一個關聯中間表

package com.lifiti.hooks;

import org.osgi.service.component.annotations.Component;
import com.liferay.portal.kernel.exception.ModelListenerException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.BaseModelListener;
import com.liferay.portal.kernel.model.ModelListener;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.UserGroupLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.lifiti.util.IdentifyHelper;

@Component(immediate = true, service = ModelListener.class)
public class UserListener extends BaseModelListener<User> {

    @Override
    public void onAfterCreate(User u) throws ModelListenerException {
        System.out.println(u.getScreenName() + " Added.");
        IdentifyHelper.saveUser(u.getScreenName(), u.getLastName() + u.getFirstName(), u.getEmailAddress());
    }

    @Override
    public void onAfterRemove(User u) throws ModelListenerException {
        System.out.println(u.getUserId() + " Deleted.");
        IdentifyHelper.delUser(u.getScreenName());
    }

    @Override
    public void onAfterUpdate(User u) throws ModelListenerException {
        System.out.println(u.getUserId() + " Modified.");
        IdentifyHelper.delUser(u.getScreenName());
        IdentifyHelper.saveUser(u.getScreenName(), u.getLastName() + u.getFirstName(), u.getEmailAddress());
    }

    @Override
    public void onAfterAddAssociation(Object classPK, String associationClassName, Object associationClassPK)
            throws ModelListenerException {
        try {
            //對關系類型進行過濾,比如com.liferay.portal.kernel.model.UserRole先不處理
            if ("com.liferay.portal.kernel.model.UserGroup".equals(associationClassName)) {
                IdentifyHelper.createMembership(
                        UserLocalServiceUtil.getUser(Long.parseLong(classPK.toString())).getScreenName(),
                        UserGroupLocalServiceUtil.getUserGroup(Long.parseLong(associationClassPK.toString()))
                                .getUuid());
                System.out.println(classPK.toString() + "#" + associationClassName + "#" + associationClassPK.toString()
                        + " associationClassName Modified.");
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (PortalException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onAfterRemoveAssociation(Object classPK, String associationClassName, Object associationClassPK)
            throws ModelListenerException {    
        try {
            if ("com.liferay.portal.kernel.model.UserGroup".equals(associationClassName)) {
                IdentifyHelper.deleteMembership(
                        UserLocalServiceUtil.getUser(Long.parseLong(classPK.toString())).getScreenName(),
                        UserGroupLocalServiceUtil.getUserGroup(Long.parseLong(associationClassPK.toString()))
                                .getUuid());
                System.out.println(classPK.toString() + "#" + associationClassName + "#" + associationClassPK.toString()
                        + " associationClassName Removed.");
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (PortalException e) {
            e.printStackTrace();
        }
    }

}

 

運行情況:

1、用戶同步,在liferay的用戶管理后台添加用戶:

添加后,activiti也有同名的用戶了(自動同步),即使修改或刪除也能同步:

 

2、用戶組同步

注意,liferay叫用戶群組,acitiviti叫組

liferay添加組以后,activiti也自動同步:

 

3、成員關系同步

同步后,發現activiti也有同樣的 “用戶-組” 關系了

 

Activiti的集成開發系列文章集合在這里:

http://www.cnblogs.com/starcrm/p/6047486.html

 

全部工程源代碼下載:

 http://download.csdn.net/detail/starcrm/9715804


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM