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 2006/09/11 10:31:54 UTC
svn commit: r442124 - in
/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html:
HtmlLinkRendererBase.java HtmlRendererUtils.java util/JavascriptUtils.java
Author: mmarinschek
Date: Mon Sep 11 01:31:53 2006
New Revision: 442124
URL: http://svn.apache.org/viewvc?view=rev&rev=442124
Log:
more revamping of MyFaces JavaScript - submitForm method is now independent of form
Modified:
myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java?view=diff&rev=442124&r1=442123&r2=442124
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java Mon Sep 11 01:31:53 2006
@@ -35,6 +35,7 @@
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
+import java.util.Map;
/**
* @author Manfred Geiler
@@ -44,6 +45,7 @@
extends HtmlRenderer {
public static final String URL_STATE_MARKER = "JSF_URL_STATE_MARKER=DUMMY";
public static final int URL_STATE_MARKER_LEN = URL_STATE_MARKER.length();
+ private static final String FIRST_LINK_ON_PAGE = "org.apache.MyFaces.FIRST_LINK_ON_PAGE";
//private static final Log log = LogFactory.getLog(HtmlLinkRenderer.class);
@@ -214,17 +216,24 @@
}
else
{
- renderFormSubmitScriptIfNecessary(facesContext, formInfo);
+ renderFormSubmitScriptIfNecessary(facesContext);
StringBuffer params = addChildParameters(component, nestingForm);
String target = getTarget(component);
- onClick.append("return myFaces_submitForm_").append(JavascriptUtils.getValidJavascriptName(formName,false)).append("('").
- append(clientId).append("',").
+ onClick.append("return ").
+ append(HtmlRendererUtils.SUBMIT_FORM_FN_NAME).append("('").
+ append(formName).append("','").
+ append(clientId).append("'");
+
+ if(params.length()>2 || target != null)
+ {
+ onClick.append(",").
append(params).append(",").
- append(target == null ? "null" : ("'" + target + "'")).
- append(");");
+ append(target == null ? "null" : ("'" + target + "'"));
+ }
+ onClick.append(");");
//add id parameter for decode to form - todo: better do that dynamically instead of referring to the form
String hiddenFieldName = HtmlRendererUtils.getHiddenCommandLinkFieldName(formInfo);
@@ -236,19 +245,18 @@
writer.writeAttribute(HTML.ONCLICK_ATTR, onClick.toString(), null);
}
- private static void renderFormSubmitScriptIfNecessary(FacesContext facesContext, FormInfo formInfo)
+ private static void renderFormSubmitScriptIfNecessary(FacesContext facesContext)
throws IOException {
- if (facesContext.getExternalContext().getRequestMap().get(getFormSubmitScriptName(formInfo)) == null)
+ Map map = facesContext.getExternalContext().getRequestMap();
+ Boolean firstLink = (Boolean) map.get(FIRST_LINK_ON_PAGE);
+
+ if(firstLink == null || firstLink.equals(Boolean.TRUE))
{
- HtmlRendererUtils.renderFormSubmitScript(facesContext, formInfo);
- facesContext.getExternalContext().getRequestMap().put(getFormSubmitScriptName(formInfo), Boolean.TRUE);
- }
- }
+ map.put(FIRST_LINK_ON_PAGE,Boolean.FALSE);
+ HtmlRendererUtils.renderFormSubmitScript(facesContext);
- private static String getFormSubmitScriptName(FormInfo formInfo)
- {
- return "FORM_SUBMIT_SCRIPT_FOR_"+formInfo.getFormName();
+ }
}
private String getTarget(UIComponent component)
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java?view=diff&rev=442124&r1=442123&r2=442124
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java Mon Sep 11 01:31:53 2006
@@ -53,6 +53,8 @@
public static final String CLEAR_HIDDEN_FIELD_FN_NAME =
"clearFormHiddenParams";
+ private static final String SET_HIDDEN_INPUT_FN_NAME = "oamSetHiddenInput";
+ public static final String SUBMIT_FORM_FN_NAME = "oamSubmitForm";
private HtmlRendererUtils() {
// utility class, do not instantiate
@@ -802,17 +804,32 @@
public static void appendClearHiddenCommandFormParamsFunctionCall(ScriptContext context, String formName) {
- context.prettyLine();
- context.append("if(window.");
- context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
- context.append("!=undefined)");
- context.append("{");
- context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName)).append("('").append(formName).append("');");
- context.append("}");
+ if(formName == null)
+ {
+ context.prettyLine();
+ context.append("var clearFn = ");
+ context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
+ context.append(";");
+ context.prettyLine();
+ context.append("if(eval('window.'+clearFn)!=undefined)");
+ context.append("{");
+ context.append("eval('window.'+clearFn+'(formName)');");
+ context.append("}");
+ }
+ else
+ {
+ context.prettyLine();
+ context.append("if(window.");
+ context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
+ context.append("!=undefined)");
+ context.append("{");
+ context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName)).append("('").append(formName).append("');");
+ context.append("}");
+ }
}
- public static void renderFormSubmitScript(FacesContext facesContext, FormInfo formInfo)
+ public static void renderFormSubmitScript(FacesContext facesContext)
throws IOException
{
ResponseWriter writer = facesContext.getResponseWriter();
@@ -827,77 +844,92 @@
context.prettyLine();
context.increaseIndent();
- prepareScript(context, formInfo, autoScroll);
+ prepareScript(context, autoScroll);
writer.writeText(context.toString(),null);
writer.endElement(HTML.SCRIPT_ELEM);
}
- private static void prepareScript(ScriptContext context, FormInfo formInfo, boolean autoScroll)
+ private static void prepareScript(ScriptContext context, boolean autoScroll)
{
- String formName = formInfo.getFormName();
- context.append("function myFaces_submitForm_").append(
- JavascriptUtils.getValidJavascriptName(formName,false)).append("(linkId, target, params)");
+ context.prettyLine();
+
+ context.append("function ");
+ context.append(SET_HIDDEN_INPUT_FN_NAME).append("(formname, name, value)");
+ context.append("{");
+ context.append("var form = document.forms[formname];");
+ context.prettyLine();
+ context.append("if(form.elements[name]==undefined)");
+ context.append("{");
+ context.append("var newInput = document.createElement['input'];");
+ context.prettyLine();
+ context.append("newInput.setAttribute('type','hidden');");
+ context.prettyLine();
+ context.append("newInput.setAttribute('name',name);");
+ context.prettyLine();
+ context.append("newInput.setAttribute('value',value);");
+ context.prettyLine();
+ context.append("form.appendChild(newInput);");
+ context.append("}");
+ context.append("else");
+ context.append("{");
+ context.append("form.elements[name].value=value;");
+ context.append("}");
+
+ context.append("}");
+
+ context.prettyLine();
+
+ context.append("function ");
+ context.append(SUBMIT_FORM_FN_NAME).append("(formName, linkId, target, params)");
context.append("{");
//call the script to clear the form (clearFormHiddenParams_<formName>) method
- HtmlRendererUtils.appendClearHiddenCommandFormParamsFunctionCall(context, formName);
+ HtmlRendererUtils.appendClearHiddenCommandFormParamsFunctionCall(context, null);
if (autoScroll)
{
- JavascriptUtils.appendAutoScrollAssignment(context, formName);
+ JavascriptUtils.appendAutoScrollAssignment(context, null);
}
context.prettyLine();
context.append("if(target!=undefined && target != null)");
context.append("{");
- context.append("document.forms['"+formName+"'].target=target;");
+ context.append("document.forms[formName].target=target;");
context.append("}");
context.append("if(params!=undefined && params != null)");
context.append("{");
context.append("for(var i=0; i<params.length; i++)");
context.append("{");
- context.append("if(document.forms['").append(formName).append("'].elements[params[i][0]]==undefined)");
- context.append("{");
- context.append("var form = document.forms['"+formName+"'];");
- context.prettyLine();
- context.append("var newInput = document.createElement['input'];");
- context.prettyLine();
- context.append("newInput.setAttribute('type','hidden');");
- context.prettyLine();
- context.append("newInput.setAttribute('name',params[i][0]);");
- context.prettyLine();
- context.append("newInput.setAttribute('value',params[i][1]);");
- context.prettyLine();
- context.append("form.appendChild(newInput);");
- context.append("}");
+ context.append(SET_HIDDEN_INPUT_FN_NAME).append("(formName,params[i][0], params[i][1]);");
context.append("}");
context.append("}");
context.prettyLine();
- context.append("document.forms['"+formName+"'].elements['"+
- HtmlRendererUtils.getHiddenCommandLinkFieldName(formInfo)+"'].value=linkId;");
+ context.append(SET_HIDDEN_INPUT_FN_NAME);
+ context.append("(formName,formName +'"+NamingContainer.SEPARATOR_CHAR+
+ "'+'"+HtmlRendererUtils.HIDDEN_COMMANDLINK_FIELD_NAME+"',linkId);");
context.prettyLine();
context.prettyLine();
- context.append("if(document.forms['"+formName+"'].onsubmit)");
+ context.append("if(document.forms[formName].onsubmit)");
context.append("{");
- context.append("var result=document.forms['"+formName+"'].onsubmit();");
+ context.append("var result=document.forms[formName].onsubmit();");
context.prettyLine();
context.append("if( (typeof result == 'undefined') || result )");
context.append("{");
- context.append("document.forms['"+formName+"'].submit();");
+ context.append("document.forms[formName].submit();");
context.append("}");
context.append("}");
context.append("else ");
context.append("{");
- context.append("document.forms['"+formName+"'].submit();");
+ context.append("document.forms[formName].submit();");
context.append("}");
//return false, so that browser does not handle the click
context.append("return false;");
@@ -1075,10 +1107,18 @@
*/
public static String getClearHiddenCommandFormParamsFunctionName(
String formName) {
- return JavascriptUtils.getValidJavascriptNameAsInRI(CLEAR_HIDDEN_FIELD_FN_NAME
- + "_"
- + formName
- .replace(NamingContainer.SEPARATOR_CHAR, '_'));
+ if(formName == null)
+ {
+ return "'" +CLEAR_HIDDEN_FIELD_FN_NAME
+ + "_'+formName.replace('"+NamingContainer.SEPARATOR_CHAR+"','_')";
+ }
+ else
+ {
+ return JavascriptUtils.getValidJavascriptNameAsInRI(CLEAR_HIDDEN_FIELD_FN_NAME
+ + "_"
+ + formName
+ .replace(NamingContainer.SEPARATOR_CHAR, '_'));
+ }
}
/**
Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java?view=diff&rev=442124&r1=442123&r2=442124
==============================================================================
--- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java (original)
+++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java Mon Sep 11 01:31:53 2006
@@ -285,13 +285,26 @@
public static void appendAutoScrollAssignment(HtmlRendererUtils.ScriptContext scriptContext, String formName)
{
- scriptContext.prettyLine();
- scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
- scriptContext.append("{");
- scriptContext.append("document.forms['").append(formName).append("']");
- scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
- scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
- scriptContext.append("}");
+ if(formName == null)
+ {
+ scriptContext.prettyLine();
+ scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
+ scriptContext.append("{");
+ scriptContext.append("document.forms[formName]");
+ scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
+ scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
+ scriptContext.append("}");
+ }
+ else
+ {
+ scriptContext.prettyLine();
+ scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
+ scriptContext.append("{");
+ scriptContext.append("document.forms['").append(formName).append("']");
+ scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
+ scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
+ scriptContext.append("}");
+ }
}
/**
Re: svn commit: r442124 - in /myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html: HtmlLinkRendererBase.java HtmlRendererUtils.java util/JavascriptUtils.java
Posted by Martin Marinschek <ma...@gmail.com>.
Hi Wendy,
this would be:
http://issues.apache.org/jira/browse/MYFACES-1032
I've just added it.
regards,
Martin
On 9/11/06, Wendy Smoak <ws...@gmail.com> wrote:
> On 9/11/06, Martin Marinschek <ma...@gmail.com> wrote:
>
> > > URL: http://svn.apache.org/viewvc?view=rev&rev=442124
> > > Log:
> > > more revamping of MyFaces JavaScript - submitForm method is now independent of form
>
> > yes, I know - I did that for all my commits yesterday night, and this
> > last one just did some cleanup for the ones before. I should have
> > mentioned the jira-issue I created for the ones before in the commit
> > message for this one as well, though.
>
> Thanks. :) Which issue did this belong to, then? We can just add a
> comment with the revision log URL.
>
> --
> Wendy
>
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
Re: svn commit: r442124 - in /myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html: HtmlLinkRendererBase.java HtmlRendererUtils.java util/JavascriptUtils.java
Posted by Wendy Smoak <ws...@gmail.com>.
On 9/11/06, Martin Marinschek <ma...@gmail.com> wrote:
> > URL: http://svn.apache.org/viewvc?view=rev&rev=442124
> > Log:
> > more revamping of MyFaces JavaScript - submitForm method is now independent of form
> yes, I know - I did that for all my commits yesterday night, and this
> last one just did some cleanup for the ones before. I should have
> mentioned the jira-issue I created for the ones before in the commit
> message for this one as well, though.
Thanks. :) Which issue did this belong to, then? We can just add a
comment with the revision log URL.
--
Wendy
Re: svn commit: r442124 - in /myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html: HtmlLinkRendererBase.java HtmlRendererUtils.java util/JavascriptUtils.java
Posted by Martin Marinschek <ma...@gmail.com>.
Hi Mike,
yes, I know - I did that for all my commits yesterday night, and this
last one just did some cleanup for the ones before. I should have
mentioned the jira-issue I created for the ones before in the commit
message for this one as well, though.
regards,
Martin
On 9/11/06, Mike Kienenberger <mk...@gmail.com> wrote:
> Hey Martin,
>
> We all kinda unofficially agreed while you were on vacation that we
> need open JIRA issues for any non-trivial changes to core or tomahawk
> :-) Thus, we can create changelogs and release notes.
>
>
>
> On 9/11/06, mmarinschek@apache.org <mm...@apache.org> wrote:
> > Author: mmarinschek
> > Date: Mon Sep 11 01:31:53 2006
> > New Revision: 442124
> >
> > URL: http://svn.apache.org/viewvc?view=rev&rev=442124
> > Log:
> > more revamping of MyFaces JavaScript - submitForm method is now independent of form
> >
> > Modified:
> > myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
> > myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
> > myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java
> >
> > Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
> > URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java?view=diff&rev=442124&r1=442123&r2=442124
> > ==============================================================================
> > --- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java (original)
> > +++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java Mon Sep 11 01:31:53 2006
> > @@ -35,6 +35,7 @@
> > import java.io.UnsupportedEncodingException;
> > import java.net.URLEncoder;
> > import java.util.Iterator;
> > +import java.util.Map;
> >
> > /**
> > * @author Manfred Geiler
> > @@ -44,6 +45,7 @@
> > extends HtmlRenderer {
> > public static final String URL_STATE_MARKER = "JSF_URL_STATE_MARKER=DUMMY";
> > public static final int URL_STATE_MARKER_LEN = URL_STATE_MARKER.length();
> > + private static final String FIRST_LINK_ON_PAGE = "org.apache.MyFaces.FIRST_LINK_ON_PAGE";
> >
> > //private static final Log log = LogFactory.getLog(HtmlLinkRenderer.class);
> >
> > @@ -214,17 +216,24 @@
> > }
> > else
> > {
> > - renderFormSubmitScriptIfNecessary(facesContext, formInfo);
> > + renderFormSubmitScriptIfNecessary(facesContext);
> >
> > StringBuffer params = addChildParameters(component, nestingForm);
> >
> > String target = getTarget(component);
> >
> > - onClick.append("return myFaces_submitForm_").append(JavascriptUtils.getValidJavascriptName(formName,false)).append("('").
> > - append(clientId).append("',").
> > + onClick.append("return ").
> > + append(HtmlRendererUtils.SUBMIT_FORM_FN_NAME).append("('").
> > + append(formName).append("','").
> > + append(clientId).append("'");
> > +
> > + if(params.length()>2 || target != null)
> > + {
> > + onClick.append(",").
> > append(params).append(",").
> > - append(target == null ? "null" : ("'" + target + "'")).
> > - append(");");
> > + append(target == null ? "null" : ("'" + target + "'"));
> > + }
> > + onClick.append(");");
> >
> > //add id parameter for decode to form - todo: better do that dynamically instead of referring to the form
> > String hiddenFieldName = HtmlRendererUtils.getHiddenCommandLinkFieldName(formInfo);
> > @@ -236,19 +245,18 @@
> > writer.writeAttribute(HTML.ONCLICK_ATTR, onClick.toString(), null);
> > }
> >
> > - private static void renderFormSubmitScriptIfNecessary(FacesContext facesContext, FormInfo formInfo)
> > + private static void renderFormSubmitScriptIfNecessary(FacesContext facesContext)
> > throws IOException {
> >
> > - if (facesContext.getExternalContext().getRequestMap().get(getFormSubmitScriptName(formInfo)) == null)
> > + Map map = facesContext.getExternalContext().getRequestMap();
> > + Boolean firstLink = (Boolean) map.get(FIRST_LINK_ON_PAGE);
> > +
> > + if(firstLink == null || firstLink.equals(Boolean.TRUE))
> > {
> > - HtmlRendererUtils.renderFormSubmitScript(facesContext, formInfo);
> > - facesContext.getExternalContext().getRequestMap().put(getFormSubmitScriptName(formInfo), Boolean.TRUE);
> > - }
> > - }
> > + map.put(FIRST_LINK_ON_PAGE,Boolean.FALSE);
> > + HtmlRendererUtils.renderFormSubmitScript(facesContext);
> >
> > - private static String getFormSubmitScriptName(FormInfo formInfo)
> > - {
> > - return "FORM_SUBMIT_SCRIPT_FOR_"+formInfo.getFormName();
> > + }
> > }
> >
> > private String getTarget(UIComponent component)
> >
> > Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
> > URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java?view=diff&rev=442124&r1=442123&r2=442124
> > ==============================================================================
> > --- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java (original)
> > +++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java Mon Sep 11 01:31:53 2006
> > @@ -53,6 +53,8 @@
> >
> > public static final String CLEAR_HIDDEN_FIELD_FN_NAME =
> > "clearFormHiddenParams";
> > + private static final String SET_HIDDEN_INPUT_FN_NAME = "oamSetHiddenInput";
> > + public static final String SUBMIT_FORM_FN_NAME = "oamSubmitForm";
> >
> > private HtmlRendererUtils() {
> > // utility class, do not instantiate
> > @@ -802,17 +804,32 @@
> >
> > public static void appendClearHiddenCommandFormParamsFunctionCall(ScriptContext context, String formName) {
> >
> > - context.prettyLine();
> > - context.append("if(window.");
> > - context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
> > - context.append("!=undefined)");
> > - context.append("{");
> > - context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName)).append("('").append(formName).append("');");
> > - context.append("}");
> > + if(formName == null)
> > + {
> > + context.prettyLine();
> > + context.append("var clearFn = ");
> > + context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
> > + context.append(";");
> > + context.prettyLine();
> > + context.append("if(eval('window.'+clearFn)!=undefined)");
> > + context.append("{");
> > + context.append("eval('window.'+clearFn+'(formName)');");
> > + context.append("}");
> > + }
> > + else
> > + {
> > + context.prettyLine();
> > + context.append("if(window.");
> > + context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
> > + context.append("!=undefined)");
> > + context.append("{");
> > + context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName)).append("('").append(formName).append("');");
> > + context.append("}");
> > + }
> > }
> >
> >
> > - public static void renderFormSubmitScript(FacesContext facesContext, FormInfo formInfo)
> > + public static void renderFormSubmitScript(FacesContext facesContext)
> > throws IOException
> > {
> > ResponseWriter writer = facesContext.getResponseWriter();
> > @@ -827,77 +844,92 @@
> > context.prettyLine();
> > context.increaseIndent();
> >
> > - prepareScript(context, formInfo, autoScroll);
> > + prepareScript(context, autoScroll);
> >
> > writer.writeText(context.toString(),null);
> >
> > writer.endElement(HTML.SCRIPT_ELEM);
> > }
> >
> > - private static void prepareScript(ScriptContext context, FormInfo formInfo, boolean autoScroll)
> > + private static void prepareScript(ScriptContext context, boolean autoScroll)
> > {
> > - String formName = formInfo.getFormName();
> >
> > - context.append("function myFaces_submitForm_").append(
> > - JavascriptUtils.getValidJavascriptName(formName,false)).append("(linkId, target, params)");
> > + context.prettyLine();
> > +
> > + context.append("function ");
> > + context.append(SET_HIDDEN_INPUT_FN_NAME).append("(formname, name, value)");
> > + context.append("{");
> > + context.append("var form = document.forms[formname];");
> > + context.prettyLine();
> > + context.append("if(form.elements[name]==undefined)");
> > + context.append("{");
> > + context.append("var newInput = document.createElement['input'];");
> > + context.prettyLine();
> > + context.append("newInput.setAttribute('type','hidden');");
> > + context.prettyLine();
> > + context.append("newInput.setAttribute('name',name);");
> > + context.prettyLine();
> > + context.append("newInput.setAttribute('value',value);");
> > + context.prettyLine();
> > + context.append("form.appendChild(newInput);");
> > + context.append("}");
> > + context.append("else");
> > + context.append("{");
> > + context.append("form.elements[name].value=value;");
> > + context.append("}");
> > +
> > + context.append("}");
> > +
> > + context.prettyLine();
> > +
> > + context.append("function ");
> > + context.append(SUBMIT_FORM_FN_NAME).append("(formName, linkId, target, params)");
> > context.append("{");
> >
> > //call the script to clear the form (clearFormHiddenParams_<formName>) method
> > - HtmlRendererUtils.appendClearHiddenCommandFormParamsFunctionCall(context, formName);
> > + HtmlRendererUtils.appendClearHiddenCommandFormParamsFunctionCall(context, null);
> >
> > if (autoScroll)
> > {
> > - JavascriptUtils.appendAutoScrollAssignment(context, formName);
> > + JavascriptUtils.appendAutoScrollAssignment(context, null);
> > }
> >
> > context.prettyLine();
> >
> > context.append("if(target!=undefined && target != null)");
> > context.append("{");
> > - context.append("document.forms['"+formName+"'].target=target;");
> > + context.append("document.forms[formName].target=target;");
> > context.append("}");
> >
> > context.append("if(params!=undefined && params != null)");
> > context.append("{");
> > context.append("for(var i=0; i<params.length; i++)");
> > context.append("{");
> > - context.append("if(document.forms['").append(formName).append("'].elements[params[i][0]]==undefined)");
> > - context.append("{");
> > - context.append("var form = document.forms['"+formName+"'];");
> > - context.prettyLine();
> > - context.append("var newInput = document.createElement['input'];");
> > - context.prettyLine();
> > - context.append("newInput.setAttribute('type','hidden');");
> > - context.prettyLine();
> > - context.append("newInput.setAttribute('name',params[i][0]);");
> > - context.prettyLine();
> > - context.append("newInput.setAttribute('value',params[i][1]);");
> > - context.prettyLine();
> > - context.append("form.appendChild(newInput);");
> > - context.append("}");
> > + context.append(SET_HIDDEN_INPUT_FN_NAME).append("(formName,params[i][0], params[i][1]);");
> > context.append("}");
> > context.append("}");
> >
> > context.prettyLine();
> >
> > - context.append("document.forms['"+formName+"'].elements['"+
> > - HtmlRendererUtils.getHiddenCommandLinkFieldName(formInfo)+"'].value=linkId;");
> > + context.append(SET_HIDDEN_INPUT_FN_NAME);
> > + context.append("(formName,formName +'"+NamingContainer.SEPARATOR_CHAR+
> > + "'+'"+HtmlRendererUtils.HIDDEN_COMMANDLINK_FIELD_NAME+"',linkId);");
> >
> > context.prettyLine();
> > context.prettyLine();
> >
> > - context.append("if(document.forms['"+formName+"'].onsubmit)");
> > + context.append("if(document.forms[formName].onsubmit)");
> > context.append("{");
> > - context.append("var result=document.forms['"+formName+"'].onsubmit();");
> > + context.append("var result=document.forms[formName].onsubmit();");
> > context.prettyLine();
> > context.append("if( (typeof result == 'undefined') || result )");
> > context.append("{");
> > - context.append("document.forms['"+formName+"'].submit();");
> > + context.append("document.forms[formName].submit();");
> > context.append("}");
> > context.append("}");
> > context.append("else ");
> > context.append("{");
> > - context.append("document.forms['"+formName+"'].submit();");
> > + context.append("document.forms[formName].submit();");
> > context.append("}");
> > //return false, so that browser does not handle the click
> > context.append("return false;");
> > @@ -1075,10 +1107,18 @@
> > */
> > public static String getClearHiddenCommandFormParamsFunctionName(
> > String formName) {
> > - return JavascriptUtils.getValidJavascriptNameAsInRI(CLEAR_HIDDEN_FIELD_FN_NAME
> > - + "_"
> > - + formName
> > - .replace(NamingContainer.SEPARATOR_CHAR, '_'));
> > + if(formName == null)
> > + {
> > + return "'" +CLEAR_HIDDEN_FIELD_FN_NAME
> > + + "_'+formName.replace('"+NamingContainer.SEPARATOR_CHAR+"','_')";
> > + }
> > + else
> > + {
> > + return JavascriptUtils.getValidJavascriptNameAsInRI(CLEAR_HIDDEN_FIELD_FN_NAME
> > + + "_"
> > + + formName
> > + .replace(NamingContainer.SEPARATOR_CHAR, '_'));
> > + }
> > }
> >
> > /**
> >
> > Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java
> > URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java?view=diff&rev=442124&r1=442123&r2=442124
> > ==============================================================================
> > --- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java (original)
> > +++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java Mon Sep 11 01:31:53 2006
> > @@ -285,13 +285,26 @@
> >
> > public static void appendAutoScrollAssignment(HtmlRendererUtils.ScriptContext scriptContext, String formName)
> > {
> > - scriptContext.prettyLine();
> > - scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
> > - scriptContext.append("{");
> > - scriptContext.append("document.forms['").append(formName).append("']");
> > - scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
> > - scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
> > - scriptContext.append("}");
> > + if(formName == null)
> > + {
> > + scriptContext.prettyLine();
> > + scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
> > + scriptContext.append("{");
> > + scriptContext.append("document.forms[formName]");
> > + scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
> > + scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
> > + scriptContext.append("}");
> > + }
> > + else
> > + {
> > + scriptContext.prettyLine();
> > + scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
> > + scriptContext.append("{");
> > + scriptContext.append("document.forms['").append(formName).append("']");
> > + scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
> > + scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
> > + scriptContext.append("}");
> > + }
> > }
> >
> > /**
> >
> >
> >
>
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
Re: svn commit: r442124 - in /myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html: HtmlLinkRendererBase.java HtmlRendererUtils.java util/JavascriptUtils.java
Posted by Mike Kienenberger <mk...@gmail.com>.
Hey Martin,
We all kinda unofficially agreed while you were on vacation that we
need open JIRA issues for any non-trivial changes to core or tomahawk
:-) Thus, we can create changelogs and release notes.
On 9/11/06, mmarinschek@apache.org <mm...@apache.org> wrote:
> Author: mmarinschek
> Date: Mon Sep 11 01:31:53 2006
> New Revision: 442124
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=442124
> Log:
> more revamping of MyFaces JavaScript - submitForm method is now independent of form
>
> Modified:
> myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
> myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
> myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java
>
> Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java
> URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java?view=diff&rev=442124&r1=442123&r2=442124
> ==============================================================================
> --- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java (original)
> +++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlLinkRendererBase.java Mon Sep 11 01:31:53 2006
> @@ -35,6 +35,7 @@
> import java.io.UnsupportedEncodingException;
> import java.net.URLEncoder;
> import java.util.Iterator;
> +import java.util.Map;
>
> /**
> * @author Manfred Geiler
> @@ -44,6 +45,7 @@
> extends HtmlRenderer {
> public static final String URL_STATE_MARKER = "JSF_URL_STATE_MARKER=DUMMY";
> public static final int URL_STATE_MARKER_LEN = URL_STATE_MARKER.length();
> + private static final String FIRST_LINK_ON_PAGE = "org.apache.MyFaces.FIRST_LINK_ON_PAGE";
>
> //private static final Log log = LogFactory.getLog(HtmlLinkRenderer.class);
>
> @@ -214,17 +216,24 @@
> }
> else
> {
> - renderFormSubmitScriptIfNecessary(facesContext, formInfo);
> + renderFormSubmitScriptIfNecessary(facesContext);
>
> StringBuffer params = addChildParameters(component, nestingForm);
>
> String target = getTarget(component);
>
> - onClick.append("return myFaces_submitForm_").append(JavascriptUtils.getValidJavascriptName(formName,false)).append("('").
> - append(clientId).append("',").
> + onClick.append("return ").
> + append(HtmlRendererUtils.SUBMIT_FORM_FN_NAME).append("('").
> + append(formName).append("','").
> + append(clientId).append("'");
> +
> + if(params.length()>2 || target != null)
> + {
> + onClick.append(",").
> append(params).append(",").
> - append(target == null ? "null" : ("'" + target + "'")).
> - append(");");
> + append(target == null ? "null" : ("'" + target + "'"));
> + }
> + onClick.append(");");
>
> //add id parameter for decode to form - todo: better do that dynamically instead of referring to the form
> String hiddenFieldName = HtmlRendererUtils.getHiddenCommandLinkFieldName(formInfo);
> @@ -236,19 +245,18 @@
> writer.writeAttribute(HTML.ONCLICK_ATTR, onClick.toString(), null);
> }
>
> - private static void renderFormSubmitScriptIfNecessary(FacesContext facesContext, FormInfo formInfo)
> + private static void renderFormSubmitScriptIfNecessary(FacesContext facesContext)
> throws IOException {
>
> - if (facesContext.getExternalContext().getRequestMap().get(getFormSubmitScriptName(formInfo)) == null)
> + Map map = facesContext.getExternalContext().getRequestMap();
> + Boolean firstLink = (Boolean) map.get(FIRST_LINK_ON_PAGE);
> +
> + if(firstLink == null || firstLink.equals(Boolean.TRUE))
> {
> - HtmlRendererUtils.renderFormSubmitScript(facesContext, formInfo);
> - facesContext.getExternalContext().getRequestMap().put(getFormSubmitScriptName(formInfo), Boolean.TRUE);
> - }
> - }
> + map.put(FIRST_LINK_ON_PAGE,Boolean.FALSE);
> + HtmlRendererUtils.renderFormSubmitScript(facesContext);
>
> - private static String getFormSubmitScriptName(FormInfo formInfo)
> - {
> - return "FORM_SUBMIT_SCRIPT_FOR_"+formInfo.getFormName();
> + }
> }
>
> private String getTarget(UIComponent component)
>
> Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
> URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java?view=diff&rev=442124&r1=442123&r2=442124
> ==============================================================================
> --- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java (original)
> +++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java Mon Sep 11 01:31:53 2006
> @@ -53,6 +53,8 @@
>
> public static final String CLEAR_HIDDEN_FIELD_FN_NAME =
> "clearFormHiddenParams";
> + private static final String SET_HIDDEN_INPUT_FN_NAME = "oamSetHiddenInput";
> + public static final String SUBMIT_FORM_FN_NAME = "oamSubmitForm";
>
> private HtmlRendererUtils() {
> // utility class, do not instantiate
> @@ -802,17 +804,32 @@
>
> public static void appendClearHiddenCommandFormParamsFunctionCall(ScriptContext context, String formName) {
>
> - context.prettyLine();
> - context.append("if(window.");
> - context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
> - context.append("!=undefined)");
> - context.append("{");
> - context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName)).append("('").append(formName).append("');");
> - context.append("}");
> + if(formName == null)
> + {
> + context.prettyLine();
> + context.append("var clearFn = ");
> + context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
> + context.append(";");
> + context.prettyLine();
> + context.append("if(eval('window.'+clearFn)!=undefined)");
> + context.append("{");
> + context.append("eval('window.'+clearFn+'(formName)');");
> + context.append("}");
> + }
> + else
> + {
> + context.prettyLine();
> + context.append("if(window.");
> + context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName));
> + context.append("!=undefined)");
> + context.append("{");
> + context.append(HtmlRendererUtils.getClearHiddenCommandFormParamsFunctionName(formName)).append("('").append(formName).append("');");
> + context.append("}");
> + }
> }
>
>
> - public static void renderFormSubmitScript(FacesContext facesContext, FormInfo formInfo)
> + public static void renderFormSubmitScript(FacesContext facesContext)
> throws IOException
> {
> ResponseWriter writer = facesContext.getResponseWriter();
> @@ -827,77 +844,92 @@
> context.prettyLine();
> context.increaseIndent();
>
> - prepareScript(context, formInfo, autoScroll);
> + prepareScript(context, autoScroll);
>
> writer.writeText(context.toString(),null);
>
> writer.endElement(HTML.SCRIPT_ELEM);
> }
>
> - private static void prepareScript(ScriptContext context, FormInfo formInfo, boolean autoScroll)
> + private static void prepareScript(ScriptContext context, boolean autoScroll)
> {
> - String formName = formInfo.getFormName();
>
> - context.append("function myFaces_submitForm_").append(
> - JavascriptUtils.getValidJavascriptName(formName,false)).append("(linkId, target, params)");
> + context.prettyLine();
> +
> + context.append("function ");
> + context.append(SET_HIDDEN_INPUT_FN_NAME).append("(formname, name, value)");
> + context.append("{");
> + context.append("var form = document.forms[formname];");
> + context.prettyLine();
> + context.append("if(form.elements[name]==undefined)");
> + context.append("{");
> + context.append("var newInput = document.createElement['input'];");
> + context.prettyLine();
> + context.append("newInput.setAttribute('type','hidden');");
> + context.prettyLine();
> + context.append("newInput.setAttribute('name',name);");
> + context.prettyLine();
> + context.append("newInput.setAttribute('value',value);");
> + context.prettyLine();
> + context.append("form.appendChild(newInput);");
> + context.append("}");
> + context.append("else");
> + context.append("{");
> + context.append("form.elements[name].value=value;");
> + context.append("}");
> +
> + context.append("}");
> +
> + context.prettyLine();
> +
> + context.append("function ");
> + context.append(SUBMIT_FORM_FN_NAME).append("(formName, linkId, target, params)");
> context.append("{");
>
> //call the script to clear the form (clearFormHiddenParams_<formName>) method
> - HtmlRendererUtils.appendClearHiddenCommandFormParamsFunctionCall(context, formName);
> + HtmlRendererUtils.appendClearHiddenCommandFormParamsFunctionCall(context, null);
>
> if (autoScroll)
> {
> - JavascriptUtils.appendAutoScrollAssignment(context, formName);
> + JavascriptUtils.appendAutoScrollAssignment(context, null);
> }
>
> context.prettyLine();
>
> context.append("if(target!=undefined && target != null)");
> context.append("{");
> - context.append("document.forms['"+formName+"'].target=target;");
> + context.append("document.forms[formName].target=target;");
> context.append("}");
>
> context.append("if(params!=undefined && params != null)");
> context.append("{");
> context.append("for(var i=0; i<params.length; i++)");
> context.append("{");
> - context.append("if(document.forms['").append(formName).append("'].elements[params[i][0]]==undefined)");
> - context.append("{");
> - context.append("var form = document.forms['"+formName+"'];");
> - context.prettyLine();
> - context.append("var newInput = document.createElement['input'];");
> - context.prettyLine();
> - context.append("newInput.setAttribute('type','hidden');");
> - context.prettyLine();
> - context.append("newInput.setAttribute('name',params[i][0]);");
> - context.prettyLine();
> - context.append("newInput.setAttribute('value',params[i][1]);");
> - context.prettyLine();
> - context.append("form.appendChild(newInput);");
> - context.append("}");
> + context.append(SET_HIDDEN_INPUT_FN_NAME).append("(formName,params[i][0], params[i][1]);");
> context.append("}");
> context.append("}");
>
> context.prettyLine();
>
> - context.append("document.forms['"+formName+"'].elements['"+
> - HtmlRendererUtils.getHiddenCommandLinkFieldName(formInfo)+"'].value=linkId;");
> + context.append(SET_HIDDEN_INPUT_FN_NAME);
> + context.append("(formName,formName +'"+NamingContainer.SEPARATOR_CHAR+
> + "'+'"+HtmlRendererUtils.HIDDEN_COMMANDLINK_FIELD_NAME+"',linkId);");
>
> context.prettyLine();
> context.prettyLine();
>
> - context.append("if(document.forms['"+formName+"'].onsubmit)");
> + context.append("if(document.forms[formName].onsubmit)");
> context.append("{");
> - context.append("var result=document.forms['"+formName+"'].onsubmit();");
> + context.append("var result=document.forms[formName].onsubmit();");
> context.prettyLine();
> context.append("if( (typeof result == 'undefined') || result )");
> context.append("{");
> - context.append("document.forms['"+formName+"'].submit();");
> + context.append("document.forms[formName].submit();");
> context.append("}");
> context.append("}");
> context.append("else ");
> context.append("{");
> - context.append("document.forms['"+formName+"'].submit();");
> + context.append("document.forms[formName].submit();");
> context.append("}");
> //return false, so that browser does not handle the click
> context.append("return false;");
> @@ -1075,10 +1107,18 @@
> */
> public static String getClearHiddenCommandFormParamsFunctionName(
> String formName) {
> - return JavascriptUtils.getValidJavascriptNameAsInRI(CLEAR_HIDDEN_FIELD_FN_NAME
> - + "_"
> - + formName
> - .replace(NamingContainer.SEPARATOR_CHAR, '_'));
> + if(formName == null)
> + {
> + return "'" +CLEAR_HIDDEN_FIELD_FN_NAME
> + + "_'+formName.replace('"+NamingContainer.SEPARATOR_CHAR+"','_')";
> + }
> + else
> + {
> + return JavascriptUtils.getValidJavascriptNameAsInRI(CLEAR_HIDDEN_FIELD_FN_NAME
> + + "_"
> + + formName
> + .replace(NamingContainer.SEPARATOR_CHAR, '_'));
> + }
> }
>
> /**
>
> Modified: myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java
> URL: http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java?view=diff&rev=442124&r1=442123&r2=442124
> ==============================================================================
> --- myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java (original)
> +++ myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/renderkit/html/util/JavascriptUtils.java Mon Sep 11 01:31:53 2006
> @@ -285,13 +285,26 @@
>
> public static void appendAutoScrollAssignment(HtmlRendererUtils.ScriptContext scriptContext, String formName)
> {
> - scriptContext.prettyLine();
> - scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
> - scriptContext.append("{");
> - scriptContext.append("document.forms['").append(formName).append("']");
> - scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
> - scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
> - scriptContext.append("}");
> + if(formName == null)
> + {
> + scriptContext.prettyLine();
> + scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
> + scriptContext.append("{");
> + scriptContext.append("document.forms[formName]");
> + scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
> + scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
> + scriptContext.append("}");
> + }
> + else
> + {
> + scriptContext.prettyLine();
> + scriptContext.append("if(window."+AUTO_SCROLL_FUNCTION+"!=undefined)");
> + scriptContext.append("{");
> + scriptContext.append("document.forms['").append(formName).append("']");
> + scriptContext.append(".elements['").append(AUTO_SCROLL_PARAM).append("']");
> + scriptContext.append(".value=").append(AUTO_SCROLL_FUNCTION).append("();");
> + scriptContext.append("}");
> + }
> }
>
> /**
>
>
>