package org.wso2.carbon.mediation.ntask; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.synapse.task.Task; import org.wso2.carbon.base.MultitenantConstants; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.mediation.ntask.internal.NtaskService; import org.wso2.carbon.ntask.core.AbstractTask; import org.wso2.carbon.ntask.core.TaskInfo; import org.wso2.carbon.utils.CarbonUtils; import java.util.HashMap; import java.util.Map; public class NTaskAdapter extends AbstractTask { private static final Log logger = LogFactory.getLog(NTaskAdapter.class.getName()); private static final Map<String, Object> synapseTaskProperties = new HashMap<String, Object>(); private static final Object lock = new Object(); private boolean initialized = false; private org.apache.synapse.task.Task synapseTask; public static boolean addProperty(String name, Object property) { if (name == null) { return false; } synchronized (lock) { return synapseTaskProperties.put(NTaskTaskManager.tenantId() + name, property) == property; } } public static boolean removeProperty(String name) { if (name == null) { return false; } synchronized (lock) { return synapseTaskProperties.remove(NTaskTaskManager.tenantId() + name) == null; } } public void init() { Map<String, String> properties = getProperties(); if (properties == null) { return; } String taskName = properties.get("task.name");// taskName = "name::group" if (taskName == null) { return; } Object taskInstance; synchronized (lock) { taskInstance = synapseTaskProperties.get(NTaskTaskManager.tenantId() + taskName); } if (taskInstance == null) { //If tenant is not super tenant and not loaded load tenant. checkLoadTenant(properties.get(TaskInfo.TENANT_ID_PROP)); // Nothing to execute. return; } if (!(taskInstance instanceof Task)) { return; } // Add runtimeProperties if(taskInstance instanceof org.apache.synapse.startup.tasks.MessageInjector){ org.apache.synapse.startup.tasks.MessageInjector messageInjectorTask = (org.apache.synapse.startup.tasks.MessageInjector) taskInstance; messageInjectorTask.addRuntimeProperty(Constants.TASK_EXECUTING_TENANT_ID, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId()); } synapseTask = (Task) taskInstance; initialized = true; } public void execute() { if (!isInitialized()) { return; } //introduced due to limitation of Ntask.core executing task for single cycle when task // count 0 //trigger count can be null in some scenarios when editing tasks hence null check if (getProperties().get("task.count") == null || (getProperties().get("task.count") != null && Integer.parseInt(getProperties().get("task.count")) == 0)) { return; } if (logger.isDebugEnabled()) { logger.debug("#execute Executing NTaskAdapter: " + getProperties() + " Worker-node[" + CarbonUtils.isWorkerNode() + "]" ); } //needs to keep the tenant loaded Map<String, String> properties = getProperties(); checkLoadTenant(properties.get(TaskInfo.TENANT_ID_PROP)); synapseTask.execute(); } /** * If tenant is not super tenant and not loaded load tenant. * */ private void checkLoadTenant(String sTenantId){ if(sTenantId != null ){ Integer iTenantId = Integer.parseInt(sTenantId); if(!iTenantId.equals(MultitenantConstants.SUPER_TENANT_ID)){ NtaskService.loadTenant(iTenantId); } } } private boolean isInitialized() { return initialized; } }