Page History

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Wiki Markup
Un workflow peut nécessiter l'interaction avec un service distant (i.e extérieur à l'environnement constitué par les modules ORI-OAI). C'est le cas par exemple des workflows _default_ao_easy_ et _default_ao_complex_ dédiés au référencement des publications scientifiques et qui interagissent avec la plateforme [HAL|http://hal.archives-ouvertes.fr/].

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:xml|title=Action 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>
{code}
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:xml|title=Action 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>
{code}
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|ORIOAIDOC:Structure (composants immuables et plugins)] existant dans ORI-OAI-ext.
{info}
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 :
{ul}
{li}*uniquement* des beans de classe _org.orioai.workflow.beans.remote.RemoteServiceConfig_{li}
{li} *un* bean _RemoteServiceConfig_ *par méthode ou fonction* d'un service distant à appeler{li}
{ul}
\\
Ainsi, pour l'appel à la méthode *upload* du service *hal*, on trouvera dans *remote-services-configs.xml* :
{code:xml|title=Configuration 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>
{code}
Un bean _RemoteServiceConfig_ comprend donc un certain nombre de propriétés qu'on explicite ci-après :
{ul}
{li}*wsId*: Identifiant du service distant{li}
{li}*wsMethodId*: Nom de la méthode du service distant{li}
{li}*metadataTypeId*: Identifiant du metadataType donné dans addonContext.xml{li}
{li}*statusKey*: Nom de la clé, dans l'[XML retourné par ORI-OAI-ext|ORIOAIDOC:Format xml d'échange entre ORI-OAI-ext et les autres modules ORI-OAI], à laquelle est associé le statut actuel de la fiche au niveau dedu laservice plateforme HALdistant{li}
{li}*commentKey*: Nom de la clé, dans l'[XML retourné par ORI-OAI-ext|ORIOAIDOC:Format xml d'échange entre ORI-OAI-ext et les autres modules ORI-OAI], à laquelle est associé un éventuel commentaire accompagnant la réponse du deservice HALdistant à l'appel de la méthode{li}
{li}*xpathesParams*: Associations de clés et de valeurs :  les clés sont définies dans le [plugin|ORIOAIDOC:Structure (composants immuables et plugins)] 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{li}
{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|ORIOAIDOC:Structure (composants immuables et plugins)] correspondant au service avec lequel on interagit{li}
{li}*downloadResourcesParams*: Paramètres nécessaires au téléchargement d'une ressource à passer en paramètre de la méthode à appeler{li}
{ul}
{div}