Skip to content

Commit

Permalink
GRAILS-11837 Make GSP template engine independent of Servlet API
Browse files Browse the repository at this point in the history
  • Loading branch information
lhotari committed Jan 3, 2015
1 parent 15a0aff commit 6e03178
Show file tree
Hide file tree
Showing 71 changed files with 798 additions and 507 deletions.
6 changes: 5 additions & 1 deletion grails-gsp/build.gradle
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
dependencies {
compile( project(":grails-web-taglib") )
compile project(":grails-core"), {
exclude group:'org.grails', module:'grails-spring'
}
compile project(":grails-taglib")
compile "org.codehaus.groovy:groovy-templates:$groovyVersion"
}
50 changes: 13 additions & 37 deletions grails-gsp/src/main/groovy/org/grails/gsp/GroovyPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,12 @@
import org.grails.gsp.jsp.JspTag;
import org.grails.gsp.jsp.JspTagLib;
import org.grails.gsp.jsp.TagLibraryResolver;
import org.grails.taglib.*;
import org.grails.taglib.encoder.OutputContext;
import org.grails.taglib.encoder.OutputEncodingStack;
import org.grails.taglib.encoder.OutputEncodingStackAttributes;
import org.grails.taglib.encoder.WithCodecHelper;
import org.grails.web.servlet.mvc.GrailsWebRequest;
import org.grails.web.taglib.*;
import org.grails.taglib.GrailsTagException;

import javax.servlet.http.HttpServletRequest;
import java.io.Writer;
import java.util.*;

Expand All @@ -58,42 +56,22 @@ public abstract class GroovyPage extends Script {

private static final Log LOG = LogFactory.getLog(GroovyPage.class);

public static final String REQUEST = "request";
public static final String SERVLET_CONTEXT = "application";
public static final String RESPONSE = "response";
public static final String OUT = "out";
public static final String EXPRESSION_OUT = "expressionOut";
public static final String EXPRESSION_OUT_STATEMENT = EXPRESSION_OUT; // "getCodecOut()";
public static final String OUT_STATEMENT = OUT; // "getOut()";
public static final String CODEC_VARNAME = "Codec";
public static final String ATTRIBUTES = "attributes";
public static final String APPLICATION_CONTEXT = "applicationContext";
public static final String SESSION = "session";
public static final String PARAMS = "params";
public static final String FLASH = "flash";
public static final String PLUGIN_CONTEXT_PATH = "pluginContextPath";
public static final String EXTENSION = ".gsp";
public static final String WEB_REQUEST = "webRequest";
public static final String DEFAULT_NAMESPACE = "g";
public static final String LINK_NAMESPACE = "link";
public static final String TEMPLATE_NAMESPACE = "tmpl";
public static final String PAGE_SCOPE = "pageScope";
public static final String CONTROLLER_NAME = "controllerName";
public static final String SUFFIX = ".gsp";
public static final String ACTION_NAME = "actionName";

public static final Collection<String> RESERVED_NAMES = CollectionUtils.newSet(
REQUEST,
SERVLET_CONTEXT,
RESPONSE,
OUT,
EXPRESSION_OUT,
CODEC_VARNAME,
ATTRIBUTES,
APPLICATION_CONTEXT,
SESSION,
PARAMS,
FLASH,
PLUGIN_CONTEXT_PATH,
PAGE_SCOPE);

Expand All @@ -109,9 +87,8 @@ public abstract class GroovyPage extends Script {
private GrailsPrintWriter staticOut;
private GrailsPrintWriter expressionOut;
private OutputEncodingStack outputStack;
private GrailsWebRequest webRequest;
private OutputContext outputContext;
private String pluginContextPath;
private HttpServletRequest request;
private Encoder rawEncoder;

private final List<Closure<?>> bodyClosures = new ArrayList<Closure<?>>(15);
Expand All @@ -136,7 +113,7 @@ public void setOut(Writer newWriter) {
throw new IllegalStateException("Setting out in page isn't allowed.");
}

public void initRun(Writer target, GrailsWebRequest grailsWebRequest, GroovyPageMetaInfo metaInfo) {
public void initRun(Writer target, OutputContext outputContext, GroovyPageMetaInfo metaInfo) {
OutputEncodingStackAttributes.Builder attributesBuilder = new OutputEncodingStackAttributes.Builder();
if (metaInfo != null) {
setJspTags(metaInfo.getJspTags());
Expand All @@ -150,19 +127,18 @@ public void initRun(Writer target, GrailsWebRequest grailsWebRequest, GroovyPage
attributesBuilder.defaultTaglibEncoder(metaInfo.getTaglibEncoder());
}
attributesBuilder.allowCreate(true).topWriter(target).autoSync(false).pushTop(true);
attributesBuilder.webRequest(grailsWebRequest);
attributesBuilder.outputContext(outputContext);
attributesBuilder.inheritPreviousEncoders(false);
outputStack = OutputEncodingStack.currentStack(attributesBuilder.build());

out = outputStack.getOutWriter();
staticOut = outputStack.getStaticWriter();
expressionOut = outputStack.getExpressionWriter();

this.webRequest = grailsWebRequest;
if (grailsWebRequest != null) {
grailsWebRequest.setOut(out);
request = grailsWebRequest.getCurrentRequest();
GrailsApplication grailsApplication = grailsWebRequest.getAttributes().getGrailsApplication();
this.outputContext = outputContext;
if (outputContext != null) {
outputContext.setCurrentWriter(out);
GrailsApplication grailsApplication = outputContext.getGrailsApplication();
if (grailsApplication != null) {
rawEncoder = WithCodecHelper.lookupEncoder(grailsApplication, "Raw");
}
Expand Down Expand Up @@ -427,7 +403,7 @@ private void invokeTagLibClosure(String tagName, String tagNamespace, Closure<?>
try {
Map<String, Object> codecSettings = TagOutput.createCodecSettings(tagNamespace, tagName, attrs, defaultEncodeAs);
if (codecSettings != null) {
outputStack.push(WithCodecHelper.createOutputStackAttributesBuilder(codecSettings, webRequest.getAttributes().getGrailsApplication()).build());
outputStack.push(WithCodecHelper.createOutputStackAttributesBuilder(codecSettings, outputContext.getGrailsApplication()).build());
encodeAsPushedToStack=true;
}
Object tagresult = null;
Expand Down Expand Up @@ -522,8 +498,8 @@ public final OutputEncodingStack getOutputStack() {
return outputStack;
}

public final HttpServletRequest getRequest() {
return request;
public OutputContext getOutputContext() {
return outputContext;
}

public final void registerSitemeshPreprocessMode() {
Expand All @@ -542,7 +518,7 @@ public final void registerSitemeshPreprocessMode() {
}

public final void createTagBody(int bodyClosureIndex, Closure<?> bodyClosure) {
TagBodyClosure tagBody = new TagBodyClosure(this, webRequest, bodyClosure, true);
TagBodyClosure tagBody = new TagBodyClosure(this, outputContext, bodyClosure, true);
setBodyClosure(bodyClosureIndex, tagBody);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import groovy.lang.Binding;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.grails.web.taglib.TemplateVariableBinding;
import org.grails.taglib.TemplateVariableBinding;

import java.util.Map;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import org.grails.encoder.Encoder;
import org.grails.gsp.compiler.GroovyPageParser;
import org.grails.gsp.jsp.TagLibraryResolver;
import org.grails.taglib.TagLibraryLookup;
import org.grails.taglib.encoder.WithCodecHelper;
import org.grails.web.taglib.TagLibraryLookup;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
Expand Down
13 changes: 10 additions & 3 deletions grails-gsp/src/main/groovy/org/grails/gsp/GroovyPageTemplate.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

import groovy.lang.Writable;
import groovy.text.Template;
import org.grails.taglib.encoder.OutputContextLookup;
import org.grails.taglib.encoder.OutputContextLookupHelper;

import java.util.Map;

Expand All @@ -27,21 +29,26 @@
* @since 0.5
*/
public class GroovyPageTemplate implements Template, Cloneable {

private final OutputContextLookup outputContextLookup;
private GroovyPageMetaInfo metaInfo;
private boolean allowSettingContentType = false;

public GroovyPageTemplate(GroovyPageMetaInfo metaInfo) {
this(metaInfo, OutputContextLookupHelper.getOutputContextLookup());
}

public GroovyPageTemplate(GroovyPageMetaInfo metaInfo, OutputContextLookup outputContextLookup) {
this.metaInfo = metaInfo;
this.outputContextLookup = outputContextLookup;
}

public Writable make() {
return new GroovyPageWritable(metaInfo, allowSettingContentType);
return new GroovyPageWritable(metaInfo, outputContextLookup, allowSettingContentType);
}

@SuppressWarnings("rawtypes")
public Writable make(Map binding) {
GroovyPageWritable gptw = new GroovyPageWritable(metaInfo, allowSettingContentType);
GroovyPageWritable gptw = new GroovyPageWritable(metaInfo, outputContextLookup, allowSettingContentType);
gptw.setBinding(binding);
return gptw;
}
Expand Down
Loading

0 comments on commit 6e03178

Please sign in to comment.