Ivelin,

<snip/>
>>Now I had the output I was looking for, but when I tried to
>> submit the form I kept getting errors from jxpath.

>Can you send me the stack traces.

(see below)

>BTW, the most recent version of JXPath should be able to correctly handle
>setValue( Collection or String[] ).
>Dmitri added this after we discussed its potential for request parameters
>with multiple values.

Problem is in convert function of Types.java.  This class seems to be based on
TypesUtil.java from jakarta/commons/jxpath project.  Latest version of that file
is 1.4 (11 days ago).  Only changes to convert function were these (comments are
mine):
            else if (fromType.isArray()){
          /* convert first element of array into toType */
            Object value = Array.get(object, 0);
            return convert(value, toType);
        }
      /* try to convert first element of List object into toType */
        else if (object instanceof List){
            Object value = ((List)object).get(0);
            return convert(value, toType);
        }
      /* try to convert first element of Collection object into toType */
        else if (object instanceof Collection){
            Iterator it = ((Collection)object).iterator();
            Object value = it.next();
            return convert(value, toType);
        }
        return object;
    }

None of this helps fix the problem I encountered.  It arises when the Object's
"from" type is String array (multiple-select parameter from request object).
Control falls through all this code, as well as the code that converts scalar
Strings (parameters from request object) and hits this block:

      /* Try to find a default constructor for the toType that takes the
fromType object as a parameter */
        Object[] params = new Object[] {object};
        if (hasConversionConstructor( toType, params ))
        {
          Constructor constructor = lookupConstructor( toType, params);
          try
          {
            return constructor.newInstance ( params );
          }
          catch (Exception ex)
          {
            throw new RuntimeException("Instantiation failed for Class [" +
toType +"], and constructor with parameter value [" + object + "]" + "\n" + ex);
          }
        }

Since there is no Collections constructor which takes a string array as its only
parameter, the Runtime Exception gets thrown.  The code I hacked in just makes
sure that when object instanceOf == String[] that the object is properly
converted to its "toType" (One of the Java 1.3 Collection Framework classes
implememted from Set, SortedSet, or List, although the first two of these are
probably overkill).


>> 5) Changed the convert function in Types.java to recognize String arrays
coming
>> from the request (it seems to convert only String scalars) and to convert
them
>> to ArrayList type.

>Interesting. There already was code in Form to handle request parameters
>with multiple values.
>Apparantly badly implemented:
>Can you point me to the problem ?

Again, the problem is not in setValue.  It works properly, but when property is
a collection or array it calls convertType function which calls Types.convert
function which throws exception.  From setValue():
<snip/>
    // if the property is a collection, set value as array
    if ( property instanceof Collection || property.getClass ().isArray () )
    {
      Object newValue = convertType( values, property.getClass () ); <--
INDIRECT CALL TO TYPES.CONVERT()
      pointer.setValue( newValue );
    }
</snip>

...

<snip>
>As long as there is a way to extend and override the default rendering of multi
select checkboxes,
>then your implementation should be cool. Is it an isolated template with a name
like ("selectManyCheckbox" or similar).
</snip>

xf:selectMany is (now) implemented as two templates, one matching xf:selectMany
[@selectUIType='checkboxGroup'] and the other matching xf:selectMany |
xf:selectMany[@selectUIType='listbox'].  Should be easy enough to override these
if necessary.

I will send you the three patched files compressed zip.

Cheers,
--Michael


BTW, here's the complete stack trace:

ERROR   (2002-05-07) 00:41.21:244
[sitemap](/cocoon/mount/vtechform/wizard.html)
HttpProcessor[8080][4]/PipelineNode: Error while processing pipeline at
file:/Library/jakarta-tomcat-4.0.1/webapps/cocoon/mount/vtechform/sitemap.xmap:26:17
java.lang.RuntimeException: Cannot modify property: APP_TYPE,
java.lang.RuntimeException: Cannot convert value of class [Ljava.lang.String; to
type class java.util.ArrayList
      at
org.apache.commons.jxpath.ri.pointers.PropertyAccessHelper.setValue(PropertyAccessHelper.java:257)
      at
org.apache.commons.jxpath.ri.pointers.BeanPropertyPointer.setValue(BeanPropertyPointer.java:198)
      at org.apache.cocoon.xmlform.Form.setValue(Form.java:198)
      at org.apache.cocoon.xmlform.Form.populate(Form.java:382)
      at
org.apache.cocoon.acting.AbstractXMLFormAction.act(AbstractXMLFormAction.java:212)
      at
org.apache.cocoon.components.treeprocessor.sitemap.ActTypeNode.invoke(ActTypeNode.java:133)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:83)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:157)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:142)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:318)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:289)
      at
org.apache.cocoon.components.treeprocessor.sitemap.MountNode.invoke(MountNode.java:128)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:83)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:157)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:142)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:318)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:289)
      at org.apache.cocoon.Cocoon.process(Cocoon.java:588)
      at
org.apache.cocoon.servlet.CocoonServlet.service(CocoonServlet.java:1002)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
      at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
      at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
      at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)
      at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)
      at java.lang.Thread.run(Thread.java:496)
ERROR   (2002-05-07) 00:41.21:257
[sitemap](/cocoon/mount/vtechform/wizard.html)
HttpProcessor[8080][4]/PipelineNode: Error while processing pipeline at
file:/Library/jakarta-tomcat-4.0.1/webapps/cocoon/sitemap.xmap:593:17
java.lang.RuntimeException: Cannot modify property: APP_TYPE,
java.lang.RuntimeException: Cannot convert value of class [Ljava.lang.String; to
type class java.util.ArrayList
      at
org.apache.commons.jxpath.ri.pointers.PropertyAccessHelper.setValue(PropertyAccessHelper.java:257)
      at
org.apache.commons.jxpath.ri.pointers.BeanPropertyPointer.setValue(BeanPropertyPointer.java:198)
      at org.apache.cocoon.xmlform.Form.setValue(Form.java:198)
      at org.apache.cocoon.xmlform.Form.populate(Form.java:382)
      at
org.apache.cocoon.acting.AbstractXMLFormAction.act(AbstractXMLFormAction.java:212)
      at
org.apache.cocoon.components.treeprocessor.sitemap.ActTypeNode.invoke(ActTypeNode.java:133)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:83)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:157)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:142)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:318)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:289)
      at
org.apache.cocoon.components.treeprocessor.sitemap.MountNode.invoke(MountNode.java:128)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:83)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:157)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:142)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:318)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:289)
      at org.apache.cocoon.Cocoon.process(Cocoon.java:588)
      at
org.apache.cocoon.servlet.CocoonServlet.service(CocoonServlet.java:1002)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
      at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
      at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
      at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)
      at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)
      at java.lang.Thread.run(Thread.java:496)
ERROR   (2002-05-07) 00:41.21:269
[access](/cocoon/mount/vtechform/wizard.html)
HttpProcessor[8080][4]/CocoonServlet: Problem with servlet
java.lang.RuntimeException: Cannot modify property: APP_TYPE,
java.lang.RuntimeException: Cannot convert value of class [Ljava.lang.String; to
type class java.util.ArrayList
      at
org.apache.commons.jxpath.ri.pointers.PropertyAccessHelper.setValue(PropertyAccessHelper.java:257)
      at
org.apache.commons.jxpath.ri.pointers.BeanPropertyPointer.setValue(BeanPropertyPointer.java:198)
      at org.apache.cocoon.xmlform.Form.setValue(Form.java:198)
      at org.apache.cocoon.xmlform.Form.populate(Form.java:382)
      at
org.apache.cocoon.acting.AbstractXMLFormAction.act(AbstractXMLFormAction.java:212)
      at
org.apache.cocoon.components.treeprocessor.sitemap.ActTypeNode.invoke(ActTypeNode.java:133)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:83)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:157)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:142)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:318)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:289)
      at
org.apache.cocoon.components.treeprocessor.sitemap.MountNode.invoke(MountNode.java:128)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:83)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PreparableMatchNode.invoke(PreparableMatchNode.java:157)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:138)
      at
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:107)
      at
org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:142)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:318)
      at
org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:289)
      at org.apache.cocoon.Cocoon.process(Cocoon.java:588)
      at
org.apache.cocoon.servlet.CocoonServlet.service(CocoonServlet.java:1002)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
      at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
      at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
      at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
      at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
      at
org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
      at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
      at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)
      at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)
      at java.lang.Thread.run(Thread.java:496)




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to