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 /** A {@link CmsJettyServer} integrating with Equinox HTTP framework. */
25 public class EquinoxJettyServer
extends CmsJettyServer
{
26 private static final String INTERNAL_CONTEXT_CLASSLOADER
= "org.eclipse.equinox.http.jetty.internal.ContextClassLoader";
29 protected void addServlets(ServletContextHandler rootContextHandler
) throws ServletException
{
30 ServletHolder holder
= new ServletHolder(new InternalHttpServiceServlet());
31 holder
.setInitOrder(0);
32 holder
.setInitParameter(Constants
.SERVICE_VENDOR
, "Eclipse.org"); //$NON-NLS-1$
33 holder
.setInitParameter(Constants
.SERVICE_DESCRIPTION
, "Equinox Jetty-based Http Service"); //$NON-NLS-1$
35 rootContextHandler
.addServlet(holder
, "/*");
38 SessionHandler sessionManager
= rootContextHandler
.getSessionHandler();
39 sessionManager
.addEventListener((HttpSessionIdListener
) holder
.getServlet());
42 public static class InternalHttpServiceServlet
implements HttpSessionListener
, HttpSessionIdListener
, Servlet
{
43 private final Servlet httpServiceServlet
= new HttpServiceServlet();
44 private ClassLoader contextLoader
;
45 private final Method sessionDestroyed
;
46 private final Method sessionIdChanged
;
48 public InternalHttpServiceServlet() {
49 Class
<?
> clazz
= httpServiceServlet
.getClass();
52 sessionDestroyed
= clazz
.getMethod("sessionDestroyed", new Class
<?
>[] { String
.class }); //$NON-NLS-1$
53 } catch (Exception e
) {
54 throw new IllegalStateException(e
);
57 sessionIdChanged
= clazz
.getMethod("sessionIdChanged", new Class
<?
>[] { String
.class }); //$NON-NLS-1$
58 } catch (Exception e
) {
59 throw new IllegalStateException(e
);
64 public void init(ServletConfig config
) throws ServletException
{
65 ServletContext context
= config
.getServletContext();
66 contextLoader
= (ClassLoader
) context
.getAttribute(INTERNAL_CONTEXT_CLASSLOADER
);
68 Thread thread
= Thread
.currentThread();
69 ClassLoader current
= thread
.getContextClassLoader();
70 thread
.setContextClassLoader(contextLoader
);
72 httpServiceServlet
.init(config
);
74 thread
.setContextClassLoader(current
);
79 public void destroy() {
80 Thread thread
= Thread
.currentThread();
81 ClassLoader current
= thread
.getContextClassLoader();
82 thread
.setContextClassLoader(contextLoader
);
84 httpServiceServlet
.destroy();
86 thread
.setContextClassLoader(current
);
92 public void service(ServletRequest req
, ServletResponse res
) throws ServletException
, IOException
{
93 Thread thread
= Thread
.currentThread();
94 ClassLoader current
= thread
.getContextClassLoader();
95 thread
.setContextClassLoader(contextLoader
);
97 httpServiceServlet
.service(req
, res
);
99 thread
.setContextClassLoader(current
);
104 public ServletConfig
getServletConfig() {
105 return httpServiceServlet
.getServletConfig();
109 public String
getServletInfo() {
110 return httpServiceServlet
.getServletInfo();
114 public void sessionCreated(HttpSessionEvent event
) {
119 public void sessionDestroyed(HttpSessionEvent event
) {
120 Thread thread
= Thread
.currentThread();
121 ClassLoader current
= thread
.getContextClassLoader();
122 thread
.setContextClassLoader(contextLoader
);
124 sessionDestroyed
.invoke(httpServiceServlet
, event
.getSession().getId());
125 } catch (IllegalAccessException
| IllegalArgumentException e
) {
127 } catch (InvocationTargetException e
) {
128 throw new RuntimeException(e
.getCause());
130 thread
.setContextClassLoader(current
);
135 public void sessionIdChanged(HttpSessionEvent event
, String oldSessionId
) {
136 Thread thread
= Thread
.currentThread();
137 ClassLoader current
= thread
.getContextClassLoader();
138 thread
.setContextClassLoader(contextLoader
);
140 sessionIdChanged
.invoke(httpServiceServlet
, oldSessionId
);
141 } catch (IllegalAccessException
| IllegalArgumentException e
) {
143 } catch (InvocationTargetException e
) {
144 throw new RuntimeException(e
.getCause());
146 thread
.setContextClassLoader(current
);