merge r98447
[mono.git] / mcs / class / Mainsoft.Web / Mainsoft.Web.Hosting / ServletFacesPageHandler.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Web;\r
5 using javax.faces.component;\r
6 using System.Web.UI;\r
7 using javax.faces.context;\r
8 using javax.faces.lifecycle;\r
9 using javax.faces;\r
10 using javax.servlet;\r
11 using javax.faces.webapp;\r
12 using javax.servlet.http;\r
13 using vmw.common;\r
14 using System.Diagnostics;\r
15 using javax.faces.render;\r
16 using System.IO;\r
17 \r
18 namespace Mainsoft.Web.Hosting\r
19 {\r
20         public abstract class BaseFacesPageHandler\r
21         {\r
22                 static protected void SetupResponseWriter (AspNetFacesContext facesContext, string contentType, string characterEncoding) {\r
23                         RenderKit renderKit = BaseHttpServlet.RenderKitFactory.getRenderKit (facesContext, facesContext.getViewRoot ().getRenderKitId ());\r
24                         ResponseWriter writer = renderKit.createResponseWriter (new AspNetResponseWriter (facesContext.Context.Response.Output), contentType, characterEncoding);\r
25                         facesContext.setResponseWriter (writer);\r
26                 }\r
27 \r
28                 #region AspNetResponseWriter\r
29                 private sealed class AspNetResponseWriter : java.io.Writer\r
30                 {\r
31                         readonly TextWriter _writer;\r
32                         public AspNetResponseWriter (TextWriter writer) {\r
33                                 _writer = writer;\r
34                         }\r
35                         public override void close () {\r
36                                 _writer.Close ();\r
37                         }\r
38 \r
39                         public override void flush () {\r
40                                 _writer.Flush ();\r
41                         }\r
42 \r
43                         public override void write (char [] __p1, int __p2, int __p3) {\r
44                                 _writer.Write (__p1, __p2, __p3);\r
45                         }\r
46 \r
47                         public override void write (int __p1) {\r
48                                 _writer.Write ((char) __p1);\r
49                         }\r
50 \r
51                         public override void write (char [] __p1) {\r
52                                 _writer.Write (__p1);\r
53                         }\r
54 \r
55                         public override void write (string __p1) {\r
56                                 _writer.Write (__p1);\r
57                         }\r
58 \r
59                         public override void write (string __p1, int __p2, int __p3) {\r
60                                 _writer.Write (__p1, __p2, __p3);\r
61                         }\r
62                 }\r
63                 #endregion\r
64         }\r
65 \r
66         public class ServletFacesPageHandler : BaseFacesPageHandler, IHttpHandler, IServiceProvider\r
67         {\r
68                 readonly FacesContextFactory _facesContextFactory;\r
69                 readonly Lifecycle _lifecycle;\r
70                 readonly string _executionFilePath;\r
71                 readonly Type _pageType;\r
72                 Page _page;\r
73 \r
74                 public bool IsReusable {\r
75                         get { return false; }\r
76                 }\r
77 \r
78                 public ServletFacesPageHandler (string executionFilePath, Type pageType, FacesContextFactory facesContextFactory, Lifecycle lifecycle) {\r
79                         _facesContextFactory = facesContextFactory;\r
80                         _lifecycle = lifecycle;\r
81                         _executionFilePath = executionFilePath;\r
82                         _pageType = pageType;\r
83                 }\r
84 \r
85                 protected virtual ServletFacesContext GetFacesContext (FacesContextFactory facesContextFactory,\r
86                                                                                                                                         ServletContext servletContext,\r
87                                                                                                                                         ServletRequest servletRequest,\r
88                                                                                                                                         ServletResponse servletResponse,\r
89                                                                                                                                         Lifecycle lifecycle,\r
90                                                                                                                                         HttpContext httpContext,\r
91                                                                                                                                         string executionFilePath) {\r
92                         return ServletFacesContext.GetFacesContext (facesContextFactory, servletContext, servletRequest, servletResponse, lifecycle, httpContext, executionFilePath);\r
93                 }\r
94 \r
95                 public void ProcessRequest (HttpContext context) {\r
96                         ServletWorkerRequest wr = (ServletWorkerRequest) ((IServiceProvider) context).GetService (typeof (HttpWorkerRequest));\r
97                         ServletContext servletContext = wr.GetContext ();\r
98                         HttpServletRequest request = wr.ServletRequest;\r
99                         HttpServletResponse response = wr.ServletResponse;\r
100 \r
101                         ServletFacesContext facesContext = GetFacesContext (_facesContextFactory, servletContext, request, response, _lifecycle, context, _executionFilePath);\r
102                         try {\r
103                                 try {\r
104                                         try {\r
105                                                 Trace.WriteLine ("FacesPageHandler: before execute");\r
106                                                 _lifecycle.execute (facesContext);\r
107                                                 Trace.WriteLine ("FacesPageHandler: after execute");\r
108                                         }\r
109                                         finally {\r
110                                                 UIViewRoot viewRoot = facesContext.getViewRoot ();\r
111                                                 if (viewRoot != null && viewRoot.getChildCount () > 0)\r
112                                                         _page = (Page) viewRoot.getChildren ().get (0);\r
113                                         }\r
114                                         Trace.WriteLine ("FacesPageHandler: before render");\r
115                                         SetupResponseWriter (facesContext, response.getContentType (), response.getCharacterEncoding ());\r
116                                         _lifecycle.render (facesContext);\r
117                                         Trace.WriteLine ("FacesPageHandler: after render");\r
118                                 }\r
119                                 catch (FacesException fex) {\r
120                                         Exception inner = fex.InnerException;\r
121                                         if (inner != null)\r
122                                                 TypeUtils.Throw (inner);\r
123                                         throw;\r
124                                 }\r
125                         }\r
126                         finally {\r
127                                 facesContext.release ();\r
128                         }\r
129                 }\r
130 \r
131                 public object GetService (Type serviceType) {\r
132                         if (serviceType == typeof (Type))\r
133                                 return _pageType;\r
134                         if (serviceType == typeof (Page))\r
135                                 return _page;\r
136                         return null;\r
137                 }\r
138         }\r
139 }\r