/* (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.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import com.telefonica.claudia.smi.DataTypesUtils; import com.telefonica.claudia.smi.TCloudConstants; import com.telefonica.claudia.smi.URICreation; public class ClaudiaTaskManager extends TaskManager{ private static Logger log = Logger.getLogger("com.telefonica.claudia.smi.task.ClaudiaTaskManager"); Map<Long, Task> deployedTasks = new HashMap<Long, Task>(); Map<String, ArrayList<Long>> userTasks = new HashMap<String, ArrayList<Long>> (); String uri; private Long actualTaskId =1l; private Long sequence =1l; private synchronized long generateNewId() { long timeStamp = System.currentTimeMillis(); if (sequence>1000){ sequence = 1L; } return ((timeStamp*1000)+sequence); } public ClaudiaTaskManager(Properties prop) { String serverHost = prop.getProperty(KEY_HOST); log.info("serverHost read: " + serverHost); int serverPort = 0; try { serverPort = Integer.parseInt(prop.getProperty(KEY_PORT)); log.info("serverPort read: " + serverPort); } catch (NumberFormatException nfe) { log.error("Error parsing the " + KEY_PORT + " property. A number was expected, but '" + prop.getProperty(KEY_PORT) + "' was found."); System.exit(ERROR_CODE_INITIALIZATION); } if ( prop.getProperty(KEY_ORGANIZATION) ==null){ log.error("Error parsing. The " + KEY_ORGANIZATION + " property was not found."); System.exit(ERROR_CODE_INITIALIZATION); } uri = PROTOCOL + serverHost + ":" + serverPort + URICreation.URI_ORG.replace("{org-id}", prop.getProperty(KEY_ORGANIZATION)).replace(".", "_") + "/task"; //CacheFactory factory = new DefaultCacheFactory(); //pcache = factory.createCache(JCACHE_CONFIG_FILE, true); //pcache.start(); } public TaskManager createManager(TaskManager taskManager) { TaskManager.instance = taskManager; return TaskManager.instance; } public Task addTask(Task t, String fqnUser) { t.setTaskId(generateNewId()); synchronized(deployedTasks) { deployedTasks.put(t.getTaskId(), t); } synchronized(userTasks) { if (!userTasks.containsKey(fqnUser)) userTasks.put(fqnUser, new ArrayList<Long>()); userTasks.get(fqnUser).add(t.getTaskId()); } t.setUriParent(uri); //Fqn newTask = Fqn.fromString("/pojo/" + t.getTaskId()); //@SuppressWarnings("unused") //Object content = pcache.put(newTask, "taskDescriptor", t); t.start(); return t; } public void removeTask(long id) { synchronized(deployedTasks) { deployedTasks.remove(id); } synchronized(userTasks) { String[] users = userTasks.keySet().toArray(new String[userTasks.keySet().size()]); for (String user: users) { userTasks.get(user).remove(id); } } } public Task getTask(long id) { Task returnValue; synchronized(deployedTasks) { returnValue = deployedTasks.get(id); } return returnValue; } public String taskList(String fqnUser) throws IOException { DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder; Document doc; try { docBuilder = dbfac.newDocumentBuilder(); doc = docBuilder.newDocument(); Element root = doc.createElement(TCloudConstants.TAG_TASKS); root.setAttribute("href", uri); doc.appendChild(root); boolean contained=false; Long[] currentTasks; synchronized(userTasks) { contained = userTasks.containsKey(fqnUser); } if (contained) { synchronized(userTasks) { currentTasks = userTasks.get(fqnUser).toArray(new Long[userTasks.get(fqnUser).size()]); } for (Long taskId: currentTasks) { Task currentTask = deployedTasks.get(taskId); Node description; synchronized (currentTask) { description = currentTask.getXmlDescription().getFirstChild(); } root.appendChild(doc.importNode(description, true)); } } } catch (ParserConfigurationException e) { throw new IOException("Error writing the XML response: " + e.getMessage()); } return DataTypesUtils.serializeXML(doc); } public static final String PROTOCOL = "http://"; private static final String KEY_HOST = "com.telefonica.claudia.server.host"; private static final String KEY_PORT = "com.telefonica.claudia.server.port"; private static final String KEY_ORGANIZATION = "com.telefonica.claudia.organization"; private static final int ERROR_CODE_INITIALIZATION = 1; }