package ControllerWorker; import java.util.LinkedHashMap; import java.util.Vector; import org.gearman.client.GearmanClient; import org.gearman.client.GearmanJob; import org.gearman.client.GearmanJobImpl; import org.json.simple.JSONObject; import org.json.simple.JSONValue; public class Client { private int id; private String ip; private String mac; private ClientState state; private String type; private String eventName; private Vector times; private Vector jobs; private String error; private Boolean finished; private int statusUpdateCount; private int scsavPID; public Client(JSONObject clientJsonObj, String type, String eventName) { this.statusUpdateCount = 0; this.type = type; this.eventName = eventName; id = Integer.parseInt(clientJsonObj.get("id").toString()); ip = clientJsonObj.get("ip").toString(); mac = clientJsonObj.get("mac").toString(); finished = false; error = ""; state = ClientState.CLIENT_UNKNOWN; times = new Vector(); jobs = new Vector(); } public int getScsavPID() { return scsavPID; } public void setScsavPID(int scsavPID) { this.scsavPID = scsavPID; } public GearmanJob getJob(int jobType) { for (ClientJob job : jobs) { if (job.getJobType() == jobType) { return job.getGearmanJob(); } } return null; } public void addJob(int jobType, GearmanJob gearmanJob) { jobs.add(new ClientJob(jobType, gearmanJob)); } public void removeJob(GearmanJob gearmanJob) { for (ClientJob job : jobs) { if (job.getGearmanJob().equals(gearmanJob)) { jobs.remove(job); break; } } } public long getPingTime(int timeType) { for (ClientPingTime time : times) { if (time.getType() == timeType) { return time.getTime(); } } return 0; } public void addPingTime(int timeType, long time) { times.add(new ClientPingTime(timeType, time)); } public int getId() { return id; } public String getStateText() { return state.toString(); } public String getError() { return error; } public String getIp() { return ip; } public String getMac() { return mac; } public ClientState getState() { return state; } public void setState(ClientState state_, GearmanClient gearmanClient) { state = state_; publishStateChange(gearmanClient); } public void setState(ClientState state_) { state = state_; } public void setError(String error) { this.error = error; } public Boolean isFinished() { return finished; } public void finish() { this.finished = true; } @Override public String toString() { return "Client [error=" + error + ", finished=" + finished + ", id=" + id + ", ip=" + ip + ", jobs=" + jobs + ", mac=" + mac + ", state=" + state + ", times=" + times + "]"; } private void publishStateChange(GearmanClient gearmanClient) { statusUpdateCount++; LinkedHashMap jsonData = new LinkedHashMap(); if (type.equals("boot")) { jsonData.put("type", "updateClientStateBoot"); } else if (type.equals("shutdown")) { jsonData.put("type", "updateClientStateShutdown"); } else { return; } jsonData.put("eventName", eventName); jsonData.put("clientID", id); jsonData.put("error", error); jsonData.put("newState", state.name()); String dataString = JSONValue.toJSONString(jsonData); GearmanJob job = GearmanJobImpl.createBackgroundJob("status", dataString .getBytes(), "status" + eventName + id + statusUpdateCount); gearmanClient.submit(job); } }