| package autotest.afe; |
| |
| import autotest.common.JsonRpcCallback; |
| import autotest.common.JsonRpcProxy; |
| import autotest.common.table.Filter; |
| import autotest.common.table.SelectionManager; |
| import autotest.common.table.TableDecorator; |
| import autotest.common.table.DynamicTable.DynamicTableListener; |
| import autotest.common.ui.ContextMenu; |
| import autotest.common.ui.NotifyManager; |
| import autotest.common.ui.TabView; |
| import autotest.common.ui.TableActionsPanel.TableActionsListener; |
| |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.i18n.client.DateTimeFormat; |
| import com.google.gwt.json.client.JSONArray; |
| import com.google.gwt.json.client.JSONNumber; |
| import com.google.gwt.json.client.JSONObject; |
| import com.google.gwt.json.client.JSONString; |
| import com.google.gwt.json.client.JSONValue; |
| import com.google.gwt.user.client.Command; |
| import com.google.gwt.user.client.ui.Button; |
| import com.google.gwt.user.client.ui.FlexTable; |
| import com.google.gwt.user.client.ui.HasAlignment; |
| import com.google.gwt.user.client.ui.HorizontalPanel; |
| import com.google.gwt.user.client.ui.Label; |
| import com.google.gwt.user.client.ui.Panel; |
| import com.google.gwt.user.client.ui.TextBox; |
| import com.google.gwt.user.client.ui.VerticalPanel; |
| import com.google.gwt.user.client.ui.Widget; |
| |
| import java.util.Set; |
| |
| public class RecurringView extends TabView implements TableActionsListener { |
| private static final int RECURRINGRUN_PER_PAGE = 30; |
| private static final int DEFAULT_LOOP_DELAY = 3600; |
| private static final int DEFAULT_LOOP_COUNT = 1; |
| |
| private RecurringSelectListener selectListener; |
| private RecurringTable recurringTable; |
| private TableDecorator tableDecorator; |
| private Filter ownerFilter; |
| private SelectionManager selectionManager; |
| private VerticalPanel createRecurringPanel; |
| private Label jobIdLbl = new Label(""); |
| private TextBox startDate = new TextBox(); |
| private TextBox loopDelay = new TextBox(); |
| private TextBox loopCount = new TextBox(); |
| private FlexTable createRecurTable; |
| |
| private JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(); |
| |
| interface RecurringSelectListener { |
| public void onRecurringSelected(int schedId); |
| } |
| |
| @Override |
| public String getElementId() { |
| return "recurring_list"; |
| } |
| |
| @Override |
| public void refresh() { |
| super.refresh(); |
| recurringTable.refresh(); |
| } |
| |
| public RecurringView(RecurringSelectListener listener) { |
| selectListener = listener; |
| } |
| |
| @Override |
| public void initialize() { |
| recurringTable = new RecurringTable(); |
| |
| recurringTable.setRowsPerPage(RECURRINGRUN_PER_PAGE); |
| recurringTable.setClickable(true); |
| recurringTable.addListener(new DynamicTableListener() { |
| public void onRowClicked(int rowIndex, JSONObject row, boolean isRightClick) { |
| JSONObject job = row.get("job").isObject(); |
| int jobId = (int) job.get("id").isNumber().doubleValue(); |
| selectListener.onRecurringSelected(jobId); |
| } |
| |
| public void onTableRefreshed() {} |
| }); |
| |
| tableDecorator = new TableDecorator(recurringTable); |
| tableDecorator.addPaginators(); |
| selectionManager = tableDecorator.addSelectionManager(false); |
| recurringTable.setWidgetFactory(selectionManager); |
| tableDecorator.addTableActionsPanel(this, true); |
| addWidget(tableDecorator, "recurring_table"); |
| |
| |
| ownerFilter = new JobOwnerFilter("owner__login"); |
| recurringTable.addFilter(ownerFilter); |
| Panel ownerFilterPanel = new HorizontalPanel(); |
| ownerFilterPanel.add(new Label("View recurring jobs for user:")); |
| ownerFilterPanel.add(ownerFilter.getWidget()); |
| addWidget(ownerFilterPanel, "recurring_user_list"); |
| |
| initRecurringPanel(); |
| |
| addWidget(createRecurringPanel, "recurring_create_panel"); |
| } |
| |
| public ContextMenu getActionMenu() { |
| ContextMenu menu = new ContextMenu(); |
| menu.addItem("Remove recurring runs", new Command() { |
| public void execute() { |
| removeSelectedRecurring(); |
| } |
| }); |
| return menu; |
| } |
| |
| private void initRecurringPanel() { |
| createRecurTable = new FlexTable(); |
| |
| Label createLbl = new Label("Creating recurring job"); |
| Button createBtn = new Button("Create recurring job"); |
| Button resetBtn = new Button("Reset"); |
| Button cancelBtn = new Button("Cancel"); |
| |
| createRecurringPanel = new VerticalPanel(); |
| createRecurringPanel.setVisible(false); |
| |
| createLbl.setStyleName("title"); |
| createLbl.setHorizontalAlignment(HasAlignment.ALIGN_CENTER); |
| |
| setCreateTableRow(0, "Template Job Id:", jobIdLbl); |
| setCreateTableRow(1, "Start time (on server):", startDate); |
| setCreateTableRow(2, "Loop delay (in sec.):", loopDelay); |
| setCreateTableRow(3, "Loop count:", loopCount); |
| |
| createRecurTable.setWidget(4, 0, createBtn); |
| createRecurTable.setWidget(4, 1, resetBtn); |
| createRecurTable.setWidget(4, 2, cancelBtn); |
| |
| createRecurringPanel.add(createLbl); |
| createRecurringPanel.add(createRecurTable); |
| |
| resetBtn.addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| resetCreate(); |
| } |
| }); |
| |
| createBtn.addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| submitRecurringJob(); |
| } |
| }); |
| |
| cancelBtn.addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| createRecurringPanel.setVisible(false); |
| } |
| }); |
| |
| } |
| |
| private void setCreateTableRow(int row, String name, Widget control) { |
| createRecurTable.setText(row, 0, name); |
| createRecurTable.setWidget(row, 1, control); |
| createRecurTable.getFlexCellFormatter().setStyleName(row, 0, "field-name"); |
| } |
| |
| public void createRecurringJob(int jobId) { |
| createRecurringPanel.setVisible(true); |
| jobIdLbl.setText(Integer.toString(jobId)); |
| resetCreate(); |
| } |
| |
| private void submitRecurringJob() { |
| final int delayValue, countValue; |
| try { |
| delayValue = AfeUtils.parsePositiveIntegerInput(loopDelay.getText(), |
| "loop delay"); |
| countValue = AfeUtils.parsePositiveIntegerInput(loopCount.getText(), |
| "loop count"); |
| checkDate(); |
| } catch (IllegalArgumentException exc) { |
| return; |
| } |
| |
| JSONObject args = new JSONObject(); |
| args.put("job_id", new JSONNumber(Integer.parseInt(jobIdLbl.getText()))); |
| args.put("start_date", new JSONString(startDate.getText())); |
| args.put("loop_period", new JSONNumber(delayValue)); |
| args.put("loop_count", new JSONNumber(countValue)); |
| |
| rpcProxy.rpcCall("create_recurring_run", args, new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| int id = (int) result.isNumber().doubleValue(); |
| createRecurringPanel.setVisible(false); |
| NotifyManager.getInstance().showMessage("Recurring run " + |
| Integer.toString(id) + |
| " created"); |
| refresh(); |
| } |
| }); |
| } |
| |
| private void resetCreate() { |
| getServerTime(); |
| loopDelay.setText(Integer.toString(DEFAULT_LOOP_DELAY)); |
| loopCount.setText(Integer.toString(DEFAULT_LOOP_COUNT)); |
| } |
| |
| private void getServerTime() { |
| rpcProxy.rpcCall("get_server_time", null, new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| String sTime = result.isString().stringValue(); |
| startDate.setText(sTime); |
| } |
| }); |
| } |
| |
| private void checkDate() { |
| try { |
| DateTimeFormat fmt = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm"); |
| fmt.parse(startDate.getText()); |
| } |
| catch (IllegalArgumentException exc) { |
| String error = "Please enter a correct date/time " + |
| "format: yyyy-MM-dd HH:mm"; |
| NotifyManager.getInstance().showError(error); |
| throw new IllegalArgumentException(); |
| } |
| } |
| |
| private void removeSelectedRecurring() { |
| Set<JSONObject> selectedSet = selectionManager.getSelectedObjects(); |
| if (selectedSet.isEmpty()) { |
| NotifyManager.getInstance().showError("No recurring run selected"); |
| return; |
| } |
| |
| JSONArray ids = new JSONArray(); |
| for(JSONObject jsonObj : selectedSet) { |
| ids.set(ids.size(), jsonObj.get("id")); |
| } |
| |
| JSONObject params = new JSONObject(); |
| params.put("id__in", ids); |
| callRemove(params); |
| } |
| |
| private void callRemove(JSONObject params) { |
| JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(); |
| rpcProxy.rpcCall("delete_recurring_runs", params, |
| new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| NotifyManager.getInstance().showMessage("Recurring runs " + |
| "removed"); |
| refresh(); |
| } |
| }); |
| } |
| } |