Looks like I'll need to add conversion from arbitrary arrays to collection types. For consistency I will implement the opposite conversion as well.
BTW, could you record this requirement as well as all other issues you discover in JXPath in Bugzilla? I already have quite a sizable list of bug reports from various people and want track them. Thanks, - Dmitri ----- Original Message ----- From: "Ivelin Ivanov" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Cc: "Dmitri Plotnikov" <[EMAIL PROTECTED]> Sent: Monday, May 06, 2002 9:46 PM Subject: Re: [Announcement] XMLForm 0.81 available in Scratchpad > > Michael, > > Good work. > > Do you have CVS access. If not, just submit the patches to the list, or > directly to me and will apply them. > If you don't use the CVS patch options, don't worry, just send me a zipped > bundle with the java files. > > see below... ( I hope Dmitri can provide some feedback as well ) > > ----- Original Message ----- > From: <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Monday, May 06, 2002 6:09 PM > Subject: Re: [Announcement] XMLForm 0.81 available in Scratchpad > > > > > > Ivelin, > > > > <disclaimer> > > I'm new to java, so there are probably better ways to do this. > > I'm not using CVS (yet!) so I can't supply a simple diff file. > > </disclaimer> > > > > SUMMARY: > > ******************************************************* > > 1) Added accessor methods for a Collection (ArrayList) variable to the > data > > model. Is there a better choice? > > 2) Filled in the stubs for handling <xf:selectMany> already in > > XMLFormTransformer.java. This created the <xf:selectMany> tag, but it had > only > > one <xf:value> child. > > 3) Changed StartTransformingElement function to detect an instance of > Collection > > in the value_ returned from form.getValue() and iterated through the > Collection > > to create the necessary multiple <xf:value> tags. > > Cool. That's what I was thinking to do as well. > > > 4) Added a template to xmlform2html .xsl to process the xf:selectMany tag > and > > generate either a checkbox set or multiple-select list (based on > <xf:selectMany > > @hint="checkbox">). 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. > 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. > > > 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 ? > > > public void setValue(String path, Object[] values) > { > Pointer pointer = jxcontext_.locateValue( path ); > Object property = pointer.getValue(); > if ( property == null ) > { > throw new RuntimeException( "Property for " + path + " is nul. Cannot > determine type." ); > } > // if the property is a collection, set value as array > if ( property instanceof Collection || property.getClass ().isArray () ) > { > Object newValue = convertType( values, property.getClass () ); > pointer.setValue( newValue ); > } > // otherwise set the value of the first element > // (there shouldn't be other) > // in the values array > else setValue( pointer, values[0] ); > } > > > > > 6) Extended WizardAction (for other reasons), and modified the reset > function to > > set data model to empty ArrayList before population. > > > > There are (at least) several fishy things here: 1) Don't know what happens > when > > DOM nodes are used for multiple-select. (Don't really understand the > > purpose/use of DOM nodes in data model for that matter) > > I guess preparing of the DOM node can either happen in the reset() method, > when request > scope is used for the form. Otherwise, with session scope, no special > handling needs to take place. > Although I have not tested this. > I have not personally used DOM for any of the web apps I've worked on, but > Torsten and other folks do it quite a bit. You can look at the recent form > discussions in the list. > > 2) Types stuff is just > > a working hack. No provision for converting anything but an ArrayList, > and not > > sure if I'm even doing this the right way. > > I've also added a couple hacks to the Types class, some of which made it in > the JXPath core. > Yours might too, if we can't find a better solution. > > > 3) I very much prefer your idea of > > using "selectUIType" attribute instead of "hint" attribute. I'll work on > these > > things when I get time. > > This was an excerpt from the XForms spec. > > > > > Also, I'm struggling a bit with the best way to handle "presentation" of > > multiple-select lists rendered as checkbox set. All other form widgets, > item > > captions render only one way (e.g. options in select list). But with > checkbox > > sets, item captions may be rendered to right of checkbox, to left of > checkbox, > > above checkbox, below checkbox, etc. For now, my template just places > them to > > right of checkbox, but this needs to be more flexible. > > Konstantin can probably help here. > 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). > > > > > DETAILS: > > ******************************************************* > > > > 1) In XMLFormTransformer.java > > Filled in stub for selectMany tag in StartTransformingElement(): > > else if (TAG_SELECTMANY.equals(name)) > > { > > //NYI - Not Yet Implemented > > //throw new SAXException("tag selectMany Not Yet > > Implemented"); > > startElementSimpleField( uri, name, raw, attributes, > currentForm ); > > } > > Looks good. > > > > > and EndTransformingElement(): > > else if (TAG_SELECTMANY.equals(name)) > > { > > super.endElement(uri, name, raw); > > } > > Looks good. > > > > > and inserted code for handling Collections: > > > > // render the value subelement(s) > > if (value_ instanceof Collection) > > { > > Iterator i=((Collection) value_).iterator(); > > while (i.hasNext()) > > { > > super.startElement(uri, "value", NS_PREFIX + ":" + > "value", > > NOATTR); > > if (value_ != null) > > { > > String v = String.valueOf( i.next() ); > > super.characters(v.toCharArray(),0,v.length()); > > } > > super.endElement( uri, "value", NS_PREFIX + ":" + > "value" ); > > } > > } > > else > > { > > super.startElement(uri, "value", NS_PREFIX + ":" + "value", > > NOATTR); > > if (value_ != null) > > { > > String v = String.valueOf( value_ ); > > super.characters(v.toCharArray(),0,v.length()); > > } > > super.endElement( uri, "value", NS_PREFIX + ":" + "value" ); > > } > > Looks good. > > > > > > 2) In Types.java the convert function has a block of code for converting > request > > parameter Strings to various Object types, but no similar block for > request > > parameter String[]. Maybe they are supposed to "drop through" and be > processed > > below, don't entirely understand this. Anyway this caused all sorts of > jxpath > > errors when I tried to use form.setValue(path, values), so I used "brute > force" > > and hacked in the following: > > else if (object instanceof String[]){ > > /* WARNING: THIS IS A REAL HACK! > > * Inserted to handle conversion of string array from > request > > into ArrayList. > > * Should write "converters" from String[] to other > types of > > Java objects > > * Not sure this belongs here at all, should look at > > hasConversionConstructor > > * stuff below, but this works for now... > > */ > > if (toType == ArrayList.class){ > > If you can extend this implementation to be able to handle Collections or > array of primitives, > it deserves to be part of the core JXPath code. I would encourage you to > look at the most recent > JXPath source, because from Dmitri's description, I believe this is already > there. > > > > String[] tempString = (String[]) object; > > ArrayList newArrayList = new ArrayList(); > > for (int n=0;n<tempString.length;n++){ > > newArrayList.add(tempString[n]); > > } > > return newArrayList; > > } > > } > > > Excelent. > > Keep the good stuff coming. > > > Ivelin > > > > > Cheers, > > --Michael > > > > > > > > > > > > "Ivelin Ivanov" > > <[EMAIL PROTECTED] To: > <[EMAIL PROTECTED]> > > g> cc: > > Subject: Re: > [Announcement] XMLForm 0.81 available in > > 05/06/02 06:33 AM Scratchpad > > Please respond to > > cocoon-dev > > > > > > > > > > > > > > Sure feel free to patch. > > > > Actually, thanks for patching ;) > > > > I'd be curious to see the diff. > > > > Can you descripe in short what behaviour you added to implement selectMany > ? > > > > Ivelin > > > > ----- Original Message ----- > > From: <[EMAIL PROTECTED]> > > To: <[EMAIL PROTECTED]> > > Sent: Saturday, May 04, 2002 11:43 PM > > Subject: Re: [Announcement] XMLForm 0.81 available in Scratchpad > > > > > > > Ivelin, > > > > > > I found the places in XMLFormTransformer.java that needed filling in and > > hacked > > > a patch into Types.java. I now have xf:selectMany working well enough > for > > > testing purposes. Let me know if you have any general advice about > > patching > > > these files... > > > > > > Thanks, > > > --Michael > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, email: [EMAIL PROTECTED] > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, email: [EMAIL PROTECTED] > > > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, email: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]