com.data2semantics.yasgui.client.helpers.ErrorHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.data2semantics.yasgui.client.helpers.ErrorHelper.java

Source

package com.data2semantics.yasgui.client.helpers;

/*
 * #%L
 * YASGUI
 * %%
 * Copyright (C) 2013 Laurens Rietveld
 * %%
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * #L%
 */

import com.data2semantics.yasgui.client.View;
import com.data2semantics.yasgui.client.configmenu.ReportIssue;
import com.data2semantics.yasgui.client.settings.Imgs;
import com.data2semantics.yasgui.client.settings.ZIndexes;
import com.data2semantics.yasgui.client.tab.QueryTab;
import com.google.common.collect.HashMultimap;
import com.google.gwt.http.client.URL;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.events.CloseClickEvent;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

public class ErrorHelper {
    private View view;

    public ErrorHelper(View view) {
        this.view = view;
    }

    public void onQueryError(String tabId, String error) {
        if (view.getElements() != null) {
            view.getElements().onQueryFinish();
        }
        QueryTab tab = (QueryTab) view.getTabs().getTab(tabId);
        onQueryError(error, tab.getTabSettings().getEndpoint(), tab.getTabSettings().getQueryString(),
                tab.getTabSettings().getQueryArgs());
    }

    /**
     * Show the error window for a trowable. Prints the complete stack trace
     * @param throwable
     */
    public void onError(Throwable e) {
        onError(e, view.getSettings().bugReportsSupported());
    }

    private void onError(final Throwable t, boolean allowBugReport) {
        Helper.onLoadingFinish();
        if (allowBugReport) {
            final Window window = getErrorWindow();
            VLayout content = new VLayout();
            content.setWidth100();
            content.addMember(getErrorLabel(getErrorMsg(t)));

            IButton debugButton = new IButton("Report this as a bug");
            debugButton.setIcon(Imgs.BUG.get());
            debugButton.setWidth(140);
            debugButton.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    window.destroy();
                    ReportIssue.report(view, t);
                }
            });
            content.addMember(debugButton);
            window.addItem(content);
            window.draw();
        } else {
            onError(getErrorMsg(t));
        }
        Helper.logExceptionToServer(t);
    }

    private void drawErrorWindow(Canvas content) {
        Window window = getErrorWindow();
        window.addItem(content);
        window.draw();
    }

    private Label getErrorLabel(String error) {
        Label label = new Label(error);
        label.setMargin(4);
        label.setHeight100();
        return label;
    }

    /**
     * Modal popup window to show on error
     * 
     * @param error
     */
    public void onError(String error) {
        Helper.onLoadingFinish();
        drawErrorWindow(getErrorLabel(error));
    }

    private Window getErrorWindow() {
        final Window window = new Window();
        window.setID("errorWindow");
        window.setDismissOnOutsideClick(true);
        window.setIsModal(true);
        window.setZIndex(ZIndexes.MODAL_WINDOWS);
        window.setAutoSize(true);
        window.setMinWidth(400);
        window.setShowMinimizeButton(false);
        window.setAutoCenter(true);
        window.setCanDragResize(true);
        window.addCloseClickHandler(new CloseClickHandler() {
            public void onCloseClick(CloseClickEvent event) {
                window.destroy();
            }
        });
        window.setShowTitle(false);
        return window;
    }

    /**
     * Display error when querying endpoint failed. Has buttons for opening query result page of endpoint itself on new page
     * 
     * @param error Html error msg
     * @param endpoint Used endpoint
     * @param query Used query
     * @param args 
     */
    public void onQueryError(String error, final String endpoint, final String query,
            final HashMultimap<String, String> args) {
        final Window window = getErrorWindow();
        window.setWidth(350);
        window.setZIndex(ZIndexes.MODAL_WINDOWS);
        VLayout vLayout = new VLayout();
        vLayout.setWidth100();
        Label label = new Label();
        label.setID("queryErrorMessage");
        label.setContents(error);
        label.setMargin(4);
        label.setHeight100();
        label.setWidth100();
        vLayout.addMember(label);

        HLayout buttons = new HLayout();
        buttons.setAlign(Alignment.CENTER);
        Button executeQuery = new Button("Open endpoint in new window");
        executeQuery.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                String url = endpoint + "?query=" + URL.encodeQueryString(query) + "&"
                        + Helper.getParamsAsString(args);
                com.google.gwt.user.client.Window.open(url, "_blank", null);
            }
        });
        executeQuery.setWidth(200);
        Button closeWindow = new Button("Close window");
        closeWindow.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                window.destroy();
            }
        });

        buttons.addMember(executeQuery);
        buttons.addMember(closeWindow);
        buttons.setWidth100();
        buttons.setLayoutAlign(Alignment.CENTER);
        vLayout.addMember(buttons);
        window.addItem(vLayout);
        window.draw();
    }

    public static String getErrorMsg(Throwable e) {
        String errorMsg;
        if (Helper.inDebugMode()) {
            errorMsg = Helper.getStackTraceAsString(e);
            errorMsg += "\nCaused by:\n" + Helper.getCausesStackTraceAsString(e);
        } else {
            errorMsg = e.getMessage();
        }
        return errorMsg;
    }
}