in grails-web-common/src/main/groovy/org/grails/web/errors/GrailsWrappedRuntimeException.java [85:252]
public GrailsWrappedRuntimeException(ServletContext servletContext, Throwable t) {
super(t.getMessage(), t);
this.cause = t;
Throwable cause = t;
FastStringPrintWriter pw = FastStringPrintWriter.newInstance();
cause.printStackTrace(pw);
stackTrace = pw.toString();
while (cause.getCause() != cause) {
if (cause.getCause() == null) {
break;
}
cause = cause.getCause();
}
stackTraceLines = stackTrace.split("\\n");
if (cause instanceof MultipleCompilationErrorsException) {
MultipleCompilationErrorsException mcee = (MultipleCompilationErrorsException)cause;
Object message = mcee.getErrorCollector().getErrors().iterator().next();
if (message instanceof SyntaxErrorMessage) {
SyntaxErrorMessage sem = (SyntaxErrorMessage)message;
lineNumber = sem.getCause().getLine();
className = sem.getCause().getSourceLocator();
sem.write(pw);
}
}
else {
Matcher m1 = PARSE_DETAILS_STEP1.matcher(stackTrace);
Matcher m2 = PARSE_DETAILS_STEP2.matcher(stackTrace);
Matcher gsp = PARSE_GSP_DETAILS_STEP1.matcher(stackTrace);
try {
if (ANY_GSP_DETAILS.matcher(stackTrace).find() && gsp.find()) {
System.out.println(gsp.group(1) + " " + gsp.group(2) + " " + gsp.group(3));
className = gsp.group(1);
lineNumber = Integer.parseInt(gsp.group(3));
gspFile = URL_PREFIX + "views/" + gsp.group(2) + '/' + className;
}
else {
if (m1.find()) {
do {
className = m1.group(1);
lineNumber = Integer.parseInt(m1.group(2));
}
while (m1.find());
}
else {
while (m2.find()) {
className = m2.group(1);
lineNumber = Integer.parseInt(m2.group(2));
}
}
}
}
catch (NumberFormatException nfex) {
// ignore
}
}
LineNumberReader reader = null;
try {
checkIfSourceCodeAware(t);
checkIfSourceCodeAware(cause);
if (getLineNumber() > -1) {
String fileLocation;
String url = null;
if (fileName != null) {
fileLocation = fileName;
}
else {
String urlPrefix = "";
if (gspFile == null) {
fileName = className.replace('.', '/') + ".groovy";
GrailsApplication application = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext).getBean(GrailsApplication.APPLICATION_ID, GrailsApplication.class);
// @todo Refactor this to get the urlPrefix from the ArtefactHandler
if (application.isArtefactOfType(ControllerArtefactHandler.TYPE, className)) {
urlPrefix += "/controllers/";
}
else if (application.isArtefactOfType("TagLib", className)) {
urlPrefix += "/taglib/";
}
else if (application.isArtefactOfType(ServiceArtefactHandler.TYPE, className)) {
urlPrefix += "/services/";
}
url = URL_PREFIX + urlPrefix + fileName;
}
else {
url = gspFile;
GrailsApplicationAttributes attrs = null;
try {
attrs = grailsApplicationAttributesConstructor.newInstance(servletContext);
}
catch (Exception e) {
ReflectionUtils.rethrowRuntimeException(e);
}
ResourceAwareTemplateEngine engine = attrs.getPagesTemplateEngine();
lineNumber = engine.mapStackLineNumber(url, lineNumber);
}
fileLocation = "grails-app" + urlPrefix + fileName;
}
InputStream in = null;
if (!GrailsStringUtils.isBlank(url)) {
in = servletContext.getResourceAsStream(url);
LOG.debug("Attempting to display code snippet found in url " + url);
}
if (in == null) {
Resource r = null;
try {
r = resolver.getResource(fileLocation);
in = r.getInputStream();
}
catch (Throwable e) {
r = resolver.getResource("file:" + fileLocation);
if (r.exists()) {
try {
in = r.getInputStream();
}
catch (IOException e1) {
// ignore
}
}
}
}
if (in != null) {
reader = new LineNumberReader(new InputStreamReader(in, "UTF-8"));
String currentLine = reader.readLine();
StringBuilder buf = new StringBuilder();
while (currentLine != null) {
int currentLineNumber = reader.getLineNumber();
if ((lineNumber > 0 && currentLineNumber == lineNumber - 1) ||
(currentLineNumber == lineNumber)) {
buf.append(currentLineNumber)
.append(": ")
.append(currentLine)
.append("\n");
}
else if (currentLineNumber == lineNumber + 1) {
buf.append(currentLineNumber)
.append(": ")
.append(currentLine);
break;
}
currentLine = reader.readLine();
}
codeSnippet = buf.toString().split("\n");
}
}
}
catch (IOException e) {
LOG.warn("[GrailsWrappedRuntimeException] I/O error reading line diagnostics: " + e.getMessage(), e);
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (IOException e) {
// ignore
}
}
}
}