package org.appfuse.webapp.services; import org.apache.tapestry5.SymbolConstants; import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.ioc.MappedConfiguration; import org.apache.tapestry5.ioc.OrderedConfiguration; import org.apache.tapestry5.ioc.annotations.Contribute; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.services.*; import org.appfuse.model.User; import org.appfuse.service.UserManager; import org.appfuse.webapp.services.impl.UserEncoder; import org.slf4j.Logger; import java.io.IOException; /** * Application global configurations * * @author Serge Eby * @version $Id: AppModule.java 5 2008-08-30 09:59:21Z serge.eby $ */ public class AppModule { public static void contributeApplicationDefaults(MappedConfiguration<String, String> configuration) { configuration.add(SymbolConstants.GZIP_COMPRESSION_ENABLED, "false"); // HHAC recommended for better security as of Tapestry 5.3.6 configuration.add(SymbolConstants.HMAC_PASSPHRASE, "AppFuse Tapestry Light is Cool"); // Settings to allow template reloading with jetty:run configuration.add(SymbolConstants.FILE_CHECK_INTERVAL, "1 s"); configuration.add(SymbolConstants.PRODUCTION_MODE, "false"); configuration.add(SymbolConstants.EXECUTION_MODE, "DevelopmentMode"); } /** * Decorate Error page * * @param logger * @param renderer * @param componentSource * @param productionMode * @param service * @return */ public RequestExceptionHandler decorateRequestExceptionHandler( final Logger logger, final ResponseRenderer renderer, final ComponentSource componentSource, @Symbol(SymbolConstants.PRODUCTION_MODE) boolean productionMode, Object service) { if (!productionMode) { return null; } return new RequestExceptionHandler() { public void handleRequestException(Throwable exception) throws IOException { logger.error("Unexpected runtime exception: " + exception.getMessage(), exception); ExceptionReporter error = (ExceptionReporter) componentSource.getPage("Error"); error.reportException(exception); renderer.renderPageMarkupResponse("Error"); } }; } @Contribute(ValueEncoderSource.class) public static void provideEncoders( MappedConfiguration<Class, ValueEncoderFactory> configuration, UserManager userManager) { contributeEncoder(configuration, User.class, new UserEncoder(userManager)); } private static <T> void contributeEncoder(MappedConfiguration<Class, ValueEncoderFactory> configuration, Class<T> clazz, final ValueEncoder<T> encoder) { ValueEncoderFactory<T> factory = new ValueEncoderFactory<T>() { public ValueEncoder<T> create(Class<T> clazz) { return encoder; } }; configuration.add(clazz, factory); } }