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();
+ }
+
}