1/*
2 * Copyright (C) 2010 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.clearsilver.jsilver.interpreter;
18
19import com.google.clearsilver.jsilver.autoescape.AutoEscapeOptions;
20import com.google.clearsilver.jsilver.autoescape.EscapeMode;
21import com.google.clearsilver.jsilver.data.Data;
22import com.google.clearsilver.jsilver.data.DataContext;
23import com.google.clearsilver.jsilver.data.DefaultDataContext;
24import com.google.clearsilver.jsilver.functions.FunctionExecutor;
25import com.google.clearsilver.jsilver.resourceloader.ResourceLoader;
26import com.google.clearsilver.jsilver.syntax.TemplateSyntaxTree;
27import com.google.clearsilver.jsilver.template.DefaultRenderingContext;
28import com.google.clearsilver.jsilver.template.RenderingContext;
29import com.google.clearsilver.jsilver.template.Template;
30import com.google.clearsilver.jsilver.template.TemplateLoader;
31
32import java.io.IOException;
33
34/**
35 * Template implementation that uses the interpreter to render itself.
36 */
37public class InterpretedTemplate implements Template {
38
39  private final TemplateLoader loader;
40
41  private final TemplateSyntaxTree syntaxTree;
42  private final String name;
43  private final FunctionExecutor functionExecutor;
44  private final EscapeMode escapeMode;
45  private final AutoEscapeOptions autoEscapeOptions;
46
47  public InterpretedTemplate(TemplateLoader loader, TemplateSyntaxTree syntaxTree, String name,
48      FunctionExecutor functionExecutor, AutoEscapeOptions autoEscapeOptions, EscapeMode mode) {
49    this.loader = loader;
50    this.syntaxTree = syntaxTree;
51    this.name = name;
52    this.functionExecutor = functionExecutor;
53    this.escapeMode = mode;
54    this.autoEscapeOptions = autoEscapeOptions;
55  }
56
57  @Override
58  public void render(Data data, Appendable out, ResourceLoader resourceLoader) throws IOException {
59    render(createRenderingContext(data, out, resourceLoader));
60  }
61
62  @Override
63  public void render(RenderingContext context) throws IOException {
64    TemplateInterpreter interpreter =
65        new TemplateInterpreter(this, loader, context, functionExecutor);
66    context.pushExecutionContext(this);
67    syntaxTree.apply(interpreter);
68    context.popExecutionContext();
69  }
70
71  @Override
72  public RenderingContext createRenderingContext(Data data, Appendable out,
73      ResourceLoader resourceLoader) {
74    DataContext dataContext = new DefaultDataContext(data);
75    return new DefaultRenderingContext(dataContext, resourceLoader, out, functionExecutor,
76        autoEscapeOptions);
77  }
78
79  @Override
80  public String getTemplateName() {
81    return name;
82  }
83
84  @Override
85  public EscapeMode getEscapeMode() {
86    return escapeMode;
87  }
88
89  @Override
90  public String getDisplayName() {
91    return name;
92  }
93}
94