dev@jsf-extensions.java.net

integrating change for woodstock issue 98418 HEAD: script rendering clashes with dynamic faces script rendering

From: Matthew Bohm <Matthew.Bohm_at_Sun.COM>
Date: Fri, 23 Mar 2007 17:51:47 -0700

See attached diff.

Matt



Index: code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/components/AjaxZone.java
===================================================================
--- code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/components/AjaxZone.java (revision 419)
+++ code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/components/AjaxZone.java (working copy)
@@ -32,6 +32,11 @@
     public String getFamily() {
         return "com.sun.faces.AjaxZone";
     }
+
+ /**
+ * <p>Request attribute that indicates a <code>script</code> tag pointing to com_sun_faces_ajax_zone.js has been rendered already.</p>
+ */
+ public static final String ZONE_JS_LINKED = "com.sun.faces.extensions.avatar.LINKED/com_sun_faces_ajax_zone.js";
 
     /**
      * <p>Override the <code>UICommand</code> method to wrap the
Index: code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/components/ScriptsComponent.java
===================================================================
--- code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/components/ScriptsComponent.java (revision 419)
+++ code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/components/ScriptsComponent.java (working copy)
@@ -18,5 +18,13 @@
         return "com.sun.faces.extensions.avatar.Scripts";
     }
 
+ /**
+ * <p>Request attribute that indicates a <code>script</code> tag pointing to com_sun_faces_ajax.js has been rendered already.</p>
+ */
+ public static final String AJAX_JS_LINKED = "com.sun.faces.extensions.avatar.LINKED/com_sun_faces_ajax.js";
     
+ /**
+ * <p>Request attribute that indicates a <code>script</code> tag pointing to prototype.js has been rendered already.</p>
+ */
+ public static final String PROTOTYPE_JS_LINKED = "com.sun.faces.extensions.avatar.LINKED/prototype.js";
 }
Index: code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/renderkit/AjaxZoneRenderer.java
===================================================================
--- code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/renderkit/AjaxZoneRenderer.java (revision 419)
+++ code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/renderkit/AjaxZoneRenderer.java (working copy)
@@ -30,6 +30,7 @@
 package com.sun.faces.extensions.avatar.renderkit;
 
 import com.sun.faces.extensions.avatar.components.AjaxZone;
+import com.sun.faces.extensions.avatar.components.ScriptsComponent;
 import com.sun.faces.extensions.avatar.lifecycle.AsyncResponse;
 import com.sun.faces.extensions.common.util.Util;
 import java.io.IOException;
@@ -51,6 +52,7 @@
 import org.apache.shale.remoting.Mechanism;
 import org.apache.shale.remoting.XhtmlHelper;
 
+
 /**
  * This class renderers TextField components.
  */
@@ -65,8 +67,14 @@
         "/META-INF/libs/scriptaculous/version1.6.4/prototype.js",
         "/META-INF/com_sun_faces_ajax.js",
         "/META-INF/com_sun_faces_ajax_zone.js"
- };
-
+ };
+
+ private static final String scriptLinkKeys[] = {
+ ScriptsComponent.PROTOTYPE_JS_LINKED,
+ ScriptsComponent.AJAX_JS_LINKED,
+ AjaxZone.ZONE_JS_LINKED
+ };
+
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     // Renderer methods
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -409,8 +417,12 @@
             
             if (!isAjaxRequest && !java.beans.Beans.isDesignTime()) {
                 for (int i = 0; i < scriptIds.length; i++) {
- getXhtmlHelper().linkJavascript(context, component, writer,
+ Map requestMap = context.getExternalContext().getRequestMap();
+ if (!requestMap.containsKey(scriptLinkKeys[i])) {
+ getXhtmlHelper().linkJavascript(context, component, writer,
                             Mechanism.CLASS_RESOURCE, scriptIds[i]);
+ requestMap.put(scriptLinkKeys[i], Boolean.TRUE);
+ }
                 }
             }
             writeAjaxifyScripts(context, writer, zone, isAjaxRequest);
Index: code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/renderkit/ScriptsRenderer.java
===================================================================
--- code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/renderkit/ScriptsRenderer.java (revision 419)
+++ code/run-time/avatar/src/main/java/com/sun/faces/extensions/avatar/renderkit/ScriptsRenderer.java (working copy)
@@ -37,6 +37,8 @@
 import javax.faces.render.Renderer;
 import org.apache.shale.remoting.Mechanism;
 import org.apache.shale.remoting.XhtmlHelper;
+import com.sun.faces.extensions.avatar.components.ScriptsComponent;
+import java.util.Map;
 
 /**
  * This class renderers TextField components.
@@ -52,7 +54,12 @@
         "/META-INF/libs/scriptaculous/version1.6.4/prototype.js",
         "/META-INF/com_sun_faces_ajax.js"
     };
-
+
+ private static final String scriptLinkKeys[] = {
+ ScriptsComponent.PROTOTYPE_JS_LINKED,
+ ScriptsComponent.AJAX_JS_LINKED,
+ };
+
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     // Renderer methods
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -69,10 +76,14 @@
      */
     public void encodeBegin(FacesContext context, UIComponent component)
             throws IOException {
- if (!AsyncResponse.isAjaxRequest()) {
+ if (!AsyncResponse.isAjaxRequest() && !java.beans.Beans.isDesignTime()) {
             for (int i = 0; i < scriptIds.length; i++) {
- getXhtmlHelper().linkJavascript(context, component, context.getResponseWriter(),
+ Map requestMap = context.getExternalContext().getRequestMap();
+ if (!requestMap.containsKey(scriptLinkKeys[i])) {
+ getXhtmlHelper().linkJavascript(context, component, context.getResponseWriter(),
                         Mechanism.CLASS_RESOURCE, scriptIds[i]);
+ requestMap.put(scriptLinkKeys[i], Boolean.TRUE);
+ }
             }
         }
     }