You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by Andrew Madu <an...@gmail.com> on 2006/02/21 10:59:45 UTC
Flowscript continuation from external reply
Hi,
I have a flowscript function which passes some variables to an
external site. The site will send back a success or failure
confirmation based upon the parameters passed. What I want to do next
is continue on the from the next point in time after the external
site was contacted, so:
I want to create some flowscript which passes variables to an
external site, (https://www.externalsite.com/test.asp?contiuation-
id=xxx, var1=x,var2=x) for example, gets a response back from the
external site (http://www.mysite.com/continuation-id/value-returned),
and based on the response sent back does something else following the
initial call to the external site. How do I do this in flowscript?
So what i'm thinking is something like:
function getResults() {
cocoon.redirectTo("https://www.externalsite.com/test.asp?contiuation-
id=xxx, var1=x,var2=x")
if (value-returned == 'true') {
do this
}else{
do this
}
}
How do I get back to the point after cocoon.redirectTo() using the
returned continuation-id?
thanks in advance
Andrew
Re: Flowscript continuation from external reply
Posted by Simone Gianni <s....@thebug.it>.
Andrew Madu wrote:
> Hi Simone,
> many thanks for your suggestions.
You're welcome :)
>
> How so? This is what comes back to me:
>
> www.mysite.com/continuation-id/value-returned
>
> What happens next? How do I get the *value-returned *into the if
> statement following the var bizdata line?
This is not simple. If you can manipulate the return url, try to have
the value-returned passed as a parameter (like
www.yoursite.com/continuation-id.continue?value-returned=X ) .
If you can't, then you will have to parse the URL by yourself inside the
flow, and to do this you have to access the underlying JAVA request
object, since the FOM object does not have methods to access the requestURI.
This is dirty, and YMMV, but it's done this way :
var objectmodel =
Packages.org.apache.cocoon.components.CocoonComponentManager.getCurrentEnvironment().getObjectModel();
var jrequest =
Packages.org.apache.cocoon.environment.ObjectModelHelper.getRequest(objectmodel);
var uri = jrequest.getRequestURI();
var value-returned = uri.substring(uri.lastIndexOf('/') + 1);
I don't know of a way to pass parameters from the sitemap to a
continuation (you can pass them with <map:parameter inside a <map:call
function, but i don't think they will work inside a <map:call
continuation ).
OR you can try to rewrite the url, (a match that uses a map:redirect-to
uri="{1}.continue?value-returned={2}") but it's getting dirtier and
dirtier and don't know if it works well at all.
<map:match pattern="CCreturn/*/*">
<map:redirect-to uri="{1}.continue?value-returned={2}"/>
</map:match>
Hope this helps,
Simone
--
Simone Gianni
Re: Flowscript continuation from external reply
Posted by Jason Johnston <co...@lojjic.net>.
Andrew Madu wrote:
> Hi Simone,
> many thanks for your suggestions.
>
>> 1) Instead of using redirectTo, set up a page with a link to the
>> external site (like a jx page), then use sendPageAndWait to send this
>> page to the user, he will click on the link, go to the external site
>> and all the rest, while your flow will be suspended until the external
>> site will redirect him to your continuation and the flow will restart.
>> This is a clean solution, but involves one more step for the user.
>
> I have implemented the following so far:
>
> function getUserOrder() {
> ......
> ......
> cocoon.sendPageAndWait("confirmStage")
> }
It's not really related to the issue at hand, but instead of issuing a
sendPageAndWait() to a pipeline that just calls another flow function,
you could call that flow function confirmStage() directly and save some
complexity.
>
> confirmStage is a sitemap function call:
>
> <map:match pattern="confirmStage.xml">
> <map:call function="confirmStage"/>
> </map:match>
>
>
> to:
>
> function confirmStage() {
> //2. Get card details.
> var form = new Form("forms/CreditCardDetails.xml");
> form.showForm("CreditCardDetails.xml", {"userGlobal":userGlobal});
> var model = form.getModel();
> var bizData = {"fname" : model.fname, "lname" : model.lname,
> "account_no" : model.account_no, "credit" : model.credit, "month" :
> model.month, "year" : model.year}
>
> try {
> if (value-returned == true) {
> }else{
> }
> } catch (e) {
> //Some problem has occured
> msg2 = e.toString();
> }
> }
>
> So I am making a sendPageAndWait to a form which reads like this in the
> html:
>
> <form action="www.externalsite.com/test.asp
> <http://www.externalsite.com/test.asp>" name="Form1" method="post"
> onsubmit="forms_onsubmit(); "><input name="forms_submit_id" type="hidden" />
> <input value="32558c182c69426584288f333413213a8a2a6a58" type="hidden"
> name="continuation-id" />
> .......
>
> The user enters their credit card details and clicks submit which posts
> the form to externalsite.com.
>
> Now, at this point, this is where I get confused. You say:
>
> *'while your flow will be suspended until the external site will
> redirect him to your continuation'*
>
> How so? This is what comes back to me:
>
> www.mysite.com/continuation-id/value-returned
>
> What happens next? How do I get the *value-returned *into the if
> statement following the var bizdata line?
IIUC, you're just making an HTTP request to an external URL, passing it
a few parameters, and getting back a one-line text result which you need
to parse? You can do that all within flow by using the HTTPClient
library: http://jakarta.apache.org/commons/httpclient/ (included with
Cocoon).
So instead of your form posting directly to the external site, have it
post to your continuation like normal, then in your flowscript read the
user's inputted values from the form, assemble them into a HTTPClient
request, send that request to the external URL, and parse the response
however you need to.
Is this what you're wanting to do?
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org
Re: Flowscript continuation from external reply
Posted by Andrew Madu <an...@gmail.com>.
Hi Simone,
many thanks for your suggestions.
> 1) Instead of using redirectTo, set up a page with a link to the
> external site (like a jx page), then use sendPageAndWait to send
> this page to the user, he will click on the link, go to the
> external site and all the rest, while your flow will be suspended
> until the external site will redirect him to your continuation and
> the flow will restart. This is a clean solution, but involves one
> more step for the user.
I have implemented the following so far:
function getUserOrder() {
......
......
cocoon.sendPageAndWait("confirmStage")
}
confirmStage is a sitemap function call:
<map:match pattern="confirmStage.xml">
<map:call function="confirmStage"/>
</map:match>
to:
function confirmStage() {
//2. Get card details.
var form = new Form("forms/CreditCardDetails.xml");
form.showForm("CreditCardDetails.xml", {"userGlobal":userGlobal});
var model = form.getModel();
var bizData = {"fname" : model.fname, "lname" : model.lname,
"account_no" : model.account_no, "credit" : model.credit, "month" :
model.month, "year" : model.year}
try {
if (value-returned == true) {
}else{
}
} catch (e) {
//Some problem has occured
msg2 = e.toString();
}
}
So I am making a sendPageAndWait to a form which reads like this in
the html:
<form action="www.externalsite.com/test.asp" name="Form1"
method="post" onsubmit="forms_onsubmit(); "><input
name="forms_submit_id" type="hidden" />
<input value="32558c182c69426584288f333413213a8a2a6a58" type="hidden"
name="continuation-id" />
.......
The user enters their credit card details and clicks submit which
posts the form to externalsite.com.
Now, at this point, this is where I get confused. You say:
'while your flow will be suspended until the external site will
redirect him to your continuation'
How so? This is what comes back to me:
www.mysite.com/continuation-id/value-returned
What happens next? How do I get the value-returned into the if
statement following the var bizdata line?
many thanks
Andrew
Re: Flowscript continuation from external reply
Posted by Bertrand Delacretaz <bd...@apache.org>.
Le 21 févr. 06 à 17:57, Andrew Madu a écrit :
> ...Could you direct me to any documentation on calls to webservices
> from cocoon within flowscript?..
Have a look at http://wiki.apache.org/cocoon/FlowAndWebServices -
dunno how well this works but it might be worth testing.
-Bertrand
Re: Flowscript continuation from external reply: SOLVED!
Posted by Andrew Madu <an...@gmail.com>.
Hi,
just to let you know that I have successfully implemented webservice
calls to Paypal into my site via flowscript.
Andrew
> Andrew Madu wrote:
>
>> Hi Simone,
>>
>>> I supposed you was not going to call a webservice (which is
>>> server to server comunication) but send the user to another
>>> site, and then receive back (thru the user browser) the result
>>> of the transaction. This is what i asked in the first few lines
>>> of my first answer. If you have to call a webservice (your
>>> server connects to the other server, the user notices nothing)
>>> then the aproach is radically different.
>>
>>
>> yes I am aware of this, and sorry for any confusion. I am just
>> looking at both approaches and wish to find a solution to both.
>> Ultimately for those credit clearing facilities that offer a
>> webservice (SOAP) solution, I would like to implement that into
>> my project.
>
> Oh ok, I was just missing the point :)
>
>>
>>
>> I have a pretty clear idea of how to implement the first issue
>> that I made my original question against. I would now like to
>> tackle the option of implementing a webservice call into my website.
>>
>> Could you direct me to any documentation on calls to webservices
>> from cocoon within flowscript?
>
> I don't know of any facility for calling webservices directly from
> inside a flowscript. I think you will have to use any webservice
> engine/client you need (Axis, of HTTPClient if it's a rest or
> whatever else) as if you were going to use it inside any other web
> technology or java program.
>
> Simone
>
> --
> Simone Gianni
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
> For additional commands, e-mail: users-help@cocoon.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org
Re: Flowscript continuation from external reply
Posted by Andrew Madu <an...@gmail.com>.
Hi Simone,
> I don't know of any facility for calling webservices directly from
> inside a flowscript. I think you will have to use any webservice
> engine/client you need (Axis, of HTTPClient if it's a rest or
> whatever else) as if you were going to use it inside any other web
> technology or java program.
for those that may be interested I came across a thread which is a
good starting point for flow and web services:
http://java2.5341.com/msg/28421.html
Andrew
Re: Flowscript continuation from external reply
Posted by Simone Gianni <s....@thebug.it>.
Andrew Madu wrote:
> Hi Simone,
>
>> I supposed you was not going to call a webservice (which is server
>> to server comunication) but send the user to another site, and then
>> receive back (thru the user browser) the result of the transaction.
>> This is what i asked in the first few lines of my first answer. If
>> you have to call a webservice (your server connects to the other
>> server, the user notices nothing) then the aproach is radically
>> different.
>
>
> yes I am aware of this, and sorry for any confusion. I am just
> looking at both approaches and wish to find a solution to both.
> Ultimately for those credit clearing facilities that offer a
> webservice (SOAP) solution, I would like to implement that into my
> project.
Oh ok, I was just missing the point :)
>
>
> I have a pretty clear idea of how to implement the first issue that I
> made my original question against. I would now like to tackle the
> option of implementing a webservice call into my website.
>
> Could you direct me to any documentation on calls to webservices from
> cocoon within flowscript?
I don't know of any facility for calling webservices directly from
inside a flowscript. I think you will have to use any webservice
engine/client you need (Axis, of HTTPClient if it's a rest or whatever
else) as if you were going to use it inside any other web technology or
java program.
Simone
--
Simone Gianni
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org
Re: Flowscript continuation from external reply
Posted by Andrew Madu <an...@gmail.com>.
Hi Simone,
> I supposed you was not going to call a webservice (which is server
> to server comunication) but send the user to another site, and then
> receive back (thru the user browser) the result of the transaction.
> This is what i asked in the first few lines of my first answer. If
> you have to call a webservice (your server connects to the other
> server, the user notices nothing) then the aproach is radically
> different.
yes I am aware of this, and sorry for any confusion. I am just
looking at both approaches and wish to find a solution to both.
Ultimately for those credit clearing facilities that offer a
webservice (SOAP) solution, I would like to implement that into my
project.
I have a pretty clear idea of how to implement the first issue that I
made my original question against. I would now like to tackle the
option of implementing a webservice call into my website.
Could you direct me to any documentation on calls to webservices from
cocoon within flowscript?
Andrew
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org
Re: Flowscript continuation from external reply
Posted by Simone Gianni <s....@thebug.it>.
Hi Andrew,
I supposed you was not going to call a webservice (which is server to
server comunication) but send the user to another site, and then receive
back (thru the user browser) the result of the transaction. This is what
i asked in the first few lines of my first answer. If you have to call a
webservice (your server connects to the other server, the user notices
nothing) then the aproach is radically different.
Simone
Andrew Madu wrote:
> Hi Simone,
>
>> 1) Instead of using redirectTo, set up a page with a link to the
>> external site (like a jx page), then use sendPageAndWait to send this
>> page to the user, he will click on the link, go to the external site
>> and all the rest, while your flow will be suspended until the
>> external site will redirect him to your continuation and the flow
>> will restart. This is a clean solution, but involves one more step
>> for the user.
>>
>> 2) Create a webContinuation in your flow (you can do this in
>> javascript flow), before the redirectTo. This way you have a
>> "bookmark" in your flow the user can be redirected to, even if you
>> haven't stopped the flow directly. This is quite a dirtier solution,
>> but avoids the extra click. Here is the pseudocode:
>
>
>
> wouldn't a nicer way to be to call a webservice? So for example:
>
> *var webServiceVal = cocoon.callWebservice(bizData.fname etc etc etc)*
>
>
> try {
> if (webServiceVal == true) {
> }else{
>
> }
> } catch (e) {
> //Some problem has occured
> msg2 = e.toString();
> }
>
> How do I call a webservice and pass it parameters in flowscript?
>
>
> Andrew
Re: Flowscript continuation from external reply
Posted by Andrew Madu <an...@gmail.com>.
Hi Simone,
> 1) Instead of using redirectTo, set up a page with a link to the
> external site (like a jx page), then use sendPageAndWait to send
> this page to the user, he will click on the link, go to the
> external site and all the rest, while your flow will be suspended
> until the external site will redirect him to your continuation and
> the flow will restart. This is a clean solution, but involves one
> more step for the user.
>
> 2) Create a webContinuation in your flow (you can do this in
> javascript flow), before the redirectTo. This way you have a
> "bookmark" in your flow the user can be redirected to, even if you
> haven't stopped the flow directly. This is quite a dirtier
> solution, but avoids the extra click. Here is the pseudocode:
wouldn't a nicer way to be to call a webservice? So for example:
var webServiceVal = cocoon.callWebservice(bizData.fname etc etc etc)
try {
if (webServiceVal == true) {
}else{
}
} catch (e) {
//Some problem has occured
msg2 = e.toString();
}
How do I call a webservice and pass it parameters in flowscript?
Andrew
Re: Flowscript continuation from external reply
Posted by Simone Gianni <s....@thebug.it>.
Hi Andrew,
first question. When you say "pass variables to an external site" you
mean "redirect the user to an external site, like a payment gateway, and
then the external site will redirect the user back to me" right?
In that case, the redirectTo function does not suspend the current
execution, and there is no "redirectAndWait" function, so you are
sending the user to the site, but the flow is not waiting for the response.
You can solve in two ways :
1) Instead of using redirectTo, set up a page with a link to the
external site (like a jx page), then use sendPageAndWait to send this
page to the user, he will click on the link, go to the external site and
all the rest, while your flow will be suspended until the external site
will redirect him to your continuation and the flow will restart. This
is a clean solution, but involves one more step for the user.
2) Create a webContinuation in your flow (you can do this in javascript
flow), before the redirectTo. This way you have a "bookmark" in your
flow the user can be redirected to, even if you haven't stopped the flow
directly. This is quite a dirtier solution, but avoids the extra click.
Here is the pseudocode:
continuation = createWebcontinuation();
if (value-returned == null) {
redirectTo(externalSite + continuation.id);
} else {
if (value-returned == true) {
etc etc
}
}
You have to check if there is a returned value because when the user is
redirected back to your site the flow will restart from the line
immediately after the creation of the continuation, so you have no way
to determine if this is the first time the user is entering this flow
or if it's returning from the external site if not checking for the
presence of the return value.
Hope this helps,
Simone
Andrew Madu wrote:
> Hi,
> I have a flowscript function which passes some variables to an
> external site. The site will send back a success or failure
> confirmation based upon the parameters passed. What I want to do next
> is continue on the from the next point in time after the external site
> was contacted, so:
>
> I want to create some flowscript which passes variables to an external
> site, (https://www.externalsite.com/test.asp?contiuation-id=xxx,
> var1=x,var2=x) for example, gets a response back from the external
> site (http://www.mysite.com/continuation-id/value-returned), and based
> on the response sent back does something else following the initial
> call to the external site. How do I do this in flowscript?
>
> So what i'm thinking is something like:
>
> function getResults() {
>
> cocoon.redirectTo("https://www.externalsite.com/test.asp?contiuation-id=xxx,
> var1=x,var2=x")
>
> if (value-returned == 'true') {
> do this
> }else{
> do this
> }
> }
>
> How do I get back to the point after cocoon.redirectTo() using the
> returned continuation-id?
>
> thanks in advance
>
> Andrew
--
Simone Gianni