Geoff Howard wrote:
> 
> Unico,
> 
> Thanks for taking a look at this with me, comments inline:
> 
> Unico Hommes wrote:
> > I've checked out your event-cache code just now and like to 
> make some 
> > comments.
> > 
> > One thing I found was that the EventRegistry.init() method 
> breaks IoC 
> > in Avalon. I think it's better to have initialization be 
> done by the 
> > Avalon container as part of lifecycle handling. This way Avalon can 
> > control when the component gets initialized. Since 
> EventRegistry has a 
> > thread-safe lifestyle the same instance is available to other 
> > components as well. A property that tells whether or not persistent 
> > state was successfully regained would allow this.
> 
> I agree, and at various stages on my HDD it was that way.  
> IIRC the issue I never solved cleanly was the fact that it 
> needed to tell the
> Cache(Store) if there was a problem retrieving persistent 
> state.  At the time though I was not as confident in the 
> lifecycle contract regarding dealing with other components in 
> initialize().  But I now think IoC can be done more cleanly 
> there pretty easily.
> 
> > The other thing I was wondering about is why not use Store 
> component 
> > in DefaultEventRegistryImpl so that it won't have to handle 
> > persistence itself?
> 
> I thought of that, but thought there could potentially be 
> some circular issues there that I didn't have brain cycles to 
> think through carefully. 
>     Actually, it could be the opposite: it may get rid of 
> some of the issues with failing to retrieve persistent state, 
> since it would either all be there together or not.

Hey yeah, I hadn't thought of that one yet :)

> 
> > I have been thinking about an easy way to add all this 
> functionality 
> > to the pipeline and figure that a nice way to do it is to 
> have a sort 
> > of EventCacheGenerator that wraps any sitemap defined generator, 
> > delegating al the real generating to the wrapped generator 
> but taking 
> > care of the handing out of Validity objects based on parameters it 
> > gets from the
> > sitemap:
> > 
> > <map:match pattern="blah">
> >   <map:generate type="event-cache">
> >     <map:parameter name="delegate" value="file" />
> >     <map:parameter name="event-type" value="name-value" />
> >     <map:parameter name="event-name" value="db-table" />
> >     <map:parameter name="event-value" value="customers" />
> >   </map:generate>
> >   <map:serialize />
> > </map:match>
> 
> > This way we get event-cacheable sitemap components without 
> having to 
> > add that functionality to each individual sitemap component.
> 
> That's an excellent idea.  You can see from the sample 
> extended file generator in the block (which serves no purpose 
> ATM) that I was thinking it would have to get handled by 
> individually extending each Generator. 
> Delegation would be much better.

Great.

> 
> > This is actually based on a use case that came up yesterday 
> from one 
> > of our site developers. He uses cinclude transformer for content 
> > aggregation. Some parts are generated from a backend for 
> which we have 
> > an event-cache equivalent system in place. The cinclude transformer 
> > has only a timeout sort of caching mechanism as you may 
> know, but our 
> > client's case requires real-time updates so we can't use 
> that. Instead 
> > he needs the content-aggregating pipeline to be invalidated 
> at certain 
> > backend events as well. In this case probably a declaratively more 
> > sound approach would be to also have a Transformer wrapper 
> for event-cache.
> > 
> > If you want I could code these up and send them to you? What do you 
> > think?
> 
> That'd be great - except it'd be better to send a patch 
> through Bugzilla so I'm not the only one who can act, and so 
> it doesn't get lost.  When my wife & kids get back this 
> afternoon I may be out of commission for a few days!

OK, I'll do that then.

There is one more thing I was thinking about earlier. The EventAware
interface could also function as a component interface. Clients that
want to send Events need to do the following now:

cache = (Cache) componentManager.lookup(Cache.ROLE);
if (cache instanceof EventAware) {
  ((EventAware) cache).processEvent(event);
}

Wouldn't it be better to have them say:

eventAware = (EventAware) componentManager.lookup(EventAware.ROLE);
eventAware.processEvent(event);


Regards,
Unico

Reply via email to