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
Base class for appServletContextListener
s, creates and configures the app-wideInjector
andServletModule
, performsGuiceServerEndpointConfigurator
initialization. Also performs cleanup ofServletContextTrackingExecutor
s adn provides helper methods for programmatically addingServlet
s,Filter
s and websocketEndpoints
.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.Note that it is not mandatory for app
ServletContextListener
s to extend this class: all the setup is done using public APIs and can be done manually as well. See the code ofManualServletContextListener
class in the sample app for an example.- See Also:
PingingServletContextListener
-
-
Field Summary
Fields Modifier and Type Field Description protected ServletContext
appDeployment
Deployment reference for use inconfigureInjections()
andconfigureServletsFiltersEndpoints()
.protected Scope
containerCallScope
Reference toservletModule
's field, for use inconfigureInjections()
.protected String
deploymentName
Name of the deployment for logging purposes.protected GuiceServerEndpointConfigurator
endpointConfigurator
TheServerEndpointConfig.Configurator
instance used byaddEndpoint(Class, String)
to createEndpoint
instances.protected ServerContainer
endpointContainer
Endpoint
container reference for use inconfigureServletsFiltersEndpoints()
.protected Scope
httpSessionScope
Reference toservletModule
's field, for use inconfigureInjections()
.protected Injector
injector
The app-wideInjector
.protected ServletModule
servletModule
The app-wideServletModule
.protected Scope
websocketConnectionScope
Reference toservletModule
's field, for use inconfigureInjections()
.
-
Constructor Summary
Constructors Constructor Description GuiceServletContextListener()
-
Method Summary
-
-
-
Field Detail
-
appDeployment
protected ServletContext appDeployment
Deployment reference for use inconfigureInjections()
andconfigureServletsFiltersEndpoints()
.
-
deploymentName
protected String deploymentName
Name of the deployment for logging purposes. Obtained viaServletContext.getServletContextName()
if present, otherwise constructed usingServletContext.getContextPath()
.
-
servletModule
protected final ServletModule servletModule
The app-wideServletModule
. For use inconfigureInjections()
.
-
containerCallScope
protected final Scope containerCallScope
Reference toservletModule
's field, for use inconfigureInjections()
.
-
httpSessionScope
protected final Scope httpSessionScope
Reference toservletModule
's field, for use inconfigureInjections()
.
-
websocketConnectionScope
protected final Scope websocketConnectionScope
Reference toservletModule
's field, for use inconfigureInjections()
.
-
injector
protected Injector injector
The app-wideInjector
. For use inconfigureServletsFiltersEndpoints()
. Initialized with the result ofcreateInjector(LinkedList)
.The app-wide
Injector
is also stored as adeployment attribute
underfully-qualified name
ofInjector
class.
-
endpointConfigurator
protected GuiceServerEndpointConfigurator endpointConfigurator
TheServerEndpointConfig.Configurator
instance used byaddEndpoint(Class, String)
to createEndpoint
instances. Initialized with the result ofcreateEndpointConfigurator()
.Note that this instance will be shared among all
Endpoints
created byaddEndpoint(Class, String)
, butEndpoints
annotated withServerEndpoint
will have their separate instances even if they use the sameServerEndpointConfig.Configurator
class as this one.
-
endpointContainer
protected ServerContainer endpointContainer
Endpoint
container reference for use inconfigureServletsFiltersEndpoints()
.
-
-
Method Detail
-
configureInjections
protected abstract LinkedList<Module> configureInjections() throws Exception
CreatesModule
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
-
configureServletsFiltersEndpoints
protected abstract void configureServletsFiltersEndpoints() throws Exception
Programmatically addsServlet
s,Filter
s, websocketEndpoints
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.- Throws:
Exception
-
createInjector
protected Injector createInjector(LinkedList<Module> modules)
Createsthe app-wide Injector
. This method is called once bycontextInitialized(ServletContextEvent)
. By default it callsGuice.createInjector(modules)
. May be overridden if any additional customizations are required.
-
addServlet
protected ServletRegistration.Dynamic addServlet(String name, Class<? extends HttpServlet> servletClass, String... urlPatterns) throws ServletException
Creates a Servet
ofservletClass
class,adds it
withname
,async support
andinjected dependencies
aturlPatterns
.For use in
configureServletsFiltersEndpoints()
.- Throws:
ServletException
-
addFilter
protected FilterRegistration.Dynamic addFilter(String name, Filter filter)
Adds
filter
withname
,async support
andinjected dependencies
. 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
Creates a Filter
offilterClass
class,Adds it
withname
,async support
andinjected dependencies
aturlPatterns
withdispatcherTypes
.For use in
configureServletsFiltersEndpoints()
.- Throws:
ServletException
-
addFilter
protected FilterRegistration.Dynamic addFilter(String name, Class<? extends Filter> filterClass, String... urlPatterns) throws ServletException
Creates a Filter
offilterClass
class,Adds it
withname
,async support
andinjected dependencies
aturlPatterns
withDispatcherType.REQUEST
.For use in
configureServletsFiltersEndpoints()
.- Throws:
ServletException
-
addEnsureSessionFilter
protected void addEnsureSessionFilter(String... urlPatterns)
Adds aturlPatterns
aFilter
that ensures each incoming request has anHttpSession
created. This is necessary for websocketEndpoints
that usehttpSessionScope
.For use in
configureServletsFiltersEndpoints()
.
-
createEndpointConfigurator
protected GuiceServerEndpointConfigurator createEndpointConfigurator()
Creates theServerEndpointConfig.Configurator
that will be used byaddEndpoint(Class, String)
. This method is called once incontextInitialized(ServletContextEvent)
to initializeendpointConfigurator
.By default a new
GuiceServerEndpointConfigurator
is returned. This method may be overridden if a more specialized configurator needs to be used.
-
addEndpoint
protected void addEndpoint(Class<?> endpointClass, String path) throws DeploymentException
Adds anEndpoint
usingendpointConfigurator
. Pre-builds a dynamic proxy class forendpointClass
in advance. For use inconfigureServletsFiltersEndpoints()
. Useful mostly for unannotated endpoints extendingEndpoint
.- Throws:
DeploymentException
-
addEndpoint
protected void addEndpoint(Class<?> endpointClass, String path, ServerEndpointConfig.Configurator configurator) throws DeploymentException
Adds anEndpoint
usingconfigurator
. For use inconfigureServletsFiltersEndpoints()
.Useful mostly for unannotated endpoints extending
Endpoint
.- Throws:
DeploymentException
-
addConfigurationHook
protected void addConfigurationHook(Callable<Void> configurationHook)
AddsconfigurationHook
to be called bycontextInitialized(ServletContextEvent)
right beforeconfigureServletsFiltersEndpoints()
. This is intended for abstract subclasses to hook in their stuff. ConcreteListeners
should rather perform all their setup inconfigureInjections()
andconfigureServletsFiltersEndpoints()
.
-
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
as adeployment attribute
underfully-qualified name
ofInjector
class.- Specified by:
contextInitialized
in interfaceServletContextListener
-
getExecutorsTerminationTimeout
protected Duration getExecutorsTerminationTimeout()
Returns the timeout fortermination of all Executors
obtained fromservletModule
. By default5
seconds.This method is called by
contextDestroyed(ServletContextEvent)
and may be overridden if a different value needs to 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)
.
-
contextDestroyed
public final void contextDestroyed(ServletContextEvent destruction)
Shutdowns
andawaits termination all Executors
created byservletModule
. If after the timeout returned bygetExecutorsTerminationTimeout()
not allExecutors
are terminated, callshandleUnterminatedExecutors(List)
.- Specified by:
contextDestroyed
in interfaceServletContextListener
-
-