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 private static final Logger log = LoggerFactory.getLogger(AbstractEmbeddedParticipant.class);
59
60 public MgnlParticipant() throws Exception {
61 super();
62 }
63
64 public MgnlParticipant(String name) throws Exception {
65 super(name);
66 }
67
68 public void cancel(CancelItem cancelItem) throws Exception {
69 if (log.isDebugEnabled()) {
70 if (cancelItem.getId() != null) {
71 log.debug("Cancelling {}", cancelItem.getId().toParseableString());
72 }
73
74 }
75 Context originalContext = null;
76 if (MgnlContext.hasInstance()) {
77 originalContext = MgnlContext.getInstance();
78 }
79 try {
80 String parName = cancelItem.getParticipantName();
81 if (!parName.startsWith(WorkflowConstants.PARTICIPANT_PREFIX_COMMAND)) {
82
83
84 MgnlContext.setInstance(MgnlContext.getSystemContext());
85 WorkflowUtil.getWorkItemStore().removeWorkItem(cancelItem.getId());
86 }
87 } finally {
88 MgnlContext.release();
89 MgnlContext.setInstance(originalContext);
90 }
91 }
92
93 public void consume(WorkItem wi) throws Exception {
94
95
96 log.debug("Enter consume()..");
97
98 if (wi == null) {
99 log.error("Work item is null");
100 return;
101 }
102 String parName = ((InFlowWorkItem) (wi)).getParticipantName();
103
104 log.debug("Participant name = {}", parName);
105
106 Context originalContext = null;
107 if (MgnlContext.hasInstance()) {
108 originalContext = MgnlContext.getInstance();
109 }
110 try{
111
112 if (parName.startsWith(WorkflowConstants.PARTICIPANT_PREFIX_COMMAND)){
113 log.debug("Consuming command {}...", parName);
114
115 try {
116 String name = StringUtils.removeStart(parName, WorkflowConstants.PARTICIPANT_PREFIX_COMMAND);
117 Command c = CommandsManager.getInstance().getCommand(name);
118 if (c != null) {
119 log.debug("Command has been found through the magnolia catalog: {}", c.getClass().getName());
120
121
122
123
124 Context context = new WorkItemContext(MgnlContext.getSystemContext(), wi);
125
126
127 MgnlContext.setInstance(context);
128
129
130 c.execute(context);
131
132 WorkflowModule.getEngine().reply((InFlowWorkItem) wi);
133
134 }
135 else {
136
137 log.error("No command has been found through the magnolia catalog for name: {}", parName);
138 }
139
140 log.debug("Consumed command {}.", parName);
141 }
142 catch (Exception e) {
143 log.error("Couldn't consume command " + parName, e);
144 }
145 }
146 else {
147 MgnlContext.setInstance(MgnlContext.getSystemContext());
148 WorkflowUtil.getWorkItemStore().storeWorkItem(StringUtils.EMPTY, (InFlowWorkItem) wi);
149 }
150 }
151 finally {
152 MgnlContext.release();
153 MgnlContext.setInstance(originalContext);
154 }
155
156 log.debug("Finished consume()..");
157
158 }
159 }