Home | History | Annotate | Download | only in tko
      1 package autotest.tko;
      2 
      3 import autotest.common.CustomHistory;
      4 import autotest.common.JsonRpcCallback;
      5 import autotest.common.JsonRpcProxy;
      6 import autotest.common.Utils;
      7 import autotest.common.CustomHistory.CustomHistoryListener;
      8 import autotest.common.CustomHistory.HistoryToken;
      9 import autotest.common.ui.NotifyManager;
     10 import autotest.common.ui.SimpleDialog;
     11 import autotest.tko.TableView.TableSwitchListener;
     12 
     13 import com.google.gwt.event.dom.client.ClickEvent;
     14 import com.google.gwt.event.dom.client.ClickHandler;
     15 import com.google.gwt.json.client.JSONNumber;
     16 import com.google.gwt.json.client.JSONObject;
     17 import com.google.gwt.json.client.JSONString;
     18 import com.google.gwt.json.client.JSONValue;
     19 import com.google.gwt.user.client.Window;
     20 import com.google.gwt.user.client.ui.Anchor;
     21 import com.google.gwt.user.client.ui.Composite;
     22 import com.google.gwt.user.client.ui.FlexTable;
     23 import com.google.gwt.user.client.ui.HasVerticalAlignment;
     24 import com.google.gwt.user.client.ui.TextBox;
     25 import com.google.gwt.user.client.ui.Widget;
     26 
     27 import java.util.Map;
     28 
     29 public abstract class GraphingFrontend extends Composite
     30                                        implements CustomHistoryListener, ClickHandler {
     31     public static final String HISTORY_TOKEN = "embedded_query";
     32 
     33     protected FlexTable table = new FlexTable();
     34     protected JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
     35     protected Anchor embeddingLink = new Anchor("[Link to this graph]");
     36     protected TableSwitchListener listener;
     37 
     38     public abstract void refresh();
     39     public abstract void addToHistory(Map<String, String> args);
     40     public abstract void handleHistoryArguments(Map<String, String> args);
     41 
     42     /**
     43      * This function allows subclasses to add parameters to the call to get_embedding_id() RPC,
     44      * called when a user requests an embeddable link to a graph.
     45      */
     46     protected abstract void addAdditionalEmbeddingParams(JSONObject params);
     47 
     48     /**
     49      * @return a short text ID for the frontend
     50      */
     51     public abstract String getFrontendId();
     52 
     53     protected GraphingFrontend() {
     54         CustomHistory.addHistoryListener(this);
     55         embeddingLink.addClickHandler(this);
     56     }
     57 
     58     public void onClick(ClickEvent event) {
     59         assert event.getSource() == embeddingLink;
     60         JSONObject params = new JSONObject();
     61         params.put("url_token", new JSONString(CustomHistory.getLastHistoryToken().toString()));
     62         addAdditionalEmbeddingParams(params);
     63 
     64         rpcProxy.rpcCall("get_embedding_id", params, new JsonRpcCallback() {
     65             @Override
     66             public void onSuccess(JSONValue result) {
     67                 String id = Utils.jsonToString(result);
     68                 showEmbeddedGraphHtml(id);
     69             }
     70         });
     71     }
     72 
     73     private void showEmbeddedGraphHtml(String embeddedGraphId) {
     74         StringBuilder link = new StringBuilder();
     75         link.append("<a href=\"http://");
     76         link.append(Window.Location.getHost());
     77         link.append(Window.Location.getPath());
     78         link.append("#");
     79         link.append(HISTORY_TOKEN);
     80         link.append("=");
     81         link.append(embeddedGraphId);
     82 
     83         link.append("\"><img border=\"0\" src=\"http://");
     84         link.append(Window.Location.getHost());
     85 
     86         link.append(JsonRpcProxy.TKO_BASE_URL);
     87         link.append("plot/?id=");
     88         link.append(embeddedGraphId);
     89 
     90         link.append("&max_age=10");
     91 
     92         link.append("\"></a>");
     93 
     94         TextBox linkBox = new TextBox();
     95         linkBox.setText(link.toString());
     96         linkBox.setWidth("100%");
     97         linkBox.setSelectionRange(0, link.length());
     98 
     99         new SimpleDialog("Paste HTML to embed in website:", linkBox).center();
    100     }
    101 
    102     protected void setListener(TableSwitchListener listener) {
    103         this.listener = listener;
    104     }
    105 
    106     protected void addControl(String text, Widget control) {
    107         int row = TkoUtils.addControlRow(table, text, control);
    108         table.getFlexCellFormatter().setColSpan(row, 1, 2);
    109         table.getFlexCellFormatter().setWidth(row, 1, "100%");
    110         table.getFlexCellFormatter().setVerticalAlignment(row, 0, HasVerticalAlignment.ALIGN_TOP);
    111     }
    112 
    113     // TODO(showard): merge this with the code from SavedQueriesControl
    114     public void onHistoryChanged(Map<String, String> arguments) {
    115         final String idString = arguments.get(HISTORY_TOKEN);
    116         if (idString == null) {
    117             return;
    118         }
    119 
    120         JSONObject args = new JSONObject();
    121         args.put("id", new JSONNumber(Integer.parseInt(idString)));
    122         rpcProxy.rpcCall("get_embedded_query_url_token", args, new JsonRpcCallback() {
    123             @Override
    124             public void onSuccess(JSONValue result) {
    125                 String tokenString = Utils.jsonToString(result);
    126                 HistoryToken token;
    127                 try {
    128                     token = HistoryToken.fromString(tokenString);
    129                 } catch (IllegalArgumentException exc) {
    130                     NotifyManager.getInstance().showError("Invalid embedded query token " +
    131                                                           tokenString);
    132                     return;
    133                 }
    134 
    135                 // since this is happening asynchronously, the history may have changed, so ensure
    136                 // it's set back to what it should be.
    137                 HistoryToken shortToken = new HistoryToken();
    138                 shortToken.put(HISTORY_TOKEN, idString);
    139                 CustomHistory.newItem(shortToken);
    140 
    141                 CustomHistory.simulateHistoryToken(token);
    142             }
    143         });
    144     }
    145 }
    146