Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: frontend/client/src/autotest/afe/HostDetailView.java

Issue 3541002: Revert "Merge remote branch 'cros/upstream' into tempbranch2" (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/autotest.git
Patch Set: Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 package autotest.afe; 1 package autotest.afe;
2 2
3 import autotest.afe.create.CreateJobViewPresenter.JobCreateListener; 3 import autotest.afe.CreateJobView.JobCreateListener;
4 import autotest.common.SimpleCallback; 4 import autotest.common.SimpleCallback;
5 import autotest.common.Utils; 5 import autotest.common.Utils;
6 import autotest.common.table.DataSource; 6 import autotest.common.table.DataSource;
7 import autotest.common.table.DataTable;
8 import autotest.common.table.DynamicTable;
9 import autotest.common.table.RpcDataSource;
10 import autotest.common.table.SelectionManager;
11 import autotest.common.table.SimpleFilter;
12 import autotest.common.table.TableDecorator;
7 import autotest.common.table.DataSource.DataCallback; 13 import autotest.common.table.DataSource.DataCallback;
8 import autotest.common.table.DataSource.Query; 14 import autotest.common.table.DataSource.Query;
9 import autotest.common.table.DataSource.SortDirection; 15 import autotest.common.table.DataSource.SortDirection;
10 import autotest.common.table.DataTable;
11 import autotest.common.table.DynamicTable;
12 import autotest.common.table.DynamicTable.DynamicTableListener; 16 import autotest.common.table.DynamicTable.DynamicTableListener;
13 import autotest.common.table.RpcDataSource;
14 import autotest.common.table.SelectionManager;
15 import autotest.common.table.SelectionManager.SelectableRowFilter; 17 import autotest.common.table.SelectionManager.SelectableRowFilter;
16 import autotest.common.table.SimpleFilter;
17 import autotest.common.table.TableDecorator;
18 import autotest.common.ui.ContextMenu; 18 import autotest.common.ui.ContextMenu;
19 import autotest.common.ui.DetailView; 19 import autotest.common.ui.DetailView;
20 import autotest.common.ui.NotifyManager; 20 import autotest.common.ui.NotifyManager;
21 import autotest.common.ui.TableActionsPanel.TableActionsListener; 21 import autotest.common.ui.TableActionsPanel.TableActionsListener;
22 22
23 import com.google.gwt.event.dom.client.ClickEvent; 23 import com.google.gwt.event.dom.client.ClickEvent;
24 import com.google.gwt.event.dom.client.ClickHandler; 24 import com.google.gwt.event.dom.client.ClickHandler;
25 import com.google.gwt.json.client.JSONArray; 25 import com.google.gwt.json.client.JSONArray;
26 import com.google.gwt.json.client.JSONBoolean; 26 import com.google.gwt.json.client.JSONBoolean;
27 import com.google.gwt.json.client.JSONObject; 27 import com.google.gwt.json.client.JSONObject;
28 import com.google.gwt.json.client.JSONString; 28 import com.google.gwt.json.client.JSONString;
29 import com.google.gwt.json.client.JSONValue; 29 import com.google.gwt.json.client.JSONValue;
30 import com.google.gwt.user.client.Command; 30 import com.google.gwt.user.client.Command;
31 import com.google.gwt.user.client.ui.Button; 31 import com.google.gwt.user.client.ui.Button;
32 import com.google.gwt.user.client.ui.CheckBox; 32 import com.google.gwt.user.client.ui.CheckBox;
33 33
34 import java.util.List; 34 import java.util.List;
35 35
36 public class HostDetailView extends DetailView 36 public class HostDetailView extends DetailView
37 implements DataCallback, TableActionsListener, Selec tableRowFilter { 37 implements DataCallback, TableActionsListener, Selec tableRowFilter {
38 private static final String[][] HOST_JOBS_COLUMNS = { 38 private static final String[][] HOST_JOBS_COLUMNS = {
39 {DataTable.WIDGET_COLUMN, ""}, {"type", "Type"}, {"job__id", "Job ID "}, 39 {DataTable.WIDGET_COLUMN, ""}, {"type", "Type"}, {"job__id", "Job ID "},
40 {"job_owner", "Job Owner"}, {"job_name", "Job Name"}, {"started_on", "Time started"}, 40 {"job_owner", "Job Owner"}, {"job_name", "Job Name"}, {"started_on", "Time started"},
41 {"status", "Status"} 41 {"status", "Status"}
42 }; 42 };
43 public static final int JOBS_PER_PAGE = 20; 43 public static final int JOBS_PER_PAGE = 20;
44 44
45 public interface HostDetailListener { 45 public interface HostDetailListener {
46 public void onJobSelected(int jobId); 46 public void onJobSelected(int jobId);
47 } 47 }
48 48
49 private static class HostQueueEntryDataSource extends RpcDataSource { 49 private static class HostQueueEntryDataSource extends RpcDataSource {
50 public HostQueueEntryDataSource() { 50 public HostQueueEntryDataSource() {
51 super("get_host_queue_entries", "get_num_host_queue_entries"); 51 super("get_host_queue_entries", "get_num_host_queue_entries");
52 } 52 }
53 53
54 @Override 54 @Override
55 protected List<JSONObject> handleJsonResult(JSONValue result) { 55 protected List<JSONObject> handleJsonResult(JSONValue result) {
56 List<JSONObject> resultArray = super.handleJsonResult(result); 56 List<JSONObject> resultArray = super.handleJsonResult(result);
57 for (JSONObject row : resultArray) { 57 for (JSONObject row : resultArray) {
58 // get_host_queue_entries() doesn't return type, so fill it in f or consistency with 58 // get_host_queue_entries() doesn't return type, so fill it in f or consistency with
59 // get_host_queue_entries_and_special_tasks() 59 // get_host_queue_entries_and_special_tasks()
60 row.put("type", new JSONString("Job")); 60 row.put("type", new JSONString("Job"));
61 } 61 }
62 return resultArray; 62 return resultArray;
63 } 63 }
64 } 64 }
65 65
66 private static class HostJobsTable extends DynamicTable { 66 private static class HostJobsTable extends DynamicTable {
67 private static final DataSource normalDataSource = new HostQueueEntryDat aSource(); 67 private static final DataSource normalDataSource = new HostQueueEntryDat aSource();
68 private static final DataSource dataSourceWithSpecialTasks = 68 private static final DataSource dataSourceWithSpecialTasks =
69 new RpcDataSource("get_host_queue_entries_and_special_tasks", 69 new RpcDataSource("get_host_queue_entries_and_special_tasks",
70 "get_num_host_queue_entries_and_special_tasks"); 70 "get_num_host_queue_entries_and_special_tasks");
71 71
72 private SimpleFilter hostFilter = new SimpleFilter(); 72 private SimpleFilter hostFilter = new SimpleFilter();
73 private String hostname; 73 private String hostname;
74 74
75 public HostJobsTable() { 75 public HostJobsTable() {
76 super(HOST_JOBS_COLUMNS, normalDataSource); 76 super(HOST_JOBS_COLUMNS, normalDataSource);
77 addFilter(hostFilter); 77 addFilter(hostFilter);
78 } 78 }
79 79
80 public void setHostname(String hostname) { 80 public void setHostname(String hostname) {
81 this.hostname = hostname; 81 this.hostname = hostname;
82 updateFilter(); 82 updateFilter();
83 } 83 }
84 84
85 private void updateFilter() { 85 private void updateFilter() {
86 String key; 86 String key;
87 if (getDataSource() == normalDataSource) { 87 if (getDataSource() == normalDataSource) {
88 key = "host__hostname"; 88 key = "host__hostname";
89 sortOnColumn("job__id", SortDirection.DESCENDING); 89 sortOnColumn("job__id", SortDirection.DESCENDING);
90 } else { 90 } else {
91 key = "hostname"; 91 key = "hostname";
92 clearSorts(); 92 clearSorts();
93 } 93 }
94 94
95 hostFilter.clear(); 95 hostFilter.clear();
96 hostFilter.setParameter(key, new JSONString(hostname)); 96 hostFilter.setParameter(key, new JSONString(hostname));
97 } 97 }
98 98
99 public void setSpecialTasksEnabled(boolean enabled) { 99 public void setSpecialTasksEnabled(boolean enabled) {
100 if (enabled) { 100 if (enabled) {
101 setDataSource(dataSourceWithSpecialTasks); 101 setDataSource(dataSourceWithSpecialTasks);
102 } else { 102 } else {
103 setDataSource(normalDataSource); 103 setDataSource(normalDataSource);
104 } 104 }
105 105
106 updateFilter(); 106 updateFilter();
107 } 107 }
108 108
109 @Override 109 @Override
110 protected void preprocessRow(JSONObject row) { 110 protected void preprocessRow(JSONObject row) {
111 JSONObject job = row.get("job").isObject(); 111 JSONObject job = row.get("job").isObject();
112 JSONString blank = new JSONString(""); 112 JSONString blank = new JSONString("");
113 JSONString jobId = blank, owner = blank, name = blank; 113 JSONString jobId = blank, owner = blank, name = blank;
114 if (job != null) { 114 if (job != null) {
115 int id = (int) job.get("id").isNumber().doubleValue(); 115 int id = (int) job.get("id").isNumber().doubleValue();
116 jobId = new JSONString(Integer.toString(id)); 116 jobId = new JSONString(Integer.toString(id));
117 owner = job.get("owner").isString(); 117 owner = job.get("owner").isString();
118 name = job.get("name").isString(); 118 name = job.get("name").isString();
119 } 119 }
120 120
121 row.put("job__id", jobId); 121 row.put("job__id", jobId);
122 row.put("job_owner", owner); 122 row.put("job_owner", owner);
123 row.put("job_name", name); 123 row.put("job_name", name);
124 } 124 }
125 } 125 }
126 126
127 private String hostname = ""; 127 private String hostname = "";
128 private DataSource hostDataSource = new HostDataSource(); 128 private DataSource hostDataSource = new HostDataSource();
129 private HostJobsTable jobsTable = new HostJobsTable(); 129 private HostJobsTable jobsTable = new HostJobsTable();
130 private TableDecorator tableDecorator = new TableDecorator(jobsTable); 130 private TableDecorator tableDecorator = new TableDecorator(jobsTable);
131 private HostDetailListener hostDetailListener = null; 131 private HostDetailListener hostDetailListener = null;
132 private JobCreateListener jobCreateListener = null; 132 private JobCreateListener jobCreateListener = null;
133 private SelectionManager selectionManager; 133 private SelectionManager selectionManager;
134 134
135 private JSONObject currentHostObject; 135 private JSONObject currentHostObject;
136 136
137 private Button lockButton = new Button(); 137 private Button lockButton = new Button();
138 private Button reverifyButton = new Button("Reverify"); 138 private Button reverifyButton = new Button("Reverify");
139 private Button reinstallButton = new Button("Reinstall"); 139 private Button reinstallButton = new Button("Reinstall");
140 private CheckBox showSpecialTasks = new CheckBox(); 140 private CheckBox showSpecialTasks = new CheckBox();
141 141
142 public HostDetailView(HostDetailListener hostDetailListener, 142 public HostDetailView(HostDetailListener hostDetailListener,
143 JobCreateListener jobCreateListener) { 143 JobCreateListener jobCreateListener) {
144 this.hostDetailListener = hostDetailListener; 144 this.hostDetailListener = hostDetailListener;
145 this.jobCreateListener = jobCreateListener; 145 this.jobCreateListener = jobCreateListener;
146 } 146 }
147 147
148 @Override 148 @Override
149 public String getElementId() { 149 public String getElementId() {
150 return "view_host"; 150 return "view_host";
151 } 151 }
152 152
153 @Override 153 @Override
154 protected String getFetchControlsElementId() { 154 protected String getFetchControlsElementId() {
155 return "view_host_fetch_controls"; 155 return "view_host_fetch_controls";
156 } 156 }
157 157
158 @Override 158 @Override
159 protected String getDataElementId() { 159 protected String getDataElementId() {
160 return "view_host_data"; 160 return "view_host_data";
161 } 161 }
162 162
163 @Override 163 @Override
164 protected String getTitleElementId() { 164 protected String getTitleElementId() {
165 return "view_host_title"; 165 return "view_host_title";
166 } 166 }
167 167
168 @Override 168 @Override
169 protected String getNoObjectText() { 169 protected String getNoObjectText() {
170 return "No host selected"; 170 return "No host selected";
171 } 171 }
172 172
173 @Override 173 @Override
174 protected String getObjectId() { 174 protected String getObjectId() {
175 return hostname; 175 return hostname;
176 } 176 }
177 177
178 @Override 178 @Override
179 protected void setObjectId(String id) { 179 protected void setObjectId(String id) {
180 if (id.length() == 0) { 180 if (id.length() == 0)
181 throw new IllegalArgumentException(); 181 throw new IllegalArgumentException();
182 }
183 this.hostname = id; 182 this.hostname = id;
184 } 183 }
185 184
186 @Override 185 @Override
187 protected void fetchData() { 186 protected void fetchData() {
188 JSONObject params = new JSONObject(); 187 JSONObject params = new JSONObject();
189 params.put("hostname", new JSONString(hostname)); 188 params.put("hostname", new JSONString(hostname));
190 params.put("valid_only", JSONBoolean.getInstance(false)); 189 params.put("valid_only", JSONBoolean.getInstance(false));
191 hostDataSource.query(params, this); 190 hostDataSource.query(params, this);
192 } 191 }
193 192
194 @Override 193 @Override
195 public void handleTotalResultCount(int totalCount) {} 194 public void handleTotalResultCount(int totalCount) {}
196 195
197 @Override 196 @Override
198 public void onQueryReady(Query query) { 197 public void onQueryReady(Query query) {
199 query.getPage(null, null, null, this); 198 query.getPage(null, null, null, this);
200 } 199 }
201 200
202 public void handlePage(List<JSONObject> data) { 201 public void handlePage(List<JSONObject> data) {
203 try { 202 try {
204 currentHostObject = Utils.getSingleObjectFromList(data); 203 currentHostObject = Utils.getSingleObjectFromList(data);
205 } 204 }
206 catch (IllegalArgumentException exc) { 205 catch (IllegalArgumentException exc) {
207 NotifyManager.getInstance().showError("No such host found"); 206 NotifyManager.getInstance().showError("No such host found");
208 resetPage(); 207 resetPage();
209 return; 208 return;
210 } 209 }
211 210
212 String lockedText = Utils.jsonToString(currentHostObject.get(HostDataSou rce.LOCKED_TEXT)); 211 String lockedText = Utils.jsonToString(currentHostObject.get(HostDataSou rce.LOCKED_TEXT));
213 if (currentHostObject.get("locked").isBoolean().booleanValue()) { 212 if (currentHostObject.get("locked").isBoolean().booleanValue()) {
214 String lockedBy = Utils.jsonToString(currentHostObject.get("locked_b y")); 213 String lockedBy = Utils.jsonToString(currentHostObject.get("locked_b y"));
215 String lockedTime = Utils.jsonToString(currentHostObject.get("lock_t ime")); 214 String lockedTime = Utils.jsonToString(currentHostObject.get("lock_t ime"));
216 lockedText += ", by " + lockedBy + " on " + lockedTime; 215 lockedText += ", by " + lockedBy + " on " + lockedTime;
217 } 216 }
218 217
219 showField(currentHostObject, "status", "view_host_status"); 218 showField(currentHostObject, "status", "view_host_status");
220 showField(currentHostObject, "platform", "view_host_platform"); 219 showField(currentHostObject, "platform", "view_host_platform");
221 showField(currentHostObject, HostDataSource.HOST_ACLS, "view_host_acls") ; 220 showField(currentHostObject, HostDataSource.HOST_ACLS, "view_host_acls") ;
222 showField(currentHostObject, HostDataSource.OTHER_LABELS, "view_host_lab els"); 221 showField(currentHostObject, HostDataSource.OTHER_LABELS, "view_host_lab els");
223 showText(lockedText, "view_host_locked"); 222 showText(lockedText, "view_host_locked");
224 showField(currentHostObject, "protection", "view_host_protection"); 223 showField(currentHostObject, "protection", "view_host_protection");
225 String pageTitle = "Host " + hostname; 224 String pageTitle = "Host " + hostname;
226 updateLockButton(); 225 updateLockButton();
227 displayObjectData(pageTitle); 226 displayObjectData(pageTitle);
228 227
229 jobsTable.setHostname(hostname); 228 jobsTable.setHostname(hostname);
230 jobsTable.refresh(); 229 jobsTable.refresh();
231 } 230 }
232 231
233 @Override 232 @Override
234 public void initialize() { 233 public void initialize() {
235 super.initialize(); 234 super.initialize();
236 235
237 jobsTable.setRowsPerPage(JOBS_PER_PAGE); 236 jobsTable.setRowsPerPage(JOBS_PER_PAGE);
238 jobsTable.setClickable(true); 237 jobsTable.setClickable(true);
239 jobsTable.addListener(new DynamicTableListener() { 238 jobsTable.addListener(new DynamicTableListener() {
240 public void onRowClicked(int rowIndex, JSONObject row, boolean isRig htClick) { 239 public void onRowClicked(int rowIndex, JSONObject row, boolean isRig htClick) {
241 if (isJobRow(row)) { 240 if (isJobRow(row)) {
242 JSONObject job = row.get("job").isObject(); 241 JSONObject job = row.get("job").isObject();
243 int jobId = (int) job.get("id").isNumber().doubleValue(); 242 int jobId = (int) job.get("id").isNumber().doubleValue();
244 hostDetailListener.onJobSelected(jobId); 243 hostDetailListener.onJobSelected(jobId);
245 } else { 244 } else {
246 String resultsPath = Utils.jsonToString(row.get("execution_p ath")); 245 String resultsPath = Utils.jsonToString(row.get("execution_p ath"));
247 Utils.openUrlInNewWindow(Utils.getRetrieveLogsUrl(resultsPat h)); 246 Utils.openUrlInNewWindow(Utils.getRetrieveLogsUrl(resultsPat h));
248 } 247 }
249 } 248 }
250 249
251 public void onTableRefreshed() {} 250 public void onTableRefreshed() {}
252 }); 251 });
253 tableDecorator.addPaginators(); 252 tableDecorator.addPaginators();
254 selectionManager = tableDecorator.addSelectionManager(false); 253 selectionManager = tableDecorator.addSelectionManager(false);
255 selectionManager.setSelectableRowFilter(this); 254 selectionManager.setSelectableRowFilter(this);
256 jobsTable.setWidgetFactory(selectionManager); 255 jobsTable.setWidgetFactory(selectionManager);
257 tableDecorator.addTableActionsPanel(this, true); 256 tableDecorator.addTableActionsPanel(this, true);
258 tableDecorator.addControl("Show verifies, repairs and cleanups", showSpe cialTasks); 257 tableDecorator.addControl("Show verifies, repairs and cleanups", showSpe cialTasks);
259 addWidget(tableDecorator, "view_host_jobs_table"); 258 addWidget(tableDecorator, "view_host_jobs_table");
260 259
261 showSpecialTasks.addClickHandler(new ClickHandler() { 260 showSpecialTasks.addClickHandler(new ClickHandler() {
262 public void onClick(ClickEvent event) { 261 public void onClick(ClickEvent event) {
263 jobsTable.setSpecialTasksEnabled(showSpecialTasks.getValue()); 262 jobsTable.setSpecialTasksEnabled(showSpecialTasks.getValue());
264 jobsTable.refresh(); 263 jobsTable.refresh();
265 } 264 }
266 }); 265 });
267 266
268 lockButton.addClickHandler(new ClickHandler() { 267 lockButton.addClickHandler(new ClickHandler() {
269 public void onClick(ClickEvent event) { 268 public void onClick(ClickEvent event) {
270 boolean locked = currentHostObject.get("locked").isBoolean().bool eanValue(); 269 boolean locked = currentHostObject.get("locked").isBoolean().bool eanValue();
271 changeLock(!locked); 270 changeLock(!locked);
272 } 271 }
273 }); 272 });
274 addWidget(lockButton, "view_host_lock_button"); 273 addWidget(lockButton, "view_host_lock_button");
275 274
276 reverifyButton.addClickHandler(new ClickHandler() { 275 reverifyButton.addClickHandler(new ClickHandler() {
277 public void onClick(ClickEvent event) { 276 public void onClick(ClickEvent event) {
278 JSONObject params = new JSONObject(); 277 JSONObject params = new JSONObject();
279 278
280 params.put("id", currentHostObject.get("id")); 279 params.put("id", currentHostObject.get("id"));
281 AfeUtils.callReverify(params, new SimpleCallback() { 280 AfeUtils.callReverify(params, new SimpleCallback() {
282 public void doCallback(Object source) { 281 public void doCallback(Object source) {
283 refresh(); 282 refresh();
284 } 283 }
285 }, "Host " + hostname); 284 }, "Host " + hostname);
286 } 285 }
287 }); 286 });
288 addWidget(reverifyButton, "view_host_reverify_button"); 287 addWidget(reverifyButton, "view_host_reverify_button");
289 288
290 reinstallButton.addClickHandler(new ClickHandler() { 289 reinstallButton.addClickHandler(new ClickHandler() {
291 public void onClick(ClickEvent event) { 290 public void onClick(ClickEvent event) {
292 JSONArray array = new JSONArray(); 291 JSONArray array = new JSONArray();
293 array.set(0, new JSONString(hostname)); 292 array.set(0, new JSONString(hostname));
294 AfeUtils.scheduleReinstall(array, hostname, jobCreateListener); 293 AfeUtils.scheduleReinstall(array, hostname, jobCreateListener);
295 } 294 }
296 }); 295 });
297 addWidget(reinstallButton, "view_host_reinstall_button"); 296 addWidget(reinstallButton, "view_host_reinstall_button");
298 } 297 }
299 298
300 public void onError(JSONObject errorObject) { 299 public void onError(JSONObject errorObject) {
301 // RPC handler will display error 300 // RPC handler will display error
302 } 301 }
303 302
304 public ContextMenu getActionMenu() { 303 public ContextMenu getActionMenu() {
305 ContextMenu menu = new ContextMenu(); 304 ContextMenu menu = new ContextMenu();
306 menu.addItem("Abort job entries", new Command() { 305 menu.addItem("Abort job entries", new Command() {
307 public void execute() { 306 public void execute() {
308 abortSelectedQueueEntries(); 307 abortSelectedQueueEntries();
309 } 308 }
310 }); 309 });
311 return menu; 310 return menu;
312 } 311 }
313 312
314 private void abortSelectedQueueEntries() { 313 private void abortSelectedQueueEntries() {
315 AfeUtils.abortHostQueueEntries(selectionManager.getSelectedObjects(), ne w SimpleCallback() { 314 AfeUtils.abortHostQueueEntries(selectionManager.getSelectedObjects(), ne w SimpleCallback() {
316 public void doCallback(Object source) { 315 public void doCallback(Object source) {
317 refresh(); 316 refresh();
318 } 317 }
319 }); 318 });
320 } 319 }
321 320
322 private void updateLockButton() { 321 private void updateLockButton() {
323 boolean locked = currentHostObject.get("locked").isBoolean().booleanValu e(); 322 boolean locked = currentHostObject.get("locked").isBoolean().booleanValu e();
324 if (locked) { 323 if (locked) {
325 lockButton.setText("Unlock"); 324 lockButton.setText("Unlock");
326 } else { 325 } else {
327 lockButton.setText("Lock"); 326 lockButton.setText("Lock");
328 } 327 }
329 } 328 }
330 329
331 private void changeLock(final boolean lock) { 330 private void changeLock(final boolean lock) {
332 JSONArray hostIds = new JSONArray(); 331 JSONArray hostIds = new JSONArray();
333 hostIds.set(0, currentHostObject.get("id")); 332 hostIds.set(0, currentHostObject.get("id"));
334 333
335 AfeUtils.changeHostLocks(hostIds, lock, "Host " + hostname, new SimpleCa llback() { 334 AfeUtils.changeHostLocks(hostIds, lock, "Host " + hostname, new SimpleCa llback() {
336 public void doCallback(Object source) { 335 public void doCallback(Object source) {
337 refresh(); 336 refresh();
338 } 337 }
339 }); 338 });
340 } 339 }
341 340
342 private boolean isJobRow(JSONObject row) { 341 private boolean isJobRow(JSONObject row) {
343 String type = Utils.jsonToString(row.get("type")); 342 String type = Utils.jsonToString(row.get("type"));
344 return type.equals("Job"); 343 return type.equals("Job");
345 } 344 }
346 345
347 public boolean isRowSelectable(JSONObject row) { 346 public boolean isRowSelectable(JSONObject row) {
348 return isJobRow(row); 347 return isJobRow(row);
349 } 348 }
350 } 349 }
OLDNEW
« no previous file with comments | « frontend/client/src/autotest/afe/CreateJobView.java ('k') | frontend/client/src/autotest/afe/HostListView.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698