Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* HibernateSessionContextListener.java
  
  {{IS_NOTE
  	Purpose:
  		
  	Description:
  		
  	History:
  		Tue Sep  11 12:55:11     2006, Created by henrichen
 }}IS_NOTE
 
 Copyright (C) 2006 Potix Corporation. All Rights Reserved.
 
 {{IS_RIGHT
 	This program is distributed under GPL Version 2.0 in the hope that
 	it will be useful, but WITHOUT ANY WARRANTY.
 }}IS_RIGHT
 */
 package org.zkoss.zkplus.hibernate;
 
 
 import java.util.Map;
 
 import java.util.List;

Listener to make sure each ZK thread got the same hibernat session context; used with Hibernate's "thread" session context (org.hibernate.context.ThreadLocalSessionContext).

This listener is used with Hibernate's (version 3.1+) "thread" session context. That is, when you specify


 hibernate.current_session_context_class = thread
 

then you have to add following lines in application's WEB-INF/zk.xml:


  <listener>
  <description>Hibernate thread session context management</description>
  <listener-class>org.zkoss.zkplus.hibernate.HibernateSessionContextListener</listener-class>
 </listener>
 

Author(s):
henrichen
 
 	private static final Log log = Log.lookup(HibernateSessionContextListener.class);
 	private static final String HIBERNATE_SESSION_MAP = "org.zkoss.zkplus.hibernate.SessionMap";
 	private static final Object SOMETHING = new Object();
 
 	//-- ExecutionInit --//
 	public void init(Execution execExecution parent) {
 		if (parent == null) { //root execution
 			//always prepare a ThreadLocal SessionMap in Execution attribute
 			Map map = getSessionMap();
 			if (map == null) {
 				map = new HashMap();
 				setSessionMap(map); //copy to servlet thread's ThreadLocal
 			}
 			exec.setAttribute(map); // store in Execution attribute
 			
 			//20060912, henrichen: tricky. Stuff something into session map to 
 			//prevent the map from being removed from context ThreadLocal by the 
 			//ThreadLocalSessionContext#unbind() when it is empty.
 			map.put(null); 
 		}
 	}
 	
 	//-- ExecutionCleanup --//
 	public void cleanup(Execution execExecution parentList errs) {
 		if (parent == null) { //root execution
 			Map map = getSessionMap();
 			if (map != null) {
 				//20060912, henrichen: tricky. Remove the previously stuffed 
 				//something (when ExecutuionInit#init() is called) from 
 				//session map to make the map possible to be removed by the 
 				//ThreadLocalSessionContext#unbind() when it is empty.
 			}
 		}
 	}
 	
 	//-- EventThreadInit --//
 	public void prepare(Component compEvent evt) {
		//do nothing
	}
	public void init(Component compEvent evt) {
		//Copy SessionMap stored in Execution attribute into event's ThreadLocal
		setSessionMap(map); //copy to event thread's ThreadLocal
	}
	//-- EventThreadResume --//
	public void beforeResume(Component compEvent evt) {
		//do nothing
	}
	public void afterResume(Component compEvent evt) {
		//always keep the prepared SessionMap in event's ThreadLocal
		setSessionMap(map); //copy to event thread's ThreadLocal
	}
	public void abortResume(Component compEvent evt){
		//do nothing
	}
	//-- utilities --//
	private void setSessionMap(Map map) {
	}
	private Map getSessionMap() {
	}
		return ThreadLocals.getThreadLocal("org.hibernate.context.ThreadLocalSessionContext""context");
	}
New to GrepCode? Check out our FAQ X