View Javadoc

1   /**
2    * Copyright 2005-2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.rule.dao.impl;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.apache.ojb.broker.query.Criteria;
20  import org.apache.ojb.broker.query.QueryByCriteria;
21  import org.apache.ojb.broker.query.QueryFactory;
22  import org.apache.ojb.broker.query.ReportQueryByCriteria;
23  import org.kuali.rice.core.api.exception.RiceRuntimeException;
24  import org.kuali.rice.kew.rule.RuleBaseValues;
25  import org.kuali.rice.kew.rule.RuleDelegationBo;
26  import org.kuali.rice.kew.rule.RuleExtensionBo;
27  import org.kuali.rice.kew.rule.RuleResponsibilityBo;
28  import org.kuali.rice.kew.rule.dao.RuleDelegationDAO;
29  import org.kuali.rice.kew.api.KewApiConstants;
30  import org.kuali.rice.kim.api.identity.principal.Principal;
31  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
32  import org.springmodules.orm.ojb.support.PersistenceBrokerDaoSupport;
33  
34  import java.util.ArrayList;
35  import java.util.Collection;
36  import java.util.HashSet;
37  import java.util.List;
38  import java.util.Map;
39  import java.util.Set;
40  
41  
42  public class RuleDelegationDAOOjbImpl extends PersistenceBrokerDaoSupport implements RuleDelegationDAO {
43  
44      public List<RuleDelegationBo> findByDelegateRuleId(String ruleId) {
45          Criteria crit = new Criteria();
46          crit.addEqualTo("delegateRuleId", ruleId);
47          return (List) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(RuleDelegationBo.class, crit));
48      }
49  
50      public void save(RuleDelegationBo ruleDelegation) {
51      	this.getPersistenceBrokerTemplate().store(ruleDelegation);
52      }
53      public List<RuleDelegationBo> findAllCurrentRuleDelegations(){
54          Criteria crit = new Criteria();
55          crit.addEqualTo("delegationRule.currentInd", true);
56          return (List) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(RuleDelegationBo.class, crit));
57      }
58  
59      public RuleDelegationBo findByRuleDelegationId(String ruleDelegationId){
60          Criteria crit = new Criteria();
61          crit.addEqualTo("ruleDelegationId", ruleDelegationId);
62          return (RuleDelegationBo) this.getPersistenceBrokerTemplate().getObjectByQuery(new QueryByCriteria(RuleDelegationBo.class, crit));
63  
64      }
65      public void delete(String ruleDelegationId){
66      	this.getPersistenceBrokerTemplate().delete(findByRuleDelegationId(ruleDelegationId));
67      }
68  
69      public List<RuleDelegationBo> findByResponsibilityIdWithCurrentRule(String responsibilityId) {
70      	Criteria crit = new Criteria();
71      	crit.addEqualTo("responsibilityId", responsibilityId);
72      	crit.addEqualTo("delegationRule.currentInd", true);
73      	Collection delegations = getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(RuleDelegationBo.class, crit));
74      	return new ArrayList<RuleDelegationBo>(delegations);
75      }
76  
77      /**
78       * This overridden method ...
79       *
80       * @see org.kuali.rice.kew.rule.dao.RuleDelegationDAO#search(java.lang.String, java.lang.Long, java.lang.Long, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Boolean, java.util.Map, java.lang.String)
81       */
82      public List<RuleDelegationBo> search(String parentRuleBaseVaueId, String parentResponsibilityId, String docTypeName, String ruleId,
83              String ruleTemplateId, String ruleDescription, String workgroupId,
84              String principalId, String delegationType, Boolean activeInd,
85              Map extensionValues, String workflowIdDirective) {
86          Criteria crit = new Criteria(); //getSearchCriteria(docTypeName, ruleTemplateId, ruleDescription, delegationType, activeInd, extensionValues);
87  
88          if (StringUtils.isNotBlank(delegationType) && !delegationType.equals(KewApiConstants.DELEGATION_BOTH)) {
89          	crit.addEqualTo("delegationType", delegationType);
90          }
91          
92          if (StringUtils.isNotBlank(parentRuleBaseVaueId) && StringUtils.isNumeric(parentRuleBaseVaueId)) {
93              crit.addIn("responsibilityId", this.getRuleResponsibilitySubQuery(new Long(parentRuleBaseVaueId)));
94          }
95  
96          if (StringUtils.isNotBlank(parentResponsibilityId) && StringUtils.isNumeric(parentResponsibilityId)) {
97              crit.addEqualTo("responsibilityId", parentResponsibilityId);
98          }
99  
100         crit.addIn("delegateRuleId", getRuleBaseValuesSubQuery(docTypeName, ruleId,
101                                                                ruleTemplateId, ruleDescription, workgroupId,
102                                                                principalId, activeInd,
103                                                                extensionValues, workflowIdDirective));
104 
105         return (List<RuleDelegationBo>) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(RuleDelegationBo.class, crit, true));
106     }
107 
108     /**
109      * This overridden method ...
110      *
111      * @see org.kuali.rice.kew.rule.dao.RuleDelegationDAO#search(java.lang.String, java.lang.Long, java.lang.String, java.util.Collection, java.lang.String, java.lang.String, java.lang.Boolean, java.util.Map, java.util.Collection)
112      */
113     public List<RuleDelegationBo> search(String parentRuleBaseVaueId, String parentResponsibilityId, String docTypeName, String ruleTemplateId,
114             String ruleDescription, Collection<String> workgroupIds,
115             String workflowId, String delegationType, Boolean activeInd,
116             Map extensionValues, Collection actionRequestCodes) {
117         Criteria crit = new Criteria();
118         
119         if (StringUtils.isNotBlank(delegationType) && !delegationType.equals(KewApiConstants.DELEGATION_BOTH)) {
120         	crit.addEqualTo("delegationType", delegationType);
121         }
122         
123         if (StringUtils.isNotBlank(parentRuleBaseVaueId) && StringUtils.isNumeric(parentRuleBaseVaueId)) {
124             crit.addIn("responsibilityId", this.getRuleResponsibilitySubQuery(new Long(parentRuleBaseVaueId)));
125         }
126 
127         if (StringUtils.isNotBlank(parentResponsibilityId) && StringUtils.isNumeric(parentResponsibilityId)) {
128             crit.addEqualTo("responsibilityId", parentResponsibilityId);
129         }
130 
131         crit.addIn("delegateRuleId", getRuleBaseValuesSubQuery(docTypeName, ruleTemplateId,
132                                                                ruleDescription, workgroupIds,
133                                                                workflowId, activeInd,
134                                                                extensionValues, actionRequestCodes));
135        return (List) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(RuleDelegationBo.class, crit, true));
136     }
137 
138     private ReportQueryByCriteria getResponsibilitySubQuery(String ruleResponsibilityName) {
139         Criteria responsibilityCrit = new Criteria();
140         responsibilityCrit.addLike("ruleResponsibilityName", ruleResponsibilityName);
141         ReportQueryByCriteria query = QueryFactory.newReportQuery(RuleResponsibilityBo.class, responsibilityCrit);
142         query.setAttributes(new String[] { "ruleBaseValuesId" });
143         return query;
144     }
145 
146     private ReportQueryByCriteria getWorkgroupResponsibilitySubQuery(Set<Long> workgroupIds) {
147             Set<String> workgroupIdStrings = new HashSet<String>();
148             for (Long workgroupId : workgroupIds) {
149                 workgroupIdStrings.add(workgroupId.toString());
150             }
151         Criteria responsibilityCrit = new Criteria();
152         responsibilityCrit.addIn("ruleResponsibilityName", workgroupIds);
153         responsibilityCrit.addEqualTo("ruleResponsibilityType", KewApiConstants.RULE_RESPONSIBILITY_GROUP_ID);
154         ReportQueryByCriteria query = QueryFactory.newReportQuery(RuleResponsibilityBo.class, responsibilityCrit);
155         query.setAttributes(new String[] { "ruleBaseValuesId" });
156         return query;
157     }
158 
159     private ReportQueryByCriteria getRuleBaseValuesSubQuery(String docTypeName, String ruleTemplateId,
160             String ruleDescription, Collection<String> workgroupIds,
161             String workflowId, Boolean activeInd,
162             Map<String, String> extensionValues, Collection actionRequestCodes) {
163         Criteria crit = getSearchCriteria(docTypeName, ruleTemplateId, ruleDescription, activeInd, extensionValues);
164         crit.addIn("responsibilities.ruleBaseValuesId", getResponsibilitySubQuery(workgroupIds, workflowId, actionRequestCodes, (workflowId != null), ((workgroupIds != null) && !workgroupIds.isEmpty())));
165         crit.addEqualTo("delegateRule", 1);
166         ReportQueryByCriteria query = QueryFactory.newReportQuery(RuleBaseValues.class, crit);
167         query.setAttributes(new String[] { "ruleBaseValuesId" });
168         return query;
169     }
170 
171     private ReportQueryByCriteria getRuleBaseValuesSubQuery(String docTypeName, String ruleId,
172             String ruleTemplateId, String ruleDescription, String workgroupId,
173             String principalId, Boolean activeInd,
174             Map<String, String> extensionValues, String workflowIdDirective) {
175         Criteria crit = getSearchCriteria(docTypeName, ruleTemplateId, ruleDescription, activeInd, extensionValues);
176         if (ruleId != null) {
177             crit.addEqualTo("id", ruleId);
178         }
179         if (workgroupId != null) {
180             crit.addIn("ruleResponsibilities.ruleBaseValuesId", getResponsibilitySubQuery(workgroupId));
181         }
182         List<String> workgroupIds = new ArrayList<String>();
183         Boolean searchUser = Boolean.FALSE;
184         Boolean searchUserInWorkgroups = Boolean.FALSE;
185         if (workflowIdDirective != null) {/** IU patch EN-1552 */
186             if ("group".equals(workflowIdDirective)) {
187                 searchUserInWorkgroups = Boolean.TRUE;
188             } else if ("".equals(workflowIdDirective)) {
189                 searchUser = Boolean.TRUE;
190                 searchUserInWorkgroups = Boolean.TRUE;
191             } else {
192                 searchUser = Boolean.TRUE;
193             }
194         }
195         if (!org.apache.commons.lang.StringUtils.isEmpty(principalId) && searchUserInWorkgroups)
196         {
197             Principal principal = KimApiServiceLocator.getIdentityService().getPrincipal(principalId);
198 
199             if (principal == null)
200             {
201                 throw new RiceRuntimeException("Failed to locate user for the given workflow id: " + principalId);
202             }
203             workgroupIds = KimApiServiceLocator.getGroupService().getGroupIdsByPrincipalId(principalId);
204         }
205         crit.addIn("ruleResponsibilities.ruleBaseValuesId", getResponsibilitySubQuery(workgroupIds, principalId, searchUser, searchUserInWorkgroups));
206         crit.addEqualTo("delegateRule", 1);
207         ReportQueryByCriteria query = QueryFactory.newReportQuery(RuleBaseValues.class, crit);
208         query.setAttributes(new String[] { "ruleBaseValuesId" });
209         return query;
210         //return (List<RuleDelegation>) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(RuleDelegation.class, crit, true));
211     }
212 
213     private ReportQueryByCriteria getRuleResponsibilitySubQuery(Long ruleBaseValuesId) {
214         Criteria crit = new Criteria();
215         crit.addEqualTo("ruleBaseValuesId", ruleBaseValuesId);
216         ReportQueryByCriteria query = QueryFactory.newReportQuery(RuleResponsibilityBo.class, crit);
217         query.setAttributes(new String[] { "responsibilityId" });
218         return query;
219         //return getResponsibilitySubQuery(workgroupIdStrings,workflowId,new ArrayList<String>(), searchUser, searchUserInWorkgroups);
220     }
221 
222     private ReportQueryByCriteria getResponsibilitySubQuery(List<String> workgroupIds, String workflowId, Boolean searchUser, Boolean searchUserInWorkgroups) {
223         Collection<String> workgroupIdStrings = new ArrayList<String>();
224         for (String workgroupId : workgroupIds) {
225             workgroupIdStrings.add(workgroupId);
226         }
227         return getResponsibilitySubQuery(workgroupIdStrings,workflowId,new ArrayList<String>(), searchUser, searchUserInWorkgroups);
228     }
229 
230     private ReportQueryByCriteria getResponsibilitySubQuery(Collection<String> workgroupIds, String workflowId, Collection<String> actionRequestCodes, Boolean searchUser, Boolean searchUserInWorkgroups) {
231         Criteria responsibilityCrit = new Criteria();
232         if ( (actionRequestCodes != null) && (!actionRequestCodes.isEmpty()) ) {
233             responsibilityCrit.addIn("actionRequestedCd", actionRequestCodes);
234         }
235 
236         Criteria ruleResponsibilityNameCrit = null;
237         if (!org.apache.commons.lang.StringUtils.isEmpty(workflowId)) {
238             // workflow user id exists
239             if (searchUser != null && searchUser) {
240                 // searching user wishes to search for rules specific to user
241                 ruleResponsibilityNameCrit = new Criteria();
242                 ruleResponsibilityNameCrit.addLike("ruleResponsibilityName", workflowId);
243                 ruleResponsibilityNameCrit.addEqualTo("ruleResponsibilityType", KewApiConstants.RULE_RESPONSIBILITY_WORKFLOW_ID);
244             }
245             if ( (searchUserInWorkgroups != null && searchUserInWorkgroups) && (workgroupIds != null) && (!workgroupIds.isEmpty()) ) {
246                 // at least one workgroup id exists and user wishes to search on workgroups
247                 if (ruleResponsibilityNameCrit == null) {
248                     ruleResponsibilityNameCrit = new Criteria();
249                 }
250                 Criteria workgroupCrit = new Criteria();
251                 workgroupCrit.addIn("ruleResponsibilityName", workgroupIds);
252                 workgroupCrit.addEqualTo("ruleResponsibilityType", KewApiConstants.RULE_RESPONSIBILITY_GROUP_ID);
253                 ruleResponsibilityNameCrit.addOrCriteria(workgroupCrit);
254             }
255         } else if ( (workgroupIds != null) && (workgroupIds.size() == 1) ) {
256             // no user and one workgroup id
257             ruleResponsibilityNameCrit = new Criteria();
258             ruleResponsibilityNameCrit.addLike("ruleResponsibilityName", workgroupIds.iterator().next());
259             ruleResponsibilityNameCrit.addEqualTo("ruleResponsibilityType", KewApiConstants.RULE_RESPONSIBILITY_GROUP_ID);
260         } else if ( (workgroupIds != null) && (workgroupIds.size() > 1) ) {
261             // no user and more than one workgroup id
262             ruleResponsibilityNameCrit = new Criteria();
263             ruleResponsibilityNameCrit.addIn("ruleResponsibilityName", workgroupIds);
264             ruleResponsibilityNameCrit.addEqualTo("ruleResponsibilityType", KewApiConstants.RULE_RESPONSIBILITY_GROUP_ID);
265         }
266         if (ruleResponsibilityNameCrit != null) {
267             responsibilityCrit.addAndCriteria(ruleResponsibilityNameCrit);
268         }
269 
270         ReportQueryByCriteria query = QueryFactory.newReportQuery(RuleResponsibilityBo.class, responsibilityCrit);
271         query.setAttributes(new String[] { "ruleBaseValuesId" });
272         return query;
273     }
274 
275 
276     private Criteria getSearchCriteria(String docTypeName, String ruleTemplateId, String ruleDescription, Boolean activeInd, Map<String, String> extensionValues) {
277         Criteria crit = new Criteria();
278         crit.addEqualTo("currentInd", Boolean.TRUE);
279         crit.addEqualTo("templateRuleInd", Boolean.FALSE);
280         if (activeInd != null) {
281             crit.addEqualTo("active", activeInd);
282         }
283         if (docTypeName != null) {
284             crit.addLike("UPPER(docTypeName)", docTypeName.toUpperCase());
285         }
286         if (ruleDescription != null && !ruleDescription.trim().equals("")) {
287             crit.addLike("UPPER(description)", ruleDescription.toUpperCase());
288         }
289         if (ruleTemplateId != null) {
290             crit.addEqualTo("ruleTemplateId", ruleTemplateId);
291         }
292         if (extensionValues != null && !extensionValues.isEmpty()) {
293             for (Map.Entry<String,String> entry : extensionValues.entrySet()) {
294                 if (!org.apache.commons.lang.StringUtils.isEmpty(entry.getValue())) {
295                     // Criteria extensionCrit = new Criteria();
296                     // extensionCrit.addEqualTo("extensionValues.key",
297                     // entry.getKey());
298                     // extensionCrit.addLike("extensionValues.value",
299                     // "%"+(String) entry.getValue()+"%");
300 
301                     Criteria extensionCrit2 = new Criteria();
302                     extensionCrit2.addEqualTo("extensionValues.key", entry.getKey());
303                     extensionCrit2.addLike("UPPER(extensionValues.value)", ("%" + (String) entry.getValue() + "%").toUpperCase());
304 
305                     // Criteria extensionCrit3 = new Criteria();
306                     // extensionCrit3.addEqualTo("extensionValues.key",
307                     // entry.getKey());
308                     // extensionCrit3.addLike("extensionValues.value",
309                     // ("%"+(String) entry.getValue()+"%").toLowerCase());
310 
311                     // extensionCrit.addOrCriteria(extensionCrit2);
312                     // extensionCrit.addOrCriteria(extensionCrit3);
313                     ReportQueryByCriteria query = QueryFactory.newReportQuery(RuleExtensionBo.class, extensionCrit2);
314                     query.setAttributes(new String[] { "ruleBaseValuesId" });
315                     crit.addIn("ruleExtensions.ruleBaseValuesId", query);
316                 }
317             }
318         }
319         return crit;
320     }
321 }