View Javadoc

1   /**
2    * This file is part of the equanda project.
3    *
4    * The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at http://www.mozilla.org/MPL/
7    *
8    * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
9    * ANY KIND, either express or implied. See the License for the specific language governing rights and
10   * limitations under the License.
11   *
12   * Alternatively, the contents of this file may be used under the terms of
13   * either the GNU General Public License Version 2 or later (the "GPL"), or
14   * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
15   * in which case the provisions of the GPL or the LGPL are applicable instead
16   * of those above. If you wish to allow use of your version of this file only
17   * under the terms of either the GPL or the LGPL, and not to allow others to
18   * use your version of this file under the terms of the MPL, indicate your
19   * decision by deleting the provisions above and replace them with the notice
20   * and other provisions required by the GPL or the LGPL. If you do not delete
21   * the provisions above, a recipient may use your version of this file under
22   * the terms of any one of the MPL, the GPL or the LGPL.
23   */
24  
25  package org.equanda.test.gui.services;
26  
27  import javassist.runtime.Desc;
28  import org.apache.tapestry5.Translator;
29  import org.apache.tapestry5.ioc.Configuration;
30  import org.apache.tapestry5.ioc.MappedConfiguration;
31  import org.apache.tapestry5.ioc.OrderedConfiguration;
32  import org.apache.tapestry5.ioc.ServiceBinder;
33  import org.apache.tapestry5.ioc.annotations.InjectService;
34  import org.apache.tapestry5.ioc.services.Coercion;
35  import org.apache.tapestry5.ioc.services.CoercionTuple;
36  import org.apache.tapestry5.services.Request;
37  import org.apache.tapestry5.services.RequestFilter;
38  import org.apache.tapestry5.services.RequestHandler;
39  import org.apache.tapestry5.services.Response;
40  import org.slf4j.Logger;
41  
42  import java.io.IOException;
43  
44  /**
45   * This module is automatically included as part of the Tapestry IoC Registry, it's a good place to configure and extend
46   * Tapestry, or to place your own service definitions.
47   */
48  public class AppModule
49  {
50      /**
51       * Bind extra services.
52       *
53       * @param binder object to bind services to
54       */
55      public static void bind( ServiceBinder binder )
56      {
57          // binder.bind(MyServiceInterface.class, MyServiceImpl.class);
58  
59          // Make bind() calls on the binder object to define most IoC services.
60          // Use service builder methods (example below) when the implementation
61          // is provided inline, or requires more initialization than simply
62          // invoking the constructor.
63  
64          // assure that the ContextClassLoader is used by javassist (seems to not be the default)
65          System.out.println( "Desc.useContextClassLoader = " + Desc.useContextClassLoader );
66          javassist.runtime.Desc.useContextClassLoader = true;
67      }
68  
69      /**
70       * Contribute application defaults
71       *
72       * @param configuration configuration to add to
73       */
74      public static void contributeApplicationDefaults(
75          MappedConfiguration<String, String> configuration )
76      {
77          // Contributions to ApplicationDefaults will override any contributions to
78          // FactoryDefaults (with the same key). Here we're restricting the supported
79          // locales to just "en" (English). As you add localised message catalogs and other assets,
80          // you can extend this list of locales (it's a comma seperated series of locale names;
81          // the first locale name is the default when there's no reasonable match).
82  
83          configuration.add( "tapestry.supported-locales", "en,nl" );
84      }
85  
86  
87      /**
88       * This is a service definition, the service will be named "TimingFilter". The interface, RequestFilter, is used
89       * within the RequestHandler service pipeline, which is built from the RequestHandler service configuration.
90       * Tapestry IoC is responsible for passing in an appropriate Log instance. Requests for static resources are handled
91       * at a higher level, so this filter will only be invoked for Tapestry related requests.
92       * <p/>
93       * <p/>
94       * Service builder methods are useful when the implementation is inline as an inner class (as here) or require some
95       * other kind of special initialization. In most cases, use the static bind() method instead.
96       * <p/>
97       * <p/>
98       * If this method was named "build", then the service id would be taken from the service interface and would be
99       * "RequestFilter".  Since Tapestry already defines a service named "RequestFilter" we use an explicit service id
100      * that we can reference inside the contribution method.
101      *
102      * @param log log
103      * @return request filter
104      */
105     public RequestFilter buildTimingFilter( final Logger log )
106     {
107         return new RequestFilter()
108         {
109             public boolean service( Request request, Response response, RequestHandler handler )
110                 throws IOException
111             {
112                 long startTime = System.currentTimeMillis();
113 
114                 try
115                 {
116                     // The reponsibility of a filter is to invoke the corresponding method
117                     // in the handler. When you chain multiple filters together, each filter
118                     // received a handler that is a bridge to the next filter.
119 
120                     return handler.service( request, response );
121                 }
122                 finally
123                 {
124                     long elapsed = System.currentTimeMillis() - startTime;
125 
126                     log.info( String.format( "Request time: %d ms", elapsed ) );
127                 }
128             }
129         };
130     }
131 
132     /**
133      * This is a contribution to the RequestHandler service configuration. This is how we extend Tapestry using the
134      * timing filter. A common use for this kind of filter is transaction management or security.
135      *
136      * @param configuration configuration to add to
137      * @param filter filter info
138      */
139     public void contributeRequestHandler( OrderedConfiguration<RequestFilter> configuration,
140                                           @InjectService( "TimingFilter" )
141                                           RequestFilter filter )
142     {
143         // Each contribution to an ordered configuration has a name, When necessary, you may
144         // set constraints to precisely control the invocation order of the contributed filter
145         // within the pipeline.
146 
147         configuration.add( "Timing", filter );
148     }
149 }