/** * Copyright (c) 2009, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * 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 org.wso2.carbon.task; import org.apache.axis2.engine.AxisConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.synapse.Startup; import org.apache.synapse.SynapseConstants; import org.apache.synapse.config.SynapseConfiguration; import org.apache.synapse.task.TaskDescription; import org.apache.synapse.task.TaskDescriptionRepository; import org.wso2.carbon.mediation.initializer.ServiceBusConstants; import org.wso2.carbon.mediation.initializer.ServiceBusUtils; import org.wso2.carbon.mediation.initializer.persistence.MediationPersistenceManager; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * A Central controller for do Task management * Track 'TaskManagementService' service implementations * and delete management operation to them as appropriately */ public class TaskManager { private static final Log log = LogFactory.getLog(TaskManager.class); public static final String CARBON_TASK_MANAGER = "CARBON_TASK_MANAGER"; public static final String CARBON_TASK_REPOSITORY = "CARBON_TASK_REPOSITORY"; public static final String CARBON_TASK_JOB_METADATA_SERVICE = "CARBON_TASK_JOB_METADATA_SERVICE"; public static final String CARBON_TASK_MANAGEMENT_SERVICE = "CARBON_TASK_MANAGEMENT_SERVICE"; public static final String CARBON_TASK_SCHEDULER = "CARBON_TASK_SCHEDULER"; private JobMetaDataProviderServiceHandler jobMetaDataProviderServiceHandler; private TaskManagementServiceHandler taskManagementServiceHandler; private boolean initialized = false; private TaskDescriptionRepository repository; public TaskManager() { } public void init(JobMetaDataProviderServiceHandler jobMetaDataProviderServiceHandler, TaskManagementServiceHandler taskManagementServiceHandler) { if (log.isDebugEnabled()) { log.debug("Initiating a TaskManager"); } this.jobMetaDataProviderServiceHandler = jobMetaDataProviderServiceHandler; this.taskManagementServiceHandler = taskManagementServiceHandler; this.initialized = true; } public void shutDown() { if (!initialized) { if (log.isDebugEnabled()) { log.debug("TaskManager has not been initilized."); } return; } this.initialized = false; } /** * Adding a TaskDescription * Delegates adding responsibility to underlying each 'TaskManagementService' service * * @param taskDescription TaskDescription instance */ public void addTaskDescription(TaskDescription taskDescription) { assetInitialized(); String className = jobMetaDataProviderServiceHandler.getTaskManagementServiceImplementer( taskDescription.getTaskGroup()); if (className != null && !"".equals(className)) { taskManagementServiceHandler.addTaskDescription(taskDescription, className); } } /** * Deleting a TaskDescription * Delegates deleting responsibility to each 'TaskManagementService' service * * @param name Name of the TaskDescription instance to be deleted * @param group group of the task */ public void deleteTaskDescription(String name, String group) { assetInitialized(); String className = jobMetaDataProviderServiceHandler.getTaskManagementServiceImplementer( group); if (className != null && !"".equals(className)) { taskManagementServiceHandler.deleteTaskDescription(name, className); } } /** * Editing a TaskDescription * Delegates Editing responsibility to each 'TaskManagementService' service * * @param taskDescription TaskDescription instance */ public void editTaskDescription(TaskDescription taskDescription, AxisConfiguration axisConfig) { assetInitialized(); String className = jobMetaDataProviderServiceHandler.getTaskManagementServiceImplementer( taskDescription.getTaskGroup()); SynapseConfiguration synapseConfig = (SynapseConfiguration)axisConfig .getParameterValue(SynapseConstants.SYNAPSE_CONFIG); Startup startup = synapseConfig.getStartup(taskDescription.getName()); String artifactContainerName = startup.getArtifactContainerName(); String startupName = taskDescription.getName(); if (className != null && !"".equals(className)) { taskManagementServiceHandler.editTaskDescription(taskDescription, className); if (artifactContainerName != null) { MediationPersistenceManager pm = ServiceBusUtils.getMediationPersistenceManager(axisConfig); pm.deleteItem(taskDescription.getName(), taskDescription.getName() + ".xml", ServiceBusConstants.ITEM_TYPE_TASK); synapseConfig.getStartup(startupName).setIsEdited(true); synapseConfig.getStartup(startupName).setArtifactContainerName(artifactContainerName); } } } /** * Get all TaskDescriptions across all 'TaskManagementService' service * * @return List of TaskDescription instances */ public List<TaskDescription> getAllTaskDescriptions() { assetInitialized(); List<TaskDescription> taskDescriptions = new ArrayList<TaskDescription>(); if (repository == null) { return taskDescriptions; } Iterator<TaskDescription> iterator = repository.getAllTaskDescriptions(); while (iterator.hasNext()) { TaskDescription taskDescription = iterator.next(); if (taskDescription != null) { taskDescriptions.add(taskDescription); } } if (log.isDebugEnabled()) { log.debug("All available Task based Startup " + taskDescriptions); } return taskDescriptions; } public TaskData[] getAllTaskData(AxisConfiguration axisConfig) { assetInitialized(); List<TaskData> taskDatas = new ArrayList<TaskData>(); if (repository == null) { return null; } Iterator<TaskDescription> iterator = repository.getAllTaskDescriptions(); while (iterator.hasNext()) { TaskDescription taskDescription = iterator.next(); if (taskDescription != null) { TaskData data = new TaskData(); data.setName(taskDescription.getName()); data.setGroup(taskDescription.getTaskGroup()); SynapseConfiguration synapseConfig = (SynapseConfiguration)axisConfig .getParameterValue(SynapseConstants.SYNAPSE_CONFIG); Startup startup = synapseConfig.getStartup(taskDescription.getName()); if (startup != null) { if (startup.getArtifactContainerName() != null) { data.setArtifactContainerName(startup.getArtifactContainerName()); } if (startup.isEdited()) { data.setIsEdited(true); } taskDatas.add(data); } } } if (log.isDebugEnabled()) { log.debug("All available Task based Startup " + taskDatas); } return taskDatas.toArray(new TaskData[taskDatas.size()]); } /** * Looking up a TaskDescription * Delegates Looking up responsibility to each 'TaskManagementService' service * * @param name Name of the TaskDescription to be returned * @param group group of the task * @return taskDescription TaskDescription instance */ public TaskDescription getTaskDescription(String name, String group) { assetInitialized(); String className = jobMetaDataProviderServiceHandler.getTaskManagementServiceImplementer( group); if (className != null && !"".equals(className)) { return taskManagementServiceHandler.getTaskDescription(name, className); } return null; } /** * Explicit check for a TaskDescription with a particular name * Delegates responsibility to each 'TaskManagementService' service until any one find a TaskDescription * with the given name * * @param name Name of the TaskDescription * @param group group of the task * @return true if there is a task description with given name */ public boolean isContains(String name, String group) { assetInitialized(); String className = jobMetaDataProviderServiceHandler.getTaskManagementServiceImplementer( group); return className != null && !"".equals(className) && taskManagementServiceHandler.isContains(name, className); } public List<String> getPropertyNames(String taskClass, String group) { assetInitialized(); String className = jobMetaDataProviderServiceHandler.getTaskManagementServiceImplementer( group); if (className != null && !"".equals(className)) { return taskManagementServiceHandler.getPropertyNames(taskClass, className); } if (log.isDebugEnabled()) { log.debug("Cannot find a property name list of class : " + taskClass); } return new ArrayList<String>(); } public List<String> getAllJobGroups() { assetInitialized(); return jobMetaDataProviderServiceHandler.getJobGroups(); } public void setTaskDescriptionRepository(TaskDescriptionRepository repository) { this.repository = repository; } private void assetInitialized() { if (!initialized) { String msg = "TaskManager has not been initilized." + "Both of JobMetaDataProviderService and TaskManagementService should be " + "provided to initiate the Task Manager"; log.error(msg); throw new IllegalStateException(msg); } } }