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.internal;
014
015import java.util.Collections;
016import java.util.Set;
017import java.util.stream.Collectors;
018import java.util.stream.Stream;
019
020import org.apache.tapestry5.EventConstants;
021import org.apache.tapestry5.annotations.PublishEvent;
022import org.apache.tapestry5.annotations.RequestBody;
023import org.apache.tapestry5.annotations.RequestParameter;
024import org.apache.tapestry5.commons.util.CommonsUtils;
025import org.apache.tapestry5.commons.util.TimeInterval;
026import org.apache.tapestry5.dom.MarkupModel;
027import org.apache.tapestry5.http.ContentType;
028import org.apache.tapestry5.http.TapestryHttpConstants;
029import org.apache.tapestry5.http.internal.TapestryHttpInternalConstants;
030import org.apache.tapestry5.model.ComponentModel;
031import org.apache.tapestry5.services.javascript.JavaScriptStack;
032
033public final class InternalConstants
034{
035    /**
036     * Init parameter used to identify the package from which application classes are loaded. Such
037     * classes are in the
038     * pages, components and mixins sub-packages.
039     * @deprecated Use {@link TapestryHttpInternalConstants#TAPESTRY_APP_PACKAGE_PARAM} instead
040     */
041    public static final String TAPESTRY_APP_PACKAGE_PARAM = TapestryHttpInternalConstants.TAPESTRY_APP_PACKAGE_PARAM;
042
043    /**
044     * Turns off loading of default modules (as driven by JAR file Manifest entries).
045     * @deprecated Use {@link TapestryHttpInternalConstants#DISABLE_DEFAULT_MODULES_PARAM} instead
046     */
047    public static final String DISABLE_DEFAULT_MODULES_PARAM = TapestryHttpInternalConstants.DISABLE_DEFAULT_MODULES_PARAM;
048
049    /**
050     * The name of the query parameter that stores the page activation context inside an action
051     * request.
052     */
053    public static final String PAGE_CONTEXT_NAME = "t:ac";
054
055    /**
056     * Name of event triggered by Grid sub-components when an in-place Grid is updated.
057     */
058    public static final String GRID_INPLACE_UPDATE = "inplaceupdate";
059
060    /**
061     * The name of a query parameter that stores the containing page (used in action links when the
062     * page containing the
063     * component is not the same as the page that was rendering). The active page (the page which
064     * initiated the render)
065     * is encoded into the URL, and the containing page is tacked on as this query parameter.
066     */
067    public static final String CONTAINER_PAGE_NAME = "t:cp";
068
069    public static final String MIXINS_SUBPACKAGE = "mixins";
070
071    public static final String COMPONENTS_SUBPACKAGE = "components";
072
073    public static final String PAGES_SUBPACKAGE = "pages";
074
075    public static final String BASE_SUBPACKAGE = "base";
076
077    /**
078     * Used in some Ajax scenarios to set the content type for the response early, when the Page
079     * instance (the authority
080     * on content types) is known. The value is of type {@link org.apache.tapestry5.http.ContentType}.
081     */
082    public static final String CONTENT_TYPE_ATTRIBUTE_NAME = "content-type";
083
084    /**
085     * @deprecated Use {@link TapestryHttpInternalConstants#CHARSET_CONTENT_TYPE_PARAMETER} instead
086     */
087    public static final String CHARSET_CONTENT_TYPE_PARAMETER = TapestryHttpInternalConstants.CHARSET_CONTENT_TYPE_PARAMETER;
088
089    /**
090     * As above but to store the name of the page. Necessary for determining the correct
091     * {@link MarkupModel} for the response.
092     */
093    public static final String PAGE_NAME_ATTRIBUTE_NAME = "page-name";
094
095    /**
096     * Required MIME type for JSON responses. If this MIME type is not used, the client-side
097     * Prototype code will not
098     * recognize the response as JSON, and the Ajax.Response.responseJSON property will be null.
099     */
100    public static final String JSON_MIME_TYPE = "application/json";
101
102    /**
103     * Request attribute key; if non-null, then automatic GZIP compression of response stream is
104     * suppressed. This is
105     * useful when the code opening the response stream wants to explicitly control whether GZIP
106     * compression occurs or
107     * not. Alias to {@link TapestryHttpConstants#SUPPRESS_COMPRESSION}.
108     *
109     * @since 5.1.0.0
110     */
111    public static final String SUPPRESS_COMPRESSION = TapestryHttpConstants.SUPPRESS_COMPRESSION;
112
113    /**
114     * Name of response header for content encoding.
115     *
116     * @since 5.1.0.0
117     * @deprecated Use {@link TapestryHttpInternalConstants#CONTENT_ENCODING_HEADER} instead
118     */
119    public static final String CONTENT_ENCODING_HEADER = TapestryHttpInternalConstants.CONTENT_ENCODING_HEADER;
120
121    /**
122     * Response content encoding value indicating use of GZIP compression.
123     *
124     * @since 5.1.0.0
125     * @deprecated Use {@link TapestryHttpInternalConstants#GZIP_CONTENT_ENCODING} instead
126     */
127    public static final String GZIP_CONTENT_ENCODING = TapestryHttpInternalConstants.GZIP_CONTENT_ENCODING;
128
129    /**
130     * Identifies the start of an expansion inside a template.
131     */
132    public static final String EXPANSION_START = "${";
133
134    /**
135     * Special prefix for parameters that are inherited from named parameters of their container.
136     */
137    public static final String INHERIT_BINDING_PREFIX = "inherit:";
138
139    public static final long TEN_YEARS = new TimeInterval("10y").milliseconds();
140
141    /**
142     * @deprecated Use {@link CommonsUtils#EMPTY_STRING_ARRAY} instead
143     */
144    public static final String[] EMPTY_STRING_ARRAY = CommonsUtils.EMPTY_STRING_ARRAY;
145
146    /**
147     * Name of the core {@link JavaScriptStack}, which supplies the basic JavaScript infrastructure
148     * on the client.
149     *
150     * @since 5.2.0
151     */
152    public static final String CORE_STACK_NAME = "core";
153
154    /**
155     * Virtual folder name for the core library. The core library is special as any component not present in another
156     * library (including the application library) is searched for inside core.
157     *
158     * @since 5.3
159     */
160    public static final String CORE_LIBRARY = "core";
161
162    /**
163     * The names of the standard controlled subpackages.
164     *
165     * @since 5.3
166     */
167    public static final String[] SUBPACKAGES =
168            {PAGES_SUBPACKAGE, COMPONENTS_SUBPACKAGE, MIXINS_SUBPACKAGE, BASE_SUBPACKAGE};
169
170    /**
171     * The element name for a submit input element used to cancel the form (rather than
172     * submit it normally).
173     *
174     * @since 5.3
175     */
176    public static final String CANCEL_NAME = "cancel";
177
178    /**
179     * Request attribute that can be set to bypass page activation.
180     *
181     * @see org.apache.tapestry5.internal.services.StreamPageContentResultProcessor
182     * @see org.apache.tapestry5.internal.services.PageRenderRequestHandlerImpl
183     * @since 5.4
184     */
185    public static final String BYPASS_ACTIVATION = "tapestry.bypass-page-activation";
186
187    /**
188     * Key inside the response that contains the partial page render keys that are used
189     * to update the client.
190     *
191     * @since 5.4
192     */
193    public static final String PARTIAL_KEY = "_tapestry";
194
195    /**
196     * Request attribute, set to true once the active page (as identified in the incoming
197     * component event or page render request) has been successfully loaded. This is very important
198     * to the {@link org.apache.tapestry5.corelib.pages.ExceptionReport} page, which can possibly
199     * fail (resulting in a servlet container 500 response) if the page can't be loaded (because
200     * if the page can't be loaded, then a link to the page can't be created).
201     *
202     * @since 5.4
203     */
204    public static final String ACTIVE_PAGE_LOADED = "tapestry.active-page-loaded";
205
206    /**
207     * Used to suppress the stylesheets from the 'core' stack; this is used on certain pages
208     * that want to work around application-specific overrides to the core stack stylesheets.
209     *
210     * @since 5.4
211     */
212    public static final String SUPPRESS_CORE_STYLESHEETS = "tapestry.suppress-core-stylesheets";
213
214    /**
215     * A bit of a hack that allows, in production mode, for a component event request to "unwind" when
216     * the component referenced in the URL does not exist. This is related to TAP5-1481. This situation
217     * can most likely occur when a web spider, such as Google, uses an old component event URI from
218     * a prior deployment, which no longer works in a new deployment, due to structural changes. Since
219     * changing the APIs that significantly is forbidden, a non-null value is added as an
220     * {@link org.apache.tapestry5.http.services.Request} attribute.
221     *
222     * @since 5.4
223     */
224    public static final String REFERENCED_COMPONENT_NOT_FOUND = "tapestry.referenced-component-not-found";
225
226    /**
227     * Name of request parameter that suppresses the logic that injects a random-ish namespace into allocated ids when rending partial page
228     * responses. This, of course, requires a lot of testing to ensure that there are no resulting name clashes,
229     * and should not be used inside Zones containing an {@link org.apache.tapestry5.corelib.components.AjaxFormLoop}.
230     *
231     * @since 5.4
232     */
233    public static final String SUPPRESS_NAMESPACED_IDS = "t:suppress-namespaced-ids";
234
235    /**
236     * @since 5.4
237     */
238    public static final ContentType JAVASCRIPT_CONTENT_TYPE = new ContentType("text/javascript");
239    
240    /**
241     * Name of the {@linkplain ComponentModel} metadata key whiche stores the {@linkplain PublishEvent}
242     * data.
243     * @since 5.4.2
244     */
245    public static final String PUBLISH_COMPONENT_EVENTS_META = "meta.publish-component-events";
246    
247    /**
248     * Name of the JSONObject key name which holds the name of the event to be published.
249     * 
250     * @since 5.4.2
251     */
252    public static final String PUBLISH_COMPONENT_EVENTS_URL_PROPERTY = "url";
253
254    /**
255     * The prefix used to create the names of the events triggered for REST endpoint 
256     * event handler methods.
257     * 
258     * @since 5.8.0
259     */
260    public static final String HTTP_METHOD_EVENT_PREFIX = "http";
261
262    /**
263     * The name of the {@link ComponentModel} meta attribute which tells whether
264     * REST endpoint event handler methods are present
265     * 
266     * @since 5.8.0
267     */
268    public static final String REST_ENDPOINT_EVENT_HANDLER_METHOD_PRESENT = "restEndpointEventHandlerMethodsPresent";
269
270    /**
271     * The name of the {@link ComponentModel} meta attribute which lists the 
272     * REST endpoint event handler methods.
273     * 
274     * @since 5.8.0
275     */
276    public static final String REST_ENDPOINT_EVENT_HANDLER_METHODS = "restEndpointEventHandlerMethods";
277
278    /**
279     * Constant for a true boolean value to be used in {@link ComponentModel} meta attributes.
280     */
281    public static final String TRUE = "true";
282    
283    /**
284     * Constant for a false boolean value to be used in {@link ComponentModel} meta attributes.
285     */
286    public static final String FALSE = "false";
287    
288    /**
289     * Annotation types for event handler method parameters which have injected values, not ones 
290     * provided by the URL.
291     */
292    public static Class<?>[] INJECTED_PARAMETERS = new Class<?>[]{
293            RequestParameter.class, RequestBody.class
294    };
295    
296    /**
297     * 
298     */
299    public static final Set<String> SUPPORTED_HTTP_METHOD_EVENTS;
300    
301    public static final Set<String> SUPPORTED_HTTP_METHOD_EVENT_HANDLER_METHOD_NAMES;
302
303    static 
304    {
305        
306        String[] httpEvents = new String[] 
307        {
308            EventConstants.HTTP_GET,
309            EventConstants.HTTP_POST,
310            EventConstants.HTTP_PUT,
311            EventConstants.HTTP_DELETE,
312            EventConstants.HTTP_HEAD,
313            EventConstants.HTTP_PATCH
314        };
315        
316        SUPPORTED_HTTP_METHOD_EVENTS = Collections.unmodifiableSet(
317                Stream.of(httpEvents)
318                    .map(String::toLowerCase)
319                    .collect(Collectors.toSet()));
320
321        SUPPORTED_HTTP_METHOD_EVENT_HANDLER_METHOD_NAMES = Collections.unmodifiableSet(
322                Stream.of(httpEvents)
323                    .map(s -> "on" + s.toLowerCase())
324                    .collect(Collectors.toSet()));
325
326    }
327
328}