Home | History | Annotate | Download | only in afe
      1 package autotest.afe;
      2 
      3 import autotest.afe.create.CreateJobViewPresenter.JobCreateListener;
      4 import autotest.common.JSONArrayList;
      5 import autotest.common.JsonRpcCallback;
      6 import autotest.common.JsonRpcProxy;
      7 import autotest.common.SimpleCallback;
      8 import autotest.common.StaticDataRepository;
      9 import autotest.common.Utils;
     10 import autotest.common.table.JSONObjectSet;
     11 import autotest.common.ui.NotifyManager;
     12 import autotest.common.ui.SimplifiedList;
     13 
     14 import com.google.gwt.json.client.JSONArray;
     15 import com.google.gwt.json.client.JSONBoolean;
     16 import com.google.gwt.json.client.JSONObject;
     17 import com.google.gwt.json.client.JSONString;
     18 import com.google.gwt.json.client.JSONValue;
     19 import com.google.gwt.user.client.DOM;
     20 import com.google.gwt.user.client.Element;
     21 import com.google.gwt.user.client.ui.ListBox;
     22 
     23 import java.util.ArrayList;
     24 import java.util.Collection;
     25 import java.util.Iterator;
     26 import java.util.List;
     27 import java.util.Set;
     28 
     29 /**
     30  * Utility methods.
     31  */
     32 public class AfeUtils {
     33     public static final String PLATFORM_SUFFIX = " (platform)";
     34 
     35     public static final ClassFactory factory = new SiteClassFactory();
     36 
     37     private static StaticDataRepository staticData = StaticDataRepository.getRepository();
     38 
     39     public static String formatStatusCounts(JSONObject counts, String joinWith) {
     40         StringBuilder result = new StringBuilder();
     41         Set<String> statusSet = counts.keySet();
     42         for (Iterator<String> i = statusSet.iterator(); i.hasNext();) {
     43             String status = i.next();
     44             int count = (int) counts.get(status).isNumber().doubleValue();
     45             result.append(Integer.toString(count));
     46             result.append(" ");
     47             result.append(status);
     48             if (i.hasNext()) {
     49                 result.append(joinWith);
     50             }
     51         }
     52         return result.toString();
     53     }
     54 
     55     public static String[] getLabelStrings() {
     56         return getFilteredLabelStrings(false, false);
     57     }
     58 
     59     protected static String[] getFilteredLabelStrings(boolean onlyPlatforms,
     60                                                       boolean onlyNonPlatforms) {
     61         assert !(onlyPlatforms && onlyNonPlatforms);
     62         JSONArray labels = staticData.getData("labels").isArray();
     63         List<String> result = new ArrayList<String>();
     64         for (int i = 0; i < labels.size(); i++) {
     65             JSONObject label = labels.get(i).isObject();
     66             String name = label.get("name").isString().stringValue();
     67             boolean labelIsPlatform = label.get("platform").isBoolean().booleanValue();
     68             if (onlyPlatforms && labelIsPlatform ||
     69                 onlyNonPlatforms && !labelIsPlatform) {
     70                     result.add(name);
     71             } else if (!onlyPlatforms && !onlyNonPlatforms) {
     72                 if (labelIsPlatform) {
     73                     name += PLATFORM_SUFFIX;
     74                 }
     75                 result.add(name);
     76             }
     77         }
     78         return result.toArray(new String[result.size()]);
     79     }
     80 
     81     public static String[] getPlatformStrings() {
     82         return getFilteredLabelStrings(true, false);
     83     }
     84 
     85     public static String[] getNonPlatformLabelStrings() {
     86         return getFilteredLabelStrings(false, true);
     87     }
     88 
     89     public static String decodeLabelName(String labelName) {
     90         String name = labelName;
     91         if (name.endsWith(PLATFORM_SUFFIX)) {
     92             int nameLength = name.length() - PLATFORM_SUFFIX.length();
     93             name = name.substring(0, nameLength);
     94         }
     95         return name;
     96     }
     97 
     98     public static JSONString getLockedText(JSONObject host) {
     99         boolean locked = host.get("locked").isBoolean().booleanValue();
    100         return new JSONString(locked ? "Yes" : "No");
    101     }
    102 
    103     public static void abortHostQueueEntries(Collection<JSONObject> entries,
    104                                              final SimpleCallback onSuccess) {
    105         if (entries.isEmpty()) {
    106             NotifyManager.getInstance().showError("No entries selected to abort");
    107             return;
    108         }
    109 
    110         final JSONArray asynchronousEntryIds = new JSONArray();
    111         Set<JSONObject> synchronousEntries = new JSONObjectSet<JSONObject>();
    112         for (JSONObject entry : entries) {
    113             JSONObject job = entry.get("job").isObject();
    114             int synchCount = (int) job.get("synch_count").isNumber().doubleValue();
    115             boolean hasExecutionSubdir =
    116                 entry.containsKey("execution_subdir") &&
    117                 !Utils.jsonToString(entry.get("execution_subdir")).equals("");
    118             if (synchCount > 1 && hasExecutionSubdir) {
    119                 synchronousEntries.add(entry);
    120                 continue;
    121             }
    122 
    123             JSONValue idListValue = entry.get("id_list");
    124             if (idListValue != null) {
    125                 // metahost row
    126                 extendJsonArray(asynchronousEntryIds, idListValue.isArray());
    127             } else {
    128                 JSONValue id = entry.get("id");
    129                 if (entry.containsKey("oid"))
    130                     id = entry.get("oid");
    131                 asynchronousEntryIds.set(asynchronousEntryIds.size(), id);
    132             }
    133         }
    134 
    135         SimpleCallback abortAsynchronousEntries = new SimpleCallback() {
    136             public void doCallback(Object source) {
    137                 JSONObject params = new JSONObject();
    138                 params.put("id__in", asynchronousEntryIds);
    139                 AfeUtils.callAbort(params, onSuccess);
    140             }
    141         };
    142 
    143         if (synchronousEntries.size() == 0) {
    144             abortAsynchronousEntries.doCallback(null);
    145         } else {
    146             AbortSynchronousDialog dialog = new AbortSynchronousDialog(
    147                 abortAsynchronousEntries, synchronousEntries, asynchronousEntryIds.size() != 0);
    148             dialog.center();
    149         }
    150     }
    151 
    152     public static void abortSpecialTasks(final JSONArray specialTaskIds,
    153                                          final SimpleCallback onSuccess) {
    154         if (specialTaskIds.size() == 0) {
    155             NotifyManager.getInstance().showError("No entries selected to abort");
    156             return;
    157         }
    158 
    159         SimpleCallback abortSpecialTasks = new SimpleCallback() {
    160             public void doCallback(Object source) {
    161                 JSONObject params = new JSONObject();
    162                 params.put("id__in", specialTaskIds);
    163                 AfeUtils.callAbortSpecialTasks(params, onSuccess);
    164             }
    165         };
    166 
    167         abortSpecialTasks.doCallback(null);
    168     }
    169 
    170     private static void extendJsonArray(JSONArray array, JSONArray newValues) {
    171         for (JSONValue value : new JSONArrayList<JSONValue>(newValues)) {
    172             array.set(array.size(), value);
    173         }
    174     }
    175 
    176     public static void callAbort(JSONObject params, final SimpleCallback onSuccess,
    177                                  final boolean showMessage) {
    178         JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
    179         rpcProxy.rpcCall("abort_host_queue_entries", params, new JsonRpcCallback() {
    180             @Override
    181             public void onSuccess(JSONValue result) {
    182                 if (showMessage) {
    183                     NotifyManager.getInstance().showMessage("Jobs aborted");
    184                 }
    185                 if (onSuccess != null) {
    186                     onSuccess.doCallback(null);
    187                 }
    188             }
    189         });
    190     }
    191 
    192     public static void callAbort(JSONObject params, final SimpleCallback onSuccess) {
    193         callAbort(params, onSuccess, true);
    194     }
    195 
    196     public static void callAbortSpecialTasks(JSONObject params, final SimpleCallback onSuccess,
    197                                  final boolean showMessage) {
    198         JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
    199         rpcProxy.rpcCall("abort_special_tasks", params, new JsonRpcCallback() {
    200             @Override
    201             public void onSuccess(JSONValue result) {
    202                 if (showMessage) {
    203                     NotifyManager.getInstance().showMessage("Special tasks aborted");
    204                 }
    205                 if (onSuccess != null) {
    206                     onSuccess.doCallback(null);
    207                 }
    208             }
    209         });
    210     }
    211 
    212     public static void callAbortSpecialTasks(JSONObject params, final SimpleCallback onSuccess) {
    213         callAbortSpecialTasks(params, onSuccess, true);
    214     }
    215 
    216     public static void callReverify(JSONObject params, final SimpleCallback onSuccess,
    217                                     final String messagePrefix) {
    218         JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
    219         rpcProxy.rpcCall("reverify_hosts", params, new JsonRpcCallback() {
    220             @Override
    221             public void onSuccess(JSONValue result) {
    222 
    223                 NotifyManager.getInstance().showMessage(
    224                         messagePrefix + " scheduled for reverification");
    225 
    226                 if (onSuccess != null) {
    227                     onSuccess.doCallback(null);
    228                 }
    229             }
    230         });
    231     }
    232 
    233     public static void callRepair(JSONObject params, final SimpleCallback onSuccess,
    234                                   final String messagePrefix) {
    235         JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
    236         rpcProxy.rpcCall("repair_hosts", params, new JsonRpcCallback() {
    237             @Override
    238             public void onSuccess(JSONValue result) {
    239 
    240                 NotifyManager.getInstance().showMessage(
    241                         messagePrefix + " scheduled for repair");
    242 
    243                 if (onSuccess != null) {
    244                     onSuccess.doCallback(null);
    245                 }
    246             }
    247         });
    248     }
    249 
    250     public static void callModifyHosts(JSONObject params, final SimpleCallback onSuccess) {
    251         JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
    252         rpcProxy.rpcCall("modify_hosts", params, new JsonRpcCallback() {
    253             @Override
    254             public void onSuccess(JSONValue result) {
    255                 if (onSuccess != null) {
    256                     onSuccess.doCallback(null);
    257                 }
    258             }
    259         });
    260     }
    261 
    262     public static void changeHostLocks(JSONArray hostIds, final boolean lock,
    263                                        String lockReason, final String messagePrefix,
    264                                        final SimpleCallback callback) {
    265         JSONObject hostFilterData = new JSONObject();
    266         JSONObject updateData = new JSONObject();
    267         JSONObject params = new JSONObject();
    268 
    269         hostFilterData.put("id__in", hostIds);
    270         updateData.put("locked", JSONBoolean.getInstance(lock));
    271         updateData.put("lock_reason", new JSONString(""));
    272 
    273         if (lockReason != null && !lockReason.trim().isEmpty()) {
    274             updateData.put("lock_reason", new JSONString(lockReason.trim()));
    275         }
    276 
    277         params.put("host_filter_data", hostFilterData);
    278         params.put("update_data", updateData);
    279 
    280         callModifyHosts(params, new SimpleCallback() {
    281             public void doCallback(Object source) {
    282                 String message = messagePrefix + " ";
    283                 if (!lock) {
    284                     message += "un";
    285                 }
    286                 message += "locked";
    287 
    288                 NotifyManager.getInstance().showMessage(message);
    289 
    290                 callback.doCallback(source);
    291             }
    292         });
    293     }
    294 
    295     public static String getJobTag(JSONObject job) {
    296         return Utils.jsonToString(job.get("id")) + "-" + Utils.jsonToString(job.get("owner"));
    297     }
    298 
    299     public static void populateRadioChooser(RadioChooser chooser, String name) {
    300         JSONArray options = staticData.getData(name + "_options").isArray();
    301         for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
    302             chooser.addChoice(Utils.jsonToString(jsonOption));
    303         }
    304     }
    305 
    306     public static void populateListBox(ListBox box, String staticDataKey) {
    307         JSONArray options = staticData.getData(staticDataKey).isArray();
    308         for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
    309             box.addItem(Utils.jsonToString(jsonOption));
    310         }
    311     }
    312 
    313     public static void populateListBox(SimplifiedList box, String staticDataKey) {
    314         JSONArray options = staticData.getData(staticDataKey).isArray();
    315         for (JSONString jsonOption : new JSONArrayList<JSONString>(options)) {
    316             String option = Utils.jsonToString(jsonOption);
    317             box.addItem(option, option);
    318         }
    319     }
    320 
    321     public static void setSelectedItem(ListBox box, String item) {
    322         box.setSelectedIndex(0);
    323         for (int i = 0; i < box.getItemCount(); i++) {
    324             if (box.getItemText(i).equals(item)) {
    325                 box.setSelectedIndex(i);
    326                 break;
    327             }
    328         }
    329     }
    330 
    331     public static void removeElement(String id) {
    332         Element element = DOM.getElementById(id);
    333         element.getParentElement().removeChild(element);
    334     }
    335 
    336     public static int parsePositiveIntegerInput(String input, String fieldName) {
    337         final int parsedInt;
    338         try {
    339             if (input.equals("") ||
    340                 (parsedInt = Integer.parseInt(input)) <= 0) {
    341                     String error = "Please enter a positive " + fieldName;
    342                     NotifyManager.getInstance().showError(error);
    343                     throw new IllegalArgumentException();
    344             }
    345         } catch (NumberFormatException e) {
    346             String error = "Invalid " + fieldName + ": \"" + input + "\"";
    347             NotifyManager.getInstance().showError(error);
    348             throw new IllegalArgumentException();
    349         }
    350         return parsedInt;
    351     }
    352 
    353     public static void removeSecondsFromDateField(JSONObject row,
    354                                                   String sourceFieldName,
    355                                                   String targetFieldName) {
    356         JSONValue dateValue = row.get(sourceFieldName);
    357         String date = "";
    358         if (dateValue.isNull() == null) {
    359             date = dateValue.isString().stringValue();
    360             date = date.substring(0, date.length() - 3);
    361         }
    362         row.put(targetFieldName, new JSONString(date));
    363     }
    364 
    365     public static void callGetJobHistory(JSONObject params,
    366                                          final SimpleCallback onSuccess,
    367                                          final boolean showMessage) {
    368         JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
    369         rpcProxy.rpcCall("get_job_history", params, new JsonRpcCallback() {
    370             @Override
    371             public void onSuccess(JSONValue result) {
    372                 if (showMessage) {
    373                     NotifyManager.getInstance().showMessage("Get job history succeeded.");
    374                 }
    375                 if (onSuccess != null) {
    376                     onSuccess.doCallback(result);
    377                 }
    378             }
    379         });
    380     }
    381 
    382     public static void callGetSpongeUrl(JSONObject params,
    383                                         final SimpleCallback onSuccess) {
    384         JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(JsonRpcProxy.TKO_BASE_URL);
    385         rpcProxy.rpcCall("get_detailed_test_views", params, new JsonRpcCallback() {
    386             @Override
    387             public void onSuccess(JSONValue result) {
    388                 if (onSuccess != null) {
    389                     JSONArray testViews = (JSONArray)result;
    390                     JSONValue keyVals = ((JSONObject)testViews.get(0)).get("job_keyvals");
    391                     String spongeUrl = ((JSONObject)keyVals).get("sponge_url").isString().stringValue();
    392                     onSuccess.doCallback(spongeUrl);
    393                 }
    394             }
    395         });
    396     }
    397 }
    398