View Javadoc

1   /**
2    * This file Copyright (c) 2003-2011 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
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   * The Magnolia-specific workflow participant.
52   * @author Jackie Ju
53   * @author Philipp Bracher
54   * @author Nicolas Modrzyk
55   * @author John Mettraux
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                  // remove workitem from inbox
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          // get participant name
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                         // set parameters in the context
124                         // precise what we're talking about here: this is forced to be a System Context :
125                         // since we are processing within the workflow enviroment
126                         Context context = new WorkItemContext(MgnlContext.getSystemContext(), wi);
127 
128                         // remember to reset it after execution
129                         MgnlContext.setInstance(context);
130 
131                         // execute
132                         c.execute(context);
133 
134                         WorkflowModule.getEngine().reply((InFlowWorkItem) wi);
135 
136                     }
137                     else {
138                         // not found, do in the old ways
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 }