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; public class StatusWorker extends AbstractGearmanFunction { 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", "Booting of " + event + " has been finished!"); res.put(event, content); BOOTTHREADS.remove(event); boot = null; } else if (boot.isFinishedWithErrors()) { content.put("result", "Booting of " + event + " has not been finished, due to errors!"); LinkedHashMap clientErrors = new LinkedHashMap(); for (HashMap client : clients) { String clientID = client.get("id"); String errorText = boot.getError(client); clientErrors.put(clientID, errorText); } content.put("errors", clientErrors); res.put(event, content); BOOTTHREADS.remove(event); boot = null; } else { content.put("result", "Booting of " + event + " has not yet been finished!"); LinkedHashMap clientStatus = new LinkedHashMap(); for (HashMap client : clients) { String clientID = client.get("id"); String statusText = boot.getStatusText(client); clientStatus.put(clientID, statusText); } content.put("status", clientStatus); res.put(event, content); } } else { content .put("result", "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", "Shutdown of " + event + " has been finished!"); res.put(event, content); SHUTDOWNTHREADS.remove(event); shutdown = null; } else if (shutdown.isFinishedWithErrors()) { content.put("result", "Shutdown of " + event + " has not been finished, due to errors!"); LinkedHashMap clientErrors = new LinkedHashMap(); for (HashMap client : clients) { String clientID = client.get("id"); String errorText = shutdown.getError(client); clientErrors.put(clientID, errorText); } content.put("errors", clientErrors); res.put(event, content); SHUTDOWNTHREADS.remove(event); shutdown = null; } else { content.put("result", "Shutdown of " + event + " has not yet been finished!"); LinkedHashMap clientStatus = new LinkedHashMap(); for (HashMap client : clients) { String clientID = client.get("id"); String statusText = shutdown.getStatusText(client); clientStatus.put(clientID, statusText); } content.put("status", clientStatus); res.put(event, content); } } else { content .put("result", "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; } }