Копируем права доступа в другой проект одной кнопкой

Одна из самых популярных конфигураций TrackStudio: много однотипных проектов, права на которые задаются для разных команд по-разному. Эта конфигурация встречается и в HelpDesk, и в заказной разработке. При создании нового проекта приходится каждый раз настраивать права доступа. А что, если попробовать скопировать эти настройки из другого проекта, которым занимается та же команда разработчиков?
Это можно сделать одной кнопкой, по которой будет запускаться Add Message/Instead Of Trigger. Само сообщение при этом создаваться не будет. В теле сообщения указывается номер проекта, из которого нужно взять настройки.

package scripts.instead_of_add_message;

import com.trackstudio.app.adapter.AdapterManager;
import com.trackstudio.app.session.SessionContext;
import com.trackstudio.exception.GranException;
import com.trackstudio.external.OperationTrigger;
import com.trackstudio.secured.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.List;

/**
 * Копирует ACL из задачи, указанной в описании сообщения, в текущую.
 */
public class CopyAccessRules  implements OperationTrigger {

       public static Log log = LogFactory.getLog(CopyAccessRules.class);
    public SecuredMessageTriggerBean execute(SecuredMessageTriggerBean message) throws GranException
    {
        String taskNum = message.getDescription();
        SessionContext sc = message.getSecure();
        SecuredTaskBean task = AdapterManager.getInstance().getSecuredTaskAdapterManager().findTaskByNumber(sc, taskNum);
        if (task!=null){
        List<SecuredTaskAclBean> targetAcl = AdapterManager.getInstance().getSecuredAclAdapterManager().getTaskAclList(sc,
                message.getTaskId());
        List<SecuredTaskAclBean> sourceAcl = AdapterManager.getInstance().getSecuredAclAdapterManager().getTaskAclList(sc,
                task.getId());

        for (SecuredTaskAclBean tb: sourceAcl){
            if (tb.canManage() && tb.getTaskId().equals(task.getId())){

                SecuredPrstatusBean group = tb.getGroup();
                SecuredUserBean user = tb.getUser();
                SecuredPrstatusBean prstatus = tb.getPrstatus();
                boolean isOverride = tb.isOverride();
            boolean exists = false;
                if (!sc.getUser().equals(user)){
            for (SecuredTaskAclBean ta: targetAcl){
                SecuredPrstatusBean groupA = ta.getGroup();
                SecuredUserBean userA = ta.getUser();
                SecuredPrstatusBean prstatusA = ta.getPrstatus();
                boolean isOverrideA = ta.isOverride();
                if ((group!=null && groupA!=null && group.equals(groupA)) 
|| (group==null && groupA == null))
                    if ((user!=null && userA!=null && user.equals(userA)) 
|| (user==null && userA == null))
                        if ((prstatus!=null && prstatusA!=null && prstatus.equals(prstatusA)) ||
 (prstatus==null && prstatusA == null))
                            if (isOverride==isOverrideA){
                                exists = true;
                                break;
                            }
            }
                if (!exists){
                    // create
                    String aclid = 
AdapterManager.getInstance().getSecuredAclAdapterManager().createAcl(sc, message.getTaskId(), null,
                            user!=null ? user.getId() : null, group!=null ? group.getId() : null);
AdapterManager.getInstance().getSecuredAclAdapterManager().updateTaskAcl(sc, aclid, prstatus.getId(), isOverride);

                }
            }
        }
        }
        }
        return message;
    }
}
AttachmentSize
CopyAccessRules.class4.49 KB
CopyAccessRules.java2.99 KB