org.glassfish.appclient.client.jws.boot.ErrorDisplayDialog Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of payara-micro Show documentation
Show all versions of payara-micro Show documentation
Micro Distribution of the Payara Project
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package org.glassfish.appclient.client.jws.boot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.ResourceBundle;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.glassfish.appclient.client.acc.UserError;
/**
* Displays errors detected after Java Web Start has launched the
* Java Web Start-aware ACC but before the developer's client has
* launched. Such errors would normally go to the Java Web Start trace file
* or the Java Console (if either is enabled) but by default neither of those
* is turned on, with the result that the end-user has no information about
* such errors. The client would simply never start.
*
* @author tjquinn
*/
public class ErrorDisplayDialog {
private static final String LINE_SEP = System.getProperty("line.separator");
private static ResourceBundle rb;
/**
* Displays a kinder, gentler display for user errors - ones that normally
* a user could correct. This is not typically user-fixable in a
* Java Web Start launch environment, but the nature of the error still
* does not call for a stack trace.
*
* @param ue UserError to be displayed
* @param rb ResourceBundle from which to retrieve i18n strings
*/
public static void showUserError(final UserError ue, final ResourceBundle rb) {
showText(ue.messageForGUIDisplay(), rb);
}
/**
*Displays a dialog box reporting an error, listing the stack trace in
*a text box and allowing the user to copy the stack trace to the platform's
*clipboard before dismissing the dialog box.
*
*@param t the Throwable error detected and being reported
*@param rb a ResourceBundle containing localizable strings
*/
public static void showErrors(Throwable t, ResourceBundle rb) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
t.printStackTrace(ps);
showText(baos.toString(), rb);
}
/**
* Manages the dialog box to display whatever error information has already
* been formatted.
*
* @param text message to display
* @param rb ResourceBundle containing the i18n strings
*/
private static void showText(final String text, final ResourceBundle rb) {
ErrorDisplayDialog.rb = rb;
/*
*The JOptionPane class will accept other Components as elements of
*the dialog box. Build a JTextArea containing the stack trace. Do not
*let the user edit the text.
*/
JTextArea stackTraceArea = new JTextArea();
stackTraceArea.setEditable(false);
stackTraceArea.setRows(16);
stackTraceArea.setText(text);
/*
*Place the text area inside a scroll pane.
*/
JScrollPane sp = new JScrollPane(stackTraceArea);
/*
*Build a check box for the user to click to copy the error information
*to the platform's clipboard.
*/
JCheckBox copyToClipboardCB = new JCheckBox(getString("jwsacc.errorDialog.copyToClipboardLabel"));
/*
*Display the dialog box that also contains the text area's scroll
*pane and the checkbox and then wait for the user to close it.
*/
boolean copyToClipboard = showDialog(
getString("jwsacc.errorDialog.mainMessage.1") +
LINE_SEP +
getString("jwsacc.errorDialog.mainMessage.2"),
sp,
copyToClipboardCB
);
if (copyToClipboard) {
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection ss = new StringSelection(stackTraceArea.getText());
try {
cb.setContents(ss, null);
}
catch (Throwable e) {
/*
*If we cannot copy the text to the clipboard, tell the user that
*and suggest that he or she manually copy it.
*/
showDialog(
getString("jwsacc.errorDialog.errorCopyingMessage.1") +
LINE_SEP +
getString("jwsacc.errorDialog.errorCopyingMessage.2"),
sp,
null /* no checkbox this time */
);
}
}
}
/**
*Displays a dialog box with the specified main message and stack trace.
*@param mainMessage the string to display at the top of the dialog box introducing the stack trace
*@param sp the JScrollPane containing the text area
*@param copyToClipboardCB the JCheckBox to use - null if this is a report that copying itself failed
*@return whether the user wants to copy the error text to the clipboard
*/
private static boolean showDialog(
String mainMessage,
JScrollPane sp,
JCheckBox copyToClipboardCB) {
String close = getString("jwsacc.errorDialog.closeLabel");
Object [] displayElements = (copyToClipboardCB == null) ?
new Object[] {mainMessage, sp} :
new Object[] {mainMessage, sp, copyToClipboardCB};
JOptionPane pane = new JOptionPane(
displayElements,
JOptionPane.ERROR_MESSAGE,
JOptionPane.DEFAULT_OPTION,
null,
new String[] {close},
close);
JDialog dialog = pane.createDialog(null, getString("jwsacc.errorDialog.title"));
dialog.setResizable(true);
dialog.setVisible(true);
boolean result = (copyToClipboardCB == null ? false : copyToClipboardCB.isSelected());
dialog.dispose();
return result;
}
private static String getString(String key) {
return rb.getString(key);
}
}