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 <cs escape> 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 <cs set> or <cs 232b485cd1e0a5a1e942d0e682b9b1c4bc9df111528Ted Kremenek * call> 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 <cs escape> 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