001 /** 002 * Copyright 2004-2014 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.kpme.tklm.time.docsearch; 017 018 import java.util.ArrayList; 019 import java.util.HashMap; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.apache.log4j.Logger; 024 import org.joda.time.LocalDate; 025 import org.kuali.kpme.core.api.assignment.AssignmentContract; 026 import org.kuali.kpme.core.api.document.calendar.CalendarDocumentContract; 027 import org.kuali.kpme.core.api.document.calendar.CalendarDocumentHeaderContract; 028 import org.kuali.kpme.core.assignment.Assignment; 029 import org.kuali.kpme.core.job.Job; 030 import org.kuali.kpme.core.service.HrServiceLocator; 031 import org.kuali.kpme.core.workarea.WorkArea; 032 import org.kuali.rice.kew.api.WorkflowDocument; 033 import org.kuali.rice.kew.api.WorkflowDocumentFactory; 034 import org.kuali.rice.krad.util.GlobalVariables; 035 036 public class TkSearchableAttributeServiceImpl implements 037 TkSearchableAttributeService { 038 039 private static final Logger LOG = Logger.getLogger(TkSearchableAttributeServiceImpl.class); 040 041 public void updateSearchableAttribute(CalendarDocumentContract document, LocalDate asOfDate){ 042 WorkflowDocument workflowDocument = null; 043 // 044 // djunk - Need to actually look at why this call is here for every 045 // document submission. Rice does not allow save events for 046 // documents in final status. We may add more skips. 047 // 048 if (!document.getDocumentHeader().getDocumentStatus().equals("F")) { 049 try { 050 CalendarDocumentHeaderContract docHeader = (CalendarDocumentHeaderContract) document.getDocumentHeader(); 051 workflowDocument = WorkflowDocumentFactory.loadDocument(docHeader.getPrincipalId(), docHeader.getDocumentId()); 052 workflowDocument.setApplicationContent(createSearchableAttributeXml(document, asOfDate)); 053 workflowDocument.saveDocument(""); 054 if (!"I".equals(workflowDocument.getStatus().getCode())) { 055 //updateWorkflowTitle(document,workflowDocument); 056 if (GlobalVariables.getUserSession() != null && workflowDocument.getInitiatorPrincipalId().equals(GlobalVariables.getUserSession().getPrincipalId())) { 057 workflowDocument.saveDocument(""); 058 } else{ 059 workflowDocument.saveDocumentData(); 060 } 061 } else{ 062 workflowDocument.saveDocument(""); 063 } 064 065 066 } catch (Exception e) { 067 LOG.warn("Exception during searchable attribute update."); 068 throw new RuntimeException(e); 069 } 070 } 071 } 072 073 @Override 074 public String createSearchableAttributeXml(CalendarDocumentContract document, LocalDate asOfDate) { 075 List<Long> workAreas = new ArrayList<Long>(); 076 Map<String,List<Long>> deptToListOfWorkAreas = new HashMap<String,List<Long>>(); 077 List<String> salGroups = new ArrayList<String>(); 078 079 for(AssignmentContract assign: document.getAssignments()){ 080 if(!workAreas.contains(assign.getWorkArea())){ 081 workAreas.add(assign.getWorkArea()); 082 } 083 Job job = HrServiceLocator.getJobService().getJob(assign.getPrincipalId(), assign.getJobNumber(), assign.getEffectiveLocalDate()); 084 085 if(!salGroups.contains(job.getHrSalGroup())){ 086 salGroups.add(job.getHrSalGroup()); 087 } 088 } 089 090 List<WorkArea> workAreaList = HrServiceLocator.getWorkAreaService().getWorkAreasWithoutRoles(workAreas, asOfDate); 091 for(WorkArea workAreaObj : workAreaList){ 092 String department = workAreaObj != null ? workAreaObj.getDept() : null; 093 094 if (department != null) { 095 if(deptToListOfWorkAreas.containsKey(department)){ 096 List<Long> deptWorkAreas = deptToListOfWorkAreas.get(workAreaObj.getDept()); 097 deptWorkAreas.add(workAreaObj.getWorkArea()); 098 } else { 099 List<Long> deptWorkAreas = new ArrayList<Long>(); 100 deptWorkAreas.add(workAreaObj.getWorkArea()); 101 deptToListOfWorkAreas.put(department, deptWorkAreas); 102 } 103 } 104 } 105 StringBuilder sb = new StringBuilder(); 106 String className = document.getClass().getSimpleName(); 107 sb.append("<documentContext><applicationContent><").append(className).append(">"); 108 sb.append("<DEPARTMENTS>"); 109 for(Map.Entry<String, List<Long>> entry : deptToListOfWorkAreas.entrySet()){ 110 sb.append("<DEPARTMENT value=\""+entry.getKey()+"\">"); 111 112 for(Long workArea : entry.getValue()){ 113 sb.append("<WORKAREA value=\""+workArea+"\"/>"); 114 } 115 sb.append("</DEPARTMENT>"); 116 } 117 sb.append("</DEPARTMENTS>"); 118 for(String salGroup : salGroups){ 119 sb.append("<SALGROUP value=\""+salGroup+"\"/>"); 120 } 121 122 sb.append("<PAYENDDATE value=\""+asOfDate+"\"/>"); 123 sb.append("</").append(className).append("></applicationContent></documentContext>"); 124 125 return sb.toString(); 126 } 127 128 }