1a2216e7e327b464ac03932b4add2983e9052bc79showardpackage autotest.afe;
2a2216e7e327b464ac03932b4add2983e9052bc79showard
36f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.afe.create.CreateJobViewPresenter.JobCreateListener;
49dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.JSONArrayList;
59dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.JsonRpcCallback;
69dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.JsonRpcProxy;
79dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.SimpleCallback;
8acdbe3535529a24555d874a8038993c62fd690c2showardimport autotest.common.StaticDataRepository;
99dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.Utils;
109dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.table.JSONObjectSet;
119dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.ui.NotifyManager;
126f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.ui.SimplifiedList;
13acdbe3535529a24555d874a8038993c62fd690c2showard
14a2216e7e327b464ac03932b4add2983e9052bc79showardimport com.google.gwt.json.client.JSONArray;
15e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showardimport com.google.gwt.json.client.JSONBoolean;
16a2216e7e327b464ac03932b4add2983e9052bc79showardimport com.google.gwt.json.client.JSONObject;
17a2216e7e327b464ac03932b4add2983e9052bc79showardimport com.google.gwt.json.client.JSONString;
189dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport com.google.gwt.json.client.JSONValue;
1976fcf19ec42d5c7580d2e7891e4610e5fe725286jamesrenimport com.google.gwt.user.client.DOM;
2076fcf19ec42d5c7580d2e7891e4610e5fe725286jamesrenimport com.google.gwt.user.client.Element;
2176fcf19ec42d5c7580d2e7891e4610e5fe725286jamesrenimport com.google.gwt.user.client.ui.ListBox;
22a2216e7e327b464ac03932b4add2983e9052bc79showard
23c9d462b1b48a8cd109308453dd5eb610dd7108cbshowardimport java.util.ArrayList;
249dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport java.util.Collection;
25a2216e7e327b464ac03932b4add2983e9052bc79showardimport java.util.Iterator;
26c9d462b1b48a8cd109308453dd5eb610dd7108cbshowardimport java.util.List;
27a2216e7e327b464ac03932b4add2983e9052bc79showardimport java.util.Set;
28a2216e7e327b464ac03932b4add2983e9052bc79showard
29a2216e7e327b464ac03932b4add2983e9052bc79showard/**
30a2216e7e327b464ac03932b4add2983e9052bc79showard * Utility methods.
31a2216e7e327b464ac03932b4add2983e9052bc79showard */
32a2216e7e327b464ac03932b4add2983e9052bc79showardpublic class AfeUtils {
33a2216e7e327b464ac03932b4add2983e9052bc79showard    public static final String PLATFORM_SUFFIX = " (platform)";
34589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
35a2216e7e327b464ac03932b4add2983e9052bc79showard    public static final ClassFactory factory = new SiteClassFactory();
360fc3830f17d644bab74bfe38556299f5e58bc0fashoward
370fc3830f17d644bab74bfe38556299f5e58bc0fashoward    private static StaticDataRepository staticData = StaticDataRepository.getRepository();
38589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
39a2216e7e327b464ac03932b4add2983e9052bc79showard    public static String formatStatusCounts(JSONObject counts, String joinWith) {
40589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren        StringBuilder result = new StringBuilder();
416bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward        Set<String> statusSet = counts.keySet();
426bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward        for (Iterator<String> i = statusSet.iterator(); i.hasNext();) {
436bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward            String status = i.next();
446bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward            int count = (int) counts.get(status).isNumber().doubleValue();
45589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren            result.append(Integer.toString(count));
46589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren            result.append(" ");
47589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren            result.append(status);
48589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren            if (i.hasNext()) {
49589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren                result.append(joinWith);
50589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren            }
51a2216e7e327b464ac03932b4add2983e9052bc79showard        }
52589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren        return result.toString();
53a2216e7e327b464ac03932b4add2983e9052bc79showard    }
54589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
55a2216e7e327b464ac03932b4add2983e9052bc79showard    public static String[] getLabelStrings() {
56c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward        return getFilteredLabelStrings(false, false);
57c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward    }
58589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
59c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward    protected static String[] getFilteredLabelStrings(boolean onlyPlatforms,
60c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward                                                      boolean onlyNonPlatforms) {
616f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        assert !(onlyPlatforms && onlyNonPlatforms);
62a2216e7e327b464ac03932b4add2983e9052bc79showard        JSONArray labels = staticData.getData("labels").isArray();
63c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward        List<String> result = new ArrayList<String>();
64a2216e7e327b464ac03932b4add2983e9052bc79showard        for (int i = 0; i < labels.size(); i++) {
65a2216e7e327b464ac03932b4add2983e9052bc79showard            JSONObject label = labels.get(i).isObject();
66a2216e7e327b464ac03932b4add2983e9052bc79showard            String name = label.get("name").isString().stringValue();
6721baa459ea14f96e06212f1f35fcddab9442b3fcshoward            boolean labelIsPlatform = label.get("platform").isBoolean().booleanValue();
686f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            if (onlyPlatforms && labelIsPlatform ||
696f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li                onlyNonPlatforms && !labelIsPlatform) {
70c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward                    result.add(name);
71c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward            } else if (!onlyPlatforms && !onlyNonPlatforms) {
72c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward                if (labelIsPlatform) {
73c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward                    name += PLATFORM_SUFFIX;
74c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward                }
75c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward                result.add(name);
76a2216e7e327b464ac03932b4add2983e9052bc79showard            }
77a2216e7e327b464ac03932b4add2983e9052bc79showard        }
786bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward        return result.toArray(new String[result.size()]);
79c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward    }
800228f1407cce41f6567b7200a4fed7be6f4b5511showard
81c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward    public static String[] getPlatformStrings() {
820228f1407cce41f6567b7200a4fed7be6f4b5511showard        return getFilteredLabelStrings(true, false);
83c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward    }
84589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
85c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward    public static String[] getNonPlatformLabelStrings() {
86c9d462b1b48a8cd109308453dd5eb610dd7108cbshoward        return getFilteredLabelStrings(false, true);
87a2216e7e327b464ac03932b4add2983e9052bc79showard    }
880228f1407cce41f6567b7200a4fed7be6f4b5511showard
89a2216e7e327b464ac03932b4add2983e9052bc79showard    public static String decodeLabelName(String labelName) {
900228f1407cce41f6567b7200a4fed7be6f4b5511showard        String name = labelName;
910228f1407cce41f6567b7200a4fed7be6f4b5511showard        if (name.endsWith(PLATFORM_SUFFIX)) {
920228f1407cce41f6567b7200a4fed7be6f4b5511showard            int nameLength = name.length() - PLATFORM_SUFFIX.length();
930228f1407cce41f6567b7200a4fed7be6f4b5511showard            name = name.substring(0, nameLength);
940228f1407cce41f6567b7200a4fed7be6f4b5511showard        }
950228f1407cce41f6567b7200a4fed7be6f4b5511showard        return name;
96a2216e7e327b464ac03932b4add2983e9052bc79showard    }
970228f1407cce41f6567b7200a4fed7be6f4b5511showard
98a2216e7e327b464ac03932b4add2983e9052bc79showard    public static JSONString getLockedText(JSONObject host) {
9921baa459ea14f96e06212f1f35fcddab9442b3fcshoward        boolean locked = host.get("locked").isBoolean().booleanValue();
100a2216e7e327b464ac03932b4add2983e9052bc79showard        return new JSONString(locked ? "Yes" : "No");
101a2216e7e327b464ac03932b4add2983e9052bc79showard    }
102589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
103589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren    public static void abortHostQueueEntries(Collection<JSONObject> entries,
1049dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                                             final SimpleCallback onSuccess) {
1059dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        if (entries.isEmpty()) {
1069dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            NotifyManager.getInstance().showError("No entries selected to abort");
1079dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            return;
1089dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        }
109589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
1109dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        final JSONArray asynchronousEntryIds = new JSONArray();
1112bab8f45adedeacbf2d62d37b90255581adc3c7dshoward        Set<JSONObject> synchronousEntries = new JSONObjectSet<JSONObject>();
1129dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        for (JSONObject entry : entries) {
1139dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            JSONObject job = entry.get("job").isObject();
1142bab8f45adedeacbf2d62d37b90255581adc3c7dshoward            int synchCount = (int) job.get("synch_count").isNumber().doubleValue();
115589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren            boolean hasExecutionSubdir =
116cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                entry.containsKey("execution_subdir") &&
1172bab8f45adedeacbf2d62d37b90255581adc3c7dshoward                !Utils.jsonToString(entry.get("execution_subdir")).equals("");
1182bab8f45adedeacbf2d62d37b90255581adc3c7dshoward            if (synchCount > 1 && hasExecutionSubdir) {
1192bab8f45adedeacbf2d62d37b90255581adc3c7dshoward                synchronousEntries.add(entry);
1209dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                continue;
1219dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            }
1229dbdcda5104991cbf344ea5cba1aa58e1af444f3showard
1239dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            JSONValue idListValue = entry.get("id_list");
1249dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            if (idListValue != null) {
1259dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                // metahost row
1269dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                extendJsonArray(asynchronousEntryIds, idListValue.isArray());
1279dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            } else {
128cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                JSONValue id = entry.get("id");
129cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                if (entry.containsKey("oid"))
130cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                    id = entry.get("oid");
131cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                asynchronousEntryIds.set(asynchronousEntryIds.size(), id);
1329dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            }
1339dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        }
134589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
1359dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        SimpleCallback abortAsynchronousEntries = new SimpleCallback() {
1369dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            public void doCallback(Object source) {
1379dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                JSONObject params = new JSONObject();
1389dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                params.put("id__in", asynchronousEntryIds);
1399dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                AfeUtils.callAbort(params, onSuccess);
1409dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            }
1419dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        };
142589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
1432bab8f45adedeacbf2d62d37b90255581adc3c7dshoward        if (synchronousEntries.size() == 0) {
1449dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            abortAsynchronousEntries.doCallback(null);
1459dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        } else {
1469dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            AbortSynchronousDialog dialog = new AbortSynchronousDialog(
1472bab8f45adedeacbf2d62d37b90255581adc3c7dshoward                abortAsynchronousEntries, synchronousEntries, asynchronousEntryIds.size() != 0);
1489dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            dialog.center();
1499dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        }
1509dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    }
1519dbdcda5104991cbf344ea5cba1aa58e1af444f3showard
152cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo    public static void abortSpecialTasks(final JSONArray specialTaskIds,
153cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                                         final SimpleCallback onSuccess) {
154cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        if (specialTaskIds.size() == 0) {
155cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            NotifyManager.getInstance().showError("No entries selected to abort");
156cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            return;
157cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        }
158cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo
159cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        SimpleCallback abortSpecialTasks = new SimpleCallback() {
160cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            public void doCallback(Object source) {
161cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                JSONObject params = new JSONObject();
162cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                params.put("id__in", specialTaskIds);
163cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                AfeUtils.callAbortSpecialTasks(params, onSuccess);
164cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            }
165cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        };
166cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo
167cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        abortSpecialTasks.doCallback(null);
168cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo    }
169cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo
1709dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    private static void extendJsonArray(JSONArray array, JSONArray newValues) {
1719dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        for (JSONValue value : new JSONArrayList<JSONValue>(newValues)) {
1729dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            array.set(array.size(), value);
1739dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        }
1749dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    }
175589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
1762bab8f45adedeacbf2d62d37b90255581adc3c7dshoward    public static void callAbort(JSONObject params, final SimpleCallback onSuccess,
1772bab8f45adedeacbf2d62d37b90255581adc3c7dshoward                                 final boolean showMessage) {
1789dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
1799dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        rpcProxy.rpcCall("abort_host_queue_entries", params, new JsonRpcCallback() {
1809dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            @Override
1819dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            public void onSuccess(JSONValue result) {
1822bab8f45adedeacbf2d62d37b90255581adc3c7dshoward                if (showMessage) {
1832bab8f45adedeacbf2d62d37b90255581adc3c7dshoward                    NotifyManager.getInstance().showMessage("Jobs aborted");
1842bab8f45adedeacbf2d62d37b90255581adc3c7dshoward                }
1859dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                if (onSuccess != null) {
1869dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                    onSuccess.doCallback(null);
1879dbdcda5104991cbf344ea5cba1aa58e1af444f3showard                }
1889dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            }
1899dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        });
1909dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    }
191589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
1922bab8f45adedeacbf2d62d37b90255581adc3c7dshoward    public static void callAbort(JSONObject params, final SimpleCallback onSuccess) {
1932bab8f45adedeacbf2d62d37b90255581adc3c7dshoward        callAbort(params, onSuccess, true);
1942bab8f45adedeacbf2d62d37b90255581adc3c7dshoward    }
195589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
196cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo    public static void callAbortSpecialTasks(JSONObject params, final SimpleCallback onSuccess,
197cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                                 final boolean showMessage) {
198cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
199cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        rpcProxy.rpcCall("abort_special_tasks", params, new JsonRpcCallback() {
200cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            @Override
201cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            public void onSuccess(JSONValue result) {
202cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                if (showMessage) {
203cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                    NotifyManager.getInstance().showMessage("Special tasks aborted");
204cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                }
205cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                if (onSuccess != null) {
206cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                    onSuccess.doCallback(null);
207cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                }
208cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            }
209cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        });
210cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo    }
211cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo
212cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo    public static void callAbortSpecialTasks(JSONObject params, final SimpleCallback onSuccess) {
213cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        callAbortSpecialTasks(params, onSuccess, true);
214cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo    }
215cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo
216d9642c07837d093b13bc5c32132874f8ecce5d5dshoward    public static void callReverify(JSONObject params, final SimpleCallback onSuccess,
217d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                                    final String messagePrefix) {
2181ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard        JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
2191ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard        rpcProxy.rpcCall("reverify_hosts", params, new JsonRpcCallback() {
2201ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard            @Override
2211ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard            public void onSuccess(JSONValue result) {
222589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
2231ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard                NotifyManager.getInstance().showMessage(
224d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                        messagePrefix + " scheduled for reverification");
225589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
2261ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard                if (onSuccess != null) {
2271ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard                    onSuccess.doCallback(null);
2281ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard                }
2291ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard            }
2301ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard        });
2311ff7b2e88ae7a382f85ab76e786a471134e8a6a0showard    }
232589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
23373dae55766b9c8b6922194901e334c4e52f67d14Simran Basi    public static void callRepair(JSONObject params, final SimpleCallback onSuccess,
23473dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                                  final String messagePrefix) {
23573dae55766b9c8b6922194901e334c4e52f67d14Simran Basi        JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
23673dae55766b9c8b6922194901e334c4e52f67d14Simran Basi        rpcProxy.rpcCall("repair_hosts", params, new JsonRpcCallback() {
23773dae55766b9c8b6922194901e334c4e52f67d14Simran Basi            @Override
23873dae55766b9c8b6922194901e334c4e52f67d14Simran Basi            public void onSuccess(JSONValue result) {
23973dae55766b9c8b6922194901e334c4e52f67d14Simran Basi
24073dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                NotifyManager.getInstance().showMessage(
24173dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                        messagePrefix + " scheduled for repair");
24273dae55766b9c8b6922194901e334c4e52f67d14Simran Basi
24373dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                if (onSuccess != null) {
24473dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                    onSuccess.doCallback(null);
24573dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                }
24673dae55766b9c8b6922194901e334c4e52f67d14Simran Basi            }
24773dae55766b9c8b6922194901e334c4e52f67d14Simran Basi        });
24873dae55766b9c8b6922194901e334c4e52f67d14Simran Basi    }
24973dae55766b9c8b6922194901e334c4e52f67d14Simran Basi
250276f9443bbfc12c781d86f51dab5d8988e2090f5showard    public static void callModifyHosts(JSONObject params, final SimpleCallback onSuccess) {
251276f9443bbfc12c781d86f51dab5d8988e2090f5showard        JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
252276f9443bbfc12c781d86f51dab5d8988e2090f5showard        rpcProxy.rpcCall("modify_hosts", params, new JsonRpcCallback() {
253276f9443bbfc12c781d86f51dab5d8988e2090f5showard            @Override
254276f9443bbfc12c781d86f51dab5d8988e2090f5showard            public void onSuccess(JSONValue result) {
255276f9443bbfc12c781d86f51dab5d8988e2090f5showard                if (onSuccess != null) {
256276f9443bbfc12c781d86f51dab5d8988e2090f5showard                    onSuccess.doCallback(null);
257276f9443bbfc12c781d86f51dab5d8988e2090f5showard                }
258276f9443bbfc12c781d86f51dab5d8988e2090f5showard            }
259276f9443bbfc12c781d86f51dab5d8988e2090f5showard        });
260276f9443bbfc12c781d86f51dab5d8988e2090f5showard    }
261589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
262e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    public static void changeHostLocks(JSONArray hostIds, final boolean lock,
2636818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori                                       String lockReason, final String messagePrefix,
2646818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori                                       final SimpleCallback callback) {
265e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        JSONObject hostFilterData = new JSONObject();
266e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        JSONObject updateData = new JSONObject();
267e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        JSONObject params = new JSONObject();
268589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
269e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        hostFilterData.put("id__in", hostIds);
270e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        updateData.put("locked", JSONBoolean.getInstance(lock));
2716818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        updateData.put("lock_reason", new JSONString(""));
2726818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori
2736818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        if (lockReason != null && !lockReason.trim().isEmpty()) {
2746818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            updateData.put("lock_reason", new JSONString(lockReason.trim()));
2756818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        }
276589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
277e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        params.put("host_filter_data", hostFilterData);
278e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        params.put("update_data", updateData);
279589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
280e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        callModifyHosts(params, new SimpleCallback() {
281e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard            public void doCallback(Object source) {
282e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                String message = messagePrefix + " ";
283e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                if (!lock) {
284e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                    message += "un";
285e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                }
286e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                message += "locked";
287589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
288e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                NotifyManager.getInstance().showMessage(message);
289589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
290e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                callback.doCallback(source);
291e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard            }
292e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        });
293e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    }
2940fc3830f17d644bab74bfe38556299f5e58bc0fashoward
2959dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    public static String getJobTag(JSONObject job) {
2969dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        return Utils.jsonToString(job.get("id")) + "-" + Utils.jsonToString(job.get("owner"));
2979dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    }
2980fc3830f17d644bab74bfe38556299f5e58bc0fashoward
2990fc3830f17d644bab74bfe38556299f5e58bc0fashoward    public static void populateRadioChooser(RadioChooser chooser, String name) {
3000fc3830f17d644bab74bfe38556299f5e58bc0fashoward        JSONArray options = staticData.getData(name + "_options").isArray();
3010fc3830f17d644bab74bfe38556299f5e58bc0fashoward        for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
3020fc3830f17d644bab74bfe38556299f5e58bc0fashoward            chooser.addChoice(Utils.jsonToString(jsonOption));
3030fc3830f17d644bab74bfe38556299f5e58bc0fashoward        }
3040fc3830f17d644bab74bfe38556299f5e58bc0fashoward    }
305589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
3066f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public static void populateListBox(ListBox box, String staticDataKey) {
30776fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        JSONArray options = staticData.getData(staticDataKey).isArray();
30876fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
30976fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren            box.addItem(Utils.jsonToString(jsonOption));
31076fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        }
31176fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren    }
312589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
3136f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    public static void populateListBox(SimplifiedList box, String staticDataKey) {
3146f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        JSONArray options = staticData.getData(staticDataKey).isArray();
3156f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
3166f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            String option = Utils.jsonToString(jsonOption);
3176f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            box.addItem(option, option);
3186f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        }
3196f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li    }
3206f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
32176fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren    public static void setSelectedItem(ListBox box, String item) {
32276fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        box.setSelectedIndex(0);
32376fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        for (int i = 0; i < box.getItemCount(); i++) {
32476fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren            if (box.getItemText(i).equals(item)) {
32576fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren                box.setSelectedIndex(i);
32676fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren                break;
32776fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren            }
32876fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        }
32976fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren    }
330589cc78019a41fa293d7583a3c1b6dfca42da41bjamesren
33176fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren    public static void removeElement(String id) {
33276fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        Element element = DOM.getElementById(id);
33376fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren        element.getParentElement().removeChild(element);
33476fcf19ec42d5c7580d2e7891e4610e5fe725286jamesren    }
33529f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard
33629f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard    public static int parsePositiveIntegerInput(String input, String fieldName) {
33729f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        final int parsedInt;
33829f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        try {
33929f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard            if (input.equals("") ||
34029f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard                (parsedInt = Integer.parseInt(input)) <= 0) {
34129f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard                    String error = "Please enter a positive " + fieldName;
34229f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard                    NotifyManager.getInstance().showError(error);
34329f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard                    throw new IllegalArgumentException();
34429f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard            }
34529f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        } catch (NumberFormatException e) {
34629f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard            String error = "Invalid " + fieldName + ": \"" + input + "\"";
34729f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard            NotifyManager.getInstance().showError(error);
34829f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard            throw new IllegalArgumentException();
34929f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        }
35029f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        return parsedInt;
35129f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard    }
35229f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard
35329f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard    public static void removeSecondsFromDateField(JSONObject row,
35429f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard                                                  String sourceFieldName,
35529f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard                                                  String targetFieldName) {
35629f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        JSONValue dateValue = row.get(sourceFieldName);
35729f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        String date = "";
35829f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        if (dateValue.isNull() == null) {
35929f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard            date = dateValue.isString().stringValue();
36029f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard            date = date.substring(0, date.length() - 3);
36129f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        }
36229f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard        row.put(targetFieldName, new JSONString(date));
36329f7cd27e51add2648fb62ab2a0c588f9acb1ec4showard    }
364193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi
365193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi    public static void callGetJobHistory(JSONObject params,
366193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                                         final SimpleCallback onSuccess,
367193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                                         final boolean showMessage) {
368193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi        JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
369193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi        rpcProxy.rpcCall("get_job_history", params, new JsonRpcCallback() {
370193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi            @Override
371193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi            public void onSuccess(JSONValue result) {
372193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                if (showMessage) {
373193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                    NotifyManager.getInstance().showMessage("Get job history succeeded.");
374193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                }
375193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                if (onSuccess != null) {
376193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                    onSuccess.doCallback(result);
377193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi                }
378193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi            }
379193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi        });
380193905e68043c4386ed1d3f21a74d88de4e9a9b7Dan Shi    }
381c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi
382c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi    public static void callGetSpongeUrl(JSONObject params,
383c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi                                        final SimpleCallback onSuccess) {
384c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi        JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(JsonRpcProxy.TKO_BASE_URL);
385c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi        rpcProxy.rpcCall("get_detailed_test_views", params, new JsonRpcCallback() {
386c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi            @Override
387c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi            public void onSuccess(JSONValue result) {
388c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi                if (onSuccess != null) {
389c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi                    JSONArray testViews = (JSONArray)result;
390c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi                    JSONValue keyVals = ((JSONObject)testViews.get(0)).get("job_keyvals");
391c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi                    String spongeUrl = ((JSONObject)keyVals).get("sponge_url").isString().stringValue();
392c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi                    onSuccess.doCallback(spongeUrl);
393c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi                }
394c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi            }
395c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi        });
396c28d3955905faa1ac8585f35a46a29ce550b9c03Dan Shi    }
397a2216e7e327b464ac03932b4add2983e9052bc79showard}
398