mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-13 17:05:43 +01:00
implemented optional injection of ServletContextListeners
This commit is contained in:
@@ -39,6 +39,7 @@ import com.google.inject.Singleton;
|
|||||||
|
|
||||||
//~--- JDK imports ------------------------------------------------------------
|
//~--- JDK imports ------------------------------------------------------------
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.servlet.ServletContextEvent;
|
import javax.servlet.ServletContextEvent;
|
||||||
@@ -49,55 +50,36 @@ import javax.servlet.ServletContextListener;
|
|||||||
* @author Sebastian Sdorra
|
* @author Sebastian Sdorra
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ServletContextListenerHolder implements ServletContextListener
|
public class ServletContextListenerHolder implements ServletContextListener {
|
||||||
{
|
|
||||||
|
static class ListenerHolder {
|
||||||
|
@Inject(optional = true)
|
||||||
|
private Set<ServletContextListener> listenerSet;
|
||||||
|
|
||||||
|
private Set<ServletContextListener> getListenerSet() {
|
||||||
|
if (listenerSet == null) {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
return listenerSet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Set<ServletContextListener> listenerSet;
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs ...
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param listenerSet
|
|
||||||
*/
|
|
||||||
@Inject
|
@Inject
|
||||||
public ServletContextListenerHolder(Set<ServletContextListener> listenerSet)
|
public ServletContextListenerHolder(ListenerHolder listeners)
|
||||||
{
|
{
|
||||||
this.listenerSet = listenerSet;
|
this.listenerSet = listeners.getListenerSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
//~--- methods --------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method description
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param sce
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void contextDestroyed(ServletContextEvent sce)
|
public void contextInitialized(ServletContextEvent sce) {
|
||||||
{
|
listenerSet.forEach(listener -> listener.contextInitialized(sce));
|
||||||
for (ServletContextListener listener : listenerSet)
|
|
||||||
{
|
|
||||||
listener.contextDestroyed(sce);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Method description
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param sce
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void contextInitialized(ServletContextEvent sce)
|
public void contextDestroyed(ServletContextEvent sce) {
|
||||||
{
|
listenerSet.forEach(listener -> listener.contextDestroyed(sce));
|
||||||
for (ServletContextListener listener : listenerSet)
|
|
||||||
{
|
|
||||||
listener.contextInitialized(sce);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//~--- fields ---------------------------------------------------------------
|
|
||||||
|
|
||||||
/** Field description */
|
|
||||||
private Set<ServletContextListener> listenerSet;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package sonia.scm;
|
||||||
|
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
import com.google.inject.Key;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContextEvent;
|
||||||
|
import javax.servlet.ServletContextListener;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension.class)
|
||||||
|
class ServletContextListenerHolderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldInitializeEveryContextListener() {
|
||||||
|
CountingListener one = new CountingListener(41);
|
||||||
|
CountingListener two = new CountingListener(41);
|
||||||
|
|
||||||
|
ServletContextListenerHolder holder = createHolder(one, two);
|
||||||
|
holder.contextInitialized(null);
|
||||||
|
|
||||||
|
assertThat(one.counter).isEqualTo(42);
|
||||||
|
assertThat(one.counter).isEqualTo(42);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldDestroyEveryContextListener() {
|
||||||
|
CountingListener one = new CountingListener(43);
|
||||||
|
CountingListener two = new CountingListener(43);
|
||||||
|
|
||||||
|
ServletContextListenerHolder holder = createHolder(one, two);
|
||||||
|
holder.contextDestroyed(null);
|
||||||
|
|
||||||
|
assertThat(one.counter).isEqualTo(42);
|
||||||
|
assertThat(one.counter).isEqualTo(42);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldNotFailWithoutServletContextListenerBound(){
|
||||||
|
Injector injector = Guice.createInjector();
|
||||||
|
ServletContextListenerHolder holder = injector.getInstance(ServletContextListenerHolder.class);
|
||||||
|
holder.contextInitialized(null);
|
||||||
|
holder.contextDestroyed(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServletContextListenerHolder createHolder(CountingListener one, CountingListener two) {
|
||||||
|
Injector injector = Guice.createInjector(new ListenerModule(one, two));
|
||||||
|
return injector.getInstance(ServletContextListenerHolder.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ListenerModule extends AbstractModule {
|
||||||
|
|
||||||
|
private final Set<ServletContextListener> listeners;
|
||||||
|
|
||||||
|
ListenerModule(ServletContextListener... listeners) {
|
||||||
|
this.listeners = new HashSet<>(Arrays.asList(listeners));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(new Key<Set<ServletContextListener>>(){}).toInstance(listeners);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CountingListener implements ServletContextListener {
|
||||||
|
|
||||||
|
private int counter;
|
||||||
|
|
||||||
|
CountingListener(int counter) {
|
||||||
|
this.counter = counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextInitialized(ServletContextEvent sce) {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextDestroyed(ServletContextEvent sce) {
|
||||||
|
counter--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user