1 package com.eyeq.pivot4j.pentaho.servlet;
2
3 import java.io.IOException;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import javax.faces.webapp.FacesServlet;
8 import javax.servlet.ServletConfig;
9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14
15 public class FacesDispatcherServlet extends HttpServlet {
16
17 private static final long serialVersionUID = 9009308748116185472L;
18
19 private FacesServlet facesServlet;
20
21 private PluginServletContext contextWrapper;
22
23 private Map<String, String> initParameters;
24
25
26
27
28 public Map<String, String> getInitParameters() {
29 return initParameters;
30 }
31
32
33
34
35
36 public void setInitParameters(Map<String, String> initParameters) {
37 this.initParameters = initParameters;
38 }
39
40
41
42
43 protected PluginServletContext getContextWrapper() {
44 return contextWrapper;
45 }
46
47
48
49
50 protected FacesServlet getFacesServlet() {
51 return facesServlet;
52 }
53
54
55
56
57 @Override
58 public void init(ServletConfig config) throws ServletException {
59 super.init(config);
60
61 if (initParameters == null) {
62 this.initParameters = new HashMap<String, String>();
63 }
64
65 ClassLoader loader = Thread.currentThread().getContextClassLoader();
66
67 try {
68 Thread.currentThread().setContextClassLoader(
69 getClass().getClassLoader());
70
71 this.contextWrapper = new PluginServletContext(
72 config.getServletContext(), initParameters);
73 contextWrapper.initialize();
74
75 this.facesServlet = new FacesServlet();
76 this.facesServlet.init(new PluginServletConfig(contextWrapper));
77 } finally {
78 Thread.currentThread().setContextClassLoader(loader);
79 }
80 }
81
82
83
84
85 @Override
86 public void destroy() {
87 this.contextWrapper.destroy();
88 this.contextWrapper = null;
89
90 this.facesServlet.destroy();
91 this.facesServlet = null;
92
93 super.destroy();
94 }
95
96
97
98
99
100 @Override
101 public void service(ServletRequest request, ServletResponse response)
102 throws ServletException, IOException {
103 ClassLoader loader = Thread.currentThread().getContextClassLoader();
104
105 PluginServletRequest wrappedRequest = new PluginServletRequest(
106 contextWrapper, (HttpServletRequest) request);
107 try {
108 Thread.currentThread().setContextClassLoader(
109 getClass().getClassLoader());
110
111 wrappedRequest.initialize();
112
113 facesServlet.service(wrappedRequest, response);
114 } finally {
115 Thread.currentThread().setContextClassLoader(loader);
116
117 wrappedRequest.destroy();
118 }
119 }
120 }