001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *      http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.oozie.command.wf;
019
020import java.util.Properties;
021
022import org.apache.oozie.ErrorCode;
023import org.apache.oozie.WorkflowActionBean;
024import org.apache.oozie.action.ActionExecutor;
025import org.apache.oozie.command.CommandException;
026import org.apache.oozie.command.PreconditionException;
027import org.apache.oozie.executor.jpa.WorkflowActionGetJPAExecutor;
028import org.apache.oozie.service.ActionService;
029import org.apache.oozie.service.JPAService;
030import org.apache.oozie.service.Services;
031import org.apache.oozie.util.LogUtils;
032import org.apache.oozie.util.ParamChecker;
033
034/**
035 * This command is executed once the Workflow command is finished.
036 */
037public class CompletedActionXCommand extends WorkflowXCommand<Void> {
038    private final String actionId;
039    private final String externalStatus;
040    private JPAService jpaService;
041    private WorkflowActionBean wfactionBean;
042
043    public CompletedActionXCommand(String actionId, String externalStatus, Properties actionData, int priority) {
044        super("callback", "callback", priority);
045        this.actionId = ParamChecker.notEmpty(actionId, "actionId");
046        this.externalStatus = ParamChecker.notEmpty(externalStatus, "externalStatus");
047    }
048
049    public CompletedActionXCommand(String actionId, String externalStatus, Properties actionData) {
050        this(actionId, externalStatus, actionData, 1);
051    }
052
053    /*
054     * (non-Javadoc)
055     *
056     * @see org.apache.oozie.command.XCommand#eagerLoadState()
057     */
058    @Override
059    protected void eagerLoadState() throws CommandException {
060        super.eagerLoadState();
061        try {
062            jpaService = Services.get().get(JPAService.class);
063            if (jpaService != null) {
064                this.wfactionBean = jpaService.execute(new WorkflowActionGetJPAExecutor(this.actionId));
065            }
066            else {
067                throw new CommandException(ErrorCode.E0610);
068            }
069        }
070        catch (Exception ex) {
071            throw new CommandException(ErrorCode.E0603, ex.getMessage(), ex);
072        }
073        LogUtils.setLogInfo(this.wfactionBean, logInfo);
074    }
075
076    /*
077     * (non-Javadoc)
078     *
079     * @see org.apache.oozie.command.XCommand#eagerVerifyPrecondition()
080     */
081    @Override
082    protected void eagerVerifyPrecondition() throws CommandException, PreconditionException {
083        super.eagerVerifyPrecondition();
084        if (this.wfactionBean.getStatus() != WorkflowActionBean.Status.RUNNING) {
085            throw new CommandException(ErrorCode.E0800, actionId, this.wfactionBean.getStatus());
086        }
087    }
088
089    /*
090     * (non-Javadoc)
091     *
092     * @see org.apache.oozie.command.XCommand#execute()
093     */
094    @Override
095    protected Void execute() throws CommandException {
096        ActionExecutor executor = Services.get().get(ActionService.class).getExecutor(this.wfactionBean.getType());
097        // this is done because oozie notifications (of sub-wfs) is send
098        // every status change, not only on completion.
099        if (executor.isCompleted(externalStatus)) {
100            queue(new ActionCheckXCommand(this.wfactionBean.getId(), getPriority(), -1));
101        }
102        return null;
103    }
104
105    /*
106     * (non-Javadoc)
107     *
108     * @see org.apache.oozie.command.XCommand#getEntityKey()
109     */
110    @Override
111    public String getEntityKey() {
112        return null;
113    }
114
115    /*
116     * (non-Javadoc)
117     *
118     * @see org.apache.oozie.command.XCommand#isLockRequired()
119     */
120    @Override
121    protected boolean isLockRequired() {
122        return false;
123    }
124
125    /*
126     * (non-Javadoc)
127     *
128     * @see org.apache.oozie.command.XCommand#loadState()
129     */
130    @Override
131    protected void loadState() throws CommandException {
132        eagerLoadState();
133    }
134
135    /*
136     * (non-Javadoc)
137     *
138     * @see org.apache.oozie.command.XCommand#verifyPrecondition()
139     */
140    @Override
141    protected void verifyPrecondition() throws CommandException, PreconditionException {
142        eagerVerifyPrecondition();
143    }
144}