Génération de beans Java J2C avec des scripts Ant

Vous pouvez utiliser des scripts Ant pour appeler des composants J2C et ces scripts Ant peuvent être appelés à partir du plan de travail ou de la ligne de commande.

Il existe des situations dans lesquelles vous pouvez être amené à recréer des beans Java J2C et/ou des beans de liaison de données (par exemple, si votre fichier de stockage COBOL ajoute une nouvelle zone). Cette opération peut désormais être effectuée en utilisant un fichier de définition Ant qui imite l'interaction entre l'utilisateur et les composants J2C sous-jacents.

Les assistants J2C vous permettent de créer rapidement un fichier de configuration Ant en capturant vos sélections et les valeurs entrées. Puisqu'un fichier de configuration Ant est à la base un fichier XML, il peut être modifié ou intégralement généré manuellement.

Un fichier de configuration Ant est composé d'une arborescence cible dans laquelle diverses tâches sont exécutées. Les tâches d'une cible sont traitées en pipeline. Chaque tâche est exécutée par un objet qui implémente une interface de tâche spécifique. Lorsque le fichier de configuration Ant est appelé, les propriétés correspondant à chaque tâche sont chargées dans les objets d'implémentation des tâches. Une fois les informations chargées, l'objet de tâche est appelé.

Tâche de reconnaissance des données

En général, un cycle de reconnaissance comporte deux étapes, chacune exécutée par un composant différent :
  • • Les agents de reconnaissance importent les données (voir la tâche performImport dans le script exemple) pour produire des métadonnées propriétaires appelées résultat de l'importation.
  • • Les éditeurs de ressource utilisent le résultat de l'importation (voir la tâche writeToWorkspace dans le script exemple) pour produire les artefacts d'application appropriés.
Lors des étapes d'importation et de génération, l'agent de rechercher et l'enregistreur de ressources nécessitent que l'utilisateur fournisse un certain nombre de donnée d'entrée. Par exemple, lors de la phase de requête, chaque agent de recherche utilise un ensemble de paramètres différent pour définir une requête sur le référentiel de métadonnées correspondant. L'agent de reconnaissance et l'éditeur de ressources peuvent être associés de différentes manières pour importer et générer l'artefact souhaité. Ils sont identifiés par leur nom (QName). Par exemple, l'agent de reconnaissance Cobol peut être identifié par le nom suivant : {com/ibm/adapter}CobolDiscoveryAgent
L'exemple de script suivant montre comment générer l'interface Java J2C, l'implémentation Java J2C et les classes de liaison de données à partir du fichier COBOL taderc99.cbl et de l'importation de l'adaptateur de ressources ECI version 6.0.2.
<adapter:discover>
	<adapter:performImport agent="{com/ibm/adapter}CobolDiscoveryAgent">
		<adapter:importResource>
			<adapter:propertyGroup name="CobolFileGroup">
				<adapter:propertyElement name="CobolFile" value="/${project}/taderc99.ccp"/>
			</adapter:propertyGroup>
		</adapter:importResource>
		<adapter:queryProperties>
			<adapter:propertyGroup name="ImportProperties">
				<adapter:propertyElement name="Platform" value="Win32"/>
			</adapter:propertyGroup>
		</adapter:queryProperties>
		<adapter:queryResult>
			<adapter:selectElement name="DFHCOMMAREA"/>
		</adapter:queryResult>
	</adapter:performImport>
	<adapter:writeToWorkspace writer="{com/ibm/adapter/cobol/writer}JAVA_WRITER">
		<adapter:propertyGroup name="COBOLToJavaResourceWriter">
			<adapter:propertyElement name="GenerationStyle" value="0"/>
			<adapter:propertyGroup name="Java Type Name">
				<adapter:propertyElement name="Overwrite existing class" value="true"/>
				<adapter:propertyElement name="Project Name" value="${project}"/>
				<adapter:propertyElement name="Package Name" value="com.ibm.test"/>
				<adapter:propertyElement name="Class Name" value="Taderc99"/>
			</adapter:propertyGroup>
		</adapter:propertyGroup>
	</adapter:writeToWorkspace>
</adapter:discover>
  1. La section Importation du script Ant se présente de la façon suivante :
    <discoveryAgent type="DiscoveryAgentName">
    		<importResource name="PropertyName" value="PropertyValue"/>
    		<importProperties>
    			<propertyElement name="PropetyName" value="PropertyValue"/>
    		</importProperties>
    		<searchParameters>
    			<propertyElement name="ParameterName"/>
    		</searchParameters>
    </discoveryAgent>
    où :
    • discoveryAgent est le nom de l'agent de recherche à utiliser pour l'importation
    • importResource est la ressource à importer
    • queryProperties est une liste de paramètres représentant les informations requises pour effectuer une requête sur le référentiel de métadonnées
    • searchParameters représente les noeuds sélectionnés dans l'arborescence de résultats pour être importés en tant qu'artefacts d'application
    • propertyElement est une liste de paires nom/valeur de propriétés
  2. Pour générer l'artefact d'application, un enregistreur de ressources sachant comment utiliser les résultats de l'importation est appelé. Par exemple, après une importation de type COBOL, seul un enregistreur sachant comment utiliser les résultats d'importation de type COBOL peut être utilisé. La sectionEnregistrement du script Ant se présente de la façon suivante :
    <adapter:writeToWorkspace writer="{com/ibm/adapter/cobol/writer}JAVA_WRITER">
    <adapter:propertyGroup name="COBOLToJavaResourceWriter">
    <adapter:propertyGroup name="Java Type Name">
    <adapter:propertyElement name="Project Name" value="${project1}"/>
    <adapter:propertyElement name="Package Name" value="sample.cics"/>
    <adapter:propertyElement name="Class Name" value="DFHCOMMAREA"/>
    </adapter:propertyGroup>
    </adapter:propertyGroup>
    </adapter:writeToWorkspace>
    où :
    • workspaceResourceWriter est le nom de l'enregistreur utilisé pour générer les artefacts d'application
    • propertyElement est une liste de paires nom/valeur de propriétés utilisée par l'enregistreur pour la génération
  3. Dans le cas particulier d'une importation de langage (COBOL, C et PL/I), une étape supplémentaire est nécessaire : la génération de liaison. La section Liaison du script Ant se présente de la façon suivante :
    <createBinding package="PackageName" class="ClassName">
        <methodElement>
            <name value="MethodName"/>
            <input value="Input"/>
            <output value="Output"/>
            <interactioSpec>
                <propertyElement name="PropertyName" value="PropetyValue"/>
            </interactioSpec>
        </methodElement>
        <connectionSpec>
            <propertyElement name="PropertyName" value="PropertyValue"/>
        </connectionSpec>
        <resourceAdapter project="ResourceAdapterProjectName"/>
    </createBinding>
  4. La valeur resourceAdapter peut également être définie de la façon suivante :
    <resourceAdapter>
         <propertyElement name="displayName" value="PropertyValue"/>
         <propertyElement name="version" value="PropertyValue"/>
         <propertyElement name="vendorName" value="PropertyValue"/>
    </resourceAdapter>
    où :
    • createBinding définit le nom de classe de liaison d'interface et de package
    • methodElement est la méthode Java utiliser pour accéder au système EIS
      • name est le nom de la méthode
      • input est le type d'entrée
      • output est le type de sortie
      • interactioSpec est une liste de propriétés d'interaction
    • connectionSpec est une liste de propriétés de connexion
    • resourceAdapter est l'adaptateur de ressources utilisé en spécifiant le nom de projet ou une liste de propriétés
  5. Une fois les propriétés définies, vous pouvez exécuter une commande qui appelle l'interface API sous-jacente pour procéder à l'importation ou la génération d'artefacts.
Remarque : Gardez ces instructions à l'esprit lorsque vous utilisez vos scripts Ant :
  • Si vous appelez un adaptateur de ressources dans votre script Ant, l'adaptateur de ressources doit être importé dans l'espace de travail avant d'appeler le script Ant.
  • Toutes les ressources doivent avoir un chemin de fichier pointant vers l'espace de travail et le projet ou un chemin de système de fichiers complet.
  • Les agents de recherche et les enregistreurs d'espace de travail sont appelés par leur nom (QName) les identifiant de façon unique. Pour voir tous les agents de recherche, enregistreurs de ressources de l'espace de travail et configurations d'importation, utilisez le script displayAll.xml que vous trouverez dans le répertoire des scripts.
  • Certains éléments comporte une paire nom/valeur pour les attributs. Le nom est en fait une propriété définie de façon interne par l'agent de recherche ou l'enregistreur de ressources et est utilisé pour transmettre la valeur. Il est important que le nom soit correct. Si le nom n'est pas reconnu par le composant, la valeur ne sera pas définie. Dans tous les cas, ces attributs font partie d'une balise propertyElement, qui a une multiplicité un-plusieurs. La même multiplicité s'applique également à la balise methodElement.
L'exemple de script suivant génère une liaison de données basée sur le fichier COBOL spécifié (taderc99.ccp). Vous trouverez ce script dans le répertoire des scripts du plug-in com.ibm.adapter.command.
<?xml version="1.0" encoding="UTF-8" ?> 
  <project xmlns:adapter="http://com.ibm.adapter" default="DataBinding1" name="/Taderc99/CustomerInfo.xml">
    <property name="debug" value="true" /> 
    <property name="project1" value="Taderc99" /> 
    <target name="DataBinding1">
  <adapter:createProject projectName="${project1}" projectType="Java" /> 
    <adapter:discover>
    <adapter:performImport agent="{com/ibm/adapter}CobolDiscoveryAgent">
    <adapter:importResource>
    <adapter:propertyGroup name="CobolFileGroup">
  <adapter:propertyElement name="CobolFile" value="C:\Samples\CICS\taderc99\taderc99.cbl" /> 
  </adapter:propertyGroup>
  </adapter:importResource>
    <adapter:queryProperties>
    <adapter:propertyGroup name="ImportProperties">
  <adapter:propertyElement name="Platform" value="Win32" /> 
  <adapter:propertyElement name="Codepage" value="ISO-8859-1" /> 
  <adapter:propertyElement name="Numproc" value="PFD" /> 
  <adapter:propertyElement name="FloatingPointFormat" value="IEEE 754" /> 
    <adapter:propertyGroup name="ExternalDecimalSignGroup">
  <adapter:propertyElement name="ExternalDecimalSign" value="ASCII" /> 
  </adapter:propertyGroup>
    <adapter:propertyGroup name="EndianGroup">
  <adapter:propertyElement name="Endian" value="Little" /> 
  <adapter:propertyElement name="RemoteEndian" value="Little" /> 
  </adapter:propertyGroup>
    <adapter:propertyGroup name="CompileOptions">
  <adapter:propertyElement name="Quote" value="DOUBLE" /> 
  <adapter:propertyElement name="Trunc" value="STD" /> 
  <adapter:propertyElement name="Nsymbol" value="DBCS" /> 
  </adapter:propertyGroup>
  </adapter:propertyGroup>
  </adapter:queryProperties>
    <adapter:queryResult>
  <adapter:selectElement name="DFHCOMMAREA" /> 
  </adapter:queryResult>
  </adapter:performImport>
    <adapter:writeToWorkspace writer="{com/ibm/adapter/cobol/writer}JAVA_WRITER">
    <adapter:propertyGroup name="COBOLToJavaResourceWriter">
  <adapter:propertyElement name="GenerationStyle" value="Default" /> 
    <adapter:propertyGroup name="Java Type Name">
  <adapter:propertyElement name="Project Name" value="${project1}" /> 
  <adapter:propertyElement name="Package Name" value="sample.cics" /> 
  <adapter:propertyElement name="Class Name" value="CustomerInfo" /> 
  <adapter:propertyElement name="Overwrite existing class" value="true" /> 
  </adapter:propertyGroup>
  </adapter:propertyGroup>
  </adapter:writeToWorkspace>
  </adapter:discover>
  <eclipse.refreshLocal depth="infinite" resource="${project1}" /> 
  <eclipse.incrementalBuild project="${project1}" /> 
  </target>
  </project> 
:
  • • importResource est la ressource à importer
  • • queryProperties sont les paramètres qui représentent les informations requises pour effectuer une requête sur le référentiel de métadonnées
  • managedConnectionFactory définit les propriétés de la fabrique de connexions
  • • queryResult représente les noeuds sélectionnés dans l'arborescence de résultats, destinés à être importés en tant qu'artefacts d'application
  • • propertyGroup est la structure contenant les propriétés et leurs valeurs.

Tâche de génération de service

Dans le cas particulier de l'importation de langage (COBOL, C et PL/1), une étape supplémentaire est nécessaire : la génération de liaison d'interface. L'exemple suivant décrit la section de reconnaissance de données du script Ant utilisé pour la génération de bean J2C :

<j2c:generateService>
	<j2c:buildService package="com.ibm.test" class="Taderc99Interface">
		<j2c:method>
			<j2c:methodName value="gettaderc99"/>
			<j2c:methodInput value="${project}/com/ibm/test/Taderc99.java">
				<j2c:argumentBinding property="commareaLength" propertyType="InteractionSpec" name="length" type="int"/>
			</j2c:methodInput>
			<j2c:methodOutput value="${project}/com/ibm/test/Taderc99.java"/>
			<j2c:interactionSpec class="com.ibm.connector2.cics.ECIInteractionSpec">
				<adapter:propertyGroup name="InteractionSpec property group">
					<adapter:propertyElement name="functionName" value="TADERC99"/>
				</adapter:propertyGroup>
			</j2c:interactionSpec>
		</j2c:method>
		<j2c:managedConnectionFactory class="com.ibm.connector2.cics.ECIManagedConnectionFactory" target="myJNDIName">
			<adapter:propertyGroup name="Managed connection property group">
				<adapter:propertyGroup name="Server">
					<adapter:propertyElement name="ConnectionURL" value="rubicon.torolab.ibm.com"/>
					<adapter:propertyElement name="ServerName" value="rubicon"/>
				</adapter:propertyGroup>
				<adapter:propertyGroup name="UserVerification">
					<adapter:propertyElement name="UserName" value="sysad"/>
					<adapter:propertyElement name="Password" value="sysad"/>
				</adapter:propertyGroup>
			</adapter:propertyGroup>
		</j2c:managedConnectionFactory>
		<j2c:connectionSpec class="com.ibm.connector2.cics.ECIConnectionSpec"/>
		<j2c:resourceAdapter project="ECI CICS"/>
	</j2c:buildService>
	<adapter:writeToWorkspace writer="com/ibm/adapter/j2c/codegen:J2CAnnotationWriter">
		<adapter:propertyGroup name="J2C Writer Properties">
			<adapter:propertyElement name="Project" value="${project}"/>
			<adapter:propertyElement name="InterfaceName" value="Taderc99Interface"/>
			<adapter:propertyElement name="BindingName" value="Taderc99Binding"/>
			<adapter:propertyElement name="PackageName" value="com.ibm.test"/>
			<adapter:propertyGroup name="CommandBean">
				<adapter:propertyGroup name="gettaderc99">
					<adapter:propertyElement name="EnableGenerate" value="true"/>
					<adapter:propertyElement name="CommandBeanName" value="Taderc99CICSECIServiceProxy"/>
					<adapter:propertyElement name="Input" value="Taderc99Part"/>
					<adapter:propertyElement name="Output" value="Taderc99Part"/>
				</adapter:propertyGroup>
			</adapter:propertyGroup>
		</adapter:propertyGroup>
    </adapter:writeToWorkspace>
</j2c:generateService>
:
  • buildService définit le nom de classe de liaison d'interface et de package
  • method est la méthode Java™ permettant d'accéder au système EIS
    • methodName est le nom de la méthode
    • methodInput est le type d'entrée
    • methodOutput est le type de sortie
    • interactionSpec est une liste de propriétés d'interaction
  • managedConnectionFactory définit les propriétés de la fabrique de connexions
  • connectionSpec est la classe de connexion utilisée
  • resourceAdapter est l'adaptateur de ressources utilisé en spécifiant le nom du projet ou la liste de propriétés

Tâches supplémentaires

Il s'agit de tâches utiles, mais non indispensables, à la génération d'artefacts.

La tâche createProject peut être utilisée pour créer un projet d'espace de travail.
<adapter:createProject 
		projectName="taderc99Project" 
		projectType="Web" 
		runtimeName="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
:
  • projectName est le nom du projet
  • projectType est le type (Java, Web ou EJB) ; ne respecte pas la casse
  • runtimeName (optionnel) est le nom d'exécution tel qu'il est défini sous Fenêtre->Préférences->Serveur->Environnements d'exécution installés
  • addToEAR (optionnel) ; les valeurs valides sont les suivantes :
    • yes
    • no
    • true
    • false
  • EARProjectName (optionnel) est le nom de projet EAR
La tâche importResourceAdapter peut être utilisée pour créer un projet de connecteur.
<j2c:importResourceAdapter 
		connectorModule="cicseci602"
		connectorFile="D:\IBM\SDP70\ResourceAdapters\cics15\cicseci602.rar" 
		targetRuntime="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
:

Définition des propriétés

Les agents de reconnaissance et les éditeurs d'espace de travail sont référencés par leur nom (QName), les identifiant de façon unique. Pour voir tous les agents de reconnaissance, éditeurs de ressources de l'espace de travail et configurations d'importation, utilisez le script displayAll.xml que vous trouverez dans le répertoire des exemples.

Comme vous avez pu le voir dans les exemples de script, les valeurs transmises aux agents de reconnaissance ou aux éditeurs de ressources sont définies par les balises propertyGroup et propertyElement. Un groupe de propriétés définit un ensemble logique de propriétés via une structure imbriquée. L'organisation de la structure et les noms des groupes et des propriétés qu'elle contient, doivent être décrits dans la documentation de l'agent de reconnaissance ou de l'éditeur de ressources.

Les propriétés sont définies par une paire d'attributs nom/valeur. Le nom est une propriété définie de façon interne par l'agent de reconnaissance ou l'éditeur de ressources et est utilisé pour transmettre la valeur. Il est important que le nom soit correct. Si le nom n'est pas reconnu par le composant, la valeur ne sera pas définie.


Vos commentaires