Class GuiceServletContextListener
- java.lang.Object
-
- pl.morgwai.base.servlet.guice.scopes.GuiceServletContextListener
-
- All Implemented Interfaces:
EventListener
,ServletContextListener
- 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 ServletContext
appDeployment
For use inconfigureInjections()
andconfigureServletsFiltersEndpoints()
.protected Scope
containerCallScope
Same as inservletModule
for use inconfigureInjections()
.protected String
deploymentName
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
The app-wideInjector
.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
addConfigurationHook(Callable<Void> configurationHook)
AddsconfigurationHook
to be called incontextInitialized(ServletContextEvent)
right beforeconfigureServletsFiltersEndpoints()
.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 void
addEnsureSessionFilter(String... urlPatterns)
Installs aturlPatterns
a filter that ensures each incoming request has anHttpSession
created.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 FilterRegistration.Dynamic
addFilter(String name, Filter filter)
Addsfilter
with async support and injects its dependencies.protected ServletRegistration.Dynamic
addServlet(String name, Class<? extends HttpServlet> servletClass, String... urlPatterns)
Adds a servlet with async support and injects its dependencies.protected void
addShutdownHook(Runnable shutdownHook)
AddsshutdownHook
to be run at the end ofcontextDestroyed(ServletContextEvent)
.protected abstract LinkedList<Module>
configureInjections()
ReturnsModule
s that configure bindings for user-defined components.protected abstract void
configureServletsFiltersEndpoints()
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)
Createsthe app-wide Injector
when called bycontextInitialized(ServletContextEvent)
.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)
.
-
-
-
Field Detail
-
appDeployment
protected ServletContext appDeployment
For use inconfigureInjections()
andconfigureServletsFiltersEndpoints()
.
-
deploymentName
protected String deploymentName
-
servletModule
protected final ServletModule servletModule
For use inconfigureInjections()
.
-
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
The app-wideInjector
. For use inconfigureServletsFiltersEndpoints()
.Injector
is also stored as aServletContext attribute
named afterInjector
's classfully-qualified name
.
-
endpointConfigurator
protected GuiceServerEndpointConfigurator endpointConfigurator
Stores the result ofcreateEndpointConfigurator()
to be used byaddEndpoint(Class, String)
.
-
endpointContainer
protected ServerContainer endpointContainer
For use inconfigureServletsFiltersEndpoints()
.
-
-
Method Detail
-
configureInjections
protected abstract LinkedList<Module> configureInjections() throws Exception
ReturnsModule
s that configure bindings for user-defined components. The result will be passed tocreateInjector(LinkedList)
.servletModule
and other internalModules
will be added automatically to the list.Implementations may use
Scope
s,ContextTracker
s and helper methods fromservletModule
and config data fromappDeployment
when definingModule
s.- Throws:
Exception
-
createInjector
protected Injector createInjector(LinkedList<Module> modules)
Createsthe app-wide Injector
when called bycontextInitialized(ServletContextEvent)
. By default basically callsGuice.createInjector(modules)
. May be overridden if any additional customizations are needed.
-
addConfigurationHook
protected void addConfigurationHook(Callable<Void> configurationHook)
AddsconfigurationHook
to be called incontextInitialized(ServletContextEvent)
right beforeconfigureServletsFiltersEndpoints()
. This is intended for abstract subclasses to hook in their stuff. Concrete app listeners should rather do all their setup inconfigureServletsFiltersEndpoints()
.
-
configureServletsFiltersEndpoints
protected abstract void configureServletsFiltersEndpoints() throws ServletException, DeploymentException
Programmatically addsServlet
s,Filter
s andEndpoints
and performs any other setup required by the given app. Called at the end ofcontextInitialized(ServletContextEvent)
, may useinjector
(as well asappDeployment
andendpointContainer
).Convenience helper method families
addServlet(String, Class, String...)
,addFilter(String, Class, String...)
,addEndpoint(Class, String)
are provided for the most common cases for use inconfigurationHook
.- Throws:
ServletException
DeploymentException
-
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
-
addEnsureSessionFilter
protected void addEnsureSessionFilter(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 DeploymentException
Adds an endpoint usingendpointConfigurator
. For use inconfigureServletsFiltersEndpoints()
.Pre-builds dynamic proxy class for
endpointClass
in advance.Useful mostly for unannotated endpoints extending
Endpoint
.- Throws:
DeploymentException
-
addEndpoint
protected void addEndpoint(Class<?> endpointClass, String path, ServerEndpointConfig.Configurator configurator) throws DeploymentException
Adds an endpoint using customconfigurator
.Useful mostly for unannotated endpoints extending
Endpoint
.- Throws:
DeploymentException
-
contextInitialized
public final void contextInitialized(ServletContextEvent initialization)
CallsconfigureInjections()
,creates the app-wide Injector
and callsconfigureServletsFiltersEndpoints()
. Also creates and installs all other infrastructure elements such asappDeployment
,endpointContainer
,RequestContextFilter
etc and storesinjector
in aServletContext attribute
named afterInjector
's classfully-qualified name
.- Specified by:
contextInitialized
in interfaceServletContextListener
-
contextDestroyed
public final 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.
-
addShutdownHook
protected void addShutdownHook(Runnable shutdownHook)
AddsshutdownHook
to be run at the end ofcontextDestroyed(ServletContextEvent)
.
-
-