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