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 ------------------------------------------------------------
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
@@ -49,55 +50,36 @@ import javax.servlet.ServletContextListener;
|
||||
* @author Sebastian Sdorra
|
||||
*/
|
||||
@Singleton
|
||||
public class ServletContextListenerHolder implements ServletContextListener
|
||||
{
|
||||
public class ServletContextListenerHolder implements ServletContextListener {
|
||||
|
||||
/**
|
||||
* Constructs ...
|
||||
*
|
||||
*
|
||||
* @param listenerSet
|
||||
*/
|
||||
@Inject
|
||||
public ServletContextListenerHolder(Set<ServletContextListener> listenerSet)
|
||||
{
|
||||
this.listenerSet = listenerSet;
|
||||
}
|
||||
|
||||
//~--- methods --------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Method description
|
||||
*
|
||||
*
|
||||
* @param sce
|
||||
*/
|
||||
@Override
|
||||
public void contextDestroyed(ServletContextEvent sce)
|
||||
{
|
||||
for (ServletContextListener listener : listenerSet)
|
||||
{
|
||||
listener.contextDestroyed(sce);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method description
|
||||
*
|
||||
*
|
||||
* @param sce
|
||||
*/
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent sce)
|
||||
{
|
||||
for (ServletContextListener listener : listenerSet)
|
||||
{
|
||||
listener.contextInitialized(sce);
|
||||
}
|
||||
}
|
||||
|
||||
//~--- fields ---------------------------------------------------------------
|
||||
|
||||
/** Field description */
|
||||
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;
|
||||
|
||||
@Inject
|
||||
public ServletContextListenerHolder(ListenerHolder listeners)
|
||||
{
|
||||
this.listenerSet = listeners.getListenerSet();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent sce) {
|
||||
listenerSet.forEach(listener -> listener.contextInitialized(sce));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void contextDestroyed(ServletContextEvent sce) {
|
||||
listenerSet.forEach(listener -> listener.contextDestroyed(sce));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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