package org.brixcms.plugin.demo.web; import javax.jcr.Repository; import org.apache.jackrabbit.core.RepositoryImpl; import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession; import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication; import org.apache.wicket.authroles.authorization.strategies.role.Roles; import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.spring.injection.annot.SpringComponentInjector; import org.brixcms.jcr.ThreadLocalSessionFactory; import org.brixcms.plugin.demo.ApplicationProperties; import org.brixcms.plugin.demo.web.admin.AdminPage; import org.brixcms.plugin.demo.web.signin.BrixSignInPage; import org.brixcms.util.JcrUtils; import org.brixcms.workspace.WorkspaceManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; /** * Factors out noise not necessary to demonstrating how to install Brix into a * Wicket application. This class takes care of peripheral duties such as * creating the Jcr repository, setting up JcrSessionFactory, etc. * * @author igor.vaynberg * @author dan.simko@gmail.com */ public abstract class AbstractWicketApplication extends AuthenticatedWebApplication { private static final Logger logger = LoggerFactory.getLogger(AbstractWicketApplication.class); @Autowired private ApplicationContext applicationContext; @Autowired private ApplicationProperties properties; /** * jcr repository */ private Repository repository; /** * jcr session factory. sessions created by this factory are cleaned up by * {@link WicketRequestCycleListener} */ private ThreadLocalSessionFactory sessionFactory; /** * workspace manager to be used by brix */ private WorkspaceManager workspaceManager; /** * @return application instance */ public static AbstractWicketApplication get() { return (AbstractWicketApplication) WebApplication.get(); } /** * @return application properties */ public final ApplicationProperties getProperties() { return properties; } /** * @return jcr repository */ public final Repository getRepository() { return repository; } /** * @return workspace manager */ public final WorkspaceManager getWorkspaceManager() { return workspaceManager; } /** * @return jcr session factory */ public final ThreadLocalSessionFactory getJcrSessionFactory() { return sessionFactory; } @Override protected void init() { super.init(); getComponentInstantiationListeners().add(new SpringComponentInjector(this, applicationContext)); logger.info("Using JCR repository url: " + properties.getJcrRepositoryUrl()); // create jcr repository repository = JcrUtils.createRepository(properties.getJcrRepositoryUrl()); // create session factory that will be used to feed brix jcr sessions sessionFactory = new DemoThreadLocalSessionFactory(repository, properties.buildSimpleCredentials()); try { // create workspace manager brix will use to access // workspace-related functionality workspaceManager = JcrUtils.createWorkspaceManager(properties.getWorkspaceManagerUrl(), sessionFactory); } finally { // since creating workspace manager may require access to session we // need to clean up cleanupSessionFactory(); } getMarkupSettings().setStripWicketTags(true); getRequestCycleListeners().add(new WicketRequestCycleListener()); MetaDataRoleAuthorizationStrategy.authorize(AdminPage.class, Roles.USER); } @Override protected Class<? extends AbstractAuthenticatedWebSession> getWebSessionClass() { return AuthenticatedSession.class; } @Override protected Class<? extends WebPage> getSignInPageClass() { return BrixSignInPage.class; } /** * cleans up any opened sessions in session factory */ public final void cleanupSessionFactory() { sessionFactory.cleanup(); } /** * {@inheritDoc} */ @Override protected void onDestroy() { // shutdown the repository cleanly if (repository instanceof RepositoryImpl) { logger.info("Shutting down JackRabbit repository..."); ((RepositoryImpl) repository).shutdown(); } super.onDestroy(); } public ApplicationContext getApplicationContext() { return applicationContext; } }