| 1 16 17 package org.springframework.orm.jdo.support; 18 19 import java.io.IOException ; 20 21 import javax.jdo.PersistenceManager; 22 import javax.jdo.PersistenceManagerFactory; 23 import javax.servlet.FilterChain ; 24 import javax.servlet.ServletException ; 25 import javax.servlet.http.HttpServletRequest ; 26 import javax.servlet.http.HttpServletResponse ; 27 28 import org.springframework.orm.jdo.PersistenceManagerFactoryUtils; 29 import org.springframework.orm.jdo.PersistenceManagerHolder; 30 import org.springframework.transaction.support.TransactionSynchronizationManager; 31 import org.springframework.web.context.WebApplicationContext; 32 import org.springframework.web.context.support.WebApplicationContextUtils; 33 import org.springframework.web.filter.OncePerRequestFilter; 34 35 62 public class OpenPersistenceManagerInViewFilter extends OncePerRequestFilter { 63 64 public static final String DEFAULT_PERSISTENCE_MANAGER_FACTORY_BEAN_NAME = "persistenceManagerFactory"; 65 66 private String persistenceManagerFactoryBeanName = DEFAULT_PERSISTENCE_MANAGER_FACTORY_BEAN_NAME; 67 68 69 74 public void setPersistenceManagerFactoryBeanName(String persistenceManagerFactoryBeanName) { 75 this.persistenceManagerFactoryBeanName = persistenceManagerFactoryBeanName; 76 } 77 78 82 protected String getPersistenceManagerFactoryBeanName() { 83 return this.persistenceManagerFactoryBeanName; 84 } 85 86 87 protected void doFilterInternal( 88 HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 89 throws ServletException , IOException { 90 91 PersistenceManagerFactory pmf = lookupPersistenceManagerFactory(request); 92 boolean participate = false; 93 94 if (TransactionSynchronizationManager.hasResource(pmf)) { 95 participate = true; 97 } 98 else { 99 logger.debug("Opening JDO PersistenceManager in OpenPersistenceManagerInViewFilter"); 100 PersistenceManager pm = PersistenceManagerFactoryUtils.getPersistenceManager(pmf, true); 101 TransactionSynchronizationManager.bindResource(pmf, new PersistenceManagerHolder(pm)); 102 } 103 104 try { 105 filterChain.doFilter(request, response); 106 } 107 108 finally { 109 if (!participate) { 110 PersistenceManagerHolder pmHolder = (PersistenceManagerHolder) 111 TransactionSynchronizationManager.unbindResource(pmf); 112 logger.debug("Closing JDO PersistenceManager in OpenPersistenceManagerInViewFilter"); 113 PersistenceManagerFactoryUtils.releasePersistenceManager(pmHolder.getPersistenceManager(), pmf); 114 } 115 } 116 } 117 118 126 protected PersistenceManagerFactory lookupPersistenceManagerFactory(HttpServletRequest request) { 127 return lookupPersistenceManagerFactory(); 128 } 129 130 137 protected PersistenceManagerFactory lookupPersistenceManagerFactory() { 138 if (logger.isDebugEnabled()) { 139 logger.debug("Using PersistenceManagerFactory '" + getPersistenceManagerFactoryBeanName() + 140 "' for OpenPersistenceManagerInViewFilter"); 141 } 142 WebApplicationContext wac = 143 WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); 144 return (PersistenceManagerFactory) 145 wac.getBean(getPersistenceManagerFactoryBeanName(), PersistenceManagerFactory.class); 146 } 147 148 } 149 | Popular Tags |