package org.springmodules.jcr.support; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.support.DaoSupport; import org.springframework.util.Assert; import org.springmodules.jcr.JcrTemplate; import org.springmodules.jcr.SessionFactory; import org.springmodules.jcr.SessionFactoryUtils; /** * Convenient class for accessing Jcr objects. * * * @author Costin Leau * @author Guillaume Bort <guillaume.bort@zenexity.fr> */ public abstract class JcrDaoSupport extends DaoSupport { private JcrTemplate template; /** * Set the JCR SessionFactory to be used by this DAO. * Will automatically create a JcrTemplate for the given SessionFactory. * @see #createJcrTemplate * @see #setJcrTemplate */ public final void setSessionFactory(SessionFactory sessionFactory) { this.template = new JcrTemplate(sessionFactory); } /** * Return the Jcr SessionFactory used by this DAO. */ public final SessionFactory getSessionFactory() { return (template != null ? template.getSessionFactory() : null); } /** * Set the JcrTemplate for this DAO explicitly, * as an alternative to specifying a SessionFactory. * @see #setSessionFactory */ public final void setTemplate(JcrTemplate jcrTemplate) { this.template = jcrTemplate; } /** * Return the JcrTemplate for this DAO, pre-initialized * with the SessionFactory or set explicitly. */ public final JcrTemplate getTemplate() { return template; } protected final void checkDaoConfig() { Assert.notNull(template, "sessionFactory or jcrTemplate is required"); } /** * Get a JCR Session, either from the current transaction or * a new one. The latter is only allowed if the "allowCreate" setting * of this bean's JcrTemplate is true. * @return the JCR Session * @throws DataAccessResourceFailureException if the Session couldn't be created * @throws IllegalStateException if no thread-bound Session found and allowCreate false * @see org.springmodules.jcr.SessionFactoryUtils#getSession */ protected final Session getSession() { return getSession(this.template.isAllowCreate()); } /** * Get a JCR Session, either from the current transaction or * a new one. The latter is only allowed if "allowCreate" is true. * @param allowCreate if a non-transactional Session should be created * when no transactional Session can be found for the current thread * @return the JCR Session * @throws DataAccessResourceFailureException if the Session couldn't be created * @throws IllegalStateException if no thread-bound Session found and allowCreate false * @see org.springmodules.jcr.SessionFactoryUtils#getSession */ protected final Session getSession(boolean allowCreate) throws DataAccessResourceFailureException, IllegalStateException { return SessionFactoryUtils.getSession(getSessionFactory(), allowCreate); } /** * Convert the given JCRException to an appropriate exception from the * org.springframework.dao hierarchy. * <p>Delegates to the convertJCRAccessException method of this DAO's JCRTemplate. * @param ex JCRException that occured * @return the corresponding DataAccessException instance * @see #setJCRTemplate * @see org.springmodules.jcr.JcrTemplate#convertJCRAccessException */ protected final DataAccessException convertJcrAccessException(RepositoryException ex) { return this.template.convertJcrAccessException(ex); } /** * Close the given JCR Session, created via this DAO's * SessionFactory, if it isn't bound to the thread. * @param pm Session to close * @see org.springframework.orm.JCR.SessionFactoryUtils#releaseSession */ protected final void releaseSession(Session session) { SessionFactoryUtils.releaseSession(session, getSessionFactory()); } }