it.unibz.instasearch.ui.ReportErrorDialog.java Source code

Java tutorial

Introduction

Here is the source code for it.unibz.instasearch.ui.ReportErrorDialog.java

Source

/*
 * Copyright (c) 2009 Andrejs Jermakovics.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Andrejs Jermakovics - initial implementation
 */
package it.unibz.instasearch.ui;

import it.unibz.instasearch.InstaSearchPlugin;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.osgi.framework.Constants;

public class ReportErrorDialog extends ErrorDialog {
    private static final int REPORT_BUTTON_ID = IDialogConstants.CLIENT_ID + 1;
    private IStatus status;
    private Link newTicketLink;

    /**
     * @param parentShell
     * @param dialogTitle
     * @param message
     * @param status
     * @param displayMask
     */
    public ReportErrorDialog(Shell parentShell, String dialogTitle, String message, IStatus status,
            int displayMask) {
        super(parentShell, dialogTitle, message, status, displayMask);

        this.status = status;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.ErrorDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        super.createButtonsForButtonBar(parent);

        createButton(parent, REPORT_BUTTON_ID, "Report", true);
    }

    @Override
    protected List createDropDownList(Composite parent) {
        List list = super.createDropDownList(parent);

        if (newTicketLink == null) {
            newTicketLink = new Link(parent, SWT.NONE);
            newTicketLink.setText("You can also open a <a>new ticket</a>");
            newTicketLink.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    try {
                        InstaSearchUI.showHomePage();
                    } catch (Exception ex) {
                        InstaSearchPlugin.log(ex);
                        newTicketLink.setEnabled(false);
                    }
                }
            });

            GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL
                    | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL); //
            data.horizontalSpan = 2;
            newTicketLink.setLayoutData(data);
        }

        list.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                newTicketLink.dispose();
                newTicketLink = null;
            }
        });

        return list;
    }

    public static void openReportError(Shell parentShell, String title, String message, IStatus status) {

        int displayMask = IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR;
        final ReportErrorDialog dialog = new ReportErrorDialog(parentShell, title, message, status, displayMask);

        Display display = PlatformUI.getWorkbench().getDisplay();
        if (display == null || display.isDisposed())
            return;

        display.asyncExec(new Runnable() {
            public void run() {
                dialog.open();
            }
        });

    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.ErrorDialog#buttonPressed(int)
     */
    @Override
    protected void buttonPressed(int id) {
        if (id == REPORT_BUTTON_ID) {
            try {
                reportError();
                close();
            } catch (Exception e) {
                e.printStackTrace();
                InstaSearchPlugin.log(e);
                InstaSearchUI.showMessage("Unable to send. Please open a ticket in project's site");
            }
        } else
            super.buttonPressed(id);
    }

    /**
     * @throws IOException 
     * @throws HttpException 
     * 
     */
    private void reportError() throws HttpException, IOException {
        HttpClient httpClient = new HttpClient();
        PostMethod postMethod = new PostMethod(InstaSearchPlugin.getErrorReportURL());

        postMethod.addParameter("subj", message);
        postMethod.addParameter("attn", "Exception");
        postMethod.addParameter("notes", getStatusContent(status));
        postMethod.addParameter("visitor", "InstaSearch Plugin " + InstaSearchPlugin.getVersion());

        httpClient.executeMethod(postMethod);

        postMethod.releaseConnection();
    }

    private String getStatusContent(IStatus status) {

        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);

        addProperty(printWriter, "version", InstaSearchPlugin.getVersion());

        addSystemProperty(printWriter, "osgi.framework.version");
        addSystemProperty(printWriter, "eclipse.buildId");
        addSystemProperty(printWriter, "java.version");

        addBundleProperty(printWriter, Constants.FRAMEWORK_VERSION);
        addBundleProperty(printWriter, Constants.FRAMEWORK_OS_NAME);
        addBundleProperty(printWriter, Constants.FRAMEWORK_OS_VERSION);

        addStatusContent(printWriter, status);

        for (IStatus st : status.getChildren())
            addStatusContent(printWriter, st);

        return stringWriter.toString();
    }

    private void addBundleProperty(PrintWriter b, String prop) {
        addProperty(b, prop, InstaSearchPlugin.getDefault().getBundle().getBundleContext().getProperty(prop));
    }

    private void addSystemProperty(PrintWriter b, String prop) {
        addProperty(b, prop, System.getProperty(prop));
    }

    private void addProperty(PrintWriter b, String prop, String val) {
        b.print(prop);
        b.print(": ");
        b.println(val);
    }

    private void addStatusContent(PrintWriter b, IStatus status) {
        b.print("Status: ");
        b.println(status.getMessage());
        status.getException().printStackTrace(b);
        b.println();
    }
}