| package autotest.tko; |
| |
| import autotest.common.JsonRpcCallback; |
| import autotest.common.JsonRpcProxy; |
| import autotest.common.SimpleCallback; |
| import autotest.common.StaticDataRepository; |
| import autotest.common.Utils; |
| import autotest.common.ui.NotifyManager; |
| |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| 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.ui.Anchor; |
| import com.google.gwt.user.client.ui.Button; |
| import com.google.gwt.user.client.ui.DialogBox; |
| import com.google.gwt.user.client.ui.HTML; |
| import com.google.gwt.user.client.ui.HorizontalPanel; |
| import com.google.gwt.user.client.ui.ListBox; |
| import com.google.gwt.user.client.ui.Panel; |
| import com.google.gwt.user.client.ui.StackPanel; |
| import com.google.gwt.user.client.ui.TextBox; |
| import com.google.gwt.user.client.ui.VerticalPanel; |
| |
| public class TestLabelManager implements ClickHandler { |
| public static final String INVALIDATED_LABEL = "invalidated"; |
| private static final String ADD_TEXT = "Add label"; |
| private static final String REMOVE_TEXT = "Remove label"; |
| private static final int STACK_SELECT = 0, STACK_CREATE = 1; |
| |
| private static final TestLabelManager theInstance = new TestLabelManager(); |
| |
| private static final JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(); |
| private static NotifyManager notifyManager = NotifyManager.getInstance(); |
| private static StaticDataRepository staticData = StaticDataRepository.getRepository(); |
| |
| private DialogBox selectLabelDialog = new DialogBox(false, true); // modal |
| private ListBox labelList = new ListBox(); |
| private TextBox newLabelName = new TextBox(); |
| private Anchor createLabelLink, cancelCreateLink; |
| private StackPanel stack = new StackPanel(); |
| private Button submitButton = new Button(), cancelButton = new Button("Cancel"); |
| |
| private JSONObject currentTestCondition; |
| |
| |
| private TestLabelManager() { |
| createLabelLink = new Anchor("Create new label"); |
| cancelCreateLink = new Anchor("Cancel create label"); |
| ClickHandler linkListener = new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| if (event.getSource() == createLabelLink) { |
| stack.showStack(STACK_CREATE); |
| } else { |
| stack.showStack(STACK_SELECT); |
| } |
| } |
| }; |
| createLabelLink.addClickHandler(linkListener); |
| cancelCreateLink.addClickHandler(linkListener); |
| |
| Panel selectPanel = new VerticalPanel(); |
| selectPanel.add(new HTML("Select label:")); |
| selectPanel.add(labelList); |
| selectPanel.add(createLabelLink); |
| stack.add(selectPanel); |
| |
| Panel createPanel = new VerticalPanel(); |
| createPanel.add(new HTML("Enter label name:")); |
| createPanel.add(newLabelName); |
| createPanel.add(cancelCreateLink); |
| stack.add(createPanel); |
| |
| Panel buttonPanel = new HorizontalPanel(); |
| buttonPanel.add(submitButton); |
| buttonPanel.add(cancelButton); |
| |
| Panel dialogPanel = new VerticalPanel(); |
| dialogPanel.add(stack); |
| dialogPanel.add(buttonPanel); |
| selectLabelDialog.add(dialogPanel); |
| |
| submitButton.addClickHandler(this); |
| cancelButton.addClickHandler(this); |
| } |
| |
| public static TestLabelManager getManager() { |
| return theInstance; |
| } |
| |
| private void setLinksVisible(boolean visible) { |
| createLabelLink.setVisible(visible); |
| cancelCreateLink.setVisible(visible); |
| } |
| |
| public void handleAddLabels(JSONObject testCondition) { |
| currentTestCondition = testCondition; |
| newLabelName.setText(""); |
| |
| String[] labels = Utils.JSONObjectsToStrings(staticData.getData("test_labels").isArray(), |
| "name"); |
| if (labels.length == 0) { |
| setLinksVisible(false); |
| stack.showStack(STACK_CREATE); |
| } else { |
| setLinksVisible(true); |
| stack.showStack(STACK_SELECT); |
| populateLabelList(labels); |
| } |
| showDialog(ADD_TEXT); |
| } |
| |
| public void handleRemoveLabels(JSONObject testCondition) { |
| currentTestCondition = testCondition; |
| |
| rpcProxy.rpcCall("get_test_labels_for_tests", currentTestCondition, new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| String[] labels = Utils.JSONObjectsToStrings(result.isArray(), "name"); |
| if (labels.length == 0) { |
| notifyManager.showMessage("No labels on selected tests"); |
| return; |
| } |
| populateLabelList(labels); |
| setLinksVisible(false); |
| stack.showStack(STACK_SELECT); |
| showDialog(REMOVE_TEXT); |
| } |
| }); |
| } |
| |
| private void showDialog(String actionText) { |
| submitButton.setText(actionText); |
| selectLabelDialog.setText(actionText); |
| selectLabelDialog.center(); |
| } |
| |
| private void populateLabelList(String[] labels) { |
| labelList.clear(); |
| for (String label : labels) { |
| labelList.addItem(label); |
| } |
| } |
| |
| public void onClick(ClickEvent event) { |
| selectLabelDialog.hide(); |
| |
| if (event.getSource() == cancelButton) { |
| return; |
| } |
| |
| if (submitButton.getText().equals(ADD_TEXT)) { |
| SimpleCallback doAdd = new SimpleCallback() { |
| public void doCallback(Object source) { |
| addOrRemoveLabel((String) source, true); |
| } |
| }; |
| |
| if (stack.getSelectedIndex() == STACK_CREATE) { |
| addLabel(newLabelName.getText(), doAdd); |
| } else { |
| doAdd.doCallback(getSelectedLabel()); |
| } |
| } else { |
| assert (submitButton.getText().equals(REMOVE_TEXT)); |
| addOrRemoveLabel(getSelectedLabel(), false); |
| } |
| } |
| |
| private String getSelectedLabel() { |
| return labelList.getItemText(labelList.getSelectedIndex()); |
| } |
| |
| private void addLabel(final String name, final SimpleCallback onFinished) { |
| JSONObject args = new JSONObject(); |
| args.put("name", new JSONString(name)); |
| rpcProxy.rpcCall("add_test_label", args, new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| onFinished.doCallback(name); |
| } |
| }); |
| updateLabels(); |
| } |
| |
| private void addOrRemoveLabel(String label, boolean add) { |
| String rpcMethod; |
| if (add) { |
| rpcMethod = "test_label_add_tests"; |
| } else { |
| rpcMethod = "test_label_remove_tests"; |
| } |
| |
| JSONObject args = Utils.copyJSONObject(currentTestCondition); |
| args.put("label_id", new JSONString(label)); |
| rpcProxy.rpcCall(rpcMethod, args, new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| notifyManager.showMessage("Labels modified successfully"); |
| } |
| }); |
| } |
| |
| private void updateLabels() { |
| rpcProxy.rpcCall("get_test_labels", null, new JsonRpcCallback() { |
| @Override |
| public void onSuccess(JSONValue result) { |
| staticData.setData("test_labels", result); |
| } |
| }); |
| } |
| |
| public void handleInvalidate(JSONObject condition) { |
| currentTestCondition = condition; |
| addOrRemoveLabel(INVALIDATED_LABEL, true); |
| } |
| |
| public void handleRevalidate(JSONObject condition) { |
| currentTestCondition = condition; |
| addOrRemoveLabel(INVALIDATED_LABEL, false); |
| } |
| } |