package de.onyxbits.tradetrax.services; import java.io.File; import org.apache.tapestry5.*; import org.apache.tapestry5.hibernate.HibernateConfigurer; import org.apache.tapestry5.hibernate.HibernateSymbols; import org.apache.tapestry5.ioc.MappedConfiguration; import org.apache.tapestry5.ioc.OrderedConfiguration; import org.apache.tapestry5.ioc.ServiceBinder; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.ApplicationGlobals; import de.onyxbits.tradetrax.main.AppConstants; /** * This module is automatically included as part of the Tapestry IoC Registry, * it's a good place to configure and extend Tapestry, or to place your own * service definitions. */ public class AppModule { public static void bind(ServiceBinder binder) { // binder.bind(MyServiceInterface.class, MyServiceImpl.class); // Make bind() calls on the binder object to define most IoC services. // Use service builder methods (example below) when the implementation // is provided inline, or requires more initialization than simply // invoking the constructor. binder.bind(SettingsStore.class); binder.bind(EventLogger.class); binder.bind(MoneyRepresentation.class); } public static void contributeFactoryDefaults(MappedConfiguration<String, Object> configuration) { // The application version number is incorprated into URLs for some // assets. Web browsers will cache assets because of the far future expires // header. If existing assets are changed, the version number should also // change, to force the browser to download new versions. This overrides // Tapesty's default // (a random hexadecimal number), but may be further overriden by // DevelopmentModule or // QaModule. configuration.override(SymbolConstants.APPLICATION_VERSION, "v"+AppConstants.VERSION); configuration.override(SymbolConstants.CLUSTERED_SESSIONS,false); configuration.override(SymbolConstants.OMIT_GENERATOR_META,true); } public static void contributeApplicationDefaults(MappedConfiguration<String, Object> configuration) { // Contributions to ApplicationDefaults will override any contributions to // FactoryDefaults (with the same key). Here we're restricting the supported // locales to just "en" (English). As you add localised message catalogs and // other assets, // you can extend this list of locales (it's a comma separated series of // locale names; // the first locale name is the default when there's no reasonable match). configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en"); configuration.add(HibernateSymbols.DEFAULT_CONFIGURATION, "false"); configuration.add(ComponentParameterConstants.GRIDCOLUMNS_SORTABLE_ASSET,"context:/images/sort-sortable.png"); configuration.add(ComponentParameterConstants.GRIDCOLUMNS_ASCENDING_ASSET,"context:/images/sort-asc.png"); configuration.add(ComponentParameterConstants.GRIDCOLUMNS_DESCENDING_ASSET,"context:/images/sort-desc.png"); } /** * This is a service definition, the service will be named "TimingFilter". The * interface, RequestFilter, is used within the RequestHandler service * pipeline, which is built from the RequestHandler service configuration. * Tapestry IoC is responsible for passing in an appropriate Logger instance. * Requests for static resources are handled at a higher level, so this filter * will only be invoked for Tapestry related requests. * <p/> * <p/> * Service builder methods are useful when the implementation is inline as an * inner class (as here) or require some other kind of special initialization. * In most cases, use the static bind() method instead. * <p/> * <p/> * If this method was named "build", then the service id would be taken from * the service interface and would be "RequestFilter". Since Tapestry already * defines a service named "RequestFilter" we use an explicit service id that * we can reference inside the contribution method. * public RequestFilter buildTimingFilter(final Logger log) { return new RequestFilter() { public boolean service(Request request, Response response, RequestHandler handler) throws IOException { long startTime = System.currentTimeMillis(); try { // The responsibility of a filter is to invoke the corresponding // method // in the handler. When you chain multiple filters together, each // filter // received a handler that is a bridge to the next filter. return handler.service(request, response); } finally { long elapsed = System.currentTimeMillis() - startTime; log.info(String.format("Request time: %d ms", elapsed)); } } }; }*/ /** * This is a contribution to the RequestHandler service configuration. This is * how we extend Tapestry using the timing filter. A common use for this kind * of filter is transaction management or security. The @Local annotation * selects the desired service by type, but only from the same module. Without * * @Local, there would be an error due to the other service(s) that implement * RequestFilter (defined in other modules). * public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration, @Local RequestFilter filter) { // Each contribution to an ordered configuration has a name, When necessary, // you may // set constraints to precisely control the invocation order of the // contributed filter // within the pipeline. //configuration.add("Timing", filter); }*/ @Inject private ApplicationGlobals globals; public void contributeHibernateSessionSource(OrderedConfiguration<HibernateConfigurer> configurer) { String path = globals.getServletContext().getInitParameter(AppConstants.IPNLEDGERPATH); // WARNING: This is here for the benefit of developers so they can switch // ledgers without having to use the StandaloneServer. WAR deployments // should be configured through the web.xml file and not a system property. // System properties apply to the whole servlet container, making it // impossible to serve multiple ledgers at once. path = System.getProperty("app.ledger", path); File dbdir = new File(System.getProperty("user.dir")); if (path != null) { dbdir = new File(path); } configurer.add("hibernate-session-source", new LedgerConfigurer(dbdir)); } }