1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.maintenance;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.kuali.rice.core.util.RiceKeyConstants;
20 import org.kuali.rice.kew.api.WorkflowDocument;
21 import org.kuali.rice.krad.document.MaintenanceDocument;
22 import org.kuali.rice.krad.exception.KualiExceptionIncident;
23 import org.kuali.rice.krad.exception.ValidationException;
24 import org.kuali.rice.krad.service.KRADServiceLocator;
25 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
26 import org.kuali.rice.krad.util.GlobalVariables;
27 import org.kuali.rice.krad.util.KRADConstants;
28 import org.kuali.rice.krad.util.UrlFactory;
29
30 import java.util.HashMap;
31 import java.util.Map;
32 import java.util.Properties;
33
34
35
36
37
38
39 public class MaintenanceUtils {
40 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MaintenanceUtils.class);
41
42
43
44
45
46
47
48
49
50 public static void checkForLockingDocument(MaintenanceDocument document, boolean throwExceptionIfLocked) {
51 LOG.info("starting checkForLockingDocument (by MaintenanceDocument)");
52
53
54
55 String blockingDocId = document.getNewMaintainableObject().getLockingDocumentId();
56 checkDocumentBlockingDocumentId(blockingDocId, throwExceptionIfLocked);
57 }
58
59 public static void checkDocumentBlockingDocumentId(String blockingDocId, boolean throwExceptionIfLocked) {
60
61 if (StringUtils.isBlank(blockingDocId)) {
62 return;
63 }
64
65 if (MaintenanceUtils.LOG.isInfoEnabled()) {
66 MaintenanceUtils.LOG.info("Locking document found: docId = " + blockingDocId + ".");
67 }
68
69
70 WorkflowDocument lockedDocument = null;
71 try {
72
73
74
75 if (KRADServiceLocatorWeb.getWorkflowDocumentService().workflowDocumentExists(blockingDocId)) {
76 lockedDocument = KRADServiceLocatorWeb.getWorkflowDocumentService()
77 .loadWorkflowDocument(blockingDocId, GlobalVariables.getUserSession().getPerson());
78 }
79 } catch (Exception ex) {
80
81 MaintenanceUtils.LOG.error("Unable to retrieve locking document specified in the maintenance lock table: " +
82 blockingDocId, ex);
83
84 cleanOrphanLocks(blockingDocId, ex);
85 return;
86 }
87 if (lockedDocument == null) {
88 MaintenanceUtils.LOG.warn("Locking document header for " + blockingDocId + "came back null.");
89 cleanOrphanLocks(blockingDocId, null);
90 }
91
92
93 if (lockCanBeIgnored(lockedDocument)) {
94 return;
95 }
96
97
98 Properties parameters = new Properties();
99 parameters.put(KRADConstants.PARAMETER_DOC_ID, blockingDocId);
100 parameters.put(KRADConstants.PARAMETER_COMMAND, KRADConstants.METHOD_DISPLAY_DOC_SEARCH_VIEW);
101 String blockingUrl = UrlFactory.parameterizeUrl(
102 KRADServiceLocator.getKualiConfigurationService().getPropertyString(KRADConstants.WORKFLOW_URL_KEY) +
103 "/" + KRADConstants.DOC_HANDLER_ACTION, parameters);
104 if (MaintenanceUtils.LOG.isDebugEnabled()) {
105 MaintenanceUtils.LOG.debug("blockingUrl = '" + blockingUrl + "'");
106 MaintenanceUtils.LOG.debug("Maintenance record: " + lockedDocument.getApplicationDocumentId() + "is locked.");
107 }
108 String[] errorParameters = {blockingUrl, blockingDocId};
109
110
111 if (throwExceptionIfLocked) {
112
113 GlobalVariables.getMessageMap()
114 .putError(KRADConstants.GLOBAL_ERRORS, RiceKeyConstants.ERROR_MAINTENANCE_LOCKED, errorParameters);
115 throw new ValidationException("Maintenance Record is locked by another document.");
116 } else {
117
118 GlobalVariables.getMessageMap()
119 .putWarning(KRADConstants.GLOBAL_MESSAGES, RiceKeyConstants.WARNING_MAINTENANCE_LOCKED,
120 errorParameters);
121 }
122 }
123
124
125
126
127
128
129
130
131
132
133 private static boolean lockCanBeIgnored(WorkflowDocument lockedDocument) {
134
135 if (lockedDocument == null) {
136 return true;
137 }
138
139
140 String userId = GlobalVariables.getUserSession().getPrincipalId().trim();
141 if (StringUtils.isBlank(userId)) {
142 return false;
143 }
144
145
146 if (!userId.equalsIgnoreCase(lockedDocument.getInitiatorPrincipalId().trim())) {
147 return false;
148 }
149
150
151 return lockedDocument.isInitiated();
152 }
153
154 protected static void cleanOrphanLocks(String lockingDocumentNumber, Exception workflowException) {
155
156
157 try {
158
159 KRADServiceLocatorWeb.getMaintenanceDocumentService().deleteLocks(lockingDocumentNumber);
160
161 Map<String, String> parameters = new HashMap<String, String>(1);
162 parameters.put(KRADConstants.PARAMETER_DOC_ID, lockingDocumentNumber);
163 KualiExceptionIncident kei = KRADServiceLocatorWeb.getKualiExceptionIncidentService()
164 .getExceptionIncident(workflowException, parameters);
165 KRADServiceLocatorWeb.getKualiExceptionIncidentService().report(kei);
166 } catch (Exception ex) {
167 MaintenanceUtils.LOG.error("Unable to delete and notify upon locking document retrieval failure.", ex);
168 }
169 }
170
171 public static boolean isMaintenanceDocumentCreatingNewRecord(String maintenanceAction) {
172 if (KRADConstants.MAINTENANCE_EDIT_ACTION.equalsIgnoreCase(maintenanceAction)) {
173 return false;
174 } else if (KRADConstants.MAINTENANCE_NEWWITHEXISTING_ACTION.equalsIgnoreCase(maintenanceAction)) {
175 return false;
176 } else if (KRADConstants.MAINTENANCE_DELETE_ACTION.equalsIgnoreCase(maintenanceAction)) {
177 return false;
178 } else if (KRADConstants.MAINTENANCE_NEW_ACTION.equalsIgnoreCase(maintenanceAction)) {
179 return true;
180 } else if (KRADConstants.MAINTENANCE_COPY_ACTION.equalsIgnoreCase(maintenanceAction)) {
181 return true;
182 } else {
183 return true;
184 }
185 }
186 }