/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: ExceptionFormattingUtils.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.tools; import com.uwyn.rife.template.Template; public abstract class ExceptionFormattingUtils { private static final int DEFAULT_STACKTRACELIMIT = 15; private static final int DEFAULT_BUFFERLIMIT = 300000; public static String formatExceptionStackTrace(Throwable exception, Template template) { return formatExceptionStackTrace(exception, template, DEFAULT_STACKTRACELIMIT, DEFAULT_BUFFERLIMIT); } public static String formatExceptionStackTrace(Throwable exception, Template template, int stacktraceLimit) { return formatExceptionStackTrace(exception, template, stacktraceLimit, DEFAULT_BUFFERLIMIT); } public static String formatExceptionStackTrace(Throwable exception, Template template, int stacktraceLimit, int bufferLimit) { if (null == exception) throw new IllegalArgumentException("exception can't be null."); if (null == template) throw new IllegalArgumentException("template can't be null."); if (stacktraceLimit <= 0) throw new IllegalArgumentException("stacktraceLimit has to be bigger than 0."); if (bufferLimit <= 0) throw new IllegalArgumentException("bufferLimit has to be bigger than 0."); String exception_name = null; String message = null; String class_name = null; String method_name = null; String file_name = null; StringBuilder exceptions = new StringBuilder(); while (exception != null) { exception_name = exception.getClass().getName(); message = exception.getMessage(); if (null == exception_name) { // this should never happen exception_name = "<unknown exception name>"; } if (null == message) { message = "<no message>"; } template.setValue("exception_class_name", template.getEncoder().encode(exception_name)); template.setValue("exception_message", template.getEncoder().encode(message)); if (template.hasValueId("exception_stack_trace")) { StackTraceElement[] stack_trace = exception.getStackTrace(); StringBuilder stack_trace_out = new StringBuilder(); StringBuilder stack_trace_details = null; for (int i = 0; i < stack_trace.length; i++) { class_name = stack_trace[i].getClassName(); method_name = stack_trace[i].getMethodName(); if (null == class_name) { // this should never happen either class_name = "<unknown class>"; } if (null == class_name) { // this should never happen either method_name = "<unknown method>"; } template.setValue("class_name", template.getEncoder().encode(class_name)); template.setValue("method_name", template.getEncoder().encode(method_name)); stack_trace_details = new StringBuilder(); file_name = stack_trace[i].getFileName(); if (null == file_name) { file_name = "<unknown>"; } template.setValue("file_name", template.getEncoder().encode(file_name)); stack_trace_details.append(template.getBlock("file_name")); if (stack_trace[i].getLineNumber() > 0) { template.setValue("line_number", stack_trace[i].getLineNumber()); stack_trace_details.append(template.getBlock("line_number")); } template.setValue("details", stack_trace_details.toString()); stack_trace_out.append(template.getBlock("stack_trace_line")); if (i > stacktraceLimit) { template.setValue("count", stack_trace.length-1-i); stack_trace_out.append(template.getBlock("more_stack_trace")); break; } else if (exceptions.length()+stack_trace_out.length() > bufferLimit) { template.setValue("count", stack_trace.length-1-i); stack_trace_out.append(template.getBlock("more_stack_trace")); exception = null; break; } } template.setValue("exception_stack_trace", stack_trace_out.toString()); } exceptions.append(template.getBlock("exception")); if (template.hasBlock("more_exceptions") && exceptions.length() > bufferLimit) { exceptions.append(template.getBlock("more_exceptions")); exception = null; break; } if (exception != null) { exception = exception.getCause(); } } return exceptions.toString(); } }