| // Copyright 2007 The Apache Software Foundation |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package org.apache.tapestry5.tutorial.services; |
| |
| import org.apache.tapestry5.SymbolConstants; |
| import org.apache.tapestry5.ioc.MappedConfiguration; |
| import org.apache.tapestry5.ioc.OrderedConfiguration; |
| import org.apache.tapestry5.ioc.annotations.Marker; |
| import org.apache.tapestry5.services.Request; |
| import org.apache.tapestry5.services.RequestFilter; |
| import org.apache.tapestry5.services.RequestHandler; |
| import org.apache.tapestry5.services.Response; |
| import org.slf4j.Logger; |
| |
| import java.io.IOException; |
| |
| /** |
| * This module is automatically included as part of the Tapestry IoC Registry, it's a good place to configure and extend |
| * Tapestry, or to place your own services. |
| */ |
| @Marker(Local.class) |
| public class AppModule |
| { |
| public static void contributeApplicationDefaults( |
| MappedConfiguration<String, String> configuration) |
| { |
| // Contributions to ApplicationDefaults will override any contributions to |
| // FactoryDefaults (with the same key). Here we're restricting the supported |
| // locales to just "en" (English). As you add localised message catalogs and other assets, |
| // you can extend this list of locales (it's a comma seperated series of locale names; |
| // the first locale name is the default when there's no reasonable match). |
| |
| configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en"); |
| configuration.add(SymbolConstants.PRODUCTION_MODE, "false"); |
| } |
| |
| /** |
| * This is a service definition, the service will be named TimingFilter. The interface, RequestFilter, is used |
| * within the RequestHandler service pipeline, which is built from the RequestHandler service configuration. |
| * Tapestry IoC is responsible for passing in an appropriate Log instance. Requests for static resources are handled |
| * at a higher level, so this filter will only be invoked for Tapestry related requests. |
| */ |
| public RequestFilter buildTimingFilter(final Logger logger) |
| { |
| return new RequestFilter() |
| { |
| public boolean service(Request request, Response response, RequestHandler handler) |
| throws IOException |
| { |
| long startTime = System.currentTimeMillis(); |
| |
| try |
| { |
| // The reponsibility of a filter is to invoke the corresponding method |
| // in the handler. When you chain multiple filters together, each filter |
| // received a handler that is a bridge to the next filter. |
| |
| return handler.service(request, response); |
| } |
| finally |
| { |
| long elapsed = System.currentTimeMillis() - startTime; |
| |
| logger.info(String.format("Request time: %d ms", elapsed)); |
| } |
| } |
| }; |
| } |
| |
| /** |
| * This is a contribution to the RequestHandler service configuration. This is how we extend Tapestry using the |
| * timing filter. A common use for this kind of filter is transaction management or security. |
| */ |
| public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration, |
| |
| @Local |
| RequestFilter filter) |
| { |
| // Each contribution to an ordered configuration has a name, When necessary, you may |
| // set constraints to precisely control the invocation order of the contributed filter |
| // within the pipeline. |
| |
| configuration.add("Timing", filter); |
| } |
| } |