01: // Copyright 2007 The Apache Software Foundation
02: //
03: // Licensed under the Apache License, Version 2.0 (the "License");
04: // you may not use this file except in compliance with the License.
05: // You may obtain a copy of the License at
06: //
07: // http://www.apache.org/licenses/LICENSE-2.0
08: //
09: // Unless required by applicable law or agreed to in writing, software
10: // distributed under the License is distributed on an "AS IS" BASIS,
11: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12: // See the License for the specific language governing permissions and
13: // limitations under the License.
14:
15: package org.apache.tapestry.tutorial.services;
16:
17: import java.io.IOException;
18:
19: import org.apache.commons.logging.Log;
20: import org.apache.tapestry.ioc.MappedConfiguration;
21: import org.apache.tapestry.ioc.OrderedConfiguration;
22: import org.apache.tapestry.ioc.annotations.InjectService;
23: import org.apache.tapestry.services.Request;
24: import org.apache.tapestry.services.RequestFilter;
25: import org.apache.tapestry.services.RequestHandler;
26: import org.apache.tapestry.services.Response;
27:
28: /**
29: * This module is automatically included as part of the Tapestry IoC Registry, it's a good place to
30: * configure and extend Tapestry, or to place your own services.
31: */
32: public class AppModule {
33: public static void contributeApplicationDefaults(
34: MappedConfiguration<String, String> configuration) {
35: // Contributions to ApplicationDefaults will override any contributions to
36: // FactoryDefaults (with the same key). Here we're restricting the supported
37: // locales to just "en" (English). As you add localised message catalogs and other assets,
38: // you can extend this list of locales (it's a comma seperated series of locale names;
39: // the first locale name is the default when there's no reasonable match).
40:
41: configuration.add("tapestry.supported-locales", "en");
42: }
43:
44: /**
45: * This is a service definition, the service will be named TimingFilter. The interface,
46: * RequestFilter, is used within the RequestHandler service pipeline, which is built from the
47: * RequestHandler service configuration. Tapestry IoC is responsible for passing in an
48: * appropriate Log instance. Requests for static resources are handled at a higher level, so
49: * this filter will only be invoked for Tapestry related requests.
50: */
51: public RequestFilter buildTimingFilter(final Log log) {
52: return new RequestFilter() {
53: public boolean service(Request request, Response response,
54: RequestHandler handler) throws IOException {
55: long startTime = System.currentTimeMillis();
56:
57: try {
58: // The reponsibility of a filter is to invoke the corresponding method
59: // in the handler. When you chain multiple filters together, each filter
60: // received a handler that is a bridge to the next filter.
61:
62: return handler.service(request, response);
63: } finally {
64: long elapsed = System.currentTimeMillis()
65: - startTime;
66:
67: log.info(String.format("Request time: %d ms",
68: elapsed));
69: }
70: }
71: };
72: }
73:
74: /**
75: * This is a contribution to the RequestHandler service configuration. This is how we extend
76: * Tapestry using the timing filter. A common use for this kind of filter is transaction
77: * management or security.
78: */
79: public void contributeRequestHandler(
80: OrderedConfiguration<RequestFilter> configuration,
81: @InjectService("TimingFilter")
82: RequestFilter filter) {
83: // Each contribution to an ordered configuration has a name, When necessary, you may
84: // set constraints to precisely control the invocation order of the contributed filter
85: // within the pipeline.
86:
87: configuration.add("Timing", filter);
88: }
89: }
|