aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--netx/net/sourceforge/jnlp/LaunchException.java43
-rw-r--r--netx/net/sourceforge/jnlp/resources/Messages.properties1
-rw-r--r--netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties3
-rw-r--r--netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java60
-rw-r--r--tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java9
6 files changed, 123 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 35f8cd7..30e5fe1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2013-01-30 Jiri Vanek <[email protected]>
+
+ Splashscreen error report made more detailed by stored LaunchErrors
+ * netx/net/sourceforge/jnlp/LaunchException.java: (LaunchExceptionWithStamp)
+ new inner class for storing timestamp togetehr with error.
+ (launchExceptionChain) new static list to capture LaunchErrors during
+ runtime.
+ * /netx/net/sourceforge/jnlp/resources/Messages.properties:
+ * netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties:
+ Added explanation string
+ * netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java:
+ Is now displaying launchExceptionChain in its error report and is copying
+ it to clipboard.
+ * tests/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java:
+ (getTextTest) adapted calls of getText for new Date.
+
2013-01-28 Adam Domurad <[email protected]>
Fix PR1157: Applets can hang browser after fatal exception
diff --git a/netx/net/sourceforge/jnlp/LaunchException.java b/netx/net/sourceforge/jnlp/LaunchException.java
index 6c194ed..818df1e 100644
--- a/netx/net/sourceforge/jnlp/LaunchException.java
+++ b/netx/net/sourceforge/jnlp/LaunchException.java
@@ -16,6 +16,11 @@
package net.sourceforge.jnlp;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
/**
* Thrown when a JNLP application, applet, or installer could not
* be created.
@@ -25,6 +30,29 @@ package net.sourceforge.jnlp;
*/
public class LaunchException extends Exception {
+
+ public static class LaunchExceptionWithStamp{
+ private final LaunchException ex;
+ private final Date stamp;
+
+ private LaunchExceptionWithStamp(LaunchException ex) {
+ this.ex=ex;
+ this.stamp=new Date();
+ }
+
+ public LaunchException getEx() {
+ return ex;
+ }
+
+ public Date getStamp() {
+ return stamp;
+ }
+
+
+
+ }
+ private static final List<LaunchExceptionWithStamp> launchExceptionChain = Collections.synchronizedList(new LinkedList<LaunchExceptionWithStamp>());
+
private static final long serialVersionUID = 7283827853612357423L;
/** the file being launched */
@@ -54,6 +82,7 @@ public class LaunchException extends Exception {
this.summary = summary;
this.description = description;
this.severity = severity;
+ saveLaunchException(this);
}
/**
@@ -61,6 +90,7 @@ public class LaunchException extends Exception {
*/
public LaunchException(Throwable cause) {
super(cause);
+ saveLaunchException(this);
}
/**
@@ -68,6 +98,7 @@ public class LaunchException extends Exception {
*/
public LaunchException(String message, Throwable cause) {
super(message, cause);
+ saveLaunchException(this);
}
/**
@@ -78,6 +109,7 @@ public class LaunchException extends Exception {
*/
public LaunchException(String message) {
super(message);
+ saveLaunchException(this);
}
/**
@@ -117,4 +149,15 @@ public class LaunchException extends Exception {
return severity;
}
+ private synchronized void saveLaunchException(LaunchException ex) {
+ launchExceptionChain.add(new LaunchExceptionWithStamp(ex));
+
+ }
+
+ public synchronized static List<LaunchExceptionWithStamp> getLaunchExceptionChain() {
+ return launchExceptionChain;
+ }
+
+
+
}
diff --git a/netx/net/sourceforge/jnlp/resources/Messages.properties b/netx/net/sourceforge/jnlp/resources/Messages.properties
index 3fc0ddc..4dc45d5 100644
--- a/netx/net/sourceforge/jnlp/resources/Messages.properties
+++ b/netx/net/sourceforge/jnlp/resources/Messages.properties
@@ -473,3 +473,4 @@ SPLASHanotherInfo = Another available info
SPLASHdefaultHomepage = Unspecified homepage, verify source rather
SPLASHerrorInInformation = Error during loading of information element, verify source rather
SPLASHmissingInformation = Information element is missing, verify source rather
+SPLASHchainWas = This is the list of exceptions that occurred launching your applet. Please note, those exceptions can be from multiple applets. For a good bug report, be sure to run only one applet.
diff --git a/netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties b/netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties
index db23eff..f651e67 100644
--- a/netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties
+++ b/netx/net/sourceforge/jnlp/resources/Messages_cs_CZ.properties
@@ -468,4 +468,5 @@ SPLASHvendorsInfo= Informace od dodavatele va\u0161\u00ed aplikace
SPLASHanotherInfo= Dal\u0161\u00ed dostupn\u00e9 informace
SPLASHdefaultHomepage = Nespecifikovan\u00e1 domovsk\u00e1 st\u00e1nka, je doporu\u010deno zkontrolovat zdroj
SPLASHerrorInInformation = Chyba na\u010d\u00edt\u00e1n\u00ed informa\u010dn\u00edho elementu, je doporu\u010deno zkontrolovat zdroj
-SPLASHmissingInformation = Informa\u010dn\u00ed element chyb\u00fd, je doporu\u010deno zkontrolovat zdroj \ No newline at end of file
+SPLASHmissingInformation = Informa\u010dn\u00ed element chyb\u00fd, je doporu\u010deno zkontrolovat zdroj
+SPLASHchainWas = N\u00ed\u017ee je seznam v\u00fdjimek, kter\u00e9 prov\u00e1zely start appeltu. Tento seznam ale m\u016f\u017er poch\u00e1zet z n\u011bkolik\u00e1 r\u016fzn\u00fdch applet\u016f. Pro dob\u00e9 chybo\u00e9 hl\u00e1\u0161en\u00ed stoj\u00e9 za to pustit applet izolovane. \ No newline at end of file
diff --git a/netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java b/netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java
index 8cc6070..dbd860e 100644
--- a/netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java
+++ b/netx/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialog.java
@@ -42,6 +42,8 @@ import java.awt.datatransfer.StringSelection;
import java.awt.event.WindowEvent;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.text.DateFormat;
+import java.util.Date;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
@@ -60,6 +62,7 @@ import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
+import net.sourceforge.jnlp.LaunchException;
import net.sourceforge.jnlp.runtime.Translator;
public class JEditorPaneBasedExceptionDialog extends JDialog implements HyperlinkListener {
@@ -78,15 +81,19 @@ public class JEditorPaneBasedExceptionDialog extends JDialog implements Hyperlin
// End of components declaration
private final String message;
private final Throwable exception;
+ private final Date shown;
+ private final String anotherInfo;
/** Creates new form JEditorPaneBasedExceptionDialog */
public JEditorPaneBasedExceptionDialog(java.awt.Frame parent, boolean modal, Throwable ex, InformationElement information, String anotherInfo) {
super(parent, modal);
+ shown = new Date();
initComponents();
htmlErrorAndHelpPanel.setContentType("text/html");
htmlErrorAndHelpPanel.setEditable(false);
+ this.anotherInfo=anotherInfo;
List<String> l = infoElementToList(information);
- this.message = getText(ex, l, anotherInfo);
+ this.message = getText(ex, l, anotherInfo, shown);
this.exception = ex;
if (exception == null) {
closeAndCopyButton.setVisible(false);
@@ -199,7 +206,7 @@ public class JEditorPaneBasedExceptionDialog extends JDialog implements Hyperlin
private void copyAndCloseButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (exception != null) {
try {
- StringSelection data = new StringSelection(getExceptionStackTraceAsString(exception));
+ StringSelection data = new StringSelection(anotherInfo+"\n"+shown.toString()+"\n"+getExceptionStackTraceAsString(exception)+addPlainChain());
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(data, data);
} catch (Exception ex) {
@@ -241,7 +248,7 @@ public class JEditorPaneBasedExceptionDialog extends JDialog implements Hyperlin
});
}
- static String getText(Throwable ex, List<String> l, String anotherInfo) {
+ static String getText(Throwable ex, List<String> l, String anotherInfo,Date shown) {
StringBuilder s = new StringBuilder("<html><body>");
String info = "<p>"
+ Translator.R(InfoItem.SPLASH + "mainL1", createLink())
@@ -258,9 +265,11 @@ public class JEditorPaneBasedExceptionDialog extends JDialog implements Hyperlin
+ Translator.R(InfoItem.SPLASH + "mainL4")
+ " </p>\n"
+ info + formatListInfoList(l) + formatInfo(anotherInfo)
+ +"<br>"+DateFormat.getInstance().format(shown)+"<br>"
+ "<p>"
+ Translator.R(InfoItem.SPLASH + "exWas")
- + " <br/>\n" + "<pre>" + getExceptionStackTraceAsString(ex) + "</pre>";
+ + " <br/>\n" + "<pre>" + getExceptionStackTraceAsString(ex) + "</pre>"
+ + addChain();
} else {
@@ -354,4 +363,47 @@ public class JEditorPaneBasedExceptionDialog extends JDialog implements Hyperlin
}
+ private static String addChain() {
+ if (LaunchException.getLaunchExceptionChain().isEmpty()) {
+ return "";
+ }
+ return Translator.R(InfoItem.SPLASH + "chainWas")
+ + " <br/>\n" + "<pre>" + getChainAsString(true) + "</pre>";
+
+ }
+
+ private static String addPlainChain() {
+ if (LaunchException.getLaunchExceptionChain().isEmpty()) {
+ return "";
+ }
+ return "\n Chain: \n" + getChainAsString(false);
+
+ }
+
+ private static String getChainAsString(boolean formatTime) {
+ return getChainAsString(LaunchException.getLaunchExceptionChain(), formatTime);
+ }
+
+ private static String getChainAsString(List<LaunchException.LaunchExceptionWithStamp> launchExceptionChain, boolean formatTime) {
+ String s = "";
+ if (launchExceptionChain != null) {
+ int i = 0;
+ for (LaunchException.LaunchExceptionWithStamp launchException : launchExceptionChain) {
+ i++;
+ s = s + i + ") at " + formatTime(launchException.getStamp(), formatTime) + "\n" + getExceptionStackTraceAsString(launchException.getEx());
+ }
+ }
+ return s;
+ }
+
+ private static String formatTime(Date dateTime, boolean formatTime) {
+ if (dateTime == null) {
+ return "unknown time";
+ }
+ if (formatTime) {
+ return DateFormat.getInstance().format(dateTime);
+ } else {
+ return dateTime.toString();
+ }
+ }
}
diff --git a/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java b/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java
index 9372ff7..877596a 100644
--- a/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java
+++ b/tests/netx/unit/net/sourceforge/jnlp/splashscreen/parts/JEditorPaneBasedExceptionDialogTest.java
@@ -40,6 +40,7 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import java.util.List;
import net.sourceforge.jnlp.runtime.Translator;
import org.junit.Assert;
@@ -107,10 +108,10 @@ public class JEditorPaneBasedExceptionDialogTest {
@Test
public void getTextTest() {
- String s1 = JEditorPaneBasedExceptionDialog.getText(ex, l, ai);
- String s2 = JEditorPaneBasedExceptionDialog.getText(ex, l, null);
- String s3 = JEditorPaneBasedExceptionDialog.getText(ex, null, ai);
- String s4 = JEditorPaneBasedExceptionDialog.getText(null, l, ai);
+ String s1 = JEditorPaneBasedExceptionDialog.getText(ex, l, ai, new Date());
+ String s2 = JEditorPaneBasedExceptionDialog.getText(ex, l, null, new Date());
+ String s3 = JEditorPaneBasedExceptionDialog.getText(ex, null, ai, new Date());
+ String s4 = JEditorPaneBasedExceptionDialog.getText(null, l, ai, new Date());
assertHtml(s1);
assertHtml(s2);
assertHtml(s3);