Nicolas Bielza wrote:

No, sendPageAndWait() does this. I think maybe catch(return) and the
postpipeline function are the same thing. Anyway I tested both and they
only work when using sendPageAndWait(), that is, when a continuation
object is created. (This is consistent with the doc).


Dunno whether this will work, but it is at least worth a try:

1) Edit $COCOON/src/java/org/apache/cocoon/components/flow/javascript/fom/fom_system.js

Just under the definition of FOM_Cocoon.prototype.sendPageAndWait, place:

FOM_Cocoon.prototype.sendPage = function(uri, bizData, fun) {
   this.sendPage(uri, bizData);
   if (fun) {
       if (!(fun instanceof Function)) {
           throw "Expected a function instead of: " + fun;
       }
       fun();
   }
}

2) Rebuild your Cocoon.
3) Try cocoon.sendPage("url", bizData, function() {hibernateSession.close());


I personally don't see why this shouldn't be there, and if this works, we can propose it as a patch.

Regards, Upayavira

-----Original Message-----
From: Upayavira [mailto:[EMAIL PROTECTED] Sent: 10 juin, 2004 13:19
To: [EMAIL PROTECTED]
Subject: Re: Flow + Hibernate and lazy initialization



Nicolas Bielza wrote:



I tried to use the catch(return) trick but it doesn't seem to work. (I'm using cocoon 2.1.4)




Never used it, but - doesn't the cocoon.sendPage("url", {"foo":foo}, function(){hibernateSession.close();});
syntax do this?


Upayavira



I added some log messages in the flowscript and it seems that the
catch(return) is not executed when I call sendPage() (the script debugger also exposed this, and after a while, I started to see some warnings about unclosed sessions...).


I tried with sendPageAndWait() and this time the catch(return) got executed, but it was called before the pipeline completed: I still had lazy initialization exceptions during pipeline processing.

I also tried to close the session in the postpipeline code (when using
sendPageAndWait()) and again, the session was closed before pipeline completed.


Here's an example flowscript (I'm not closing the session here, just
logging) :

try {

// ...

var list = query.list();
cocoon.log.error("I'm about to call cocoon.sendPageAndWait()");
cocoon.sendPageAndWait("report.vm", {"list" : new HashSet(list)},
function() { cocoon.log.error("I'm in postpipeline code"); }, 0);
catch(return) {
  cocoon.log.error("I'm inside catch(return)");
}
}
finally {
cocoon.log.error("I'm inside finally block");
//clean up
cocoon.releaseComponent(hibernateFactory);
}


Now, here's the console output:

Hibernate: select introspecd0_.id as id, introspecd0_.envelop as envelop, introspecd0_.reference as reference, introspecd0_.tradingPartner as tradingP4_, introspecd0_.docType as docType from Introspec_Document introspecd0_ inner join Introspec_History statushist1_ on introspecd0_.id=statushist1_.docId
Hibernate: select introspecd0_.id as id0_, introspecd0_.name as name0_


from Introspec_DocType introspecd0_ where introspecd0_.id=?


ERROR 2004-06-10 12:14:29.561 [flow ] (): I'm about to call
cocoon.sendPageAndWait()
ERROR 2004-06-10 12:14:29.632 [flow ] (): I'm in postpipeline code
ERROR 2004-06-10 12:14:29.632 [flow ] (): I'm inside catch(return)
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select introspecs0_.id as id0_, introspecs0_.code as code0_


from Introspec_Status introspecs0_ where introspecs0_.id=?


Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc
Hibernate: select statushist0_.status as status__, statushist0_.date as





date__, statushist0_.docId as docId__ from Introspec_History statushist0_ where statushist0_.docId=? order by statushist0_.date desc

You can clearly see the hibernate request being executed after passing through both postpipeline and catch(return) blocks.

Looking back at http://wiki.cocoondev.org/Wiki.jsp?page=RhinoWithContinuations, it seems obvious that catch(return) is only used with continuation objects





so it's ignored when calling sendPage().

But I think this is quite ambiguous:





If you want to execute Flowscript code after calling the view layer but




before control




leaves the interpreter, catch(return) will help




If "after calling the view layer" means "just after calling the view layer, but before it's completed", I can't see any use for this feature.

So far, it looks like there's no way to know when the view pipeline is completed, maybe this is to avoid problems if the view "re-entered" the





flow (just guessing) ?

Finally, I'd like to know if anyone can confirm what I'm reporting (I'm





running in a minimal cocoon environment and it's not impossible that I removed some needed components...) ?

Thanks,

Nicolas.


-----Original Message----- From: Leszek Gawron [mailto:[EMAIL PROTECTED] Sent: 10 juin, 2004 05:37 To: [EMAIL PROTECTED] Subject: Re: Flow + Hibernate and lazy initialization


Leszek Gawron wrote:




Well, I cannot see why the releasing cannot be done in the Javascript





statement following the sendPage... assuming the behaviour you observed was not just a bug in the Flowscript component, of course.




If this is as you say you should raise this problem at cocoon-dev. I also wanted to loose Open Session In View pattern in favor of some hibernate avalon component, but that looks impossible now.




See this[1], and this[2] and this[3] and this[4]

[1] http://marc.theaimsgroup.com/?t=108681937800001&r=1&w=2&n=2
[2] http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=105825181219265&w=2
[3]


http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=105825410721036&w=2


[4] http://wiki.cocoondev.org/Wiki.jsp?page=RhinoWithContinuations
        LG


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]









--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]







--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to