coliver 2003/02/28 11:12:13
Modified: src/java/org/apache/cocoon/components/flow/javascript system.js Log: Removed tabs, added getValue() and iterate() methods to XForm and removed xpath() method Revision Changes Path 1.9 +114 -96 xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/system.js Index: system.js =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/system.js,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- system.js 26 Feb 2003 17:15:41 -0000 1.8 +++ system.js 28 Feb 2003 19:12:13 -0000 1.9 @@ -159,11 +159,13 @@ */ XForm.prototype.setModel = function(model) { this.form = - new Packages.org.apache.cocoon.components.xmlform.Form(this.id, - model); + new Packages.org.apache.cocoon.components.xmlform.Form(this.id, + model); + this.context = + Packages.org.apache.commons.jxpath.JXPathContext.newContext(model); this.form.setAutoValidate(false); if (this.validatorNS != undefined && this.validatorDoc != undefined) { - this._setValidator(this.validatorNS, this.validatorDoc); + this._setValidator(this.validatorNS, this.validatorDoc); } } @@ -176,7 +178,7 @@ XForm.prototype.start = function(lastCont, timeToLive) { var k = new Continuation(); var kont = new WebContinuation(cocoon, k, - lastCont, timeToLive); + lastCont, timeToLive); return kont; } @@ -193,12 +195,12 @@ var list = new java.util.LinkedList(); list.add(violation); try { - this.form.addViolations(list); + this.form.addViolations(list); } catch (e) { - print(e); - if (e instanceof java.lang.Throwable) { - e.printStackTrace(); - } + print(e); + if (e instanceof java.lang.Throwable) { + e.printStackTrace(); + } } } @@ -207,9 +209,18 @@ * @param expr xpath expression * @return result of computing <code>expr</code> */ -XForm.prototype.xpath = function(expr) { - var ctx = new Packages.org.apache.commons.jxpath.JXPathContext.newContext(this.form.getModel()); - return ctx.getValue(expr); +XForm.prototype.getValue = function(expr) { + return this.context.getValue(expr); +} + +/** + * Returns an iterator over a nodeset value of an xpath expression evaluated + * against the model of this form + * @param expr xpath expression + * @return java.util.Iterator representing a nodeset + */ +XForm.prototype.iterate = function(expr) { + return this.context.iterate(expr); } XForm.prototype._sendView = function(uri, lastCont, timeToLive) { @@ -228,7 +239,7 @@ /** * Sends view to presentation pipeline and waits for subsequent submission. * Automatically resends view if validation fails. - * Creates two continuations: one immediately before the page submission + * Creates two continuations: one immediately before the page is sent * and one immediately after. These are used to implement automated support * for back/forward navigation in the form. When you move forward in the * form the second continuation is invoked. When you move back from the @@ -242,41 +253,47 @@ this.form.clearViolations(); var view = this.form.getFormView(cocoon.environment.objectModel); while (true) { - var k = this.start(lastCont); - if (cocoon.request == null) { - // this continuation has been invalidated - this.dead = true; - handleInvalidContinuation(); - suicide(); - } - cocoon.request.setAttribute("view", view); - try { - this.form.save(cocoon.environment.objectModel, "request"); - } catch (e if (e instanceof java.lang.IllegalStateException)) { - if (cocoon.session.getAttribute(this.id) != null) { - // someone else has taken my session - this.dead = true; - cocoon.removeSession(); - handleInvalidContinuation(); - suicide(); - } - throw e; - } - this._sendView(uri, k); - if (this.dead || cocoon.request == null) { - // this continuation has been invalidated - handleInvalidContinuation(); - suicide(); - } - this.form.populate(cocoon.environment.objectModel); - if (validator != undefined) { - validator(this); - } - this.form.validate(phase); - if (this.form.violationsAsSortedSet == null || - this.form.violationsAsSortedSet.size() == 0) { - break; - } + // create a continuation, the invocation of which will resend + // the page: this is used to implement <xf:submit continuation="back"> + var k = this.start(lastCont); + if (cocoon.request == null) { + // this continuation has been invalidated + this.dead = true; + handleInvalidContinuation(); + suicide(); + } + // reset the view in case this is a re-invocation of a continuation + cocoon.request.setAttribute("view", view); + try { + this.form.save(cocoon.environment.objectModel, "request"); + } catch (e if (e instanceof java.lang.IllegalStateException)) { + if (cocoon.session.getAttribute(this.id) != null) { + // someone else has taken my session + this.dead = true; + cocoon.removeSession(); + handleInvalidContinuation(); + suicide(); + } + throw e; + } + this._sendView(uri, k); + // _sendView creates a continuation, the invocation of which + // will return right here: it is used to implement + // <xf:submit continuation="forward"> + if (this.dead || cocoon.request == null) { + // this continuation has been invalidated + handleInvalidContinuation(); + suicide(); + } + this.form.populate(cocoon.environment.objectModel); + if (validator != undefined) { + validator(this); + } + this.form.validate(phase); + if (this.form.violationsAsSortedSet == null || + this.form.violationsAsSortedSet.size() == 0) { + break; + } } } @@ -287,12 +304,12 @@ 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()); + 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); + resolver.release(schemaSrc); } } @@ -304,25 +321,25 @@ XForm.prototype.finish = function(view, uri) { try { - this.form.save(cocoon.environment.objectModel, "request"); + this.form.save(cocoon.environment.objectModel, "request"); } catch (e if (e instanceof java.lang.IllegalStateException)) { - if (cocoon.session.getAttribute(this.id) != null) { - // someone else has taken my session - this.dead = true; - cocoon.removeSession(); - handleInvalidContinuation(); - suicide(); - } - throw e; + if (cocoon.session.getAttribute(this.id) != null) { + // someone else has taken my session + this.dead = true; + cocoon.removeSession(); + handleInvalidContinuation(); + suicide(); + } + throw e; } cocoon.forwardTo("cocoon://" + cocoon.environment.getURIPrefix() + uri, - this.form.getModel(), null); + this.form.getModel(), null); delete XForm.forms[this.id]; // delete myself this.dead = true; cocoon.removeSession(); if (this.lastContinuation != null) { - this.lastContinuation.invalidate(); - this.lastContinuation = null; + this.lastContinuation.invalidate(); + this.lastContinuation = null; } } @@ -337,41 +354,42 @@ */ function xmlForm(application, id, validator_ns, validator_doc) { + if (cocoon.request == null) { + handleInvalidContinuation(""); + return; + } function getCommand() { - if (cocoon.request == null) { - return undefined; - } - 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_PREFIX.length(), paramName.length()); - break; - } - } - // command encodes the continuation id for "back" or "next" actions - return command; + 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_PREFIX.length(), paramName.length()); + break; + } + } + // command encodes the continuation id for "back" or "next" actions + return command; } var command = getCommand(); if (command != undefined) { - var xform = XForm.forms[id]; - if (xform != undefined) { - // invoke a continuation - var continuationsMgr = - cocoon.componentManager.lookup(Packages.org.apache.cocoon.components.flow.ContinuationsManager.ROLE); - var wk = continuationsMgr.lookupWebContinuation(command); - cocoon.componentManager.release(continuationsMgr); - if (wk != null) { - var jswk = wk.userObject; - xform.form.clearViolations(); - jswk.continuation(jswk); - } else { - handleInvalidContinuation(command); - } - } + var xform = XForm.forms[id]; + if (xform != undefined) { + // invoke a continuation + var continuationsMgr = + cocoon.componentManager.lookup(Packages.org.apache.cocoon.components.flow.ContinuationsManager.ROLE); + var wk = continuationsMgr.lookupWebContinuation(command); + cocoon.componentManager.release(continuationsMgr); + if (wk != null) { + var jswk = wk.userObject; + xform.form.clearViolations(); + jswk.continuation(jswk); + } + } + handleInvalidContinuation(command); + return; } // Just start a new instance of the application cocoon.session.removeAttribute(id);