We've got the rainbow !
+===========================================+ + *Fast* Java API for Schematron Validation *Ready* ! + +===========================================+ + Validates both JavaBeans and DOM nodes + +===========================================+ It's been another long and fruitful Saturday here in Austin... I am grateful to everyone in the Cocoon community as well as Dmitri Plotnikov for his help with JXPath, Rick Jelliffe for his guidance with Schematron and Oliver Becker for the clarifications on his XSLT based Java API for Schematron. As I mentioned already, I've decided to implement Schematron in Java using JXPath. The result is surprisingly little code (~1K lines) and quite exciting speed (~20ms per validation for the demo setup). What's more: - Does not need Castor mapping - Does not do XSL transformation - Direct access through the JXPath library * Someone let me know if this can be implemented too much faster * I hope this answers some outstanding questions like: "How do we validate HTML Forms ?" "How do we reuse validation rules and code for HTML Forms, Web Services and domain validation ?" "What language do we use or build to implement validation?" I am not sure if the credits should all go to Schematron or more to XPath, but Schematron being so simple and powerful is clearly my choice: - Schemas can grow organicly. One can start with a few simple rules and grow the document with time. - Native support for validation in "phases". Unlike XML Schema, one doesn't need to provide a complete document in order to be able to perform validation. - Pin-points the bad elements and provides user-friendly reporting. - Very, very simple to learn if one knows XPath. (I just can stop repeating that.) Please play with the new demo and send me your feedback. I've tried to add more JavaDoc since last time. Note that since there are 2 demos now, the URLs are different: xmlform/demo1 for the original demo and xmlform/demo2 for the new demo The new demo extends the first one with an additional page which is shown on successful submit. This shows a possible sitemap control logic based on validation results. Having in addition the efficient HTML Form -> JavaBean binding, I'm convinced we're not too far from making Cocoon a prime time app server. The only area which is not completely fleshed out yet is rendering the HTML Forms. The currently proposed simplistic solution apparently works for many people, but there are still strong opinons for a XForms style model. I would need more specific suggestions on the latter, so that we can have a good understanding and eventually vote on one or the other. Download from: http://prdownloads.sourceforge.net/freebuilder/CocoonForm_0-7.zip ======================== P.S.: For those who are too busy to install the demo, but would like to participate in the discussion, I attach key snippets of code below: ======================== ---------------------------------------------------------------- sitemap.xmap: ... <!-- Demo2: 1) The Action binds the HTML form to a JavaBean and inserts it in the session 2) The Action uses the Java Schematron Validator to perform fast validation 3) The Action inserts into request the validation result (if negative) 4) Selector branches control depending on the outcome of 3) 5) If 3) produced validation errors, then the path is similar to Demo1 6) If 3) did not produce validation errors, then Success page is displayed --> <map:match pattern="demo2"> <map:act type="ValidationFormAction"/> <map:select type="request-attribute"> <map:parameter name="attribute-name" value="validationPassed"/> <!-- validation passed, go to next page --> <map:when test="true"> <map:call resource="display-success"/> </map:when> <!-- validation failed, go to the same page --> <map:otherwise> <map:generate src="insertFormBean-Demo2.xml"/> <map:transform type="castor"/> <map:transform src="formbean2html-Demo2.xsl"/> <map:serialize type="html"/> </map:otherwise> </map:select> </map:match> </map:pipeline> ... ---------------------------------------------------------------- class ValidatingFormAction ... public Map act(...) { ... String formName = "xmlForm"; TestBean jBean = (TestBean) session.getAttribute( formName ); if (jBean == null) { // first time here, populate the bean with initial values jBean = new TestBean(); session.setAttribute( formName, jBean); } else { // been here before, update the bean with client's values FormBeanBinder.bind(request, jBean); } // validate state of the bean against a Schematron schema. // Schema Phase is "Full" Properties props = new Properties(); props.put("phase", "Full"); ValidationResult vres = validator_.validate(jBean, props); // if the validation result is not empty, then // make the validation result available to the pipeline // it can be later checked by a <map:selector/> // or inserted in the SAX stream by a CastorTransformer // or maybe even both if (!vres.isEmpty()) { request.setAttribute ( formName + "ValidationResult", vres ); } request.setAttribute ( "validationPassed", new Boolean( vres.isEmpty() ) ); // apply additional buziness logic to the bean jBean.incrementCount(); return objectModel; } ... } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]