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 <cs var:name ?>"). 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