blob: 15565cf466e64cff6345281794829bac426b3e31 [file] [log] [blame]
package autotest.afe;
import autotest.afe.create.CreateJobViewPresenter.JobCreateListener;
import autotest.common.JSONArrayList;
import autotest.common.JsonRpcCallback;
import autotest.common.JsonRpcProxy;
import autotest.common.SimpleCallback;
import autotest.common.StaticDataRepository;
import autotest.common.Utils;
import autotest.common.table.JSONObjectSet;
import autotest.common.ui.NotifyManager;
import autotest.common.ui.SimplifiedList;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.ListBox;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* Utility methods.
*/
public class AfeUtils {
public static final String PLATFORM_SUFFIX = " (platform)";
public static final ClassFactory factory = new SiteClassFactory();
private static StaticDataRepository staticData = StaticDataRepository.getRepository();
public static String formatStatusCounts(JSONObject counts, String joinWith) {
StringBuilder result = new StringBuilder();
Set<String> statusSet = counts.keySet();
for (Iterator<String> i = statusSet.iterator(); i.hasNext();) {
String status = i.next();
int count = (int) counts.get(status).isNumber().doubleValue();
result.append(Integer.toString(count));
result.append(" ");
result.append(status);
if (i.hasNext()) {
result.append(joinWith);
}
}
return result.toString();
}
public static String[] getLabelStrings() {
return getFilteredLabelStrings(false, false);
}
protected static String[] getFilteredLabelStrings(boolean onlyPlatforms,
boolean onlyNonPlatforms) {
assert !(onlyPlatforms && onlyNonPlatforms);
JSONArray labels = staticData.getData("labels").isArray();
List<String> result = new ArrayList<String>();
for (int i = 0; i < labels.size(); i++) {
JSONObject label = labels.get(i).isObject();
String name = label.get("name").isString().stringValue();
boolean labelIsPlatform = label.get("platform").isBoolean().booleanValue();
if (onlyPlatforms && labelIsPlatform ||
onlyNonPlatforms && !labelIsPlatform) {
result.add(name);
} else if (!onlyPlatforms && !onlyNonPlatforms) {
if (labelIsPlatform) {
name += PLATFORM_SUFFIX;
}
result.add(name);
}
}
return result.toArray(new String[result.size()]);
}
public static String[] getPlatformStrings() {
return getFilteredLabelStrings(true, false);
}
public static String[] getNonPlatformLabelStrings() {
return getFilteredLabelStrings(false, true);
}
public static String decodeLabelName(String labelName) {
String name = labelName;
if (name.endsWith(PLATFORM_SUFFIX)) {
int nameLength = name.length() - PLATFORM_SUFFIX.length();
name = name.substring(0, nameLength);
}
return name;
}
public static JSONString getLockedText(JSONObject host) {
boolean locked = host.get("locked").isBoolean().booleanValue();
return new JSONString(locked ? "Yes" : "No");
}
public static void abortHostQueueEntries(Collection<JSONObject> entries,
final SimpleCallback onSuccess) {
if (entries.isEmpty()) {
NotifyManager.getInstance().showError("No entries selected to abort");
return;
}
final JSONArray asynchronousEntryIds = new JSONArray();
Set<JSONObject> synchronousEntries = new JSONObjectSet<JSONObject>();
for (JSONObject entry : entries) {
JSONObject job = entry.get("job").isObject();
int synchCount = (int) job.get("synch_count").isNumber().doubleValue();
boolean hasExecutionSubdir =
entry.containsKey("execution_subdir") &&
!Utils.jsonToString(entry.get("execution_subdir")).equals("");
if (synchCount > 1 && hasExecutionSubdir) {
synchronousEntries.add(entry);
continue;
}
JSONValue idListValue = entry.get("id_list");
if (idListValue != null) {
// metahost row
extendJsonArray(asynchronousEntryIds, idListValue.isArray());
} else {
JSONValue id = entry.get("id");
if (entry.containsKey("oid"))
id = entry.get("oid");
asynchronousEntryIds.set(asynchronousEntryIds.size(), id);
}
}
SimpleCallback abortAsynchronousEntries = new SimpleCallback() {
public void doCallback(Object source) {
JSONObject params = new JSONObject();
params.put("id__in", asynchronousEntryIds);
AfeUtils.callAbort(params, onSuccess);
}
};
if (synchronousEntries.size() == 0) {
abortAsynchronousEntries.doCallback(null);
} else {
AbortSynchronousDialog dialog = new AbortSynchronousDialog(
abortAsynchronousEntries, synchronousEntries, asynchronousEntryIds.size() != 0);
dialog.center();
}
}
public static void abortSpecialTasks(final JSONArray specialTaskIds,
final SimpleCallback onSuccess) {
if (specialTaskIds.size() == 0) {
NotifyManager.getInstance().showError("No entries selected to abort");
return;
}
SimpleCallback abortSpecialTasks = new SimpleCallback() {
public void doCallback(Object source) {
JSONObject params = new JSONObject();
params.put("id__in", specialTaskIds);
AfeUtils.callAbortSpecialTasks(params, onSuccess);
}
};
abortSpecialTasks.doCallback(null);
}
private static void extendJsonArray(JSONArray array, JSONArray newValues) {
for (JSONValue value : new JSONArrayList<JSONValue>(newValues)) {
array.set(array.size(), value);
}
}
public static void callAbort(JSONObject params, final SimpleCallback onSuccess,
final boolean showMessage) {
JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
rpcProxy.rpcCall("abort_host_queue_entries", params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
if (showMessage) {
NotifyManager.getInstance().showMessage("Jobs aborted");
}
if (onSuccess != null) {
onSuccess.doCallback(null);
}
}
});
}
public static void callAbort(JSONObject params, final SimpleCallback onSuccess) {
callAbort(params, onSuccess, true);
}
public static void callAbortSpecialTasks(JSONObject params, final SimpleCallback onSuccess,
final boolean showMessage) {
JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
rpcProxy.rpcCall("abort_special_tasks", params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
if (showMessage) {
NotifyManager.getInstance().showMessage("Special tasks aborted");
}
if (onSuccess != null) {
onSuccess.doCallback(null);
}
}
});
}
public static void callAbortSpecialTasks(JSONObject params, final SimpleCallback onSuccess) {
callAbortSpecialTasks(params, onSuccess, true);
}
public static void callReverify(JSONObject params, final SimpleCallback onSuccess,
final String messagePrefix) {
JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
rpcProxy.rpcCall("reverify_hosts", params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
NotifyManager.getInstance().showMessage(
messagePrefix + " scheduled for reverification");
if (onSuccess != null) {
onSuccess.doCallback(null);
}
}
});
}
public static void callRepair(JSONObject params, final SimpleCallback onSuccess,
final String messagePrefix) {
JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
rpcProxy.rpcCall("repair_hosts", params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
NotifyManager.getInstance().showMessage(
messagePrefix + " scheduled for repair");
if (onSuccess != null) {
onSuccess.doCallback(null);
}
}
});
}
public static void callModifyHosts(JSONObject params, final SimpleCallback onSuccess) {
JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
rpcProxy.rpcCall("modify_hosts", params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
if (onSuccess != null) {
onSuccess.doCallback(null);
}
}
});
}
public static void changeHostLocks(JSONArray hostIds, final boolean lock,
String lockReason, final String messagePrefix,
final SimpleCallback callback) {
JSONObject hostFilterData = new JSONObject();
JSONObject updateData = new JSONObject();
JSONObject params = new JSONObject();
hostFilterData.put("id__in", hostIds);
updateData.put("locked", JSONBoolean.getInstance(lock));
updateData.put("lock_reason", new JSONString(""));
if (lockReason != null && !lockReason.trim().isEmpty()) {
updateData.put("lock_reason", new JSONString(lockReason.trim()));
}
params.put("host_filter_data", hostFilterData);
params.put("update_data", updateData);
callModifyHosts(params, new SimpleCallback() {
public void doCallback(Object source) {
String message = messagePrefix + " ";
if (!lock) {
message += "un";
}
message += "locked";
NotifyManager.getInstance().showMessage(message);
callback.doCallback(source);
}
});
}
public static String getJobTag(JSONObject job) {
return Utils.jsonToString(job.get("id")) + "-" + Utils.jsonToString(job.get("owner"));
}
public static void populateRadioChooser(RadioChooser chooser, String name) {
JSONArray options = staticData.getData(name + "_options").isArray();
for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
chooser.addChoice(Utils.jsonToString(jsonOption));
}
}
public static void populateListBox(ListBox box, String staticDataKey) {
JSONArray options = staticData.getData(staticDataKey).isArray();
for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
box.addItem(Utils.jsonToString(jsonOption));
}
}
public static void populateListBox(SimplifiedList box, String staticDataKey) {
JSONArray options = staticData.getData(staticDataKey).isArray();
for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
String option = Utils.jsonToString(jsonOption);
box.addItem(option, option);
}
}
public static void setSelectedItem(ListBox box, String item) {
box.setSelectedIndex(0);
for (int i = 0; i < box.getItemCount(); i++) {
if (box.getItemText(i).equals(item)) {
box.setSelectedIndex(i);
break;
}
}
}
public static void removeElement(String id) {
Element element = DOM.getElementById(id);
element.getParentElement().removeChild(element);
}
public static int parsePositiveIntegerInput(String input, String fieldName) {
final int parsedInt;
try {
if (input.equals("") ||
(parsedInt = Integer.parseInt(input)) <= 0) {
String error = "Please enter a positive " + fieldName;
NotifyManager.getInstance().showError(error);
throw new IllegalArgumentException();
}
} catch (NumberFormatException e) {
String error = "Invalid " + fieldName + ": \"" + input + "\"";
NotifyManager.getInstance().showError(error);
throw new IllegalArgumentException();
}
return parsedInt;
}
public static void removeSecondsFromDateField(JSONObject row,
String sourceFieldName,
String targetFieldName) {
JSONValue dateValue = row.get(sourceFieldName);
String date = "";
if (dateValue.isNull() == null) {
date = dateValue.isString().stringValue();
date = date.substring(0, date.length() - 3);
}
row.put(targetFieldName, new JSONString(date));
}
public static void callGetJobHistory(JSONObject params,
final SimpleCallback onSuccess,
final boolean showMessage) {
JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
rpcProxy.rpcCall("get_job_history", params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
if (showMessage) {
NotifyManager.getInstance().showMessage("Get job history succeeded.");
}
if (onSuccess != null) {
onSuccess.doCallback(result);
}
}
});
}
public static void callGetSpongeUrl(JSONObject params,
final SimpleCallback onSuccess) {
JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(JsonRpcProxy.TKO_BASE_URL);
rpcProxy.rpcCall("get_detailed_test_views", params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
if (onSuccess != null) {
JSONArray testViews = (JSONArray)result;
JSONValue keyVals = ((JSONObject)testViews.get(0)).get("job_keyvals");
String spongeUrl = ((JSONObject)keyVals).get("sponge_url").isString().stringValue();
onSuccess.doCallback(spongeUrl);
}
}
});
}
}