Page History

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

...

Pour illustrer la description de la marche à suivre pour configurer une telle interaction, nous prendrons ici un exemple présent dans les deux workflows précités : l'envoi, conjoitement à sa publication locale, d'une fiche sur la plateforme HAL.

  • dans la description xml (fichier workflow_ao_easy.xml), on trouve :
    Code Block
    xml
    xml
    titleAction de publication
    
    <action id="1" name="aoe-publish">
        <restrict-to>
    	<conditions type="AND">
    	    <condition type="spring">
    		<arg name="bean.name">hasRole</arg>
    		<arg name="mask">AOE_OWNER</arg>
    	    </condition>
    	</conditions>
        </restrict-to>
        <results>
    	<result old-status="Finished" status="Underway" split="1">
    	    <conditions type="AND">
    		<condition type="spring">
    		    <arg name="bean.name">verifyXPathes</arg>
    		    <arg name="xpath1">//dcterms:accessRights[@xsi:type = 'dcfr:envoi_HAL' and not(contains(text(), 'no_hal')) and not(contains(text(), 'unavailable_file')) and normalize-space(.)]</arg>
    		    <arg name="annotation">aoe-send-hal.warn</arg>
    		</condition>
    	    </conditions>
    	</result>
    	<unconditional-result old-status="Finished"
    			      status="Underway" step="3" />
        </results>
        <post-functions>
    	<function type="spring">
    	    <arg name="bean.name">deletePermission</arg>
    	    <arg name="mask">USE_AOE_MODERATOR_FORM</arg>
    	    <arg name="recipient">AOE_OWNER</arg>
    	</function>
    	<function type="spring">
    	    <arg name="bean.name">saveOrUpdateIndex</arg>
    		    <arg name="idOriIndexing">indexingServicePublic</arg>
    	</function>
        </post-functions>
    </action>
    
    où l'on voit que selon la valeur d'un champ de la fiche (<dc:terms:accessRights xsi:type="dcfr:envoi_HAL">), on décide d'une publication locale avec envoi vers HAL (on se dirige alors vers le split d'idenfiant 1) ou d'une publication simple sans envoi vers HAL (on se dirige alors vers l'étape d'identifiant 3)
  • toujours dans workflow_ao_easy.xml, à l'issu du split d'identifiant 1 (se reporter à la documentation d'OsWorkflow pour de plus amples informations sur ce qu'est et comment fonctionne un split), l'instance de workflow se trouve simultanément dans 2 états : 'publié' (localement, étape 3) et 'en attente d'envoi vers HAL' (étape 6). Ce deuxième état fournit l'action suivante :
    Code Block
    xml
    xml
    titleAction d'envoi vers HAL
    
    <action id="13" name="aoe-hal_upload">
        <restrict-to>
    	<conditions type="AND">
    	    <condition type="spring">
    		<arg name="bean.name">hasRole</arg>
    		<arg name="mask">AOE_OWNER</arg>
    	    </condition>
    	    <condition type="spring">
    		<arg name="bean.name">hasRemoteStatus</arg>
    		<arg name="wsId">hal</arg>
    		<arg name="wsStatus">EMPTY</arg>
    	    </condition>
    	</conditions>
        </restrict-to>
        <results>
    	<unconditional-result status="Underway"
    			      old-status="Finished" step="-1" />
        </results>
        <post-functions>
    	<function type="spring">
    	    <arg name="bean.name">deletePermission</arg>
    	    <arg name="mask">AOE_DELETE USE_AOE_MODERATOR_FORM</arg>
    	    <arg name="recipient">AOE_OWNER</arg>
    	</function>
            <!-- FONCTION D'ENVOI VERS HAL -->
            <function type="spring">
                <arg name="bean.name">invokeWSOperation</arg>
                <arg name="wsId">hal</arg>
                <arg name="wsMethodId">upload</arg>
            </function>
    	<function type="spring">
    	    <arg name="bean.name">saveOrUpdateIndex</arg>
    	    <arg name="idOriIndexing">indexingServicePublic</arg>
    	</function>
    	<function type="spring">
    	    <arg name="bean.name">saveXmlHistory</arg>
    	</function>
        </post-functions>
    </action>
    
    Parmi les post-functions invoquées par cette action, celle qui nous intéresse ici est invokeWSOperation. Cette fonction prend 2 arguments :
    • wsId : nom du service distant
    • wsMethodId : nom de la méthode ou fonction à invoquer auprès de ce service
  • Div

    pour que la post-function invokeWSOperation décrite ci-dessus fonctionne, il faut qu'elle corresponde à une configuration présente dans le fichier remote-services-configs.xml de la contribution (ou du workflow par défaut comme le cas qu'on présente ici)

    Info

    Comme le suggère le titre de cette page, l'appel au service distant (HAL dans cet exemple) n'est pas direct : il se fait via le module ORI-OAI-ext, ce qui permet de masquer la diversité de ces services derrière une interface unique, et de les invoquer d'une unique manière. Si l'on parle de configuration d'appels à un service distant, cela signifie donc en fait configuration de la communication avec ORI-OAI-ext et même, pour être plus précis, avec un plugin existant dans ORI-OAI-ext.

    Comme le fichier addonContext.xml, remote-services-configs.xml est un fichier de configuration Spring. Il comprend donc un certain nombre de déclarations de beans Spring. Plus précisément, ce fichier doit déclarer :

    Unordered List (ul)
    List Item (li)
    uniquement des beans de classe org.orioai.workflow.beans.remote.RemoteServiceConfig
    List Item (li)
    un bean RemoteServiceConfig par méthode ou fonction d'un service distant à appeler


    Ainsi, pour l'appel à la méthode upload du service hal, on trouvera dans remote-services-configs.xml :

    Code Block
    xml
    xml
    titleConfiguration nécessaire à l'appel de la méthode upload du service hal
    
    <bean class="org.orioai.workflow.beans.remote.RemoteServiceConfig">
    	<property name="halUserId" value="${ext.hal.account.id}" />
    	<property name="halUserPassword" value="${ext.hal.account.password}" />
    	<property name="wsId" value="hal" />
    	<property name="wsMethodId" value="upload" />
    	<property name="metadataTypeId" value="dc_plus_fr_easy" />
    	<property name="statusKey" value="halArtStatus" />
    	<!--+
    	    | Keys are proper to ori-oai-ext
    	    | Values are xpathes proper to the current metadataType
    	    +-->
    	<property name="xPathesParams">
    	    <map>
    		<entry key="fullTextName" value="//dc:title" />
    		<entry key="fullTextFormat" value="//dc:format" />
    		<entry key="fullTextUri" value="//dc:relation[@xsi:type = 'dcfr:file']" />
    		<entry key="envoiHal" value="//dcterms:accessRights[@xsi:type = 'dcfr:envoi_HAL']" />
    	    </map>
    	</property>
    	<!--+
    	    | Keys are xpathes proper to the current metadataType
    	    | Values are proper to ori-oai-ext
    	    |
    	    | NOTE : to edit one node with several values, values keys must
    	    | be space separated and the last key must be followed by a pipe
    	    | followed by the character which will separate the multiple values
    	    | in the node.
    	    +-->
    	<property name="xmlContentEditionParams">
    	    <map>
    		<entry key="//dc:identifier[@xsi:type = 'dcfr:hal_id']" value="halArtId halArtVersion halArtPassword|," />
    	    </map>
    	</property>
    	<!-- Keys are proper to ori-oai-workflow -->
    	<property name="downloadResourcesParams">
    	    <map>
    		<!--+
    		    | the value associated with  downloadDecisionKey
    		    | is a key in xPathesParams
    		    +-->
    		<entry key="downloadDecisionKey" value="envoiHal" />
    		<entry key="downloadDecisionValues" value="file_hal link_file_hal" />
    		<entry key="resourcesUrisKey" value="fullTextUri" />
    		<entry key="downloadWsId" value="download" />
    		<entry key="downloadWsMethodId" value="downloadResource" />
    	    </map>
    	</property>
    </bean>
    

    Un bean RemoteServiceConfig comprend donc un certain nombre de propriétés qu'on explicite ci-après :

    Unordered List (ul)
    List Item (li)
    wsId: Identifiant du service distant
    List Item (li)
    wsMethodId: Nom de la méthode du service distant
    List Item (li)
    metadataTypeId: Identifiant du metadataType donné dans addonContext.xml
    List Item (li)
    statusKey: Nom de la clé, dans l'XML retourné par ORI-OAI-ext, à laquelle est associé le statut actuel de la fiche au niveau du service distant
    List Item (li)
    commentKey: Nom de la clé, dans l'XML retourné par ORI-OAI-ext, à laquelle est associé un éventuel commentaire accompagnant la réponse du service distant à l'appel de la méthode
    List Item (li)
    xpathesParams: Associations de clés et de valeurs : les clés sont définies dans le plugin correspondant au service avec lequel on interagit ; les valeurs sont des expressions xpaths permettant d'extraire des valeurs de la fiche correspondant à l'instance de workflow courante
    List Item (li)
    xmlContentEditionParams: Associations de clés et de valeurs : les clés sont des expressions xpaths permettant d'éditer des champs de la fiche correspondant à l'instance de workflow courante ; les valeurs sont définies dans le plugin correspondant au service avec lequel on interagit
    List Item (li)
    downloadResourcesParams: Paramètres nécessaires au téléchargement d'une ressource à passer en paramètre de la méthode à appeler