package org.wso2.carbon.mediation.ntask;
import org.apache.synapse.task.TaskDescription;
import org.wso2.carbon.ntask.common.TaskConstants;
import org.wso2.carbon.ntask.core.TaskInfo;
import java.util.*;
final class TaskBuilder {
public static final String REMOTE_TASK_NAME = "__REMOTE_TASK_NAME__";
public static TaskInfo buildTaskInfo(TaskDescription taskDescription, Map<String, Object> properties) throws Exception {
return buildTaskInfo(taskDescription, false, properties);
}
public static TaskInfo buildTaskInfo(TaskDescription description,
boolean system, Map<String, Object> tmProperties) throws Exception {
TaskInfo.TriggerInfo triggerInfo = new TaskInfo.TriggerInfo();
String cron = description.getCronExpression();
if (cron != null && cron.trim().length() == 0) {
cron = null;
}
triggerInfo.setCronExpression(cron);
if (description.getStartTime() != null) {
triggerInfo.setStartTime(description.getStartTime().getTime());
} else if (triggerInfo.getCronExpression() == null) {
//triggerInfo.setStartTime(new Date());
//triggerInfo.setMisfirePolicy(TaskConstants.TaskMisfirePolicy.NOW_WITH_REMAINING_COUNT);
}
if (description.getEndTime() != null) {
triggerInfo.setEndTime(description.getEndTime().getTime());
}
if (cron == null && !system && description.getInterval() < 1000) {
throw new Exception("Task interval cannot be less than 1 second for user tasks");
}
triggerInfo.setIntervalMillis((int) description.getInterval());
triggerInfo.setRepeatCount(description.getCount()
> 0 ? description.getCount() - 1 : description.getCount());
triggerInfo.setDisallowConcurrentExecution(true);
Map<String, String> props = new HashMap<String, String>();
props.put(REMOTE_TASK_NAME, description.getName());
// copy the remaining properties
Map<String, String> properties = description.getProperties();
Iterator<String> iterator = properties.keySet().iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (o != null) {
props.put((String) o, properties.get(o));
}
}
if (tmProperties != null) {
for (String name : tmProperties.keySet()) {
if (tmProperties.get(name) instanceof String) {
props.put(name, (String) tmProperties.get(name));
}
}
}
Object o = description.getResource(TaskDescription.CLASSNAME);
String taskClassName;
if (o instanceof String) {
taskClassName = (String) o;
props.put(TaskDescription.CLASSNAME, taskClassName);
} else {
return null;
}
String nameGroup = description.getName() + "::" + description.getTaskGroup();
props.put("task.name", nameGroup);
//trigger count cannot be null for a task description hence null check avoided
props.put("task.count", String.valueOf(description.getCount()));
Object taskInstance = description.getResource(TaskDescription.INSTANCE);
if (taskInstance instanceof org.apache.synapse.task.Task) {
NTaskAdapter.addProperty(nameGroup, taskInstance);
}
return new TaskInfo(description.getName(), NTaskAdapter.class.getName(), props, triggerInfo);
}
public static TaskDescription buildTaskDescription(TaskInfo taskInfo) {
TaskDescription taskDescription = new TaskDescription();
taskDescription.setName(taskInfo.getName());
Map<String, String> taskProps = taskInfo.getProperties();
TaskInfo.TriggerInfo triggerInfo = taskInfo.getTriggerInfo();
taskDescription.setCronExpression(triggerInfo.getCronExpression());
taskDescription.setStartTime(dateToCal(triggerInfo.getStartTime()));
taskDescription.setEndTime(dateToCal(triggerInfo.getEndTime()));
taskDescription.setCount(triggerInfo.getRepeatCount()+1);
taskDescription.setInterval(triggerInfo.getIntervalMillis());
taskDescription.setIntervalInMs(true);
return taskDescription;
}
private static Calendar dateToCal(Date date) {
if (date == null) {
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal;
}
}