1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.edl.impl.components;
17
18 import org.apache.log4j.Logger;
19 import org.kuali.rice.core.api.util.xml.XmlJotter;
20 import org.kuali.rice.edl.impl.EDLContext;
21 import org.kuali.rice.edl.impl.EDLModelComponent;
22 import org.kuali.rice.edl.impl.EDLXmlUtils;
23 import org.kuali.rice.edl.impl.RequestParser;
24 import org.kuali.rice.edl.impl.UserAction;
25 import org.kuali.rice.kew.api.WorkflowDocument;
26 import org.kuali.rice.kew.api.WorkflowDocumentFactory;
27 import org.kuali.rice.kew.api.WorkflowRuntimeException;
28 import org.kuali.rice.kew.api.document.DocumentStatus;
29 import org.kuali.rice.kew.api.exception.WorkflowException;
30 import org.w3c.dom.Document;
31 import org.w3c.dom.Element;
32
33
34
35
36
37
38
39
40
41 public class WorkflowDocumentActions implements EDLModelComponent {
42
43 private static final Logger LOG = Logger.getLogger(WorkflowDocumentActions.class);
44
45 public static final String ACTION_TAKEN = "actionTaken";
46
47 boolean isPreProcessor;
48
49 public void updateDOM(Document dom, Element configElement, EDLContext edlContext) {
50
51 try {
52 isPreProcessor = configElement.getTagName().equals("preProcessor");
53 if (isPreProcessor) {
54 doPreProcessWork(edlContext);
55 } else {
56 doPostProcessWork(dom, edlContext);
57 }
58 } catch (Exception e) {
59 throw new WorkflowRuntimeException(e);
60 }
61
62 }
63
64 private void doPreProcessWork(EDLContext edlContext) throws Exception {
65 RequestParser requestParser = edlContext.getRequestParser();
66
67 UserAction userAction = edlContext.getUserAction();
68 WorkflowDocument document = null;
69 if (UserAction.ACTION_CREATE.equals(userAction.getAction())) {
70 document = WorkflowDocumentFactory.createDocument(edlContext.getUserSession().getPrincipalId(), edlContext
71 .getEdocLiteAssociation().getEdlName());
72 document.setTitle("Routing Document Type '" + document.getDocumentTypeName() + "'");
73 document.getDocumentId();
74 LOG.info("Created document " + document.getDocumentId());
75 } else {
76 document = (WorkflowDocument) requestParser.getAttribute(RequestParser.WORKFLOW_DOCUMENT_SESSION_KEY);
77 if (document == null) {
78 String docId = (String) requestParser.getAttribute("docId");
79 if (docId == null) {
80 LOG.info("no document found for edl " + edlContext.getEdocLiteAssociation().getEdlName());
81 return;
82 } else {
83 document = WorkflowDocumentFactory
84 .loadDocument(edlContext.getUserSession().getPrincipalId(), docId);
85 }
86 }
87 }
88
89 requestParser.setAttribute(RequestParser.WORKFLOW_DOCUMENT_SESSION_KEY, document);
90 }
91
92 private void doPostProcessWork(Document dom, EDLContext edlContext) throws Exception {
93 RequestParser requestParser = edlContext.getRequestParser();
94
95 if (edlContext.isInError()) {
96 return;
97 }
98 WorkflowDocument document = (WorkflowDocument) edlContext.getRequestParser().getAttribute(
99 RequestParser.WORKFLOW_DOCUMENT_SESSION_KEY);
100 if (document == null) {
101 return;
102 }
103
104 Element dataElement = (Element) dom.getElementsByTagName(EDLXmlUtils.DATA_E).item(0);
105 String docContent = XmlJotter.jotNode(dataElement);
106 document.setApplicationContent(docContent);
107 takeAction(document, dom, edlContext);
108 }
109
110 public static void takeAction(WorkflowDocument document, Document dom, EDLContext edlContext)
111 throws WorkflowException {
112 RequestParser requestParser = edlContext.getRequestParser();
113 UserAction userAction = edlContext.getUserAction();
114 String annotation = requestParser.getParameterValue("annotation");
115 String action = userAction.getAction();
116 String previousNodeName = requestParser.getParameterValue("previousNode");
117
118 if (!userAction.isValidatableAction()) {
119
120
121 document.clearAttributeDefinitions();
122 }
123
124 boolean actionTaken = true;
125
126 if (UserAction.ACTION_ROUTE.equals(action)) {
127 document.route(annotation);
128 } else if (UserAction.ACTION_APPROVE.equals(action)) {
129 document.approve(annotation);
130 } else if (UserAction.ACTION_DISAPPROVE.equals(action)) {
131 document.disapprove(annotation);
132 } else if (UserAction.ACTION_CANCEL.equals(action)) {
133 document.cancel(annotation);
134 } else if (UserAction.ACTION_BLANKETAPPROVE.equals(action)) {
135 document.blanketApprove(annotation);
136 } else if (UserAction.ACTION_FYI.equals(action)) {
137 document.fyi();
138 } else if (UserAction.ACTION_ACKNOWLEDGE.equals(action)) {
139 document.acknowledge(annotation);
140 } else if (UserAction.ACTION_SAVE.equals(action)) {
141 if (document.getStatus().equals(DocumentStatus.INITIATED)) {
142 document.saveDocument(annotation);
143 } else {
144 document.saveDocumentData();
145 }
146 } else if (UserAction.ACTION_COMPLETE.equals(action)) {
147 document.complete(annotation);
148 } else if (UserAction.ACTION_DELETE.equals(action)) {
149 document.delete();
150 } else if (UserAction.ACTION_RETURN_TO_PREVIOUS.equals(action)) {
151 document.returnToPreviousNode(annotation, previousNodeName);
152 } else {
153 actionTaken = false;
154 }
155
156 if (actionTaken) {
157 Element actionTakenElement = EDLXmlUtils.getOrCreateChildElement(dom.getDocumentElement(), ACTION_TAKEN,
158 true);
159 actionTakenElement.appendChild(dom.createTextNode(action));
160 }
161 }
162
163 }