/*
(c) Copyright 2011 Telefonica, I+D. Printed in Spain (Europe). All Righ
Reserved.
The copyright to the software program(s) is property of Telefonica I+D.
The program(s) may be used and or copied only with the express written
consent of Telefonica I+D or in accordance with the terms and conditions
stipulated in the agreement/contract under which the program(s) have
been supplied.
*/
package com.telefonica.claudia.smi.task;
import java.io.IOException;
import java.io.Serializable;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.telefonica.claudia.smi.DataTypesUtils;
import com.telefonica.claudia.smi.TCloudConstants;
import com.telefonica.claudia.smi.URICreation;
public abstract class Task implements Runnable, Serializable {
public enum TaskStatus {QUEUED, WAITING, RUNNING, SUCCESS, ERROR, CANCELLED};
protected transient Thread executor;
public static class TaskError implements Serializable {
public String majorCode;
public String minorCode;
public String message;
public String vendorSpecificErrorCode;
}
protected String returnMsg;
private long id;
protected TaskStatus status;
protected long startTime;
protected long endTime;
private long expireTime;
protected TaskError error;
private String uri;
private String uriParent;
private String uriResource;
private String typeResource;
private String ownerUri;
public Task() {
this.setStatus(TaskStatus.QUEUED);
this.setStartTime(System.currentTimeMillis());
this.executor = new Thread(this);
}
public void setUriParent(String uriParent) {
this.setUri(uriParent + "/" + this.id);
this.uriParent= uriParent;
}
public void setResource(String uriResource, String typeResource) {
this.setUriResource(uriResource);
this.setTypeResource(typeResource);
}
public String getOwnerUri() {
return ownerUri;
}
public void setOwnerUri(String ownerUri) {
this.ownerUri = ownerUri;
}
public void run() {
execute();
}
public void start() {
executor.start();
}
public abstract void execute();
public void setTaskId(long id) {
this.id= id;
}
public long getTaskId() {
return id;
}
public TaskStatus getStatus() {
return status;
}
public Document getXmlDescription() throws IOException {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
Document doc;
try {
docBuilder = dbfac.newDocumentBuilder();
doc = docBuilder.newDocument();
Element root = doc.createElement(TCloudConstants.TAG_TASK);
root.setAttribute("href", getUri());
root.setAttribute("startTime", DataTypesUtils.date2String(getStartTime()));
root.setAttribute("endTime", DataTypesUtils.date2String(getEndTime()));
if (getExpireTime() > 0) {
root.setAttribute("expiryTime", DataTypesUtils.date2String(getExpireTime()));
}
root.setAttribute("status", getStatus().toString().toLowerCase());
doc.appendChild(root);
if (getStatus() == TaskStatus.ERROR) {
Element errorNode = doc.createElement("error");
if (getError()!= null) {
errorNode.setAttribute("message", getError().message);
errorNode.setAttribute("majorErrorCode", getError().majorCode);
errorNode.setAttribute("minorErrorCode", getError().minorCode);
errorNode.setAttribute("vendorSpecificErrorCode", getError().vendorSpecificErrorCode);
} else {
errorNode.setAttribute("message", "Unknown error");
}
root.appendChild(errorNode);
}
if (getStatus() == TaskStatus.SUCCESS && getUriResource()!=null) {
Element resultNode = doc.createElement("result");
resultNode.setAttribute("href", getUriResource());
resultNode.setAttribute("type", getTypeResource());
root.appendChild(resultNode);
}
if (ownerUri!= null) {
Element ownerUriNode = doc.createElement("owner");
ownerUriNode.setAttribute("href", ownerUri);
ownerUriNode.setAttribute("type", URICreation.VDC_MIME_TYPE);
root.appendChild(ownerUriNode);
}
} catch (ParserConfigurationException e) {
throw new IOException("Error writing the XML response: " + e.getMessage());
}
return doc;
}
public String getStringDescription() throws IllegalArgumentException, IOException {
return DataTypesUtils.serializeXML(getXmlDescription());
}
public String getReturnMsg() {
return returnMsg;
}
public TaskError getError() {
return error;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
public long getEndTime() {
return endTime;
}
public void setExpireTime(long expireTime) {
this.expireTime = expireTime;
}
public long getExpireTime() {
return expireTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getStartTime() {
return startTime;
}
protected void setStatus(TaskStatus status) {
this.status = status;
}
public void setError(TaskError error) {
this.error = error;
}
public void setReturnMsg(String returnMsg) {
this.returnMsg = returnMsg;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getUri() {
return uri;
}
public String getUriParent() {
return uriParent;
}
public void setUriResource(String uriResource) {
this.uriResource = uriResource;
}
public String getUriResource() {
return uriResource;
}
public void setTypeResource(String typeResource) {
this.typeResource = typeResource;
}
public String getTypeResource() {
return typeResource;
}
}