001    /**
002     * Copyright 2005-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kew.rule;
017    
018    import org.kuali.rice.core.api.delegation.DelegationType;
019    import org.kuali.rice.kew.rule.bo.RuleTemplateBo;
020    import org.kuali.rice.kew.service.KEWServiceLocator;
021    import org.kuali.rice.kew.api.KewApiConstants;
022    import org.kuali.rice.kew.workgroup.GroupNameId;
023    import org.kuali.rice.kim.api.group.Group;
024    import org.kuali.rice.kim.api.identity.principal.Principal;
025    import org.kuali.rice.kim.api.identity.principal.PrincipalContract;
026    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
027    
028    import java.util.List;
029    
030    import static org.junit.Assert.assertTrue;
031    
032    /**
033     * This is a description of what this class does - gilesp don't forget to fill this in. 
034     * 
035     * @author Kuali Rice Team (rice.collab@kuali.org)
036     *
037     */
038    public final class RuleTestUtils {
039            
040            private RuleTestUtils() {
041                    throw new UnsupportedOperationException("do not call");
042            }
043            
044            /**
045             * <p>This method will create a delegate rule for the rule (assumed to be cardinality of 1) specified by the given
046             * docType and ruleTemplate. 
047             * 
048             * <p>As a side effect, active documents of this type will be requeued for workflow processing.
049             * 
050             * @param delegateUser the user who will be the delegate
051             */
052            public static RuleDelegationBo createDelegationToUser(String docType, String ruleTemplate, String delegateUser) {
053                    // create and save a rule delegation 
054            RuleBaseValues originalRule = getRule(docType, ruleTemplate);
055            List<RuleResponsibilityBo> responsibilities = originalRule.getRuleResponsibilities();
056            assertTrue("assuming there is 1 responsibility", responsibilities != null && responsibilities.size() == 1);
057            
058            RuleResponsibilityBo originalResp = responsibilities.get(0);
059    
060            Principal delegatePrincipal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(delegateUser);
061    
062                    // save the new rule delegation
063                    // this *SHOULD* requeue
064                    return createRuleDelegationToUser(originalRule, originalResp, delegatePrincipal);
065            }
066    
067            /**
068             * <p>This method will create a delegate rule for the rule (assumed to be cardinality of 1) specified by the given
069             * docType and ruleTemplate. 
070             * 
071             * <p>As a side effect, active documents of this type will be requeued for workflow processing.
072             * 
073             * @param delegateUser the user who will be the delegate
074             */
075            public static RuleDelegationBo createDelegationToGroup(String docType, String ruleTemplate, String delegateGroupId) {
076                    // create and save a rule delegation 
077            RuleBaseValues originalRule = getRule(docType, ruleTemplate);
078            List<RuleResponsibilityBo> responsibilities = originalRule.getRuleResponsibilities();
079            assertTrue("assuming there is 1 responsibility", responsibilities != null && responsibilities.size() == 1);
080            
081            RuleResponsibilityBo originalResp = responsibilities.get(0);
082            Group delegateGroup = KEWServiceLocator.getIdentityHelperService().getGroup(new GroupNameId(delegateGroupId));
083            
084                    // save the new rule delegation
085                    // this *SHOULD* requeue
086                    return createRuleDelegationToGroup(originalRule, originalResp, delegateGroup);
087            }
088            /**
089             * This method gets a rule from a docType / ruleTemplate combo
090             */
091            public static RuleBaseValues getRule(String docType, String ruleTemplate) {
092                    List rules = KEWServiceLocator.getRuleService().fetchAllCurrentRulesForTemplateDocCombination(ruleTemplate, docType);
093            assertTrue("assuming there is 1 rule", rules != null && rules.size() == 1);
094            
095            RuleBaseValues originalRule = (RuleBaseValues)rules.get(0);
096                    return originalRule;
097            }
098    
099            /**
100             * <p>This method creates and saves a rule delegation
101             * 
102             * <p>As a side effect, active documents of this type will be requeued for workflow processing.
103             * 
104             * @param parentRule
105             * @param parentResponsibility
106             * @param delegatePrincipal
107             */
108            public static RuleDelegationBo createRuleDelegationToUser(RuleBaseValues parentRule, RuleResponsibilityBo parentResponsibility, PrincipalContract delegatePrincipal) {
109                    return createRuleDelegation(parentRule, parentResponsibility, delegatePrincipal.getPrincipalId(), KewApiConstants.RULE_RESPONSIBILITY_WORKFLOW_ID);
110            }
111            
112            /**
113             * <p>This method creates and saves a rule delegation
114             * 
115             * <p>As a side effect, active documents of this type will be requeued for workflow processing.
116             * 
117             * @param parentRule
118             * @param parentResponsibility
119             * @param delegateGroup
120             */
121            public static RuleDelegationBo createRuleDelegationToGroup(RuleBaseValues parentRule, RuleResponsibilityBo parentResponsibility, Group delegateGroup) {
122                    return createRuleDelegation(parentRule, parentResponsibility, delegateGroup.getId(), KewApiConstants.RULE_RESPONSIBILITY_GROUP_ID);
123            }
124            
125            /**
126             * <p>This method creates and saves a rule delegation
127             * 
128             * <p>As a side effect, active documents of this type will be requeued for workflow processing.
129             */
130            private static RuleDelegationBo createRuleDelegation(RuleBaseValues parentRule, RuleResponsibilityBo parentResponsibility, String delegateId, String groupTypeCode) {
131            RuleTemplateBo delegationTemplate = parentRule.getRuleTemplate();
132                    RuleDelegationBo ruleDelegation = new RuleDelegationBo();
133                    ruleDelegation.setResponsibilityId(parentResponsibility.getResponsibilityId());
134                    ruleDelegation.setDelegationType(DelegationType.PRIMARY);
135                    RuleBaseValues rule = new RuleBaseValues();
136                    ruleDelegation.setDelegationRule(rule);
137                    rule.setDelegateRule(true);
138                    rule.setActive(true);
139                    rule.setCurrentInd(true);
140                    rule.setDocTypeName(parentRule.getDocTypeName());
141                    rule.setRuleTemplateId(delegationTemplate.getDelegationTemplateId());
142                    rule.setRuleTemplate(delegationTemplate);
143                    rule.setDescription("Description of this delegate rule");
144                    rule.setForceAction(true);
145                    RuleResponsibilityBo delegationResponsibility = new RuleResponsibilityBo();
146                    rule.getRuleResponsibilities().add(delegationResponsibility);
147                    delegationResponsibility.setRuleBaseValues(rule);
148                    delegationResponsibility.setRuleResponsibilityName(delegateId);
149                    delegationResponsibility.setRuleResponsibilityType(groupTypeCode);
150                    KEWServiceLocator.getRuleService().saveRuleDelegation(ruleDelegation, true);
151                    return ruleDelegation;
152            }
153    }