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