Package org.waveprotocol.box.webclient.stat.dialog

Source Code of org.waveprotocol.box.webclient.stat.dialog.StatDialog

/**
* 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>");
  }
}
TOP

Related Classes of org.waveprotocol.box.webclient.stat.dialog.StatDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.