summaryrefslogtreecommitdiff
path: root/frontend/client/src/autotest/planner/triage/TriagePopup.java
blob: 6ab48aad1eb63f3ec3f53c30fcedc5e68d05b895 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package autotest.planner.triage;

import autotest.common.JsonRpcCallback;
import autotest.common.JsonRpcProxy;
import autotest.common.StaticDataRepository;
import autotest.common.Utils;
import autotest.common.ui.SimplifiedList;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.HasCloseHandlers;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
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.HasText;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.PopupPanel;

import java.util.List;

public class TriagePopup implements ClickHandler, CloseHandler<PopupPanel> {
    public static interface Display extends HasCloseHandlers<PopupPanel> {
        public HasClickHandlers getCloseButton();
        public HasText getLabelsField();
        public HasText getKeyvalsField();
        public HasText getBugsField();
        public HasText getReasonField();
        public SimplifiedList getHostActionField();
        public SimplifiedList getTestActionField();
        public HasValue<Boolean> getInvalidateField();
        public HasClickHandlers getApplyButton();
        public void center();
        public void hide();
    }
    
    public static interface Listener {
        public void onTriage();
    }
    
    private Display display;
    private Listener listener;
    private List<Integer> ids;
    private boolean triaged = false;
    
    public TriagePopup(Listener listener, List<Integer> ids) {
        this.listener = listener;
        this.ids = ids;
    }
    
    public void bindDisplay(Display display) {
        this.display = display;
        display.addCloseHandler(this);
        populateActionsFields();
        setHandlers();
    }
    
    public void render() {
        display.center();
    }
    
    public List<Integer> getIds() {
        return ids;
    }
    
    private void populateActionsFields() {
        populateList("host_actions", display.getHostActionField());
        populateList("test_actions", display.getTestActionField());
    }
    
    private void populateList(String staticDataKey, SimplifiedList list) {
        JSONArray choices = StaticDataRepository.getRepository().getData(staticDataKey).isArray();
        for (int i = 0; i < choices.size(); i++) {
            String item = choices.get(i).isString().stringValue();
            list.addItem(item, item);
        }
    }
    
    private void setHandlers() {
        display.getCloseButton().addClickHandler(this);
        display.getApplyButton().addClickHandler(this);
    }
    
    @Override
    public void onClick(ClickEvent event) {
        if (event.getSource() == display.getCloseButton()) {
            display.hide();
        } else {
            assert event.getSource() == display.getApplyButton();
            JsonRpcProxy proxy = JsonRpcProxy.getProxy();
            
            JSONObject params = getParams();
            
            proxy.rpcCall("process_failures", params, new JsonRpcCallback() {
                @Override
                public void onSuccess(JSONValue result) {
                    triaged = true;
                    display.hide();
                }
            });
        }
    }
    
    private JSONObject getParams() {
        JSONObject params = new JSONObject();
        params.put("failure_ids", Utils.integersToJSON(ids));
        params.put("host_action", new JSONString(display.getHostActionField().getSelectedName()));
        params.put("test_action", new JSONString(display.getTestActionField().getSelectedName()));
        
        if (!display.getLabelsField().getText().trim().equals("")) {
            params.put("labels", parseCommaDelimited(display.getLabelsField().getText()));
        }
        
        if (!display.getKeyvalsField().getText().trim().equals("")) {
            JSONObject keyvals = new JSONObject();
            for (String keyval : display.getKeyvalsField().getText().split("\n")) {
                String split[] = keyval.split("=", 2);
                keyvals.put(split[0].trim(), new JSONString(split[1].trim()));
            }
            params.put("keyvals", keyvals);
        }
        
        if (!display.getBugsField().getText().trim().equals("")) {
            params.put("bugs", parseCommaDelimited(display.getBugsField().getText()));
        }
        
        if (!display.getReasonField().getText().trim().equals("")) {
            params.put("reason", new JSONString(display.getReasonField().getText()));
        }
        
        params.put("invalidate", JSONBoolean.getInstance(display.getInvalidateField().getValue()));
        
        return params;
    }
    
    private JSONArray parseCommaDelimited(String line) {
        JSONArray values = new JSONArray();
        for (String value : line.split(",")) {
            values.set(values.size(), new JSONString(value.trim()));
        }
        return values;
    }

    @Override
    public void onClose(CloseEvent<PopupPanel> event) {
        if (triaged) {
            listener.onTriage();
        }
    }
}