mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-09 06:55:47 +01:00
added extension point for HttpSessionListener
This commit is contained in:
@@ -0,0 +1,170 @@
|
||||
|
||||
package sonia.scm;
|
||||
|
||||
//~--- non-JDK imports --------------------------------------------------------
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
//~--- JDK imports ------------------------------------------------------------
|
||||
|
||||
import java.util.Set;
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
import javax.servlet.http.HttpSession;
|
||||
import javax.servlet.http.HttpSessionEvent;
|
||||
import javax.servlet.http.HttpSessionListener;
|
||||
import sonia.scm.plugin.ext.Extension;
|
||||
|
||||
/**
|
||||
* Dispatcher for {@link HttpSessionEvent}. The {@link HttpSessionListenerHolder}
|
||||
* loads all registered {@link HttpSessionListener}s from the {@link Injector}
|
||||
* and delegates the events to the them. {@link HttpSessionListener} can be
|
||||
* registered with the {@link Extension} annotation.
|
||||
*
|
||||
* @author Sebastian Sdorra <sebastian.sdorra@gmail.com>
|
||||
* @since 1.42
|
||||
*/
|
||||
public class HttpSessionListenerHolder implements HttpSessionListener
|
||||
{
|
||||
|
||||
/** key type of the session listeners */
|
||||
private static final Key<Set<HttpSessionListener>> KEY =
|
||||
Key.get(new TypeLiteral<Set<HttpSessionListener>>() {}
|
||||
);
|
||||
|
||||
/** logger for HttpSessionListenerHolder */
|
||||
private static final Logger logger =
|
||||
LoggerFactory.getLogger(HttpSessionListenerHolder.class);
|
||||
|
||||
//~--- constructors ---------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Constructs a new HttpSessionListenerHolder.
|
||||
*
|
||||
*/
|
||||
public HttpSessionListenerHolder()
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("create instance of {}",
|
||||
HttpSessionListenerHolder.class.getName());
|
||||
}
|
||||
}
|
||||
|
||||
//~--- methods --------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Delegates the create session event to all registered
|
||||
* {@ĺink HttpSessionListener}s.
|
||||
*
|
||||
*
|
||||
* @param event session event
|
||||
*/
|
||||
@Override
|
||||
public void sessionCreated(HttpSessionEvent event)
|
||||
{
|
||||
if (listenerSet == null)
|
||||
{
|
||||
listenerSet = loadListeners(event);
|
||||
}
|
||||
|
||||
dispatch(event, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delegates the destroy session event to all registered
|
||||
* {@ĺink HttpSessionListener}s.
|
||||
*
|
||||
*
|
||||
* @param event session event
|
||||
*/
|
||||
@Override
|
||||
public void sessionDestroyed(HttpSessionEvent event)
|
||||
{
|
||||
dispatch(event, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch session events.
|
||||
*
|
||||
*
|
||||
* @param event session event
|
||||
* @param create {@code true} if the event is a create event
|
||||
*/
|
||||
private void dispatch(HttpSessionEvent event, boolean create)
|
||||
{
|
||||
if (listenerSet != null)
|
||||
{
|
||||
for (HttpSessionListener listener : listenerSet)
|
||||
{
|
||||
if (create)
|
||||
{
|
||||
listener.sessionCreated(event);
|
||||
}
|
||||
else
|
||||
{
|
||||
listener.sessionDestroyed(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.warn(
|
||||
"could not dispatch session event, because holder is not initialized");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load listeners from {@link Injector} which is stored in the
|
||||
* {@link ServletContext}.
|
||||
*
|
||||
*
|
||||
* @param event session event
|
||||
*
|
||||
* @return set of session listeners
|
||||
*/
|
||||
private synchronized Set<HttpSessionListener> loadListeners(
|
||||
HttpSessionEvent event)
|
||||
{
|
||||
Set<HttpSessionListener> listeners = null;
|
||||
HttpSession session = event.getSession();
|
||||
|
||||
if (session != null)
|
||||
{
|
||||
Injector injector = (Injector) session.getServletContext().getAttribute(
|
||||
Injector.class.getName());
|
||||
|
||||
if (injector != null)
|
||||
{
|
||||
logger.debug("load HttpSessionListeners from injector");
|
||||
listeners = injector.getInstance(KEY);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.error("could not find injector in servletContext");
|
||||
}
|
||||
|
||||
if (listeners == null)
|
||||
{
|
||||
listeners = Sets.newHashSet();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.warn("received session event without session");
|
||||
}
|
||||
|
||||
return listeners;
|
||||
}
|
||||
|
||||
//~--- fields ---------------------------------------------------------------
|
||||
|
||||
/** listener set */
|
||||
private Set<HttpSessionListener> listenerSet;
|
||||
}
|
||||
@@ -77,6 +77,7 @@ import java.util.Set;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletContextListener;
|
||||
import javax.servlet.http.HttpSessionListener;
|
||||
|
||||
import javax.xml.bind.JAXB;
|
||||
|
||||
@@ -563,12 +564,20 @@ public class DefaultPluginLoader implements PluginLoader
|
||||
|
||||
//J-
|
||||
extensionPoints = extensionPointCollector.getAnnotatedClasses();
|
||||
// add ServletContextListener to list of extension points
|
||||
extensionPoints.add(
|
||||
new AnnotatedClass<ExtensionPoint>(
|
||||
Extensions.createExtensionPoint(true),
|
||||
ServletContextListener.class
|
||||
)
|
||||
);
|
||||
// add HttpSessionListener to list of extension points
|
||||
extensionPoints.add(
|
||||
new AnnotatedClass<ExtensionPoint>(
|
||||
Extensions.createExtensionPoint(true),
|
||||
HttpSessionListener.class
|
||||
)
|
||||
);
|
||||
|
||||
extensions = extensionCollector.getAnnotatedClasses();
|
||||
extensions.add(
|
||||
|
||||
@@ -42,6 +42,10 @@
|
||||
<listener>
|
||||
<listener-class>sonia.scm.boot.BootstrapListener</listener-class>
|
||||
</listener>
|
||||
|
||||
<listener>
|
||||
<listener-class>sonia.scm.HttpSessionListenerHolder</listener-class>
|
||||
</listener>
|
||||
|
||||
<filter>
|
||||
<filter-name>guiceFilter</filter-name>
|
||||
|
||||
Reference in New Issue
Block a user