<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Vincent Bonamy</title>
  <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/</link>
  <atom:link href="http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Ceci est un blog professionnel. 
Les objectifs de ce blog sont multiples. Principalement, le but est de partager/mutualiser un certain nombre de choses, d'idées, de pratiques autour des sujets que je peux traiter durant mon travail au Centre de Ressources Informatique de Rennes1.
Je travaille autour de ORI-OAI, J2EE, Spring, JSF, Hibernate, Acegi, XML, LOM, OAI-PMH, Python, Zope, Plone (parfois du Ruby), XForms, etc.

Je suis ammené sur mon poste de travail Debian ou sur serveurs, à faire 
* du développement &quot;propre&quot; (repository subversion, documentation docbook mis à jour en fonction, etc.)
* du &quot;bricolage&quot; (scripts en tout genre, conversions de données, installation et utilisation de packages, etc.)
* de l'exploitation en tout genre (ldap, apache, tomcat, sauvegardesz de bds, etc).

Dans ce blog vous trouverez +/- en vrac des choses autour de cela simplement.

En tout cas, bonne lecture !</description>
  <language>fr</language>
  <pubDate>Mon, 03 Mar 2008 09:36:50 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Ajout d'une métadonnée dans un formulaire d'ORI-OAI-MD-EDITOR</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Ajout-dune-metadonnee-dans-un-formulaire-dORI-OAI-MD-EDITOR</link>
    <guid isPermaLink="false">urn:md5:789dce549ed3f70bd79eba26cf47d2b8</guid>
    <pubDate>Tue, 25 Dec 2007 08:51:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
        <category>ORI-OAI</category><category>XML</category>    
    <description>&lt;p&gt;XML permet d&amp;rsquo;étendre voir de concevoir entièrement des langages (applciations) XML. &lt;br /&gt;En
respectant les espaces de noms, on peut ainsi arriver à rester
complètement compatible avec un langage donné tout en ajoutant des
éléments et attributs propres.&lt;/p&gt;
&lt;p&gt;Pour plus d&amp;rsquo;informations la dessus, vous pouvez d&amp;rsquo;ailleurs consulter &lt;a hreflang=&quot;fr&quot; href=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/XML-et-les-espaces-de-noms&quot;&gt;ce billet&lt;/a&gt; précédent sur ce même blog.&lt;/p&gt;
&lt;p&gt;Ici, on montre comment on peut ajouter une métadonnée à un XML LOM
dans un espace de noms propre et comment on peut ensuite proposer à
l&amp;rsquo;utilisateur d&amp;rsquo;éditer ce XML dans le formulaire LOM de l&amp;rsquo;éditeur de
métadonnées ORI-OAI&amp;nbsp;: ORI-OAI-MD-EDITOR.&lt;/p&gt;
&lt;p&gt;=&amp;gt; en bref, ce billet tente d&amp;rsquo;expliquer comment on peut
facilement étendre/modifier (et en fait créer) un formulaire dans
ORI-OAI-MD-EDITOR basé, on le rappelle, sur Orbeon Forms.&lt;/p&gt;    &lt;h3&gt;Espace de noms Rennes1 et exemple d&amp;rsquo;XML LOM Rennes1&lt;/h3&gt;
Sur un ori-oai-md-editor d&amp;rsquo;installé et qui fonctionne, on va donc ici montrer comment créer un nouveau formulaire sur la base du formulaire LOM pour lui ajouter une nouvelle métadonnée.&lt;br /&gt;Ici on se place dans la position de l&amp;rsquo;Université de Rennes1 par exemple qui veut rajouter une métadonnée interne pour &quot;taguer&quot; ses ressources&amp;nbsp;: l&amp;rsquo;Université faisant partie de chacune des &lt;a hreflang=&quot;fr&quot; href=&quot;http://www2.educnet.education.fr/superieur/usages/unt/&quot;&gt;UNT&lt;/a&gt;, on souhaiterait en effet lors de l&amp;rsquo;indexation d&amp;rsquo;une ressource pédagogique préciser à quel UNT la ressource peut correspondre. &lt;br /&gt;Cela permet de cibler un certain publique ... pour rester souple, on utilisera plutôt un nom de balise comme targetPublic par exemple.&lt;br /&gt;&lt;br /&gt;Voici un exemple de fichier XML LOM étendu via un espace de noms et des balises propres à Rennes1 que l&amp;rsquo;on souhaiterait éditer dans notre nouveau formulaire donc&amp;nbsp;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;lom xmlns=&quot;http://ltsc.ieee.org/xsd/LOM&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:lomur1=&quot;http://www.univ-rennes1.fr/xsd/LOMUR1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;general&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;identifier&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;catalog&amp;gt;URI&amp;lt;/catalog&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry&amp;gt;http://www.univ-rennes1.fr/12345&amp;lt;/entry&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/identifier&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;string language=&quot;fr&quot;&amp;gt;Médecine Informatique et Écologie&amp;lt;/string&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- etc. --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/general&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;!-- etc. --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;lomur1:lomur1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lomur1:targetPublic&amp;gt;UMVF&amp;lt;/lomur1:targetPublic&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lomur1:targetPublic&amp;gt;UNIT&amp;lt;/lomur1:targetPublic&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lomur1:targetPublic&amp;gt;UVED&amp;lt;/lomur1:targetPublic&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/lomur1:lomur1&amp;gt;&lt;br /&gt;&amp;lt;/lom&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;Ce fichier est valide lomLoose, et on n&amp;rsquo;a pas forcément besoin de créer un schéma spécifique &quot;LOM-Rennes1&quot; pour notre besoin&amp;nbsp;: celui-ci reste interne, notre espace de noms n&amp;rsquo;a pas vocation à être utilisé en dehors de nos applications.&lt;br /&gt;Par contre, on distingue bien grâce aux espaces de noms le LOM de nos balises personnelles.&lt;br /&gt;&lt;br /&gt;Grâce aux espaces de noms, on peut noter que les différents modules peuvent travailler avec cet XML d&amp;rsquo;exemple ci-dessus&amp;nbsp;: l&amp;rsquo;éditeur ori-oai-md-editor peut éditer cet XML directement (aussi bien la version complète, que la version auteur).&lt;br /&gt;Cependant, il ne nous permet pas d&amp;rsquo;éditer la partie spécifique Rennes1 qu&amp;rsquo;il ne connait pas.&lt;br /&gt;&lt;br /&gt;C&amp;rsquo;est pourquoi on va réaliser un nouveau formulaire basé sur le formulaire LOM complet d&amp;rsquo;ori-oai-md-editor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Formulaire LOM Rennes1&lt;/h3&gt;
&lt;h4&gt;copier/coller&lt;/h4&gt;
Confère la &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/ori-workflow/&quot;&gt;documentation du ori-oai-md-editor&lt;/a&gt; (qui partage le projet sourcesup avec ori-oai-workflow), le répertoire spécifique à ori-oai-md-editor dans l&amp;rsquo;application Orbeon Forms est&amp;nbsp;:&lt;br /&gt;WEB-INF/resources/apps/ori-md-editor&lt;br /&gt;&lt;br /&gt;On va dupliquer le formulaire lom-full, je vous liste les commandes&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;[root@levain ori-md-editor]$ ls&lt;br /&gt;close.xhtml&amp;nbsp; config.xml&amp;nbsp; i18n&amp;nbsp; media&amp;nbsp; page-flow.xml&amp;nbsp; prototypes&amp;nbsp; reload-vocab&amp;nbsp; schemas&amp;nbsp; welcome&amp;nbsp; xforms&amp;nbsp; xml-blank&amp;nbsp; xpl&lt;br /&gt;[root@levain ori-md-editor]$ ls xforms/&lt;br /&gt;common&amp;nbsp; lom-author-light&amp;nbsp; lom-full&amp;nbsp; oaidc-full&lt;br /&gt;[root@levain ori-md-editor]$ cp -rf xforms/lom-full xforms/lom-full-extend&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;br /&gt;[root@levain ori-md-editor]$ cp xml-blank/lom-full-blank.xml xml-blank/lom-full-extend-blank.&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Les formulaires en tant que tels correspondent aux sous-répertoires du répertoire xforms (excepté le répertoire common).&lt;br /&gt;Les fichiers d&amp;rsquo;initialisation des formulaires en &quot;mode standalone&quot; (non connecté au workflow) sont les fichiers du répertoire xml-blank dont les noms doivent correspondre avec les noms des répertoires des formulaires.&lt;br /&gt;&lt;br /&gt;Dès maintenant &amp;rsquo;et sans redémarrer votre serveur ori-oai-md-editor, vous devez pouvoir utiliser ce nouveau formulaire directement.&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;http://ori-oai-workflow.univ-rennes1.fr/md-editor/ori-md-editor/lom-full-extend/blank&lt;/p&gt;
&lt;/blockquote&gt;&lt;h4&gt;svn update&amp;thinsp;!&lt;/h4&gt;
Pour ceux qui sont connectés via subversion (et cf &lt;a hreflang=&quot;fr&quot; href=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Exploitation-dapplications-avec-subversion-installation-et-mises-a-jour&quot;&gt;ce billet&lt;/a&gt;, on vous encourage vivement à procéder de la sorte) vous pouvez garder le répertoire .svn copié au passage dans&amp;nbsp; xforms/lom-full-extend, cela vous permet de continuer à vous synchroniser au répertoire lom-full du repository svn officiel de ori-oai-md-editor. Par contre pour ce faire vous devrez aller dans le répertoire lom-full-extend et faire un svn update indépendamment du svn update de l&amp;rsquo;ensemble&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;[root@levain ori-md-editor]$ cd xforms/lom-full-extend/&lt;br /&gt;[root@levain lom-full-extend]$ svn info&amp;nbsp; &lt;br /&gt;Path: .&lt;br /&gt;URL: http://subversion.cru.fr/ori-workflow/ori-oai-md-editor/trunk/WEB-INF/resources/apps/ori-md-editor/xforms/lom-full&lt;br /&gt;Repository Root: http://subversion.cru.fr/ori-workflow&lt;br /&gt;Revision: 471&lt;br /&gt;Node Kind: directory&lt;br /&gt;Schedule: normal&lt;br /&gt;Last Changed Author: vbonamy&lt;br /&gt;Last Changed Rev: 471&lt;br /&gt;Last Changed Date: 2007-12-16 14:05:14 +0100 (Sun, 16 Dec 2007)&lt;br /&gt;&lt;br /&gt;
[root@levain lom-full-extend]$ svn update&lt;br /&gt;
U&amp;nbsp;&amp;nbsp;&amp;nbsp; case-educational.xml&lt;br /&gt;
U&amp;nbsp;&amp;nbsp;&amp;nbsp; main-form.xhtml&lt;br /&gt;
Updated to revision 471.&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;prototype&lt;/h3&gt;
Dans XForms et Orbeon Forms, l&amp;rsquo;ajout de noeud via un bouton &quot;Ajouter un targetPublic&quot; correspond en fait à un copier coller d&amp;rsquo;un noeud existant &quot;ailleurs&quot;. Le &quot;ailleurs&quot; peut correspondre à une autre instance XML que celle que l&amp;rsquo;on édite. On appelle cela dans ori-oai-md-editor un pototype.&lt;br /&gt;&lt;br /&gt;Ici, on va ajouter un prototype pour le LOM Rennes1&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;[root@levain ori-md-editor]$ cd prototypes/&lt;br /&gt;[root@levain prototypes]$ cp lom-prototype.xml lom-rennes1-prototype.xml &lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;On y ajoute les tags vides qui vont bien, &lt;strong&gt;en n&amp;rsquo;oubliant pas de déclarer l&amp;rsquo;espace de noms. &lt;/strong&gt;(le fichier lom-rennes1-prototype.xml est attaché à ce billet)&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;....&lt;br /&gt;xmlns:lomur1=&quot;http://www.univ-rennes1.fr/xsd/LOMUR1&quot;&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lomur1:lomur1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lomur1:targetPublic/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/lomur1:lomur1&amp;gt;&lt;br /&gt;...&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Modification du formulaire&lt;/h3&gt;
On se place dans le formulaire nouvellement créé pour maintenant le modifier&amp;nbsp;: &lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;code&gt;[root@levain ori-md-editor]$ cd xforms/lom-full-extend/&lt;br /&gt;[root@levain lom-full-extend]$ ls&lt;br /&gt;case-annotation.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case-educational.xml&amp;nbsp; case-lifecycle.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case-relation.xml&amp;nbsp; case-technical.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dialog-taxonomy-search.xml&amp;nbsp; entity.xml&lt;br /&gt;case-classification.xml&amp;nbsp; case-general.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case-metametadata.xml&amp;nbsp; case-rights.xml&amp;nbsp;&amp;nbsp;&amp;nbsp; dialog-dewey-search.xml&amp;nbsp; dialog-vcard-search.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; main-form.xhtml&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ces différents fichiers sont des XForms. Les modifications que l&amp;rsquo;on va apporter correspondent à reprendre du code existant dans ces formulaires pour l&amp;rsquo;adpater à nos nouvelles balises, modifier les vocabulaires etc.&lt;br /&gt;Le fichier d&amp;rsquo;entrée du formulaire est en fait main-form.xhtml&lt;br /&gt;Dans ce fichier main-form.xhtml &lt;br /&gt;&lt;ul&gt;&lt;li&gt;on change le prototype utilisé (on recherche simplement lom-prototype.xml que l&amp;rsquo;on va changer par lom-rennes1-prototype.xml)&lt;br /&gt;&lt;blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;!-- LOM prototype --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:instance id=&quot;ori-prototype&quot; src=&quot;oxf:/apps/ori-md-editor/prototypes/lom-rennes1-prototype.xml&quot; xxforms:readonly=&quot;true&quot; xxforms:shared=&quot;application&quot;/&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;on ajoute un onglet rennes1 en dessous de celui de classification (en copiant collant celui de classification)&amp;nbsp;:&lt;br /&gt;&lt;strong&gt;&lt;blockquote&gt;&lt;p&gt;&amp;lt;widget:tab id=&quot;rennes1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;widget:label&amp;gt;Rennes1&amp;lt;/widget:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xi:include href=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/case-rennes1.xml&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/widget:tab&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
On va ensuite éditer un case-rennes1.xml en prenant exemple sur les autres case-*.xml en n&amp;rsquo;oubliant pas de déclarer l&amp;rsquo;espace de noms rennes1 et de l&amp;rsquo;utiliser&amp;thinsp;!&lt;br /&gt;&lt;br /&gt;Voici ce que peut donner ici un tel case-rennes1.xml&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&amp;lt;xforms:group ref=&quot;.&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xs=&quot;http://www.w3.org/2001/XMLSchema&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xforms=&quot;http://www.w3.org/2002/xforms&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ev=&quot;http://www.w3.org/2001/xml-events&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xxforms=&quot;http://orbeon.org/oxf/xml/xforms&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xi=&quot;http://www.w3.org/2001/XInclude&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f=&quot;http://orbeon.org/oxf/xml/formatting&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:lom=&quot;http://ltsc.ieee.org/xsd/LOM&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xhtml=&quot;http://www.w3.org/1999/xhtml&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:widget=&quot;http://orbeon.org/oxf/xml/widget&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:vocab=&quot;http://www.ori-oai.org/xsd/orioaivocab&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:lomur1=&quot;http://www.univ-rennes1.fr/xsd/LOMUR1&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;!-- Rennes1 --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;legend&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rennes1 - Metadonnees specifiques&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/legend&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;widget:ori-block element=&quot;lomur1:lomur1&quot; minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot; preceding-elements=&quot;lom:general | lom:lifeCycle | lom:metaMetadata | lom:technical | lom:educational | lom:rights | lom:relation | lom:annotation | lom:classification&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- targetPublic --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;fieldset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;legend&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; targetPublic ...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/legend&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;widget:ori-block element=&quot;lomur1:targetPublic&quot; minOccurs=&quot;0&quot; maxOccurs=&quot;unbounded&quot; parent-element=&quot;lomur1:lomur1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:select1 ref=&quot;.&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;[Select]&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;UMVF&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;UMVF&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;UNIT&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;UNIT&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;UVED&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;UVED&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;UNJF&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;UNJF&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;AUNEGE&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;AUNEGE&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;UOH&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;UOH&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:label&amp;gt;UNISCIEL&amp;lt;/xforms:label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xforms:value&amp;gt;UNISCIEL&amp;lt;/xforms:value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xforms:select1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/widget:ori-block&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/fieldset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/widget:ori-block&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/fieldset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/xforms:group&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;termes i18n ...&lt;/h3&gt;
Même si on a mis des termes en dur dans le XForms ci-dessus, la facilité des widgets qu&amp;rsquo;on donne dans ori-oai-md-editor nécessite le positionnement de paramètres i18n pour ajouter/supprimer les tags que l&amp;rsquo;on à rajouter. On ajoutera donc dans  i18n/fr_FR.xml la partie suivante (pensez à faire de même pour i18n/en_EN.xml&amp;nbsp;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- LOM Rennes1 - add ... --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add-lomur1&amp;gt;Ajouter un bloc Lomur1&amp;lt;/add-lomur1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;del-lomur1&amp;gt;Supprimer le bloc Lomur1&amp;lt;/del-lomur1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add-targetPublic&amp;gt;Ajouter un bloc TargetPublic&amp;lt;/add-targetPublic&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;del-targetPublic&amp;gt;Supprimer le bloc TargetPublic&amp;lt;/del-targetPublic&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Utilisation&amp;thinsp;!&lt;br /&gt;&lt;br /&gt;Vous devriez maintenant avoir un nouvel onglet dans votre éditeur de métadonnées&amp;thinsp;!&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/lom-rennes1/md-editor-rennes1.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Ajout-dune-metadonnee-dans-un-formulaire-dORI-OAI-MD-EDITOR#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Ajout-dune-metadonnee-dans-un-formulaire-dORI-OAI-MD-EDITOR#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/238</wfw:commentRss>
      </item>
    
  <item>
    <title>Affichage de quelques métadonnées d'un cours choisi aléatoirement : interaction ORI-OAI et Zope</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Affichage-de-quelques-metadonnees-dun-cours-choisi-aleatoirement-%3A-interaction-ORI-OAI-et-Zope</link>
    <guid isPermaLink="false">urn:md5:f5133331748878b8943eeed9da7304bf</guid>
    <pubDate>Sun, 23 Dec 2007 11:55:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
        <category>Bricolage</category><category>ORI-OAI</category><category>Python</category>    
    <description>&lt;p&gt;On met ici en place l&amp;rsquo;affichage d&amp;rsquo;un cours dans une ZPT au niveau d&amp;rsquo;un serveur d&amp;rsquo;application Zope (Zope 2).&lt;/p&gt;
&lt;p&gt;Cette ZPT s&amp;rsquo;appuie sur une External Method qui appelle par Web Service le module ori-oai-indexing d&amp;rsquo;ORI-OAI.&lt;/p&gt;
&lt;p&gt;On utilise ici volontairement Python/Zope pour prouver l&amp;rsquo;intégration possible d&amp;rsquo;ORI-OAI avec d&amp;rsquo;autres technologies ....&amp;nbsp; il est donc tout à fait possible de faire cela bien sûr avec Ruby On Rails, Java/J2EE, php ...&lt;/p&gt;    &lt;h3&gt;External Method&lt;/h3&gt;
&lt;p&gt;Pour appleler le webservice comme décrit dans les autres billets, on passe par une External Method en Zope&amp;nbsp;: un script python édité depuis la ZMI ne pourrait utiliser les librairies comme SOAPpy.&lt;/p&gt;
&lt;p&gt;En Zope une External Method, c&amp;rsquo;est une méthode défini dans un fichier python placé dans un répertoire Extensions, l&amp;rsquo;External Method pouvant être ensuite déclaré depuis la ZMI et donc appelée depuis un script python, une zpt ...&lt;/p&gt;
&lt;p&gt;Dans cette méthode, on veut récupérer une fiche de cours au hasard parmi les réponses à une requête lucène (qui&amp;rsquo;on paramétrera depuis la ZMI quand à elle). En fait on ne veut pas récupérer toute la fiche mais simplement quelques attributs. Pour des raisons de sécurité, on ne peut retourner simplement un objet d&amp;rsquo;un type complexe (classe que l&amp;rsquo;on aurait défini pour l&amp;rsquo;ocassion) =&amp;gt; on se contente de renvoyer les infos sous la forme d&amp;rsquo;un dictionnaire.&lt;/p&gt;
&lt;p&gt;On souhaite récupérér&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;l&amp;rsquo;identifiant de la fiche, &lt;/li&gt;
&lt;li&gt;le titre, &lt;/li&gt;
&lt;li&gt;les auteurs,&lt;/li&gt;
&lt;li&gt;les éditeurs&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;url de la notice associée dans le ori-oai-search&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;url de l&amp;rsquo;image du screenshot (construit comme indiqué dans le billet précédent).&lt;/li&gt;
&lt;/ul&gt;
Voici le script python oriGetRandomCourse.py&amp;nbsp;&amp;nbsp;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;p&gt;#!/usr/bin/env python&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;import os&lt;br /&gt;import time&lt;br /&gt;from SOAPpy import WSDL&lt;br /&gt;import libxml2&lt;br /&gt;import urllib&lt;br /&gt;import random&lt;br /&gt;&lt;br /&gt;def getCoursesFromOriIndexing(nbResults, luceneRequest):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; courses = []&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WSDLFILE = &amp;rsquo;http://ori-oai-indexing.univ-rennes1.fr/indexing/xfire/IndexingService?WSDL&amp;rsquo;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oriindexing = WSDL.Proxy(WSDLFILE)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = oriindexing.searchXMLDocs(luceneRequest, 1, nbResults)[&amp;rsquo;results&amp;rsquo;][&amp;rsquo;SearchResult&amp;rsquo;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for result in results:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if result[&amp;rsquo;id&amp;rsquo;]&amp;thinsp;!= None and result[&amp;rsquo;noticeContent&amp;rsquo;]!= None:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ide = result[&amp;rsquo;id&amp;rsquo;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xml_lom = result[&amp;rsquo;noticeContent&amp;rsquo;].encode(&amp;rsquo;utf-8&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; title = getField(xml_lom, &amp;rsquo;//lom:general/lom:title/lom:string&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = getField(xml_lom, &amp;rsquo;//lom:technical/lom:location&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; authors_vcard = getFields(xml_lom, &amp;rsquo;//lom:lifeCycle/lom:contribute[lom:role/lom:value=&quot;author&quot;]/lom:entity&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; authors_list = [[auth[3:] for auth in vcard.split(&amp;rsquo;\n&amp;rsquo;) if auth[:2] in (&amp;rsquo;FN&amp;rsquo;,&amp;rsquo;fn&amp;rsquo;)][0] for vcard in authors_vcard]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; authors = &amp;rsquo;, &amp;rsquo;.join(authors_list)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; editors_vcard = getFields(xml_lom, &amp;rsquo;//lom:lifeCycle/lom:contribute[lom:role/lom:value=&quot;publisher&quot;]/lom:entity&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; editors_list = [[auth[3:] for auth in vcard.split(&amp;rsquo;\n&amp;rsquo;) if auth[:2] in (&amp;rsquo;FN&amp;rsquo;,&amp;rsquo;fn&amp;rsquo;)][0] for vcard in editors_vcard]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; editors = &amp;rsquo;, &amp;rsquo;.join(editors_list)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url_notice = &amp;rsquo;http://www.univ-rennes1.fr/ori-oai-search/notice.html?id=&amp;rsquo; + ide +&amp;rsquo;&amp;amp;repository=&amp;rsquo; + result[&amp;rsquo;repository&amp;rsquo;] + &amp;rsquo;&amp;amp;format=&amp;rsquo; + result[&amp;rsquo;namespace&amp;rsquo;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url_img_thumb = &amp;rsquo;http://www.univ-rennes1.fr/ori-imgs/thumb-&amp;rsquo; + ide + &amp;rsquo;.png&amp;rsquo;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; courses.append({&amp;rsquo;ide&amp;rsquo;:ide, &amp;rsquo;title&amp;rsquo;:title, &amp;rsquo;authors&amp;rsquo;:authors, &amp;rsquo;editors&amp;rsquo;:editors, &amp;rsquo;url_notice&amp;rsquo;:url_notice, &amp;rsquo;url_img_thumb&amp;rsquo;:url_img_thumb})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return courses&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def getField(lomXml, xpath):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc = libxml2.parseDoc(lomXml)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt = doc.xpathNewContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt.xpathRegisterNs(&amp;rsquo;lom&amp;rsquo;, &amp;rsquo;http://ltsc.ieee.org/xsd/LOM&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; res = ctxt.xpathEval(xpath)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return res[0].get_content()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;def getFields(lomXml, xpath):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc = libxml2.parseDoc(lomXml)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt = doc.xpathNewContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt.xpathRegisterNs(&amp;rsquo;lom&amp;rsquo;, &amp;rsquo;http://ltsc.ieee.org/xsd/LOM&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = ctxt.xpathEval(xpath)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return [result.get_content() for result in results]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# example&amp;nbsp;:&lt;br /&gt;# nbResults = 1000 (results maximum)&lt;br /&gt;# luceneRequest = &amp;rsquo;md-ori-oai-namespace:(&quot;http://ltsc.ieee.org/xsd/LOM&quot;)&amp;rsquo;&lt;br /&gt;def getRandomCourse(self, nbResults, luceneRequest):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; courses = getCoursesFromOriIndexing(nbResults, luceneRequest)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nbResults = min(nbResults, len(courses))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rand = random.randint(0,nbResults-1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print rand&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print courses[rand]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return courses[rand]&lt;/p&gt;
&lt;/blockquote&gt;La méthode qui correspond à l&amp;rsquo;External Method est getRandomCourse&lt;br /&gt;On peut la tester simplement comme ceci&amp;nbsp;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;p&gt;Python 2.4.4 (#2, Aug 16 2007, 02:03:40) &lt;br /&gt;[GCC 4.1.3 20070812 (prerelease) (Debian 4.1.2-15)] on linux2&lt;br /&gt;Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import oriGetRandomCourse&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; oriGetRandomCourse.getRandomCourse(None, 10, &amp;rsquo;md-ori-oai-namespace:(&quot;http://ltsc.ieee.org/xsd/LOM&quot;)&amp;rsquo;)&lt;br /&gt;9&lt;br /&gt;{&amp;rsquo;url_img_thumb&amp;rsquo;: &amp;rsquo;http://www.univ-rennes1.fr/ori-imgs/thumb-rennes1-ori-wf-1-301.png&amp;rsquo;, &amp;rsquo;title&amp;rsquo;: &quot;recherche d&amp;rsquo;information documentaire&quot;, &amp;rsquo;editors&amp;rsquo;: &amp;rsquo;UNIVERSITE RENNES 1 &amp;rsquo;, &amp;rsquo;url_notice&amp;rsquo;: &amp;rsquo;http://www.univ-rennes1.fr/ori-oai-search/notice.html?id=rennes1-ori-wf-1-301&amp;amp;repository=ori-oai-workflow&amp;amp;format=http://ltsc.ieee.org/xsd/LOM&amp;rsquo;, &amp;rsquo;authors&amp;rsquo;: &amp;rsquo;Le Beux Pierre&amp;rsquo;, &amp;rsquo;ide&amp;rsquo;: &amp;rsquo;rennes1-ori-wf-1-301&amp;rsquo;}&lt;br /&gt;{&amp;rsquo;url_img_thumb&amp;rsquo;: &amp;rsquo;http://www.univ-rennes1.fr/ori-imgs/thumb-rennes1-ori-wf-1-301.png&amp;rsquo;, &amp;rsquo;title&amp;rsquo;: &quot;recherche d&amp;rsquo;information documentaire&quot;, &amp;rsquo;editors&amp;rsquo;: &amp;rsquo;UNIVERSITE RENNES 1 &amp;rsquo;, &amp;rsquo;url_notice&amp;rsquo;: &amp;rsquo;http://www.univ-rennes1.fr/ori-oai-search/notice.html?id=rennes1-ori-wf-1-301&amp;amp;repository=ori-oai-workflow&amp;amp;format=http://ltsc.ieee.org/xsd/LOM&amp;rsquo;, &amp;rsquo;authors&amp;rsquo;: &amp;rsquo;Le Beux Pierre&amp;rsquo;, &amp;rsquo;ide&amp;rsquo;: &amp;rsquo;rennes1-ori-wf-1-301&amp;rsquo;}&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; oriGetRandomCourse.getRandomCourse(None, 10, &amp;rsquo;md-ori-oai-namespace:(&quot;http://ltsc.ieee.org/xsd/LOM&quot;)&amp;rsquo;)&lt;br /&gt;5&lt;br /&gt;{&amp;rsquo;url_img_thumb&amp;rsquo;: &amp;rsquo;http://wwww.univ-rennes1.fr/ori-imgs/thumb-rennes1-ori-wf-1-291.png&amp;rsquo;, &amp;rsquo;title&amp;rsquo;: &amp;rsquo;tabagisme&amp;rsquo;, &amp;rsquo;editors&amp;rsquo;: &amp;rsquo;UNIVERSITE RENNES 1 &amp;rsquo;, &amp;rsquo;url_notice&amp;rsquo;: &amp;rsquo;http://www.univ-rennes1.fr/ri-oai-search/notice.html?id=rennes1-ori-wf-1-291&amp;amp;repository=ori-oai-workflow&amp;amp;format=http://ltsc.ieee.org/xsd/LOM&amp;rsquo;, &amp;rsquo;authors&amp;rsquo;: &amp;rsquo;Catherine De bournonville&amp;rsquo;, &amp;rsquo;ide&amp;rsquo;: &amp;rsquo;rennes1-ori-wf-1-291&amp;rsquo;}&lt;br /&gt;{&amp;rsquo;url_img_thumb&amp;rsquo;: &amp;rsquo;http://www.univ-rennes1.fr/ori-imgs/thumb-rennes1-ori-wf-1-291.png&amp;rsquo;, &amp;rsquo;title&amp;rsquo;: &amp;rsquo;tabagisme&amp;rsquo;, &amp;rsquo;editors&amp;rsquo;: &amp;rsquo;UNIVERSITE RENNES 1 &amp;rsquo;, &amp;rsquo;url_notice&amp;rsquo;: &amp;rsquo;http://www.univ-rennes1.fr/ori-oai-search/notice.html?id=rennes1-ori-wf-1-291&amp;amp;repository=ori-oai-workflow&amp;amp;format=http://ltsc.ieee.org/xsd/LOM&amp;rsquo;, &amp;rsquo;authors&amp;rsquo;: &amp;rsquo;Catherine De bournonville&amp;rsquo;, &amp;rsquo;ide&amp;rsquo;: &amp;rsquo;rennes1-ori-wf-1-291&amp;rsquo;}&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;h3&gt;Script Python dans Zope&lt;/h3&gt;
Depuis la ZMI, on définit l&amp;rsquo;External Method ci avant avec pour identifiant oriGetRandomCourse&lt;br /&gt;Ca nous permet depuis un objet de type &quot;script python&quot; avec pour identifiant oriGetRandomCourseHome créé dans la zmi de faire un&amp;nbsp;:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;return context.oriGetRandomCourse(1000, 'md-ori-oai-namespace:(&quot;http@//ltsc.ieee.org/xsd/LOM&quot;)')&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;par exemple (on ne met pas ces paramètres directement dans la zpt qui suit histoire de pouvoir tester l&amp;rsquo;appel de l&amp;rsquo;external method, depuis le script, de pouvoir modifier simplement les paramètres dans le script et non en retouchant la zpt etc).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ZPT&lt;/h3&gt;
La zpt n&amp;rsquo;a plus qu&amp;rsquo;à appeler le script ci-avant, et afficher les éléments du cours, par exemple&amp;nbsp;: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;fr&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;test random course ...&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div tal:define=&quot;course here/oriGetRandomCourseHome&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h2 tal:content=&quot;python: course[&amp;rsquo;title&amp;rsquo;]&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span class=&quot;style_4&quot;&amp;gt;Auteur&amp;nbsp;:&amp;amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tal:replace=&quot;python: course[&amp;rsquo;authors&amp;rsquo;]&quot;&amp;gt;Le nom de l&amp;rsquo;auteur&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span tal:content=&quot;python: course[&amp;rsquo;editors&amp;rsquo;]&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/#&quot; tal:attributes=&quot;href python:course[&amp;rsquo;url_notice&amp;rsquo;]&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;img src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/#&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alt=&quot;&quot; border=&quot;1&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; style=&quot;border: medium double grey; height: 75px; width:100px;&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tal:attributes=&quot;src course/url_img_thumb&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/a&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Voici ce que ca donne alors&amp;nbsp;:&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/screenshots/screenshot-random.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Affichage-de-quelques-metadonnees-dun-cours-choisi-aleatoirement-%3A-interaction-ORI-OAI-et-Zope#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Affichage-de-quelques-metadonnees-dun-cours-choisi-aleatoirement-%3A-interaction-ORI-OAI-et-Zope#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/243</wfw:commentRss>
      </item>
    
  <item>
    <title>Screenshots de ressources numériques</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Screenshots-de-ressources-numeriques</link>
    <guid isPermaLink="false">urn:md5:a1d8b68dbd005a9147878e912a259fe9</guid>
    <pubDate>Sat, 22 Dec 2007 10:57:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
        <category>Bricolage</category><category>ORI-OAI</category><category>Python</category>    
    <description>&lt;p&gt;Ce billet présente une solution légère de captures d&amp;rsquo;écran de ressources numériques.&lt;/p&gt;
&lt;p&gt;Dans cette solution, on interroge par python le module ori-oai-indexing pour extraire les urls et identifiants des ressources indexées.&lt;/p&gt;
&lt;p&gt;Par le biais d&amp;rsquo;un serveur X virtuel (Xvfb) on utilise ensuite sur un serveur (sans interface graphique) un certain nombre d&amp;rsquo;outils permettant de réaliser des &quot;captures d&amp;rsquo;écran&quot; des ressources identifiées par les urls.&lt;/p&gt;
&lt;p&gt;Ce billet aborde en fait plusieurs points qui peuvent être repris de manière indépendante&amp;nbsp;: dans un contexte hors ORI-OAI notamment.&lt;/p&gt;
&lt;p&gt;Face à des solutions comme &lt;a hreflang=&quot;fr&quot; href=&quot;http://browsershots.org/&quot;&gt;browsershots&lt;/a&gt; la solution est ici légère et simple mais elle reste dans le domaine du &quot;bricolage&quot; (qui marche cependant&amp;thinsp;!&amp;nbsp;:-) ).&lt;/p&gt;    &lt;h3&gt;Récupération des ids et urls des ressources&lt;/h3&gt;
On utilise comme dans un billet précédent la méthode searchXMLDocs du module ori-oai-indexing. &lt;br /&gt;On récupère l&amp;rsquo;identifiant directement depuis un dictionnaire. &lt;br /&gt;Pour l&amp;rsquo;url on s&amp;rsquo;impose le fait de résoudre un XPath en Python -&amp;gt; on aurait aussi pu plus simplement utiliser la méthode &lt;span class=&quot;kwd&quot;&gt;searchFromAttributes qui à priori peut nous renvoyer directement l&amp;rsquo;id et l&amp;rsquo;url par exemple (cf &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/cgi/viewvc.cgi/tags/1.0.0/src/org/orioai/indexing/IndexingServiceInterface.java?root=orioai-indexing&amp;amp;view=markup&quot;&gt;IndexingServiceInterface.java&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Pour l&amp;rsquo;appel du Web Service SOAP, on continue bien évidemment avec SOAPpy.&lt;br /&gt;Pour la résolution du Xpath, on choisit libxml2, le binding python de la librairie C.&lt;br /&gt;=&amp;gt; sous debian&amp;nbsp;:&lt;br /&gt;&lt;code&gt;apt-get install python-libxml2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Voici les 2 méthodes qui implémentent ces 2 aspects (l&amp;rsquo;une appelant l&amp;rsquo;autre)&amp;nbsp;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;def getUrlsIdsFromOriIndexing():&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; urls_ids = []&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WSDLFILE = &amp;rsquo;http://ori-oai-indexing.univ-rennes1.fr/indexing/xfire/IndexingService?WSDL&amp;rsquo;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oriindexing = WSDL.Proxy(WSDLFILE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = &amp;rsquo;md-ori-oai-namespace:(&quot;http://ltsc.ieee.org/xsd/LOM&quot;)&amp;rsquo;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = oriindexing.searchXMLDocs(request, 1, 5)[&amp;rsquo;results&amp;rsquo;][&amp;rsquo;SearchResult&amp;rsquo;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for result in results:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if result[&amp;rsquo;id&amp;rsquo;]&amp;thinsp;!= None and result[&amp;rsquo;noticeContent&amp;rsquo;]!= None:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ide = result[&amp;rsquo;id&amp;rsquo;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = getUrl(result[&amp;rsquo;noticeContent&amp;rsquo;].encode(&amp;rsquo;utf-8&amp;rsquo;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; urls_ids.append((ide, url))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return urls_ids&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;def getUrl(lomXml):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc = libxml2.parseDoc(lomXml)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt = doc.xpathNewContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt.xpathRegisterNs(&amp;rsquo;lom&amp;rsquo;, &amp;rsquo;http://ltsc.ieee.org/xsd/LOM&amp;rsquo;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; res = ctxt.xpathEval(&quot;//lom:technical/lom:location&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return res[0].get_content()&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Notez que l&amp;rsquo;on a ici volontairement positionné le lastNotice de la méthode &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;&lt;code&gt;searchXMLDocs&lt;/code&gt;&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt; à 5 pour tester plus facilement.&lt;br /&gt;Notez également l&amp;rsquo;utilisation des espaces de noms (namespaces) au travers de libxml2&amp;nbsp;:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;on définit un binding préfixe / espace de noms&amp;nbsp;: &lt;span class=&quot;kwd&quot;&gt;&lt;code&gt;ctxt.xpathRegisterNs('lom', 'http://ltsc.ieee.org/xsd/LOM')&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;kwd&quot;&gt;on utilise ce binding dans la résolution d&amp;rsquo;un XPath&amp;nbsp;: &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;&lt;code&gt;ctxt.xpathEval(&quot;//lom:technical/lom:location&quot;)&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
Voici ce que donne l&amp;rsquo;appel de la méthode &lt;span class=&quot;kwd&quot;&gt;&lt;code&gt;getUrlsIdsFromOriIndexing()&lt;/code&gt; dans une console python (le fichier python étant shot.py):&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; import shot&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; shot.getUrlsIdsFromOriIndexing()&lt;br /&gt;[(&amp;rsquo;rennes1-ori-wf-1-295&amp;rsquo;, &amp;rsquo;http://www.med.univ-rennes1.fr/wkf/stock/RENNES20071019121406burgunsondages08.pdf&amp;rsquo;), (&amp;rsquo;rennes1-ori-wf-1-289&amp;rsquo;, &amp;rsquo;http://www.med.univ-rennes1.fr/wkf/stock/RENNES20061221025012lepogampLA_FONCTION_RENALE.doc&amp;rsquo;), (&amp;rsquo;rennes1-ori-wf-1-285&amp;rsquo;, &amp;rsquo;http://www.med.univ-rennes1.fr/wkf/stock/RENNES20060915113249tbuiPoly_SEmio_2006.pdf&amp;rsquo;), (&amp;rsquo;rennes1-ori-wf-1-283&amp;rsquo;, &amp;rsquo;http://www.med.univ-rennes1.fr/wkf/stock/RENNES20060613052202duvauferBases_en_radioanatomie_1.ppt&amp;rsquo;), (&amp;rsquo;rennes1-ori-wf-1-287&amp;rsquo;, &amp;rsquo;http://www.med.univ-rennes1.fr/wkf/stock/RENNES20061213113922deugnierAnatomoPhysioFoie.doc&amp;rsquo;)]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;h3&gt;&lt;span class=&quot;kwd&quot;&gt;Stratégie de Captures ...&lt;/span&gt;&lt;/h3&gt;
&lt;span class=&quot;kwd&quot;&gt;On l&amp;rsquo;a évoqué en introduction, &lt;/span&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://browsershots.org/&quot;&gt;browsershots&lt;/a&gt; est une solution relativement complète pour faire des captures d&amp;rsquo;écran des ressources webs&amp;nbsp;: il permet d&amp;rsquo;utiliser des postes clients distants pour réaliser les captures&amp;nbsp;: les postes clients étant +/- &quot;pilotés&quot; par le serveur.&lt;br /&gt;Pratique, mais un serveur ne suffit pas, il faut des postes clients, cela peut être lourd à mettre en place surtout dans une première phase de mise en place de captures sur un nombre de ressources relativement limités ...&lt;br /&gt;&lt;br /&gt;Aussi l&amp;rsquo;idée ici est de n&amp;rsquo;utiliser que le serveur lui-même, qui plus est, n&amp;rsquo;a pas de serveur X. On ne souhaite pas installer sur le serveur une interface graphique Gnome ou autre.&lt;br /&gt;&lt;br /&gt;Une &quot;capture d&amp;rsquo;écran&quot; étant une image, on a théroiquement 2 &quot;possibilités&quot;&amp;nbsp;:&lt;br /&gt;* faire vraiment une capture d&amp;rsquo;écran d&amp;rsquo;un client X interprétant la ressource numérique (html, pdf, flash, ppt ...)&lt;br /&gt;* transformer/convertir la ressource en une image.&lt;br /&gt;&lt;br /&gt;En fait suivant les cas, on choisira la méthode la plus simple selon le format donné.&lt;br /&gt;=&amp;gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;pour html/flash, il parait plus simple d&amp;rsquo;utiliser un navigateur comme firefox et de faire une copie d&amp;rsquo;écran.&lt;/li&gt;
&lt;li&gt;pour le pdf, on pourrait utiliser un plugin dans le navigateur, mais on n&amp;rsquo;a pas forcément envie d&amp;rsquo;installer ce genre de chose ... d&amp;rsquo;autant que &lt;a hreflang=&quot;en&quot; href=&quot;http://pages.cs.wisc.edu/%7Eghost/&quot;&gt;ghostscript&lt;/a&gt;, outil libre, peut par exemple nous convertir une page pdf complète en une image via une ligne de commande.&lt;/li&gt;
&lt;li&gt;pour les autres formats, je vous laisse y réfléchir et donner des idées en commentaires si vous le souhaitez&amp;thinsp;;-) [openoffice.org&amp;thinsp;? pptview&amp;thinsp;? etc.]&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;h3&gt;&lt;span class=&quot;kwd&quot;&gt;Mise en place des Captures ...&lt;/span&gt;&lt;/h3&gt;
&lt;h4&gt;Firefox&lt;/h4&gt;
&lt;p&gt;Il faut installer Firefox sur le serveur, mais pour qu&amp;rsquo;il puisse tourner, il faut aussi installer un serveur X virtuel que l&amp;rsquo;on démarrera lorsqu&amp;rsquo;on aura besoin de Firefox simplement&amp;nbsp;: Xvfb par exemple.&lt;/p&gt;
&lt;p&gt;On démarrera Firefox comme cela&amp;nbsp;: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Xvfb&amp;nbsp;:1 -screen 0 1280x960x24&amp;amp;&lt;br /&gt;firefox --display=:1 http://www.univ-rennes1.fr&lt;/p&gt;
&lt;/blockquote&gt;
Pour la capture on peut utiliser import par exemple fourni avec &lt;a hreflang=&quot;en&quot; href=&quot;http://www.imagemagick.org&quot;&gt;imagemagick,&lt;/a&gt; d&amp;rsquo;autant qu&amp;rsquo;une fois la capture faite, imagemagick pourra nous servir également pour retravailler nos images à souhait&amp;nbsp;: en faire des vignettes (thumbnail), y mettre un effet shadow (ombre), etc.&lt;br /&gt;&lt;p&gt;Un des soucis&amp;nbsp; que l&amp;rsquo;on peut rencontrer avec Firefox cependant est que la taille de la fenêtre de firefox ne s&amp;rsquo;ouvrira pas forcément en grand ... dans certaines versions on a l&amp;rsquo;option -fullscreen de disponible mais pas dans toutes. &lt;/p&gt;
&lt;p&gt;Un certain nombre d&amp;rsquo;extensions firefox peuvent résoudre habilement ce problème, on peut utiliser&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a hreflang=&quot;en&quot; href=&quot;https://addons.mozilla.org/fr/firefox/addon/1659&quot;&gt;rkiosk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ET &lt;a hreflang=&quot;en&quot; href=&quot;https://addons.mozilla.org/fr/firefox/addon/4650&quot;&gt;fullerscreen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
conjointement.&lt;br /&gt;Le problème est&amp;nbsp;: c&lt;strong&gt;omment installer une extension Firefox sur un serveur qui ne contient pas d&amp;rsquo;X&amp;thinsp;?&lt;/strong&gt; -&amp;gt; pas de possibilité de cliquer dans une boîte de dialogue ou autre .... &lt;br /&gt;&lt;br /&gt;Une solution simple&amp;nbsp;: installer les extensions sur un firefox sur un poste en local sous un profil donné (bénéficant d&amp;rsquo;une interface graphique), en profiter pour configurer le firefox comme on le souhaite (on peut ajouter des extensions aussi pour supporter d&amp;rsquo;autres formats par exemple ... d&amp;rsquo;ailleurs si vous avez des idées, n&amp;rsquo;hésitez pas à nous les donner dans les commentaires&amp;thinsp;;-) ), puis copier coller le profil ainsi créé (voir le répertoire .mozilla/firefox) sur le serveur (on spécifie l&amp;rsquo;utilisation de ce profil par défaut dans .mozilla/firefox/profiles.ini) ... le tour est joué&amp;thinsp;!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Ghostscript&lt;/h4&gt;
Il faut l&amp;rsquo;installer (apt-get) et voir ses nombreuses possibilités, par exemple&amp;nbsp;: &lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;gs -dNOPAUSE -sDEVICE=png256 -q -dBATCH -sOutputFile=test.png test.pdf&lt;/p&gt;
&lt;/blockquote&gt;&lt;h4&gt;Imagemagick&lt;/h4&gt;
De même, installez le (apt-get toujours si vous êtes sur debian&amp;nbsp;:-) ) et voyez toutes ses &lt;a hreflang=&quot;en&quot; href=&quot;http://www.imagemagick.org/script/examples.php&quot;&gt;possibilités&lt;/a&gt;&amp;thinsp;!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Le script ...&amp;thinsp;!&lt;/h3&gt;
Ici pour tout ce &quot;bricolage&quot; on va faire un petit script python, qui&lt;br /&gt;&lt;ul&gt;&lt;li&gt;va récupérer les urls et ids depuis l&amp;rsquo;indexing&lt;br /&gt;=&amp;gt; cf plus haut&amp;nbsp;: SOAPpy + libxml2&lt;/li&gt;
&lt;li&gt;va regarder si le format du fichier derrière l&amp;rsquo;url correspond à html ou un pdf&lt;br /&gt;=&amp;gt; librairie urllib2&lt;/li&gt;
&lt;li&gt;va appeler les programmes xvfb, firefox, ghostscript, imagemagick qui vont bien.&lt;br /&gt;=&amp;gt; librairie os&lt;/li&gt;
&lt;/ul&gt;
=&amp;gt; Le script complet est affiché ici et est également en fichier attaché à ce billet.&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;code&gt;#!/usr/bin/env python&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;import os&lt;br /&gt;import time&lt;br /&gt;from SOAPpy import WSDL&lt;br /&gt;import libxml2&lt;br /&gt;import urllib&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def closeFirefox():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('killall -3 firefox')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('killall -9 firefox-bin')&lt;br /&gt;&lt;br /&gt;def closeXvfb():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('killall -9 Xvfb')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def initXvfb():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; psXvfb = os.popen('ps -edf | grep Xvfb').readlines()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(psXvfb) &amp;lt; 3:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('Xvfb :1 -screen 0 1280x960x24&amp;amp;')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #os.system('Xvfb :1 -screen 0 1024x768x24&amp;amp;')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time.sleep(3)&lt;br /&gt;&lt;br /&gt;def launchFirefox(url):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; psFirefox = os.popen('ps -edf | grep firefox').readlines()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(psFirefox) &amp;lt; 3:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print '##### open url ... :' + url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('firefox --display=:1 ' + url + ' &amp;amp;')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #wid = os.popen('DISPLAY=:1 wmctrl -lp | grep firefox | cut -f1 -d\ ').readlines[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print wid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #os.popen('DISPLAY=:1 wmctrl -i -r ' + wid + ' -b toggle,fullscreen,above')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time.sleep(3)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def shot(name, url):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url_open = urllib.urlopen(url)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; infos = url_open.info()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typ = infos.gettype()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if url_open.geturl()[:5] != 'https':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typ = typ&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if typ == 'text/html':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # os.system('DISPLAY=:1 firefox -remote &quot;openurl(' + url + ')&quot;')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; launchFirefox(url)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time.sleep(10)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('DISPLAY=:1 import -window root ' + name + '.png')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; closeFirefox()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if typ == 'application/pdf':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; urllib.urlretrieve(url,name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('gs -dNOPAUSE -sDEVICE=png256 -q -dBATCH -sOutputFile=' + name +'.png ' + name)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time.sleep(1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'error ...'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def thumb(img):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('cp ' + img +'.png ' + 'thumb-' + img +'.png ')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('mogrify -thumbnail 100 thumb-' + img +'.png')&lt;br /&gt;&lt;br /&gt;def thumb300(img):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('cp ' + img +'.png ' + 'thumb300-' + img +'.png ')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('mogrify -thumbnail 300 thumb300-' + img +'.png')&lt;br /&gt;&lt;br /&gt;def vignette(img):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system('convert ' + 'thumb-' + img + '.png -bordercolor grey60 -border 1 -background&amp;nbsp; black \( +clone -shadow 60x4+4+4 \) +swap -background&amp;nbsp; none -flatten -depth 8 ' + 'vign-thumb-' + img + '.png')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def getUrlsIdsFromOriIndexing():&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; urls_ids = []&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WSDLFILE = 'http://localhost:6380/ori-oai-indexing/xfire/IndexingService?wsdl'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oriindexing = WSDL.Proxy(WSDLFILE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = 'md-ori-oai-namespace:(&quot;http://ltsc.ieee.org/xsd/LOM&quot;)'&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = oriindexing.searchXMLDocs(request, 1, 5)['results']['SearchResult']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for result in results:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if result['id'] != None and result['noticeContent']!= None:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ide = result['id']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = getUrl(result['noticeContent'].encode('utf-8'))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; urls_ids.append((ide, url))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return urls_ids&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;def getUrl(lomXml):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc = libxml2.parseDoc(lomXml)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt = doc.xpathNewContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctxt.xpathRegisterNs('lom', 'http://ltsc.ieee.org/xsd/LOM')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; res = ctxt.xpathEval(&quot;//lom:technical/lom:location&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return res[0].get_content()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;closeXvfb()&lt;br /&gt;closeFirefox()&lt;br /&gt;initXvfb()&lt;br /&gt;print 'init Xvfb ok ...'&lt;br /&gt;for (id, url) in getUrlsIdsFromOriIndexing():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = url.replace('https','http')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print url + &quot;&amp;nbsp; ... : &quot; + id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; shot(id, url)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; thumb300(id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; thumb(id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vignette(id)&lt;br /&gt;closeXvfb()&lt;br /&gt;print 'close Xvfb ok ...'&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;On notera cependant que &lt;br /&gt;&lt;ul&gt;&lt;li&gt;on relance firefox pour chaque capture plutôt que de rouvrir une page dans le même onglet principal (cela afin d&amp;rsquo;éviter de&amp;nbsp; rester sur une boîte de dialogue quelconque; javascript [qu&amp;rsquo;on désactivera cependant peut-être], certificat ssl non valide, etc.&lt;/li&gt;
&lt;li&gt;on tente pour les accès https, de voir si vraiment on ne peut pas atteindre l&amp;rsquo;url en http&lt;/li&gt;
&lt;li&gt;on choisit de ne pas faire de captures des pages en https&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;h4&gt;Utilisation dans ori-oai-search ...&lt;/h4&gt;
Ensuite, dans le cadre d&amp;rsquo;ori-oai, et parcequ&amp;rsquo;on a soigneusement nommé nos images via l&amp;rsquo;identifiant de chaque notice, on peut facilement modifier directement la page jsp des résultats d&amp;rsquo;ori-oai-search pour intégrer ces captures.&lt;br /&gt;voici alors ce que vous poiuvez obtenir&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/screenshots/screenshots-unit.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span class=&quot;kwd&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Screenshots-de-ressources-numeriques#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Screenshots-de-ressources-numeriques#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/242</wfw:commentRss>
      </item>
    
  <item>
    <title>Appel de Web Services avec Python</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Appel-de-Web-Services-avec-Python</link>
    <guid isPermaLink="false">urn:md5:1ca04359e61813e9bc65c6b795ed8542</guid>
    <pubDate>Fri, 21 Dec 2007 10:22:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
        <category>ORI-OAI</category><category>Python</category>    
    <description>&lt;p&gt;Les modules &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.ori-oai.org&quot;&gt;ORI-OAI&lt;/a&gt; (tous écrits en Java) s&amp;rsquo;interconnectent uniquement par Web Service (SOAP). &lt;/p&gt;
&lt;p&gt;Un intérêt fondamental des Web Services&amp;nbsp; est leur indépendance vis à vis des technologies&lt;img alt=&quot;&quot; src=&quot;http://incubator.apache.org/cxf/&quot; /&gt; utilisées, cet aspect étant garanti par le respect de &lt;a hreflang=&quot;fr&quot; href=&quot;http://en.wikipedia.org/wiki/WS-I_Basic_Profile&quot;&gt;WS-I Basic Profile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aussi, on montre ici comment on peut appeler facilement une méthode du Web Service du module &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/projects/orioai-indexing/&quot;&gt;ori-oai-indexing&lt;/a&gt; par exemple via python&amp;thinsp;!&amp;nbsp;&amp;nbsp;  &lt;/p&gt;    &lt;h3&gt;La signature du WS ...&amp;thinsp;?&lt;/h3&gt;
Usuellement on peut retrouver les signatures des méthodes exposées par Web Service via le WSDL qui décrit les Web Service.&lt;br /&gt;Depuis le ori-oai-indexing de Rennes1, on pourra le retrouver ici par exemple&amp;nbsp;:&lt;br /&gt;http://ori-oai-indexing.univ-rennes1.fr/indexing/xfire/IndexingService?WSDL&lt;br /&gt;(fichier correspondant joint au billet).&lt;br /&gt;&lt;br /&gt;Certaines technologies peuvent à partir de ce WSDL générer des classes, des fichiers qui permettent ensuite d&amp;rsquo;appeler les méthodes du Web Service.&lt;br /&gt;Dans d&amp;rsquo;autres cas, le but est juste de permettre au programmeur de connaitre la façon dont il doit coder sa requête&amp;nbsp;: nbre de paramètres et types de ceux-ci, etc.&lt;br /&gt;&lt;br /&gt;Si on avait à coder un client au Web Service du module ori-oai-indexing en Java, on utiliserait directement, en plus de l&amp;rsquo;url du Web Service (donné ci dessus), l&amp;rsquo;interface Java utilisé dans le module de ori-oai-indexing&amp;nbsp;: &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/cgi/viewvc.cgi/tags/1.0.0/src/org/orioai/indexing/IndexingServiceInterface.java?root=orioai-indexing&amp;amp;view=markup&quot;&gt;IndexingServiceInterface.java&lt;/a&gt;. Avec des outils adaptés (XFire/CXF ou autre ...), c&amp;rsquo;est la solution la plus confortable et efficace pour le dévelopeur.&lt;br /&gt;&lt;br /&gt;=&amp;gt; en fait finalement, un dévelopeur qui souhaite connaîtré la signature d&amp;rsquo;un web service comme celui d&amp;rsquo;ori-oai-indexing a finalement 2 options&amp;nbsp;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;le Wsdl&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;interface en Java&lt;/li&gt;
&lt;/ul&gt;
Personnellement, les 2 sont compréhensibles, mais l&amp;rsquo;interface Java est plus simple et concise et surtout ... elle est commentée&amp;nbsp;:-)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Appel du Web Service en Python&lt;/h3&gt;
L&amp;rsquo;appel d&amp;rsquo;un Web Service du type SOAP comme l&amp;rsquo;est le WS de ori-oai-indexing se fait simplement en python, du moment que l&amp;rsquo;on ait le package &lt;strong&gt;SOAPpy&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Sous debian par exmple un simple&lt;br /&gt;&lt;code&gt;apt-get install python-soappy&lt;/code&gt;&lt;br /&gt;fait l&amp;rsquo;affaire&amp;nbsp;:-)&lt;br /&gt;&lt;br /&gt;On va choisir d&amp;rsquo;appeler la méthode &lt;br /&gt;&lt;code&gt;&lt;span class=&quot;kwa&quot;&gt;public&lt;/span&gt; SearchResults &lt;span class=&quot;kwd&quot;&gt;searchXMLDocs&lt;/span&gt;&lt;span class=&quot;sym&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwc&quot;&gt;String&lt;/span&gt; request&lt;span class=&quot;sym&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kwb&quot;&gt;int&lt;/span&gt; firstNotice&lt;span class=&quot;sym&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kwb&quot;&gt;int&lt;/span&gt; lastNotice&lt;span class=&quot;sym&quot;&gt;)&lt;/span&gt;&lt;/code&gt;du ori-oai-indexing de Rennes1.&lt;br /&gt;&lt;br /&gt;Le request est un String, en fait c&amp;rsquo;est une requête lucene. Ici on peut requêter par exemple les éléments dont l&amp;rsquo;index &lt;strong&gt;md-ori-oai-namespace&lt;/strong&gt; est à &lt;strong&gt;http://ltsc.ieee.org/xsd/LOM&lt;br /&gt;&lt;/strong&gt;[notez que dans le cadre de ori-oai-indexing, on peut retrouver ce genre d&amp;rsquo;informations en regardant les fichiers de configs par exemple].&lt;br /&gt;Notre requête sera (cf documentation de &lt;a hreflang=&quot;en&quot; href=&quot;http://lucene.apache.org/&quot;&gt;lucène&lt;/a&gt; directement)&amp;nbsp;: &lt;br /&gt;&lt;code&gt;md-ori-oai-namespace:(&quot;http@//ltsc.ieee.org/xsd/LOM&quot;)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;Le firstNotice et le lastNotice peuvent être placés pour l&amp;rsquo;exemple à 1 et 4 par exemple ....&lt;br /&gt;&lt;br /&gt;Et pour le type de résultat obtenu&amp;nbsp;: &lt;code&gt;SearchResults&lt;/code&gt; - 3 solutions&amp;nbsp;: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;on regarde dans le wsdl à quoi cela correspond&lt;/li&gt;
&lt;li&gt;on regarde dans l&amp;rsquo;API Java de ori-oai-indexing à quoi cela correspond&lt;/li&gt;
&lt;li&gt;on fait confiance à python pour nous aider une fois qu&amp;rsquo;on aura récupéré un exemple de résultats&lt;/li&gt;
&lt;/ul&gt;
On prendra ici la 3ème solution d&amp;rsquo;autant que l&amp;rsquo;on va manipuler tout cela via la console python.&lt;br /&gt;&lt;br /&gt;Du code python vaut maintenant mieux qu&amp;rsquo;un long discours&amp;nbsp;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;code&gt;vincent@debian:~$ python&lt;br /&gt;Python 2.4.4 (#2, Aug 16 2007, 02:03:40) &lt;br /&gt;[GCC 4.1.3 20070812 (prerelease) (Debian 4.1.2-15)] on linux2&lt;br /&gt;Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from SOAPpy import WSDL&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; WSDLFILE = 'http://ori-oai-indexing.univ-rennes1.fr/indexing/xfire/IndexingService?WSDL'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; oriindexing = WSDL.Proxy(WSDLFILE)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; request = 'md-ori-oai-namespace:(&quot;http@//ltsc.ieee.org/xsd/LOM&quot;)'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; results = oriindexing.searchXMLDocs(request, 1, 4)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Arrivé ici, on a appelé le Web Service de l&amp;rsquo;indexing et on a mis le résultat dans la variable results. &lt;br /&gt;Tout s&amp;rsquo;est bien passé (sinon pas d&amp;rsquo;inquiétude, python nous aurait prévenu via un Traceback&amp;thinsp;!).&lt;br /&gt;&lt;br /&gt;Reste à savoir ce qu&amp;rsquo;il y a dans results ... =&amp;gt; il suffit de l&amp;rsquo;afficher&amp;nbsp;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; results&lt;br /&gt;&amp;lt;SOAPpy.Types.structType out at -1217116660&amp;gt;: {&amp;rsquo;numberOfResults&amp;rsquo;: &amp;rsquo;577&amp;rsquo;, &amp;rsquo;results&amp;rsquo;: &amp;lt;SOAPpy.Types.structType results at -1217115252&amp;gt;: {&amp;rsquo;SearchResult&amp;rsquo;: [&amp;lt;SOAPpy.Types.structType SearchResult at -1217115412&amp;gt;: {&amp;rsquo;attributesValues&amp;rsquo;: None, &amp;rsquo;repository&amp;rsquo;: &amp;rsquo;ori-oai-workflow&amp;rsquo;, &amp;rsquo;namespace&amp;rsquo;: &amp;rsquo;http://ltsc.ieee.org/xsd/LOM&amp;rsquo;, &amp;rsquo;datestamp&amp;rsquo;: &amp;rsquo;20071219&amp;rsquo;, &amp;rsquo;id&amp;rsquo;: &amp;rsquo;rennes1-ori-wf-1-295&amp;rsquo;, &amp;rsquo;noticeContent&amp;rsquo;: u&amp;rsquo;&amp;lt;lom:lom xmlns:lom=&quot;http://ltsc.ieee.org/xsd/LOM&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://ltsc.ieee.org/xsd/LOM http://ltsc.ieee.org/xsd/lomv1.0/lom.xsd&quot;&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:general&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:title&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:string language=&quot;fr&quot;&amp;gt;sondages-estimation&amp;lt;/lom:string&amp;gt;\n&amp;nbsp; &lt;br /&gt;&lt;br /&gt;...... etc. &lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;On voit que le résultat est donné sous forme d&amp;rsquo;un dictionnaire qui&amp;nbsp;  a pour valeur un dictionnaire qui a pour valeur une liste qui a pour valeur .... etc.&lt;br /&gt;Bref, une forme bien pratique en python, car composé de types simple&amp;nbsp;:-)&lt;br /&gt;&lt;br /&gt;Aussi pour avoir par exemple le &amp;rsquo;id&amp;rsquo; de la première fiche on demandera&amp;nbsp;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; results['results']['SearchResult'][0]['id']&lt;/code&gt;&lt;/p&gt;
&lt;code&gt;'rennes1-ori-wf-1-295'&lt;/code&gt;&lt;/blockquote&gt;
&lt;br /&gt;On trouvera la notice complète de la fiche via&amp;nbsp;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; results['results']['SearchResult'][0]['noticeContent']&lt;br /&gt;u'&amp;lt;lom:lom xmlns:lom=&quot;http://ltsc.ieee.org/xsd/LOM&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://ltsc.ieee.org/xsd/LOM http://ltsc.ieee.org/xsd/lomv1.0/lom.xsd&quot;&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:general&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:title&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:string language=&quot;fr&quot;&amp;gt;sondages-estimation&amp;lt;/lom:string&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/lom:title&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:identifier&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:catalog&amp;gt;URI&amp;lt;/lom:catalog&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:entry&amp;gt;http://ori-oai-search.univ-rennes1.fr/uid/rennes1-ori-wf-1-295&amp;lt;/lom:entry&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/lom:identifier&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:language&amp;gt;fr&amp;lt;/lom:language&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:description&amp;gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;lom:string language&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;etc. ....&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;
En conclusion, ce billet va en ammener d&amp;rsquo;autres sur l&amp;rsquo;utilisation de cet appel Web Services sur&amp;nbsp;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;la mise en place d&amp;rsquo;un script pour réaliser des screenshots automatiques des ressources numériques
récupérés depuis le module ori-oai-indexing&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;affichage de quelques métadonnées d&amp;rsquo;un cours choisi aléatoirement dans ori-oai depuis Zope&lt;/li&gt;
&lt;/ul&gt;
A suivre donc ...&amp;thinsp;!&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Appel-de-Web-Services-avec-Python#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Appel-de-Web-Services-avec-Python#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/241</wfw:commentRss>
      </item>
    
  <item>
    <title>XML et les espaces de noms ...</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/XML-et-les-espaces-de-noms</link>
    <guid isPermaLink="false">urn:md5:38e9ecd7bc7540ac651f9ced227f6dbf</guid>
    <pubDate>Fri, 21 Dec 2007 09:19:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
        <category>ORI-OAI</category><category>XML</category>    
    <description>Dans le cadre de plusieurs projets (LOMFR et ORI-OAI), j&amp;rsquo;ai tenté d&amp;rsquo;expliquer par écrit le concept des espaces de noms en XML qui, bien que fondamental en XML, n&amp;rsquo;est pas toujours bien compris et donc pas toujours bien respecté.&lt;br /&gt;    &lt;h3&gt;Espaces de Noms - rappel&lt;/h3&gt;
Les &lt;strong&gt;espaces de noms&lt;/strong&gt; en &lt;strong&gt;XML&lt;/strong&gt; sont une recommandation du W3C. Ils permettent d&amp;rsquo;identifier de manière unique les éléments et attributs des fiches XML. De fait, ils permettent de mettre en oeuvre le côté &lt;strong&gt;eXtensible&lt;/strong&gt; de XML.&lt;br /&gt;&lt;br /&gt;Aussi lorsque l&amp;rsquo;on définit un &quot;langage XML&quot; (on devrait d&amp;rsquo;ailleurs plutôt parler d&amp;rsquo; &quot;&lt;strong&gt;application XML&lt;/strong&gt;&quot;) dont les instances/fiches sont destinées à être des &lt;strong&gt;formats&lt;/strong&gt;/&lt;strong&gt;vecteurs d&amp;rsquo;échange d&amp;rsquo;information&lt;/strong&gt; entre plusieurs entités (logicielles ou non), il est important voir même impératif d&amp;rsquo;associer à ce nouveau langage un voir plusieurs espaces de noms XML (pré-existants et/ou nouvellement créés).&lt;br /&gt;Un espace de noms s&amp;rsquo;applique aux &lt;strong&gt;éléments&lt;/strong&gt; et &lt;strong&gt;attributs&lt;/strong&gt; des fichiers XML. De manière pragmatique, chacun des éléments et attributs utilisés dans des fichiers XML d&amp;rsquo;échange devrait être déclaré dans un espace de noms (cela excepté les potentiels éléments/attributs &lt;strong&gt;réservés&lt;/strong&gt; en XML).&lt;br /&gt;Spécifier que des éléments et attributs sont dans un espace de noms donné, c&amp;rsquo;est garantir que ces éléments et attributs répondent au langage (implémentant un standard, une norme ...) &lt;strong&gt;identifié par l&amp;rsquo;espace de noms&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Un espace de noms est donné/représenté par un &lt;strong&gt;identifiant&lt;/strong&gt;&amp;nbsp;: une &lt;strong&gt;URI&lt;/strong&gt; (Uniform Resource Identifier) qui est généralement une &lt;strong&gt;URL&lt;/strong&gt; (il faut noter que cette URL ne pointe pas forcément sur un document existant&amp;nbsp;: c&amp;rsquo;est bien un identifiant). Cet identifiant est utilisé via l&amp;rsquo;attribut réservé en XML xmlns qui permet dans une fiche XML de spécifier (via un &lt;strong&gt;préfixe ou non &lt;/strong&gt;dans le cas de l&amp;rsquo;espace de noms par défaut) ensuite que l&amp;rsquo;on utilise tel élément ou tel attribut de tel espace de noms. Finalement, cela permet d&amp;rsquo;identifier de manière unique les éléments et attributs d&amp;rsquo;un &quot;langage&amp;nbsp; XML&quot;&amp;nbsp;: &lt;strong&gt;c&amp;rsquo;est le couple espace de noms et nom de l&amp;rsquo;élément/attribut qui permet cette identification&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;L&amp;rsquo;exemple suivant&lt;br /&gt;&lt;code&gt;&amp;lt;title xmlns=&quot;http://dummy.univ-rennes1.fr/xsd/dummy&quot; /&amp;gt;&lt;/code&gt;&lt;br /&gt;est par exemple équivalent à&amp;nbsp;:&lt;br /&gt;&lt;code&gt;&amp;lt;toto:title xmlns:toto=&quot;http://dummy.univ-rennes1.fr/xsd/dummy&quot; /&amp;gt;&lt;/code&gt;&lt;br /&gt;mais non équivalent à&lt;br /&gt;&lt;code&gt;&amp;lt;title xmlns=&quot;http://dummy.cndp.fr/xsd/dummy&quot; /&amp;gt;&lt;/code&gt;&lt;br /&gt;L&amp;rsquo;élément title issu de http://dummy.univ-rennes1.fr/xsd/dummy et l&amp;rsquo;élément title issu de http://dummy.cndp.fr/xsd/dummy ne sont pas similaires, ils représentent 2 balises différentes qui répondent à 2 langages différents dans 2 espaces de noms différents.&lt;br /&gt;&lt;br /&gt;Les différents logiciels qui manipulent des fichiers XML d&amp;rsquo;un langage XML donné doivent utiliser les espaces de noms au travers de parsers XML et autres outils pour assurer un réel support du langage concerné.&lt;br /&gt;En XML, il est possible de vérifier que les éléments et attributs d&amp;rsquo;un fichier XML sont techniquement bien formés par rapport aux espaces de noms auxquels ces éléments et attributs font référence.&lt;br /&gt;Pour ce faire, les technologies XML disposent de plusieurs outils&amp;nbsp;: DTD, XML Schema, RELAX NG, Schematron ...&lt;br /&gt;Cette phase de validation est nécessaire dans le cadre de la validation d&amp;rsquo;une fiche XML par rapport à un langage donné.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Espaces de Noms – LOM&lt;/h3&gt;
Le standard LOM utilise naturellement un espace de noms spécifique LOM &lt;strong&gt;http://ltsc.ieee.org/xsd/LOM&lt;/strong&gt; qui permet donc d&amp;rsquo;identifier les ressources LOM. Lorsqu&amp;rsquo;on utilise cet espace de noms LOM dans des fiches XML, on s&amp;rsquo;engage donc en quelque sorte à respecter le standard qu&amp;rsquo;est le LOM.&lt;br /&gt;&lt;br /&gt;Pour pouvoir valider le format des fiches XML LOM, le LOM propose des schémas XML LOM disponibles en ligne.&lt;br /&gt;&lt;br /&gt;Le schéma http://ltsc.ieee.org/xsd/lomv1.0/lom.xsd (qui correspond en fait à lomStrict.xsd) est la déclinaison&amp;thinsp;? stricte&amp;thinsp;? de LOM&amp;nbsp;: ce schéma ne permet pas l&amp;rsquo;utilisation conjointe d&amp;rsquo;un autre espace de noms que l&amp;rsquo;espace de noms LOM dans une fiche dite LOM.&lt;br /&gt;Le schéma lomLoose http://ltsc.ieee.org/xsd/lomv1.0/lomLoose.xsd autorise quand à lui une utilisation conjointe de l&amp;rsquo;espace de noms LOM et d&amp;rsquo;autres espaces de noms. Lorsque l&amp;rsquo;on décide de produire et manipuler du LOM ou une extension de celui-ci, la validation technique des fiches en lomLoose est nécessaire, elle n&amp;rsquo;est cependant pas suffisante. &lt;br /&gt;Aussi dans le cadre d&amp;rsquo;un projet comme LOMFR qui vise à étendre le LOM, il est nécessaire de proposer des outils permettant de valider au mieux les fiches LOMFR .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Espaces de Noms – LOMFR&lt;/h3&gt;
Au niveau du LOMFR, l&amp;rsquo;espace de noms officiel associé à la norme est &lt;strong&gt;http://www.lom-fr.fr/xsd/LOMFR&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Le LOMFR étend le LOM en&lt;br /&gt;&lt;ul&gt;&lt;li&gt;proposant de nouveaux éléments/attributs,&lt;/li&gt;
&lt;li&gt;proposant de nouveaux vocabulaires,r&lt;/li&gt;
&lt;li&gt;endant obligatoire/unique certains éléments/attributs,&lt;/li&gt;
&lt;li&gt;supprimant certains éléments/attributs,&lt;/li&gt;
&lt;li&gt;supprimant certains vocabulaires.&lt;/li&gt;
&lt;/ul&gt;
Dans une fiche LOMFR, l&amp;rsquo;espace de noms LOMFR est à utiliser conjointement à l&amp;rsquo;espace de noms LOM. Les éléments et attributs issus de LOM doivent naturellement être déclarés dans l&amp;rsquo;espace de noms LOM http://ltsc.ieee.org/xsd/LOM, les éléments et attributs issus du LOMFR doivent être donnés dans l&amp;rsquo;espace de noms LOMFR http://www.lom-fr.fr/xsd/LOMFR.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Espaces de Noms – LOMFR - Outils&lt;/h3&gt;
Afin d&amp;rsquo;aider au mieux les développements d&amp;rsquo;outils, la mise en place d&amp;rsquo;échange entre plusieurs entités etc. autour du LOMFR, le LOMFR proposera un certain nombre d&amp;rsquo;outils, de recommandations, de bonnes pratiques autour de la norme LOMFR.&lt;br /&gt;Parmi eux, on trouvera des schémas et schématrons XML qui permettent de valider une fiche LOMFR&amp;nbsp;: ils valident à la fois les éléments LOM (en prenant en compte les spécificités apportés par LOMFR&amp;nbsp;: suppression/cardinalité de certains éléments/vocabulaires) ainsi que les éléments LOMFR.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Espaces de Noms – Conclusion&lt;/h3&gt;
Déclarer dans un XML que les éléments et attributs utilisés proviennent des espaces de noms LOM et LOMFR, c&amp;rsquo;est identifier le XML comme répondant à la norme LOMFR. La validation des fichiers XML est une condition nécessaire pour s&amp;rsquo;assurer que ces fichiers respectent bien ce contrat ainsi passé. La possible interopérabilité des fichiers XML LOMFR entre les plateformes d&amp;rsquo;échange (de type &lt;strong&gt;OAI-PMH&lt;/strong&gt; par exemple), la compatibilité des outils d&amp;rsquo;éditions, etc. ne peuvent être réalités que si ces règles (et donc la prise en compte des espaces de noms) sont scrupuleusement respectées.&lt;br /&gt;&lt;br /&gt;C&amp;rsquo;est également le respect de ces règles qui permet une interopérabilité des fiches LOM (dont les fiches LOMFR, et toutes autres fiches dont le langage étend LOM) au niveau des différents outils LOM.&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/XML-et-les-espaces-de-noms#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/XML-et-les-espaces-de-noms#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/239</wfw:commentRss>
      </item>
    
  <item>
    <title>Exploitation d'applications avec subversion - installation et mises à jour.</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Exploitation-dapplications-avec-subversion-installation-et-mises-a-jour</link>
    <guid isPermaLink="false">urn:md5:ee8c62e86c33735ea9720b3b2596642b</guid>
    <pubDate>Thu, 20 Dec 2007 09:48:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
        <category>Exploitation</category><category>ORI-OAI</category>    
    <description>&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt; est un outil de versioning puissant. Basé sur un modèle centralisé, il a l&amp;rsquo;avantage de rester relativement simple. &lt;/p&gt;
&lt;p&gt;L&amp;rsquo;utilisation d&amp;rsquo;ouil de versioning chez les dévelopeurs s&amp;rsquo;est aujourd&amp;rsquo;hui réellement généralisé, au point que faire sans n&amp;rsquo;est maintenant plus envisageable. &lt;/p&gt;
&lt;p&gt;Pour le métier de l&amp;rsquo;exploitant pourtant, l&amp;rsquo;utilisation de tels outils libres et open sources semble tarder à venir. Pourtant c&amp;rsquo;est une pratique qui peut faciliter grandement la vie de l&amp;rsquo;exploitant ... à l&amp;rsquo;utilisation l&amp;rsquo;exploitant devrait même être logiquement encore plus&amp;nbsp; gourmand et exigeant quant aux possibilités de tels outils ...&lt;/p&gt;
&lt;p&gt;Cet article décrit l&amp;rsquo;installation d&amp;rsquo;un logiciel/application (ici &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/projects/ori-workflow/&quot;&gt;ori-oai-workflow-spring&lt;/a&gt;) en utilisant subversion (de &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/&quot;&gt;sourcesup&lt;/a&gt;). Puis il montre comment subversion peut aider l&amp;rsquo;exploitant à mettre à jour son application tout en conservant les modifications qu&amp;rsquo;il aura apportées dans les configurations, voir dans le code de l&amp;rsquo;application&amp;thinsp;!&lt;/p&gt;    &lt;p&gt;Nous proposons ici d&amp;rsquo;installer ori-oai-workflow-spring, de le configurer puis de le mettre à jour avec l&amp;rsquo;outil subversion.&lt;/p&gt;
&lt;p&gt;Ce principe peut être bien sûr adapté à l&amp;rsquo;installation d&amp;rsquo;autres applications disponibles via subversion (comme les différents modules ORI-OAI, mais pas seulement) et aussi à d&amp;rsquo;autres outils que subversion comme CVS, mais aussi des outils plus puissants comme &lt;a hreflang=&quot;en&quot; href=&quot;http://www.selenic.com/mercurial/&quot;&gt;Mercurial&lt;/a&gt;, qui bien utilisé, ammènerait d&amp;rsquo;ailleurs encore  bien plus de possibilités que subversion pour l&amp;rsquo;exploitant ...&lt;/p&gt;
&lt;h3&gt;Checkout d&amp;rsquo;ori-oai-workflow-spring 0.8.3&lt;/h3&gt;
Plutôt que de télécharger une version d&amp;rsquo;ori-oai-workflow-spring sous forme d&amp;rsquo;archive, on télécharge ici la version taguée dans le subversion de sourcesup.&lt;br /&gt;&lt;br /&gt;Comprenez bien qu&amp;rsquo;ici on se place en tant qu&amp;rsquo;exploitant, on utilise donc le subversion en mode anonyme, donc sans avoir les droits d&amp;rsquo;écriture sur le repository.&lt;br /&gt;De plus, on préfère l&amp;rsquo;utilisation de subversion en ligne de commande via la commande svn sur un serveur linux (a priori pour ce genre d&amp;rsquo;opération, vous serez connecté sur un serveur distant sans Interface Graphique, en SSH).&lt;br /&gt;&lt;br /&gt;sourcesup propose 2 modes de navigation dans un repository subversion&amp;nbsp;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;via &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/cgi/viewvc.cgi/?root=ori-workflow&quot;&gt;viewvc&lt;/a&gt;&amp;nbsp;: propose une navigation agréable dans le repository svn&amp;nbsp;: coloration syntaxique du code, logs, etc&lt;/li&gt;
&lt;li&gt;directement via l&amp;rsquo;interface dav-svn (apache) de subversion avec l&amp;rsquo;url suivant &lt;a hreflang=&quot;fr&quot; href=&quot;http://subversion.cru.fr/ori-workflow/&quot;&gt;http://subversion.cru.fr/ori-workflow/&lt;/a&gt;&amp;nbsp;: c&amp;rsquo;est cette dernière url qui permet à l&amp;rsquo;outil client svn de venir synchroniser votre répertoire d&amp;rsquo;installation avec le repository svn distant.&lt;/li&gt;
&lt;/ul&gt;
=&amp;gt; Pour l&amp;rsquo;exemple on récupère via svn (&quot;checkout&quot;) la distribution ori-oai-workflow-spring-0.8.3 grâce à cette url&amp;nbsp;: http://subversion.cru.fr/ori-workflow/ori-oai-workflow-spring/tags/ori-oai-workflow-spring-0.8.3/
&lt;br /&gt;&lt;br /&gt;L&amp;rsquo;idée étant de mettre à jour ori-oai-workflow-spring au fur et à mesure des nouvelles versions, on crée un répertoire source avec pour nom ori-oai-workflow-spring-svn (en omettant donc le numéro de version.&lt;br /&gt;&lt;code&gt;mkdir ori-oai-workflow-spring-svn&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ensuite voici la commande checkout à faire depuis ce répertoire ori-oai-workflow-svn&amp;nbsp;: &lt;br /&gt;&lt;code&gt;svn checkout http://subversion.cru.fr/ori-workflow/ori-oai-workflow-spring/tags/ori-oai-workflow-spring-0.8.3 .&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Copie d&amp;rsquo;écran&amp;nbsp;: &lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/co_wf_083.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;L&amp;rsquo;ensemble des fichiers est ainsi récupéré un à un et ajouté (le &lt;strong&gt;A&lt;/strong&gt; signifiant &lt;strong&gt;Add&lt;/strong&gt;) pour la première fois à votre répertoire d&amp;rsquo;installation.&lt;br /&gt;
&lt;h3&gt;Configurations d&amp;rsquo;ori-oai-workflow-spring 0.8.3&lt;/h3&gt;
Les documentations d&amp;rsquo;installation aidant, on modifie les fichiers build.properties et conf/properties/main-config.properties pour que cela corresponde à nos besoins propres.&lt;br /&gt;Rapidement, une nouvelle capture d&amp;rsquo;écran montrant l&quot;&amp;rsquo;édition de ces fichiers&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/edit_config_wf_083.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Une fois fait, svn est capable de nous résumer les modifications via la commande &lt;br /&gt;&lt;code&gt;svn status&lt;/code&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/status_wf_083.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Les fichiers listés avec M&amp;nbsp; indique que ces fichiers ont été modifiés (&lt;strong&gt;M&lt;/strong&gt; pour &lt;strong&gt;Modify&lt;/strong&gt;).&lt;br /&gt;&lt;br /&gt;Une commande &lt;code&gt;svn diff&lt;/code&gt; permet de visualiser les différences apportées par rapport à la distribution originale.&lt;br /&gt;Exemple d&amp;rsquo;un diff sur build.properties&amp;nbsp;:&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/diff_wf_083.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Ce sont des fichiers de diff classiques qui en ressortent&amp;nbsp;: les + et - indiquent si la ligne est ajoutée/modifiée par rapport à la distribution originale.&lt;br /&gt;&lt;br /&gt;Bien sûr ici, et notamment pour le module ori-oai-workflow-spring, l&amp;rsquo;exploitant va configurer un bon nombre de fichiers, modifier les css, les logos etc.&lt;br /&gt;Ensuite il déploiera l&amp;rsquo;application dans un Tomcat (cf le build.properties) ... et viendra le temps de la mise à jour ...&amp;thinsp;!!&lt;br /&gt;
&lt;h3&gt;Mise à jour d&amp;rsquo;ori-oai-workflow&amp;nbsp;: 0.8.3 -&amp;gt; 1.0.0&lt;/h3&gt;
Un &lt;code&gt;svn info&lt;/code&gt; nous permet de constater que nous sommes bien sur le tag 0.8.3, c&amp;rsquo;est à dire sur l&amp;rsquo;url&amp;nbsp;:&lt;br /&gt;http://subversion.cru.fr/ori-workflow/ori-oai-workflow-spring/tags/ori-oai-workflow-spring-0.8.3&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/info_wf_083.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Mettre à jour ori-oai-workflow, c&amp;rsquo;est ici le passer (on dit qu&amp;rsquo;on le &lt;strong&gt;switch&lt;/strong&gt;) de 0.8.3 à 1.0.0.&lt;br /&gt;Cette manipulation subversion peut avoir des effets non contrôlés, c&amp;rsquo;est une manipulation qui suivant les cas peut être délicat. &lt;br /&gt;Pour plus de sûreté, on propose avant de faire un &lt;strong&gt;switch &lt;/strong&gt;de sauvegarder l&amp;rsquo;ensemble du répertoire ori-oai-woirkflow-svn, on peut faire un tar-gz par exemple simplement&amp;nbsp;: &lt;br /&gt;tar czf ori-oai-workflow-svn-backup.tgz ori-oai-workflow-svn&lt;br /&gt;&lt;br /&gt;On récupèrera la nouvelle url correspondant à la version 1.0.0 via un navigateur&amp;nbsp;: ici, c&amp;rsquo;est &lt;br /&gt;http://subversion.cru.fr/ori-workflow/ori-oai-workflow-spring/tags/ori-oai-workflow-spring-1.0.0&lt;br /&gt;&lt;br /&gt;Donc depuis le répertoire ori-oai-workflow-spring-svn on peut procéder au switch&amp;nbsp;:&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/switch_wf_100.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Le &lt;strong&gt;U&lt;/strong&gt; nous indique ici les fichiers directement mis à jour, &lt;br /&gt;Le &lt;strong&gt;A&lt;/strong&gt; les fichiers ajoutés,&lt;br /&gt;Le &lt;strong&gt;G&lt;/strong&gt; les fichiers mis à jour qui ont nécessité une résolution de conflits car modifiés à la fois par l&amp;rsquo;exploitant et le développeur.&lt;br /&gt;Les fichiers marqués en &lt;strong&gt;G&lt;/strong&gt; sont donc usuellement à vérifier rapidement&amp;nbsp;: on vérifie leur intégrité, on peut pour cela utiliser la commande svn diff pour voir les différences entre le fichier de l&amp;rsquo;exploitant et le fichier original de la version 1.0.0 d&amp;rsquo;ori-oai-workflow (la plupart du temps, on peut faire confiance à subversion et au dévelopeur qui a conscience du procédé mis en oeuvre et qui agit au niveau du développement en conséquence ....). &lt;br /&gt;Ici il n&amp;rsquo;y a pas de conflit (marqué &lt;strong&gt;C&lt;/strong&gt;) et donc tout s&amp;rsquo;est extrêmement bien passé. A priori il n&amp;rsquo;y a pas grand chose à faire de plus pour cette mise à jour (mis à part bien sûr suivre les indications de la documentation&amp;nbsp;: faire pour le workflow un &lt;strong&gt;ant upgrade&lt;/strong&gt; par exemple ici puis redéployer l&amp;rsquo;application).&lt;br /&gt;&lt;br /&gt;L&amp;rsquo;avantage ici est que l&amp;rsquo;on n&amp;rsquo;a pas eu à recopier et répercuter soit même les modifications de configuration entre une ancienne et une nouvelle. &lt;br /&gt;Cependant, et même si le dévelopeur, en connaissance de cause, prend garde à faire en sorte que ces &lt;strong&gt;switchs&lt;/strong&gt; se passent au mieux, il se peut que l&amp;rsquo;on rencontre parfois des &quot;&lt;strong&gt;conflits&lt;/strong&gt;&quot;.&lt;br /&gt;
&lt;h3&gt;Mise à jour d&amp;rsquo;ori-oai-workflow&amp;nbsp;: conflits&amp;thinsp;!&lt;/h3&gt;
Comme dit ci-avant, usuellement lorsque le dévelopeur y prend garde, il est normalement rare d&amp;rsquo;aboutir à un conflit. Mais cela arrive tout de même, notamment lorsque (contrairement au paragraphe ci-avant)&amp;nbsp; à la fois&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un certain nombre de modifications entre 2 versions ont été faites côté développement.&lt;/li&gt;
&lt;li&gt;un certain nombre de configurations/personnalisations ont été faites côté exploitation.&lt;/li&gt;
&lt;/ul&gt;
Ici on se met dans une situation où on aura lors du switch un conflit.&lt;br /&gt;Pour cela on se place comme un exploitant qui a chargé via svn le tag 0.6.4 de ori-oai-workflow et qui a modifié quelques fichiers de configurations et autre, notamment le fichier CSS WebContent/media/ori-addon.css&amp;nbsp;:&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/info_wf_064.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/status_wf_064.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On procède au switch vers le tag 1.0.0 directement&amp;nbsp;:&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/switch_wf_064.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Dans la copie d&amp;rsquo;écran, on ne donne pas le listing complet, mais la plupart des fichiers sont notés U, d&amp;rsquo;autres A, quelques uns G et surtout le fichier WebContent/media/ori-addon.css est noté &lt;strong&gt;C&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;On peut d&amp;rsquo;ailleurs retrouver les fichiers notés &lt;strong&gt;C&lt;/strong&gt; via un &lt;code&gt;svn status&lt;/code&gt;&amp;nbsp;:&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/status_wf_1000_conflit.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;L&amp;rsquo;édition de ori-addon.css pour une résolution manuelle du conflit est impératif.&lt;br /&gt;Ici une modification a été faite en parallèle par le développeur et par l&amp;rsquo;exploitant. On peut retrouver les différentes versions de ce fichier dans les fichiers nommés ori-addon.css.*&lt;br /&gt;Dans le fichier ori-addon.css on retrouvera les caractères&amp;nbsp; &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; , ======= et &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; nous permettant d&amp;rsquo;identifier les régions du ou des conflits.&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;http://blogperso.univ-rennes1.fr/vincent.bonamy/public/svn-wf/edit_conflit.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;=&amp;gt; finalement on modifiera simplement ici &lt;br /&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; .mine&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: red url( ../media/icons/door_out.png ) no-repeat left center;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; border: solid 1px #999999;&lt;br /&gt;=======&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: transparent url( ../media/icons/door_out.png ) no-repeat left center;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; border: none;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; .r471&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;par&lt;br /&gt;&lt;br /&gt;&lt;code&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; background: red url( ../media/icons/door_out.png ) no-repeat left center;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; border: none;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;par exemple.&lt;br /&gt;&lt;br /&gt;Les conflits résolus, on supprimera alors les fichiers ori-addon.css.*.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;
Bien utilisé à la fois au niveau du dévelopeur que de l&amp;rsquo;exploitant, subversion peut devenir une arme redoutable pour l&amp;rsquo;exploitant également (et non plus pour le dévelopeur uniquement).&lt;br /&gt;Pour certaines applications comme ori-oai-workflow qui permet une configuration fine et poussée via la modification de fichiers de configuration, l&amp;rsquo;exploitant a tout intérêt à utiliser et exploiter au maximum subversion ... côté exploitation&amp;thinsp;!&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Exploitation-dapplications-avec-subversion-installation-et-mises-a-jour#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/20/Exploitation-dapplications-avec-subversion-installation-et-mises-a-jour#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/240</wfw:commentRss>
      </item>
    
  <item>
    <title>Éditeur de métadonnées : DC OAI_DC LOM LOMFR etc.</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/19/Editeur-de-metadonnees-%3A-DC-OAI_DC-LOM-LOMFR-etc</link>
    <guid isPermaLink="false">urn:md5:8426aee4bd2d1cf14c7f47d8b633eeb3</guid>
    <pubDate>Wed, 19 Dec 2007 22:03:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
        <category>ORI-OAI</category><category>XML</category>    
    <description>&lt;h3&gt;ORI-OAI ... rappel&amp;thinsp;!&lt;/h3&gt;
&lt;p&gt;ORI-OAI ( &lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://www.ori-oai.org/&quot;&gt;http://www.ori-oai.org&lt;/a&gt; ) est un logiciel Libre et OpenSource. Il vise à la création d&amp;rsquo;un réseau de portails OAI (&lt;a hreflang=&quot;en&quot; href=&quot;http://www.openarchives.org/OAI/openarchivesprotocol.html&quot;&gt;OAI-PMH&lt;/a&gt;) en proposant des outils pour référencer et indexer les ressources notamment numériques.&lt;/p&gt;
&lt;p&gt;Les différents modules qui constituent ORI-OAI ont été conçus
de manière indépendante pour permettre une adaptation des solutions
ORI-OAI à des contextes applicatifs pré-existant.&lt;/p&gt;
&lt;p&gt;Ainsi ils communiquent entre eux via des Web Services relativement
légers et facilement réutilisables par d&amp;rsquo;autres applications. Même si
ces modules sont développés en Java/J2EE, ils peuvent tout à fait être
utilisés via des applications de technologie différente comme python,
ruby, ... cela notamment parceque ces Web Services respectent &lt;a hreflang=&quot;en&quot; href=&quot;http://en.wikipedia.org/wiki/WS-I_Basic_Profile&quot;&gt;WS-I Basic Profile&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;ORI-OAI-MD-EDITOR: l&amp;rsquo;Éditeur de métadonnées&amp;thinsp;!&lt;/h3&gt;
&lt;p&gt;Un des modules de ORI-OAI est l&amp;rsquo;éditeur de métadonnées (basé
sur &lt;a hreflang=&quot;en&quot; href=&quot;http://www.orbeon.com/&quot;&gt;Orbeon Forms&lt;/a&gt;) que l&amp;rsquo;on a nommé ORI-OAI-MD-EDITOR. Il peut, comme
chacun des autres modules, être utilisé/repris dans un certain nombre
d&amp;rsquo;applicatifs.
&lt;/p&gt;    ORI-OAI est open source (GPL), l&amp;rsquo;éditeur également (Orbeon Forms que l&amp;rsquo;on livre avec l&amp;rsquo;éditeur est sous licence LGPL).
&lt;p&gt;Comme chacun des modules de ORI-OAI, Les documentations techniques, les sources, distributions etc se trouvent sur la
plateforme de développement &lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/&quot;&gt;SourceSup,&lt;/a&gt;&lt;br /&gt;&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://sourcesup.cru.fr/softwaremap/trove_list.php?form_cat=318&quot;&gt;http://sourcesup.cru.fr/softwaremap/trove_list.php?form_cat=318&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Concernant ORI-OAI-MD-EDITOR, celui-ci partage actuellement un projet avec le module ori-oai-workflow&amp;nbsp;
:&lt;br /&gt;&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://sourcesup.cru.fr/projects/ori-workflow/&quot;&gt;http://sourcesup.cru.fr/projects/ori-workflow/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://sourcesup.cru.fr/projects/ori-workflow/&quot;&gt;&lt;br /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3&gt;ORI-OAI-MD-EDITOR: une application Orbeon Forms&lt;/h3&gt;
Orbeon Forms est une application J2EE qui utilise XForms côté serveur pour proposer dans un navigateur des interfaces Web Ajax. &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/MarkUp/Forms/&quot;&gt;XForms,&lt;/a&gt; recommandation W3C, est une technologie qui permet de décrire en XML des formulaires manipulant des fichiers XML. XForms a vocation a tourné côté client, c&amp;rsquo;est à dire à être directement interprété par un navigateur web, mais aussi un téléphone portable, etc.&lt;br /&gt;Les navigateurs usuels ne supportent actuellement pas XForms en natif. Des plugins sont cependant disponibles pour Firefox et IE par exemple, mais ceux-ci ont du mal à convaincre face à l&amp;rsquo;engouement qu&amp;rsquo;il y a autour d&amp;rsquo;Ajax. &lt;br /&gt;Pourtant XForms est une réponse du W3C très élégante à ce besoin d&amp;rsquo;interactivité exprimé au travers du succès d&amp;rsquo;Ajax ... bref, en attendant que XForms (ou une technlogie similaire) perce côté client, Orbeon Forms propose l&amp;rsquo;interprétation de XForms côté serveur pour générer une interface Ajax aux navigateurs. Il permet donc de coder une application Ajax en utilisant des langages XML structurés et réfléchis comme XForms mais aussi XPL, ... cela sans écrire une ligne de Javascript (ou de pseudo-javascript).&lt;br /&gt;&lt;br /&gt;Les applications XForms (et par extension Orbeon Forms) permettent donc d&amp;rsquo;éditer du XML.&lt;br /&gt;Vu que les métadonnées dans ORI-OAI et dans l&amp;rsquo;échange de métadonnées via le protocole OAI-PMH se rammènent à des fichiers XML, l&amp;rsquo;utilisation de XForms et Orbeon Forms pour concevoir l&amp;rsquo;éditeur de métadonnées ORI-OAI est une excellente option.&lt;br /&gt;Celui-ci apporte un certain nombre d&amp;rsquo;outils permettant de mettre en oeuvre cette édition de fiches de métadonnées&amp;nbsp;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;des XForms pour un certain nombre de schémas de métadonnées et de cas d&amp;rsquo;utilisation&amp;nbsp;:&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;formulaire OAI-DC (Dublin core) complet&lt;/li&gt;
&lt;li&gt;formulaire LOM complet (conçu avec la société Orbeon qui développe Orbeon Forms),&lt;/li&gt;
&lt;li&gt;formulaire LOM simple (formulaire ~auteur)&lt;/li&gt;
&lt;li&gt;formulaire LOMFR en préparation (en attente de la sortie officielle du schéma et recommandations du LOMFR)&lt;/li&gt;
&lt;li&gt;formulaire SUPLOMFR en préparation (en attente également de la sortie officielle du schéma et recommandations du SUPLOMFR)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;des &quot;widgets&quot; qui permettent de faciliter la création de formulaires, c&amp;rsquo;est à dire d&amp;rsquo;alléger les XForms notamment dans l&amp;rsquo;écriture de blocs souvent redondant  (conçu avec la société Orbeon qui développe Orbeon Forms)&lt;/li&gt;
&lt;li&gt;d&amp;rsquo;une procédure de sauvegarde/chargement de XForms &lt;/li&gt;
&lt;ul&gt;&lt;li&gt;soit par via Web Service (en associant un serveur de web service à l&amp;rsquo;éditeur de métadonnées&amp;nbsp;: dans ORI-OAI, on propose le module de workflow ori-oai-workflow&lt;/li&gt;
&lt;li&gt;soit par l&amp;rsquo;IHM&amp;nbsp;: l&amp;rsquo;éditeur devient un simple éditeur de métadonnées en ligne qui permet la sauvegarde dur son poste de travail des fiches que l&amp;rsquo;on édite&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;d&amp;rsquo;une procédure permettant le chargement (mise à jour régulière) de vocabulaires via un web service&amp;nbsp;: dans ORI-OAI, on propose le module de vocabulaires ori-oai-vocabulary pour offrir ce service de vocabulaires. Ces vocabulaires sont utilisés dans ORI-OAI-MD-EDITOR au travers des listes de sélection, des auto-complétions, recherche de VCARDs, navigations dans les taxonomies, ...&lt;br /&gt;&lt;strong&gt;=&amp;gt; à noter que tout comme pour le workflow, les web services sont constitués simplement d&amp;rsquo;une ou 2 méthodes avec des types simples en paramètres et en retour (des chaînes de caractères ou des entiers). Il est donc aisé d&amp;rsquo;implémenter ces Web Services via d&amp;rsquo;autres applications (Java ou autre) en fonction de vos besoins et donc de connecter ORI-OAI-MD-EDITOR à des outils existants.&lt;br /&gt;&lt;/strong&gt;Il est possible aussi de modifier simplement côté Orbeon Forms la procédure de chargement/sauvegarde du fichier ou la procédure de chargement des vocabulaires (on peut très simplement par exemple utiliser des vocabulaires locaux à l&amp;rsquo;applciation Orbeon Forms en modifiant seulement les XForms des formulaires.&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;d&amp;rsquo;une procédure permettant d&amp;rsquo;ajouter de nouveaux formulaires en copiant/collant simplement un formulaire existant.&lt;/li&gt;
&lt;/ul&gt;
Pour plus de détails, vous pouvez vous référer à la documentation technique autour de ce module (et de son interaction avec le module ori-oai-workflow et le module ori-oai-vocabulary)&amp;nbsp;:&lt;br /&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/ori-workflow/&quot;&gt;http://sourcesup.cru.fr/ori-workflow/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ORI-OAI-MD-EDITOR: Tests&amp;thinsp;!&lt;/h3&gt;
Vous pouvez tester cet éditeur de métadonnées en utilisant par exemple l&amp;rsquo;instance déployé à Rennes1 (en mode &quot;standalone&quot; / éditeur distant, c&amp;rsquo;est à dire non connecté au Workflow): &lt;br /&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://ori-oai-workflow.univ-rennes1.fr/md-editor/welcome&quot;&gt;http://ori-oai-workflow.univ-rennes1.fr/md-editor/welcome&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vous pouvez également le tester au travers de la version de démonstration d&amp;rsquo;ORI-OAI à installer sur un windows&amp;nbsp;:&lt;br /&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/frs/download.php/1746/orioai-demo-quickstart-1.0.0.exe&quot;&gt;http://sourcesup.cru.fr/frs/download.php/1746/orioai-demo-quickstart-1.0.0.exe&lt;/a&gt;&lt;br /&gt;ou sur un linux/macintosh (disposant d&amp;rsquo;un JDK1.5 ou supérieur)&amp;nbsp;:&lt;br /&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://sourcesup.cru.fr/frs/download.php/1773/orioai-demo-install.jar&quot;&gt;http://sourcesup.cru.fr/frs/download.php/1773/orioai-demo-install.jar&lt;/a&gt;&lt;br /&gt;(puis java -jar orioai-demo-install.jar )&lt;br /&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/19/Editeur-de-metadonnees-%3A-DC-OAI_DC-LOM-LOMFR-etc#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/19/Editeur-de-metadonnees-%3A-DC-OAI_DC-LOM-LOMFR-etc#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/237</wfw:commentRss>
      </item>
    
  <item>
    <title>Bienvenue sur ce blog dit &quot;professionnel&quot;</title>
    <link>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/19/Bienvenue-sur-ce-blog-dit-professionnel</link>
    <guid isPermaLink="false">urn:md5:2f10581cae72331b41b6980f5f2ef191</guid>
    <pubDate>Wed, 19 Dec 2007 17:17:00 +0100</pubDate>
    <dc:creator>Vincent Bonamy</dc:creator>
            
    <description>    &lt;p&gt;Ceci est un &lt;strong&gt;blog professionnel&lt;/strong&gt;. &lt;br /&gt;Les objectifs de ce blog sont multiples. Principalement, le but est de partager/mutualiser un certain nombre de choses, d&amp;rsquo;idées, de pratiques autour des sujets que je peux traiter durant mon travail au Centre de Ressources Informatique de Rennes1.&lt;br /&gt;Je travaille autour de ORI-OAI, J2EE, Spring, JSF, Hibernate, Acegi, XML, LOM, OAI-PMH, Python, Zope, Plone (parfois du Ruby), XForms, etc.&lt;br /&gt;&lt;br /&gt;Je suis ammené sur mon poste de travail Debian ou sur serveurs, à faire &lt;/p&gt;
&lt;ul&gt;&lt;li&gt;du &lt;strong&gt;développement&lt;/strong&gt; &quot;propre&quot; (repository subversion, documentation docbook mis à jour en fonction, etc.&lt;/li&gt;
&lt;li&gt;du &quot;&lt;strong&gt;bricolage&lt;/strong&gt;&quot; (scripts en tout genre, conversions de données, installation et utilisation de packages, etc.)&lt;/li&gt;
&lt;li&gt;de &lt;strong&gt;l&amp;rsquo;exploitation&lt;/strong&gt; en tout genre (ldap, apache, tomcat, sauvegardesz de bds, etc).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;Dans ce blog vous trouverez +/- en vrac des choses autour de cela simplement.&lt;br /&gt;&lt;br /&gt;En tout cas, &lt;strong&gt;bonne lecture&amp;thinsp;!&lt;/strong&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/19/Bienvenue-sur-ce-blog-dit-professionnel#comment-form</comments>
      <wfw:comment>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/post/2007/12/19/Bienvenue-sur-ce-blog-dit-professionnel#comment-form</wfw:comment>
      <wfw:commentRss>http://blogperso.univ-rennes1.fr/vincent.bonamy/index.php/feed/atom/comments/235</wfw:commentRss>
      </item>
    
</channel>
</rss>