You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by mm...@apache.org on 2005/09/17 22:40:52 UTC

svn commit: r289850 - /myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/jsvalueset/HtmlJsValueSetRenderer.java

Author: mmarinschek
Date: Sat Sep 17 13:40:47 2005
New Revision: 289850

URL: http://svn.apache.org/viewcvs?rev=289850&view=rev
Log:
fix for MYFACES-559. Thanks to Timo Thomas for this suggestion + patch! very good improvement for jsValueSet.

Modified:
    myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/jsvalueset/HtmlJsValueSetRenderer.java

Modified: myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/jsvalueset/HtmlJsValueSetRenderer.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/jsvalueset/HtmlJsValueSetRenderer.java?rev=289850&r1=289849&r2=289850&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/jsvalueset/HtmlJsValueSetRenderer.java (original)
+++ myfaces/tomahawk/trunk/src/java/org/apache/myfaces/custom/jsvalueset/HtmlJsValueSetRenderer.java Sat Sep 17 13:40:47 2005
@@ -19,6 +19,7 @@
 import org.apache.myfaces.renderkit.html.HTML;
 import org.apache.myfaces.renderkit.html.HtmlRenderer;
 
+import org.apache.commons.lang.StringEscapeUtils;
 import javax.faces.application.Application;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
@@ -33,145 +34,139 @@
  * @version $Revision$ $Date$
  */
 public class HtmlJsValueSetRenderer
-        extends HtmlRenderer
+extends HtmlRenderer
 {
-    public void encodeEnd(FacesContext facesContext, UIComponent component)
-            throws IOException
-    {
-        RendererUtils.checkParamValidity(facesContext, component, HtmlJsValueSet.class);
-
-        HtmlJsValueSet htmlJsValueSet = (HtmlJsValueSet) component;
-
-        Object value = htmlJsValueSet.getValue();
-        String name = htmlJsValueSet.getName();
-
-
-        ResponseWriter writer = getFacesContext().getResponseWriter();
-
-        writer.startElement(HTML.SCRIPT_ELEM, component);
-        writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null);
-
-        if(value instanceof String ||
-                value instanceof Number || value instanceof Boolean || value == null)
-        {
-            writer.writeText("var " + name+"="+getValueString(value)+";",null);
-        }
-        else if(value instanceof Object[])
-        {
-            Object[] objs = (Object[]) value;
-
-            startArray(writer, name);
-
-            for (int i = 0; i < objs.length; i++)
-            {
-                Object obj = objs[i];
-                writeArrayElement(writer, name, i, obj);
-            }
-        }
-        else if(value instanceof Collection)
-        {
-            Collection coll = (Collection) value;
-
-            startArray(writer, name);
-
-            int i=0;
-
-            for (Iterator iterator = coll.iterator(); iterator.hasNext();)
-            {
-                Object obj = iterator.next();
-                writeArrayElement(writer, name, i, obj);
-                i++;
-            }
-        }
-        else if(value instanceof Map)
-        {
-            Map map = (Map) value;
-            Iterator it = map.entrySet().iterator();
-
-            startArray(writer,name);
-
-            while (it.hasNext())
-            {
-                Map.Entry entry = (Map.Entry) it.next();
-                writeArrayElement(writer, name, entry.getKey(), entry.getValue());
-            }
-        }
-        else
-            throw new IOException("Type of value not handled. Allowed are String, Number, Boolean, Object[], Collection, Map. Type of value : "+value.getClass());
-
-
-        writer.endElement(HTML.SCRIPT_ELEM);
-    }
-
-    private void writeArrayElement(ResponseWriter writer, String name, Object key, Object obj)
-        throws IOException
-    {
-        String prefix = name+"["+getValueString(key)+"]";
-
-        if(obj instanceof Map)
-        {
-            writer.writeText(prefix + "= new Array();",null);
-
-            Iterator it = ((Map) obj).entrySet().iterator();
-
-            while (it.hasNext())
-            {
-                Map.Entry entry = (Map.Entry) it.next();
-
-                writeArrayElement(writer,prefix,entry.getKey(),entry.getValue());
-            }
-        }
-        else
-        {
-            writer.writeText(prefix + "="+getValueString(obj)+";",null);
-        }
-    }
-
-    private void writeArrayElement(ResponseWriter writer, String name, int i, Object obj)
-            throws IOException
-    {
-        writer.writeText(name+"["+i+"]="+getValueString(obj)+";",null);
-    }
-
-    private void startArray(ResponseWriter writer, String name)
-            throws IOException
-    {
-        writer.writeText("var " + name+"=new Array();",null);
-    }
-
-    private String getValueString(Object value) throws IOException
-    {
-        if(value instanceof String)
-        {
-            return "'"+value+"'";
-        }
-        else if(value instanceof Number)
-        {
-            return value.toString();
-        }
-        else if(value instanceof Boolean)
-        {
-            return value.toString();
-        }
-        else if(value == null)
-        {
-            return "null";
-        }
-        else
-        {
-            throw new IOException("value : "+value+" is of type : "+value.getClass()+
-                    ", provide a method to convert this.");
-        }
-    }
-
-    protected Application getApplication()
-    {
-        return getFacesContext().getApplication();
-    }
-
-    protected FacesContext getFacesContext()
-    {
-        return FacesContext.getCurrentInstance();
-    }
-
+   private void writeValue(String varName, StringBuffer valueSb, StringBuffer prependSb, Object value) throws IOException 
+   {
+      if(value instanceof String || value instanceof Number || value instanceof Boolean || value == null) 
+      {
+         valueSb.append(getValueString(value));
+      }
+      else if(value instanceof Object[])
+      {
+         Object[] objs = (Object[]) value;
+         
+         valueSb.append("new Array(");
+         
+         String comma = "";
+         for (int i = 0; i < objs.length; i++) 
+         {
+            valueSb.append(comma);
+            writeValue(varName + "_h" + i, valueSb, prependSb, objs[i]);
+            comma = ",";
+         }
+         
+         valueSb.append(")");
+      }
+      else if(value instanceof Collection)
+      {
+         Collection coll = (Collection) value;
+         
+         valueSb.append("new Array(");
+         
+         String comma = "";
+         int i = 0;
+         for (Iterator iterator = coll.iterator(); iterator.hasNext();) 
+         {
+            valueSb.append(comma);
+            writeValue(varName + "_h" + i, valueSb, prependSb, iterator.next());
+            comma = ",";
+            i++;
+         }
+         
+         valueSb.append(")");
+      }
+      else if(value instanceof Map)
+      {
+         Map map = (Map) value;
+         
+         varName = varName + "_hm";
+          prependSb.append("var ").append(varName).append("=new Object();\n");
+         
+         Iterator it = map.entrySet().iterator();
+         int i = 0;
+         while (it.hasNext()) 
+         {
+            Map.Entry entry = (Map.Entry) it.next();
+            StringBuffer helpValueSb = new StringBuffer();
+            StringBuffer helpHelpSb = new StringBuffer();
+            writeValue(varName + "_h" + i, helpValueSb, helpHelpSb, entry.getValue());
+            
+            prependSb.append(helpHelpSb);
+             prependSb.append(varName).append("[").append(getValueString(entry.getKey())).append("]=");
+             prependSb.append(helpValueSb).append(";\n");
+            
+            i++;
+         }
+         
+         valueSb.append(varName);
+      }
+      else
+         throw new IOException("Type of value not handled. Allowed are String, Number, Boolean, Object[], Collection, Map. Type of value : "+value.getClass());
+      
+   }
+   
+   public void encodeEnd(FacesContext facesContext, UIComponent component)
+   throws IOException
+   {
+      RendererUtils.checkParamValidity(facesContext, component, HtmlJsValueSet.class);
+      
+      HtmlJsValueSet jsValue = (HtmlJsValueSet) component;
+      
+      Object value = jsValue.getValue();
+      String varName = jsValue.getName();
+      
+      
+      ResponseWriter writer = getFacesContext().getResponseWriter();
+      
+      writer.startElement(HTML.SCRIPT_ELEM, null);
+      writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
+      
+      StringBuffer valueSb = new StringBuffer("var " + varName + "=");
+      StringBuffer prependSb = new StringBuffer("");
+      
+      writeValue(varName, valueSb, prependSb, value);
+      
+      writer.write(prependSb.toString());
+      writer.write(valueSb.toString() + ";\n");
+      
+      writer.endElement(HTML.SCRIPT_ELEM);
+   }
+   
+   
+   private String getValueString(Object value) throws IOException
+   {
+      if(value instanceof String)
+      {
+         return "'"+StringEscapeUtils.escapeJavaScript(value.toString())+"'";
+      }
+      else if(value instanceof Number)
+      {
+         return value.toString();
+      }
+      else if(value instanceof Boolean)
+      {
+         return value.toString();
+      }
+      else if(value == null)
+      {
+         return "null";
+      }
+      else
+      {
+         throw new IOException("value : "+value+" is of type : "+value.getClass()+
+         ", provide a method to convert this.");
+      }
+   }
+   
+   protected Application getApplication()
+   {
+      return getFacesContext().getApplication();
+   }
+   
+   protected FacesContext getFacesContext()
+   {
+      return FacesContext.getCurrentInstance();
+   }
+   
 }