1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
79
80
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();
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
110
111
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) {
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
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
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
239 if (searchUser != null && searchUser) {
240
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
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
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
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
296
297
298
299
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
306
307
308
309
310
311
312
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 }