1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.workflow;
35
36 import info.magnolia.commands.CommandsManager;
37 import info.magnolia.context.Context;
38 import info.magnolia.context.MgnlContext;
39 import openwfe.org.embed.impl.engine.AbstractEmbeddedParticipant;
40 import openwfe.org.engine.workitem.CancelItem;
41 import openwfe.org.engine.workitem.InFlowWorkItem;
42 import openwfe.org.engine.workitem.WorkItem;
43
44 import org.apache.commons.chain.Command;
45 import org.apache.commons.lang.StringUtils;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49
50
51
52
53
54
55
56
57 public class MgnlParticipant extends AbstractEmbeddedParticipant {
58
59
60
61
62 private static Logger log = LoggerFactory.getLogger(AbstractEmbeddedParticipant.class);
63
64 public MgnlParticipant() throws Exception {
65 super();
66 }
67
68 public MgnlParticipant(String name) throws Exception {
69 super(name);
70 }
71
72 public void cancel(CancelItem cancelItem) throws Exception {
73 if (log.isDebugEnabled()) {
74 if (cancelItem.getId() != null) {
75 log.debug("Cancelling {}", cancelItem.getId().toParseableString());
76 }
77
78 }
79 Context originalContext = null;
80 if (MgnlContext.hasInstance()) {
81 originalContext = MgnlContext.getInstance();
82 }
83 try {
84 String parName = cancelItem.getParticipantName();
85 if (!parName.startsWith(WorkflowConstants.PARTICIPANT_PREFIX_COMMAND)) {
86
87
88 MgnlContext.setInstance(MgnlContext.getSystemContext());
89 WorkflowUtil.getWorkItemStore().removeWorkItem(cancelItem.getId());
90 }
91 } finally {
92 MgnlContext.release();
93 MgnlContext.setInstance(originalContext);
94 }
95 }
96
97
98
99
100 public void consume(WorkItem wi) throws Exception {
101
102
103 log.debug("Enter consume()..");
104
105 if (wi == null) {
106 log.error("Work item is null");
107 return;
108 }
109 String parName = ((InFlowWorkItem) (wi)).getParticipantName();
110
111 log.debug("Participant name = {}", parName);
112
113 Context originalContext = null;
114 if (MgnlContext.hasInstance()) {
115 originalContext = MgnlContext.getInstance();
116 }
117 try{
118
119 if (parName.startsWith(WorkflowConstants.PARTICIPANT_PREFIX_COMMAND)){
120 log.debug("Consuming command {}...", parName);
121
122 try {
123 String name = StringUtils.removeStart(parName, WorkflowConstants.PARTICIPANT_PREFIX_COMMAND);
124 Command c = CommandsManager.getInstance().getCommand(name);
125 if (c != null) {
126 log.debug("Command has been found through the magnolia catalog: {}", c.getClass().getName());
127
128
129
130
131 Context context = new WorkItemContext(MgnlContext.getSystemContext(), wi);
132
133
134 MgnlContext.setInstance(context);
135
136
137 c.execute(context);
138
139 WorkflowModule.getEngine().reply((InFlowWorkItem) wi);
140
141 }
142 else {
143
144 log.error("No command has been found through the magnolia catalog for name: {}", parName);
145 }
146
147 log.debug("Consumed command {}.", parName);
148 }
149 catch (Exception e) {
150 log.error("Couldn't consume command " + parName, e);
151 }
152 }
153 else {
154 MgnlContext.setInstance(MgnlContext.getSystemContext());
155 WorkflowUtil.getWorkItemStore().storeWorkItem(StringUtils.EMPTY, (InFlowWorkItem) wi);
156 }
157 }
158 finally {
159 MgnlContext.release();
160 MgnlContext.setInstance(originalContext);
161 }
162
163 log.debug("Finished consume()..");
164
165 }
166 }