package ControllerWorker; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Vector; import org.gearman.client.GearmanJobResult; import org.gearman.client.GearmanJobResultImpl; import org.gearman.util.ByteUtils; import org.gearman.worker.AbstractGearmanFunction; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; //import org.apache.log4j.Logger; public class StatusWorker extends AbstractGearmanFunction { // private static final Logger logger = ControllerWorkerMain.getLogger(); static HashMap BOOTTHREADS = new HashMap(); static HashMap SHUTDOWNTHREADS = new HashMap(); @Override public String getName() { return "status"; } @Override public GearmanJobResult executeFunction() { String data = ByteUtils.fromUTF8Bytes((byte[]) this.data); Vector events = new Vector(); JSONObject jsonObject = (JSONObject) JSONValue.parse(data); String type = jsonObject.get("type").toString(); JSONArray jsonArray = (JSONArray) jsonObject.get("events"); for (Object eventObj : jsonArray) { String event = eventObj.toString(); events.add(event); } LinkedHashMap> res = new LinkedHashMap>(); LinkedHashMap content = new LinkedHashMap(); if (type.equals("boot")) { for (String event : events) { Boot boot = BOOTTHREADS.get(event); if (BOOTTHREADS.containsKey(event)) { Vector clients = boot.getClients(); if (boot.isFinished()) { content.put("result shortcut", "successful"); content.put("result text", "Booting of " + event + " has been finished!"); res.put(event, content); BOOTTHREADS.remove(event); boot = null; } else if (boot.isFinishedWithErrors()) { content.put("result shortcut", "failed"); content.put("result text", "Booting of " + event + " has not been finished, due to errors!"); LinkedHashMap clientErrors = new LinkedHashMap(); for (Client client : clients) { if (!client.getError().isEmpty()) { clientErrors.put(Integer.toString(client .getId()), client.getError()); } } content.put("clients errors", clientErrors); res.put(event, content); BOOTTHREADS.remove(event); boot = null; } else { content.put("result shortcut", "not finished"); content.put("result text", "Booting of " + event + " has not yet been finished!"); LinkedHashMap clientStatus = new LinkedHashMap(); for (Client client : clients) { clientStatus.put(Integer.toString(client.getId()), client.getStateText()); } content.put("clients states", clientStatus); res.put(event, content); } } else { content.put("result shortcut", "not founded"); content .put("result text", "The Boot process for the event has not been found."); res.put(event, content); } } } else if (type.equals("shutdown")) { for (String event : events) { if (SHUTDOWNTHREADS.containsKey(event)) { Shutdown shutdown = SHUTDOWNTHREADS.get(event); Vector clients = shutdown.getClients(); if (shutdown.isFinished()) { content.put("result shortcut", "succeeded"); content.put("result text", "Shutdown of " + event + " has been finished!"); res.put(event, content); SHUTDOWNTHREADS.remove(event); shutdown = null; } else if (shutdown.isFinishedWithErrors()) { content.put("result shortcut", "failed"); content.put("result text", "Shutdown of " + event + " has not been finished, due to errors!"); LinkedHashMap clientErrors = new LinkedHashMap(); for (Client client : clients) { if (!client.getError().isEmpty()) { clientErrors.put(Integer.toString(client .getId()), client.getError()); } } content.put("clients errors", clientErrors); res.put(event, content); SHUTDOWNTHREADS.remove(event); shutdown = null; } else { content.put("result shortcut", "not finished"); content.put("result text", "Shutdown of " + event + " has not yet been finished!"); LinkedHashMap clientStatus = new LinkedHashMap(); for (Client client : clients) { clientStatus.put(Integer.toString(client.getId()), client.getStateText()); } content.put("clients states", clientStatus); res.put(event, content); } } else { content.put("result shortcut", "not founded"); content .put("result text", "The Shutdown process for the event has not been found."); res.put(event, content); } } } String jsonResult = JSONValue.toJSONString(res); byte[] warnings = new byte[0]; byte[] exceptions = new byte[0]; int numerator = 0; int denominator = 0; GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true, jsonResult.getBytes(), warnings, exceptions, numerator, denominator); return gjr; } }