Gestione eventi
difficile
Registrazione zcml
Per il prodotto generale keywordannotator serve una gestione degli eventi che si attivi ogni volta che un oggetto che implementa l'interfaccia IAttributeAnnotatable viene modificato o aggiunto. Ciò viene registrato nel file configure.zcml in questo modo:
<subscriber
for="zope.app.annotation.interfaces.IAttributeAnnotatable
zope.app.event.interfaces.IObjectModifiedEvent"
handler=".events.annotationEventHandler" />
Con questo ci prendiamo curadegli oggetti modificati. Non vengono però trattati gli oggetti aggiunti. Per questi ultimi basta sostituire 'IObjectModifiedEvent' con 'IObjectCreatedEvent'.
Nel caso di quadapter serve una gestione degli eventi che si attivi solo per oggetti che implementano l'interfaccia IWeblogEntry:
<subscriber
for="Products.Quills.interfaces.IWeblogEntry
zope.app.event.interfaces.IObjectModifiedEvent"
handler="Products.keywordannotator.events.annotationEventHandler" />
Codice del gestore eventi
In keywordannotator il codice è questo:
def annotationEventHandler(ob, event):
from zope.component import getUtility
decider = getUtility(IAnnotationDecider, context=ob)
if decider.matchesKeywords(ob):
decider.provideInterfaces(ob)
Quindi questo gestore eventi cerca una utility. Quella utility specifica se l'oggetto per cui l'evento è stato scatenato è stato marcato come speciale con una keyword nel codice o meno. Se queste condizioni si verificano, l'utility viene istruita in modo che ora l'oggetto fornisca alcune interfacce in più.
Attenzione: quadapter usa semplicemente questo gestore eventi da keywordannotator senza sovrascriverlo.
Nella prossima sezione si vedrà come appare un'utility.