Utility
difficile
Registrazione zcml
In keywordannotator appare in questo modo:
<utility
provides=".interfaces.IAnnotationDecider"
factory=".events.DefaultAnnotationDecider" />
Ciò significa che quando del codice ha bisogno di un'utility che fornisca l'interfaccia IAnnotationDecider (il codice del gestore eventi lo richiede, vedere sopra), questa utility può essere creata richiamando la classe DefaultAnnotationDecider nel file events.py nel prodotto keywordannotator.
Quadapter sovrascrive questa utility in overrides.zcml:
<utility
provides="Products.keywordannotator.interfaces.IAnnotationDecider"
factory="Products.quadapter.events.AudioDecider" />
Dato che si tratta di una riscrittura, significa che l'unica maniera per creare un'utility che fornisca l'interfaccia IAnnotationDecider, è ora richiamare la classe AudioDecider nel file events.py nel prodotto quadapter.
Codice di una utility
Quindi come appare il codice? In keywordannotator appare in questo modo:
class DefaultAnnotationDecider(object):
implements(IAnnotationDecider)
keywords = KEYWORDS
ifaces = (IKeywordMatch,)
def matchesKeywords(self, object):
...
def provideInterfaces(self, object):
for iface in self.ifaces:
if not iface.providedBy(object):
alsoProvides(object, iface)
L'implementazione della funzione 'matchesKeywords' non interessa per il momento. Controlla semplicemente se le keyword dell'oggetto corrispondono a qualcuna delle keyword speciali. Di default, solo la parola letterale 'special' è considerata speciale.
La funzione provideInterfaces è invece più interessante. Si assicura che un certo oggetto fornisca tutte le interfacce desiderate. Di default si tratta dell'interfaccia marker IKeywordMatch. Nella sezione seguente si mostrerà come si registra un adapter per oggetti che implementano quell'interfaccia.
In quadapter il codice di un'utility è costituita solo da 4 righe:
class AudioDecider(DefaultAnnotationDecider):
implements(IAnnotationDecider)
keywords = KEYWORDS
ifaces = PROVIDE_INTERFACES
Usa una lista differente di keyword che sono considerate speciali, e interfacce differenti che devono essere fornite agli oggetti che corrispondono a una delle keyword. Questi valori sono specificati nel file config.py:
KEYWORDS = ['audio', 'preken']
PROVIDE_INTERFACES = (IMaudio, IAttributeAnnotatable,)
Nota: 'preken' è il termine olandese per 'sermoni'.
Quindi, con poche linee, il prodotto quadapter cambia l'adapter di default in modo che reagisca a differenti keyword e fornisca interfacce diverse.
Si noti il fatto che una WeblogEntry di Quills non fornisce di default l'interfaccia IAttributeAnnotatable, bisogna quindi istruire l'utility per far si che le WeblogEntry con una delle keyword speciali implementino ora anche quell'interfaccia. Se lo si desidera, si può anche aggiungere del codice a quadapter in modo che tutte le WeblogEntry forniscano anche l'interfaccia IAttributeAnnotatable; in questo caso bisogna riferirsi al file utils.py di keywordannotator.
A questo punto sarebbe opportuno riguardare il codice del gestore eventi per vedere come usa questa utility.
