Allow Sling Web App to be deployed multiple times in the same servlet container
-------------------------------------------------------------------------------
Key: SLING-711
URL: https://issues.apache.org/jira/browse/SLING-711
Project: Sling
Issue Type: Improvement
Components: Launchpad
Affects Versions: Launchpad Webapp 3
Reporter: Felix Meschberger
Assignee: Felix Meschberger
Currently the Sling Web Application (launchpad/webapp) has one serious
drawback: Unless you unpack the war file and configure the sling.home
init-parameter, the Sling Web Application can only be deployed once into a
single servlet container. The reason for this is, that the default value
assumed by the Sling class is the "sling" folder in the current working
directory.
To fix this issue, I propose to enhance the SlingServlet which bridges the
Servlet container, in which the Sling Web Application is deployed, to the
SlingMainServlet in the sling/engine bundle as follows:
* add a new method to the SlingServlet :
protected String getSlingHome(ServletRequest request)
The getSlingHome first checks whether the sling.home init-param is set in the
servlet configuration. Next it checks the sling.home init-param of the servlet
context. Next if checks calls the ServletContext.getContextPath() method. This
call may fail since the method is only defined in Servlet API 2.5. If
getContextPatch is not supported in the servlet container and request is not
null, the request.getContextPath() method is called to retreived the context
paht. If the context path can be retrieved it is converted into the path used
as sling.home by just replacing all "/" by "_", thus the context path
"/sling" would become "_sling. Otherwise (if no init-param is set,
ServletContext.getContextPath is not supported and request is null),
getSlingHome returns null.
* SlingServlet.init() is modified to call getSlingHome(null) and only continue
with Sling startup if the value returned is not null. If getSlingHome() returns
null, the SlingServlet.init() method does not initialize Sling.
* SlingServlet.service() is enhanced to check whether the init() method started
Sling. If not, it calls getSlingHome() with the current request
object and starts Sling. This may take some time, so the SlingServlet.service
method sends back a quick response telling the caller, that Sling is about to
start. As soon as Sling has started up the request will be processed.
This mechanism should allow the same Sling Web Application war file to be
deployed multiple times in the same servlet container and should also
account for Servlet API 2.4 containers, which do not support the
ServletContext.getContextPath() method yet.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.