package fr.chantier.tapestry.services; import fr.chantier.service.*; import fr.chantier.service.impl.*; import fr.chantier.dao.*; import fr.chantier.dao.impl.*; import fr.chantier.tapestry.base.CookiePersistentField; import org.apache.tapestry5.SymbolConstants; import org.apache.tapestry5.hibernate.HibernateTransactionDecorator; import org.apache.tapestry5.ioc.Configuration; import org.apache.tapestry5.ioc.MappedConfiguration; import org.apache.tapestry5.ioc.OrderedConfiguration; import org.apache.tapestry5.ioc.ServiceBinder; import org.apache.tapestry5.ioc.annotations.Local; import org.apache.tapestry5.ioc.annotations.Match; import org.apache.tapestry5.services.*; import org.slf4j.Logger; import java.io.IOException; /** * 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(ClientsManager.class, ClientsManagerImpl.class); binder.bind(CommandesManager.class, CommandesManagerImpl.class); binder.bind(IntervenantsManager.class, IntervenantsManagerImpl.class); binder.bind(SousTraitantsManager.class, SousTraitantsManagerImpl.class); binder.bind(HistoriqueHeuresManager.class, HistoriqueHeuresManagerImpl.class); binder.bind(HistoriqueSommeManager.class, HistoriqueSommeManagerImpl.class); binder.bind(CoefficientManager.class, CoefficientManagerImpl.class); binder.bind(CommandesDAO.class, CommandesDAOImpl.class); binder.bind(ClientsDAO.class, ClientsDAOImpl.class); binder.bind(CoefficientDAO.class, CoefficientDAOImpl.class); binder.bind(HistoriqueHeuresDAO.class, HistoriqueHeuresDAOImpl.class); binder.bind(HistoriqueSommeDAO.class, HistoriqueSommeDAOImpl.class); binder.bind(IntervenantsDAO.class, IntervenantsDAOImpl.class); binder.bind(SousTraitantsDAO.class, SousTraitantsDAOImpl.class); // 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. } public void contributeHibernateEntityPackageManager(Configuration<String> configuration) { // extra packages... // tapestry-hibernate will add entities package automaticaly for TAPESTRY_APP_PACKAGE_PARAM+".entities" // configuration.add("tapestry.mini.entities"); } /** * Gere le @commitAfter * * @param decorator * @param serviceInterface * @param delegate * @param serviceId * @param <T> * @return */ @Match("*DAO") public static <T> T decorateTransactionally(HibernateTransactionDecorator decorator, Class<T> serviceInterface, T delegate, String serviceId) { return decorator.build(serviceInterface, delegate, serviceId); } public static void contributeApplicationDefaults( MappedConfiguration<String, String> 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"); // The factory default is true but during the early stages of an application // overriding to false is a good idea. In addition, this is often overridden // on the command line as -Dtapestry.production-mode=false configuration.add(SymbolConstants.PRODUCTION_MODE, "false"); } /** * 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); } public void contributePersistentFieldManager(MappedConfiguration<String, PersistentFieldStrategy> configuration, RequestGlobals requestGlobals, Request request) { configuration.add(CookiePersistentField.COOKIE, new CookiePersistentField(requestGlobals, request, CookiePersistentField.COOKIE)); configuration.add(CookiePersistentField.FLASHCOOKIE, new CookiePersistentField(requestGlobals, request, CookiePersistentField.FLASHCOOKIE)); } }