001 /**
002 * Copyright 2004-2012 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.hr.time.roles.dao;
017
018 import java.sql.Date;
019 import java.util.ArrayList;
020 import java.util.Collection;
021 import java.util.List;
022
023 import org.apache.commons.collections.CollectionUtils;
024 import org.apache.commons.lang.StringUtils;
025 import org.apache.ojb.broker.query.Criteria;
026 import org.apache.ojb.broker.query.Query;
027 import org.apache.ojb.broker.query.QueryFactory;
028 import org.apache.ojb.broker.query.ReportQueryByCriteria;
029 import org.kuali.hr.job.Job;
030 import org.kuali.hr.time.roles.TkRole;
031 import org.kuali.hr.time.service.base.TkServiceLocator;
032 import org.kuali.hr.time.util.TKUtils;
033 import org.kuali.hr.time.util.TkConstants;
034 import org.kuali.hr.time.workarea.WorkArea;
035 import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
036 import org.kuali.rice.krad.service.KRADServiceLocator;
037
038 public class TkRoleDaoSpringOjbImpl extends PlatformAwareDaoBaseOjb implements TkRoleDao {
039
040 public List<TkRole> findAllRoles(String principalId, Date asOfDate) {
041 return findRoles(principalId, asOfDate, null, null, null, null);
042 }
043
044 @SuppressWarnings("unchecked")
045 @Override
046 public List<TkRole> findPositionRoles(String positionNumber, Date asOfDate, String roleName, Long workArea, String department, String chart) {
047 List<TkRole> roles = new ArrayList<TkRole>();
048
049 Criteria root = new Criteria();
050 Criteria effdt = new Criteria();
051 Criteria timestamp = new Criteria();
052 ReportQueryByCriteria effdtSubQuery;
053 ReportQueryByCriteria timestampSubQuery;
054
055 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
056 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber");
057 effdt.addLessOrEqualThan("effectiveDate", asOfDate);
058
059 // EFFECTIVE DATE --
060
061 // Adding criteria to nest an AND that has multiple ORs to select
062 // the correct ID / date combination.
063 Criteria orWrapperEd = new Criteria();
064 Criteria nstWaEd = new Criteria();
065 Criteria nstDptEd = new Criteria();
066 Criteria nstChrEd = new Criteria();
067
068 // Inner AND to allow for all null chart/dept/work area
069 Criteria nullAndWrapper = new Criteria();
070 nullAndWrapper.addIsNull("workArea");
071 nullAndWrapper.addIsNull("department");
072 nullAndWrapper.addIsNull("chart");
073
074 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR
075 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR
076 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR
077 orWrapperEd.addOrCriteria(nstWaEd);
078 orWrapperEd.addOrCriteria(nstDptEd);
079 orWrapperEd.addOrCriteria(nstChrEd);
080
081 // Inner AND to allow for all null chart/dept/work area
082 orWrapperEd.addOrCriteria(nullAndWrapper);
083
084 // Add the inner OR criteria to effective date
085 effdt.addAndCriteria(orWrapperEd);
086
087 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt);
088 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
089
090
091 // TIMESTAMP --
092
093 //Configure the actual "criteria" in the where clause
094 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
095 timestamp.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber");
096 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate");
097
098 // Adding criteria to nest an AND that has multiple ORs to select
099 // the correct ID / date combination.
100 orWrapperEd = new Criteria();
101 nstWaEd = new Criteria();
102 nstDptEd = new Criteria();
103 nstChrEd = new Criteria();
104
105 // Inner AND to allow for all null chart/dept/work area
106 nullAndWrapper = new Criteria();
107 nullAndWrapper.addIsNull("workArea");
108 nullAndWrapper.addIsNull("department");
109 nullAndWrapper.addIsNull("chart");
110
111 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR
112 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR
113 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR
114 orWrapperEd.addOrCriteria(nstWaEd);
115 orWrapperEd.addOrCriteria(nstDptEd);
116 orWrapperEd.addOrCriteria(nstChrEd);
117
118 // Inner AND to allow for all null chart/dept/work area
119 orWrapperEd.addOrCriteria(nullAndWrapper);
120
121 // Add the inner OR criteria to effective date
122 timestamp.addAndCriteria(orWrapperEd);
123
124 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp);
125 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
126
127
128 // Filter by Max(EffDt) / Max(Timestamp)
129 root.addEqualTo("effectiveDate", effdtSubQuery);
130 root.addEqualTo("timestamp", timestampSubQuery);
131
132 // Optional ROOT criteria added :
133 if (workArea != null)
134 root.addEqualTo("workArea", workArea);
135 if (StringUtils.isNotEmpty(department))
136 root.addEqualTo("department", department);
137 if (chart != null)
138 root.addEqualTo("chart", chart);
139 if (roleName != null)
140 root.addEqualTo("roleName", roleName);
141 if (positionNumber != null)
142 root.addEqualTo("positionNumber", positionNumber);
143
144 // Filter for ACTIVE = 'Y'
145 Criteria activeFilter = new Criteria();
146 activeFilter.addEqualTo("active", true);
147 root.addAndCriteria(activeFilter);
148
149 Query query = QueryFactory.newQuery(TkRole.class, root);
150 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
151
152 if (c != null) {
153 roles.addAll(c);
154 }
155
156 return roles;
157 }
158
159 @SuppressWarnings("unchecked")
160 @Override
161 public List<TkRole> findRoles(String principalId, Date asOfDate, String roleName, Long workArea, String department, String chart) {
162 List<TkRole> roles = new ArrayList<TkRole>();
163
164 Criteria root = new Criteria();
165 Criteria effdt = new Criteria();
166 Criteria timestamp = new Criteria();
167 Criteria departmentCriteria = new Criteria();
168 Criteria workAreaCriteria = new Criteria();
169 ReportQueryByCriteria effdtSubQuery;
170 ReportQueryByCriteria timestampSubQuery;
171
172 // EFFECTIVE DATE / TIMESTAMP
173 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
174 effdt.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId");
175 effdt.addLessOrEqualThan("effectiveDate", asOfDate);
176
177 if (workArea != null || StringUtils.isNotEmpty(department) || StringUtils.isNotEmpty(chart)) {
178 if (workArea != null)
179 effdt.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
180 if (department != null)
181 effdt.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department");
182 if (chart != null)
183 effdt.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart");
184 }
185
186 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
187 timestamp.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId");
188 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate");
189
190 if (workArea != null || StringUtils.isNotEmpty(department) || StringUtils.isNotEmpty(chart)) {
191 if (workArea != null)
192 timestamp.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
193 if (department != null)
194 timestamp.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department");
195 if (chart != null)
196 timestamp.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart");
197 }
198
199 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp);
200 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
201
202 effdt.addEqualTo("timestamp", timestampSubQuery);
203
204 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt);
205 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
206
207 root.addEqualTo("effectiveDate", effdtSubQuery);
208
209 if (workArea != null) {
210 root.addEqualTo("workArea", workArea);
211 }
212
213 if (StringUtils.isNotEmpty(department)) {
214 departmentCriteria.addEqualTo("department", department);
215 Collection<WorkArea> collectionWorkAreas = TkServiceLocator.getWorkAreaService().getWorkAreas(department, asOfDate);
216 if (CollectionUtils.isNotEmpty(collectionWorkAreas)) {
217 List<Long> longWorkAreas = new ArrayList<Long>();
218 for(WorkArea cwa : collectionWorkAreas){
219 longWorkAreas.add(cwa.getWorkArea());
220 }
221 workAreaCriteria.addIn("workArea", longWorkAreas);
222 departmentCriteria.addOrCriteria(workAreaCriteria);
223 }
224 root.addAndCriteria(departmentCriteria);
225 }
226 if (StringUtils.isNotEmpty(chart)) {
227 root.addEqualTo("chart", chart);
228 }
229 if (StringUtils.isNotEmpty(roleName)) {
230 root.addEqualTo("roleName", roleName);
231 }
232 if (StringUtils.isNotEmpty(principalId)) {
233 root.addEqualTo("principalId", principalId);
234 }
235
236 // Filter for ACTIVE = 'Y'
237 root.addEqualTo("active", true);
238
239 Query query = QueryFactory.newQuery(TkRole.class, root);
240 // limit the number of the resultset
241 // TODO: hard coding the limits? probably not the most user friendly of ways to do this
242 query.setStartAtIndex(0);
243 query.setEndAtIndex(299);
244 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
245
246 if (c != null) {
247 roles.addAll(c);
248 }
249
250 if (StringUtils.isNotBlank(principalId)) {
251 //Fetch all the jobs and grab any position roles for this persons jobs
252 List<Job> lstActiveJobs = TkServiceLocator.getJobService().getJobs(principalId, asOfDate);
253 for (Job job : lstActiveJobs) {
254 if (job.getPositionNumber() != null) {
255 List<TkRole> lstRoles = findPositionRoles(job.getPositionNumber(),
256 asOfDate, roleName, workArea, department, chart);
257 roles.addAll(lstRoles);
258 }
259 }
260 } else if (workArea != null) {
261 List<TkRole> lstPosRoles = getPositionRolesForWorkArea(workArea, asOfDate);
262 for (TkRole tkRole : lstPosRoles) {
263 roles.add(tkRole);
264 }
265 }
266 return roles;
267 }
268
269 @SuppressWarnings("unchecked")
270 @Override
271 public List<TkRole> findInActiveRoles(String principalId, Date asOfDate, String roleName, Long workArea, String department, String chart) {
272 List<TkRole> roles = new ArrayList<TkRole>();
273
274 Criteria root = new Criteria();
275 Criteria effdt = new Criteria();
276 Criteria timestamp = new Criteria();
277 ReportQueryByCriteria effdtSubQuery;
278 ReportQueryByCriteria timestampSubQuery;
279
280 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
281 effdt.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId");
282 effdt.addLessOrEqualThan("effectiveDate", asOfDate);
283
284 // EFFECTIVE DATE --
285
286 // Adding criteria to nest an AND that has multiple ORs to select
287 // the correct ID / date combination.
288 Criteria orWrapperEd = new Criteria();
289 Criteria nstWaEd = new Criteria();
290 Criteria nstDptEd = new Criteria();
291 Criteria nstChrEd = new Criteria();
292
293 // Inner AND to allow for all null chart/dept/work area
294 Criteria nullAndWrapper = new Criteria();
295 nullAndWrapper.addIsNull("workArea");
296 nullAndWrapper.addIsNull("department");
297 nullAndWrapper.addIsNull("chart");
298
299 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR
300 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR
301 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR
302 orWrapperEd.addOrCriteria(nstWaEd);
303 orWrapperEd.addOrCriteria(nstDptEd);
304 orWrapperEd.addOrCriteria(nstChrEd);
305
306 // Inner AND to allow for all null chart/dept/work area
307 orWrapperEd.addOrCriteria(nullAndWrapper);
308
309 // Add the inner OR criteria to effective date
310 effdt.addAndCriteria(orWrapperEd);
311
312 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt);
313 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
314
315
316 // TIMESTAMP --
317
318 //Configure the actual "criteria" in the where clause
319 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
320 timestamp.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId");
321 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate");
322
323 // Adding criteria to nest an AND that has multiple ORs to select
324 // the correct ID / date combination.
325 orWrapperEd = new Criteria();
326 nstWaEd = new Criteria();
327 nstDptEd = new Criteria();
328 nstChrEd = new Criteria();
329
330 // Inner AND to allow for all null chart/dept/work area
331 nullAndWrapper = new Criteria();
332 nullAndWrapper.addIsNull("workArea");
333 nullAndWrapper.addIsNull("department");
334 nullAndWrapper.addIsNull("chart");
335
336 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR
337 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR
338 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR
339 orWrapperEd.addOrCriteria(nstWaEd);
340 orWrapperEd.addOrCriteria(nstDptEd);
341 orWrapperEd.addOrCriteria(nstChrEd);
342
343 // Inner AND to allow for all null chart/dept/work area
344 orWrapperEd.addOrCriteria(nullAndWrapper);
345
346 // Add the inner OR criteria to effective date
347 timestamp.addAndCriteria(orWrapperEd);
348
349 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp);
350 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
351
352
353 // Filter by Max(EffDt) / Max(Timestamp)
354 root.addEqualTo("effectiveDate", effdtSubQuery);
355 root.addEqualTo("timestamp", timestampSubQuery);
356
357 // Optional ROOT criteria added :
358 if (workArea != null)
359 root.addEqualTo("workArea", workArea);
360 if (department != null)
361 root.addEqualTo("department", department);
362 if (chart != null)
363 root.addEqualTo("chart", chart);
364 if (roleName != null)
365 root.addEqualTo("roleName", roleName);
366 if (principalId != null)
367 root.addEqualTo("principalId", principalId);
368
369 // Filter for ACTIVE = 'N'
370 Criteria activeFilter = new Criteria();
371 activeFilter.addEqualTo("active", false);
372 root.addAndCriteria(activeFilter);
373
374 Query query = QueryFactory.newQuery(TkRole.class, root);
375 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
376
377 if (c != null) {
378 roles.addAll(c);
379 }
380
381 return roles;
382 }
383
384 @Override
385 public void saveOrUpdateRole(TkRole role) {
386 KRADServiceLocator.getBusinessObjectService().save(role);
387 }
388
389 @Override
390 public void saveOrUpdateRoles(List<TkRole> roles) {
391 if (roles != null) {
392 for (TkRole role : roles) {
393 saveOrUpdateRole(role);
394 }
395 }
396 }
397
398 @Override
399 public TkRole getRole(String tkRoleId) {
400 Criteria currentRecordCriteria = new Criteria();
401 currentRecordCriteria.addEqualTo("hrRolesId", tkRoleId);
402
403 return (TkRole) this.getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(TkRole.class, currentRecordCriteria));
404 }
405
406 @Override
407 public TkRole getRolesByPosition(String positionNumber) {
408 Criteria currentRecordCriteria = new Criteria();
409 Criteria effdt = new Criteria();
410 currentRecordCriteria.addEqualTo("positionNumber", positionNumber);
411
412 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber");
413 effdt.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate());
414 ReportQueryByCriteria effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt);
415 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
416 currentRecordCriteria.addEqualTo("effectiveDate", effdtSubQuery);
417
418 // Filter for ACTIVE = 'Y'
419 Criteria activeFilter = new Criteria();
420 activeFilter.addEqualTo("active", true);
421 currentRecordCriteria.addAndCriteria(activeFilter);
422
423
424 TkRole tkRole = (TkRole) this.getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(TkRole.class, currentRecordCriteria));
425 return tkRole;
426 }
427
428 @Override
429 public TkRole getInactiveRolesByPosition(String positionNumber) {
430 Criteria currentRecordCriteria = new Criteria();
431 Criteria effdt = new Criteria();
432 currentRecordCriteria.addEqualTo("positionNumber", positionNumber);
433
434 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber");
435 effdt.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate());
436 ReportQueryByCriteria effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt);
437 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
438 currentRecordCriteria.addEqualTo("effectiveDate", effdtSubQuery);
439
440 // Filter for ACTIVE = 'N'
441 Criteria activeFilter = new Criteria();
442 activeFilter.addEqualTo("active", false);
443 currentRecordCriteria.addAndCriteria(activeFilter);
444
445
446 TkRole tkRole = (TkRole) this.getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(TkRole.class, currentRecordCriteria));
447 return tkRole;
448 }
449
450
451 @Override
452 public List<TkRole> getPositionRolesForWorkArea(Long workArea, Date asOfDate) {
453 List<TkRole> roles = new ArrayList<TkRole>();
454
455 Criteria root = new Criteria();
456 Criteria effdt = new Criteria();
457 Criteria timestamp = new Criteria();
458 ReportQueryByCriteria effdtSubQuery;
459 ReportQueryByCriteria timestampSubQuery;
460
461 effdt.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
462 effdt.addEqualToField("positionNumber", Criteria.PARENT_QUERY_PREFIX + "positionNumber");
463 effdt.addLessOrEqualThan("effectiveDate", asOfDate);
464
465 // EFFECTIVE DATE --
466
467 // Adding criteria to nest an AND that has multiple ORs to select
468 // the correct ID / date combination.
469 Criteria orWrapperEd = new Criteria();
470 Criteria nstWaEd = new Criteria();
471 Criteria nstDptEd = new Criteria();
472 Criteria nstChrEd = new Criteria();
473
474 // Inner AND to allow for all null chart/dept/work area
475 Criteria nullAndWrapper = new Criteria();
476 nullAndWrapper.addIsNull("department");
477 nullAndWrapper.addIsNull("chart");
478
479 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR
480 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR
481 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR
482 orWrapperEd.addOrCriteria(nstWaEd);
483 orWrapperEd.addOrCriteria(nstDptEd);
484 orWrapperEd.addOrCriteria(nstChrEd);
485
486 // Inner AND to allow for all null chart/dept/work area
487 orWrapperEd.addOrCriteria(nullAndWrapper);
488
489 // Add the inner OR criteria to effective date
490 effdt.addAndCriteria(orWrapperEd);
491
492 effdtSubQuery = QueryFactory.newReportQuery(TkRole.class, effdt);
493 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
494
495
496 // TIMESTAMP --
497
498 //Configure the actual "criteria" in the where clause
499 timestamp.addEqualToField("roleName", Criteria.PARENT_QUERY_PREFIX + "roleName");
500 //timestamp.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId");
501 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate");
502
503 // Adding criteria to nest an AND that has multiple ORs to select
504 // the correct ID / date combination.
505 orWrapperEd = new Criteria();
506 nstWaEd = new Criteria();
507 nstDptEd = new Criteria();
508 nstChrEd = new Criteria();
509
510 // Inner AND to allow for all null chart/dept/work area
511 nullAndWrapper = new Criteria();
512 nullAndWrapper.addIsNull("department");
513 nullAndWrapper.addIsNull("chart");
514
515 nstWaEd.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea"); // OR
516 nstDptEd.addEqualToField("department", Criteria.PARENT_QUERY_PREFIX + "department"); // OR
517 nstChrEd.addEqualToField("chart", Criteria.PARENT_QUERY_PREFIX + "chart"); // OR
518 orWrapperEd.addOrCriteria(nstWaEd);
519 orWrapperEd.addOrCriteria(nstDptEd);
520 orWrapperEd.addOrCriteria(nstChrEd);
521
522 // Inner AND to allow for all null chart/dept/work area
523 orWrapperEd.addOrCriteria(nullAndWrapper);
524
525 // Add the inner OR criteria to effective date
526 timestamp.addAndCriteria(orWrapperEd);
527
528 timestampSubQuery = QueryFactory.newReportQuery(TkRole.class, timestamp);
529 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
530
531
532 // Filter by Max(EffDt) / Max(Timestamp)
533 root.addEqualTo("effectiveDate", effdtSubQuery);
534 root.addEqualTo("timestamp", timestampSubQuery);
535
536 // Optional ROOT criteria added :
537 if (workArea != null)
538 root.addEqualTo("workArea", workArea);
539 root.addEqualTo("roleName", TkConstants.ROLE_TK_APPROVER);
540
541 // Filter for ACTIVE = 'Y'
542 Criteria activeFilter = new Criteria();
543 activeFilter.addEqualTo("active", true);
544 root.addAndCriteria(activeFilter);
545
546 Query query = QueryFactory.newQuery(TkRole.class, root);
547 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
548
549 if (c != null) {
550 roles.addAll(c);
551 }
552
553 return roles;
554 }
555 }