Class GuiceServletContextListener
- java.lang.Object
-
- pl.morgwai.base.servlet.guice.scopes.GuiceServletContextListener
-
- All Implemented Interfaces:
ServletContextListener
,EventListener
- Direct Known Subclasses:
PingingServletContextListener
public abstract class GuiceServletContextListener extends Object implements ServletContextListener
Creates and configuresapp-wide Guice Injector
and aServletModule
. Usually a single subclass of this class should be created in a given app and either annotated with@WebListener
or enlisted in the app'sweb.xml
file in a<listener>
element.
-
-
Field Summary
Fields Modifier and Type Field Description protected ContextTracker<ContainerCallContext>
containerCallContextTracker
Same as inservletModule
for convenience.protected Scope
containerCallScope
Same as inservletModule
for use inconfigureInjections()
.protected GuiceServerEndpointConfigurator
endpointConfigurator
Stores the result ofcreateEndpointConfigurator()
to be used byaddEndpoint(Class, String)
.protected ServerContainer
endpointContainer
For use inconfigureServletsFiltersEndpoints()
.protected Scope
httpSessionScope
Same as inservletModule
for use inconfigureInjections()
.protected Injector
injector
For use inconfigureServletsFiltersEndpoints()
.protected static Logger
log
protected ServletContext
servletContainer
For use inconfigureServletsFiltersEndpoints()
.protected ServletModule
servletModule
For use inconfigureInjections()
.protected Scope
websocketConnectionScope
Same as inservletModule
for use inconfigureInjections()
.
-
Constructor Summary
Constructors Constructor Description GuiceServletContextListener()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected void
addEndpoint(Class<?> endpointClass, String path)
Adds an endpoint usingendpointConfigurator
.protected void
addEndpoint(Class<?> endpointClass, String path, ServerEndpointConfig.Configurator configurator)
Adds an endpoint using customconfigurator
.protected FilterRegistration.Dynamic
addFilter(String name, Filter filter)
Addsfilter
with async support and injects its dependencies.protected FilterRegistration.Dynamic
addFilter(String name, Class<? extends Filter> filterClass, String... urlPatterns)
Adds aFilter
offilterClass
with async support, injects its dependencies, then adds a mapping at the end of the chain forurlPatterns
withDispatcherType.REQUEST
.protected FilterRegistration.Dynamic
addFilter(String name, Class<? extends Filter> filterClass, EnumSet<DispatcherType> dispatcherTypes, String... urlPatterns)
Adds aFilter
offilterClass
with async support, injects its dependencies, then adds a mapping at the end of the chain forurlPatterns
withdispatcherTypes
.protected ServletRegistration.Dynamic
addServlet(String name, Class<? extends HttpServlet> servletClass, String... urlPatterns)
Adds a servlet with async support and injects its dependencies.protected abstract LinkedList<Module>
configureInjections()
ReturnsModule
s that configure bindings for user-defined components.protected abstract void
configureServletsFiltersEndpoints()
Programmatically adds servlets, filters and endpoints.void
contextDestroyed(ServletContextEvent destruction)
Shutdowns and awaits termination all executors created byservletModule
.void
contextInitialized(ServletContextEvent initialization)
protected GuiceServerEndpointConfigurator
createEndpointConfigurator()
Creates configurator to be used byaddEndpoint(Class, String)
.protected Injector
createInjector(LinkedList<Module> modules)
Called bycontextInitialized(ServletContextEvent)
to createthe app-wide Injector
.protected int
getExecutorsTerminationTimeoutSeconds()
Returns the timeout for termination of executors obtained fromservletModule
.protected void
handleUnterminatedExecutors(List<ServletContextTrackingExecutor> unterminatedExecutors)
Handles executors that failed to terminate incontextDestroyed(ServletContextEvent)
.protected void
installEnsureSessionFilter(String... urlPatterns)
Installs aturlPatterns
a filter that ensures each incoming request has anHttpSession
created.
-
-
-
Field Detail
-
servletModule
protected final ServletModule servletModule
For use inconfigureInjections()
.
-
containerCallContextTracker
protected final ContextTracker<ContainerCallContext> containerCallContextTracker
Same as inservletModule
for convenience.
-
containerCallScope
protected final Scope containerCallScope
Same as inservletModule
for use inconfigureInjections()
.
-
httpSessionScope
protected final Scope httpSessionScope
Same as inservletModule
for use inconfigureInjections()
.
-
websocketConnectionScope
protected final Scope websocketConnectionScope
Same as inservletModule
for use inconfigureInjections()
.
-
injector
protected Injector injector
For use inconfigureServletsFiltersEndpoints()
.Injector
is also stored as aServletContext attribute
named afterInjector
's classfully-qualified name
.
-
servletContainer
protected ServletContext servletContainer
For use inconfigureServletsFiltersEndpoints()
.
-
endpointContainer
protected ServerContainer endpointContainer
For use inconfigureServletsFiltersEndpoints()
.
-
endpointConfigurator
protected GuiceServerEndpointConfigurator endpointConfigurator
Stores the result ofcreateEndpointConfigurator()
to be used byaddEndpoint(Class, String)
.
-
log
protected static final Logger log
-
-
Method Detail
-
configureInjections
protected abstract LinkedList<Module> configureInjections() throws ServletException
ReturnsModule
s that configure bindings for user-defined components. The result will be passed tocreateInjector(LinkedList)
together with other internalModules
.Implementations may use
Scope
s,ContextTracker
s and helper methods fromservletModule
.- Throws:
ServletException
-
createInjector
protected Injector createInjector(LinkedList<Module> modules)
Called bycontextInitialized(ServletContextEvent)
to createthe app-wide Injector
. By default basically callsGuice.createInjector(modules)
. May be overridden if any additional customizations are needed.
-
configureServletsFiltersEndpoints
protected abstract void configureServletsFiltersEndpoints() throws ServletException
Programmatically adds servlets, filters and endpoints.If all of these components are configured via annotations or
web.xml
file, then this method may be empty.Convenience helper methods
addServlet(String, Class, String...)
,addFilter(String, Class, String...)
,addEndpoint(Class, String)
andaddEndpoint(Class, String, Configurator)
are provided for the most common cases.This method is called after
configureInjections()
is called andinjector
is created.- Throws:
ServletException
-
addServlet
protected ServletRegistration.Dynamic addServlet(String name, Class<? extends HttpServlet> servletClass, String... urlPatterns) throws ServletException
Adds a servlet with async support and injects its dependencies.For use in
configureServletsFiltersEndpoints()
.- Throws:
ServletException
-
addFilter
protected FilterRegistration.Dynamic addFilter(String name, Filter filter)
Addsfilter
with async support and injects its dependencies. Filter mappings should be added afterwards withFilterRegistration.addMappingForUrlPatterns(EnumSet, boolean, String...)
orFilterRegistration.addMappingForServletNames(EnumSet, boolean, String...)
.For use in
configureServletsFiltersEndpoints()
.
-
addFilter
protected FilterRegistration.Dynamic addFilter(String name, Class<? extends Filter> filterClass, EnumSet<DispatcherType> dispatcherTypes, String... urlPatterns) throws ServletException
Adds aFilter
offilterClass
with async support, injects its dependencies, then adds a mapping at the end of the chain forurlPatterns
withdispatcherTypes
. Additional mappings can be added afterwards withFilterRegistration.addMappingForUrlPatterns(EnumSet, boolean, String...)
orFilterRegistration.addMappingForServletNames(EnumSet, boolean, String...)
.For use in
configureServletsFiltersEndpoints()
.- Throws:
ServletException
-
addFilter
protected FilterRegistration.Dynamic addFilter(String name, Class<? extends Filter> filterClass, String... urlPatterns) throws ServletException
Adds aFilter
offilterClass
with async support, injects its dependencies, then adds a mapping at the end of the chain forurlPatterns
withDispatcherType.REQUEST
. Additional mappings can be added afterwards withFilterRegistration.addMappingForUrlPatterns(EnumSet, boolean, String...)
orFilterRegistration.addMappingForServletNames(EnumSet, boolean, String...)
.For use in
configureServletsFiltersEndpoints()
.- Throws:
ServletException
-
installEnsureSessionFilter
protected void installEnsureSessionFilter(String... urlPatterns)
Installs aturlPatterns
a filter that ensures each incoming request has anHttpSession
created. This is necessary for websocketEndpoints
that usehttpSessionScope
.For use in
configureServletsFiltersEndpoints()
.
-
createEndpointConfigurator
protected GuiceServerEndpointConfigurator createEndpointConfigurator()
Creates configurator to be used byaddEndpoint(Class, String)
. By defaultGuiceServerEndpointConfigurator
that injectsEndpoints
' dependencies and sets up contexts around their lifecycle methods.This method is called once in
contextInitialized(ServletContextEvent)
, the result is stored asendpointConfigurator
and shared among allEndpoint
instances created withaddEndpoint(Class, String)
.Note that
Endpoints
annotated withServerEndpoint
will have their separate instances ofServerEndpointConfig.Configurator
each.This method may be overridden by subclasses if a more specialized configurator needs to be used.
-
addEndpoint
protected void addEndpoint(Class<?> endpointClass, String path) throws ServletException
Adds an endpoint usingendpointConfigurator
. For use inconfigureServletsFiltersEndpoints()
.Pre-builds dynamic proxy class for
endpointClass
in advance.Useful mostly for unannotated endpoints extending
Endpoint
.- Throws:
ServletException
-
addEndpoint
protected void addEndpoint(Class<?> endpointClass, String path, ServerEndpointConfig.Configurator configurator) throws ServletException
Adds an endpoint using customconfigurator
.Useful mostly for unannotated endpoints extending
Endpoint
.- Throws:
ServletException
-
contextInitialized
public final void contextInitialized(ServletContextEvent initialization)
CallsconfigureInjections()
,creates the app-wide Injector
and callsconfigureServletsFiltersEndpoints()
. Also creates and installs all other infrastructure elements such asservletContainer
,endpointContainer
,RequestContextFilter
etc and storesinjector
in aServletContext attribute
named afterInjector
's classfully-qualified name
.- Specified by:
contextInitialized
in interfaceServletContextListener
-
contextDestroyed
public void contextDestroyed(ServletContextEvent destruction)
Shutdowns and awaits termination all executors created byservletModule
. If after the timeout specified bygetExecutorsTerminationTimeoutSeconds()
not all executors are terminated, callshandleUnterminatedExecutors(List)
.- Specified by:
contextDestroyed
in interfaceServletContextListener
-
getExecutorsTerminationTimeoutSeconds
protected int getExecutorsTerminationTimeoutSeconds()
Returns the timeout for termination of executors obtained fromservletModule
. By default5
seconds. Called bycontextDestroyed(ServletContextEvent)
. May be overridden if different value should be used.
-
handleUnterminatedExecutors
protected void handleUnterminatedExecutors(List<ServletContextTrackingExecutor> unterminatedExecutors)
Handles executors that failed to terminate incontextDestroyed(ServletContextEvent)
. By default callsshutdownNow()
for each executor and hopes for the best... Subclasses may override this method to handle unterminated executors in a more specialized way.
-
-