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.
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
<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>
<?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>
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>
Zadania dodatkowe
Do tej grupy zaliczamy zadania pomocnicze, które nie są konieczne przy generowaniu artefaktów, ale są pomocne.
<adapter:createProject projectName="taderc99Project" projectType="Web" runtimeName="J2EE Runtime Library" addToEAR="yes" EARProjectName="TestEAR"/>gdzie:
<j2c:importResourceAdapter connectorModule="cicseci602" connectorFile="D:\IBM\SDP70\ResourceAdapters\cics15\cicseci602.rar" targetRuntime="J2EE Runtime Library" addToEAR="yes" EARProjectName="TestEAR"/>
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.