/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.es;
import com.caucho.java.LineMap;
import com.caucho.util.CharBuffer;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* JavaScript exception, filtered to get the line numbers right.
*/
public class ESException extends Exception {
public ESException() {}
public ESException(String name) { super(name); }
public ESException(Throwable e) { super(e); }
public static void staticPrintESTrace(Exception e, OutputStream os)
{
CharArrayWriter writer = new CharArrayWriter();
PrintWriter pw = new PrintWriter(writer);
e.printStackTrace(pw);
pw.close();
char []array = writer.toCharArray();
CharBuffer cb = filter(array);
if (os != null) {
byte []b = cb.toString().getBytes();
try {
os.write(b, 0, b.length);
} catch (IOException e1) {
}
} else
System.out.println(cb);
}
public static void staticPrintESTrace(Exception e, PrintWriter os)
{
CharArrayWriter writer = new CharArrayWriter();
PrintWriter pw = new PrintWriter(writer);
e.printStackTrace(pw);
pw.close();
char []array = writer.toCharArray();
CharBuffer cb = filter(array);
if (os != null) {
os.print(cb.toString());
} else
System.out.println(cb);
}
public void printESStackTrace(OutputStream os)
{
staticPrintESTrace(this, os);
}
public void printESStackTrace()
{
printESStackTrace(System.out);
}
public void printESStackTrace(PrintWriter out)
{
CharArrayWriter writer = new CharArrayWriter();
PrintWriter pw = new PrintWriter(writer);
printStackTrace(pw);
pw.close();
char []array = writer.toCharArray();
CharBuffer cb = filter(array);
out.print(cb.toString());
}
/**
* Filter the exception trace to convert *.java line numbers back to
* the *.js name.
*/
private static CharBuffer filter(char []array)
{
CharBuffer buf = new CharBuffer();
CharBuffer fun = new CharBuffer();
CharBuffer file = new CharBuffer();
boolean hasJavaScript = false;
int i = 0;
while (i < array.length) {
fun.clear();
file.clear();
int start = i;
int end;
for (end = i; end < array.length && array[end] != '\n'; end++) {
}
for (; i < end && Character.isWhitespace(array[i]); i++) {
fun.append(array[i]);
}
// skip 'at'
for (; i < end && ! Character.isWhitespace(array[i]); i++) {
fun.append(array[i]);
}
if (! fun.endsWith("at")) {
for (i = start; i < end; i++) {
buf.append(array[i]);
}
i = end + 1;
buf.append('\n');
continue;
}
for (; i < end && Character.isWhitespace(array[i]); i++) {
}
fun.clear();
for (; i < end && ! Character.isWhitespace(array[i]) &&
array[i] != '('; i++) {
fun.append(array[i]);
}
if (fun.startsWith("com.caucho.es.")) {
i = end + 1;
continue;
}
/*
if (! fun.startsWith("_js.")) {
if (hasJavaScript) {
i = end + 1;
continue;
}
for (i = start; i < end; i++) {
buf.append(array[i]);
}
i = end + 1;
buf.append('\n');
continue;
}
*/
if (i < end && array[i] == '(')
i++;
for (; i < end && array[i] != ')'; i++) {
file.append(array[i]);
}
i = end + 1;
if (fun.endsWith(".call"))
continue;
int p = fun.lastIndexOf('.');
String className;
String function;
if (p > 0) {
className = fun.substring(0, p);
function = fun.substring(p + 1);
}
else {
className = "";
function = fun.toString();
}
Global global = Global.getGlobalProto();
LineMap lineMap = global != null ? global.getLineMap(className) : null;
String line = file.toString();
if (lineMap != null) {
p = file.indexOf(':');
if (p > 0) {
try {
String filename = file.substring(0, p);
int lineNo = Integer.parseInt(file.substring(p + 1));
line = lineMap.convertLine(filename, lineNo);
} catch (Exception e) {
}
}
else
line = lineMap.convertLine(file.toString(), 1);
}
buf.append("\tat ");
buf.append(fun);
buf.append("(");
buf.append(line);
buf.append(")");
buf.append("\n");
hasJavaScript = true;
}
return buf;
}
}