aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/infrastructure/framework-src/modules/exceptionutils.js
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/infrastructure/framework-src/modules/exceptionutils.js')
-rw-r--r--trunk/infrastructure/framework-src/modules/exceptionutils.js210
1 files changed, 210 insertions, 0 deletions
diff --git a/trunk/infrastructure/framework-src/modules/exceptionutils.js b/trunk/infrastructure/framework-src/modules/exceptionutils.js
new file mode 100644
index 0000000..b572a3a
--- /dev/null
+++ b/trunk/infrastructure/framework-src/modules/exceptionutils.js
@@ -0,0 +1,210 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed 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.
+ */
+
+import("ejs.EJS");
+import("funhtml.*");
+import("jsutils.{scalaF0,scalaF1}");
+import("stringutils.{toHTML,sprintf}");
+
+function _getException(ex) {
+ if (ex instanceof java.lang.Throwable) {
+ return new net.appjet.bodylock.JSRuntimeException(ex.getMessage(), ex);
+ } else if (ex.javaException) {
+ return new net.appjet.bodylock.JSRuntimeException(ex.javaException.getMessage(), ex.javaException);
+ } else if (ex.rhinoException) {
+ return new net.appjet.bodylock.JSRuntimeException(ex.rhinoException.getMessage(), ex.rhinoException);
+ } else {
+ return ex;
+ }
+}
+
+function _convertStackFrameToTable(id, frame) {
+ var r = frame.errorContext(4);
+ var out = [];
+ var t = TABLE({className: "codecontext"});
+ var counter = r._1();
+ r._3().foreach(scalaF1(function(s) {
+ var row = TR(TD({className: "linecell"}, counter++), TD(String(s)));
+ if (counter-1 == frame.errorLine())
+ row[1].attribs['class'] = "offendingline";
+ t.push(row);
+ }));
+ if (id != 0)
+ out.push(DIV({className: "errorframe",
+ onclick: "toggleFrameView('"+id+"')"},
+ IMG({className: "zippy", style: "margin-right: 0.5em;", align: "top", src: "http://appjet.com/img/open-arrow.png", id: "image"+id}),
+ SPAN({className: "errordetail"}, "...was called from "+frame.name()+ " (line "+frame.errorLine()+"):"),
+ SPAN({className: "sourceline"}, " "+frame.errorContext(0)._3().first())));
+ out.push(DIV({id: 'frame'+id, style: (id == 0 ? "" : "display: none;")}, t));
+ return out.map(function(tag) { return toHTML(tag); }).join("");
+}
+
+function getStackTraceHTML(ex) {
+ ex = _getException(ex);
+ if (ex.frames().isEmpty())
+ return "No stack trace available.";
+ var out = [];
+ var counter = 0;
+ var firstFrame = ex.frames().first();
+ out.push(toHTML(DIV({id: "errortitle"}, "Error in "+firstFrame.name())));
+ out.push(toHTML(DIV({id: "errormessage"}, ""+ex.cause().getMessage()+" at "+firstFrame.name()+" (Line "+firstFrame.errorLine()+")")));
+ ex.frames().foreach(scalaF1(function(frame) {
+ out.push(_convertStackFrameToTable(counter++, frame));
+ }));
+ return out.join("");
+}
+
+function getStackTraceFullpage(ex) {
+ var tmpl = new EJS({text: _tmpl});
+ return tmpl.render({trace: getStackTraceHTML(ex)});
+}
+
+function getStackTracePlain(ex) {
+ ex = _getException(ex);
+ if (ex.frames().isEmpty()) {
+ var cause = ex.cause();
+ var sw = new java.io.StringWriter();
+ cause.printStackTrace(new java.io.PrintWriter(sw));
+ return sw.toString();
+ }
+ var out = [];
+ var firstFrame = ex.frames().first();
+ out.push("Error in "+firstFrame.name());
+ out.push(""+ex.cause().getMessage()+" at "+firstFrame.name()+" (Line "+firstFrame.errorLine()+")");
+ var counter = 0;
+ ex.frames().foreach(scalaF1(function(frame) {
+ if (counter++ > 0) {
+ out.push("");
+ out.push("...was called from "+frame.name()+" (line "+frame.errorLine()+"): "+frame.errorContext(0)._3().first());
+ }
+ var r = frame.errorContext(4);
+ var c2 = r._1();
+ r._3().foreach(scalaF1(function(s) {
+ var pre = " ";
+ if (c2 == frame.errorLine())
+ pre = ">";
+ out.push(sprintf("%s %4s | %s", pre, ""+c2, s));
+ c2++;
+ }));
+ }));
+ return out.join("\n");
+}
+
+/* template follows */
+var _tmpl = """<!DOCTYPE HTML PUBLIC
+ "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+ <title>AppJet Error</title>
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+ <meta http-equiv="Content-Language" content="en-us" />
+ <script type="text/javascript" src="http://appjet.com/js/343607636acfee88faa2b638330a3370/jquery-1.2.6.js"></script>
+ <script type="text/javascript">
+function toggleFrameView(frameId) {
+ var hidden = $("#frame"+frameId+":hidden")
+ var visible = $("#frame"+frameId+":visible")
+ if (hidden.length > 0) {
+ hidden.show("normal")
+ $("#image"+frameId).attr("src", "http://appjet.com/img/close-arrow.png")
+ } else {
+ visible.hide("normal")
+ $("#image"+frameId).attr("src", "http://appjet.com/img/open-arrow.png")
+ }
+}
+
+function toggleErrorView() {
+ var hidden = $("#hiddentrace:hidden");
+ var visible = $("#hiddentrace:visible");
+ if (hidden.length > 0) {
+ hidden.slideDown("normal");
+ } else {
+ visible.slideUp("normal");
+ }
+ return false;
+}
+
+function load() {
+ $(".zippy").attr("src", "http://appjet.com/img/open-arrow.png")
+}
+</script>
+<style>
+body {
+ font-family: verdana, helvetica, sans-serif;
+ font-size: 60%;
+ margin: 1em;
+}
+#header { border-bottom: 1px solid red; margin-bottom: 0.8em; }
+#errortitle { font-weight: bold; font-size: 1.6em; margin-bottom: 0.76em;}
+#errormessage { font-size: 1.4em; margin-bottom: 1.0em}
+#errorexplanation {
+ background-color: #ffd; margin: 1em; padding: 0 1em;
+ border: 1px solid #cc9;
+ line-height: 150%;
+}
+#errorexplanation ul, #errorexplanation li { margin: 0; padding: 0; }
+#errorexplanation ul { padding-left: 2em; }
+#errorexplanation { font-size: 9pt; }
+#errorexplanation code { font-size: 10pt; }
+#errorexplanation code { padding: 1px; background: #ddc; margin: 0 5px;
+ white-space:nowrap; }
+#errorexplanation code.quote { background: #fcc; }
+#errorexplanation p, #errorexplanation li { margin: 1em 0 }
+#frame0 { margin-top: 2.0em; }
+.errorframe {
+ margin-bottom: 0.5em;
+ margin-top: 1em;
+ cursor: pointer;
+ color: blue;
+}
+.errordetail {
+ text-decoration: underline;
+}
+.errorframe:hover {
+ color: #c47827;
+}
+.sourceline {
+ font-size: 1.4em;
+ color: black;
+ font-family: monospace;
+}
+#statuscode {
+ float: right;
+ font-size: 2.4em;
+ font-weight: bold;
+}
+.codecontext {
+ border: 1px solid black;
+ font-family: monospace;
+ font-size: 1.4em;
+}
+.codecontext td { padding: 0.1em 0.3em; }
+.codecontext .linecell { border-right: 1px solid #888; }
+.codecontext .offendingline { background-color: #ffcccc; }
+.errotemplate .codecontext .linecell { border-right: 1px solid black; }
+pre {
+ margin: 0px;
+ padding: 0px;
+ border: 0px;
+}
+
+#errorexplanation tt { font-size: 85%; color: #666; }
+</style>
+</head>
+<body onload="load()">
+<%= trace %>
+</body>
+</html>"""