1e3f6868dac3b4c4714637d12b93d97823011a35cshowardpackage autotest.afe;
21c390f85167cfd1c14f9500bb20b05a9e677c0eashoward
36f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.afe.create.CreateJobViewPresenter.JobCreateListener;
43bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luoimport autotest.common.CustomHistory.HistoryToken;
59dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.SimpleCallback;
6e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.Utils;
7e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.table.DataSource;
86f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.table.DataSource.DataCallback;
96f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.table.DataSource.Query;
106f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.table.DataSource.SortDirection;
119dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.table.DataTable;
1257bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luoimport autotest.common.table.DatetimeSegmentFilter;
13e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.table.DynamicTable;
146f27d4f22a1ba5063968b8c322fa0845f3279adeEric Liimport autotest.common.table.DynamicTable.DynamicTableListener;
15cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luoimport autotest.common.table.JSONObjectSet;
16e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.table.RpcDataSource;
179dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.table.SelectionManager;
18e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.table.SimpleFilter;
19e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.table.TableDecorator;
209dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.ui.ContextMenu;
21e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.ui.DetailView;
22e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.ui.NotifyManager;
239dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport autotest.common.ui.TableActionsPanel.TableActionsListener;
241c390f85167cfd1c14f9500bb20b05a9e677c0eashoward
25a5e4d84c9616b0a987e904d3b1d1d3fd9ca1be86showardimport com.google.gwt.event.dom.client.ClickEvent;
26a5e4d84c9616b0a987e904d3b1d1d3fd9ca1be86showardimport com.google.gwt.event.dom.client.ClickHandler;
2779ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luoimport com.google.gwt.event.dom.client.KeyCodes;
2879ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luoimport com.google.gwt.event.dom.client.KeyPressEvent;
2979ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luoimport com.google.gwt.event.dom.client.KeyPressHandler;
3057bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luoimport com.google.gwt.event.logical.shared.ValueChangeEvent;
3157bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luoimport com.google.gwt.event.logical.shared.ValueChangeHandler;
32b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showardimport com.google.gwt.json.client.JSONArray;
338aa84fcb18489265208f291a7fc3c33799696eaeshowardimport com.google.gwt.json.client.JSONBoolean;
340c1a37dd9b1237fe8d43c7f911ce601104806339MK Ryuimport com.google.gwt.json.client.JSONNumber;
351c390f85167cfd1c14f9500bb20b05a9e677c0eashowardimport com.google.gwt.json.client.JSONObject;
361c390f85167cfd1c14f9500bb20b05a9e677c0eashowardimport com.google.gwt.json.client.JSONString;
37b5611a81e109472e81e983da636d9580c3022b24showardimport com.google.gwt.json.client.JSONValue;
389dbdcda5104991cbf344ea5cba1aa58e1af444f3showardimport com.google.gwt.user.client.Command;
39e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showardimport com.google.gwt.user.client.ui.Button;
40c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showardimport com.google.gwt.user.client.ui.CheckBox;
4179ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luoimport com.google.gwt.user.client.ui.TextBox;
421c390f85167cfd1c14f9500bb20b05a9e677c0eashoward
434879914c122f4ed97eae3b08c5af1930fd75b39dshowardimport java.util.List;
443bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luoimport java.util.Map;
45cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luoimport java.util.Set;
464879914c122f4ed97eae3b08c5af1930fd75b39dshoward
47cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luopublic class HostDetailView extends DetailView implements DataCallback, TableActionsListener {
48affe09b5a82a1ec1a6c8f19571e07bb9f901abe0showard    private static final String[][] HOST_JOBS_COLUMNS = {
496f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li            {DataTable.WIDGET_COLUMN, ""}, {"type", "Type"}, {"job__id", "Job ID"},
50c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            {"job_owner", "Job Owner"}, {"job_name", "Job Name"}, {"started_on", "Time started"},
51c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            {"status", "Status"}
521c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    };
531c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    public static final int JOBS_PER_PAGE = 20;
546f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
55b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard    public interface HostDetailListener {
56b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        public void onJobSelected(int jobId);
57b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard    }
586f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
59b5611a81e109472e81e983da636d9580c3022b24showard    private static class HostQueueEntryDataSource extends RpcDataSource {
60b5611a81e109472e81e983da636d9580c3022b24showard        public HostQueueEntryDataSource() {
61b5611a81e109472e81e983da636d9580c3022b24showard            super("get_host_queue_entries", "get_num_host_queue_entries");
62b5611a81e109472e81e983da636d9580c3022b24showard        }
63b5611a81e109472e81e983da636d9580c3022b24showard
64b5611a81e109472e81e983da636d9580c3022b24showard        @Override
654879914c122f4ed97eae3b08c5af1930fd75b39dshoward        protected List<JSONObject> handleJsonResult(JSONValue result) {
664879914c122f4ed97eae3b08c5af1930fd75b39dshoward            List<JSONObject> resultArray = super.handleJsonResult(result);
674879914c122f4ed97eae3b08c5af1930fd75b39dshoward            for (JSONObject row : resultArray) {
68b5611a81e109472e81e983da636d9580c3022b24showard                // get_host_queue_entries() doesn't return type, so fill it in for consistency with
69b5611a81e109472e81e983da636d9580c3022b24showard                // get_host_queue_entries_and_special_tasks()
70b5611a81e109472e81e983da636d9580c3022b24showard                row.put("type", new JSONString("Job"));
71b5611a81e109472e81e983da636d9580c3022b24showard            }
72b5611a81e109472e81e983da636d9580c3022b24showard            return resultArray;
73b5611a81e109472e81e983da636d9580c3022b24showard        }
74b5611a81e109472e81e983da636d9580c3022b24showard    }
756f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
76b5611a81e109472e81e983da636d9580c3022b24showard    private static class HostJobsTable extends DynamicTable {
77b5611a81e109472e81e983da636d9580c3022b24showard        private static final DataSource normalDataSource = new HostQueueEntryDataSource();
786f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        private static final DataSource dataSourceWithSpecialTasks =
79c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            new RpcDataSource("get_host_queue_entries_and_special_tasks",
80c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                              "get_num_host_queue_entries_and_special_tasks");
81c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard
82c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        private SimpleFilter hostFilter = new SimpleFilter();
8379ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        private String hostId;
8457bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        private String startTime;
8557bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        private String endTime;
86c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard
87c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        public HostJobsTable() {
88c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            super(HOST_JOBS_COLUMNS, normalDataSource);
89c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            addFilter(hostFilter);
90c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        }
916f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
9279ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        public void setHostId(String hostId) {
9379ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo            this.hostId = hostId;
94c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            updateFilter();
95c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        }
96c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard
9757bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        public void setStartTime(String startTime) {
9857bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            this.startTime = startTime;
9957bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            updateFilter();
10057bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        }
10157bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo
10257bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        public void setEndTime(String endTime) {
10357bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            this.endTime = endTime;
10457bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            updateFilter();
10557bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        }
10657bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo
107c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        private void updateFilter() {
108c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            if (getDataSource() == normalDataSource) {
109a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward                sortOnColumn("job__id", SortDirection.DESCENDING);
110c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            } else {
111c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                clearSorts();
112c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            }
113c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard
114c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            hostFilter.clear();
1150c1a37dd9b1237fe8d43c7f911ce601104806339MK Ryu            hostFilter.setParameter("host",
1160c1a37dd9b1237fe8d43c7f911ce601104806339MK Ryu                                    new JSONNumber(Double.parseDouble(hostId)));
11757bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            if (startTime != null && startTime != "")
11857bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                hostFilter.setParameter("start_time", new JSONString(startTime));
11957bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            if (endTime != null && endTime != "")
12057bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                hostFilter.setParameter("end_time", new JSONString(endTime));
121c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        }
1226f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
123c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        public void setSpecialTasksEnabled(boolean enabled) {
124c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            if (enabled) {
125c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                setDataSource(dataSourceWithSpecialTasks);
126c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            } else {
127c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                setDataSource(normalDataSource);
128c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            }
1296f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
130c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            updateFilter();
131b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        }
132b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard
1336bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward        @Override
134b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        protected void preprocessRow(JSONObject row) {
135b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard            JSONObject job = row.get("job").isObject();
136c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            JSONString blank = new JSONString("");
137c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            JSONString jobId = blank, owner = blank, name = blank;
138c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            if (job != null) {
139c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                int id = (int) job.get("id").isNumber().doubleValue();
140c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                jobId = new JSONString(Integer.toString(id));
141c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                owner = job.get("owner").isString();
142c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                name = job.get("name").isString();
143c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            }
144c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard
145a5288b4bb2b09aafe914d0b7d5aab79a7e433eafshoward            row.put("job__id", jobId);
146c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            row.put("job_owner", owner);
147c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            row.put("job_name", name);
148b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        }
149b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard    }
1506f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
151c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    private String hostname = "";
15279ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    private String hostId = "";
153c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    private DataSource hostDataSource = new HostDataSource();
154c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    private HostJobsTable jobsTable = new HostJobsTable();
155c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    private TableDecorator tableDecorator = new TableDecorator(jobsTable);
1561fe34c4612727e711818f1414072149f685e364eshoward    private HostDetailListener hostDetailListener = null;
1571fe34c4612727e711818f1414072149f685e364eshoward    private JobCreateListener jobCreateListener = null;
1589dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    private SelectionManager selectionManager;
1596f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
160e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    private JSONObject currentHostObject;
1616f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
162e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    private Button lockButton = new Button();
163d9642c07837d093b13bc5c32132874f8ecce5d5dshoward    private Button reverifyButton = new Button("Reverify");
16473dae55766b9c8b6922194901e334c4e52f67d14Simran Basi    private Button repairButton = new Button("Repair");
165c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    private CheckBox showSpecialTasks = new CheckBox();
16657bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo    private DatetimeSegmentFilter startedTimeFilter = new DatetimeSegmentFilter();
16779ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    private TextBox hostnameInput = new TextBox();
16879ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    private Button hostnameFetchButton = new Button("Go");
1696818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori    private TextBox lockReasonInput = new TextBox();
170b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard
1711fe34c4612727e711818f1414072149f685e364eshoward    public HostDetailView(HostDetailListener hostDetailListener,
1721fe34c4612727e711818f1414072149f685e364eshoward                          JobCreateListener jobCreateListener) {
1731fe34c4612727e711818f1414072149f685e364eshoward        this.hostDetailListener = hostDetailListener;
1741fe34c4612727e711818f1414072149f685e364eshoward        this.jobCreateListener = jobCreateListener;
175b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard    }
1761c390f85167cfd1c14f9500bb20b05a9e677c0eashoward
1776bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
1781c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    public String getElementId() {
1791c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        return "view_host";
1801c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
1811c390f85167cfd1c14f9500bb20b05a9e677c0eashoward
1826bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
1831c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    protected String getFetchControlsElementId() {
1841c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        return "view_host_fetch_controls";
1851c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
1866f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
18779ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    private String getFetchByHostnameControlsElementId() {
18879ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        return "view_host_fetch_by_hostname_controls";
18979ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    }
19079ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo
1916bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
1921c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    protected String getDataElementId() {
1931c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        return "view_host_data";
1941c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
1956f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
1966bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
1971c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    protected String getTitleElementId() {
1981c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        return "view_host_title";
1991c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
2001c390f85167cfd1c14f9500bb20b05a9e677c0eashoward
2016bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
2021c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    protected String getNoObjectText() {
2031c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        return "No host selected";
2041c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
2056f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
2066bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
2071c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    protected String getObjectId() {
20879ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        return hostId;
2091c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
2106f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
2113bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo    protected String getHostname() {
2123bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo        return hostname;
2133bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo    }
2143bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo
2156bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
2161c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    protected void setObjectId(String id) {
2176f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        if (id.length() == 0) {
2181c390f85167cfd1c14f9500bb20b05a9e677c0eashoward            throw new IllegalArgumentException();
2196f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        }
22079ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        this.hostId = id;
2211c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
2226f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
2236bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
2241c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    protected void fetchData() {
2251c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        JSONObject params = new JSONObject();
22679ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        params.put("id", new JSONString(getObjectId()));
22779ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        fetchDataCommmon(params);
22879ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    }
22979ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo
23079ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    private void fetchDataByHostname(String hostname) {
23179ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        JSONObject params = new JSONObject();
2321c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        params.put("hostname", new JSONString(hostname));
23379ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        fetchDataCommmon(params);
23479ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    }
23579ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo
23679ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    private void fetchDataCommmon(JSONObject params) {
2378aa84fcb18489265208f291a7fc3c33799696eaeshoward        params.put("valid_only", JSONBoolean.getInstance(false));
238b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward        hostDataSource.query(params, this);
2391c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
240b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward
24179ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    private void fetchByHostname(String hostname) {
24279ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        fetchDataByHostname(hostname);
24379ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        updateHistory();
24479ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo    }
24579ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo
246b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward    @Override
247b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward    public void handleTotalResultCount(int totalCount) {}
248b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward
249b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward    @Override
250b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward    public void onQueryReady(Query query) {
251b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward        query.getPage(null, null, null, this);
252b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard    }
253b9c6617bdc063b3b4aa760a0a45190ee069139fdshoward
2544879914c122f4ed97eae3b08c5af1930fd75b39dshoward    public void handlePage(List<JSONObject> data) {
255b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        try {
2564879914c122f4ed97eae3b08c5af1930fd75b39dshoward            currentHostObject = Utils.getSingleObjectFromList(data);
257b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        }
258b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        catch (IllegalArgumentException exc) {
259b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard            NotifyManager.getInstance().showError("No such host found");
260b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard            resetPage();
261b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard            return;
262b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        }
2636f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
26479ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        setObjectId(currentHostObject.get("id").toString());
26579ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo
26642d4d6221bed50117da283d7ad8917b5eaf414e3showard        String lockedText = Utils.jsonToString(currentHostObject.get(HostDataSource.LOCKED_TEXT));
26742d4d6221bed50117da283d7ad8917b5eaf414e3showard        if (currentHostObject.get("locked").isBoolean().booleanValue()) {
26842d4d6221bed50117da283d7ad8917b5eaf414e3showard            String lockedBy = Utils.jsonToString(currentHostObject.get("locked_by"));
26942d4d6221bed50117da283d7ad8917b5eaf414e3showard            String lockedTime = Utils.jsonToString(currentHostObject.get("lock_time"));
2706818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            String lockReasonText = Utils.jsonToString(currentHostObject.get("lock_reason"));
27142d4d6221bed50117da283d7ad8917b5eaf414e3showard            lockedText += ", by " + lockedBy + " on " + lockedTime;
2726818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            lockedText += ", reason: " + lockReasonText;
27342d4d6221bed50117da283d7ad8917b5eaf414e3showard        }
2746f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
275e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        showField(currentHostObject, "status", "view_host_status");
276e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        showField(currentHostObject, "platform", "view_host_platform");
277e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        showField(currentHostObject, HostDataSource.HOST_ACLS, "view_host_acls");
278e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        showField(currentHostObject, HostDataSource.OTHER_LABELS, "view_host_labels");
27942d4d6221bed50117da283d7ad8917b5eaf414e3showard        showText(lockedText, "view_host_locked");
28005e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        String shard_url = Utils.jsonToString(currentHostObject.get("shard")).trim();
28105e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        String host_id = Utils.jsonToString(currentHostObject.get("id")).trim();
28205e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        if (shard_url.equals("<null>")){
28305e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian            shard_url = "";
28405e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        } else {
28505e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian            shard_url = "http://" + shard_url;
28605e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        }
28705e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        shard_url = shard_url + "/afe/#tab_id=view_host&object_id=" + host_id;
28805e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        showField(currentHostObject, "shard", "view_host_shard");
28905e94c488c55bf764f27e9c112d1dda6f03d2d7dPrashanth Balasubramanian        getElementById("view_host_shard").setAttribute("href", shard_url);
29037df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi
29137df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi        String job_id = Utils.jsonToString(currentHostObject.get("current_job")).trim();
29237df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi        if (!job_id.equals("<null>")){
29337df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi            String job_url = "#tab_id=view_job&object_id=" + job_id;
29437df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi            showField(currentHostObject, "current_job", "view_host_current_job");
29537df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi            getElementById("view_host_current_job").setAttribute("href", job_url);
29637df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi        }
29779ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        hostname = currentHostObject.get("hostname").isString().stringValue();
29837df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi
29937df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi        String task = Utils.jsonToString(currentHostObject.get("current_special_task")).trim();
30037df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi        if (!task.equals("<null>")){
30137df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi            String task_url = Utils.getRetrieveLogsUrl("hosts/" + hostname + "/" + task);
30237df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi            showField(currentHostObject, "current_special_task", "view_host_current_special_task");
30337df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi            getElementById("view_host_current_special_task").setAttribute("href", task_url);
30437df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi        }
30537df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi
30637df54d11d7598f6b7192b5a397d6e9ca05bf8e3Dan Shi        showField(currentHostObject, "protection", "view_host_protection");
3076bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward        String pageTitle = "Host " + hostname;
30879ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        hostnameInput.setText(hostname);
309c6645c5789a6c8e15290ccba0d643b7b8ad173d6Dan Shi        hostnameInput.setWidth("240px");
310e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        updateLockButton();
3116818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        updateLockReasonInput();
3126bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward        displayObjectData(pageTitle);
3136f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
31479ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        jobsTable.setHostId(getObjectId());
315b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        jobsTable.refresh();
316b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard    }
3176f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
3186bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    @Override
3191c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    public void initialize() {
3201c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        super.initialize();
3216f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
32279ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        // Replace fetch by id with fetch by hostname
32379ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        addWidget(hostnameInput, getFetchByHostnameControlsElementId());
32479ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        addWidget(hostnameFetchButton, getFetchByHostnameControlsElementId());
32579ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo
32679ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        hostnameInput.addKeyPressHandler(new KeyPressHandler() {
32779ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo            public void onKeyPress (KeyPressEvent event) {
32879ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo                if (event.getCharCode() == (char) KeyCodes.KEY_ENTER)
32979ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo                    fetchByHostname(hostnameInput.getText());
33079ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo            }
33179ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        });
33279ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        hostnameFetchButton.addClickHandler(new ClickHandler() {
33379ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo            public void onClick(ClickEvent event) {
33479ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo                fetchByHostname(hostnameInput.getText());
33579ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo            }
33679ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo        });
33779ce642210e581dc2b5cc1df1876e98dae38b286Jiaxi Luo
3381c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        jobsTable.setRowsPerPage(JOBS_PER_PAGE);
339b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        jobsTable.setClickable(true);
340b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        jobsTable.addListener(new DynamicTableListener() {
3414cd4763a855d8eb7d25fd4963babc432eb4d25e6showard            public void onRowClicked(int rowIndex, JSONObject row, boolean isRightClick) {
342c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                if (isJobRow(row)) {
343c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                    JSONObject job = row.get("job").isObject();
344c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                    int jobId = (int) job.get("id").isNumber().doubleValue();
3451fe34c4612727e711818f1414072149f685e364eshoward                    hostDetailListener.onJobSelected(jobId);
346c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                } else {
347aa3c687e0c87cd7323054fbb1064b448728da7e7showard                    String resultsPath = Utils.jsonToString(row.get("execution_path"));
348aa3c687e0c87cd7323054fbb1064b448728da7e7showard                    Utils.openUrlInNewWindow(Utils.getRetrieveLogsUrl(resultsPath));
349c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                }
350b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard            }
351b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard
352b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard            public void onTableRefreshed() {}
353b8d3424d02cfdc6c3eeda788e3527c5ec50ad8f9showard        });
3541c390f85167cfd1c14f9500bb20b05a9e677c0eashoward        tableDecorator.addPaginators();
3559dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        selectionManager = tableDecorator.addSelectionManager(false);
3569dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        jobsTable.setWidgetFactory(selectionManager);
3579dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        tableDecorator.addTableActionsPanel(this, true);
35807e09aff0baf871b33e5479e337e5e3e0523b729Dan Shi        tableDecorator.addControl("Show verifies, repairs, cleanups and resets",
35907e09aff0baf871b33e5479e337e5e3e0523b729Dan Shi                                  showSpecialTasks);
36057bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        tableDecorator.addFilter("Filter by time started:",
36157bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                                 startedTimeFilter);
3629e494cc00c53f9dd0fabec3ef675cb874a9130adshoward        addWidget(tableDecorator, "view_host_jobs_table");
3636f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
364a5e4d84c9616b0a987e904d3b1d1d3fd9ca1be86showard        showSpecialTasks.addClickHandler(new ClickHandler() {
365a5e4d84c9616b0a987e904d3b1d1d3fd9ca1be86showard            public void onClick(ClickEvent event) {
366cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                selectionManager.deselectAll();
3677f2b0e15c5928ea2914d078e385ca717d078c6d5showard                jobsTable.setSpecialTasksEnabled(showSpecialTasks.getValue());
368c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard                jobsTable.refresh();
369c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard            }
370c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        });
3716f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
37257bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        startedTimeFilter.addValueChangeHandler(
37357bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            new ValueChangeHandler() {
37457bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                public void onValueChange(ValueChangeEvent event) {
37557bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    String value = (String) event.getValue();
37657bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    jobsTable.setStartTime(value);
37757bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    if (value == "")
37857bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                        startedTimeFilter.setStartTimeToPlaceHolderValue();
37957bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    jobsTable.refresh();
38057bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                }
38157bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            },
38257bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            new ValueChangeHandler() {
38357bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                public void onValueChange(ValueChangeEvent event) {
38457bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    String value = (String) event.getValue();
38557bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    jobsTable.setEndTime(value);
38657bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    if (value == "")
38757bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                        startedTimeFilter.setEndTimeToPlaceHolderValue();
38857bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                    jobsTable.refresh();
38957bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo                }
39057bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo            }
39157bc195c551d71c5268d7630aa6e872aaad242bfJiaxi Luo        );
3926818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori
3939e494cc00c53f9dd0fabec3ef675cb874a9130adshoward        addWidget(lockButton, "view_host_lock_button");
3946818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        addWidget(lockReasonInput, "view_host_lock_reason_input");
3956818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori
3966818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        lockButton.addClickHandler(new ClickHandler() {
3976818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            public void onClick(ClickEvent event) {
3986818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori               boolean locked = currentHostObject.get("locked").isBoolean().booleanValue();
3996818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori               changeLock(!locked);
4006818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            }
4016818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        });
4026818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        lockReasonInput.addKeyPressHandler(new KeyPressHandler() {
4036818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            public void onKeyPress (KeyPressEvent event) {
4046818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori                if (event.getCharCode() == (char) KeyCodes.KEY_ENTER) {
4056818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori                    boolean locked = currentHostObject.get("locked").isBoolean().booleanValue();
4066818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori                    changeLock(!locked);
4076818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori                }
4086818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            }
4096818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        });
4106f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
411a5e4d84c9616b0a987e904d3b1d1d3fd9ca1be86showard        reverifyButton.addClickHandler(new ClickHandler() {
412a5e4d84c9616b0a987e904d3b1d1d3fd9ca1be86showard            public void onClick(ClickEvent event) {
413d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                JSONObject params = new JSONObject();
4146f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
415d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                params.put("id", currentHostObject.get("id"));
416d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                AfeUtils.callReverify(params, new SimpleCallback() {
417d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                    public void doCallback(Object source) {
418d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                       refresh();
419d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                    }
420d9642c07837d093b13bc5c32132874f8ecce5d5dshoward                }, "Host " + hostname);
421d9642c07837d093b13bc5c32132874f8ecce5d5dshoward            }
422d9642c07837d093b13bc5c32132874f8ecce5d5dshoward        });
4239e494cc00c53f9dd0fabec3ef675cb874a9130adshoward        addWidget(reverifyButton, "view_host_reverify_button");
4246f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
42573dae55766b9c8b6922194901e334c4e52f67d14Simran Basi        repairButton.addClickHandler(new ClickHandler() {
42673dae55766b9c8b6922194901e334c4e52f67d14Simran Basi            public void onClick(ClickEvent event) {
42773dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                JSONObject params = new JSONObject();
42873dae55766b9c8b6922194901e334c4e52f67d14Simran Basi
42973dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                params.put("id", currentHostObject.get("id"));
43073dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                AfeUtils.callRepair(params, new SimpleCallback() {
43173dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                    public void doCallback(Object source) {
43273dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                       refresh();
43373dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                    }
43473dae55766b9c8b6922194901e334c4e52f67d14Simran Basi                }, "Host " + hostname);
43573dae55766b9c8b6922194901e334c4e52f67d14Simran Basi            }
43673dae55766b9c8b6922194901e334c4e52f67d14Simran Basi        });
43773dae55766b9c8b6922194901e334c4e52f67d14Simran Basi        addWidget(repairButton, "view_host_repair_button");
4381c390f85167cfd1c14f9500bb20b05a9e677c0eashoward    }
4395e2c70db8586bcd4c47fe6e5173357539c84cc57showard
4405e2c70db8586bcd4c47fe6e5173357539c84cc57showard    public void onError(JSONObject errorObject) {
4415e2c70db8586bcd4c47fe6e5173357539c84cc57showard        // RPC handler will display error
4425e2c70db8586bcd4c47fe6e5173357539c84cc57showard    }
4439dbdcda5104991cbf344ea5cba1aa58e1af444f3showard
4449dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    public ContextMenu getActionMenu() {
4459dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        ContextMenu menu = new ContextMenu();
446cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        menu.addItem("Abort", new Command() {
4479dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            public void execute() {
448cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                abortSelectedQueueEntriesAndSpecialTasks();
4499dbdcda5104991cbf344ea5cba1aa58e1af444f3showard            }
4509dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        });
4516c40be4575c9101d99027ce9a6ca71b7e4962f85Jiaxi Luo        if (selectionManager.isEmpty())
4526c40be4575c9101d99027ce9a6ca71b7e4962f85Jiaxi Luo            menu.setEnabled(false);
4539dbdcda5104991cbf344ea5cba1aa58e1af444f3showard        return menu;
4549dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    }
4559dbdcda5104991cbf344ea5cba1aa58e1af444f3showard
456cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo    private void abortSelectedQueueEntriesAndSpecialTasks() {
457cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        Set<JSONObject> selectedEntries = selectionManager.getSelectedObjects();
458cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        Set<JSONObject> selectedQueueEntries = new JSONObjectSet<JSONObject>();
459cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        JSONArray selectedSpecialTaskIds = new JSONArray();
460cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        for (JSONObject entry : selectedEntries) {
461cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            if (isJobRow(entry))
462cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                selectedQueueEntries.add(entry);
463cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            else
464cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                selectedSpecialTaskIds.set(selectedSpecialTaskIds.size(),
465cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                                           entry.get("oid"));
466cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        }
467cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        if (!selectedQueueEntries.isEmpty()) {
468cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            AfeUtils.abortHostQueueEntries(selectedQueueEntries, new SimpleCallback() {
469cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                public void doCallback(Object source) {
470cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                    refresh();
471cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                }
472cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            });
473cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        }
474cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        if (selectedSpecialTaskIds.size() > 0) {
475cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            AfeUtils.abortSpecialTasks(selectedSpecialTaskIds, new SimpleCallback() {
476cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                public void doCallback(Object source) {
477cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                    refresh();
478cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo                }
479cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo            });
480cb91d2eb70554b4f1e18ff5f5ec29a6b8cb3d9a8Jiaxi Luo        }
4819dbdcda5104991cbf344ea5cba1aa58e1af444f3showard    }
4826f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
483e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    private void updateLockButton() {
484e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        boolean locked = currentHostObject.get("locked").isBoolean().booleanValue();
485e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        if (locked) {
486e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard            lockButton.setText("Unlock");
487e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        } else {
488e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard            lockButton.setText("Lock");
489e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        }
490e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    }
4916f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
4926818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori    private void updateLockReasonInput() {
4936818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        boolean locked = currentHostObject.get("locked").isBoolean().booleanValue();
4946818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        if (locked) {
4956818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            lockReasonInput.setText("");
4966818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            lockReasonInput.setEnabled(false);
4976818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        } else {
4986818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori            lockReasonInput.setEnabled(true);
4996818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        }
5006818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori    }
5016818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori
502e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    private void changeLock(final boolean lock) {
503e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        JSONArray hostIds = new JSONArray();
504e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        hostIds.set(0, currentHostObject.get("id"));
5056f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
5066818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori        AfeUtils.changeHostLocks(hostIds, lock, lockReasonInput.getText(),
5076818633834ad52c3de153235639ea9299a6e9a6dMatthew Sartori                                 "Host " + hostname, new SimpleCallback() {
508e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard            public void doCallback(Object source) {
509e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard                refresh();
510e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard            }
511e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard        });
512e529d0fe5667f9796c7a6d607322fbfdf6a85cd2showard    }
5136f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li
514c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    private boolean isJobRow(JSONObject row) {
515c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        String type = Utils.jsonToString(row.get("type"));
516c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        return type.equals("Job");
517c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    }
518c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard
519c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    public boolean isRowSelectable(JSONObject row) {
520c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard        return isJobRow(row);
521c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard    }
5223bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo
5233bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo    @Override
5243bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo    public void handleHistoryArguments(Map<String, String> arguments) {
5253bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo        String hostname = arguments.get("hostname");
5263bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo        String objectId = arguments.get("object_id");
5273bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo
5283bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo        if (objectId != null) {
5293bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo            try {
5303bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo                updateObjectId(objectId);
5313bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo            }
5323bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo            catch (IllegalArgumentException exc) {
5333bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo                return;
5343bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo            }
5353bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo        } else if (hostname != null) {
5363bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo            fetchDataByHostname(hostname);
5373bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo        } else {
5383bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo            resetPage();
5393bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo        }
5403bb15cfa61fd3f5ff766000ed1b84a27815875c8Jiaxi Luo    }
5411c390f85167cfd1c14f9500bb20b05a9e677c0eashoward}
542