sdx-developers
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]