001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.service;
016
017 import org.apache.oozie.command.wf.ReRunCommand;
018
019 import org.apache.oozie.client.WorkflowAction;
020 import org.apache.oozie.WorkflowActionBean;
021 import org.apache.oozie.WorkflowJobBean;
022 import org.apache.oozie.ErrorCode;
023 import org.apache.oozie.workflow.WorkflowException;
024 import org.apache.oozie.workflow.WorkflowInstance;
025 import org.apache.oozie.workflow.lite.ActionNodeHandler;
026 import org.apache.oozie.workflow.lite.DecisionNodeHandler;
027 import org.apache.oozie.workflow.lite.NodeHandler;
028 import org.apache.oozie.util.XLog;
029 import org.apache.oozie.util.XmlUtils;
030 import org.jdom.Element;
031 import org.jdom.JDOMException;
032
033 import java.util.ArrayList;
034 import java.util.List;
035
036 public abstract class LiteWorkflowStoreService extends WorkflowStoreService {
037
038 /**
039 * Delegation method used by the Action and Decision {@link NodeHandler} on start. <p/> This method provides the
040 * necessary information to create ActionExecutors.
041 *
042 * @param context NodeHandler context.
043 * @throws WorkflowException thrown if there was an error parsing the action configuration.
044 */
045 @SuppressWarnings("unchecked")
046 protected static void liteExecute(NodeHandler.Context context) throws WorkflowException {
047 XLog log = XLog.getLog(LiteWorkflowStoreService.class);
048 String jobId = context.getProcessInstance().getId();
049 String nodeName = context.getNodeDef().getName();
050 String skipVar = context.getProcessInstance().getVar(context.getNodeDef().getName()
051 + WorkflowInstance.NODE_VAR_SEPARATOR + ReRunCommand.TO_SKIP);
052 boolean skipAction = false;
053 if (skipVar != null) {
054 skipAction = skipVar.equals("true");
055 }
056 WorkflowActionBean action = new WorkflowActionBean();
057 String actionId = Services.get().get(UUIDService.class).generateChildId(jobId, nodeName);
058 if (!skipAction) {
059 String nodeConf = context.getNodeDef().getConf();
060 String executionPath = context.getExecutionPath();
061
062 String actionType;
063 try {
064 Element element = XmlUtils.parseXml(nodeConf);
065 actionType = element.getName();
066 nodeConf = XmlUtils.prettyPrint(element).toString();
067 }
068 catch (JDOMException ex) {
069 throw new WorkflowException(ErrorCode.E0700, ex.getMessage(), ex);
070 }
071
072 log.debug(" Creating action for node [{0}]", nodeName);
073 action.setType(actionType);
074 action.setExecutionPath(executionPath);
075 action.setConf(nodeConf);
076 action.setLogToken(((WorkflowJobBean) context.getTransientVar(WORKFLOW_BEAN)).getLogToken());
077 action.setStatus(WorkflowAction.Status.PREP);
078 action.setJobId(jobId);
079 }
080 action.setName(nodeName);
081 action.setId(actionId);
082 context.setVar(nodeName + WorkflowInstance.NODE_VAR_SEPARATOR + ACTION_ID, actionId);
083 List list = (List) context.getTransientVar(ACTIONS_TO_START);
084 if (list == null) {
085 list = new ArrayList();
086 context.setTransientVar(ACTIONS_TO_START, list);
087 }
088 list.add(action);
089 }
090
091 /**
092 * Delegation method used when failing actions. <p/>
093 *
094 * @param context NodeHandler context.
095 */
096 @SuppressWarnings("unchecked")
097 protected static void liteFail(NodeHandler.Context context) {
098 liteTerminate(context, ACTIONS_TO_FAIL);
099 }
100
101 /**
102 * Delegation method used when killing actions. <p/>
103 *
104 * @param context NodeHandler context.
105 */
106 @SuppressWarnings("unchecked")
107 protected static void liteKill(NodeHandler.Context context) {
108 liteTerminate(context, ACTIONS_TO_KILL);
109 }
110
111 /**
112 * Used to terminate jobs - FAIL or KILL. <p/>
113 *
114 * @param context NodeHandler context.
115 * @param transientVar The transient variable name.
116 */
117 @SuppressWarnings("unchecked")
118 private static void liteTerminate(NodeHandler.Context context, String transientVar) {
119 List<String> list = (List<String>) context.getTransientVar(transientVar);
120 if (list == null) {
121 list = new ArrayList<String>();
122 context.setTransientVar(transientVar, list);
123 }
124 list.add(context.getVar(context.getNodeDef().getName() + WorkflowInstance.NODE_VAR_SEPARATOR + ACTION_ID));
125 }
126
127 // wires workflow lib action execution with Oozie Dag
128 public static class LiteActionHandler extends ActionNodeHandler {
129
130 @Override
131 public void start(Context context) throws WorkflowException {
132 liteExecute(context);
133 }
134
135 public void end(Context context) {
136 }
137
138 public void kill(Context context) {
139 liteKill(context);
140 }
141
142 public void fail(Context context) {
143 liteFail(context);
144 }
145 }
146
147 // wires workflow lib decision execution with Oozie Dag
148 public static class LiteDecisionHandler extends DecisionNodeHandler {
149
150 @Override
151 public void start(Context context) throws WorkflowException {
152 liteExecute(context);
153 }
154
155 public void end(Context context) {
156 }
157
158 public void kill(Context context) {
159 liteKill(context);
160 }
161
162 public void fail(Context context) {
163 liteFail(context);
164 }
165 }
166 }