cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ovidiu Predescu <ovi...@apache.org>
Subject Re: XMLForm/Flow Integration
Date Wed, 19 Feb 2003 03:06:16 GMT
Great work, Chris!! Thanks for taking the time to do it!

Ovidiu

On Tuesday, Feb 18, 2003, at 18:01 US/Pacific, Christopher Oliver wrote:

> Ugo Cei wrote:
>
>> I didn't try the sample, since it's 1AM and I'm going to bed, but  
>> just by looking at the code, I have a couple of observations:
>>
>>>              XForm.sendView(view, uri)  // Sends "view" to the  
>>> presentation pipeline and waits for the form to be submitted (and  
>>> automatically resends it if validation fails)
>>
>>
>> Sometimes, the validation you can perform with Schematron is not  
>> enough.  In my application, I have a form for user registration and,  
>> besides checking that the username is present, email address is valid  
>> and passwords match, I need to check that the username is not already  
>> registered. To do this, I need to query the database and, if a  
>> duplicate is found, create a new violation object and attach it to  
>> the form. How can I do that if the validation logic is hidden inside  
>> XForm.sendView?
>>
> OK. The attached should allow you to also perform validation in  
> JavaScript.  XForm.sendView() now looks like this
>
>      XForm.sendView(view, uri, validator);
>
> where the (optional) "validator" parameter is a JavaScript function  
> that will be invoked after the form is populated. XForm now also  
> supports a method to add violations
>
>      XForm.addViolation(xpath, message);   // both parameters are  
> strings
>
> which you can use to report violations.
>
> Here's an example with the feedback wizard:
>
> // XML Form Feedback Wizard Application
>
> importPackage(Packages.org.apache.cocoon.samples.xmlform);
>
> function feedbackWizard(xform) {
>    var bean = new UserBean();
>    xform.setModel(bean);
>    xform.sendView("userIdentity", "wizard/userIdentity.xml");
>    print("handling user identity");
>    xform.sendView("deployment",
>                   "wizard/deployment.xml",
>                   function() {
>        print("I can also do validation in JavaScript")
>        if (bean.publish) {
>            xform.addViolation("/publish", "Sorry, I won't let you  
> publish ");
>        }
>    });
>    print("handling deployment");
>    xform.sendView("system", "wizard/system.xml");
>    print("handling system");
>    xform.sendView("confirm", "wizard/confirm.xml");
>    print("handling confirm");
>    xform.finish("end", "wizard/end.xml");
>    print("done");
> }
>
> function XForm(id, validatorNS, validatorDoc) {
>     cocoon.createSession();
>     this.id = id;
>     this.lastContinuation = null;
>     XForm.forms[id] = this;
>     this.validatorNS = validatorNS;
>     this.validatorDoc = validatorDoc;
> }
>
> XForm.forms = {}
>
> XForm.prototype.setModel = function(model) {
>     this.form =
>         new Packages.org.apache.cocoon.components.xmlform.Form(this.id,
>                                                                model);
>     this.form.setAutoValidate(false);
>     if (this.validatorNS != undefined && this.validatorDoc !=  
> undefined) {
>         this.setValidator(this.validatorNS, this.validatorDoc);
>     }
> }
>
> XForm.prototype.start = function(lastCont, timeToLive) {
>     var k = new Continuation();
>     var kont = new WebContinuation(cocoon, k,
>                                    lastCont, timeToLive);
>     return kont;
> }
>
> XForm.prototype.addViolation = function(xpath, message) {
>     var violation =
>        new  
> Packages.org.apache.cocoon.components.validation.Violation();
>     violation.path = xpath;
>     violation.message = message;
>     var list = new java.util.LinkedList();
>     list.add(violation);
>     this.form.addViolations(list);
> }
>
> XForm.prototype._sendView = function(uri, lastCont, timeToLive) {
>   var k = new Continuation();
>   var kont = new WebContinuation(cocoon, k, lastCont, timeToLive);
>   cocoon.forwardTo("cocoon://" + cocoon.environment.getURIPrefix() +  
> uri,
>                    null, kont);
>   this.lastContinuation = kont;
>   suicide();
> }
>
> XForm.prototype.sendView = function(phase, uri, validator) {
>     var lastCont = this.lastContinuation;
>     this.form.clearViolations();
>     while (true) {
>         var k = this.start(lastCont);
>         this.form.save(cocoon.environment.objectModel, "request");
>         try {
>             print("sending view: " + phase);
>             this._sendView(uri, k);
>         } catch (e) {
>             e.printStackTrace();
>         }
>         print("return from continuation: "+this);
>         this.form.populate(cocoon.environment.objectModel);
>         this.form.validate(phase);
>         print("populated form: and validated...");
>         if (this.form.violationsAsSortedSet != null) {
>             print(this.form.violationsAsSortedSet.size() + "  
> violations");
>         }
>         if (validator != undefined) {
>             validator();
>         }
>         if (this.form.violationsAsSortedSet == null ||
>             this.form.violationsAsSortedSet.size() == 0) {
>             break;
>         }
>         print(this.form.violationsAsSortedSet.size() + " violations");
>     }
> }
>
> XForm.prototype.setValidator = function(schNS, schDoc) {
>     // if validator params are not specified, then
>     // there is no validation by default
>     if (schNS == null || schDoc == null ) return null;
>     var resolver = cocoon.environment;
>     var schemaSrc = resolver.resolveURI( schDoc );
>     try {
>         var is =  
> Packages.org.apache.cocoon.components.source.SourceUtil.getInputSource( 
> schemaSrc);
>         var schf =  
> Packages.org.apache.cocoon.components.validation.SchemaFactory.lookup  
> ( schNS );
>         var sch = schf.compileSchema ( is );
>         this.form.setValidator(sch.newValidator());
>     } finally {
>         resolver.release(schemaSrc);
>     }
> }
>
> XForm.prototype.finish = function(phase, uri) {
>     this.form.save(cocoon.environment.objectModel, "request");
>     cocoon.forwardTo("cocoon://" + cocoon.environment.getURIPrefix() +  
> uri,
>                      null, null);
>     delete XForm.forms[this.id]; // delete myself
> }
>
> function xmlForm(application, id, validator_ns, validator_doc, scope) {
>     var enum_ = cocoon.request.parameterNames;
>     var command = undefined;
>     while (enum_.hasMoreElements ()) {
>         var paramName = enum_.nextElement();
>         // search for the command
>         if  
> (paramName.startsWith(Packages.org.apache.cocoon.Constants.ACTION_PARAM 
> _PREFIX)) {
>             command =
>                  
> paramName.substring(Packages.org.apache.cocoon.Constants.ACTION_PARAM_P 
> REFIX.length(), paramName.length());
>             break;
>         }
>     }
>     // command encodes the continuation id for "back" or "next" actions
>     print("command="+command);
>     if (command != undefined) {
>         var xform = XForm.forms[id];
>         if (xform == undefined) {
>             return this[application](new XForm(id, validator_ns,  
> validator_doc));
>         }
>         // invoke a continuation
>         var continuationsMgr =
>              
> cocoon.componentManager.lookup(Packages.org.apache.cocoon.components.fl 
> ow.ContinuationsManager.ROLE);
>         var wk = continuationsMgr.lookupWebContinuation(command);
>         cocoon.componentManager.release(continuationsMgr);
>         if (wk != null) {
>             print(paramName +  
> "="+cocoon.request.getParameter(paramName));
>             var jswk = wk.userObject;
>             try {
>                 xform.form.clearViolations();
>                 jswk.continuation(jswk);
>             } catch (e) {
>                 e.printStackTrace();
>             }
>         }
>     }
>     // Just start a new instance of the application
>     this[application](new XForm(id, validator_ns, validator_doc));
> }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: cocoon-dev-unsubscribe@xml.apache.org
> For additional commands, email: cocoon-dev-help@xml.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: cocoon-dev-unsubscribe@xml.apache.org
For additional commands, email: cocoon-dev-help@xml.apache.org


Mime
View raw message