View Javadoc

1   /**
2    * This file Copyright (c) 2003-2010 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  
59      /**
60       * Logger
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                  // remove workitem from inbox
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       * @see openwfe.org.embed.engine.EmbeddedParticipant#consume(openwfe.org.engine.workitem.WorkItem)
99       */
100     public void consume(WorkItem wi) throws Exception {
101 
102         // get participant name
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                         // set parameters in the context
129                         // precise what we're talking about here: this is forced to be a System Context :
130                         // since we are processing within the workflow enviroment
131                         Context context = new WorkItemContext(MgnlContext.getSystemContext(), wi);
132 
133                         // remember to reset it after execution
134                         MgnlContext.setInstance(context);
135 
136                         // execute
137                         c.execute(context);
138 
139                         WorkflowModule.getEngine().reply((InFlowWorkItem) wi);
140 
141                     }
142                     else {
143                         // not found, do in the old ways
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 }