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 3.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();
 
 	private final boolean _enabled//whether event thread enabled
 
 		final WebApp app = Executions.getCurrent().getDesktop().getWebApp();
 	}
 	
 	//-- ExecutionInit --//
 	public void init(Execution execExecution parent) {
 		if () {
 			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 () {
 			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 boolean init(Component compEvent evt) {
		if () {
			//Copy SessionMap stored in Execution attribute into event's ThreadLocal
			setSessionMap(map); //copy to event thread's ThreadLocal
		}
		return true;
	}
	//-- EventThreadResume --//
	public void beforeResume(Component compEvent evt) {
		//do nothing
	}
	public void afterResume(Component compEvent evt) {
		if () {
			//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