[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [sdx-developers] Compression pour OAI
From: |
Martin Sevigny |
Subject: |
Re: [sdx-developers] Compression pour OAI |
Date: |
Thu, 21 Jul 2005 20:41:14 +0200 |
User-agent: |
Mozilla Thunderbird 1.0.2 (Windows/20050317) |
Bonjour,
Dans le cas du gzip, il faut donc préciser le type de compression
accepté par l'entrepot, simplement en remplissant le champ compression
de la classe AbstractOAIRepository avec "gzip". Ainsi le verbe Identify
renvoit bien la compression acceptée.
C'est déjà ça.
Ensuite, si j'ai bien compris, les requetes pour l'entrepot arrivent
dans la classe OAIComponentImpl (plus précisément dans la méthode
acceptRequest pour l'entrepot) qui s'occupe ensuite de créer une
OAIRequest et une OAIResponse qui vont aller interroger l'entrepot et
AbstractOAIRepository s'occupera de renvoyer le résultat.
Je doute qu'il soit nécessaire d'aller jusque là.
Naïvement, j'aurais tendance à dire que la compression devrait se faire
au niveau du pipeline Cocoon, donc complètement en dehors du code OAI de
SDX.
Sauf que si je comprends bien ton problème, c'est que tu veux de la
compression uniquement dans certains cas (accepte compression,
ListRecords, ...).
Bref, tu veux un pipeline diférent en fonction de la requête et de
structures internes.
Selon moi, la seule façon de faire cela est de faire une action dans le
pipeline qui va déterminer le mode d'envoi (compressé ou non) et le bon
pipeline à exécuter.
-->L'OAIRequest est alors stockée dans OAIResponse, c'est donc dans
l'un ou l'autre que l'on peut stocker également le type de compression
qu'il va falloir utiliser en retour si le verbe est bien ListRecords.
J'ai personnelement choisi de ranger cette compression dans l'OAIRequest
avec 1 attribut compression et 2 méthodes getCompression et
setCompression pour le mettre à jour ou le récupérer.
-->La méthode acceptRequest d'OAIComponentImpl devrait donc s'occuper
de récupérer l'accept-encoding de l'entete HTTP... c'est ce que j'ai
essayé de faire sans savoir si ca fonctionne (pour le moment) et ensuite
la méthode sendResponse de l'OAIResponse est appellé et elle va
permettre de réaliser les requetes adéquates en fonction du verbe envoyé
et elle va également créer l'arbre XML envoyé à SAX pour que celui-ci
réponde à la requete. Pour le gzip, il faudrait peut etre utiliser le
serializer GzipXMLSerializer pour que cette donnée soit compressé avant
d'etre envoyé à SAX... La j'ai des difficultés de compréhension
vis-à-vis de cocoon et ses serializer dont je n'ai pas bien bien compris
le fonctionnement, je ne sais pas bien non plus quand l'arbre est
envoyé, est lorsqu'on fait un setConsumer ? Est ce que la compression
avec le serializer Gzip peut etre uniquement gérée dans la fonction
sendRecord de la classe LuceneDocumentBaseOAIRepository.
--> ensuite, pour l'entrepot, il reste à renvoyer l'entete HTTP
content-Encoding qui indiquera au client dans quel compression est mis
la donnée qui suit. Je ne sais pas où je peux faire ca.
Le sérialiseur va faire tout cela comme un grand. Du moins je crois.
Pour tester, as-tu juste essayé de modifier le pipeline approprié pour
lui mettre un sérialiseur, sans rien modifier d'autre? Je pense que ça
sera déjà une grande partie de la réponse!
Il ne manque que le Identify (que tu as déjà fait semble-t-il) et le
test pour savoir si on doit envoyer compressé.
D'ailleurs, pour simplifier, pourquoi ne pas toujours envoyer compressé
si le client l'accepte?
Pour la moissonneuse, je suis parti de la fonction sendResponse de
OAIComponentImpl qui appelle la fonction receiveSynchronizedRequest,
j'ai supposé que celle-ci s'occupe d'envoyer une requete à l'entrepot
mais je n'en suis pas sur du tout du tout. Si c'est le cas, il faudrait
donc que l'on écrive "accept-encoding= gzip;q=1.0, identity;q=0.5" dans
l'entete HTTP.
Je pense que les "sources" Cocoon peuvent faire cela. Dans
AbstractOAIHarvester, on ajoute des paramètres, il n'y a qu'à ajouter
celui-ci en plus.
Ensuite, j'ai cru voir que la moissonneuse se préparait à recevoir un
d'enregistrement lorsqu'elle en avait la demande (GetRecord ou
ListRecords) avec prepareRecordCapture qui s'occupait alors de préparer
la réception des données et donc à priori du XML en utilisant un
serializer XML mais si on risque de recevoir du gzip, il faudrait que la
classe qui recoit la requete, l'analyse pour stocker le content-encoding
afin d'utiliser le serializer XMLSerializer ou le serializer
GzipXMLSeralizer en fonction de la compression demandée. Ou
faudrait-t-il alors stocker cette compression? dans l'AbstractOAIHarvester?
Je ne sais pas... Mais avant d'aller trop loin je m'intéresserais à ce
que peuvent faire Cocoon/Excalibur avec des "Sources". SDX utilise
URLSource, qui n'a pas l'air à supporter la compression (de manière
transparente), mais peut-être que d'autres classes le font.
L'idée ici est d'être transparent. En quelque sorte, le fait que le flux
arrive compressé ne devrait pas concerner le coeur du code...
Vous l'aurez compris pour ceux qui auront lu ce post jusqu'au bout que
je n'ai pas encore bien bien compris le fonctionnement de SDX
Ou de Cocoon plutôt ?
A bientôt,
Martin Sévigny