New tests, update
[mono.git] / mcs / class / System.Web / System.Web.UI / Page.jvm.cs
index e9ecfb8580a8702c1d9dde52f8341d0e59e7d090..9fd544b58b5753a1498e23f408518e402747fb84 100644 (file)
 //
 
 using vmw.@internal.j2ee;
-using javax.servlet.http;\r
-using System.Collections.Specialized;\r
+using javax.servlet.http;
+using System.Collections.Specialized;
+using System.Globalization;
 using System.Web.Hosting;
+using System.Web.J2EE;
+using System.ComponentModel;
 
 namespace System.Web.UI
 {
        public partial class Page
        {
-               internal string PostBackFunctionName {
+               const string PageNamespaceKey = "__PAGENAMESPACE";
+               const string RenderPageMark = "vmw.render.page=";
+               const string ActionPageMark = "vmw.action.page=";
+               static readonly string NextActionPageKey = PortletInternalUtils.NextActionPage;
+               static readonly string NextRenderPageKey = PortletInternalUtils.NextRenderPage;
+
+               bool _emptyPortletNamespace = false;
+               string _PortletNamespace = null;
+               bool _renderResponseInit = false;
+               IPortletRenderResponse _renderResponse = null;
+
+               internal string PortletNamespace
+               {
                        get {
-#if LATER // Enable when we fix the jscripts not to reference __doPostBack.
-                               IPortletRenderResponse resp = GetRenderResponse();
-                               if (resp != null)
-                                       return "__doPostBack_" + resp.getNamespace();
-#endif
-                               return "__doPostBack";
+                               if (_emptyPortletNamespace)
+                                       return null;
+
+                               if (_PortletNamespace == null) {
+                                       IPortletResponse portletResponse = null;
+                                       if (Context != null) {
+                                               string usePortletNamespace = J2EEUtils.GetInitParameterByHierarchy (Context.Servlet.getServletConfig (), "mainsoft.use.portlet.namespace");
+                                               if (usePortletNamespace == null || Boolean.Parse(usePortletNamespace))
+                                                       portletResponse = Context.ServletResponse as IPortletResponse;
+                                       }
+                                       if (portletResponse != null)
+                                               _PortletNamespace = portletResponse.getNamespace ();
+                                       else if (_requestValueCollection != null && _requestValueCollection [PageNamespaceKey] != null)
+                                               _PortletNamespace = _requestValueCollection [PageNamespaceKey];
+                                               
+                                       _emptyPortletNamespace = _PortletNamespace == null;
+                               }
+                               return _PortletNamespace;
+                       }
+               }
+
+               internal string theForm {
+                       get {
+                               return "theForm" + PortletNamespace;
+                       }
+               }
+               
+               internal bool IsMultiForm {
+                       get {
+                               Mainsoft.Web.Configuration.PagesSection pageSection = (Mainsoft.Web.Configuration.PagesSection) System.Web.Configuration.WebConfigurationManager.GetSection ("mainsoft.web/pages");
+                               if (pageSection != null)
+                                       return pageSection.MultiForm;
+                               return false;
                        }
                }
 
-               // For J2EE portlets we load the view state from the render parameters
-               WebROCollection LoadViewStateForPortlet(WebROCollection coll)
+               internal bool IsPortletRender
                {
-                       IPortletRenderRequest renderRequest = Context.ServletRequest as IPortletRenderRequest;
-                       if (renderRequest != null && (coll == null || coll ["__VIEWSTATE"] == null)) {
-                               string mode = renderRequest.getPortletMode();
-                               string viewstate = Context.ServletRequest.getParameter("vmw.viewstate." + mode);
-                               if (viewstate != null) {
-                                       if (coll == null)
-                                               coll = new WebROCollection();
-                                       else 
-                                               coll.Unprotect();
-                                       coll["__VIEWSTATE"] = viewstate;
-                                       coll.Protect();
-                               }
+                       get {
+                               return RenderResponse != null;
                        }
-                       return coll;
                }
 
-               internal bool SaveViewStateForNextPortletRender()
+               internal bool IsGetBack {
+                       get {
+                               return IsPostBack && IsPortletRender &&
+                                       (0 == String.Compare (Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase));
+                       }
+               }
+
+               internal IPortletRenderResponse RenderResponse
+               {
+                       get {
+                               if (!_renderResponseInit)
+                                       if (Context != null) {
+                                               _renderResponse = Context.ServletResponse as IPortletRenderResponse;
+                                               _renderResponseInit = true;
+                                       }
+                               return _renderResponse;
+                       }
+               }
+
+               public string CreateRenderUrl (string url)
+               {
+                       if (RenderResponse != null)
+                               return RenderResponse.createRenderURL (url);
+                       if (PortletNamespace == null)
+                               return url;
+
+                       string internalUrl = RemoveAppPathIfInternal (url);
+                       if (internalUrl == null)
+                               return url;
+
+                       PostBackOptions options = new PostBackOptions (this);
+                       options.ActionUrl = RenderPageMark + internalUrl;
+                       options.RequiresJavaScriptProtocol = true;
+                       return ClientScript.GetPostBackEventReference (options);
+               }
+
+               public string CreateActionUrl (string url)
+               {
+                       if (url.StartsWith (RenderPageMark, StringComparison.Ordinal) || url.StartsWith (ActionPageMark, StringComparison.Ordinal))
+                               return url;
+
+                       if (RenderResponse != null)
+                               return RenderResponse.createActionURL (url);
+                       if (PortletNamespace == null)
+                               return url;
+
+                       Uri requestUrl = Request.Url;
+                       string internalUrl = RemoveAppPathIfInternal (url);
+                       if (internalUrl == null)
+                               return url;
+
+                       return ActionPageMark + internalUrl;
+               }
+
+               private string RemoveAppPathIfInternal (string url)
                {
+                       Uri reqUrl = Request.Url;
+                       string appPath = Request.ApplicationPath;
+                       string currPage = Request.CurrentExecutionFilePath;
+                       if (currPage.StartsWith (appPath, StringComparison.InvariantCultureIgnoreCase))
+                               currPage = currPage.Substring (appPath.Length);
+                       return PortletInternalUtils.mapPathIfInternal (url, reqUrl.Host, reqUrl.Port, reqUrl.Scheme, appPath, currPage);
+               }
+
+               internal bool OnSaveStateCompleteForPortlet ()
+               {
+                       if (PortletNamespace != null) {
+                               ClientScript.RegisterHiddenField (PageNamespaceKey, PortletNamespace);
+                               ClientScript.RegisterHiddenField (NextActionPageKey, "");
+                               ClientScript.RegisterHiddenField (NextRenderPageKey, "");
+                       }
+
                        IPortletActionResponse resp = Context.ServletResponse as IPortletActionResponse;
                        IPortletActionRequest req = Context.ServletRequest as IPortletActionRequest;
                        if (req == null)
                                return false;
 
-                       if (IsPostBack && String.Compare (Request.HttpMethod, "POST", true) == 0 && !resp.isRedirected())
-                               resp.setRenderParameter("vmw.viewstate." + req.getPortletMode(), GetSavedViewState());
+                       // When redirecting don't save the page viewstate and hidden fields
+                       if (resp.isRedirected ())
+                               return true;
+
+                       if (IsPostBack && 0 == String.Compare (Request.HttpMethod, "POST", true, CultureInfo.InvariantCulture)) {
+                               resp.setRenderParameter ("__VIEWSTATE", GetSavedViewState ());
+                               if (ClientScript.hiddenFields != null)
+                                       foreach (string key in ClientScript.hiddenFields.Keys)
+                                               resp.setRenderParameter (key, (string) ClientScript.hiddenFields [key]);
+
+                               if (is_validated && Validators.Count > 0) {
+                                       string validatorsState = GetValidatorsState ();
+#if DEBUG
+                                       Console.WriteLine ("__VALIDATORSSTATE: " + validatorsState);
+#endif
+                                       if (!String.IsNullOrEmpty (validatorsState))
+                                               resp.setRenderParameter ("__VALIDATORSSTATE", validatorsState);
+                               }
+                       }
 
                        // Stop processing only if we are handling processAction. If we
                        // are handling a postback from render then fall through.
-                       return req.processActionOnly() || resp.isRedirected();
+                       return req.processActionOnly ();
+               }
+
+               string GetValidatorsState () {
+                       bool [] validatorsState = new bool [Validators.Count];
+                       bool isValid = true;
+                       for (int i = 0; i < Validators.Count; i++) {
+                               IValidator val = Validators [i];
+                               if (!val.IsValid)
+                                       isValid = false;
+                               else
+                                       validatorsState [i] = true;
+                       }
+                       if (isValid)
+                               return null;
+
+                       return GetFormatter ().Serialize (validatorsState);
+               }
+
+               void RestoreValidatorsState () {
+                       string validatorsStateSerialized = Request.Form ["__VALIDATORSSTATE"];
+                       if (String.IsNullOrEmpty (validatorsStateSerialized))
+                               return;
+
+                       is_validated = true;
+                       bool [] validatorsState = (bool []) GetFormatter ().Deserialize (validatorsStateSerialized);
+                       for (int i = 0; i < Math.Min (validatorsState.Length, Validators.Count); i++) {
+                               IValidator val = Validators [i];
+                               val.IsValid = validatorsState [i];
+                       }
                }
        }
 }