/**
* 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.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.task.*;
import org.wso2.carbon.core.AbstractAdmin;
import javax.xml.namespace.QName;
import java.util.List;
/**
* Web service for Task Management
*/
public class CarbonTaskManagementService extends AbstractAdmin {
private static final Log log = LogFactory.getLog(CarbonTaskManagementService.class);
private static final String TASK_EXTENSION_NS =
"http://www.wso2.org/products/wso2commons/tasks";
private static final OMFactory FACTORY = OMAbstractFactory.getOMFactory();
private final static String COMMON_ENDPOINT_POSTFIX = "--SYNAPSE_INBOUND_ENDPOINT";
private static final OMNamespace TASK_OM_NAMESPACE = FACTORY.createOMNamespace(
TASK_EXTENSION_NS, "task");
public CarbonTaskManagementService() {
}
public boolean addTaskDescription(OMElement taskElement) throws TaskManagementException {
if (log.isDebugEnabled()) {
log.debug("Add TaskDescription - Get a Task configuration :" + taskElement);
}
TaskDescription taskDescription = validateAndCreate(taskElement);
if (isContains(taskDescription.getName(), taskDescription.getTaskGroup())) {
throw new TaskManagementException("Task with name " + taskDescription.getName() +
" is already there.");
}
try {
getTaskManager().addTaskDescription(taskDescription);
} catch (Exception e) {
try {
getTaskManager().deleteTaskDescription(taskDescription.getName(),
taskDescription.getTaskGroup());
} catch (Exception ignored) {
}
handleException("Error creating a task : " + e.getMessage(), e);
}
return true;
}
public boolean deleteTaskDescription(String s, String group) throws TaskManagementException {
validateName(s);
if (log.isDebugEnabled()) {
log.debug("Delete TaskDescription - Get a name of the TaskDescription " +
"to be deleted : " + s);
}
try {
getTaskManager().deleteTaskDescription(s, group);
} catch (Exception e) {
handleException("Error deleting a task with name : " + s + " : " +
e.getMessage(), e);
}
return true;
}
public void editTaskDescription(OMElement taskElement) throws TaskManagementException {
if (log.isDebugEnabled()) {
log.debug("Edit TaskDescription - Get a Task configuration :" + taskElement);
}
try {
getTaskManager().editTaskDescription(validateAndCreate(taskElement), getAxisConfig());
} catch (Exception e) {
handleException("Error editing a task : " + e.getMessage(), e);
}
}
public OMElement getAllTaskDescriptions() throws TaskManagementException {
OMElement root =
OMAbstractFactory.getOMFactory().createOMElement(new QName(TASK_EXTENSION_NS,
"taskExtension", "task"));
try {
List<TaskDescription> descriptions = getTaskManager().getAllTaskDescriptions();
for (TaskDescription taskDescription : descriptions) {
if (taskDescription != null && taskDescription.getName() != null
&& !taskDescription.getName().endsWith(COMMON_ENDPOINT_POSTFIX)) {
OMElement taskElement =
TaskDescriptionSerializer.serializeTaskDescription(TASK_OM_NAMESPACE,
taskDescription);
validateTaskElement(taskElement);
root.addChild(taskElement);
}
}
} catch (Exception e) {
handleException("Error loading all tasks : " + e.getMessage(), e);
}
if (log.isDebugEnabled()) {
log.debug("Returning all TaskDescriptions as :" + root);
}
return root;
}
public OMElement getTaskDescription(String s, String group) throws TaskManagementException {
validateName(s);
if (log.isDebugEnabled()) {
log.debug("Get TaskDescription - Get a name of the TaskDescription to be" +
" returned : " + s);
}
try {
TaskDescription taskDescription = getTaskManager().getTaskDescription(s, group);
if (taskDescription != null) {
if (log.isDebugEnabled()) {
log.debug("Retrieved a TaskDescription : " + taskDescription);
}
OMElement taskElement =
TaskDescriptionSerializer.serializeTaskDescription(TASK_OM_NAMESPACE,
taskDescription);
validateTaskElement(taskElement);
if (log.isDebugEnabled()) {
log.debug("Task Configuration : " + taskElement);
}
return taskElement;
} else {
if (log.isDebugEnabled()) {
log.debug("There is no TaskDescription with name :" + s);
}
}
} catch (Exception e) {
handleException("Error loading a task with name " + s + " : " +
e.getMessage(), e);
}
return null;
}
public TaskData[] getAllTaskData() throws TaskManagementException {
TaskData[] taskData = null;
if (getTaskManager().getAllTaskData(getAxisConfig()) != null) {
taskData = getTaskManager().getAllTaskData(getAxisConfig());
}
return taskData;
}
public boolean isContains(String s, String group) throws TaskManagementException {
validateName(s);
return getTaskManager().isContains(s, group);
}
public OMElement loadTaskClassProperties(String className,
String group) throws TaskManagementException {
validateName(className);
try {
List<String> names = getTaskManager().getPropertyNames(className.trim(), group);
OMNamespace nullNS = FACTORY.createOMNamespace("", "");
OMElement propertiesElement = FACTORY.createOMElement("properties", TASK_OM_NAMESPACE);
if (names == null || names.isEmpty()) {
if (log.isDebugEnabled()) {
log.debug("Empty Property name list for class : " + className);
}
return propertiesElement;
}
for (String name : names) {
if (name != null && !"".equals(name)) {
OMElement propElem = FACTORY.createOMElement("property", TASK_OM_NAMESPACE);
propElem.addAttribute("name", name, nullNS);
propElem.addAttribute("value", "", nullNS);
propertiesElement.addChild(propElem);
}
}
return propertiesElement;
} catch (Exception e) {
handleException("Error loading task implementation : " +
e.getMessage(), e);
return null;
}
}
public String[] getAllJobGroups() {
List<String> strings = getTaskManager().getAllJobGroups();
return strings.toArray(new String[strings.size()]);
}
//************* HELPER METHODS ************//
private static TaskDescription validateAndCreate(
OMElement taskElement) throws TaskManagementException {
validateTaskElement(taskElement);
TaskDescription taskDescription =
TaskDescriptionFactory.createTaskDescription(taskElement, TASK_OM_NAMESPACE);
validateTaskDescription(taskDescription);
if (log.isDebugEnabled()) {
log.debug("Task Description : " + taskDescription);
}
return taskDescription;
}
private static void validateTaskDescription(
TaskDescription description) throws TaskManagementException {
if (description == null) {
handleException("Task Description can not be found.");
}
}
private static void validateTaskElement(
OMElement taskElement) throws TaskManagementException {
if (taskElement == null) {
handleException("Task Description OMElement can not be found.");
}
}
private static void validateName(String name) throws TaskManagementException {
if (name == null || "".equals(name)) {
handleException("Name is null or empty");
}
}
private static void handleException(String msg) throws TaskManagementException {
log.error(msg);
throw new TaskManagementException(msg);
}
private static void handleException(String msg, Exception e) throws TaskManagementException {
log.error(msg, e);
throw new TaskManagementException(msg, e);
}
private synchronized TaskManager getTaskManager() {
return (TaskManager) getConfigContext().getProperty(
TaskManager.CARBON_TASK_MANAGER);
}
}