diff --git a/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageMetaInfo.java b/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageMetaInfo.java index 5c602e7dfda..dfe7d925729 100644 --- a/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageMetaInfo.java +++ b/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageMetaInfo.java @@ -383,5 +383,9 @@ public synchronized boolean shouldReload(PrivilegedAction resourceCall } return false; } + + public boolean isPrecompiledMode() { + return precompiledMode; + } } diff --git a/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageWritable.java b/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageWritable.java index 2ab3557da4f..78a450bb737 100644 --- a/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageWritable.java +++ b/src/java/org/codehaus/groovy/grails/web/pages/GroovyPageWritable.java @@ -25,9 +25,12 @@ import java.io.InputStreamReader; import java.io.Reader; import java.io.Writer; +import java.text.DateFormat; +import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; @@ -56,11 +59,13 @@ class GroovyPageWritable implements Writable { private static final Log LOG = LogFactory.getLog(GroovyPageWritable.class); - + private static final String ATTRIBUTE_NAME_DEBUG_TEMPLATES_ID_COUNTER = "org.codehaus.groovy.grails.web.pages.DEBUG_TEMPLATES_COUNTER"; private HttpServletResponse response; private HttpServletRequest request; private GroovyPageMetaInfo metaInfo; private boolean showSource; + private boolean debugTemplates; + private AtomicInteger debugTemplatesIdCounter; private GrailsWebRequest webRequest; private ServletContext context; @@ -81,8 +86,20 @@ public GroovyPageWritable(GroovyPageMetaInfo metaInfo) { context = webRequest.getServletContext(); this.metaInfo = metaInfo; showSource = shouldShowGroovySource(); + debugTemplates = shouldDebugTemplates(); + if(debugTemplates) { + debugTemplatesIdCounter=(AtomicInteger)request.getAttribute(ATTRIBUTE_NAME_DEBUG_TEMPLATES_ID_COUNTER); + if(debugTemplatesIdCounter==null) { + debugTemplatesIdCounter=new AtomicInteger(0); + request.setAttribute(ATTRIBUTE_NAME_DEBUG_TEMPLATES_ID_COUNTER, debugTemplatesIdCounter); + } + } } + private boolean shouldDebugTemplates() { + return request.getParameter("debugTemplates") != null && Environment.getCurrent() == Environment.DEVELOPMENT; + } + private boolean shouldShowGroovySource() { return request.getParameter("showSource") != null && (Environment.getCurrent() == Environment.DEVELOPMENT) && @@ -167,12 +184,36 @@ public Writer writeTo(Writer out) throws IOException { page.setGspTagLibraryLookup(metaInfo.getTagLibraryLookup()); page.setHtmlParts(metaInfo.getHtmlParts()); page.initRun(out, webRequest); + int debugId=0; + long debugStartTimeMs=0; + if(debugTemplates) { + debugId=debugTemplatesIdCounter.incrementAndGet(); + out.write(""); + debugStartTimeMs=System.currentTimeMillis(); + } try { page.run(); } finally { page.cleanup(); } + if(debugTemplates) { + out.write(""); + } request.setAttribute(GrailsApplicationAttributes.PAGE_SCOPE, oldBinding); } return out;