On May 28, 2009, at 10:37 AM, Vincent Massol wrote:

> Note that what I proposed doesn't work since it's not possible to  
> register a component with 2 roles (for the same component instance)  
> in plexus AFAIK. Thus you'd need 2 components: one for the listener  
> and another one for the main business logic. Then the pb arises of  
> how to pass information from one to another...
>
> Still looking for a simple solution to that (I have one but it's too  
> complex). If you have any idea, shoot.

I spoke too fast. I think this solution could work:

@Component
DefaultMacroManager implements MacroManager
{
       private Map macros;

       public Macro getMacro(...)
       {...}

      public void registerMacro(...)
      {...}
...
}

@Component("macro")
MacroManagerListener implements ObservationListener
{
     @Requirement
     MacroManager mm;

     void onEvent(Event event)
     {
         mm.registerMacro(...);
...
}

The only "downside" is that it forces MacroManager (in our example) to  
add a public method registerMacro which was not needed before. Is that  
a problem?

Is there a better solution?

Thanks
-Vincent

> On May 26, 2009, at 10:19 PM, Vincent Massol wrote:
>
>> Hi,
>>
>> There's a pb with the current implementation:
>> When we get the Observation manager implementation and list the  
>> registered listeners we only get the components that have been  
>> initialized *before* we get the Observation manager component. Thus  
>> if we want to be sure all listeners will receive events we need to  
>> ensure they're loaded first. This is hard to do.
>>
>> I'm proposing instead to modify the observation module:
>>
>> * Modify EventListener to be a @ComponentRole
>> * Add List<Event> EventListener.getEvents() (the events that the  
>> listener handles)
>> * Inject List<EventListener> in DefaultObservationManager. Thus  
>> when the Observation Manager is looked up, all listener components  
>> are created and injected.
>> * Keep add/removeListener in ObservationManager so that listeners  
>> can be manually added/removed (for ex if a new listener component  
>> is added dynamically in the system) but with following signatures:
>> - addListener(EventListener);
>> - removeListener(EventListener);
>>
>> WDYT?
>>
>> Thanks
>> -Vincent
>>
>

_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to