org.waveprotocol.box.webclient.stat.dialog.StatDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.waveprotocol.box.webclient.stat.dialog.StatDialog.java

Source

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.waveprotocol.box.webclient.stat.dialog;

import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import org.waveprotocol.box.stat.StatService;

import org.waveprotocol.box.stat.Timing;
import org.waveprotocol.wave.client.widget.dialog.DialogBox;
import org.waveprotocol.wave.client.widget.dialog.DialogBox.DialogButton;
import org.waveprotocol.wave.client.widget.popup.CenterPopupPositioner;
import org.waveprotocol.wave.client.widget.popup.PopupChrome;
import org.waveprotocol.wave.client.widget.popup.PopupChromeFactory;
import org.waveprotocol.wave.client.widget.popup.PopupFactory;
import org.waveprotocol.wave.client.widget.popup.UniversalPopup;

/**
 * Dialog to show client and server profiling statistics.
 *
 * @author akaplanov@gmail.com (A. Kaplanov)
 */
public class StatDialog {
    static private final String ID_ENABLE = "enable";
    static private final String ID_DISABLE = "disable";
    static private final String ID_CLEAR = "clear";

    private boolean isClient;
    private UniversalPopup popup;
    private HTMLPanel htmlPanel;
    private DialogButton targetButton;
    private DialogButton exitButton;

    static public void show() {
        StatDialog dialog = new StatDialog();
        dialog.showClientStatistic();
    }

    public StatDialog() {
        PopupChrome chrome = PopupChromeFactory.createPopupChrome();
        popup = PopupFactory.createPopup(Document.get().getElementById("app"), new CenterPopupPositioner(), chrome,
                true);
        htmlPanel = new HTMLPanel("");
        htmlPanel.addDomHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                Element e = event.getNativeEvent().getEventTarget().cast();
                if (e.getTagName().toLowerCase().equals("a")) {
                    event.preventDefault();
                    if (isClient) {
                        if (ID_ENABLE.equals(e.getId()) || ID_DISABLE.equals(e.getId())) {
                            Timing.setEnabled(!Timing.isEnabled());
                            showClientStatistic();
                        } else if (ID_CLEAR.equals(e.getId())) {
                            Timing.clearStatistics();
                            showClientStatistic();
                        }
                    } else {
                        String href = e.getPropertyString("href");
                        int index = href.lastIndexOf('/');
                        if (index != -1) {
                            showUrl(StatService.STAT_URL + href.substring(index + 1));
                        }
                    }
                }
            }
        }, ClickEvent.getType());

        ScrollPanel scroll = new ScrollPanel(htmlPanel);
        scroll.setSize(RootPanel.get().getOffsetWidth() - 100 + "px",
                RootPanel.get().getOffsetHeight() - 200 + "px");
        targetButton = new DialogBox.DialogButton("", new Command() {

            @Override
            public void execute() {
                if (isClient) {
                    showServerStatistic();
                } else {
                    showClientStatistic();
                }
            }
        });
        exitButton = new DialogBox.DialogButton("Exit", new Command() {

            @Override
            public void execute() {
                popup.hide();
            }
        });
        DialogBox.create(popup, "", scroll, new DialogBox.DialogButton[] { targetButton, exitButton });
    }

    private void showClientStatistic() {
        isClient = true;
        popup.getTitleBar().setTitleText("Client statistic");
        String control = (Timing.isEnabled() ? "<a id=\"" + ID_DISABLE + "\" href>Disable profiling</a>"
                : "<a id=\"" + ID_ENABLE + "\" href>Enable profiling</a>");
        String clear = "<a id=\"" + ID_CLEAR + "\" href>Clear</a>";
        show(control + " | " + clear + Timing.renderGlobalStatistics());
        targetButton.setTitle("Server statistic");
        popup.show();
    }

    private void showServerStatistic() {
        isClient = false;
        popup.getTitleBar().setTitleText("Server statistic");
        showUrl(StatService.STAT_URL);
        targetButton.setTitle("Client statistic");
        popup.show();
    }

    private void clear() {
        htmlPanel.getElement().setInnerHTML("");
    }

    private void showUrl(String url) {
        clear();
        RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url);

        requestBuilder.setCallback(new RequestCallback() {

            @Override
            public void onResponseReceived(Request request, Response response) {
                show(response.getText());
            }

            @Override
            public void onError(Request request, Throwable ex) {
                Window.alert(ex.getMessage());
            }
        });
        try {
            requestBuilder.send();
        } catch (RequestException ex) {
            Window.alert(ex.getMessage());
        }
    }

    private void show(final String html) {
        htmlPanel.getElement().setInnerHTML("<div style='padding: 10px'>" + html + "</div>");
    }
}