JSilverOptions.java revision 56ed4167b942ec265f9cee70ac4d71d10b3835ce
16a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek/*
26a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * Copyright (C) 2010 Google Inc.
36a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek *
46a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License");
56a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * you may not use this file except in compliance with the License.
66a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * You may obtain a copy of the License at
76a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek *
86a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * http://www.apache.org/licenses/LICENSE-2.0
96a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek *
106a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * Unless required by applicable law or agreed to in writing, software
116a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS,
126a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * See the License for the specific language governing permissions and
146a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * limitations under the License.
15339b9c27759d7b6a53e2370f83f66e78b3254595Ted Kremenek */
166a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek
176a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenekpackage com.google.clearsilver.jsilver;
18867924dbeca06870573fd58d620032da6994b223Chris Lattner
193245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattnerimport com.google.clearsilver.jsilver.autoescape.EscapeMode;
206a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenekimport com.google.clearsilver.jsilver.data.NoOpStringInternStrategy;
2157df3b950061c73d13d3116f747e79d7955a216aChris Lattnerimport com.google.clearsilver.jsilver.data.StringInternStrategy;
22339b9c27759d7b6a53e2370f83f66e78b3254595Ted Kremenek
236a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenekimport java.util.Map;
24a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek
256a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek/**
266a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek * Options for JSilver.
279402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner *
285ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner * Note: Setter methods also return reference to this, allowing options to be defined in one
295ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner * statement.
305ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner *
315ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner * e.g. new JSilver(..., new JSilverOptions().setSomething(true).setAnother(false));
325ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner *
335ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner * @see JSilver
345ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner */
35f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattnerpublic class JSilverOptions implements Cloneable {
36f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner
37a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner  private boolean cacheTemplates = true;
38a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner  private boolean compileTemplates = false;
395ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  private int initialBufferSize = 8192;
4052c29081281955d3db9e11d10573b2d38f709099Chris Lattner  private boolean ignoreAttributes = false;
4152c29081281955d3db9e11d10573b2d38f709099Chris Lattner  private Map<Object, String> precompiledTemplateMap = null;
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  private boolean useStrongCacheReferences = false;
435ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  private EscapeMode escapeMode = EscapeMode.ESCAPE_NONE;
442c78b873f4f3823ae859c15674cb3d76c8554113Chris Lattner  private boolean propagateEscapeStatus = false;
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
462b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  /**
472b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner   * A pool of strings used to optimize HDF parsing.
485ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner   *
495ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner   * String interning has been shown to improve GC performance, but also to increase CPU usage. To
505ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner   * avoid any possible unexpected changes in behavior it is disabled by default.
515ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner   */
525ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  private StringInternStrategy stringInternStrategy = new NoOpStringInternStrategy();
535ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
545ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  /**
559402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   * This flag is used to enable logging of all variables whose values are modified by auto escaping
56d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   * or &lt;cs escape&gt; commands. These will be logged at {@code Level.WARNING}.
57d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   */
581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  private boolean logEscapedVariables = false;
599402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  private boolean useOutputBufferPool = false;
609402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  private boolean stripHtmlWhiteSpace = false;
619402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  private boolean stripStructuralWhiteSpace = false;
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  private boolean allowGlobalDataModification = false;
639402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  private boolean keepTemplateCacheFresh = false;
649402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  private int loadPathCacheSize = 1000;
659402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
669402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  // When adding fields, ensure you:
679402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  // * add getter.
689402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  // * add setter (which returns this).
699402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  // * add to clone() method if necessary.
709402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
71d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  /**
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * Set the initial size of the load path cache container. Setting this to 0 causes load path cache
739402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   * to be disabled.
749402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   */
759402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  public JSilverOptions setLoadPathCacheSize(int loadPathCacheSize) {
769402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    this.loadPathCacheSize = loadPathCacheSize;
779402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    return this;
789402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  }
799402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
809402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  /**
819402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   * @see #setLoadPathCacheSize(int)
829402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   */
839402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  public int getLoadPathCacheSize() {
849402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    return loadPathCacheSize;
859402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  }
861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
879402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  /**
889402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   * Whether to cache templates. This will only ever load and parse a template from disk once. Best
899402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   * switched on for production but left off for production (so you can update templates without
90d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   * restarting).
919402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   */
929402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  public JSilverOptions setCacheTemplates(boolean cacheTemplates) {
931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    this.cacheTemplates = cacheTemplates;
949402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner    return this;
959402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  }
969402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner
979402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner  /**
989402b57a0dca4058fe56d7fd84e97fc496421125Chris Lattner   * @see #setCacheTemplates(boolean)
995ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner   */
1005ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  public boolean getCacheTemplates() {
1012b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner    return cacheTemplates;
102fa5be3617294f0e3c341f0ecb6b2076478b1b5acTed Kremenek  }
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1042b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  /**
1056a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek   * Compile templates to Java byte code. This slows down the initial render as it performs a
1066a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek   * compilation step, but then subsequent render are faster.
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   *
1086a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek   * Compiled templates are always cached.
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   *
1102b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner   * WARNING: This functionality is experimental. Use with caution.
1115c176f7a9ba9f7084b903393845be24f85e091daChris Lattner   */
1125c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  public JSilverOptions setCompileTemplates(boolean compileTemplates) {
1136a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek    this.compileTemplates = compileTemplates;
1146a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek    return this;
1155c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  }
1165c176f7a9ba9f7084b903393845be24f85e091daChris Lattner
1175c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  /**
1185c176f7a9ba9f7084b903393845be24f85e091daChris Lattner   * @see #setCompileTemplates(boolean)
1195c176f7a9ba9f7084b903393845be24f85e091daChris Lattner   */
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  public boolean getCompileTemplates() {
121735271479ac57c27f744806859efd5b001dea248Chris Lattner    return compileTemplates;
122735271479ac57c27f744806859efd5b001dea248Chris Lattner  }
123d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar
1245c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  /**
125735271479ac57c27f744806859efd5b001dea248Chris Lattner   * If set, then HDF attributes in HDF files will be ignored and not stored in the Data object
126f3d8d19caf6f1a21785eee8d62c45ef5a0a0e72eChris Lattner   * filled by the parser. Default is {@code false}. Many applications use HDF attributes only in
127d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   * template preprocessing (like translation support) and never in production servers where the
128f3d8d19caf6f1a21785eee8d62c45ef5a0a0e72eChris Lattner   * templates are rendered. By disabling attribute parsing, these applications can save on memory
129f3d8d19caf6f1a21785eee8d62c45ef5a0a0e72eChris Lattner   * for storing HDF structures read from files.
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   */
1315c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  public JSilverOptions setIgnoreAttributes(boolean ignoreAttributes) {
132735271479ac57c27f744806859efd5b001dea248Chris Lattner    this.ignoreAttributes = ignoreAttributes;
13349cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek    return this;
1345c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  }
135735271479ac57c27f744806859efd5b001dea248Chris Lattner
136d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  /**
137d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   * @see #setIgnoreAttributes(boolean)
138d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   */
139735271479ac57c27f744806859efd5b001dea248Chris Lattner  public boolean getIgnoreAttributes() {
140d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    return ignoreAttributes;
1415c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  }
142735271479ac57c27f744806859efd5b001dea248Chris Lattner
1435c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  /**
144735271479ac57c27f744806859efd5b001dea248Chris Lattner   * Initial buffer size used when rendering directly to a string.
145d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   */
1465c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  public JSilverOptions setInitialBufferSize(int initialBufferSize) {
147735271479ac57c27f744806859efd5b001dea248Chris Lattner    this.initialBufferSize = initialBufferSize;
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return this;
149735271479ac57c27f744806859efd5b001dea248Chris Lattner  }
150d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar
1515c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  /**
152735271479ac57c27f744806859efd5b001dea248Chris Lattner   * @see #setInitialBufferSize(int)
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   */
154735271479ac57c27f744806859efd5b001dea248Chris Lattner  public int getInitialBufferSize() {
155d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    return initialBufferSize;
1565c176f7a9ba9f7084b903393845be24f85e091daChris Lattner  }
157735271479ac57c27f744806859efd5b001dea248Chris Lattner
1586a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek  /**
1596a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek   * Optional mapping of TemplateLoader keys to Template instances that will be queried when loading
1606a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek   * a template. If the Template is found it is returned. If not, the next template loader is
1616a34083e9f74a45e2f79c9fab66f177809a5db66Ted Kremenek   * consulted.
162fa5be3617294f0e3c341f0ecb6b2076478b1b5acTed Kremenek   *
163fa5be3617294f0e3c341f0ecb6b2076478b1b5acTed Kremenek   * @param precompiledTemplateMap map of TemplateLoader keys to corresponding class names that
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   *        should be valid BaseCompiledTemplate subclasses. Set to {@code null} (default) to not
165053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek   *        load precompiled templates.
166a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek   */
167a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek  public JSilverOptions setPrecompiledTemplateMap(Map<Object, String> precompiledTemplateMap) {
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    this.precompiledTemplateMap = precompiledTemplateMap;
169053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek    return this;
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
171053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek
172053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  /**
1738570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner   * @see #setPrecompiledTemplateMap(java.util.Map)
1748570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner   * @return a mapping of TemplateLoader keys to corresponding BaseCompiledTemplate class names, or
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   *         {@code null} (default) if no precompiled templates should be preloaded.
1768570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner   */
1778570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  public Map<Object, String> getPrecompiledTemplateMap() {
1788570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner    return precompiledTemplateMap;
1798570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  }
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  /**
182c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu   * If {@code true}, then the template cache will use strong persistent references for the values.
183c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu   * If {@code false} (default) it will use soft references. Warning: The cache size is unbounded so
184c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu   * only use this option if you have sufficient memory to load all the Templates into memory.
185c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu   */
186c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  public JSilverOptions setUseStrongCacheReferences(boolean value) {
187c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu    this.useStrongCacheReferences = value;
188c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu    return this;
189c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  }
1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
191c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  /**
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * @see #setUseStrongCacheReferences(boolean)
193c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu   */
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  public boolean getUseStrongCacheReferences() {
195c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu    return useStrongCacheReferences;
196c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu  }
197c01b46e2f115bed83f2f6f4a55809bf4003ee015Zhongxing Xu
198053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  /**
199053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek   * @see #setEscapeMode(com.google.clearsilver.jsilver.autoescape.EscapeMode)
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   */
201053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  public EscapeMode getEscapeMode() {
202053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek    return escapeMode;
203053ef593fa9d2b890645a914eee203231fb34458Ted Kremenek  }
2048570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner
2058570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner  /**
2067e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar   * Escape any template being rendered with the given escaping mode. If the mode is ESCAPE_HTML,
2077e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar   * ESCAPE_URL or ESCAPE_JS, the corresponding escaping will be all variables in the template. If
2087e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar   * the mode is ESCAPE_AUTO, enable <a href="http://go/autoescapecs">auto escaping</a> on
2097e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar   * templates. For each variable in the template, this will determine what type of escaping should
2107e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar   * be applied to the variable, and automatically apply this escaping. This flag can be overriden
2117e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar   * by setting appropriate HDF variables before loading a template. If Config.AutoEscape is 1, auto
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * escaping is enabled. If Config.VarEscapeMode is set to one of 'html', 'js' or 'url', the
21349cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek   * corresponding escaping is applied to all variables.
2147e37c818f9f77608c602ffb32c1135e3cd0132a8Daniel Dunbar   *
215d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   * @param escapeMode
21657df3b950061c73d13d3116f747e79d7955a216aChris Lattner   */
217d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar  public JSilverOptions setEscapeMode(EscapeMode escapeMode) {
218d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar    this.escapeMode = escapeMode;
21949cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek    return this;
220b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  }
221b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
2222b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  /**
223b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek   * @see #setPropagateEscapeStatus
2242b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner   */
225b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  public boolean getPropagateEscapeStatus() {
226b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek    return propagateEscapeStatus;
227b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  }
2282b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner
2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /**
230b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek   * Only used for templates that are being <a href="http://go/autoescapecs">auto escaped</a>. If
2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * {@code true} and auto escaping is enabled, variables created by &lt;cs set&gt; or &lt;cs
232b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek   * call&gt; commands are not auto escaped if they are assigned constant or escaped values. This is
233b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek   * disabled by default.
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   *
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * @see #setEscapeMode
2361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   */
237b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  public JSilverOptions setPropagateEscapeStatus(boolean propagateEscapeStatus) {
238b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek    this.propagateEscapeStatus = propagateEscapeStatus;
239b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek    return this;
2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
241b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek
242b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek  /**
2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * Sets the {@link StringInternStrategy} object that will be used to optimize HDF parsing.
244b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek   *
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * <p>
24649cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek   * Set value should not be {@code null} as it can cause {@link NullPointerException}.
24749cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek   *
24849cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek   * @param stringInternStrategy - {@link StringInternStrategy} object
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   */
25049cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek  public void setStringInternStrategy(StringInternStrategy stringInternStrategy) {
25149cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek    if (stringInternStrategy == null) {
252b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek      throw new IllegalArgumentException("StringInternStrategy should not be null.");
253b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek    }
2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    this.stringInternStrategy = stringInternStrategy;
25549cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek  }
25649cd6354d5373245dd2e69ca7b7113e6a795d36eTed Kremenek
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /**
2588570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner   * Returns {@link StringInternStrategy} object that is used for optimization of HDF parsing.
259d6c1360c2bf234c73572a865f119d0518aca8154Ted Kremenek   *
2601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * <p>
2618570f0b0fde7ca812f8d37f52305f3df4dd2ce01Chris Lattner   * The returned value should never be {@code null}.
262d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   *
263d7407dc92c7d19cafce429e7e1cf9819d3fc0b92Daniel Dunbar   * @return currently used {@link StringInternStrategy} object.
264b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek   */
265ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek  public StringInternStrategy getStringInternStrategy() {
2661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return stringInternStrategy;
267f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek  }
268ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek
2692b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  /**
270ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek   * If {@code true}, then use a threadlocal buffer pool for holding rendered output when outputting
271ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek   * to String. Assumes that render() is called from a thread and that thread will not reenter
272ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek   * render() while it is running. If {@code false}, a new buffer is allocated for each request
2732b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner   * where an Appendable output object was not provided.
2742b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner   */
275ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek  public JSilverOptions setUseOutputBufferPool(boolean value) {
276a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    this.useOutputBufferPool = value;
277a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    return this;
278f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek  }
279f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /**
281f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek   * @see #setUseOutputBufferPool(boolean)
282f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek   */
2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  public boolean getUseOutputBufferPool() {
284f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek    return useOutputBufferPool;
28570bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek  }
28670bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek
2874b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek  /**
288f5016260522e449e9bacdb0e5a87ad3932d9fbd4Ted Kremenek   * If {@code true}, then unnecessary whitespace will be stripped from the output. 'Unnecessary' is
28970bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek   * meant in terms of HTML output. See
29070bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek   * {@link com.google.clearsilver.jsilver.template.HtmlWhiteSpaceStripper} for more info.
291f5016260522e449e9bacdb0e5a87ad3932d9fbd4Ted Kremenek   */
292f5016260522e449e9bacdb0e5a87ad3932d9fbd4Ted Kremenek  public JSilverOptions setStripHtmlWhiteSpace(boolean value) {
293cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek    this.stripHtmlWhiteSpace = value;
294f5016260522e449e9bacdb0e5a87ad3932d9fbd4Ted Kremenek    return this;
2956f46be279f4bc8fc24611f060258bcfbe1c175c4Chris Lattner  }
29607339a63b46e38c954fcccbef721c609d0c2040eTed Kremenek
29707339a63b46e38c954fcccbef721c609d0c2040eTed Kremenek  /**
298dc5be47542e6d4a28d20abf9c0f0a0edd72939b6Chris Lattner   * @see #setStripHtmlWhiteSpace(boolean)
2996f46be279f4bc8fc24611f060258bcfbe1c175c4Chris Lattner   */
3008aa06aca8b2d3771a5405d789b2e704149045dd4Chris Lattner  public boolean getStripHtmlWhiteSpace() {
301f5016260522e449e9bacdb0e5a87ad3932d9fbd4Ted Kremenek    return stripHtmlWhiteSpace;
3026f46be279f4bc8fc24611f060258bcfbe1c175c4Chris Lattner  }
3036f46be279f4bc8fc24611f060258bcfbe1c175c4Chris Lattner
30470bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek  /**
3052223622d113d7cba04c2dfdbe032e2ba6ba10bc4Ted Kremenek   * If {@code true}, then structural whitespace will be stripped from the output. This allows
30670bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek   * templates to be written to more closely match normal programming languages. See
30770bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek   * {@link com.google.clearsilver.jsilver.syntax.StructuralWhitespaceStripper} for more info.
30870bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek   */
30970bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek  public JSilverOptions setStripStructuralWhiteSpace(boolean value) {
31070bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek    this.stripStructuralWhiteSpace = value;
3112223622d113d7cba04c2dfdbe032e2ba6ba10bc4Ted Kremenek    return this;
31270bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek  }
3133c59823096fe28a69a81f899c7f9f0e6eb8071a0Ted Kremenek
31470bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek  /**
3152f10398814e8d58cce029a7e73af21bb274dcd42Ted Kremenek   * @see #setStripHtmlWhiteSpace(boolean)
31680bae763da8bf3f3c73379a1e5d10f5bce266bcaTed Kremenek   */
31780bae763da8bf3f3c73379a1e5d10f5bce266bcaTed Kremenek  public boolean getStripStructuralWhiteSpace() {
3182f10398814e8d58cce029a7e73af21bb274dcd42Ted Kremenek    return stripStructuralWhiteSpace;
31980bae763da8bf3f3c73379a1e5d10f5bce266bcaTed Kremenek  }
32070bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek
32170bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek  /**
3223c59823096fe28a69a81f899c7f9f0e6eb8071a0Ted Kremenek   * Use this method to disable wrapping the global HDF with an UnmodifiableData object which
3233c59823096fe28a69a81f899c7f9f0e6eb8071a0Ted Kremenek   * prevents modification. This flag is here in case there are corner cases or performance reasons
32400f01e440573b2bdf6549991e0ca48cc6747e3a2Ted Kremenek   * that someone may want to disable this protection.
32500f01e440573b2bdf6549991e0ca48cc6747e3a2Ted Kremenek   *
32600f01e440573b2bdf6549991e0ca48cc6747e3a2Ted Kremenek   * Should not be set to {@code true} unless incompatibilities or performance issues found. Note,
3274b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor   * that setting to {@code true} could introduce bugs in templates that acquire local references to
3284b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor   * the global data structure and then try to modify them, which is not the intended behavior.
3294b2d3f7bcc4df31157df443af1b80bcaa9b58bbaDouglas Gregor   * Allowing global data modification during rendering is not compatible with the recently fixed
3304b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   * JNI Clearsilver library.
3314b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   *
3324b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   * TODO: Remove once legacy mode is no longer needed.
3334b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   *
3344b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   * @param allowGlobalDataModification {@code true} if you want to avoid wrapping the global HDF so
3354b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   *        that all writes to it during rendering are prevented and throw an exception.
3364b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   * @return this object.
3374b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek   */
3384b0f81323b518429203051bbcd4864bbf4b000a9Ted Kremenek  public JSilverOptions setAllowGlobalDataModification(boolean allowGlobalDataModification) {
339f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek    this.allowGlobalDataModification = allowGlobalDataModification;
34070bcba6030a76edf46c4f941ad9a5297a1f98c47Ted Kremenek    return this;
341f6f593fae2f0531b4bc06891941f7fbba5217618Ted Kremenek  }
34244ba7bf54434be88bda7a752f857d42cc92b462dDaniel Dunbar
343ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek  /**
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * @see #setAllowGlobalDataModification(boolean)
34544ba7bf54434be88bda7a752f857d42cc92b462dDaniel Dunbar   */
346ad0a203130dc5d1fb7231b88767174511424fa98Ted Kremenek  public boolean getAllowGlobalDataModification() {
3473245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner    return allowGlobalDataModification;
3483245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner  }
3493245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner
3503245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner  /**
3513245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner   * @param keepTemplateCacheFresh {@code true} to have the template cache call
352ff6912b5a9d5073221956fe4d6367b14f3f4b68fDaniel Dunbar   *        {@link com.google.clearsilver.jsilver.resourceloader.ResourceLoader#getResourceVersionId(String)}
3532b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner   *        to check if it should refresh its cache entries (this incurs a small performance penalty
3543245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner   *        each time the cache is accessed)
35505db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner   * @return this object
3566e2901407bff59aeb4cc301cc58b034723d0eb49Chris Lattner   */
3576e2901407bff59aeb4cc301cc58b034723d0eb49Chris Lattner  public JSilverOptions setKeepTemplateCacheFresh(boolean keepTemplateCacheFresh) {
358025c3a66402fb713c2d9bf5dc174ff264765379aChris Lattner    this.keepTemplateCacheFresh = keepTemplateCacheFresh;
3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return this;
3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
3613245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner
362678c6358c8d4e368c78629099142397c63c1ee35Chris Lattner  /**
3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   * @see #setKeepTemplateCacheFresh(boolean)
364c54d50a4180520370c12dd7d06d035263d357d56Chris Lattner   */
365c54d50a4180520370c12dd7d06d035263d357d56Chris Lattner  public boolean getKeepTemplateCacheFresh() {
3663245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner    return keepTemplateCacheFresh;
367590f0cc643274267d4d41125b62557e1d87886c3Chris Lattner  }
3681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36974ea3e5c57c087c046223096a97ea4e365f85eb6Chris Lattner  @Override
37074ea3e5c57c087c046223096a97ea4e365f85eb6Chris Lattner  public JSilverOptions clone() {
37174ea3e5c57c087c046223096a97ea4e365f85eb6Chris Lattner    try {
37205db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner      return (JSilverOptions) super.clone();
3733245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner    } catch (CloneNotSupportedException impossible) {
3743245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner      throw new AssertionError(impossible);
375a745e8c52839d9c8dd0fd8d5276b4eab182ec7f2Chris Lattner    }
376a745e8c52839d9c8dd0fd8d5276b4eab182ec7f2Chris Lattner  }
377a745e8c52839d9c8dd0fd8d5276b4eab182ec7f2Chris Lattner
378a745e8c52839d9c8dd0fd8d5276b4eab182ec7f2Chris Lattner  /**
379ff6912b5a9d5073221956fe4d6367b14f3f4b68fDaniel Dunbar   * @see #setLogEscapedVariables
380ff6912b5a9d5073221956fe4d6367b14f3f4b68fDaniel Dunbar   */
3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  public boolean getLogEscapedVariables() {
382a745e8c52839d9c8dd0fd8d5276b4eab182ec7f2Chris Lattner    return logEscapedVariables;
3835ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  }
3845ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner
3855ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner  /**
386c4586c234edd8df0477a895aebcbc3eb220aed6bChris Lattner   * Use this method to enable logging of all variables whose values are modified by auto escaping
387a745e8c52839d9c8dd0fd8d5276b4eab182ec7f2Chris Lattner   * or &lt;cs escape&gt; commands. These will be logged at {@code Level.WARNING}. This is useful
3883245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner   * for detecting variables that should be exempt from auto escaping.
3895ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner   *
3905ef3e2c45f13fccdb0d7bbcf24c1beee8eee6f64Chris Lattner   * <p>
3913245a0a1c7a4fd74fca845b2edba275bb126d773Chris Lattner   * It is recommended to only enable this flag during testing or debugging and not for production
392cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek   * jobs.
393cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek   *
394cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek   * @see #setEscapeMode
395cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek   */
396cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek  public JSilverOptions setLogEscapedVariables(boolean logEscapedVariables) {
397cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek    this.logEscapedVariables = logEscapedVariables;
398cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek    return this;
399cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek  }
400cc1b8532a113fa3216096757b3b4e203867bd5e0Ted Kremenek}
4015deb96d06583abb751463427457d46041af262d0Chris Lattner