refactoring:
[mono.git] / mcs / class / Mainsoft.Web / Mainsoft.Web.Hosting / ServletFacesPageHandler.cs
index ec8421f397e2cd187b85630d0c7b49a95d4d54b7..a35d95eef4bb5cdda601a9af841194fb543a0c34 100644 (file)
@@ -12,15 +12,64 @@ using javax.faces.webapp;
 using javax.servlet.http;\r
 using vmw.common;\r
 using System.Diagnostics;\r
+using javax.faces.render;\r
+using System.IO;\r
 \r
 namespace Mainsoft.Web.Hosting\r
 {\r
-       public sealed class ServletFacesPageHandler : IHttpHandler, IServiceProvider\r
+       public abstract class BaseFacesPageHandler\r
+       {\r
+               static protected void SetupResponseWriter (AspNetFacesContext facesContext, string contentType, string characterEncoding) {\r
+                       RenderKit renderKit = BaseHttpServlet.RenderKitFactory.getRenderKit (facesContext, facesContext.getViewRoot ().getRenderKitId ());\r
+                       ResponseWriter writer = renderKit.createResponseWriter (new AspNetResponseWriter (facesContext.Context.Response.Output), contentType, characterEncoding);\r
+                       facesContext.setResponseWriter (writer);\r
+               }\r
+\r
+               #region AspNetResponseWriter\r
+               private sealed class AspNetResponseWriter : java.io.Writer\r
+               {\r
+                       readonly TextWriter _writer;\r
+                       public AspNetResponseWriter (TextWriter writer) {\r
+                               _writer = writer;\r
+                       }\r
+                       public override void close () {\r
+                               _writer.Close ();\r
+                       }\r
+\r
+                       public override void flush () {\r
+                               _writer.Flush ();\r
+                       }\r
+\r
+                       public override void write (char [] __p1, int __p2, int __p3) {\r
+                               _writer.Write (__p1, __p2, __p3);\r
+                       }\r
+\r
+                       public override void write (int __p1) {\r
+                               _writer.Write ((char) __p1);\r
+                       }\r
+\r
+                       public override void write (char [] __p1) {\r
+                               _writer.Write (__p1);\r
+                       }\r
+\r
+                       public override void write (string __p1) {\r
+                               _writer.Write (__p1);\r
+                       }\r
+\r
+                       public override void write (string __p1, int __p2, int __p3) {\r
+                               _writer.Write (__p1, __p2, __p3);\r
+                       }\r
+               }\r
+               #endregion\r
+       }\r
+\r
+       public sealed class ServletFacesPageHandler : BaseFacesPageHandler, IHttpHandler, IServiceProvider\r
        {\r
                readonly FacesContextFactory _facesContextFactory;\r
                readonly Lifecycle _lifecycle;\r
                readonly string _executionFilePath;\r
                readonly Type _pageType;\r
+               Page _page;\r
 \r
                public bool IsReusable {\r
                        get { return false; }\r
@@ -39,14 +88,21 @@ namespace Mainsoft.Web.Hosting
                        HttpServletRequest request = wr.ServletRequest;\r
                        HttpServletResponse response = wr.ServletResponse;\r
 \r
-                       FacesContext facesContext = ServletFacesContext.GetFacesContext (_facesContextFactory, servletContext, request, response, _lifecycle, context, _executionFilePath);\r
+                       ServletFacesContext facesContext = ServletFacesContext.GetFacesContext (_facesContextFactory, servletContext, request, response, _lifecycle, context, _executionFilePath);\r
                        try {\r
                                try {\r
-                                       Trace.WriteLine ("FacesPageHandler: before execute");\r
-                                       _lifecycle.execute (facesContext);\r
-                                       Trace.WriteLine ("FacesPageHandler: after execute");\r
-\r
+                                       try {\r
+                                               Trace.WriteLine ("FacesPageHandler: before execute");\r
+                                               _lifecycle.execute (facesContext);\r
+                                               Trace.WriteLine ("FacesPageHandler: after execute");\r
+                                       }\r
+                                       finally {\r
+                                               UIViewRoot viewRoot = facesContext.getViewRoot ();\r
+                                               if (viewRoot != null && viewRoot.getChildCount () > 0)\r
+                                                       _page = (Page) viewRoot.getChildren ().get (0);\r
+                                       }\r
                                        Trace.WriteLine ("FacesPageHandler: before render");\r
+                                       SetupResponseWriter (facesContext, response.getContentType (), response.getCharacterEncoding ());\r
                                        _lifecycle.render (facesContext);\r
                                        Trace.WriteLine ("FacesPageHandler: after render");\r
                                }\r
@@ -65,6 +121,8 @@ namespace Mainsoft.Web.Hosting
                public object GetService (Type serviceType) {\r
                        if (serviceType == typeof (Type))\r
                                return _pageType;\r
+                       if (serviceType == typeof (Page))\r
+                               return _page;\r
                        return null;\r
                }\r
        }\r