View Javadoc

1   package org.appfuse.webapp.services;
2   
3   import org.apache.tapestry5.MarkupWriter;
4   import org.apache.tapestry5.SymbolConstants;
5   import org.apache.tapestry5.ValidationDecorator;
6   import org.apache.tapestry5.ValueEncoder;
7   import org.apache.tapestry5.ioc.MappedConfiguration;
8   import org.apache.tapestry5.ioc.OrderedConfiguration;
9   import org.apache.tapestry5.ioc.ServiceBinder;
10  import org.apache.tapestry5.ioc.annotations.Contribute;
11  import org.apache.tapestry5.ioc.annotations.Symbol;
12  import org.apache.tapestry5.ioc.services.ThreadLocale;
13  import org.apache.tapestry5.services.*;
14  import org.apache.tapestry5.services.javascript.JavaScriptStack;
15  import org.apache.tapestry5.upload.services.UploadSymbols;
16  import org.appfuse.model.Role;
17  import org.appfuse.model.User;
18  import org.appfuse.service.RoleManager;
19  import org.appfuse.service.UserManager;
20  import org.appfuse.webapp.AppFuseSymbolConstants;
21  import org.appfuse.webapp.data.FileData;
22  import org.appfuse.webapp.services.impl.*;
23  import org.appfuse.webapp.services.javascript.BootstrapJavaScriptStack;
24  import org.slf4j.Logger;
25  
26  import java.io.IOException;
27  
28  
29  /**
30   * Application global configurations
31   *
32   * @author Serge Eby
33   * @version $Id: AppModule.java 5 2008-08-30 09:59:21Z serge.eby $
34   */
35  public class AppModule {
36  
37      public static void bind(ServiceBinder binder) {
38          binder.bind(SecurityContext.class, SpringSecurityContext.class);
39          binder.bind(EmailService.class, EmailServiceImpl.class);
40      }
41  
42  //
43  //    public static MenuModelSource buildMenuModelSource(Logger logger, @Inject SecurityContext securityContext) {
44  //        return new MenuModelSourceImpl(logger, securityContext);
45  //    }
46  
47      //@Contribute(SymbolProvider.class)
48      //@ApplicationDefaults
49      //public static void enableDevelopmentMode(MappedConfiguration<String, Object> configuration) {
50      public static void contributeApplicationDefaults(MappedConfiguration<String, String> configuration) {
51          configuration.add(SymbolConstants.SUPPORTED_LOCALES,
52                  "de,en,es,fr,it,ko,nl,no,pt_BR,pt,tr,zh_CN,zh_TW,en_US");
53  
54  
55          // Turn off GZip Compression since it causes issues with SiteMesh
56          configuration.add(SymbolConstants.GZIP_COMPRESSION_ENABLED, "false");
57  
58          // The factory default is true but during the early stages of an application
59          // overriding to false is a good idea. In addition, this is often overridden
60          // on the command line as -Dtapestry.production-mode=false
61          configuration.add(SymbolConstants.PRODUCTION_MODE, "false");
62  
63          // Maximum upload size is 2MB (size is in bytes)
64          configuration.add(UploadSymbols.FILESIZE_MAX, "2048000");
65  
66          // Spring Security
67          configuration.add(AppFuseSymbolConstants.SECURITY_URL, "/j_security_check");
68  
69      }
70  
71  
72      public static CountryService buildCountryService(final Logger logger, final ThreadLocale threadLocale) {
73          return new CountryServiceImpl(logger, threadLocale);
74      }
75  
76      @Contribute(ValueEncoderSource.class)
77      public static void provideEncoders(
78              MappedConfiguration<Class, ValueEncoderFactory> configuration,
79              UserManager userManager,
80              RoleManager roleManager) {
81  
82          contributeEncoder(configuration, User.class, new UserEncoder(userManager));
83          contributeEncoder(configuration, Role.class, new RoleEncoder(roleManager));
84          contributeEncoder(configuration, FileData.class, new FileDataEncoder());
85  
86  
87      }
88  
89      public static void contributeJavaScriptStackSource(MappedConfiguration<String, JavaScriptStack> configuration) {
90          configuration.addInstance(AppFuseSymbolConstants.BOOTSTRAP_STACK, BootstrapJavaScriptStack.class);
91      }
92  
93      private static <T> void contributeEncoder(MappedConfiguration<Class, ValueEncoderFactory> configuration,
94                                                Class<T> clazz, final ValueEncoder<T> encoder) {
95  
96          ValueEncoderFactory<T> factory = new ValueEncoderFactory<T>() {
97  
98              public ValueEncoder<T> create(Class<T> clazz) {
99                  return encoder;
100             }
101         };
102 
103         configuration.add(clazz, factory);
104     }
105 
106 
107 //    @Contribute(BeanBlockOverrideSource.class)
108 //    public static void providePropertyBlocks(
109 //            Configuration<BeanBlockContribution> configuration) {
110 //
111 //        addEditBlock(configuration, DataTypeConstants.TEXT);
112 //        addEditBlock(configuration, DataTypeConstants.NUMBER);
113 //        addEditBlock(configuration, DataTypeConstants.ENUM);
114 //        addEditBlock(configuration, DataTypeConstants.BOOLEAN);
115 //        addEditBlock(configuration, DataTypeConstants.DATE);
116 //        addEditBlock(configuration, DataTypeConstants.PASSWORD);
117 //        addEditBlock(configuration, "hashedpassword");
118 //        addEditBlock(configuration, DataTypeConstants.CALENDAR);
119 //        addEditBlock(configuration, DataTypeConstants.LONG_TEXT);
120 //
121 //    }
122 //
123 //    private static void addEditBlock(Configuration<BeanBlockContribution> configuration, String dataType) {
124 //        configuration.add(new EditBlockContribution(dataType, "AppPropertyEditBlocks", dataType));
125 //    }
126 //
127 //
128 //    private static void addDisplayBlock(Configuration<BeanBlockContribution> configuration, String dataType) {
129 //        configuration.add(new DisplayBlockContribution(dataType, "AppPropertyDisplayBlocks", dataType));
130 //    }
131 
132 
133     public void contributeMarkupRenderer(OrderedConfiguration<MarkupRendererFilter> configuration,
134                                          final Environment environment
135 
136     ) {
137         MarkupRendererFilter bootstrapValidationDecorator = new MarkupRendererFilter() {
138 
139             public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) {
140 
141 
142                 environment.push(ValidationDecorator.class, new BootstrapValidationDecorator(environment, writer));
143 
144                 renderer.renderMarkup(writer);
145 
146                 environment.pop(ValidationDecorator.class);
147             }
148         };
149         //configuration.add("BootstrapValidationDecorator", bootstrapValidationDecorator, "after:ValidationDecorator");
150         configuration.override("ValidationDecorator", bootstrapValidationDecorator);
151 
152     }
153 
154 
155     /**
156      * Decorate Error page
157      *
158      * @param logger
159      * @param renderer
160      * @param componentSource
161      * @param productionMode
162      * @param service
163      * @return
164      */
165     public RequestExceptionHandler decorateRequestExceptionHandler(
166             final Logger logger,
167             final ResponseRenderer renderer,
168             final ComponentSource componentSource,
169             @Symbol(SymbolConstants.PRODUCTION_MODE)
170             boolean productionMode,
171             Object service) {
172         if (!productionMode) {
173             return null;
174         }
175 
176         return new RequestExceptionHandler() {
177             public void handleRequestException(Throwable exception) throws IOException {
178                 logger.error("Unexpected runtime exception: " + exception.getMessage(), exception);
179                 ExceptionReporter error = (ExceptionReporter) componentSource.getPage("Error");
180                 error.reportException(exception);
181                 renderer.renderPageMarkupResponse("Error");
182             }
183         };
184     }
185 
186 
187 //    public static void contributeSymbolSource(OrderedConfiguration<SymbolProvider> providers) {
188 //        providers.add("springSecurity", new ClasspathResourceSymbolProvider("security.properties"));
189 //    }
190 
191 }