| package autotest.afe; |
| |
| import autotest.common.StaticDataRepository; |
| import autotest.common.Utils; |
| import autotest.common.table.RpcDataSource; |
| import autotest.common.ui.NotifyManager; |
| |
| import com.google.gwt.json.client.JSONArray; |
| import com.google.gwt.json.client.JSONObject; |
| import com.google.gwt.json.client.JSONString; |
| import com.google.gwt.json.client.JSONValue; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Custom RpcDataSource to process the list of host queue entries for a job and |
| * consolidate metahosts of the same label. |
| */ |
| class JobStatusDataSource extends RpcDataSource { |
| private JSONObject dictionary; |
| |
| public JobStatusDataSource() { |
| super("get_host_queue_entries", "get_num_host_queue_entries"); |
| |
| // retrieve the dictionary from static data |
| StaticDataRepository staticData = StaticDataRepository.getRepository(); |
| dictionary = staticData.getData("status_dictionary").isObject(); |
| } |
| |
| private String translateStatus(String status) { |
| if (dictionary.containsKey(status)) { |
| return dictionary.get(status).isString().stringValue(); |
| } |
| else { |
| NotifyManager.getInstance().showError("Unknown status", "Can not find status " + |
| status); |
| return status; |
| } |
| } |
| |
| @Override |
| protected List<JSONObject> handleJsonResult(JSONValue result) { |
| List<JSONObject> queueEntries = super.handleJsonResult(result); |
| List<JSONObject> rows = new ArrayList<JSONObject>(); |
| Map<List<String>, JSONObject> metaHostEntries= new HashMap<List<String>, JSONObject>(); |
| for(JSONObject queueEntry : queueEntries) { |
| // translate status |
| String status = queueEntry.get("status").isString().stringValue(); |
| String translation = translateStatus(status); |
| queueEntry.put("status", new JSONString(translation)); |
| |
| boolean hasHost = (queueEntry.get("host").isNull() == null); |
| boolean hasMetaHost = (queueEntry.get("meta_host").isNull() == null); |
| |
| if (!hasHost && !hasMetaHost) { |
| queueEntry.put("hostname", new JSONString("(hostless)")); |
| rows.add(queueEntry); |
| |
| } else if (!hasHost && hasMetaHost) { |
| // metahost |
| incrementMetaHostCount(metaHostEntries, queueEntry); |
| } else { |
| // non-metahost |
| processHostData(queueEntry); |
| rows.add(queueEntry); |
| } |
| } |
| |
| addMetaHostRows(metaHostEntries, rows); |
| |
| return rows; |
| } |
| |
| protected void processHostData(JSONObject queueEntry) { |
| JSONObject host = queueEntry.get("host").isObject(); |
| queueEntry.put("hostname", host.get("hostname")); |
| // don't show host details if the job is complete - it'll only confuse |
| // the user |
| boolean complete = queueEntry.get("complete").isBoolean().booleanValue(); |
| if (!complete) { |
| queueEntry.put("host_status", host.get("status")); |
| queueEntry.put("host_locked", AfeUtils.getLockedText(host)); |
| } |
| } |
| |
| private void incrementMetaHostCount(Map<List<String>, JSONObject> metaHostEntries, |
| JSONObject queueEntry) { |
| String label = queueEntry.get("meta_host").isString().stringValue(); |
| String status = queueEntry.get("status").isString().stringValue(); |
| if (status.equals("Queued")) { |
| status = "Unassigned"; |
| } |
| List<String> key = getMetaHostKey(label, status); |
| |
| if (!metaHostEntries.containsKey(key)) { |
| queueEntry.put("id_list", new JSONArray()); |
| metaHostEntries.put(key, queueEntry); |
| } |
| |
| JSONObject metaHostEntry = metaHostEntries.get(key).isObject(); |
| JSONArray idList = metaHostEntry.get("id_list").isArray(); |
| idList.set(idList.size(), queueEntry.get("id")); |
| } |
| |
| private List<String> getMetaHostKey(String label, String status) { |
| // arrays don't hash correctly, so use a list instead |
| return Arrays.asList(new String[] {label, status}); |
| } |
| |
| private void addMetaHostRows(Map<List<String>, JSONObject> metaHostEntries, |
| List<JSONObject> rows) { |
| for (JSONObject entry : metaHostEntries.values()) { |
| String label = Utils.jsonToString(entry.get("meta_host")); |
| String status = Utils.jsonToString(entry.get("status")); |
| int count = entry.get("id_list").isArray().size(); |
| |
| entry.put("hostname", new JSONString(label + " (label)")); |
| entry.put("status", new JSONString(Integer.toString(count) + " " + status)); |
| rows.add(entry); |
| } |
| } |
| } |