Tworzenie komponentów Java bean J2C za pomocą skryptów narzędzia Ant

Skrypty narzędzia Ant mogą służyć do tworzenia komponentów J2C. Skrypty te można wywoływać zarówno z poziomu środowiska roboczego, jak i z poziomu wiersza komend.

Istnieją sytuacje, w których pojawia się potrzeba ponownego utworzenia komponentów Java bean J2C lub komponentów bean wiązania danych - na przykład, gdy w księdze kopii języka COBOL pojawia się nowe pole. Teraz operację tę można zrealizować za pośrednictwem pliku definicji narzędzia Ant imitującego interakcję między użytkownikiem, a bazowymi komponentami J2C.

Kreatory J2C pozwalają szybko utworzyć plik konfiguracyjny narzędzia Ant na podstawie dokonanych wyborów i wartości wprowadzonych przez użytkownika. Ponieważ plik konfiguracyjny narzędzia Ant jest w rzeczywistości plikiem XML, można go ręcznie zmodyfikować, a nawet utworzyć.

Plik taki składa się z drzewa docelowego, w ramach którego realizowane są rozmaite zadania. Są one przetwarzane potokowo. Każde zadanie jest wykonywane przez obiekt implementujący określony interfejs zadaniowy. Gdy wywoływany jest plik konfiguracyjny narzędzia Ant, właściwości odpowiadające poszczególnym zadaniom są ładowane do obiektów implementujących zadania. Po załadowaniu tych informacji wywoływany jest obiekt zadania.

Zadanie wykrywania danych

Ogólnie cykl wykrywania składa się z dwóch etapów, z których każdy jest realizowany przez inny komponent:
  • • Agenty wykrywania realizują właściwe zadanie importowania danych (patrz zadanie performImport w skrypcie przykładowym), tworząc własne metadane nazywane wynikiem importu.
  • • Programy piszące zasobów pobierają wynik importu (patrz zadanie writeToWorkspace w skrypcie przykładowym) w celu utworzenia odpowiednich artefaktów aplikacji.
W fazie importowania i generowania agent wykrywania i program piszący zasobu wymagają wprowadzenia przez użytkownika zestawu danych. Na przykład w fazie zapytania każdy agent wykrywania będzie miał inny zestaw parametrów definiujących zapytanie, jakie ma zostać wykonane na odpowiednim repozytorium metadanych. Agent wykrywania może być kojarzony z programem piszącym zasobu na wiele różnych sposobów, co pozwala zaimportować i wygenerować żądany artefakt. Komponenty identyfikowane są na podstawie ich nazw QName. Na przykład agent wykrywania dla języka Cobol może być identyfikowany przy użyciu następującej nazwy: {com/ibm/adapter}CobolDiscoveryAgent.
Poniższy przykładowy skrypt prezentuje sposób generowania interfejsu Java J2C, implementacji Java J2C oraz klas wiązania danych na podstawie pliku taderc99.cbl w języku COBOL i przy zaimportowaniu adaptera ECIResourceAdapter w wersji 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. Sekcja importu skryptu narzędzia Ant wygląda następująco:
    <discoveryAgent type="NazwaAgentaWykrywania">
    		<importResource name="NazwaWlasciwosci" value="WartoscWlasciwosci"/>
    		<importProperties>
    			<propertyElement name="NazwaWlasciwosci" value="WartoscWlasciwosci"/>
    		</importProperties>
    		<searchParameters>
    			<propertyElement name="NazwaParametru"/>
    		</searchParameters>
    </discoveryAgent>
    gdzie:
    • discoveryAgent to nazwa agenta wykrywania, który ma zostać użyty do przeprowadzenia importu.
    • importResource to zasób, który ma zostać zaimportowany.
    • queryProperties to lista parametrów reprezentujących informacje wymagane do sformułowania zapytania, które ma zostać wykonane na repozytorium metadanych.
    • searchParameters to wybrane węzły drzewa wynikowego, które mają zostać zaimportowane jako artefakty aplikacji.
    • propertyElement to lista par składających się z nazwy właściwości i jej wartości.
  2. W celu wygenerowania artefaktu aplikacji wywoływany jest program piszący zasobu, który potrafi wykorzystać zaimportowany wynik. Na przykład po przeprowadzeniu importu typu COBOL może zostać użyty tylko taki program piszący, który potrafi wykorzystać wynik importu typu COBOL. Sekcja zapisu skryptu narzędzia Ant wygląda następująco:
    <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>
    gdzie:
    • workspaceResourceWriter to nazwa programu piszącego używanego do wygenerowania artefaktów aplikacji.
    • propertyElement to lista par złożonych z nazwy właściwości i jej wartości, której używa program piszący do generowania.
  3. W szczególnym przypadku importowania językowego (COBOL, C i PL/I) występuje dodatkowy krok, jakim jest generowanie wiązań. Sekcja wiązania skryptu narzędzia Ant wygląda następująco:
    <createBinding package="NazwaPakietu" class="NazwaKlasy">
        <methodElement>
            <name value="NazwaMetody"/>
            <input value="Wejscie"/>
            <output value="Wyjscie"/>
            <interactioSpec>
                <propertyElement name="NazwaWlasciwosci" value="WartoscWlasciwosci"/>
            </interactioSpec>
        </methodElement>
        <connectionSpec>
            <propertyElement name="NazwaWlasciwosci" value="WartoscWlasciwosci"/>
        </connectionSpec>
        <resourceAdapter project="NazwaProjektuAdapteraZasobow"/>
    </createBinding>
  4. Adapter zasobów (resourceAdapter) może też zostać zdefiniowany w następujący sposób:
    <resourceAdapter>
         <propertyElement name="displayName" value="WartoscWlasciwosci"/>
         <propertyElement name="version" value="WartoscWlasciwosci"/>
         <propertyElement name="vendorName" value="WartoscWlasciwosci"/>
    </resourceAdapter>
    gdzie:
    • createBinding określa nazwę pakietu i klasy wiązania interfejsu.
    • methodElement to metoda w języku Java dająca dostęp do systemu EIS.
      • name to nazwa metody.
      • input to typ wejściowy.
      • output to typ wyjściowy.
      • interactioSpec to lista właściwości interakcji.
    • connectionSpec to lista właściwości połączenia.
    • resourceAdapter to używany adapter zasobów określony za pośrednictwem nazwy projektu lub listy właściwości.
  5. Po skonfigurowaniu właściwości należy wydać komendę wywołującą bazowy interfejs API w celu pokierowania procesem importu lub generowania artefaktów.
Uwaga: Używając skryptów narzędzia Ant, należy mieć na uwadze następujące wytyczne:
  • Jeśli w skrypcie narzędzia Ant jest wywoływany adapter zasobów, przed wywołaniem skryptu adapter musi zostać zaimportowany w obszarze roboczym.
  • Dla każdego używanego zasobu musi zostać określona albo ścieżka do pliku wskazująca obszar roboczy i projekt, albo pełna ścieżka w systemie plików.
  • Odwołania do agentów wykrywania i programu piszącego obszaru roboczego następują przy użyciu ich nazw QName, które jednoznacznie je identyfikują. Aby odnaleźć wszystkie zarejestrowane agenty wykrywania, programy piszące zasobów obszaru roboczego i konfiguracje importu, należy użyć skryptu displayAll.xml z katalogu skryptów.
  • Niektóre elementy mają atrybuty w postaci par nazwa-wartość. Nazwa jest w tym przypadku właściwością zdefiniowaną wewnętrznie przez agenta wykrywania lub program piszący zasobu i służy do przekazywania wartości. Ważne jest prawidłowe podanie nazwy. Jeśli nie zostanie ona rozpoznana przez komponent, wartość nie zostanie ustawiona. We wszystkich przypadkach atrybuty te są częścią znacznika propertyElement, który ma krotność jeden-do-wielu. Taką samą krotność ma znacznik methodElement.
Poniższy skrypt przykładowy generuje wiązanie danych na podstawie wskazanego pliku w języku COBOL (taderc99.ccp). Skrypt ten można znaleźć w katalogu skryptów wtyczki 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> 
gdzie:
  • • importResource określa zasób, który ma zostać zaimportowany.
  • • queryProperties to parametry reprezentujące informacje wymagane do sformułowania zapytania, które ma zostać wykonane na repozytorium metadanych.
  • managedConnectionFactory to właściwości fabryki połączeń.
  • • queryResult to wybrane węzły drzewa wynikowego, które mają zostać zaimportowane jako artefakty aplikacji.
  • • propertyGroup to struktura zawierająca właściwości i ich wartości.

Zadanie generowania usługi

W szczególnym przypadku importowania językowego (COBOL, C i PL/1) występuje dodatkowy krok, jakim jest generowanie wiązania interfejsu. Poniższy przykład przedstawia sekcję wykrywania danych skryptu narzędzia Ant odpowiedzialną za generowanie komponentu 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="CICS ECI"/>
	</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>
gdzie:
  • buildService określa nazwę pakietu i klasy wiązania interfejsu.
  • method to metoda w języku Java™ dająca dostęp do systemu EIS.
    • methodName to nazwa metody.
    • methodInput to typ wejściowy.
    • methodOutput to typ wyjściowy.
    • interactionSpec to lista właściwości interakcji.
  • managedConnectionFactory to właściwości fabryki połączeń.
  • connectionSpec to używana klasa połączenia.
  • resourceAdapter to używany adapter zasobów określony za pośrednictwem nazwy projektu lub listy właściwości.

Zadania dodatkowe

Do tej grupy zaliczamy zadania pomocnicze, które nie są konieczne przy generowaniu artefaktów, ale są pomocne.

Zadania createProject można użyć do utworzenia projektu obszaru roboczego.
<adapter:createProject 
		projectName="taderc99Project" 
		projectType="Web" 
		runtimeName="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
gdzie:
  • projectName to nazwa projektu.
  • projectType to typ projektu. Dozwolone wartości to: Java, Web i EJB (wielkość liter nie jest rozróżniana).
  • runtimeName (opcjonalnie) to nazwa środowiska wykonawczego zdefiniowana w oknie Okno->Preferencje->Serwer->Zainstalowane środowiska wykonawcze.
  • addToEAR (opcjonalnie) - dozwolone wartości to:
    • yes
    • no
    • true
    • false
  • EARProjectName (opcjonalnie) to nazwa projektu EAR.
Zadania importResourceAdapter można użyć do utworzenia projektu konektora.
<j2c:importResourceAdapter 
		connectorModule="cicseci602"
		connectorFile="D:\IBM\SDP70\ResourceAdapters\cics15\cicseci602.rar" 
		targetRuntime="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
gdzie:

Definiowanie właściwości

Odwołania do agentów wykrywania i programu piszącego obszaru roboczego następują przy użyciu ich nazw QName, które jednoznacznie je identyfikują. Aby odnaleźć wszystkie zarejestrowane agenty wykrywania, programy piszące zasobów obszaru roboczego i konfiguracje importu, należy użyć skryptu displayAll.xml z katalogu przykładów.

Jak można zaobserwować w skryptach przykładowych, wartości przekazywane do agentów wykrywania lub programów piszących zasobów są definiowane w znacznikach propertyGroup i propertyElement. Pierwszy z nich definiuje logiczną grupę właściwości za pomocą zagnieżdżonej struktury. Jej układ oraz wymieniona w niej nazwa grupy i nazwy właściwości powinny być opisane w dokumentacji agenta wykrywania lub programu piszącego zasobu.

Właściwości definiuje się za pomocą atrybutów w postaci par nazwa-wartość. Nazwa jest w tym przypadku właściwością zdefiniowaną wewnętrznie przez agenta wykrywania lub program piszący zasobu i służy do przekazywania wartości. Ważne jest prawidłowe podanie nazwy. Jeśli nie zostanie ona rozpoznana przez komponent, wartość nie zostanie ustawiona.


Opinie