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