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.

Reply via email to