Hi Vincent,
Vincent Massol wrote:
> Here's my latest proposal:
>
> /**
> * Components wanting to receive Observation {...@link Event events}
> must implement this interface.
> *
> * @version $Id: EventListener.java 10164 2008-06-09 12:44:53Z
> sdumitriu $
> */
> public interface EventListener
> {
> /**
> * @return the listener's name. It's a free form text identifying
> this listener instance in a unique manner.
> * This name is used for some operations in {...@link
> ObservationManager}.
> */
> String getName();
>
> /**
> * @return the list of events this listener is configured to
> receive. This listener will be automatically
> * registered with this list of events against the {...@link
> ObservationManager}. For each matching event
> * the {...@link #onEvent(Event, Object, Object)} method
> will be called.
> */
> List<Event> getEvents();
>
> /**
> * The {...@link org.xwiki.observation.ObservationManager} calls
> this methods when an event matches the events for
> * which this listener is registered (see {...@link #getEvents()}.
> *
> * @param event the event triggered. Can be used to differentiate
> different events if your Object supports several
> * events for example.
> * @param source the event source i.e. the object for which the
> event was triggered. For example this would be the
> * document Object if the event is a document update
> event.
> * @param data some additional and optional data passed that can
> be acted on.
> */
> void onEvent(Event event, Object source, Object data);
> }
>
> And:
>
> /**
> * The main orchestrator for event notification. To receive events
> create a component implementing the
> * {...@link EventListener} interface. Your component will be
> automatically registered when this Observation
> * Manager component is loaded. To send events to all registered
> listeners, call one of the
> * {...@link #notify} methods.
> *
> * @version $Id: ObservationManager.java 20537 2009-05-26 20:41:25Z
> vmassol $
> */
> @ComponentRole
> public interface ObservationManager
> {
> /**
> * Manually add a listener. Components implementing the {...@link
> EventListener} interfaces are only loaded
> * when the Observation Manager component is created. Thus if you
> need to add a new listener while the
> * system is running you'll need to call this method.
> *
> * @param event the event to register the listener against; acts
> as a template that filters out only specific events
> * the listener is interested in
> * @param eventListener the listener to register
> */
> void addListener(EventListener eventListener);
>
> /**
> * Remove a listener from the list of registered listeners. The
> removed listener will no longer receive events.
> *
> * @param listenerName the name of the listener to remove (must
> match {...@link EventListener#getName()}
> */
> void removeListener(String listenerName);
>
> /**
> * Adds an Event to an already registered listener.
> *
> * @param listenerName the name of the listener to which the
> event must be added
> * (must match {...@link EventListener#getName()}
> * @param event the event to add to the matching listener
> */
> void addEvent(String listenerName, Event event);
>
> /**
> * Removes an Event to an already registered listener.
> *
> * @param listenerName the name of the listener to which the
> event must be removed
> * (must match {...@link EventListener#getName()}
> * @param event the event to remove to the matching listener
> */
> void removeEvent(String listenerName, Event event);
>
> /**
> * Remove a listener from a specific event.
> *
> * @param event the event to remove the listener from.
> * @param eventListener the listener to remove.
> */
> void removeListener(Event event, EventListener eventListener);
I don't understand why sometimes you use the name of the listener (a
String) to identify it and some times a reference (EventListener). Why
does the ObservationManager need a listener name? I'm asking because in
the event systems I know (like the DOM event system) there's no need for
such a name.
Thanks,
Marius
>
> /**
> * Call the registered listeners matching the passed Event.
> * The definition of <em>source</em> and <em>data</em> is purely
> up to the communicating classes.
> *
> * @param event the event to pass to the registered listeners
> * @param source the source of the event (or <code>null</code>)
> * @param data the additional data related to the event (or
> <code>null</code>)
> */
> void notify(Event event, Object source, Object data);
>
> /**
> * Convenience front-end where the additional data parameter is
> <code>null</code>.
> *
> * @param event the event to pass to the registered listeners
> * @param source the source of the event (or <code>null</code>)
> * @see #notify(org.xwiki.observation.event.Event, Object, Object)
> */
> void notify(Event event, Object source);
> }
>
> This allows adding events after the listener is registered thus
> allowing Sergiu's use case in the Localization module.
>
> WDYT?
>
> Thanks
> -Vincent
>
> On May 28, 2009, at 1:59 PM, Sergiu Dumitriu wrote:
>
>> Sergiu Dumitriu wrote:
>>> 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
>>> +1
>>>
>>>> * Add List<Event> EventListener.getEvents() (the events that the
>>>> listener handles)
>>> Hm, I'm not sure about this. A document watcher will dynamically
>>> add and
>>> remove events to the list of monitored resources. We could have this
>>> method to be called for the initial registration, as otherwise it's
>>> hard
>>> to do the initialization.
>>>
>>> +0
>> Also, this requires that the ComponentManager is Initializable,
>> otherwise it won't actually register anything.
>>
>>>> * Inject List<EventListener> in DefaultObservationManager. Thus when
>>>> the Observation Manager is looked up, all listener components are
>>>> created and injected.
>>> +1
>>>
>>>> * 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);
>>> -1. See above, a component with a dynamic list of events will need to
>>> register/unregister just one in a long list. So we do need the
>>> existing
>>> signatures. Maybe add these signatures, but also keep the existing
>>> ones.
>>>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs