001// Licensed under the Apache License, Version 2.0 (the "License");
002// you may not use this file except in compliance with the License.
003// You may obtain a copy of the License at
004//
005// http://www.apache.org/licenses/LICENSE-2.0
006//
007// Unless required by applicable law or agreed to in writing, software
008// distributed under the License is distributed on an "AS IS" BASIS,
009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
010// See the License for the specific language governing permissions and
011// limitations under the License.
012
013package org.apache.tapestry5;
014
015import org.apache.tapestry5.corelib.base.AbstractField;
016import org.apache.tapestry5.corelib.components.AjaxFormLoop;
017import org.apache.tapestry5.corelib.components.BeanDisplay;
018import org.apache.tapestry5.corelib.components.BeanEditForm;
019import org.apache.tapestry5.corelib.components.BeanEditor;
020import org.apache.tapestry5.corelib.components.Errors;
021import org.apache.tapestry5.corelib.mixins.FormGroup;
022import org.apache.tapestry5.internal.services.AssetDispatcher;
023import org.apache.tapestry5.modules.NoBootstrapModule;
024import org.apache.tapestry5.services.Html5Support;
025import org.apache.tapestry5.services.assets.AssetPathConstructor;
026import org.apache.tapestry5.services.assets.ResourceMinimizer;
027import org.apache.tapestry5.services.compatibility.Trait;
028import org.apache.tapestry5.services.javascript.JavaScriptStack;
029
030/**
031 * Defines the names of symbols used to configure Tapestry.
032 *
033 * @see org.apache.tapestry5.ioc.services.SymbolSource
034 */
035public class SymbolConstants
036{
037    /**
038     * A comma separated list of execution modes used to control how the application is initialized.
039     * Each modes can contribute a list (comma separated) of Module classes to be loaded during startup,
040     * the order in which they appear is preserved.
041     * The default value is: <code>production</code>.
042     */
043    public static final String EXECUTION_MODE = "tapestry.execution-mode";
044    /**
045     * Indicates whether Tapestry is running in production mode or developer mode. This affects a large
046     * number of Tapestry behaviors related to performance and security, including how exceptions are
047     * reported, whether far-future expire headers are emitted, whether JavaScript files may be combined,
048     * whether JSON is compressed, whether component field and parameter values are shadowed to instance
049     * variables (to assist with debugging), and more.
050     */
051    public static final String PRODUCTION_MODE = "tapestry.production-mode";
052
053    /**
054     * A version of {@link #PRODUCTION_MODE} as a symbol reference. This can be used as the default value
055     * of other symbols, to indicate that their default matches whatever PRODUCTION_MODE is set to, which is quite
056     * common.
057     *
058     * @since 5.2.0
059     */
060    public static final String PRODUCTION_MODE_VALUE = String.format("${%s}", PRODUCTION_MODE);
061
062    /**
063     * The list of locales supported by the application; locales identified in the incoming request are "narrowed" to
064     * one of these values. The first locale name in the list is the default locale used when no proper match can be
065     * found.
066     */
067    public static final String SUPPORTED_LOCALES = "tapestry.supported-locales";
068
069    /**
070     * Controls whether whitespace is compressed by default in templates, or left as is. The factory default is to
071     * compress whitespace. (This can also be overridden using the xml:space attribute inside template elements.)
072     */
073    public static final String COMPRESS_WHITESPACE = "tapestry.compress-whitespace";
074
075    /**
076     * Time interval defining how often Tapestry will check for updates to local files (including classes).
077     * Starting with 5.3, this is only used when not running in production mode. The default is "1 s"
078     * (one second), which is appropriate for development. With Tapestry 5.2 and earlier this number
079     * should be raised in a production environment.
080     */
081    public static final String FILE_CHECK_INTERVAL = "tapestry.file-check-interval";
082
083    /**
084     * Time interval that sets how long Tapestry will wait to obtain the exclusive lock needed to check local files. The
085     * default is "50 ms". Starting with 5.3, this is only used when not running in production mode.
086     */
087    public static final String FILE_CHECK_UPDATE_TIMEOUT = "tapestry.file-check-update-timeout";
088
089    /**
090     * The version number of the core Tapestry framework, or UNKNOWN if the version number is not available (which
091     * should only occur when developing Tapestry).
092     */
093    public static final String TAPESTRY_VERSION = "tapestry.version";
094
095    /**
096     * The location of the application-wide component messages catalog, relative to the web application context. This
097     * will normally be <code>WEB-INF/app.properties</code>.
098     */
099    public static final String APPLICATION_CATALOG = "tapestry.app-catalog";
100
101    /**
102     * The charset used when rendering page markup; the charset is also used as the request encoding when handling
103     * incoming requests. The default is "UTF-8".
104     */
105    public static final String CHARSET = "tapestry.charset";
106
107    /**
108     * Used as the default for the Form's autofocus and clientValidation parameters. If overridden to "false", then
109     * Forms will not (unless explicitly specified) use client validation or autofocus, which in turn, means that most
110     * pages with Forms will not make use of the Tapestry JavaScript stack.
111     */
112    public static final String FORM_CLIENT_LOGIC_ENABLED = "tapestry.form-client-logic-enabled";
113
114    /**
115     * Name of page used to report exceptions; the page must implement
116     * {@link org.apache.tapestry5.services.ExceptionReporter}.
117     * This is used by the default exception report handler service.
118     */
119    public static final String EXCEPTION_REPORT_PAGE = "tapestry.exception-report-page";
120
121    /**
122     * Identifies the default persistence strategy for all pages that do not provide an override (using this value as
123     * {@link org.apache.tapestry5.annotations.Meta key}).
124     *
125     * @since 5.1.0.0
126     */
127    public static final String PERSISTENCE_STRATEGY = "tapestry.persistence-strategy";
128
129    /**
130     * Minimum output stream size, in bytes, before output is compressed using GZIP. Shorter streams are not compressed.
131     * Tapestry buffers this amount and switches to a GZIP output stream as needed. The default is "100".
132     *
133     * @see #GZIP_COMPRESSION_ENABLED
134     * @since 5.1.0.0
135     */
136    public static final String MIN_GZIP_SIZE = "tapestry.min-gzip-size";
137
138    /**
139     * Version number of the application. Prior to 5.4, this version number was integrated into asset URLs. Starting
140     * with 5.4, a checksum of the individual asset's content is used instead, and this version number is only used
141     * for documentation purposes; it appears in the default exception report page, for example.
142     *
143     * The default value is "0.0.1".  In 5.3 and earlier, the default value was a random hexadecimal string.
144     *
145     * @see AssetDispatcher
146     * @see AssetPathConstructor
147     * @since 5.1.0.0
148     */
149    public static final String APPLICATION_VERSION = "tapestry.application-version";
150
151    /**
152     * Used to omit the normal Tapestry framework generator meta tag. The meta tag is rendered by default, but clients
153     * who do not wish to advertise their use of Tapestry may set this symbol to "true".
154     *
155     * @since 5.1.0.0
156     */
157    public static final String OMIT_GENERATOR_META = "tapestry.omit-generator-meta";
158
159    /**
160     * If "true" (the default) then GZip compression is enabled for dynamic requests and for static assets. If you are
161     * using a server that handles GZip compression for you, or you don't want to use the extra processing power
162     * necessary to GZIP requests, then override this to "false".
163     *
164     * @see #MIN_GZIP_SIZE
165     * @see org.apache.tapestry5.services.ResponseCompressionAnalyzer
166     * @see org.apache.tapestry5.services.assets.CompressionAnalyzer
167     * @since 5.1.0.0
168     */
169    public static final String GZIP_COMPRESSION_ENABLED = "tapestry.gzip-compression-enabled";
170
171    /**
172     * If "true" (which itself defaults to production mode), then the {@link org.apache.tapestry5.annotations.Secure}
173     * annotation will be honored. If "false" (i.e., development mode), then the annotation and related HTTP/HTTPS
174     * logic is ignored.
175     *
176     * @since 5.1.0.1
177     */
178    public static final String SECURE_ENABLED = "tapestry.secure-enabled";
179
180    /**
181     * If "true" (the default), then the {@link org.apache.tapestry5.services.PersistentLocale} will be encoded into the
182     * {@link org.apache.tapestry5.Link} path by the {@link org.apache.tapestry5.services.ComponentEventLinkEncoder}
183     * service. If overridden to "false" this does not occur, but you should provide a
184     * {@link org.apache.tapestry5.services.LinkCreationListener2} (registered with the
185     * {@link org.apache.tapestry5.services.LinkCreationHub}) in order to add the locale as a query parameter (or
186     * provide some alternate means of persisting the locale between requests).
187     *
188     * @since 5.1.0.1
189     */
190    public static final String ENCODE_LOCALE_INTO_PATH = "tapestry.encode-locale-into-path";
191
192    /**
193     * If "true" then JavaScript files in a {@link JavaScriptStack} will be combined into a single virtual JavaScript
194     * file. Defaults to "true" in production mode.
195     *
196     * @since 5.1.0.2
197     */
198    public static final String COMBINE_SCRIPTS = "tapestry.combine-scripts";
199
200
201    /**
202     * The default time interval that cookies created by Tapestry will be kept in the client web browser. The default is
203     * "7 d" (that is, seven days).
204     *
205     * @since 5.2.0
206     */
207    public static final String COOKIE_MAX_AGE = "tapestry.default-cookie-max-age";
208
209    /**
210     * The logical name of the start page, the page that is rendered for the root URL.
211     *
212     * @since 5.2.0
213     */
214    public static final String START_PAGE_NAME = "tapestry.start-page-name";
215
216    /**
217     * The default stylesheet automatically inserted into every rendered HTML page when
218     * no Bootstrap version is enabled (i.e both {@link Trait#BOOTSTRAP_3} and {@link Trait#BOOTSTRAP_4}
219     * traits are disabled, something done by {@linkplain NoBootstrapModule}). 
220     * 
221     * It was deprecated in 5.4 with no replacement (the stylesheet is now associated with the core {@link JavaScriptStack}.),
222     * but undeprecated in 5.5.0 with the caveat described above.
223     *
224     * @see NoBootstrapModule
225     * @since 5.2.0
226     */
227    public static final String DEFAULT_STYLESHEET = "tapestry.default-stylesheet";
228
229    /**
230     * The Asset path to the embedded copy of script.aculo.us packaged with Tapestry.
231     *
232     * @since 5.2.0
233     */
234    public static final String SCRIPTACULOUS = "tapestry.scriptaculous";
235
236    /**
237     * The Asset path to the embedded datepicker.
238     *
239     * @since 5.2.0
240     */
241    public static final String DATEPICKER = "tapestry.datepicker";
242
243    /**
244     * If "true", then JSON page initialization content is compressed; if "false"
245     * then extra white space is added (pretty printing). Defaults to "true" in production mode.
246     *
247     * @since 5.2.0
248     */
249    public static final String COMPACT_JSON = "tapestry.compact-json";
250
251    /**
252     * If "true" and {@link #PRODUCTION_MODE} is off, comments will be rendered before and after the rendering of any
253     * component
254     * allowing more visibility into which components rendered which markup. Defaults to "false". Component render
255     * tracing may be
256     * enabled per-request by the presence of a request parameter "t:component-trace" with a value of "true".
257     *
258     * @since 5.2.5
259     */
260    public static final String COMPONENT_RENDER_TRACING_ENABLED = "tapestry.component-render-tracing-enabled";
261
262    /**
263     * The hostname that application should use when constructing an absolute URL. The default is "", i.e. an empty
264     * string,
265     * in which case system will use request.getServerName(). Not the same as environment variable HOSTNAME, but you can
266     * also
267     * contribute "$HOSTNAME" as the value to make it the same as the environment variable HOSTNAME.
268     *
269     * @since 5.3
270     */
271    public static final String HOSTNAME = "tapestry.hostname";
272
273    /**
274     * The hostport that application should use when constructing an absolute URL. The default is "0", i.e. use the port
275     * value from
276     * the request.
277     *
278     * @since 5.3
279     */
280    public static final String HOSTPORT = "tapestry.hostport";
281
282    /**
283     * The secure (https) hostport that application should use when constructing an absolute URL. The default is "0",
284     * i.e. use
285     * the value from the request.
286     *
287     * @since 5.3
288     */
289    public static final String HOSTPORT_SECURE = "tapestry.hostport-secure";
290
291    /**
292     * If "true", then resources (individually or when aggregated into stacks) will be minimized via the
293     * {@link ResourceMinimizer} service. If "false", then minification is disabled. Tracks production mode
294     * (minification is normally disabled in development mode).
295     *
296     * Note that Tapestry's default implementation of {@link ResourceMinimizer} does nothing; minification is provided
297     * by add-on libraries.
298     *
299     * @since 5.3
300     */
301    public static final String MINIFICATION_ENABLED = "tapestry.enable-minification";
302
303    /**
304     * If "true" then at the end of each request the
305     * {@link org.apache.tapestry5.services.SessionPersistedObjectAnalyzer} will be called on each session persisted
306     * object that was accessed during the request.
307     *
308     * This is provided as a performance enhancement for servers that do not use clustered sessions.
309     *
310     * The default is {@code true}, to preserve 5.2 behavior. For non-clustered applications (the majority), this value should be
311     * overridden to {@code false}. A future release of Tapestry may change the default.
312     *
313     * @since 5.3
314     */
315    public static final String CLUSTERED_SESSIONS = "tapestry.clustered-sessions";
316
317    /**
318     * The name of a folder in which the Tapestry application executes. Prior to 5.3, a Tapestry application always responded to all
319     * URLs in the context under the context root; by setting this to the name of a folder, the T5 URLs will be inside that folder only, and should
320     * match a corresponding entry in the {@code web.xml} configuration file.  This is useful when running multiple servlets within the same web application (such as when migrating
321     * from Tapestry 4 or some other framework, to Tapestry 5).
322     * Effectively, if this symbol is set to a value, that folder name will be placed after the context path
323     * (typically "/") and before the locale, page name, or other prefix.  For example, if this symbol is set to "app", the {@code web.xml <url-pattern>} should be set to {@code /app/*}, and Tapestry will
324     * only be in invoked by the servlet container for requests inside the virtual {@code app} folder.
325     *
326     * This also affects the search for page templates (which are allowed within the web context). When set to a non-blank value, page templates are searched for in the folder, rather than in the root context.
327     *
328     * The default value is the empty string, which preserves Tapestry 5.2 behavior (and continues to be appropriate for most applications).
329     *
330     * Note that while Tapestry is case-insensitive, the servlet container is not, so the configured value must exactly match
331     * the folder name inside the {@code <url-parameter>} value, including case.
332     *
333     * @since 5.3
334     */
335    public static final String APPLICATION_FOLDER = "tapestry.application-folder";
336
337    /**
338     * Boolean value to indicate if every {@link  org.apache.tapestry5.Asset2} should be fully qualified or not.
339     * Default to <code>false</code> meaning no Asset URL will be fully qualified.
340     *
341     * @since 5.3
342     */
343    public static final String ASSET_URL_FULL_QUALIFIED = "tapestry.asset-url-fully-qualified";
344
345    /**
346     * Prefix to be used for all resource paths, used to recognize which requests are for assets. This value
347     * is appended to the context path and the (optional {@linkplain #APPLICATION_FOLDER application folder}.
348     * It may contain slashes, but should not begin or end with one.
349     *
350     * The default is "assets".
351     */
352    public static final String ASSET_PATH_PREFIX = "tapestry.asset-path-prefix";
353
354
355    /**
356     * Prefix used for all module resources. This may contain slashes, but should not being or end with one.
357     * Tapestry will create two {@link org.apache.tapestry5.services.Dispatcher}s from this: one for normal
358     * modules, the other for GZip compressed modules (by appending ".gz" to this value).
359     *
360     * The default is "modules".
361     *
362     * @since 5.4
363     */
364    public static final String MODULE_PATH_PREFIX = "tapestry.module-path-prefix";
365
366    /**
367     * Identifies the context path of the application, as determined from {@link javax.servlet.ServletContext#getContextPath()}.
368     * This is either a blank string or a string that starts with a slash but does not end with one.
369     *
370     * @since 5.4
371     */
372    public static final String CONTEXT_PATH = "tapestry.context-path";
373
374    /**
375     * A passphrase used as the basis of hash-based message authentication (HMAC) for any object stream data stored on
376     * the client.  The default phrase is the empty string, which will result in a logged runtime <em>error</em>.
377     * You should configure this to a reasonable value (longer is better) and ensure that all servers in your cluster
378     * share the same value (configuring this in code, rather than the command line, is preferred).
379     *
380     * @see org.apache.tapestry5.services.ClientDataEncoder
381     * @since 5.3.6
382     */
383    public static final String HMAC_PASSPHRASE = "tapestry.hmac-passphrase";
384
385    /**
386     * The root asset path for Twitter Bootstrap; if your application uses a modified version of Bootstrap,
387     * you can override this symbol to have Tapestry automatically use your version. The value should be a path
388     * to a folder (under "classpath:" or "context:") and should not include a trailing slash.
389     *
390     * @since 5.4
391     */
392    public static final String BOOTSTRAP_ROOT = "tapestry.bootstrap-root";
393
394    /**
395     * The root asset path for Font Awesome; if your application uses a modified version of it,
396     * you can override this symbol to have Tapestry automatically use your version. The value should be a path
397     * to a folder (under "classpath:" or "context:") and should not include a trailing slash.
398     *
399     * @since 5.5
400     */
401    public static final String FONT_AWESOME_ROOT = "tapestry.font-awesome-root";
402
403    /**
404     * Tapestry relies on an underlying client-side JavaScript infrastructure framework to handle DOM manipulation,
405     * event handling, and Ajax requests. Through Tapestry 5.3, the foundation was
406     * <a href="http://http://prototypejs.org/">Prototype</a>. In 5.4, support for
407     * <a href="http://jquery.org/">jQuery</a> has been added, and it is possible to add others. This symbol defines a value that is used to select
408     * a resource that is provided to the {@link org.apache.tapestry5.services.javascript.ModuleManager} service
409     * as a {@link org.apache.tapestry5.services.javascript.JavaScriptModuleConfiguration} to provide a specific implementation
410     * of the {@code t5/core/dom} module. Tapestry 5.4 directly supports "prototype" or "jquery".  To support
411     * other foundation frameworks, override this symbol value and supply your own module configuration.
412     *
413     * In Tapestry 5.4, this defaults to "prototype" for compatibility with 5.3. This will likely change in
414     * 5.5 to default to "jquery". At some point in the future, Prototype support will no longer be present.
415     *
416     * @since 5.4
417     */
418    public static final String JAVASCRIPT_INFRASTRUCTURE_PROVIDER = "tapestry.javascript-infrastructure-provider";
419
420    /**
421     * If true (the default), then Tapestry will apply locking semantics around access to the {@link javax.servlet.http.HttpSession}.
422     * Reading attribute names occurs with a shared read lock; getting or setting an attribute upgrades to an exclusive write lock.
423     * This can tend to serialize threads when a number of simultaneous (Ajax) requests from the client arrive ... however,
424     * many implementations of HttpSession are not thread safe, and often mutable objects are stored in the session and shared
425     * between threads. Leaving this on the default will yield a more robust application; setting it to false may speed
426     * up processing for more Ajax intensive applications (but care should then be given to ensuring that objects shared inside
427     * the session are themselves immutable or thread-safe).
428     *
429     * @since 5.4
430     */
431    public static final String SESSION_LOCKING_ENABLED = "tapestry.session-locking-enabled";
432
433    /**
434     * If true (the default), then Tapestry will automatically include the "core" stack in all
435     * pages.
436     *
437     * @see <a href="https://issues.apache.org/jira/browse/TAP5-2169">TAP5-2169</a>
438     * @since 5.4
439     */
440    public static final String INCLUDE_CORE_STACK = "tapestry.include-core-stack";
441
442    /**
443     * Defines the CSS class that will be given to HTML element (usually a div) &lt;div&gt; generated by
444     * the {@linkplain FormGroup} mixin and the
445     * {@linkplain BeanEditForm} and {@linkplain BeanEditor}
446     * components surrounding the label and the field. If the value isn't 
447     * {@code form-group}, the div will have {@code class="form-group [value]}.
448     * The default value is <code>form-group</code>.
449     *
450     * @see <a href="https://issues.apache.org/jira/browse/TAP5-2182">TAP5-2182</a>
451     * @since 5.4
452     */
453    public static final String FORM_GROUP_WRAPPER_CSS_CLASS = "tapestry.form-group-wrapper-css-class";
454
455    /**
456     * Defines the name of the HTML element that will surround the HTML form field generated by
457     * the {@linkplain FormGroup} mixin and the {@linkplain BeanEditForm} and {@linkplain BeanEditor}.
458     * If this symbol is null or an empty string, no element will be generated surrouding the
459     * form field. The default value is the empty string (no wrapping).
460     *
461     * @see <a href="https://issues.apache.org/jira/browse/TAP5-2182">TAP5-2182</a>
462     * @see #FORM_GROUP_FORM_FIELD_WRAPPER_ELEMENT_CSS_CLASS
463     * @since 5.4
464     */
465    public static final String FORM_GROUP_FORM_FIELD_WRAPPER_ELEMENT_NAME = "tapestry.form-group-form-field-wrapper-element-name";
466
467    /**
468     * Defines the CSS class of the HTML element generated by
469     * the {@linkplain FormGroup} mixin and the {@linkplain BeanEditForm} and {@linkplain BeanEditor}.
470     * when {@linkplain #FORM_GROUP_FORM_FIELD_WRAPPER_ELEMENT_NAME} is not set to null or the empty string.
471     * The default value is the empty string (no CSS class added).
472     *
473     * @see <a href="https://issues.apache.org/jira/browse/TAP5-2182">TAP5-2182</a>
474     * @since 5.4
475     */
476    public static final String FORM_GROUP_FORM_FIELD_WRAPPER_ELEMENT_CSS_CLASS = "tapestry.form-group-form-field-wrapper-element-css-class";
477
478    /**
479     * Defines the CSS class that will be given to &lt;label&gt; element generated by
480     * the {@linkplain FormGroup} mixin and the
481     * {@linkplain BeanEditForm} and {@linkplain BeanEditor}
482     * components. The default value is <code>control-label</code>.
483     *
484     * @see <a href="https://issues.apache.org/jira/browse/TAP5-2182">TAP5-2182</a>
485     * @since 5.4
486     */
487    public static final String FORM_GROUP_LABEL_CSS_CLASS = "tapestry.form-group-label-css-class";
488
489    /**
490     * Defines the CSS class that will be given to form field components which are
491     * {@linkplain AbstractField} subclasses. The default value is <code>form-control</code>.
492     *
493     * @see <a href="https://issues.apache.org/jira/browse/TAP5-2182">TAP5-2182</a>
494     * @since 5.4
495     */
496    public static final String FORM_FIELD_CSS_CLASS = "tapestry.form-field-css-class";
497
498    /**
499     * Defines the CSS class that will be given to the &lt;dl&gt; HTML element generated by
500     * {@linkplain BeanDisplay}. The default value is <code>well dl-horizontal</code>.
501     *
502     * @since 5.5
503     */
504    public static final String BEAN_DISPLAY_CSS_CLASS = "tapestry.bean-display-css-class";
505
506    /**
507     * Defines the CSS class that will be given to the &lt;div&gt; HTML element generated by
508     * {@linkplain BeanEditor}/{@linkplain BeanEditForm} for boolean properties.
509     * The default value is <code>input-group</code>.
510     *
511     * @since 5.5
512     */
513    public static final String BEAN_EDITOR_BOOLEAN_PROPERTY_DIV_CSS_CLASS = "tapestry.bean-editor-boolean-property-div-css-class";
514
515    /**
516     * Defines the CSS class that will be given to the HTML element generated by
517     * {@linkplain Error}. If the value isn't <code>help-block</code>, the class attribute
518     * will be <code>help-block [symbol value]</code>
519     * The default value is <code>help-block</code>.
520     *
521     * @since 5.5
522     */
523    public static final String ERROR_CSS_CLASS = "tapestry.error-css-class";
524
525    /**
526     * Defines the CSS class that will be given to the add row link generated by
527     * {@linkplain AjaxFormLoop}. The default value is <code>btn btn-default btn-sm</code>.
528     *
529     * @since 5.5
530     */
531    public static final String AJAX_FORM_LOOP_ADD_ROW_LINK_CSS_CLASS = "tapestry.ajax-form-loop-add-row-link-css-class";
532    
533    /**
534     * Defines the prefix of the CSS class that will be given to the outer &lt;div&gt; element generated by
535     * {@linkplain Errors}. The value of {@linkplain Errors}'s <code>class</code> parameter appended
536     * after the prefix and a space character. The default value is <code>alert-dismissable</code>.
537     *
538     * @since 5.5
539     */
540    public static final String ERRORS_BASE_CSS_CLASS = "tapestry.errors-base-css-class";
541
542    /**
543     * Defines the default value of the {@linkplain Errors}'s <code>class</code> parameter.
544     * The default value for this symbol is <code>alert alert-danger</code>.
545     *
546     * @since 5.5
547     */
548    public static final String ERRORS_DEFAULT_CLASS_PARAMETER_VALUE = "tapestry.errors-default-class-parameter-value";
549
550    /**
551     * Defines the CSS class that will be given to the close &lt;button&gt; generated by
552     * {@linkplain Errors}. The default value is <code>close</code>.
553     *
554     * @since 5.5
555     */
556    public static final String ERRORS_CLOSE_BUTTON_CSS_CLASS = "tapestry.errors-close-button-css-class";
557
558    /**
559     * Defines whether {@link java.text.DateFormat} instances created by Tapestry should be
560     * lenient or not by default. The default value is <code>false</code>.
561     *
562     * @since 5.4
563     */
564    public static final String LENIENT_DATE_FORMAT = "tapestry.lenient-date-format";
565
566    /**
567     * The directory to which exception report files should be written. The default is appropriate
568     * for development: {@code build/exceptions}, and should be changed for production.
569     *
570     * @see org.apache.tapestry5.services.ExceptionReporter
571     * @since 5.4
572     */
573
574    public static final String EXCEPTION_REPORTS_DIR = "tapestry.exception-reports-dir";
575
576    /**
577     * Defines whether {@link org.apache.tapestry5.internal.services.assets.CSSURLRewriter} will throw an exception when a CSS file
578     * references an URL which doesn't exist. The default value is <code>false</code>.
579     *
580     * @since 5.4
581     */
582    public static final String STRICT_CSS_URL_REWRITING = "tapestry.strict-css-url-rewriting";
583
584    /**
585     * When an asset (typically, a JavaScript module) is streamed without an explicit expiration header, then
586     * this value is sent as the {@code Cache-Control} header; the default is "max-age=60, must-revalidate". Setting
587     * max-age to a value above zero significantly reduces the number of client requests for module content, as client
588     * browsers will then cache previously downloaded versions. For normal assets, which are immutable, and fingerprinted with
589     * a content hash, there is no need to set max age, and instead, a far-future expiration date is provided.
590     *
591     * @since 5.4
592     */
593    public static final String OMIT_EXPIRATION_CACHE_CONTROL_HEADER = "tapestry.omit-expiration-cache-control-header";
594
595    /**
596     * Defines whether HTML5 features should be used. Value used in the default implementation of
597     * {@link Html5Support#isHtml5SupportEnabled()}. Default value: <code>false</code>.
598     *
599     * @see Html5Support#isHtml5SupportEnabled()
600     * @since 5.4
601     */
602    public static final String ENABLE_HTML5_SUPPORT = "tapestry.enable-html5-support";
603
604    /**
605     * A general switch for restrictive environments, such as Google App Engine, which forbid some useful operations,
606     * such as creating files or directories. Defaults to false.
607     *
608     * @since 5.4
609     */
610    public static final String RESTRICTIVE_ENVIRONMENT = "tapestry.restrictive-environment";
611
612    /**
613     * If true, then when a page includes any JavaScript, a {@code script} block is added to insert
614     * a pageloader mask into the page; the pageloader mask ensure that the user can't interact with the page
615     * until after the page is fully initialized.
616     *
617     * @since 5.4
618     */
619    public static final String ENABLE_PAGELOADING_MASK = "tapestry.enable-pageloading-mask";
620
621    /**
622     * Controls in what environment page preloading should occur. By default, preloading only occurs
623     * in production.
624     *
625     * @see org.apache.tapestry5.services.pageload.PagePreloader
626     * @see org.apache.tapestry5.services.pageload.PreloaderMode
627     * @since 5.4
628     */
629    public static final String PRELOADER_MODE = "tapestry.page-preload-mode";
630}