You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by aw...@apache.org on 2007/08/14 17:47:53 UTC

svn commit: r565814 - in /myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main: java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/ javascript/META-INF/adf/jsLibs/

Author: awiner
Date: Tue Aug 14 08:47:52 2007
New Revision: 565814

URL: http://svn.apache.org/viewvc?view=rev&rev=565814
Log:
Step 2 of TRINIDAD-96: Validators should be added incrementally, not set as a whole
- Instead of setting reset calls as an array, add them as a clientId->JS call map
- Make the shuttle reset call a no-op if that shuttle has been removed

Modified:
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/CoreFormData.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/FormRenderer.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SelectManyShuttleRenderer.java
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Core.js
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Page.js
    myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Shuttle.js

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/CoreFormData.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/CoreFormData.java?view=diff&rev=565814&r1=565813&r2=565814
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/CoreFormData.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/CoreFormData.java Tue Aug 14 08:47:52 2007
@@ -39,10 +39,10 @@
 import org.apache.myfaces.trinidad.context.RenderingContext;
 import org.apache.myfaces.trinidad.convert.ClientConverter;
 import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+import org.apache.myfaces.trinidad.util.FastMessageFormat;
 import org.apache.myfaces.trinidad.util.MessageFactory;
 import org.apache.myfaces.trinidad.validator.ClientValidator;
 import org.apache.myfaces.trinidadinternal.share.data.ServletRequestParameters;
-import org.apache.myfaces.trinidadinternal.share.util.FastMessageFormat;
 
 /**
  * Implementation of FormData from the CoreRenderKit (or,
@@ -156,28 +156,29 @@
    * "eval(call)" will be called on the client when resetting.
    */
   public void addResetCall(
+    String           clientId,
     String           call
     )
   {
 
     if (call != null)
     {
-      List<String> resetCalls = getResetCalls(true);
+      Map<String, String> resetCalls = getResetCalls(true);
 
       // add the call
-      resetCalls.add(call);
+      resetCalls.put(clientId, call);
     }
   }
 
 
-  public List<String> getResetCalls(
+  public Map<String, String> getResetCalls(
     boolean          createIfNecessary
     )
   {
 
     if (_resetCallsList == null && createIfNecessary)
     {
-      _resetCallsList = new ArrayList<String>();
+      _resetCallsList = new HashMap<String, String>();
     }
 
     return _resetCallsList;
@@ -763,8 +764,8 @@
   // on the component
   private Map<String, String> _labelMap = null;
 
-  // List of reset calls
-  private List<String> _resetCallsList = null;
+  // Map of reset calls
+  private Map<String, String> _resetCallsList = null;
 
   private String _formName = null;
 

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/FormRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/FormRenderer.java?view=diff&rev=565814&r1=565813&r2=565814
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/FormRenderer.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/FormRenderer.java Tue Aug 14 08:47:52 2007
@@ -381,10 +381,10 @@
     // Write the array of reset calls
     //
     CoreFormData fData = (CoreFormData) arc.getFormData();
-    List<String> resetCallList = fData.getResetCalls(false);
+    Map<String, String> resetCallMap = fData.getResetCalls(false);
 
-    int resetCallCount = (resetCallList != null)
-                            ? resetCallList.size()
+    int resetCallCount = (resetCallMap != null)
+                            ? resetCallMap.size()
                             : 0;
 
     if (resetCallCount != 0)
@@ -397,16 +397,15 @@
       // Bug #3426092:
       // render the type="text/javascript" attribute in accessibility mode
       renderScriptTypeAttribute(context, arc);
-
-      writer.write("var _");
-      writer.write(jsID);
-      writer.write("_Reset=[");
-
+      writer.writeText("TrPage.getInstance()._addResetCalls('", null);
+      writer.writeText(fData.getName(), null);
+      writer.writeText("',{", null);
       boolean firstCall = true;
 
-      for (int i = 0; i < resetCallCount; i++)
+      for (Map.Entry<String, String> entry : resetCallMap.entrySet())
       {
-        String currCall = resetCallList.get(i);
+        String clientId = entry.getKey();
+        String currCall = entry.getValue();
 
         if (firstCall)
         {
@@ -415,18 +414,20 @@
         else
         {
           // write the separator every time except the first time
-          writer.write(",");
+          writer.writeText(",", null);
         }
 
         // write the error format
         // use single quotes since embedded single quotes
         // are automatically escaped
-        writer.write("\'");
-        writer.write(XhtmlUtils.escapeJS(currCall));
-        writer.write("\'");
+        writer.writeText("'", null);
+        writer.writeText(clientId, null);
+        writer.writeText("':'", null);
+        writer.writeText(XhtmlUtils.escapeJS(currCall), null);
+        writer.writeText("'", null);
       }
 
-      writer.write("];");
+      writer.writeText("});", null);
       writer.endElement("script");
     }
 
@@ -833,12 +834,13 @@
    * "eval(call)" will be called on the client when resetting.
    */
   public static void addResetCall(
+    String           clientId,
     String           call
     )
   {
     CoreFormData fData = (CoreFormData)
       RenderingContext.getCurrentInstance().getFormData();
-    fData.addResetCall(call);
+    fData.addResetCall(clientId, call);
   }
 
  public static void addOnSubmitConverterValidators(

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SelectManyShuttleRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SelectManyShuttleRenderer.java?view=diff&rev=565814&r1=565813&r2=565814
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SelectManyShuttleRenderer.java (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SelectManyShuttleRenderer.java Tue Aug 14 08:47:52 2007
@@ -386,17 +386,17 @@
 
     // Get JS-valid identifiers for ourselves
     String formName = XhtmlUtils.getJSIdentifier(rc.getFormData().getName());
-    clientId = XhtmlUtils.getJSIdentifier(clientId);
+    String jsClientId = XhtmlUtils.getJSIdentifier(clientId);
     
     // Add the reset call to the form as a whole
     StringBuilder funcCallBuffer = new StringBuilder(
                                                19 +
                                                formName.length() +
-                                               clientId.length());
+                                               jsClientId.length());
 
-    funcCallBuffer.append("TrShuttleProxy._resetItems('").append(clientId);
+    funcCallBuffer.append("TrShuttleProxy._resetItems('").append(jsClientId);
     funcCallBuffer.append("','").append(formName).append("');");
-    FormRenderer.addResetCall(funcCallBuffer.toString());
+    FormRenderer.addResetCall(clientId, funcCallBuffer.toString());
 
     ResponseWriter rw = context.getResponseWriter();
     // And write out the "orig" script that retains knowledge of
@@ -404,9 +404,9 @@
     rw.writeText( "window[\"_", null);
     rw.writeText(formName, null);
     rw.writeText("_", null);
-    rw.writeText(clientId, null);
+    rw.writeText(jsClientId, null);
     rw.writeText("_orig\"]=TrShuttleProxy._copyLists('", null);
-    rw.writeText(clientId, null);
+    rw.writeText(jsClientId, null);
     rw.writeText("','", null);
     rw.writeText(formName, null);
     rw.writeText("');", null);

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Core.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Core.js?view=diff&rev=565814&r1=565813&r2=565814
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Core.js (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Core.js Tue Aug 14 08:47:52 2007
@@ -2009,20 +2009,7 @@
   if (!form)
     return false;
 
-  var resetCallbacks= window[ "_" + _getJavascriptId(form.name) + "_Reset"];
-
-  if (resetCallbacks && !doReload)
-  {
-    for (var i = 0; i < resetCallbacks.length; i++)
-    {
-      var trueResetCallback = unescape(resetCallbacks[i]);
-
-      doReload = (eval(trueResetCallback));
-
-    }
-  }
-
-
+  var doReload = TrPage.getInstance()._resetForm(form);
   if ( doReload )
   {
     window.document.location.reload();
@@ -2031,6 +2018,7 @@
   {
     form.reset();
   }
+
   _lastDateReset = new Date();
   return doReload;
 }

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Page.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Page.js?view=diff&rev=565814&r1=565813&r2=565814
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Page.js (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Page.js Tue Aug 14 08:47:52 2007
@@ -159,6 +159,55 @@
   }
 }
 
+TrPage.prototype._addResetCalls = function(
+  formName,
+  callMap)
+{
+  var resetCalls = this._resetCalls;
+  if (!resetCalls)
+  {
+    resetCalls = new Object();
+    this._resetCalls = resetCalls;
+  }
+
+  var formReset = resetCalls[formName];
+  if (!formReset)
+  {
+    formReset = new Object();
+    resetCalls[formName] = formReset;
+  }
+
+  for (var k in callMap)
+  {
+    formReset[k] = callMap[k];
+  }
+}
+
+/**
+ * Callback used by Core.js resetForm() function
+ * TODO: remove entire Core.js code, move to public TrPage.resetForm()
+ * call.
+ */
+TrPage.prototype._resetForm = function(form)
+{
+  var resetCalls = this._resetCalls;
+  if (!resetCalls)
+    return false;
+  var formReset = resetCalls[form.getAttribute("name")];
+  if (!formReset)
+    return false;
+
+  var doReload = false;
+  for (var k in formReset)
+  {
+    var trueResetCallback = unescape(formReset[k]);
+    if (eval(trueResetCallback))
+      doReload = true;
+  }
+  
+  return doReload;
+}
+
 // TODO move to agent code
 TrPage._getNodeName = function(element)
 {

Modified: myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Shuttle.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Shuttle.js?view=diff&rev=565814&r1=565813&r2=565814
==============================================================================
--- myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Shuttle.js (original)
+++ myfaces/trinidad/trunk/trinidad/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Shuttle.js Tue Aug 14 08:47:52 2007
@@ -1364,25 +1364,17 @@
   shuttleName,
   formName)
 {
-
-  //get the formName if needed
-  if(formName == (void 0))
-  {
-    formName = TrShuttleProxy._findFormNameContaining(from);
-  }
-
-  if(formName.length == 0)
-  {
-    alert(shuttle_no_form_available);
-    return;
-  }
-
   // get list names
   leadingListName = TrShuttleProxy._getListName( shuttleName, true);
   trailingListName = TrShuttleProxy._getListName( shuttleName, false);
 
   // get current lists
   var leadingList  = document.forms[formName].elements[leadingListName];
+  // Defensive:  reset calls are left attached to the page even after
+  // the element has been removed.  So if the list is not found, just bail
+  if (!leadingList)
+    return;
+
   var trailingList = document.forms[formName].elements[trailingListName];
 
   // get original lists
@@ -1513,19 +1505,6 @@
   */
  TrShuttleProxy._copyLists = function( shuttleName, formName )
  {
-
-   //get the formName if needed
-   if(formName == (void 0))
-   {
-     formName = TrShuttleProxy._findFormNameContaining(from);
-   }
-
-   if(formName.length == 0)
-   {
-     alert(shuttle_no_form_available);
-     return;
-   }
-
    var origLists = new Object();
    origLists.leading = TrShuttleProxy._copyList( TrShuttleProxy._getListName( shuttleName, true), formName);
    origLists.trailing = TrShuttleProxy._copyList( TrShuttleProxy._getListName( shuttleName, false), formName);