implemented optional injection of ServletContextListeners

This commit is contained in:
Sebastian Sdorra
2019-06-21 09:50:03 +02:00
parent de5bee4947
commit 6c064a005a
2 changed files with 113 additions and 40 deletions

View File

@@ -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));
}
}

View File

@@ -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--;
}
}
}