Skip to content

Commit 938b07c

Browse files
committed
Merge branch '3.1.x' into 3.2.x
2 parents fac29f7 + 17100b2 commit 938b07c

File tree

6 files changed

+83
-42
lines changed

6 files changed

+83
-42
lines changed

grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTraceFilterer.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,21 @@ public class DefaultStackTraceFilterer implements StackTraceFilterer {
3333
public static final Log STACK_LOG = LogFactory.getLog(STACK_LOG_NAME);
3434

3535
private static final String[] DEFAULT_INTERNAL_PACKAGES = new String[] {
36-
"org.grails.plugin.resource.DevMode",
37-
"org.grails.",
38-
"org.codehaus.groovy.grails.",
39-
"gant.",
4036
"org.codehaus.groovy.runtime.",
4137
"org.codehaus.groovy.reflection.",
4238
"org.codehaus.groovy.ast.",
43-
"org.codehaus.gant.",
44-
"groovy.",
39+
"org.springframework.web.filter",
40+
"org.springframework.boot.actuate",
4541
"org.mortbay.",
42+
"groovy.lang.",
4643
"org.apache.catalina.",
4744
"org.apache.coyote.",
4845
"org.apache.tomcat.",
4946
"net.sf.cglib.proxy.",
5047
"sun.",
5148
"java.lang.reflect.",
52-
"org.springframework.",
5349
"org.springsource.loaded.",
5450
"com.opensymphony.",
55-
"org.hibernate.",
5651
"javax.servlet."
5752
};
5853

grails-core/src/test/groovy/org/grails/exception/reporting/StackTraceFiltererSpec.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class FooController {
3636

3737
then: "Only valid stack elements are retained"
3838
exception != null
39-
exception.stackTrace.size() == 2
39+
exception.stackTrace.size() == 3
4040
exception.stackTrace[0].className == 'test.FooController'
4141
exception.stackTrace[0].lineNumber == 10
4242
exception.stackTrace[1].lineNumber == 6
@@ -84,7 +84,7 @@ class FooService {
8484

8585
then: "Only valid stack elements are retained"
8686
exception != null
87-
exception.stackTrace.size() == 2
87+
exception.stackTrace.size() == 3
8888
exception.stackTrace[0].className == 'test.FooController'
8989
exception.stackTrace[0].lineNumber == 15
9090
exception.stackTrace[1].lineNumber == 7

grails-core/src/test/groovy/org/grails/exception/reporting/StackTracePrinterSpec.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class StackTracePrinterSpec extends Specification {
2828

2929
then:"The formatting is correctly applied"
3030
result != null
31-
result.contains '->> 7 | callMe in test.FooController'
31+
result.contains '->> 7 | callMe in test.FooController'
3232
}
3333

3434
void "Test pretty print nested stack trace"() {
@@ -50,8 +50,8 @@ class StackTracePrinterSpec extends Specification {
5050

5151
then:"The formatting is correctly applied"
5252
result != null
53-
result.contains '->> 14 | nesting in test.FooController'
54-
result.contains '->> 3 | callMe in test.FooService'
53+
result.contains '->> 14 | nesting in test.FooController'
54+
result.contains '->> 3 | callMe in test.FooService'
5555
}
5656

5757
void "Test pretty print code snippet"() {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.grails.web.servlet.mvc
2+
3+
import groovy.transform.CompileStatic
4+
import groovy.transform.InheritConstructors
5+
6+
import javax.servlet.ServletOutputStream
7+
import javax.servlet.http.HttpServletResponseWrapper
8+
9+
/**
10+
* Tracks whether getOutputStream() was called in order to prevent calls to getWriter() after
11+
* getOutputStream() has been called
12+
*
13+
*
14+
* @since 3.1.12
15+
* @author Graeme Rocher
16+
*/
17+
@CompileStatic
18+
@InheritConstructors
19+
class OutputAwareHttpServletResponse extends HttpServletResponseWrapper {
20+
21+
/**
22+
* Whether the writer is available
23+
*/
24+
boolean writerAvailable = true
25+
26+
@Override
27+
PrintWriter getWriter() throws IOException {
28+
return super.getWriter()
29+
}
30+
31+
@Override
32+
ServletOutputStream getOutputStream() throws IOException {
33+
writerAvailable = false
34+
return super.getOutputStream()
35+
}
36+
}

grails-web-mvc/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequestFilter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
5050
throws ServletException, IOException {
5151

5252
LocaleContextHolder.setLocale(request.getLocale());
53+
response = new OutputAwareHttpServletResponse(response);
54+
5355
boolean isIncludeOrForward = WebUtils.isForward(request) || WebUtils.isInclude(request);
5456
GrailsWebRequest previous = isIncludeOrForward ? GrailsWebRequest.lookup(request) : null;
5557
GrailsWebRequest webRequest = new GrailsWebRequest(request, response, getServletContext());

grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/GrailsLayoutView.java

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.grails.web.servlet.WrappedResponseHolder;
2727
import org.grails.web.servlet.mvc.GrailsWebRequest;
28+
import org.grails.web.servlet.mvc.OutputAwareHttpServletResponse;
2829
import org.grails.web.servlet.view.AbstractGrailsView;
2930
import org.slf4j.Logger;
3031
import org.slf4j.LoggerFactory;
@@ -55,40 +56,47 @@ public String getContentType() {
5556
@Override
5657
protected void renderTemplate(Map<String, Object> model, GrailsWebRequest webRequest, HttpServletRequest request,
5758
HttpServletResponse response) throws Exception {
59+
60+
boolean isCommitted = response.isCommitted() && (response instanceof OutputAwareHttpServletResponse) && !((OutputAwareHttpServletResponse) response).isWriterAvailable();
61+
if( !isCommitted ) {
62+
5863
Content content = obtainContent(model, webRequest, request, response);
59-
if (content != null) {
60-
61-
beforeDecorating(content, model, webRequest, request, response);
62-
switch (request.getDispatcherType()) {
63-
case INCLUDE:
64-
break;
65-
case ASYNC:
66-
case ERROR:
67-
case FORWARD:
68-
case REQUEST:
69-
if(LOG.isDebugEnabled()) {
70-
LOG.debug("Finding layout for request and content" );
71-
}
72-
SpringMVCViewDecorator decorator = (SpringMVCViewDecorator) groovyPageLayoutFinder.findLayout(request, content);
73-
if (decorator != null) {
64+
if (content != null) {
65+
66+
beforeDecorating(content, model, webRequest, request, response);
67+
switch (request.getDispatcherType()) {
68+
case INCLUDE:
69+
break;
70+
case ASYNC:
71+
case ERROR:
72+
case FORWARD:
73+
case REQUEST:
7474
if(LOG.isDebugEnabled()) {
75-
LOG.debug("Found layout. Rendering content for layout and model {}", decorator.getPage(), model);
75+
LOG.debug("Finding layout for request and content" );
7676
}
77-
78-
decorator.render(content, model, request, response, webRequest.getServletContext());
79-
return;
80-
}
81-
break;
82-
}
83-
PrintWriter writer = response.getWriter();
84-
if(LOG.isDebugEnabled()) {
85-
LOG.debug("Layout not applicable to response, writing original content");
86-
}
87-
content.writeOriginal(writer);
88-
if (!response.isCommitted()) {
89-
writer.flush();
77+
SpringMVCViewDecorator decorator = (SpringMVCViewDecorator) groovyPageLayoutFinder.findLayout(request, content);
78+
if (decorator != null) {
79+
if(LOG.isDebugEnabled()) {
80+
LOG.debug("Found layout. Rendering content for layout and model {}", decorator.getPage(), model);
81+
}
82+
83+
decorator.render(content, model, request, response, webRequest.getServletContext());
84+
return;
85+
}
86+
break;
87+
}
88+
PrintWriter writer = response.getWriter();
89+
if(LOG.isDebugEnabled()) {
90+
LOG.debug("Layout not applicable to response, writing original content");
91+
}
92+
content.writeOriginal(writer);
93+
if (!response.isCommitted()) {
94+
writer.flush();
95+
}
9096
}
9197
}
98+
99+
92100
}
93101

94102
protected void beforeDecorating(Content content, Map<String, Object> model, GrailsWebRequest webRequest,

0 commit comments

Comments
 (0)