<cocoon-user-note> To Cocoon users: Sorry for the off-topic post. This is just a heads up to let you know what _may_ be coming and to solicit your lobbying efforts for the Torque changes I am proposing below. </cocoon-user-note>
Dear All, I'd like to have some new functionality in Torque. My ultimate goal is to implement the enhancements necessary to make Torque a useful component when developing with Cocoon. <disclaimer> I'm not hung up in implementing the changes exactly as suggested here. I've written the following mainly to clarify my ideas and solicit better suggestions from those who know more. That said, I've tried to keep things simple by separating my requirements from the solution and suggesting a 'small-footprint' change that I can quickly get up and running. I just want a solution for my requirements and I'm willing to write and test the code and DOCUMENT whatever we collectively decide to do. But, barring other suggestions, my analysis thus far shows that I do require changes to Torque (and I'm not a Torque commiter). On the non-technical side, I'd like the community, particularly the Cocoon users (who will get a new tool for their toolbox), to share the benefits. After all, the Torque-ers have already helped me. </disclaimer> 1. REQUIREMENTS =============== 1.1 Populate Torque objects, e.g. objects which extend BaseObject, automatically from a Map or Hashtable. E.g.: // users is an instance of a Users Torque object // generated by Torque. users.populate( myHashFromMyCgiInput ); if ( user.isValid() ) { // isValid is business logic users.save(); } else { throw new BadUserInputException(); // or whatever.. } Ideally the populate() method would accept String representations of fields and convert them to the appropriate native types (as well as accepting native types). 1.2 Allow Torque objects to emit SAX events to a Content handler. Note: most Cocoon processing is done via SAX events. // myContentHandler is a Cocoon transformer that // ultimately transforms it's input into fancy // HTML suitable for web browser presentation. // It has been opened and a document has already // been started myUser1.toXml( myContentHandler ); myUser2.toXml( myContentHandler ); myCompany1.toXml( myContentHandler ); // ..etc.. until done.. then close the document. The toXml() method merely emits the tags and content associated with to it's database record. E.g. the table name '<user>' and the contained fields, '<Userid>1</Userid><Username>joe</Username>' etc.. Note: If you accept this, then you'll get XML as Strings more or less for free. (And you'll get free Steak Knives too.. :) 2.0 POSSIBLE SOLUTION ===================== <another-disclaimer> Read the first disclaimer again: I'm open to other, better solutions. </another-disclaimer> 2.1 Populate() With a bit of Java (and personal :) introspection and some helpful suggestions from the list members, I feel I can implement the populate method. The tricky part will be getting all the type conversion working. This task would be made MUCH easier if there were a method getFieldNames(), that returns null (or throws an exception) in BaseObject. It would be over-ridden by all the Torque generated classes). This would allow applications to use Torque objects in a generic way. They could simply iterate over all the fields, using BaseObject's (overridden) getByName method. 2.2 Sax events Given the getFieldNames method in BaseObject, it becomes a trivial exercise to implement the SAX event generation directly in BaseObject. It is would also be trivial to implement a toXml method, that returned the XML as a String. (..and you'd get free Steak Knives too. :) The only problem is to get the table name (for placing in the top-level XML tag). The easiest solution would be to add a null (or exception-throwing) method getTableName to BaseObject, which would be overridden by the generated Torque objects. Note: since I pan to use Cocoon, I have no need of filtering or forcing the XML to conform to any particular layout. Cocoon allows me to easily use XSLT to perform any required transformation(s). 3.0 SUMMARY OF CHANGES ====================== 3.1 Add to BaseObject.java: public List getFieldNames() { return null; } public String getTableName() { return null; } They could alternatively throw a 'not implemented' exception the way getByName currently does. void populate( Map or Hashtable ) { ... } void toXml( ContentHandler ) { ... } String toXml( ) { ... } or toXml( Writer ) { ... } I'll supply tested code with Javadoc for these methods. 3.2 Add to Object.vm: public String getTableName() { return "$table.Name"; } I'll need to test to ensure that the Torque/velocity variable name is correct. 3.3 Collect the free Steak Knives :) Sorry, but we're all out of Steak Knives :(. ..but I will write a few paragraphs of documentation for the Torque web site and some Cocoon Wiki documentation when I get this working with Cocoon. (That's BETTER than steak knives, right? :) 4.0 AN APPEAL ============= 4.1 Is there a Torque committer willing to 'sponsor me'? No, not to sponsor me to become a commiter, just to commit the changes. 4.2 I'll supply the changes in whatever format is easiest. Best wishes and thanks in advance (especially for reading this far), Alan. P.S. <thanks> Nothing happens in a vacuum: Others have helped. In particular: Michael Bain - For sharing your introspection based solution. Gareth Boden - For sharing your Betwixt based solution and giving me a bunch of insights. Without your efforts, I would have been stuck. Thanks guys! </thanks> --------------------------------------------------------------------- Please check that your question has not already been answered in the FAQ before posting. <http://xml.apache.org/cocoon/faq/index.html> To unsubscribe, e-mail: <[EMAIL PROTECTED]> For additional commands, e-mail: <[EMAIL PROTECTED]>