On Nov 10, 2010, at 10:12 AM, Stefan abageru wrote:

> On 11/10/2010 10:57 AM, Vincent Massol wrote:
>> Hi Stefan,
>> 
>> On Nov 10, 2010, at 9:08 AM, Stefan abageru wrote:
>> 
>>> Hi devs !
>>> 
>>> I thought about adding some changes in Events and Activity Stream.
>>> 
>>> First of all, I want to remove all the listeners from Activity Stream
>>> and make this class listen to AllEvent, making it capable of cathcing
>>> all events that occur in the wiki (and this way, when adding a new
>>> event, you wouldn't need any modifications to this class in order to
>>> catch it).
>> How do you filter events to process? If you don't how would you display for 
>> example view events or internal events such as component manager descriptor 
>> added/removed event, or the new event being added by Anca for the XAR import?
>> 
> There would ne no filtering since IMO ActivityStream records the 
> activities happening in the wiki. Should there be some filtering ?

There are some events that are internal events and I don't think they should be 
displayed.

+ I don't know how the display will scale for view Events for ex (which can be 
received about 1000 times per second).

>>> Secondly, I would like to modify onEvent function in the class so that
>>> it uses the simpleClassName of the event occurred in order to log the
>>> event (the eventType would be this simpleClassName...for example
>>> DocumentSavedEvent, AnnotationAddedEvent and so on).
>> I don't agree with this, or I don't understand it. You get the Event object 
>> so you can easily get the simple class name by calling 
>> event.getClass().getSimpleClassName().
>> 
> Yes..right now the implementation does a test of instanceOf on the event 
> received (there is an awful if then else) and selects the type of event 
> from the class ActivityEventType static fields. By this modification we 
> can remove that if then else and use classname instead of the strings 
> from ActivityEventType.

Why do you need to do an instanceof?

>>> And thirdly i thought about adding one field in AbstractFilterableEvent
>>> called /identifier/ and make all events extend directly this class.
>> Again I don't agree. A notion of event identifier is not linked to a 
>> Filterable event IMO but to the Event class itself.
>> 
>>> And
>>> that /identifier/ would be used in a different way by the events
>>> themselves. But it would be used to retrieve infos about that events.
>>> And so, when logging an event, we could use classname + identifier.
>>> For example
>>> AnnotationAddedEvent + "This is my annotation" .
>>> CommentAddedEvent + "This is my comment" or the number of the comment.
>> I don't quite agree. If it's supposed to be an identifier it must be unique 
>> and leaving the unicity to the user will not guarantee it's unique. I'm not 
>> sure what you want to do:
>> 1) Be able to differentiate 2 events. For what reason?
>> 2) Be able to have some description of the events. Again for what reason?
>> 
> The identifier field..I see it as a way so identify and specify more 
> data about the event itself. For example, i think it is important do 
> differentiate 2 CommentAddedEvent and not jusrt specify that they 
> occurred in a list of events and i would do this by this field.
> The advantage of this field would be that it would be known in a generic 
> way and access to it would be easily done. There would be no need of the 
> sync you said between the listener and the emmiter. I aslways know i 
> will receive a class extending AbstractFilterableEvent, I can get the 
> identifier field. Maybe move it to Event itself ?

How do you ensure unicity? And I don't think you're using this field in the 
correct way. You seem to be needing extra data about the event in order to 
perform some logging/display. The field to use for this is the data field. 
Having a data field in Event rather than in EventListener.onEvent() doesn't 
change anything for the sync... :)

>> Now if you need extra data, this is already taken into account in the 
>> onEvent method:
>> void onEvent(Event event, Object source, Object data);
>> 
>> The data parameter is there to pass extra data.
>> The way to use it is to create compound objects if you need to pass several 
>> data.
>> 
>> However for easiness of use, I'd agree to transform the signature into:
>> void onEvent(Event event, Object source, Object... data);
>> 
>> All that said, we have a small issue in that the listener of events need to 
>> know what type of data get passed and thus emitter and listeners must be in 
>> sync. Thus a generic listener will always have a problem since it won't know 
>> the type of objects it receives (since they're different for each event). 
>> Thus for me, when you have a generic listener you also need an 
>> EventActionHandler that needs to be registered against the generic listener 
>> so that it know what to do with the extra data passed.
>> 
>> How would you handle anonymous events in the Activity Stream (AS) listener? 
>> BTW what actions do you need to do with received events in the AS?
> About anonymous events. I do not know exactly what you mean by that.
> In AS i need to record them by doing a call to 
> addDocumentActivityEvent(streamName, currentDoc, eventType, msgPrefix + 
> eventType, params, context);

Why only Document (Event can be about anything)?

In general I don't like this proposal as it is because it doesn't address the 
real problem. It's moving it from onEvent() to a field in Event, adding even 
more complexity since there would be two ways of passing information. I'm -1 on 
it right now, especially since it breaks API without solving the issue. We need 
to address the sync issue.

Thanks
-Vincent

> eventType would the the simple class name and the identifier would go in 
> the params list.
> 
> Thanks,
> Stefan
>> Thanks
>> -Vincent
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to