156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/*
256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Copyright (C) 2010 Google Inc.
356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Licensed under the Apache License, Version 2.0 (the "License");
556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * you may not use this file except in compliance with the License.
656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * You may obtain a copy of the License at
756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * http://www.apache.org/licenses/LICENSE-2.0
956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
1056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Unless required by applicable law or agreed to in writing, software
1156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * distributed under the License is distributed on an "AS IS" BASIS,
1256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * See the License for the specific language governing permissions and
1456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * limitations under the License.
1556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */
1656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
1756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpackage com.google.clearsilver.jsilver;
1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.autoescape.AutoEscapeOptions;
2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.autoescape.EscapeMode;
2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.compiler.TemplateCompiler;
2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.data.Data;
2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.data.DataFactory;
2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.data.HDFDataFactory;
2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.exceptions.JSilverBadSyntaxException;
2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.exceptions.JSilverException;
2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.functions.Function;
2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.functions.FunctionRegistry;
2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.functions.TextFilter;
3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.functions.bundles.ClearSilverCompatibleFunctions;
3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.functions.bundles.CoreOperators;
3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.interpreter.InterpretedTemplateLoader;
3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.interpreter.LoadingTemplateFactory;
3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.interpreter.OptimizerProvider;
3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.interpreter.OptimizingTemplateFactory;
3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.interpreter.TemplateFactory;
3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.output.InstanceOutputBufferProvider;
3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.output.OutputBufferProvider;
3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.output.ThreadLocalOutputBufferProvider;
4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.precompiler.PrecompiledTemplateLoader;
4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.resourceloader.ResourceLoader;
4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.DataCommandConsolidator;
4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.SyntaxTreeOptimizer;
4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.StructuralWhitespaceStripper;
4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.Switch;
4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.template.DelegatingTemplateLoader;
4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.template.HtmlWhiteSpaceStripper;
4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.template.Template;
4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.template.TemplateLoader;
5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.IOException;
5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.LinkedList;
5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.List;
5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/**
5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * JSilver templating system.
5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * <p>
5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * This is a pure Java version of ClearSilver.
6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * </p>
6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * <h2>Example Usage</h2>
6356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
6456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * <pre>
6556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * // Load resources (e.g. templates) from directory.
6656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * JSilver jSilver = new JSilver(new FileResourceLoader("/path/to/templates"));
6756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
6856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * // Set up some data.
6956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Data data = new Data();
7056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * data.setValue("name.first", "Mr");
7156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * data.setValue("name.last", "Man");
7256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
7356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * // Render template to System.out. Writer output = ...;
7456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * jSilver.render("say-hello", data, output);
7556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * </pre>
7656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
7756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * For example usage, see java/com/google/clearsilver/jsilver/examples.
7856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
7956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Additional options can be passed to the constructor using JSilverOptions.
8056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
8156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @see <a href="http://go/jsilver">JSilver Docs</a>
8256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @see <a href="http://clearsilver.net">ClearSilver Docs</a>
8356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @see JSilverOptions
8456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @see Data
8556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @see ResourceLoader
8656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */
8756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic final class JSilver implements TemplateRenderer, DataLoader {
8856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
8956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final JSilverOptions options;
9056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
9156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final TemplateLoader templateLoader;
9256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
9356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
9456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * If caching enabled, the cached wrapper (otherwise null). Kept here so we can call clearCache()
9556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * later.
9656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
9756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
9856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final FunctionRegistry globalFunctions = new ClearSilverCompatibleFunctions();
9956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
10056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final ResourceLoader defaultResourceLoader;
10156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
10256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final DataFactory dataFactory;
10356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
10456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  // Object used to return Appendable output buffers when needed.
10556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final OutputBufferProvider outputBufferProvider;
10656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public static final String VAR_ESCAPE_MODE_KEY = "Config.VarEscapeMode";
10756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public static final String AUTO_ESCAPE_KEY = "Config.AutoEscape";
10856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
10956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
11056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param defaultResourceLoader Where resources (templates, HDF files) should be loaded from. e.g.
11156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        directory, classpath, memory, etc.
11256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param options Additional options.
11356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @see JSilverOptions
11456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
11556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public JSilver(ResourceLoader defaultResourceLoader, JSilverOptions options) {
11656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // To ensure that options cannot be changed externally, we clone them and
11756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // use the frozen clone.
11856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    options = options.clone();
11956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
12056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.defaultResourceLoader = defaultResourceLoader;
12156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.dataFactory =
12256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        new HDFDataFactory(options.getIgnoreAttributes(), options.getStringInternStrategy());
12356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.options = options;
12456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
12556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // Setup the output buffer provider either with a threadlocal pool
12656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // or creating a new instance each time it is asked for.
12756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    int bufferSize = options.getInitialBufferSize();
12856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (options.getUseOutputBufferPool()) {
12956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      // Use a ThreadLocal to reuse StringBuilder objects.
13056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      outputBufferProvider = new ThreadLocalOutputBufferProvider(bufferSize);
13156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } else {
13256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      // Create a new StringBuilder each time.
13356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      outputBufferProvider = new InstanceOutputBufferProvider(bufferSize);
13456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
13556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
13656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // Loads the template from the resource loader, manipulating the AST as
13756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // required for correctness.
13856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    TemplateFactory templateFactory = new LoadingTemplateFactory();
13956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
14056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // Applies optimizations to improve performance.
14156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // These steps are entirely optional, and are not required for correctness.
14256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    templateFactory = setupOptimizerFactory(templateFactory);
14356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
14456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    TemplateLoader templateLoader;
14556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    List<DelegatingTemplateLoader> delegatingTemplateLoaders =
14656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        new LinkedList<DelegatingTemplateLoader>();
14756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    AutoEscapeOptions autoEscapeOptions = new AutoEscapeOptions();
14856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    autoEscapeOptions.setPropagateEscapeStatus(options.getPropagateEscapeStatus());
14956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    autoEscapeOptions.setLogEscapedVariables(options.getLogEscapedVariables());
15056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (options.getCompileTemplates()) {
15156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      // Compiled templates.
15256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      TemplateCompiler compiler =
15356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson          new TemplateCompiler(templateFactory, globalFunctions, autoEscapeOptions);
15456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      delegatingTemplateLoaders.add(compiler);
15556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      templateLoader = compiler;
15656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } else {
15756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      // Walk parse tree every time.
15856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      InterpretedTemplateLoader interpreter =
15956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson          new InterpretedTemplateLoader(templateFactory, globalFunctions, autoEscapeOptions);
16056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      delegatingTemplateLoaders.add(interpreter);
16156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      templateLoader = interpreter;
16256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
16356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
16456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // Do we want to load precompiled Template class objects?
16556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (options.getPrecompiledTemplateMap() != null) {
16656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      // Load precompiled template classes.
16756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      PrecompiledTemplateLoader ptl =
16856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson          new PrecompiledTemplateLoader(templateLoader, options.getPrecompiledTemplateMap(),
16956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson              globalFunctions, autoEscapeOptions);
17056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      delegatingTemplateLoaders.add(ptl);
17156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      templateLoader = ptl;
17256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
17356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
17456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    for (DelegatingTemplateLoader loader : delegatingTemplateLoaders) {
17556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      loader.setTemplateLoaderDelegate(templateLoader);
17656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
17756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this.templateLoader = templateLoader;
17856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
17956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
18056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
18156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Applies optimizations to improve performance. These steps are entirely optional, and are not
18256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * required for correctness.
18356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
18456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private TemplateFactory setupOptimizerFactory(TemplateFactory templateFactory) {
18556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // DataCommandConsolidator saves state so we need to create a new one
18656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // every time we run it.
18756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    OptimizerProvider dataCommandConsolidatorProvider = new OptimizerProvider() {
18856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      public Switch getOptimizer() {
18956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        return new DataCommandConsolidator();
19056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      }
19156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    };
19256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
19356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // SyntaxTreeOptimizer has no state so we can use the same object
19456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // concurrently, but it is cheap to make so lets be consistent.
19556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    OptimizerProvider syntaxTreeOptimizerProvider = new OptimizerProvider() {
19656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      public Switch getOptimizer() {
19756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        return new SyntaxTreeOptimizer();
19856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      }
19956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    };
20056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
20156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    OptimizerProvider stripStructuralWhitespaceProvider = null;
20256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (options.getStripStructuralWhiteSpace()) {
20356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      // StructuralWhitespaceStripper has state so create a new one each time.
20456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      stripStructuralWhitespaceProvider = new OptimizerProvider() {
20556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        public Switch getOptimizer() {
20656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson          return new StructuralWhitespaceStripper();
20756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        }
20856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      };
20956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
21056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
21156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return new OptimizingTemplateFactory(templateFactory, dataCommandConsolidatorProvider,
21256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        syntaxTreeOptimizerProvider, stripStructuralWhitespaceProvider);
21356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
21456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
21556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
21656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param defaultResourceLoader Where resources (templates, HDF files) should be loaded from. e.g.
21756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        directory, classpath, memory, etc.
21856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param cacheTemplates Whether to cache templates. Cached templates are much faster but do not
21956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        check the filesystem for updates. Use true in prod, false in dev.
22056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @deprecated Use {@link #JSilver(ResourceLoader, JSilverOptions)}.
22156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
22256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Deprecated
22356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public JSilver(ResourceLoader defaultResourceLoader, boolean cacheTemplates) {
22456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this(defaultResourceLoader, new JSilverOptions().setCacheTemplates(cacheTemplates));
22556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
22656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
22756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
22856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Creates a JSilver instance with default options.
22956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *
23056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param defaultResourceLoader Where resources (templates, HDF files) should be loaded from. e.g.
23156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        directory, classpath, memory, etc.
23256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @see JSilverOptions
23356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
23456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public JSilver(ResourceLoader defaultResourceLoader) {
23556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    this(defaultResourceLoader, new JSilverOptions());
23656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
23756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
23856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
23956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Renders a given template and provided data, writing to an arbitrary output.
24056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *
24156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param templateName Name of template to load (e.g. "things/blah.cs").
24256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param data Data to be used in template.
24356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param output Where template should be rendered to. This can be a Writer, PrintStream,
24456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        System.out/err), StringBuffer/StringBuilder or anything that implements Appendable
24556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param resourceLoader How to find the template data to render and any included files it depends
24656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        on.
24756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
24856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
24956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void render(String templateName, Data data, Appendable output,
25056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      ResourceLoader resourceLoader) throws IOException, JSilverException {
25156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    EscapeMode escapeMode = getEscapeMode(data);
25256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    render(templateLoader.load(templateName, resourceLoader, escapeMode), data, output,
25356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        resourceLoader);
25456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
25556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
25656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
25756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Renders a given template and provided data, writing to an arbitrary output.
25856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *
25956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param templateName Name of template to load (e.g. "things/blah.cs").
26056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param data Data to be used in template.
26156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param output Where template should be rendered to. This can be a Writer, PrintStream,
26256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        System.out/err), StringBuffer/StringBuilder or anything that implements
26356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
26456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
26556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void render(String templateName, Data data, Appendable output) throws IOException,
26656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      JSilverException {
26756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    render(templateName, data, output, defaultResourceLoader);
26856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
26956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
27056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
27156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Same as {@link TemplateRenderer#render(String, Data, Appendable)}, except returns rendered
27256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * template as a String.
27356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
27456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
27556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String render(String templateName, Data data) throws IOException, JSilverException {
27656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Appendable output = createAppendableBuffer();
27756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    try {
27856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      render(templateName, data, output);
27956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return output.toString();
28056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } finally {
28156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      releaseAppendableBuffer(output);
28256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
28356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
28456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
28556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
28656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Renders a given template and provided data, writing to an arbitrary output.
28756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *
28856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param template Template to load.
28956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param data Data to be used in template.
29056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param output Where template should be rendered to. This can be a Writer, PrintStream,
29156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        System.out/err), StringBuffer/StringBuilder or anything that implements
29256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        java.io.Appendable.
29356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
29456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
29556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void render(Template template, Data data, Appendable output, ResourceLoader resourceLoader)
29656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      throws IOException, JSilverException {
29756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (options.getStripHtmlWhiteSpace() && !(output instanceof HtmlWhiteSpaceStripper)) {
29856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      // Strip out whitespace from rendered HTML content.
29956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      output = new HtmlWhiteSpaceStripper(output);
30056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
30156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    template.render(data, output, resourceLoader);
30256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
30356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
30456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
30556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Renders a given template and provided data, writing to an arbitrary output.
30656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *
30756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param template Template to load.
30856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param data Data to be used in template.
30956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param output Where template should be rendered to. This can be a Writer, PrintStream,
31056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        System.out/err), StringBuffer/StringBuilder or anything that implements
31156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        java.io.Appendable.
31256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
31356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
31456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void render(Template template, Data data, Appendable output) throws IOException,
31556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      JSilverException {
31656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    render(template, data, output, defaultResourceLoader);
31756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
31856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
31956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
32056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String render(Template template, Data data) throws IOException, JSilverException {
32156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Appendable output = createAppendableBuffer();
32256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    try {
32356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      render(template, data, output);
32456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return output.toString();
32556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } finally {
32656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      releaseAppendableBuffer(output);
32756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
32856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
32956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
33056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
33156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Renders a given template from the content passed in. That is, the first parameter is the actual
33256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * template content rather than the filename to load.
33356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *
33456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param content Content of template (e.g. "Hello &lt;cs var:name ?&gt;").
33556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param data Data to be used in template.
33656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param output Where template should be rendered to. This can be a Writer, PrintStream,
33756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        System.out/err), StringBuffer/StringBuilder or anything that implements
33856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *        java.io.Appendable
33956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
34056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
34156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void renderFromContent(String content, Data data, Appendable output) throws IOException,
34256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      JSilverException {
34356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    EscapeMode escapeMode = getEscapeMode(data);
34456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    render(templateLoader.createTemp("[renderFromContent]", content, escapeMode), data, output);
34556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
34656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
34756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
34856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Same as {@link #renderFromContent(String, Data, Appendable)}, except returns rendered template
34956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * as a String.
35056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
35156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
35256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public String renderFromContent(String content, Data data) throws IOException, JSilverException {
35356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    Appendable output = createAppendableBuffer();
35456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    try {
35556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      renderFromContent(content, data, output);
35656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      return output.toString();
35756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    } finally {
35856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      releaseAppendableBuffer(output);
35956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
36056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
36156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
36256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
36356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Determine the escaping to apply based on Config variables in HDF. If there is no escaping
36456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * specified in the HDF, check whether JSilverOptions has any escaping configured.
36556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   *
36656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @param data HDF Data to check
36756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * @return EscapeMode
36856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
36956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public EscapeMode getEscapeMode(Data data) {
37056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    EscapeMode escapeMode =
37156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        EscapeMode.computeEscapeMode(data.getValue(VAR_ESCAPE_MODE_KEY), data
37256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson            .getBooleanValue(AUTO_ESCAPE_KEY));
37356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (escapeMode.equals(EscapeMode.ESCAPE_NONE)) {
37456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      escapeMode = options.getEscapeMode();
37556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
37656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
37756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return escapeMode;
37856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
37956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
38056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
38156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Override this to change the type of Appendable buffer used in {@link #render(String, Data)}.
38256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
38356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public Appendable createAppendableBuffer() {
38456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return outputBufferProvider.get();
38556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
38656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
38756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void releaseAppendableBuffer(Appendable buffer) {
38856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    outputBufferProvider.release(buffer);
38956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
39056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
39156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
39256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Registers a global Function that can be used from any template.
39356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
39456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void registerGlobalFunction(String name, Function function) {
39556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    globalFunctions.registerFunction(name, function);
39656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
39756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
39856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
39956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Registers a global TextFilter as function that can be used from any template.
40056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
40156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void registerGlobalFunction(String name, TextFilter textFilter) {
40256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    globalFunctions.registerFunction(name, textFilter);
40356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
40456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
40556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
40656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Registers a global escaper. This also makes it available as a Function named with "_escape"
40756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * suffix (e.g. "html_escape").
40856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
40956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void registerGlobalEscaper(String name, TextFilter escaper) {
41056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    globalFunctions.registerFunction(name + "_escape", escaper, true);
41156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    globalFunctions.registerEscapeMode(name, escaper);
41256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
41356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
41456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
41556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Create new Data instance, ready to be populated.
41656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
41756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public Data createData() {
41856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return dataFactory.createData();
41956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
42056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
42156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
42256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Loads data in Hierarchical Data Format (HDF) into an existing Data object.
42356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
42456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
42556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void loadData(String dataFileName, Data output) throws JSilverBadSyntaxException,
42656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      IOException {
42756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    dataFactory.loadData(dataFileName, defaultResourceLoader, output);
42856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
42956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
43056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
43156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Loads data in Hierarchical Data Format (HDF) into a new Data object.
43256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
43356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
43456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public Data loadData(String dataFileName) throws IOException {
43556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return dataFactory.loadData(dataFileName, defaultResourceLoader);
43656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
43756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
43856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
43956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Gets underlying ResourceLoader so you can access arbitrary files using the same mechanism as
44056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * JSilver.
44156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
44256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public ResourceLoader getResourceLoader() {
44356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return defaultResourceLoader;
44456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
44556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
44656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
44756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Force all cached templates to be cleared.
44856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
44956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void clearCache() {
45056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
45156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
45256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
45356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
45456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Returns the TemplateLoader used by this JSilver template renderer. Needed for HDF/CS
45556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * compatbility.
45656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
45756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public TemplateLoader getTemplateLoader() {
45856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return templateLoader;
45956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
46056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
46156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  /**
46256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   * Returns a copy of the JSilverOptions used by this JSilver instance.
46356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson   */
46456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public JSilverOptions getOptions() {
46556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return options.clone();
46656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
46756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson}
468