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
31
32
33
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
44
45
46
47
48
49
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
56 configuration.add(SymbolConstants.GZIP_COMPRESSION_ENABLED, "false");
57
58
59
60
61 configuration.add(SymbolConstants.PRODUCTION_MODE, "false");
62
63
64 configuration.add(UploadSymbols.FILESIZE_MAX, "2048000");
65
66
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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
150 configuration.override("ValidationDecorator", bootstrapValidationDecorator);
151
152 }
153
154
155
156
157
158
159
160
161
162
163
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
188
189
190
191 }