package org.exoplatform.portal.gadget.core;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import org.apache.commons.io.IOUtils;
import org.apache.shindig.common.servlet.GuiceServletContextListener;
import org.gatein.common.logging.Logger;
import org.gatein.common.logging.LoggerFactory;
/**
*
* Extending the GuiceServletContextListener to setup a ThreadLocal<GateInContainerConfigLoader> variable wrapping the
* ServletContext. That makes the ServletContext accessible within the scope of thread executing the method contextInitialized
*
*
* User: Minh Hoang TO - hoang281283@gmail.com Date: 1/12/11 Time: 3:50 PM
*/
public class GateInGuiceServletContextListener extends GuiceServletContextListener {
private static ThreadLocal<GateInContainerConfigLoader> currentLoader = new ThreadLocal<GateInContainerConfigLoader>();
private final Logger log = LoggerFactory.getLogger(GateInGuiceServletContextListener.class);
@Override
public void contextInitialized(ServletContextEvent event) {
final ServletContext scontext = event.getServletContext();
GateInContainerConfigLoader loader = new GateInContainerConfigLoader() {
@Override
public String loadContentAsString(String path, String encoding) throws IOException {
// To make sure that the path begins with a slash, as required in the javadoc of method
// getResourceAsStream in ServletContext
// The leading slash is required on certain application servers such as JBoss, WebSphere
if ('/' != path.charAt(0)) {
path = '/' + path;
}
InputStream is = scontext.getResourceAsStream(path);
return (is != null) ? IOUtils.toString(is, encoding) : null;
}
@Override
public InputStream loadResourceAsStream(String path) {
// To make sure that the path begins with a slash, as required in the javadoc of method
// getResourceAsStream in ServletContext
// The leading slash is required on certain application servers such as JBoss, WebSphere
if ('/' != path.charAt(0)) {
path = '/' + path;
}
return scontext.getResourceAsStream(path);
}
};
// Setup the threadlocal loader
currentLoader.set(loader);
try {
// Setup the Guice objects, the threadlocal loader is accessible for the moment
super.contextInitialized(event);
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
// Reset the threadlocal loader to null
currentLoader.set(null);
}
}
public static GateInContainerConfigLoader getCurrentLoader() {
return currentLoader.get();
}
}