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 handleJsonResult(JSONValue result) { List queueEntries = super.handleJsonResult(result); List rows = new ArrayList(); Map, JSONObject> metaHostEntries= new HashMap, 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, 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 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 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, JSONObject> metaHostEntries, List 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); } } }