package ru.foror.articles.common.tapestry.ioc; import net.sf.ehcache.CacheManager; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.XMLConfiguration; import org.apache.tapestry5.hibernate.HibernateTransactionDecorator; import org.apache.tapestry5.hibernate.annotations.CommitAfter; import org.apache.tapestry5.internal.services.LinkFactory; import org.apache.tapestry5.internal.services.RequestPageCache; import org.apache.tapestry5.ioc.Configuration; import org.apache.tapestry5.ioc.MappedConfiguration; import org.apache.tapestry5.ioc.ServiceBinder; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Match; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.services.ApplicationGlobals; import org.apache.tapestry5.services.ApplicationStateContribution; import org.apache.tapestry5.services.ApplicationStateCreator; import org.apache.tapestry5.services.ApplicationStateManager; import org.apache.tapestry5.services.ComponentEventRequestHandler; import org.apache.tapestry5.services.Cookies; import org.apache.tapestry5.services.LibraryMapping; import org.apache.tapestry5.services.PageRenderRequestHandler; import org.apache.tapestry5.services.Response; import ru.foror.articles.common.domain.LoginAccount; import ru.foror.articles.common.operations.ILoginOperations; import ru.foror.articles.common.operations.ISearchOperations; import ru.foror.articles.common.operations.ITagOperations; import ru.foror.articles.common.operations.IUniversalOperations; import ru.foror.articles.common.operations.impl.SearchOperations; import ru.foror.articles.common.operations.impl.TagOperations; import ru.foror.articles.common.operations.impl.UniversalOperations; import ru.foror.articles.common.tapestry.common.AuthHelper; import ru.foror.articles.common.tapestry.common.IAuthHelper; import ru.foror.articles.common.tapestry.common.SecurityHandler; /** * Модуль common для IoC движка Tapestry. * * @author Alexey Pomogaev foror@mail.ru */ public class Module { public void contributeComponentClassResolver(Configuration configuration) { configuration.add(new LibraryMapping("common", "ru.foror.articles.common.tapestry")); } /** * Глобальная конфигурация системы. */ public void contributeApplicationDefaults(MappedConfiguration configuration) { configuration.add("common.config-path", "/WEB-INF/local.config.xml"); configuration.add("common.wymeditor-core", "classpath:ru/foror/articles/common/wymeditor/jquery.wymeditor.pack.js"); configuration.add("common.wymeditor-config", "classpath:ru/foror/articles/common/wymeditor/default.config.js"); configuration.add("common.jquery", "classpath:ru/foror/articles/common/jquery/jquery.js"); } public static void bind(ServiceBinder binder) { binder.bind(ITagOperations.class, TagOperations.class); binder.bind(IUniversalOperations.class, UniversalOperations.class); binder.bind(ISearchOperations.class, SearchOperations.class); } /** * Сервис для работы с XML конфигурацией проекта - local.config.xml. */ public org.apache.commons.configuration.Configuration buildConfiguration( @Inject @Symbol("common.config-path") String configPath, @Inject ApplicationGlobals g) { try { String path = g.getServletContext().getRealPath(configPath); return new XMLConfiguration(path); } catch (ConfigurationException e) { throw new RuntimeException(e); } } public IAuthHelper buildAuthHelper( @Inject @Symbol("tapestry.start-page-name") String startPageName, @Inject ApplicationStateManager appStateManager, @Inject Cookies cookies, @Inject ILoginOperations loginOp) { return new AuthHelper(startPageName, appStateManager, cookies, loginOp); } /** * Декоратор для перехвата запросов к страницам Tapestry. */ public PageRenderRequestHandler decoratePageRenderRequestHandler( Object delegate, @Inject IAuthHelper authHelper, @Inject ApplicationStateManager appStateManager, @Inject Response response, @Inject LinkFactory linkFactory, @Inject RequestPageCache cache) { return new SecurityHandler((PageRenderRequestHandler) delegate, authHelper, appStateManager, response, linkFactory, cache); } /** * Декоратор для перехвата запросов к страницам вызванных через события Tapestry. */ public ComponentEventRequestHandler decorateComponentEventRequestHandler( Object delegate, @Inject IAuthHelper authHelper, @Inject ApplicationStateManager appStateManager, @Inject Response response, @Inject LinkFactory linkFactory, @Inject RequestPageCache cache) { return new SecurityHandler((ComponentEventRequestHandler) delegate, authHelper, appStateManager, response, linkFactory, cache); } /** * Распределённый кеш. */ public CacheManager buildDefaultCacheManager() { return new CacheManager(CacheManager.class.getResource("/default.ehcache.xml")); } public void contributeApplicationStateManager(MappedConfiguration , ApplicationStateContribution> configuration) { ApplicationStateCreator loginAccount = new ApplicationStateCreator() { public LoginAccount create() { return new LoginAccount(); } }; configuration.add(LoginAccount.class, new ApplicationStateContribution("session", loginAccount)); } /** * Все сервисы, названия которых оканчивается на Operations будут проверяться * на {@link CommitAfter} аннотацию. */ @Match("*Operations") public static T decorateTransactionally(HibernateTransactionDecorator decorator, Class serviceInterface, T delegate, String serviceId) { return decorator.build(serviceInterface, delegate, serviceId); } public static void contributeHibernateEntityPackageManager(Configuration configuration) { configuration.add("ru.foror.articles.common.domain"); } }