Home | History | Annotate | Download | only in afe
      1 package autotest.afe;
      2 
      3 import autotest.common.SimpleCallback;
      4 import autotest.common.CustomHistory.HistoryToken;
      5 import autotest.common.table.Filter;
      6 import autotest.common.table.RadioButtonSetFilter;
      7 import autotest.common.table.SearchFilter;
      8 import autotest.common.table.SelectionManager;
      9 import autotest.common.table.TableDecorator;
     10 import autotest.common.table.DynamicTable.DynamicTableListener;
     11 import autotest.common.ui.ContextMenu;
     12 import autotest.common.ui.NotifyManager;
     13 import autotest.common.ui.TabView;
     14 import autotest.common.ui.TableActionsPanel.TableActionsListener;
     15 import autotest.common.ui.ToolTip;
     16 
     17 import com.google.gwt.json.client.JSONArray;
     18 import com.google.gwt.json.client.JSONBoolean;
     19 import com.google.gwt.json.client.JSONObject;
     20 import com.google.gwt.user.client.Command;
     21 import com.google.gwt.user.client.ui.HorizontalPanel;
     22 import com.google.gwt.user.client.ui.HTMLPanel;
     23 
     24 import java.util.Map;
     25 import java.util.Set;
     26 
     27 
     28 public class JobListView extends TabView implements TableActionsListener {
     29     protected static final String SELECTED_LINK_STYLE = "selected-link";
     30     protected static final int JOBS_PER_PAGE = 30;
     31     protected static final int STATUS_QUEUED = 0, STATUS_RUNNING = 1,
     32                                STATUS_FINISHED = 2, STATUS_ALL = 3,
     33                                STATUS_RADIO_BUTTON_COUNT = 4;
     34     protected static final int STATUS_DEFAULT_BUTTON = STATUS_ALL;
     35     protected static final int TYPE_SUITE = 0, TYPE_SUB = 1, TYPE_STANDALONE = 2,
     36                                TYPE_ALL = 3, TYPE_RADIO_BUTTON_COUNT = 4;
     37     protected static final int TYPE_DEFAULT_BUTTON = TYPE_ALL;
     38     private static final String[] statusHistoryTokens = {"queued", "running",
     39                                                          "finished", "all"};
     40     private static final String[] statusRadioButtonLabels = {"Queued Jobs", "Running Jobs",
     41                                                              "Finished Jobs", "All Jobs"};
     42     private static final String[] statusFilterStrings = {"not_yet_run", "running",
     43                                                          "finished"};
     44     private static final String[] typeHistoryTokens = {"suite", "sub", "standalone",
     45                                                        "all"};
     46     private static final String[] typeRadioButtonLabels = {"Parent Jobs", "Child Jobs",
     47                                                             "Standalone Jobs",
     48                                                             "All Jobs"};
     49     private static final String[] typeFilterStrings = {"suite", "sub", "standalone"};
     50 
     51     private JobSelectListener selectListener;
     52 
     53     private JobTable jobTable;
     54     private TableDecorator tableDecorator;
     55     private JobStateFilter jobStateFilter;
     56     private JobTypeFilter jobTypeFilter;
     57     private Filter ownerFilter;
     58     private SearchFilter nameFilter;
     59     private SelectionManager selectionManager;
     60 
     61     interface JobSelectListener {
     62         public void onJobSelected(int jobId);
     63     }
     64 
     65     static class JobStateFilter extends RadioButtonSetFilter {
     66         public JobStateFilter() {
     67             super("job-status");
     68         }
     69 
     70         @Override
     71         public void addParams(JSONObject params) {
     72             params.put(statusFilterStrings[getSelectedButtonIndex()],
     73                        JSONBoolean.getInstance(true));
     74         }
     75 
     76         @Override
     77         public boolean isActive() {
     78             return getSelectedButtonIndex() < STATUS_ALL;
     79         }
     80     }
     81 
     82     static class JobTypeFilter extends RadioButtonSetFilter {
     83         public JobTypeFilter() {
     84             super("job-type");
     85         }
     86 
     87         @Override
     88         public void addParams(JSONObject params) {
     89             params.put(typeFilterStrings[getSelectedButtonIndex()],
     90                        JSONBoolean.getInstance(true));
     91         }
     92 
     93         @Override
     94         public boolean isActive() {
     95             return getSelectedButtonIndex() < TYPE_ALL;
     96         }
     97     }
     98 
     99     public void abortSelectedJobs() {
    100         Set<JSONObject> selectedSet = selectionManager.getSelectedObjects();
    101         if (selectedSet.isEmpty()) {
    102             NotifyManager.getInstance().showError("No jobs selected");
    103             return;
    104         }
    105 
    106         JSONArray ids = new JSONArray();
    107         for(JSONObject jsonObj : selectedSet) {
    108             ids.set(ids.size(), jsonObj.get("id"));
    109         }
    110 
    111         JSONObject params = new JSONObject();
    112         params.put("job__id__in", ids);
    113         AfeUtils.callAbort(params, new SimpleCallback() {
    114             public void doCallback(Object source) {
    115                refresh();
    116             }
    117         });
    118     }
    119 
    120     @Override
    121     public String getElementId() {
    122         return "job_list";
    123     }
    124 
    125     @Override
    126     public void refresh() {
    127         super.refresh();
    128         jobTable.refresh();
    129     }
    130 
    131     public JobListView(JobSelectListener listener) {
    132         selectListener = listener;
    133     }
    134 
    135     @Override
    136     public void initialize() {
    137         super.initialize();
    138         jobTable = new JobTable();
    139         jobTable.setRowsPerPage(JOBS_PER_PAGE);
    140         jobTable.setClickable(true);
    141         jobTable.addListener(new DynamicTableListener() {
    142             public void onRowClicked(int rowIndex, JSONObject row, boolean isRightClick) {
    143                 int jobId = (int) row.get("id").isNumber().doubleValue();
    144                 selectListener.onJobSelected(jobId);
    145             }
    146 
    147             public void onTableRefreshed() {}
    148         });
    149 
    150         tableDecorator = new TableDecorator(jobTable);
    151         tableDecorator.addPaginators();
    152         selectionManager = tableDecorator.addSelectionManager(false);
    153         jobTable.setWidgetFactory(selectionManager);
    154         tableDecorator.addTableActionsPanel(this, true);
    155         addWidget(tableDecorator, "job_table");
    156 
    157         ownerFilter = new JobOwnerFilter("owner");
    158         jobTable.addFilter(ownerFilter);
    159         addWidget(ownerFilter.getWidget(), "user_list");
    160 
    161         nameFilter = new SearchFilter("name", "Filter", false);
    162         jobTable.addFilter(nameFilter);
    163         addWidget(nameFilter.getWidget(), "jl_name_search");
    164 
    165         jobStateFilter = new JobStateFilter();
    166         for (int i = 0; i < STATUS_RADIO_BUTTON_COUNT; i++)
    167             jobStateFilter.addRadioButon(statusRadioButtonLabels[i]);
    168         // All Jobs is selected by default
    169         jobStateFilter.setSelectedButton(STATUS_DEFAULT_BUTTON);
    170         jobStateFilter.addCallback(new SimpleCallback() {
    171             public void doCallback(Object source) {
    172                 updateHistory();
    173             }
    174         });
    175         jobTable.addFilter(jobStateFilter);
    176         addWidget(jobStateFilter.getWidget(), "job_status_controls");
    177 
    178         jobTypeFilter = new JobTypeFilter();
    179         for (int i = 0; i < TYPE_RADIO_BUTTON_COUNT; i++)
    180             jobTypeFilter.addRadioButon(typeRadioButtonLabels[i]);
    181         // All Jobs is selected by default
    182         jobTypeFilter.setSelectedButton(TYPE_DEFAULT_BUTTON);
    183         jobTypeFilter.addCallback(new SimpleCallback() {
    184             public void doCallback(Object source) {
    185                 updateHistory();
    186             }
    187         });
    188         jobTable.addFilter(jobTypeFilter);
    189         addWidget(new ToolTip("?", "Suite jobs: jobs with child jobs. " +
    190                                    "Sub jobs: jobs with a parent jobs. " +
    191                                    "Standalone jobs: jobs without a parent or child job."),
    192                   "job_type_tooltip");
    193         addWidget(jobTypeFilter.getWidget(), "job_type_controls");
    194     }
    195 
    196     @Override
    197     public HistoryToken getHistoryArguments() {
    198         HistoryToken arguments = super.getHistoryArguments();
    199         arguments.put("state_filter",
    200                       statusHistoryTokens[jobStateFilter.getSelectedButtonIndex()]);
    201         arguments.put("type_filter",
    202                       typeHistoryTokens[jobTypeFilter.getSelectedButtonIndex()]);
    203         return arguments;
    204     }
    205 
    206     @Override
    207     public void handleHistoryArguments(Map<String, String> arguments) {
    208         String stateFilter = arguments.get("state_filter");
    209         if (stateFilter == null) {
    210             jobStateFilter.setSelectedButton(STATUS_DEFAULT_BUTTON);
    211         } else {
    212             for (int i = 0; i < STATUS_RADIO_BUTTON_COUNT; i++) {
    213                 if (stateFilter.equals(statusHistoryTokens[i])) {
    214                     jobStateFilter.setSelectedButton(i);
    215                     break;
    216                 }
    217             }
    218         }
    219 
    220         String typeFilter = arguments.get("type_filter");
    221         if (typeFilter == null) {
    222             jobTypeFilter.setSelectedButton(TYPE_DEFAULT_BUTTON);
    223         } else {
    224             for (int i = 0; i < TYPE_RADIO_BUTTON_COUNT; i++) {
    225                 if (typeFilter.equals(typeHistoryTokens[i])) {
    226                     jobTypeFilter.setSelectedButton(i);
    227                     break;
    228                 }
    229             }
    230         }
    231     }
    232 
    233     public ContextMenu getActionMenu() {
    234         ContextMenu menu = new ContextMenu();
    235         menu.addItem("Abort jobs", new Command() {
    236             public void execute() {
    237                 abortSelectedJobs();
    238             }
    239         });
    240         if (selectionManager.isEmpty())
    241             menu.setEnabled(false);
    242         return menu;
    243     }
    244 }
    245