Apparently I missed this letter before.
Yes Chris, this is the reason why the collection is being replaced.
Any ideas for improvement?

-=Ivelin=-
----- Original Message -----
From: "Christopher Oliver" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>
Sent: Friday, February 21, 2003 4:10 PM
Subject: Re: Setting values in XMLForm (via JXPath)


> In this case it looks like XMLForm is trying to replace all the elements
> of a collection with a new set of elements. It looks to me like there is
> no reasonable way to do this in general with JXPath without the caller
> being aware of the representation of the collection. Or am I wrong?
>
> Regards,
>
> Chris
>
>
> Dmitri Plotnikov wrote:
>
> >Christopher,
> >
> >The answer to your question really depends on whether you want to
> >replace an existing collection element or create a new one.  To create
> >and element, use createPathAndSetValue.  To replace the textual
> >contents of an existing element, simply use setValue()
> >
> >- Dmitri
> >
> >--- Christopher Oliver <[EMAIL PROTECTED]> wrote:
> >
> >
> >>It appears that XMLForm's use of JXPath is hardcoded to setting
> >>indexed
> >>values only on Java arrays and Collections (not DOM nodes or other
> >>types
> >>of JXPath nodes). I was attempting to use a JavaScript object as a
> >>JXPath node, but ran into the below problem in Form.java
> >>
> >>
> >>
>
>(http://cvs.apache.org/viewcvs.cgi/*checkout*/xml-cocoon2/src/java/org/apac
he/cocoon/components/xmlform/Form.java?rev=HEAD&content-type=text/plain)
> >
> >
> >>Dmitri, what is the proper way to set collection values in JXPath?
> >>Should we be using createPathAndSetValue() here?
> >>
> >>Regards,
> >>
> >>Chris
> >>
> >>       public void setValue(String xpath, Object[] values) {
> >>
> >>                //    // Dmitri Plotnikov's patch
> >>                //
> >>                //    // if there are multiple values to set
> >>                //    // (like in the selectMany case),
> >>                //    // iterate over the array and set individual
> >>values
> >>                //    if ( values.length > 1  )
> >>                //    {
> >>                //      Iterator iter =
> >>jxcontext_.iteratePointers(xpath);
> >>                //      for (int i = 0; i < values.length; i++ )
> >>                //      {
> >>                //        Pointer ptr = (Pointer)iter.next();
> >>                //        ptr.setValue(values[i]);
> >>                //      }
> >>                //    }
> >>                //    else
> >>                //    {
> >>                //      // This is supposed to do the right thing
> >>                //      jxcontext_.setValue(xpath, values);
> >>                //    }
> >>                //
> >>
> >>                Pointer pointer = jxcontext_.getPointer(xpath);
> >>                Object property = pointer.getValue();
> >>                // if there are multiple values to set
> >>                // (like in the selectMany case),
> >>                // iterate over the array and set individual values
> >>
> >>                // when the instance property is array
> >>                if (property != null &&
> >>property.getClass().isArray()) {
> >>                        Class componentType =
> >>property.getClass().getComponentType();
> >>                        property =
> >>                                java.lang.reflect.Array.newInstance(
> >>                                        componentType,
> >>                                        values.length);
> >>                        java.lang.System.arraycopy(values, 0,
> >>property,
> >>0, values.length);
> >>                        pointer.setValue(property);
> >>                } else if (property instanceof Collection) {
> >>                        Collection cl = (Collection) property;
> >>                        cl.clear();
> >>                        cl.addAll(java.util.Arrays.asList(values));
> >>                }
> >>                // otherwise set the value of the first element
> >>                // (and the only) from the values array
> >>                else {
> >>                        pointer.setValue(values[0]);
> >>                }
> >>        }
> >>
> >>
> >>
> >>
> >>
> >
> >
> >__________________________________________________
> >Do you Yahoo!?
> >Yahoo! Tax Center - forms, calculators, tips, more
> >http://taxes.yahoo.com/
> >
> >
> >
>

Reply via email to