001 /** 002 * Copyright 2005-2013 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.quicklinks.dao.impl; 017 018 import org.apache.ojb.broker.PersistenceBroker; 019 import org.kuali.rice.core.api.delegation.DelegationType; 020 import org.kuali.rice.core.api.util.KeyValue; 021 import org.kuali.rice.coreservice.framework.CoreFrameworkServiceLocator; 022 import org.kuali.rice.kew.api.WorkflowRuntimeException; 023 import org.kuali.rice.kew.docsearch.service.DocumentSearchService; 024 import org.kuali.rice.kew.doctype.DocumentTypePolicy; 025 import org.kuali.rice.kew.doctype.bo.DocumentType; 026 import org.kuali.rice.kew.doctype.service.DocumentTypeService; 027 import org.kuali.rice.kew.quicklinks.ActionListStats; 028 import org.kuali.rice.kew.quicklinks.InitiatedDocumentType; 029 import org.kuali.rice.kew.quicklinks.WatchedDocument; 030 import org.kuali.rice.kew.quicklinks.dao.QuickLinksDAO; 031 import org.kuali.rice.kew.service.KEWServiceLocator; 032 import org.kuali.rice.kew.api.KewApiConstants; 033 import org.kuali.rice.krad.util.KRADConstants; 034 import org.springmodules.orm.ojb.PersistenceBrokerCallback; 035 import org.springmodules.orm.ojb.support.PersistenceBrokerDaoSupport; 036 037 import java.sql.Connection; 038 import java.sql.PreparedStatement; 039 import java.sql.ResultSet; 040 import java.sql.SQLException; 041 import java.util.ArrayList; 042 import java.util.Collections; 043 import java.util.List; 044 import java.util.StringTokenizer; 045 046 047 public class QuickLinksDAOOjbImpl extends PersistenceBrokerDaoSupport implements QuickLinksDAO { 048 049 @Override 050 public List<ActionListStats> getActionListStats(final String principalId) { 051 return (List<ActionListStats>) this.getPersistenceBrokerTemplate().execute(new PersistenceBrokerCallback() { 052 @Override 053 public Object doInPersistenceBroker(PersistenceBroker broker) { 054 PreparedStatement selectActionItems = null; 055 PreparedStatement selectDocTypeLabel = null; 056 ResultSet selectedActionItems = null; 057 ResultSet selectedDocTypeLabel = null; 058 List<ActionListStats> docTypes = new ArrayList<ActionListStats>(); 059 try { 060 Connection connection = broker.serviceConnectionManager().getConnection(); 061 062 selectActionItems = connection.prepareStatement("select DOC_TYP_NM, COUNT(*) from KREW_ACTN_ITM_T where PRNCPL_ID = ? " + 063 "and (dlgn_typ is null or dlgn_typ != '" + DelegationType.SECONDARY.getCode() + "') group by DOC_TYP_NM"); 064 selectDocTypeLabel = connection.prepareStatement("select LBL from KREW_DOC_TYP_T WHERE DOC_TYP_NM = ? and CUR_IND = 1"); 065 selectActionItems.setString(1, principalId); 066 selectedActionItems = selectActionItems.executeQuery(); 067 while (selectedActionItems.next()) { 068 String docTypeName = selectedActionItems.getString(1); 069 int count = selectedActionItems.getInt(2); 070 selectDocTypeLabel.setString(1, docTypeName); 071 selectedDocTypeLabel = selectDocTypeLabel.executeQuery(); 072 if (selectedDocTypeLabel.next()) { 073 docTypes.add(new ActionListStats(docTypeName, selectedDocTypeLabel.getString(1), count)); 074 } 075 } 076 Collections.sort(docTypes); 077 return docTypes; 078 } catch (Exception e) { 079 throw new WorkflowRuntimeException("Error getting action list stats for user: " + principalId, e); 080 } finally { 081 if (selectActionItems != null) { 082 try { 083 selectActionItems.close(); 084 } catch (SQLException e) { 085 } 086 } 087 088 if (selectDocTypeLabel != null) { 089 try { 090 selectDocTypeLabel.close(); 091 } catch (SQLException e) { 092 } 093 } 094 095 if (selectedActionItems != null) { 096 try { 097 selectedActionItems.close(); 098 } catch (SQLException e) { 099 } 100 } 101 102 if (selectedDocTypeLabel != null) { 103 try { 104 selectedDocTypeLabel.close(); 105 } catch (SQLException e) { 106 } 107 } 108 109 } 110 } 111 }); 112 } 113 114 @Override 115 public List<InitiatedDocumentType> getInitiatedDocumentTypesList(final String principalId) { 116 return (List<InitiatedDocumentType>) this.getPersistenceBrokerTemplate().execute(new PersistenceBrokerCallback() { 117 118 @Override 119 public Object doInPersistenceBroker(PersistenceBroker broker) { 120 PreparedStatement selectDistinctDocumentTypes = null; 121 ResultSet selectedDistinctDocumentTypes = null; 122 List<InitiatedDocumentType> documentTypesByName = new ArrayList<InitiatedDocumentType>(); 123 try { 124 Connection connection = broker.serviceConnectionManager().getConnection(); 125 // select the doc type only if the SUPPORTS_QUICK_INITIATE policy is NULL or true 126 String sql = "select distinct B.DOC_TYP_NM, B.LBL from KREW_DOC_HDR_T A, KREW_DOC_TYP_T B "+ 127 "where A.INITR_PRNCPL_ID = ? and A.DOC_TYP_ID = B.DOC_TYP_ID and " + 128 "B.ACTV_IND = 1 and B.CUR_IND = 1 " + 129 "order by upper(B.LBL)"; 130 131 selectDistinctDocumentTypes = connection.prepareStatement(sql); 132 selectDistinctDocumentTypes.setString(1, principalId); 133 selectedDistinctDocumentTypes = selectDistinctDocumentTypes.executeQuery(); 134 135 String documentNames = CoreFrameworkServiceLocator.getParameterService().getParameterValueAsString(KewApiConstants.KEW_NAMESPACE, KRADConstants.DetailTypes.QUICK_LINK_DETAIL_TYPE, KewApiConstants.QUICK_LINKS_RESTRICT_DOCUMENT_TYPES); 136 if (documentNames != null) { 137 // TODO Should this happen??? 138 documentNames = documentNames.trim(); 139 } 140 if (documentNames == null || "none".equals(documentNames)) { 141 documentNames = ""; 142 } 143 144 List docTypesToRestrict = new ArrayList(); 145 StringTokenizer st = new StringTokenizer(documentNames, ","); 146 while (st.hasMoreTokens()) { 147 docTypesToRestrict.add(st.nextToken()); 148 } 149 while (selectedDistinctDocumentTypes.next()) { 150 String docTypeName = selectedDistinctDocumentTypes.getString(1); 151 String docTypeTopParent = ""; 152 int firstPeriod = docTypeName.indexOf("."); 153 if (firstPeriod == -1) { 154 docTypeTopParent = docTypeName.substring(0); 155 } else { 156 docTypeTopParent = docTypeName.substring(0, firstPeriod); 157 } 158 if (!docTypesToRestrict.contains(docTypeTopParent)) { 159 // the document types should be cached so this should be pretty quick 160 DocumentType docType = KEWServiceLocator.getDocumentTypeService().findByName(docTypeName); 161 DocumentTypePolicy quickInitiatePolicy = docType.getSupportsQuickInitiatePolicy(); 162 if (quickInitiatePolicy.getPolicyValue().booleanValue()) { 163 documentTypesByName.add(new InitiatedDocumentType(docTypeName, selectedDistinctDocumentTypes.getString(2))); 164 } 165 } 166 } 167 return documentTypesByName; 168 } catch (Exception e) { 169 throw new WorkflowRuntimeException("Error getting initiated document types for user: " + principalId, e); 170 } finally { 171 if (selectDistinctDocumentTypes != null) { 172 try { 173 selectDistinctDocumentTypes.close(); 174 } catch (SQLException e) { 175 } 176 } 177 if (selectedDistinctDocumentTypes != null) { 178 try { 179 selectedDistinctDocumentTypes.close(); 180 } catch (SQLException e) { 181 } 182 } 183 184 } 185 186 } 187 }); 188 } 189 190 @Override 191 public List<KeyValue> getNamedSearches(String principalId) { 192 return getDocumentSearchService().getNamedSearches(principalId); 193 } 194 195 @Override 196 public List<KeyValue> getRecentSearches(String principalId) { 197 return getDocumentSearchService().getMostRecentSearches(principalId); 198 } 199 200 @Override 201 public List<WatchedDocument> getWatchedDocuments(final String principalId) { 202 return (List<WatchedDocument>) this.getPersistenceBrokerTemplate().execute(new PersistenceBrokerCallback() { 203 @Override 204 public Object doInPersistenceBroker(PersistenceBroker broker) { 205 List<WatchedDocument> watchedDocuments = new ArrayList<WatchedDocument>(); 206 PreparedStatement selectWatchedDocuments = null; 207 ResultSet selectedWatchedDocuments = null; 208 try { 209 Connection connection = broker.serviceConnectionManager().getConnection(); 210 selectWatchedDocuments = connection.prepareStatement("select DOC_HDR_ID, DOC_HDR_STAT_CD, TTL, CRTE_DT from KREW_DOC_HDR_T where INITR_PRNCPL_ID = ? and DOC_HDR_STAT_CD in ('"+ KewApiConstants.ROUTE_HEADER_ENROUTE_CD +"','"+ KewApiConstants.ROUTE_HEADER_EXCEPTION_CD +"') order by CRTE_DT desc"); 211 selectWatchedDocuments.setString(1, principalId); 212 selectedWatchedDocuments = selectWatchedDocuments.executeQuery(); 213 while (selectedWatchedDocuments.next()) { 214 watchedDocuments.add(new WatchedDocument(selectedWatchedDocuments.getString(1), KewApiConstants.DOCUMENT_STATUSES.get(selectedWatchedDocuments.getString(2)), selectedWatchedDocuments.getString(3))); 215 } 216 return watchedDocuments; 217 } catch (Exception e) { 218 throw new WorkflowRuntimeException("Error getting initiated document types for user: " + principalId, e); 219 } finally { 220 if (selectWatchedDocuments != null) { 221 try { 222 selectWatchedDocuments.close(); 223 } catch (SQLException e) { 224 } 225 } 226 if (selectedWatchedDocuments != null) { 227 try { 228 selectedWatchedDocuments.close(); 229 } catch (SQLException e) { 230 } 231 } 232 233 } 234 } 235 }); 236 } 237 238 public DocumentTypeService getDocumentTypeService() { 239 return ((DocumentTypeService) KEWServiceLocator.getService(KEWServiceLocator.DOCUMENT_TYPE_SERVICE)); 240 } 241 242 public DocumentSearchService getDocumentSearchService() { 243 return ((DocumentSearchService) KEWServiceLocator.getService(KEWServiceLocator.DOCUMENT_SEARCH_SERVICE)); 244 } 245 246 }