A-ha! So if I have a component that implements this that component will auto-magically be registered and receive the call-back?
Thanks, Ezra Epstein Amazon.com - Developer Tools 206-266-2259 -----Original Message----- From: Jesse Kuhnert [mailto:[EMAIL PROTECTED] Sent: Tuesday, October 10, 2006 4:32 PM To: Tapestry users Subject: Re: Tapestry page (and other) event listeners I'd have to dig into the code to be sure I understood all points but I don't think addPageBeginRenderListener is called by user code most of the time. .. If you page implements one of the various Listener classes (like umm... PageBeginRenderListener) - the framework will detect it and perform the necessary registrations for you automatically when it enhances the page class the first time. On 10/10/06, Epstein, Ezra <[EMAIL PROTECTED]> wrote: > > The common idiom for listener registration (Swing, Java Beans, etc.) > is that the remove() method returns the listener and the add() method > only adds a listener if it's not already listening. Tapestry's impl > follows neither of these approaches. Is there a reason for the naïve > implementation of the methods like > > void addPageBeginRenderListener(PageBeginRenderListener listener) > > ? A LinkedHashSet() would give the ordering of the current ArrayList > implementation plus the uniquing properties of a set... > > Thanks, > > Ezra Epstein > Amazon.com - Developer Tools > 206-266-2259 > > > -----Original Message----- > From: Jesse Kuhnert [mailto:[EMAIL PROTECTED] > Sent: Tuesday, October 10, 2006 1:09 PM > To: Tapestry users > Subject: Re: How to observe property binding events > > I'm not sure what the requirements are wrt properties and specific users. > > I've done similar things on a "per request" basis via doing something > like: > > public abstract int getProp(); > public abstract void setProp(int value); > > public int getComplicatedValue() > { > if(getProp() == -1) { > // do something complicated > setProp(newVal); > } > > return getProp(); > } > > The idea being that the heavy operation will only happen once for that > request/response cycle. > > This all changes if you want it to be done for "all users" ? You can > do that as well I suppose but I think I probably need more > clarification on who the properties are supposed to be exposed to/etc.. > > On 10/10/06, Epstein, Ezra <[EMAIL PROTECTED]> wrote: > > > > That's the opposite of the functionality I want. These are not PER > > request. They are per instance of a component. Thus true instance > > variables are the way to go. Tapestry recycles Components and it > > seems that within a request the same component is re-used but not > > cleared (ivars reset) even though it is re-parametrized. So, I > > don't think request vars would work. > > > > Thanks, > > > > Ezra Epstein > > Amazon.com - Developer Tools > > 206-266-2259 > > > > > > -----Original Message----- > > From: andyhot [mailto:[EMAIL PROTECTED] > > Sent: Tuesday, October 10, 2006 12:35 AM > > To: Tapestry users > > Subject: Re: How to observe property binding events > > > > Why store them in local variables? > > Store it in the current request cycle... > > First do a cycle.getAttribute("myexpensivevar") if that returns > > null, do the computations and store the result back > > cycle.setAttribute ("myexpensivevar",obj); > > > > See > > > > http://tapestry.apache.org/tapestry4/tapestry/apidocs/org/apache/tap > > es > > try/IRequestCycle.html > > > > > > Epstein, Ezra wrote: > > > OK, let's get to brass tacks. > > > > > > I have some derived values that are somewhat expensive to compute > > > so I > > compute them once per request/response cycle and then they're in > > local instance variables (non-persisted). > > > > > > The particular component in question (with the semi-expensive > > > derived > > values) is used inside a loop and so may appear multiple times on a > > page. By default the first time I use the component I compute the > > value and then display from that computed value... The 2nd, 3rd, > > etc instance of those component on the page is actually the exact > > same Java instance and so the computed/derived ivar is still set. > > I've added a hack that records an original property value when the > > derived ivar is computed and if the original and current property > > values don't match I reset the derived ivar. It works, but it a total hack. > > > > > > The common way I'd imagine doing it is to listen to when the > > > property > > (parameter) is set by Tapestry. But now that I've lain out the use > > case maybe some knows the "right" way to do this in Tapestry. > > > > > > > > > Thanks, > > > > > > Ezra Epstein > > > > > > > > > -----Original Message----- > > > From: Jesse Kuhnert [mailto:[EMAIL PROTECTED] > > > Sent: Monday, October 09, 2006 3:33 PM > > > To: Tapestry users > > > Subject: Re: How to observe property binding events > > > > > > There's also the org.apache.tapestry.event.ChangeObserver > > > interface, though this is currently only used by the services in > > > tapestry.persist to observe page property changes when they are > > > being managed via a particular persistence strategy. (like > > > session/client/etc..) > > > > > > ~Maybe~ it's an oversight, and maybe not..I guess that depends on > > what/why you are trying to do. You'll find that there is very little > > in the framework that wasn't put there for an actual need, so adding > > in support for things that no one has needed yet doesn't seem to > > fall in line with sound design. > > > (imho of course..) > > > > > > If you can outline why you need this, and exactly what > > properties/conditions you'd want to observe we might be able to work > > something out...A general "anything" is harder to understand / > > design around. > > > > > > There is no such thing as a "parameter" property listener because > > parameters have no meaning in the context of something taking a > > parameter...There has to be a source for that parameter value > > (usually a page ) somewhere. > > > > > > On 10/9/06, Epstein, Ezra <[EMAIL PROTECTED]> wrote: > > > > > >> Hi Jesse, > > >> > > >> Thanks for that reply. > > >> > > >> If I read it correctly, it sounds, simply, like the framework is > > >> missing this feature. It's a pretty common thing to ask for > > >> listener call-backs on framework events. ("Listener" here in the > > >> generic sense rather than the way tapestry uses the term for > > >> direct-link > > >> targets.) In short, this sounds like a design over-sight. It's > > >> common when beans are bound to be able to receive a call-back -- > > >> Hibernate, for example, offers this. So much of Tapestry seems > > >> "automagic" I'm surprised that there's no way to register to be > > informed of the events as they occur. > > >> > > >> If Howard's reading this perhaps he has a better perspective that > > >> he may offer. > > >> > > >> Thanks, > > >> > > >> Ezra Epstein > > >> Amazon.com - Developer Tools > > >> 206-266-2259 > > >> > > >> > > >> -----Original Message----- > > >> From: Jesse Kuhnert [mailto:[EMAIL PROTECTED] > > >> Sent: Friday, October 06, 2006 7:22 PM > > >> To: Tapestry users > > >> Subject: Re: How to observe property binding events > > >> > > >> Yes, but the usefulness of my answer largely depends on how > > >> clever/efficient you are trying to be doing it. > > >> > > >> Now, there is IBinding. The one object to bind them all ;) > > >> > > >> If you work your way down the type hierarchy you'll find > > >> AbstractBinding, which holds the method you care about most - > > >> "setObject". This will be called by tapestry when managing all of > > >> the > > page properties "automagically" > > >> for you. > > >> > > >> Some of the magic happens in (for your exact case at least) > > >> org.apache.tapestry.enhance.ParameterPropertyWorker. > > >> > > >> The other half of the work happens in each specific binding > > >> implementation that will handle these set/get object calls..(Like > > >> ognl bindings, etc..) > > >> > > >> I'm not sure where you are going with this but I guess you could > > >> use the hivemind chain of command service sort of configuration > > >> (like I did for > > >> org.apache.tapestry.services.ComponentRenderWorker > > >> ) to generically call a single interface method for a hivemind > > >> configuration point...Then you can contribute as many workers > > >> into the chain you like if you decide that you have more than one > > >> use for > > it. > > >> > > >> Again...Not knowing what you are doing - and taking the exact > > >> parameters given I'd probably extend and override the default > > >> ParameterPropertyWorker (a hivemind service, so replacing it > > >> inline with what Tapestry does already should be easy ) and just > > >> override whatever section of code I needed to in that > > >> implementation to inject + > > call my service reference. > > >> > > >> It may look a little complicated in there at first, but the whole > > >> org.apache.tapestry.enhance package is filled with lots of > > >> different enhancement works - and most of them inject a service > > >> into the object they work on...So finding an easier to follow > > >> worker to reference before modifying ParameterPropertyWorker > > >> might be > easier. > > >> > > >> Hope that helps. > > >> > > >> On 10/6/06, Epstein, Ezra <[EMAIL PROTECTED]> wrote: > > >> > > >>> I've got a component which accepts a parameter. I want to > > >>> listen (receive a callback) when the parameter is set (bound). > > >>> Does Tapestry provide such a facility? > > >>> > > >>> Thanks, > > >>> > > >>> Ezra Epstein > > >>> > > >>> > > >>> > > >>> > > >>> > > >> -- > > >> Jesse Kuhnert > > >> Tapestry/Dojo/(and a dash of TestNG), team member/developer > > >> > > >> Open source based consulting work centered around > > >> dojo/tapestry/tacos/hivemind. http://blog.opencomponentry.com > > >> > > >> ----------------------------------------------------------------- > > >> -- > > >> -- To unsubscribe, e-mail: [EMAIL PROTECTED] > > >> For additional commands, e-mail: [EMAIL PROTECTED] > > >> > > >> > > >> > > > > > > > > > -- > > > Jesse Kuhnert > > > Tapestry/Dojo/(and a dash of TestNG), team member/developer > > > > > > Open source based consulting work centered around > > > dojo/tapestry/tacos/hivemind. http://blog.opencomponentry.com > > > > > > ------------------------------------------------------------------ > > > -- > > > - To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > -- > > Andreas Andreou - [EMAIL PROTECTED] - http://andyhot.di.uoa.gr > > Tapestry / Tacos developer Open Source / J2EE Consulting > > > > > > -------------------------------------------------------------------- > > - 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] > > > > > > > -- > Jesse Kuhnert > Tapestry/Dojo/(and a dash of TestNG), team member/developer > > Open source based consulting work centered around > dojo/tapestry/tacos/hivemind. http://blog.opencomponentry.com > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Jesse Kuhnert Tapestry/Dojo/(and a dash of TestNG), team member/developer Open source based consulting work centered around dojo/tapestry/tacos/hivemind. http://blog.opencomponentry.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]