/*
* Copyright 2013 LinkedIn Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package azkaban.executor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import azkaban.flow.Flow;
import azkaban.project.Project;
import azkaban.utils.TypedMapWrapper;
public class ExecutableFlow extends ExecutableFlowBase {
public static final String EXECUTIONID_PARAM = "executionId";
public static final String EXECUTIONPATH_PARAM = "executionPath";
public static final String EXECUTIONOPTIONS_PARAM = "executionOptions";
public static final String PROJECTID_PARAM = "projectId";
public static final String SCHEDULEID_PARAM = "scheduleId";
public static final String SUBMITUSER_PARAM = "submitUser";
public static final String SUBMITTIME_PARAM = "submitTime";
public static final String VERSION_PARAM = "version";
public static final String PROXYUSERS_PARAM = "proxyUsers";
public static final String PROJECTNAME_PARAM = "projectName";
public static final String LASTMODIFIEDTIME_PARAM = "lastModfiedTime";
public static final String LASTMODIFIEDUSER_PARAM = "lastModifiedUser";
private int executionId = -1;
private int scheduleId = -1;
private int projectId;
private String projectName;
private String lastModifiedUser;
private int version;
private long submitTime = -1;
private long lastModifiedTimestamp;
private String submitUser;
private String executionPath;
private HashSet<String> proxyUsers = new HashSet<String>();
private ExecutionOptions executionOptions;
public ExecutableFlow(Project project, Flow flow) {
this.projectId = project.getId();
this.projectName = project.getName();
this.version = project.getVersion();
this.scheduleId = -1;
this.lastModifiedTimestamp = project.getLastModifiedTimestamp();
this.lastModifiedUser = project.getLastModifiedUser();
this.setFlow(project, flow);
}
public ExecutableFlow() {
}
@Override
public String getId() {
return getFlowId();
}
@Override
public ExecutableFlow getExecutableFlow() {
return this;
}
public void addAllProxyUsers(Collection<String> proxyUsers) {
this.proxyUsers.addAll(proxyUsers);
}
public Set<String> getProxyUsers() {
return new HashSet<String>(this.proxyUsers);
}
public void setExecutionOptions(ExecutionOptions options) {
executionOptions = options;
}
public ExecutionOptions getExecutionOptions() {
return executionOptions;
}
@Override
protected void setFlow(Project project, Flow flow) {
super.setFlow(project, flow);
executionOptions = new ExecutionOptions();
executionOptions.setMailCreator(flow.getMailCreator());
if (flow.getSuccessEmails() != null) {
executionOptions.setSuccessEmails(flow.getSuccessEmails());
}
if (flow.getFailureEmails() != null) {
executionOptions.setFailureEmails(flow.getFailureEmails());
}
}
@Override
public int getExecutionId() {
return executionId;
}
public void setExecutionId(int executionId) {
this.executionId = executionId;
}
@Override
public long getLastModifiedTimestamp() {
return lastModifiedTimestamp;
}
public void setLastModifiedTimestamp(long lastModifiedTimestamp) {
this.lastModifiedTimestamp = lastModifiedTimestamp;
}
@Override
public String getLastModifiedByUser() {
return lastModifiedUser;
}
public void setLastModifiedByUser(String lastModifiedUser) {
this.lastModifiedUser = lastModifiedUser;
}
@Override
public int getProjectId() {
return projectId;
}
public void setProjectId(int projectId) {
this.projectId = projectId;
}
@Override
public String getProjectName() {
return projectName;
}
public int getScheduleId() {
return scheduleId;
}
public void setScheduleId(int scheduleId) {
this.scheduleId = scheduleId;
}
public String getExecutionPath() {
return executionPath;
}
public void setExecutionPath(String executionPath) {
this.executionPath = executionPath;
}
public String getSubmitUser() {
return submitUser;
}
public void setSubmitUser(String submitUser) {
this.submitUser = submitUser;
}
@Override
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public long getSubmitTime() {
return submitTime;
}
public void setSubmitTime(long submitTime) {
this.submitTime = submitTime;
}
@Override
public Map<String, Object> toObject() {
HashMap<String, Object> flowObj = new HashMap<String, Object>();
fillMapFromExecutable(flowObj);
flowObj.put(EXECUTIONID_PARAM, executionId);
flowObj.put(EXECUTIONPATH_PARAM, executionPath);
flowObj.put(PROJECTID_PARAM, projectId);
flowObj.put(PROJECTNAME_PARAM, projectName);
if (scheduleId >= 0) {
flowObj.put(SCHEDULEID_PARAM, scheduleId);
}
flowObj.put(SUBMITUSER_PARAM, submitUser);
flowObj.put(VERSION_PARAM, version);
flowObj.put(LASTMODIFIEDTIME_PARAM, lastModifiedTimestamp);
flowObj.put(LASTMODIFIEDUSER_PARAM, lastModifiedUser);
flowObj.put(EXECUTIONOPTIONS_PARAM, this.executionOptions.toObject());
flowObj.put(VERSION_PARAM, version);
ArrayList<String> proxyUserList = new ArrayList<String>(proxyUsers);
flowObj.put(PROXYUSERS_PARAM, proxyUserList);
flowObj.put(SUBMITTIME_PARAM, submitTime);
return flowObj;
}
@SuppressWarnings("unchecked")
public static ExecutableFlow createExecutableFlowFromObject(Object obj) {
ExecutableFlow exFlow = new ExecutableFlow();
HashMap<String, Object> flowObj = (HashMap<String, Object>) obj;
exFlow.fillExecutableFromMapObject(flowObj);
return exFlow;
}
@Override
public void fillExecutableFromMapObject(
TypedMapWrapper<String, Object> flowObj) {
super.fillExecutableFromMapObject(flowObj);
this.executionId = flowObj.getInt(EXECUTIONID_PARAM);
this.executionPath = flowObj.getString(EXECUTIONPATH_PARAM);
this.projectId = flowObj.getInt(PROJECTID_PARAM);
this.projectName = flowObj.getString(PROJECTNAME_PARAM);
this.scheduleId = flowObj.getInt(SCHEDULEID_PARAM);
this.submitUser = flowObj.getString(SUBMITUSER_PARAM);
this.version = flowObj.getInt(VERSION_PARAM);
this.lastModifiedTimestamp = flowObj.getLong(LASTMODIFIEDTIME_PARAM);
this.lastModifiedUser = flowObj.getString(LASTMODIFIEDUSER_PARAM);
this.submitTime = flowObj.getLong(SUBMITTIME_PARAM);
if (flowObj.containsKey(EXECUTIONOPTIONS_PARAM)) {
this.executionOptions =
ExecutionOptions.createFromObject(flowObj
.getObject(EXECUTIONOPTIONS_PARAM));
} else {
// for backwards compatibility should remove in a few versions.
this.executionOptions = ExecutionOptions.createFromObject(flowObj);
}
if (flowObj.containsKey(PROXYUSERS_PARAM)) {
List<String> proxyUserList = flowObj.<String> getList(PROXYUSERS_PARAM);
this.addAllProxyUsers(proxyUserList);
}
}
@Override
public Map<String, Object> toUpdateObject(long lastUpdateTime) {
Map<String, Object> updateData = super.toUpdateObject(lastUpdateTime);
updateData.put(EXECUTIONID_PARAM, this.executionId);
return updateData;
}
@Override
public void resetForRetry() {
super.resetForRetry();
this.setStatus(Status.RUNNING);
}
}