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

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

Issue 3554003: Merge remote branch 'cros/upstream' into tempbranch3 (Closed) Base URL: http://git.chromium.org/git/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.CreateJobView.JobCreateListener; 3 import autotest.afe.create.CreateJobViewPresenter.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;
13 import autotest.common.table.DataSource.DataCallback; 7 import autotest.common.table.DataSource.DataCallback;
14 import autotest.common.table.DataSource.Query; 8 import autotest.common.table.DataSource.Query;
15 import autotest.common.table.DataSource.SortDirection; 9 import autotest.common.table.DataSource.SortDirection;
10 import autotest.common.table.DataTable;
11 import autotest.common.table.DynamicTable;
16 import autotest.common.table.DynamicTable.DynamicTableListener; 12 import autotest.common.table.DynamicTable.DynamicTableListener;
13 import autotest.common.table.RpcDataSource;
14 import autotest.common.table.SelectionManager;
17 import autotest.common.table.SelectionManager.SelectableRowFilter; 15 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 }
182 this.hostname = id; 183 this.hostname = id;
183 } 184 }
184 185
185 @Override 186 @Override
186 protected void fetchData() { 187 protected void fetchData() {
187 JSONObject params = new JSONObject(); 188 JSONObject params = new JSONObject();
188 params.put("hostname", new JSONString(hostname)); 189 params.put("hostname", new JSONString(hostname));
189 params.put("valid_only", JSONBoolean.getInstance(false)); 190 params.put("valid_only", JSONBoolean.getInstance(false));
190 hostDataSource.query(params, this); 191 hostDataSource.query(params, this);
191 } 192 }
192 193
193 @Override 194 @Override
194 public void handleTotalResultCount(int totalCount) {} 195 public void handleTotalResultCount(int totalCount) {}
195 196
196 @Override 197 @Override
197 public void onQueryReady(Query query) { 198 public void onQueryReady(Query query) {
198 query.getPage(null, null, null, this); 199 query.getPage(null, null, null, this);
199 } 200 }
200 201
201 public void handlePage(List<JSONObject> data) { 202 public void handlePage(List<JSONObject> data) {
202 try { 203 try {
203 currentHostObject = Utils.getSingleObjectFromList(data); 204 currentHostObject = Utils.getSingleObjectFromList(data);
204 } 205 }
205 catch (IllegalArgumentException exc) { 206 catch (IllegalArgumentException exc) {
206 NotifyManager.getInstance().showError("No such host found"); 207 NotifyManager.getInstance().showError("No such host found");
207 resetPage(); 208 resetPage();
208 return; 209 return;
209 } 210 }
210 211
211 String lockedText = Utils.jsonToString(currentHostObject.get(HostDataSou rce.LOCKED_TEXT)); 212 String lockedText = Utils.jsonToString(currentHostObject.get(HostDataSou rce.LOCKED_TEXT));
212 if (currentHostObject.get("locked").isBoolean().booleanValue()) { 213 if (currentHostObject.get("locked").isBoolean().booleanValue()) {
213 String lockedBy = Utils.jsonToString(currentHostObject.get("locked_b y")); 214 String lockedBy = Utils.jsonToString(currentHostObject.get("locked_b y"));
214 String lockedTime = Utils.jsonToString(currentHostObject.get("lock_t ime")); 215 String lockedTime = Utils.jsonToString(currentHostObject.get("lock_t ime"));
215 lockedText += ", by " + lockedBy + " on " + lockedTime; 216 lockedText += ", by " + lockedBy + " on " + lockedTime;
216 } 217 }
217 218
218 showField(currentHostObject, "status", "view_host_status"); 219 showField(currentHostObject, "status", "view_host_status");
219 showField(currentHostObject, "platform", "view_host_platform"); 220 showField(currentHostObject, "platform", "view_host_platform");
220 showField(currentHostObject, HostDataSource.HOST_ACLS, "view_host_acls") ; 221 showField(currentHostObject, HostDataSource.HOST_ACLS, "view_host_acls") ;
221 showField(currentHostObject, HostDataSource.OTHER_LABELS, "view_host_lab els"); 222 showField(currentHostObject, HostDataSource.OTHER_LABELS, "view_host_lab els");
222 showText(lockedText, "view_host_locked"); 223 showText(lockedText, "view_host_locked");
223 showField(currentHostObject, "protection", "view_host_protection"); 224 showField(currentHostObject, "protection", "view_host_protection");
224 String pageTitle = "Host " + hostname; 225 String pageTitle = "Host " + hostname;
225 updateLockButton(); 226 updateLockButton();
226 displayObjectData(pageTitle); 227 displayObjectData(pageTitle);
227 228
228 jobsTable.setHostname(hostname); 229 jobsTable.setHostname(hostname);
229 jobsTable.refresh(); 230 jobsTable.refresh();
230 } 231 }
231 232
232 @Override 233 @Override
233 public void initialize() { 234 public void initialize() {
234 super.initialize(); 235 super.initialize();
235 236
236 jobsTable.setRowsPerPage(JOBS_PER_PAGE); 237 jobsTable.setRowsPerPage(JOBS_PER_PAGE);
237 jobsTable.setClickable(true); 238 jobsTable.setClickable(true);
238 jobsTable.addListener(new DynamicTableListener() { 239 jobsTable.addListener(new DynamicTableListener() {
239 public void onRowClicked(int rowIndex, JSONObject row, boolean isRig htClick) { 240 public void onRowClicked(int rowIndex, JSONObject row, boolean isRig htClick) {
240 if (isJobRow(row)) { 241 if (isJobRow(row)) {
241 JSONObject job = row.get("job").isObject(); 242 JSONObject job = row.get("job").isObject();
242 int jobId = (int) job.get("id").isNumber().doubleValue(); 243 int jobId = (int) job.get("id").isNumber().doubleValue();
243 hostDetailListener.onJobSelected(jobId); 244 hostDetailListener.onJobSelected(jobId);
244 } else { 245 } else {
245 String resultsPath = Utils.jsonToString(row.get("execution_p ath")); 246 String resultsPath = Utils.jsonToString(row.get("execution_p ath"));
246 Utils.openUrlInNewWindow(Utils.getRetrieveLogsUrl(resultsPat h)); 247 Utils.openUrlInNewWindow(Utils.getRetrieveLogsUrl(resultsPat h));
247 } 248 }
248 } 249 }
249 250
250 public void onTableRefreshed() {} 251 public void onTableRefreshed() {}
251 }); 252 });
252 tableDecorator.addPaginators(); 253 tableDecorator.addPaginators();
253 selectionManager = tableDecorator.addSelectionManager(false); 254 selectionManager = tableDecorator.addSelectionManager(false);
254 selectionManager.setSelectableRowFilter(this); 255 selectionManager.setSelectableRowFilter(this);
255 jobsTable.setWidgetFactory(selectionManager); 256 jobsTable.setWidgetFactory(selectionManager);
256 tableDecorator.addTableActionsPanel(this, true); 257 tableDecorator.addTableActionsPanel(this, true);
257 tableDecorator.addControl("Show verifies, repairs and cleanups", showSpe cialTasks); 258 tableDecorator.addControl("Show verifies, repairs and cleanups", showSpe cialTasks);
258 addWidget(tableDecorator, "view_host_jobs_table"); 259 addWidget(tableDecorator, "view_host_jobs_table");
259 260
260 showSpecialTasks.addClickHandler(new ClickHandler() { 261 showSpecialTasks.addClickHandler(new ClickHandler() {
261 public void onClick(ClickEvent event) { 262 public void onClick(ClickEvent event) {
262 jobsTable.setSpecialTasksEnabled(showSpecialTasks.getValue()); 263 jobsTable.setSpecialTasksEnabled(showSpecialTasks.getValue());
263 jobsTable.refresh(); 264 jobsTable.refresh();
264 } 265 }
265 }); 266 });
266 267
267 lockButton.addClickHandler(new ClickHandler() { 268 lockButton.addClickHandler(new ClickHandler() {
268 public void onClick(ClickEvent event) { 269 public void onClick(ClickEvent event) {
269 boolean locked = currentHostObject.get("locked").isBoolean().bool eanValue(); 270 boolean locked = currentHostObject.get("locked").isBoolean().bool eanValue();
270 changeLock(!locked); 271 changeLock(!locked);
271 } 272 }
272 }); 273 });
273 addWidget(lockButton, "view_host_lock_button"); 274 addWidget(lockButton, "view_host_lock_button");
274 275
275 reverifyButton.addClickHandler(new ClickHandler() { 276 reverifyButton.addClickHandler(new ClickHandler() {
276 public void onClick(ClickEvent event) { 277 public void onClick(ClickEvent event) {
277 JSONObject params = new JSONObject(); 278 JSONObject params = new JSONObject();
278 279
279 params.put("id", currentHostObject.get("id")); 280 params.put("id", currentHostObject.get("id"));
280 AfeUtils.callReverify(params, new SimpleCallback() { 281 AfeUtils.callReverify(params, new SimpleCallback() {
281 public void doCallback(Object source) { 282 public void doCallback(Object source) {
282 refresh(); 283 refresh();
283 } 284 }
284 }, "Host " + hostname); 285 }, "Host " + hostname);
285 } 286 }
286 }); 287 });
287 addWidget(reverifyButton, "view_host_reverify_button"); 288 addWidget(reverifyButton, "view_host_reverify_button");
288 289
289 reinstallButton.addClickHandler(new ClickHandler() { 290 reinstallButton.addClickHandler(new ClickHandler() {
290 public void onClick(ClickEvent event) { 291 public void onClick(ClickEvent event) {
291 JSONArray array = new JSONArray(); 292 JSONArray array = new JSONArray();
292 array.set(0, new JSONString(hostname)); 293 array.set(0, new JSONString(hostname));
293 AfeUtils.scheduleReinstall(array, hostname, jobCreateListener); 294 AfeUtils.scheduleReinstall(array, hostname, jobCreateListener);
294 } 295 }
295 }); 296 });
296 addWidget(reinstallButton, "view_host_reinstall_button"); 297 addWidget(reinstallButton, "view_host_reinstall_button");
297 } 298 }
298 299
299 public void onError(JSONObject errorObject) { 300 public void onError(JSONObject errorObject) {
300 // RPC handler will display error 301 // RPC handler will display error
301 } 302 }
302 303
303 public ContextMenu getActionMenu() { 304 public ContextMenu getActionMenu() {
304 ContextMenu menu = new ContextMenu(); 305 ContextMenu menu = new ContextMenu();
305 menu.addItem("Abort job entries", new Command() { 306 menu.addItem("Abort job entries", new Command() {
306 public void execute() { 307 public void execute() {
307 abortSelectedQueueEntries(); 308 abortSelectedQueueEntries();
308 } 309 }
309 }); 310 });
310 return menu; 311 return menu;
311 } 312 }
312 313
313 private void abortSelectedQueueEntries() { 314 private void abortSelectedQueueEntries() {
314 AfeUtils.abortHostQueueEntries(selectionManager.getSelectedObjects(), ne w SimpleCallback() { 315 AfeUtils.abortHostQueueEntries(selectionManager.getSelectedObjects(), ne w SimpleCallback() {
315 public void doCallback(Object source) { 316 public void doCallback(Object source) {
316 refresh(); 317 refresh();
317 } 318 }
318 }); 319 });
319 } 320 }
320 321
321 private void updateLockButton() { 322 private void updateLockButton() {
322 boolean locked = currentHostObject.get("locked").isBoolean().booleanValu e(); 323 boolean locked = currentHostObject.get("locked").isBoolean().booleanValu e();
323 if (locked) { 324 if (locked) {
324 lockButton.setText("Unlock"); 325 lockButton.setText("Unlock");
325 } else { 326 } else {
326 lockButton.setText("Lock"); 327 lockButton.setText("Lock");
327 } 328 }
328 } 329 }
329 330
330 private void changeLock(final boolean lock) { 331 private void changeLock(final boolean lock) {
331 JSONArray hostIds = new JSONArray(); 332 JSONArray hostIds = new JSONArray();
332 hostIds.set(0, currentHostObject.get("id")); 333 hostIds.set(0, currentHostObject.get("id"));
333 334
334 AfeUtils.changeHostLocks(hostIds, lock, "Host " + hostname, new SimpleCa llback() { 335 AfeUtils.changeHostLocks(hostIds, lock, "Host " + hostname, new SimpleCa llback() {
335 public void doCallback(Object source) { 336 public void doCallback(Object source) {
336 refresh(); 337 refresh();
337 } 338 }
338 }); 339 });
339 } 340 }
340 341
341 private boolean isJobRow(JSONObject row) { 342 private boolean isJobRow(JSONObject row) {
342 String type = Utils.jsonToString(row.get("type")); 343 String type = Utils.jsonToString(row.get("type"));
343 return type.equals("Job"); 344 return type.equals("Job");
344 } 345 }
345 346
346 public boolean isRowSelectable(JSONObject row) { 347 public boolean isRowSelectable(JSONObject row) {
347 return isJobRow(row); 348 return isJobRow(row);
348 } 349 }
349 } 350 }
OLDNEW
« no previous file with comments | « frontend/client/src/autotest/afe/ControlTypeSelectDisplay.java ('k') | frontend/client/src/autotest/afe/HostListView.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698