1 package autotest.tko; 2 3 import autotest.common.JsonRpcCallback; 4 import autotest.common.JsonRpcProxy; 5 import autotest.common.SimpleCallback; 6 import autotest.common.StaticDataRepository; 7 import autotest.common.Utils; 8 import autotest.common.ui.NotifyManager; 9 10 import com.google.gwt.event.dom.client.ClickEvent; 11 import com.google.gwt.event.dom.client.ClickHandler; 12 import com.google.gwt.json.client.JSONObject; 13 import com.google.gwt.json.client.JSONString; 14 import com.google.gwt.json.client.JSONValue; 15 import com.google.gwt.user.client.ui.Anchor; 16 import com.google.gwt.user.client.ui.Button; 17 import com.google.gwt.user.client.ui.DialogBox; 18 import com.google.gwt.user.client.ui.HTML; 19 import com.google.gwt.user.client.ui.HorizontalPanel; 20 import com.google.gwt.user.client.ui.ListBox; 21 import com.google.gwt.user.client.ui.Panel; 22 import com.google.gwt.user.client.ui.StackPanel; 23 import com.google.gwt.user.client.ui.TextBox; 24 import com.google.gwt.user.client.ui.VerticalPanel; 25 26 public class TestLabelManager implements ClickHandler { 27 public static final String INVALIDATED_LABEL = "invalidated"; 28 private static final String ADD_TEXT = "Add label"; 29 private static final String REMOVE_TEXT = "Remove label"; 30 private static final int STACK_SELECT = 0, STACK_CREATE = 1; 31 32 private static final TestLabelManager theInstance = new TestLabelManager(); 33 34 private static final JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(); 35 private static NotifyManager notifyManager = NotifyManager.getInstance(); 36 private static StaticDataRepository staticData = StaticDataRepository.getRepository(); 37 38 private DialogBox selectLabelDialog = new DialogBox(false, true); // modal 39 private ListBox labelList = new ListBox(); 40 private TextBox newLabelName = new TextBox(); 41 private Anchor createLabelLink, cancelCreateLink; 42 private StackPanel stack = new StackPanel(); 43 private Button submitButton = new Button(), cancelButton = new Button("Cancel"); 44 45 private JSONObject currentTestCondition; 46 47 TestLabelManager()48 private TestLabelManager() { 49 createLabelLink = new Anchor("Create new label"); 50 cancelCreateLink = new Anchor("Cancel create label"); 51 ClickHandler linkListener = new ClickHandler() { 52 public void onClick(ClickEvent event) { 53 if (event.getSource() == createLabelLink) { 54 stack.showStack(STACK_CREATE); 55 } else { 56 stack.showStack(STACK_SELECT); 57 } 58 } 59 }; 60 createLabelLink.addClickHandler(linkListener); 61 cancelCreateLink.addClickHandler(linkListener); 62 63 Panel selectPanel = new VerticalPanel(); 64 selectPanel.add(new HTML("Select label:")); 65 selectPanel.add(labelList); 66 selectPanel.add(createLabelLink); 67 stack.add(selectPanel); 68 69 Panel createPanel = new VerticalPanel(); 70 createPanel.add(new HTML("Enter label name:")); 71 createPanel.add(newLabelName); 72 createPanel.add(cancelCreateLink); 73 stack.add(createPanel); 74 75 Panel buttonPanel = new HorizontalPanel(); 76 buttonPanel.add(submitButton); 77 buttonPanel.add(cancelButton); 78 79 Panel dialogPanel = new VerticalPanel(); 80 dialogPanel.add(stack); 81 dialogPanel.add(buttonPanel); 82 selectLabelDialog.add(dialogPanel); 83 84 submitButton.addClickHandler(this); 85 cancelButton.addClickHandler(this); 86 } 87 getManager()88 public static TestLabelManager getManager() { 89 return theInstance; 90 } 91 setLinksVisible(boolean visible)92 private void setLinksVisible(boolean visible) { 93 createLabelLink.setVisible(visible); 94 cancelCreateLink.setVisible(visible); 95 } 96 handleAddLabels(JSONObject testCondition)97 public void handleAddLabels(JSONObject testCondition) { 98 currentTestCondition = testCondition; 99 newLabelName.setText(""); 100 101 String[] labels = Utils.JSONObjectsToStrings(staticData.getData("test_labels").isArray(), 102 "name"); 103 if (labels.length == 0) { 104 setLinksVisible(false); 105 stack.showStack(STACK_CREATE); 106 } else { 107 setLinksVisible(true); 108 stack.showStack(STACK_SELECT); 109 populateLabelList(labels); 110 } 111 showDialog(ADD_TEXT); 112 } 113 handleRemoveLabels(JSONObject testCondition)114 public void handleRemoveLabels(JSONObject testCondition) { 115 currentTestCondition = testCondition; 116 117 rpcProxy.rpcCall("get_test_labels_for_tests", currentTestCondition, new JsonRpcCallback() { 118 @Override 119 public void onSuccess(JSONValue result) { 120 String[] labels = Utils.JSONObjectsToStrings(result.isArray(), "name"); 121 if (labels.length == 0) { 122 notifyManager.showMessage("No labels on selected tests"); 123 return; 124 } 125 populateLabelList(labels); 126 setLinksVisible(false); 127 stack.showStack(STACK_SELECT); 128 showDialog(REMOVE_TEXT); 129 } 130 }); 131 } 132 showDialog(String actionText)133 private void showDialog(String actionText) { 134 submitButton.setText(actionText); 135 selectLabelDialog.setText(actionText); 136 selectLabelDialog.center(); 137 } 138 populateLabelList(String[] labels)139 private void populateLabelList(String[] labels) { 140 labelList.clear(); 141 for (String label : labels) { 142 labelList.addItem(label); 143 } 144 } 145 onClick(ClickEvent event)146 public void onClick(ClickEvent event) { 147 selectLabelDialog.hide(); 148 149 if (event.getSource() == cancelButton) { 150 return; 151 } 152 153 if (submitButton.getText().equals(ADD_TEXT)) { 154 SimpleCallback doAdd = new SimpleCallback() { 155 public void doCallback(Object source) { 156 addOrRemoveLabel((String) source, true); 157 } 158 }; 159 160 if (stack.getSelectedIndex() == STACK_CREATE) { 161 addLabel(newLabelName.getText(), doAdd); 162 } else { 163 doAdd.doCallback(getSelectedLabel()); 164 } 165 } else { 166 assert (submitButton.getText().equals(REMOVE_TEXT)); 167 addOrRemoveLabel(getSelectedLabel(), false); 168 } 169 } 170 getSelectedLabel()171 private String getSelectedLabel() { 172 return labelList.getItemText(labelList.getSelectedIndex()); 173 } 174 addLabel(final String name, final SimpleCallback onFinished)175 private void addLabel(final String name, final SimpleCallback onFinished) { 176 JSONObject args = new JSONObject(); 177 args.put("name", new JSONString(name)); 178 rpcProxy.rpcCall("add_test_label", args, new JsonRpcCallback() { 179 @Override 180 public void onSuccess(JSONValue result) { 181 onFinished.doCallback(name); 182 } 183 }); 184 updateLabels(); 185 } 186 addOrRemoveLabel(String label, boolean add)187 private void addOrRemoveLabel(String label, boolean add) { 188 String rpcMethod; 189 if (add) { 190 rpcMethod = "test_label_add_tests"; 191 } else { 192 rpcMethod = "test_label_remove_tests"; 193 } 194 195 JSONObject args = Utils.copyJSONObject(currentTestCondition); 196 args.put("label_id", new JSONString(label)); 197 rpcProxy.rpcCall(rpcMethod, args, new JsonRpcCallback() { 198 @Override 199 public void onSuccess(JSONValue result) { 200 notifyManager.showMessage("Labels modified successfully"); 201 } 202 }); 203 } 204 updateLabels()205 private void updateLabels() { 206 rpcProxy.rpcCall("get_test_labels", null, new JsonRpcCallback() { 207 @Override 208 public void onSuccess(JSONValue result) { 209 staticData.setData("test_labels", result); 210 } 211 }); 212 } 213 handleInvalidate(JSONObject condition)214 public void handleInvalidate(JSONObject condition) { 215 currentTestCondition = condition; 216 addOrRemoveLabel(INVALIDATED_LABEL, true); 217 } 218 handleRevalidate(JSONObject condition)219 public void handleRevalidate(JSONObject condition) { 220 currentTestCondition = condition; 221 addOrRemoveLabel(INVALIDATED_LABEL, false); 222 } 223 } 224