1 package org
.argeo
.cms
.equinox
.http
.jetty
;
3 import java
.io
.IOException
;
4 import java
.lang
.reflect
.InvocationTargetException
;
5 import java
.lang
.reflect
.Method
;
7 import javax
.servlet
.Servlet
;
8 import javax
.servlet
.ServletConfig
;
9 import javax
.servlet
.ServletContext
;
10 import javax
.servlet
.ServletException
;
11 import javax
.servlet
.ServletRequest
;
12 import javax
.servlet
.ServletResponse
;
13 import javax
.servlet
.http
.HttpSessionEvent
;
14 import javax
.servlet
.http
.HttpSessionIdListener
;
15 import javax
.servlet
.http
.HttpSessionListener
;
17 import org
.argeo
.cms
.jetty
.CmsJettyServer
;
18 import org
.eclipse
.equinox
.http
.servlet
.HttpServiceServlet
;
19 import org
.eclipse
.jetty
.server
.session
.SessionHandler
;
20 import org
.eclipse
.jetty
.servlet
.ServletContextHandler
;
21 import org
.eclipse
.jetty
.servlet
.ServletHolder
;
22 import org
.osgi
.framework
.Constants
;
24 public class EquinoxJettyServer
extends CmsJettyServer
{
25 private static final String INTERNAL_CONTEXT_CLASSLOADER
= "org.eclipse.equinox.http.jetty.internal.ContextClassLoader";
28 protected void addServlets(ServletContextHandler servletContextHandler
) throws ServletException
{
29 ServletHolder holder
= new ServletHolder(new InternalHttpServiceServlet());
30 holder
.setInitOrder(0);
31 holder
.setInitParameter(Constants
.SERVICE_VENDOR
, "Eclipse.org"); //$NON-NLS-1$
32 holder
.setInitParameter(Constants
.SERVICE_DESCRIPTION
, "Equinox Jetty-based Http Service"); //$NON-NLS-1$
34 // holder.setInitParameter(JettyConstants.CONTEXT_PATH,
35 // httpContext.getContextPath());
36 servletContextHandler
.addServlet(holder
, "/*");
39 SessionHandler sessionManager
= servletContextHandler
.getSessionHandler();
40 sessionManager
.addEventListener((HttpSessionIdListener
) holder
.getServlet());
43 public static class InternalHttpServiceServlet
implements HttpSessionListener
, HttpSessionIdListener
, Servlet
{
44 private final Servlet httpServiceServlet
= new HttpServiceServlet();
45 private ClassLoader contextLoader
;
46 private final Method sessionDestroyed
;
47 private final Method sessionIdChanged
;
49 public InternalHttpServiceServlet() {
50 Class
<?
> clazz
= httpServiceServlet
.getClass();
53 sessionDestroyed
= clazz
.getMethod("sessionDestroyed", new Class
<?
>[] { String
.class }); //$NON-NLS-1$
54 } catch (Exception e
) {
55 throw new IllegalStateException(e
);
58 sessionIdChanged
= clazz
.getMethod("sessionIdChanged", new Class
<?
>[] { String
.class }); //$NON-NLS-1$
59 } catch (Exception e
) {
60 throw new IllegalStateException(e
);
65 public void init(ServletConfig config
) throws ServletException
{
66 ServletContext context
= config
.getServletContext();
67 contextLoader
= (ClassLoader
) context
.getAttribute(INTERNAL_CONTEXT_CLASSLOADER
);
69 Thread thread
= Thread
.currentThread();
70 ClassLoader current
= thread
.getContextClassLoader();
71 thread
.setContextClassLoader(contextLoader
);
73 httpServiceServlet
.init(config
);
75 thread
.setContextClassLoader(current
);
80 public void destroy() {
81 Thread thread
= Thread
.currentThread();
82 ClassLoader current
= thread
.getContextClassLoader();
83 thread
.setContextClassLoader(contextLoader
);
85 httpServiceServlet
.destroy();
87 thread
.setContextClassLoader(current
);
93 public void service(ServletRequest req
, ServletResponse res
) throws ServletException
, IOException
{
94 Thread thread
= Thread
.currentThread();
95 ClassLoader current
= thread
.getContextClassLoader();
96 thread
.setContextClassLoader(contextLoader
);
98 httpServiceServlet
.service(req
, res
);
100 thread
.setContextClassLoader(current
);
105 public ServletConfig
getServletConfig() {
106 return httpServiceServlet
.getServletConfig();
110 public String
getServletInfo() {
111 return httpServiceServlet
.getServletInfo();
115 public void sessionCreated(HttpSessionEvent event
) {
120 public void sessionDestroyed(HttpSessionEvent event
) {
121 Thread thread
= Thread
.currentThread();
122 ClassLoader current
= thread
.getContextClassLoader();
123 thread
.setContextClassLoader(contextLoader
);
125 sessionDestroyed
.invoke(httpServiceServlet
, event
.getSession().getId());
126 } catch (IllegalAccessException
| IllegalArgumentException e
) {
128 } catch (InvocationTargetException e
) {
129 throw new RuntimeException(e
.getCause());
131 thread
.setContextClassLoader(current
);
136 public void sessionIdChanged(HttpSessionEvent event
, String oldSessionId
) {
137 Thread thread
= Thread
.currentThread();
138 ClassLoader current
= thread
.getContextClassLoader();
139 thread
.setContextClassLoader(contextLoader
);
141 sessionIdChanged
.invoke(httpServiceServlet
, oldSessionId
);
142 } catch (IllegalAccessException
| IllegalArgumentException e
) {
144 } catch (InvocationTargetException e
) {
145 throw new RuntimeException(e
.getCause());
147 thread
.setContextClassLoader(current
);