Building IBM i applications with Rational Team Concert

Introduction

Rational Team Concert is a part of IBM’s Rational solution for Collaborative Lifecycle Management (CLM).  Rational Team Concert facilitates team collaboration and integrates several software development lifecycle tasks, including source control and build management.  Rational Developer for Power Systems Software provides a development environment for IBM i, AIX, and Linux applications.  Together, Rational Team Concert and Rational Developer for Power Systems Software offer a powerful alternative to developing IBM i applications in a team environment.

This article describes the Rational Team Concert build process as it applies to the development of IBM i applications.  It also illustrates several Rational Developer for Power Systems Software features and concepts.  The main purpose of this article is to introduce Jazz build concepts, IBM i Enterprise build extensions, and general Rational Developer for Power Systems Software functionality, with emphasis on the IBM i Build Specification build style and the new dependency build support that was added to Rational Team Concert version 3.0.

Background

Rational Team Concert is a team collaboration tool powered by the Jazz platform.  Rational Team Concert supports  the agile development process and integrates several software development lifecycle tasks, including the following:
  1. Iteration planning
  2. Process definition
  3. Source control management
  4. Change and defect tracking
  5. Build configuration and management
  6. Reporting
The Jazz technology platform is openly developed on jazz.net.  Beginning with version 3.0, the Jazz platform is supported by a Jazz Team Server, which is a separate installable web archive that you can use to make other applications, such as the Change and Configuration Management application in Rational Team Concert, work together as a single logical server.

The Jazz Team Build component of the Jazz technology platform provides a model that supports the automation, monitoring, and configuration of team builds.  This includes the Jazz Build Engine and an Ant build toolkit, which can publish build information to the Jazz repository.  The following build-related items are stored in the Jazz repository and support the build process:
  • Build definition: Defines a build, such as a weekly, project-wide integration build. 
  • Build engine: Represents a build system that runs on a dedicated server.
  • Build request: Represents a request to run a build.
  • Build result: Represents the output from a build.
The remainder of this article describes how these generic Jazz artifacts apply to building IBM i applications.  It also illustrates the Enterprise Extensions of the build definition, build request, and build result artifacts that are specific to the IBM i platform.

To develop, share, or build an IBM i application, you need the following:
  • These client products downloaded and installed on your workstation:
    • Rational Team Concert
    • Rational Developer for Power Systems Software with the integration feature selected:

      RTC client with RDp integration

      Figure 1: RTC client integration

  • Access to an equivalent version of the Rational Team Concert server.  You can run the server on any supported platform.
  • A user ID with a Developer for IBM Enterprise Platforms client access license (CAL).
  • A Rational Build Forge agent running on the same IBM i server where you will run your builds.

Enterprise Extensions builds

Rational Team Concert includes several Enterprise Extension build definition templates.  Three are specific to building IBM i applications:
  1. IBM i Build Specification – Rational Build Agent
  2. IBM i Command – Jazz Build Engine
  3. IBM i Continuous Load – Jazz Build Engine
Only one of these build definition types supports dependencies–IBM i Build Specification – Rational Build Agent–and it is the only build template discussed in this article.  To configure and work with dependency information, or to use any of the Enterprise Extensions available in Rational Team Concert, your ID requires the Developer for IBM Enterprise Platforms CAL.

i Projects and the i Projects perspective

Rational Developer for Power Systems Software provides an integrated set of application development tools that you can use to edit, compile, and debug applications that target the operating systems (IBM i, AIX, Linux) that run on Power Systems hardware.  Together, Rational Developer for Power Systems Software and Rational Team Concert provide a team collaboration solution for application development on the IBM i platform.

The i Project is a key concept to developing, sharing, and building IBM i resources.  An Eclipse project is a container of resources, organized as folders and files. You can easily share an Eclipse project with Rational Team Concert.  An i Project is one type of Eclipse project, so you can also share it to a Rational Team Concert repository.  An i Project presents IBM i resources as containers and objects; for example, an IBM i source file is represented by a container of source members.  An i Project is associated with one IBM i library and can contain binary objects.  

You can use the i Projects perspective to organize and develop your IBM i projects.  The i Projects perspective provides a set of related and often synchronized views, as illustrated by the following screen capture: 

Related views in i Projects perspective

Figure 2: Related views in i Projects perspective

Use the i Projects Navigator view to work with your IBM i resources.  Many of these views are synchronized; for example, if you select an item in the Outline view, the cursor is positioned in the LPEX editor on the corresponding source line, as indicated by the blue arrow above. 

Object icons in navigator views, such as the i Projects Navigator view, include visual qualifiers; for example, the blue pointer in the upper-right corner of the object icons indicates that the project is remote. The lower-right orange database symbol indicates that the resource is shared in a repository. A yellow background indicates that the resource is out of sync with the repository.  Many of these icon qualifiers are common with other types of projects, such as Java projects.

There are several related views in the i Projects perspective. This perspective is ideal for working with your source code offline. You can peruse and edit loaded source files when you are away from your workplace, and then deliver the changes to the IBM library or to the repository when you reconnect to your network.  You can even examine selected resources and their call relationships in a Visual Application Diagram, as shown below.

Visual Application Diagram

Figure 2A: Visual Application Diagram and relationship with properties view

Use the i Project Properties dialog to specify a connection, an associated remote library, and a supported build style.  An i Project supports four types of build styles, as illustrated below. The default style is Build Specification.

Build types supported by the i Project

Figure 3: Build types supported by the i Project

An i Project can contain binary objects. When you add a binary object, such as a *PGM, to an i Project, the IBM i object becomes an object archive resource (OAR) file.  The progress of this transformation is recorded in the Commands Log view of the i Projects perspective. As shown in figure 3A, the object is first packaged in a *SAVF (save file), then copied to IFS as an OAR file.

Commands performed as a binary object

Figure 3A: Commands performed as a binary object are added to an i Project.

After the OAR file is added to the i Project, you can deliver it to the stream.  When you select a resource in the i Project view, property values are updated in the Properties view, as shown in figure 3B.  Notice that the *PGM resource is stored as an OAR file in the workspace.

Binary resources stored as OAR files

Figure 3B: Binary resources are stored as OAR files in repositories.

The IBM i build specification

An IBM i build specification is stored as an XML file and contains the logic to build the objects in an i Project.  A build specification  is designed  through a form-based editor that supports the following four constructs:
  1. Use Project References to select other i Projects, as either prerequisites, or to use their command sets.
  2. Variables are string values you can use in command sets or builders.
  3. Builders define what output objects you want to build, from which source, and in what order.   You can also use builders to specify build dependencies.
  4. Command Sets define the commands used to create the output objects.  These typically consist of the invocation of IBM i commands that act on source members such as compilers; on other output objects such as in the binding of *MODULES into *PGMs or *SRVPGMs; or that create or modify any other IBM i resources.
Build specifications provide a simple abstraction so that you can start building your i Projects with minimal knowledge of underlying build technologies such as Ant or Java. After this introduction, you should be able to open a build specification and be able to identify what it builds, and in what order.

When you configure an i Project to use the Build Specification style, you enable the Open Build Specification action. This option is not available if you select another build style.

Open editor with context sensitive action

Figure 4: Open editor with context sensitive action

The build specification is stored in a resource called .ibuild.  It is not visible from the i Projects Navigator view, but it is visible from other views, such as the Navigator view:

Build specification file

Figure 5: Build specification file

Rational Developer for Power Systems Software includes a build specification editor that ensures that the generated .ibuild XML is correct and properly formatted.  Use this editor to configure your build specifications. Never edit the .ibuild file directly

You can open the build specification editor using the Open Build Specification action, or by double-clicking the .ibuild object from the Navigator view.  The Build Specification editor is tab-based and consists of three tabs:  Use the Overview tab to specify Project References and Project Variables.  This tab also provides build specification summary information.  You can use the variables defined here in your builders or command sets. Just begin the property name with “&,” as illustrated below.

Overview tab

Figure 6: The Overview tab

Use the Builders tab to configure the builders in the build specification.  You can break down your application build into logical build chunks and implement each as a builder; for example, you can have one builder to compile your RPG source members into *MODULES, individual builders to build your other types of source, and builders to bind *MODULES into *PGMs and *SRVPGMs.

When you create a new i Project, a generic build specification is created. It contains a builder for most member types, and a set of supporting command sets.  You can base your own build specification from the default build specification, or start from scratch. Figure 7 shows the Builders page of the Build Specification editor, with the branches for an RPG builder expanded. 

The Builders tab

Figure 7: The Builders tab

The following are some notes on the Builders tab:
  • In the inputs branch, you can specify include and exclude filters.  You can use the resolved build result set as an iterator, wherein the command set is performed on each object, just as you would for compiling source members; or as an aggregate, wherein the command set is performed once for the group, as you would for linking *MODULES into a *PGM or *SRVPGM.
  • You can specify resource (member or object) dependencies.
  • Builders are invoked in the order in which you place them.  You can change the order by specifying Prerequisite Builders for each builder.
  • You can specify one or more Command Sets per builder.  The screen capture shows that this builder is using only one command set: “RPGLE.”
  • Notice that this builder makes use of several default variables, including the following:


    • &SRCLIB, which maps at build time to the library you identified as the load library in your build definition.

      Specify a load library

    • &SP represents a search path.  The search path typically consists of the Load library, the Object library, and any other referenced libraries you specified in your build definition.

      Specify additional libraries


    • &N is replaced at build time by the name of the source member being processed.  There are other special substitution variables: &X : member or object text description. &L: the library that contains the member or object. &F: the file that contains the source member.
The Command Sets tab contains all the locally defined or referenced command sets, as shown in Figure 8.   Note the following in Figure 8:
  • All the command sets displayed in Figure 8 are locally defined. (They belong to this build specification.)  The icon for shared (external) commands is a blue arrow.
  • There are two types of commands: conditional and general.  Conditional commands (indicated by a flag icon; e.g., RPGLE) are performed only if the output object does not exist, or is older than the associated input(s).  General commands are performed on every invocation (e.g., CLP_Always).
  • You can use any predefined, global, builder, or command set variables in the command strings by beginning their unique names with “&”
  • Use conditional command sets to specify separate commands to use when you want to create an output object, or when the output object already exists.

Command sets tab

Figure 8: The Command Sets tab

This section described build specifications. The next section introduces the concept of build definitions. Note the difference between the terms specification and definition.  You must create a build definition to submit builds against your i Projects build specifications.

The “IBM i Build Specification – Rational Build Agent” build definition

You can use the Work Items perspective to configure your build engine and build definitions, run your build definitions, and analyze your build results.  You create build engines and build definitions at the project area level, and can work with them from the Team Artifacts view.

Team Artifacts view

Figure 8a: The Team Artifacts view

You must use Rational Build Engine that connects to a build agent running on the build server.   The user name and password you specify in the build engine are used at build time to authenticate to the build server.  Click Test Connection to confirm the connection to the build agent.

Build Agent tab

Figure 9: The Build Agent tab in the Build Engine editor

When you configure an IBM i Build Specification – Rational Build Agent build definition, make sure you select the correct build engines from the Overview tab.  Use the Jazz Source Control – IBM i tab in the editor to configure each of the following four sections of the build definition:
  1. In the Build Workspace section, select the repository workspace to build from.  This is a mandatory field. Note: You should use a dedicated build workspace.
  2. In the Load Options section, specify what objects to load before starting the build.  You can select to perform a complete build (where all i Projects are loaded before the build), or an incremental build, which loads only your most recent changes, or the changes you have made since a snapshot you specify.  A snapshot is created after each build.
  3. Use the i Project to Library Mappings and Build Order section to select which projects to build, and in what order.   Note that selections you make here affect only what gets built, and the build order. Your selections have no effect on what gets loaded.
  4. Use the Referenced Libraries section to select which libraries to add to the library list before building each i Project.

Build Definition editor

Figure 10: The Build Definition editor tab

Use the Build Options tab in the editor to configure the build operation.

  1. Use the Build Script Information section to configure how to build the i Projects.  The default method is to transform the build specification of each i Project into individual Ant scripts via XSLT, and then invoke Ant to run the generated scripts.  You can also choose to use your own Ant scripts and build targets instead. 
  2. Use the Fail on Errors section to specify whether to stop the build if it encounters errors from IBM i commands and compilation actions.  The default is to stop for errors of severity 40 and higher.
  3. Use the Commands section to indicate IBM i commands to use before and after the i Projects are built.  The default is no commands.
  4. Use the Ant Configuration section to configure Java and Ant; for example, you can add Ant Arguments, such as “-verbose” or “-debug,” to broaden your log inclusion criteria.

Invoking builds and examining build results

You can invoke build definitions from the Team Artifacts view, one of the views available by default on the Work items perspective.    To view the invocations performed on a particular build definition, double-click that definition.  

Builds view

Figure 11: The Builds view

To open a build result, double-click that build in the Builds view. The Overview tab contains summary information and links to related information.

Build results Overview tab

Figure 12: The Build results Overview tab

The Activities tab contains execution timing information.   Notice that, in the example below, approximately half the time was spent on prebuild tasks, and source code data scanning started after 29 seconds elapsed.  The remaining build steps took 27 seconds.

Build results Activities tab

Figure 12A: The Build results Activities tab

The Compilation tab contains compilation results.  The Compiles section lists all the compiled members. If you select a source member, all the errors or warnings generated during its compilation are displayed in the Compile output section.

Build results Compilation tab

Figure 12B: The Build results Compilation tab

The Logs tab contains links to the i Project build logs. 

Build results Logs tab

Figure 12C: The Build results Logs tab

The Logs tab can contain links to up to two files.  The first is a .xml file called bldrec*.xml that records the built objects.  See the sample in listing 1. 
                        <?xml version="1.0" encoding="UTF-8"?>
<buildrecords>
<project name="Maillist">
<builder id="">
<outputs>
<output attribute="*ALL" library="AROD_O" name="MLGRPTR" status="BUILD_SUCCESS" type="*MODULE">
<input file="QRPGLESRC" library="AROD_L" name="MLGRPTR" type="RPGLE"/>
</output>
<output attribute="*ALL" library="AROD_O" name="MLGRPTS" status="BUILD_SUCCESS" type="*SRVPGM">
<input attribute="779235514" library="AROD_O" name="MLGRPTR" type="*MODULE"/>
</output>
</outputs>
</builder>
</project>
</buildrecords>
Listing 1: Build output records

The second log file that is always generated is called build*.log.  It contains messages generated when the Ant scripts run.  See the sample log file in listing 2. 
                        Found a user request for build definition My Build Definition to build Maillist
Substituted the following build property variables:
Substituted the following configuration element property variables:
Should build occur?
Yes: Always build a user initiated request.
ACTIVITY:Starting IBM i Jazz Source Control Pre-Build
AUTH set user account to "alfonso"
SET "BF_AGENT_VERSION"="7.1.1.4-0-0007"
SET "BF_AGENT_PLATFORM"="os400 1 6"
SET "com.ibm.teami.build.ant.failOnError"="true"
SET "buildLabel"="20110627-1531380692"
SET "engineUUID"="_zvOM8JdfEeC69NrJieKptA"
SET "com.ibm.teami.build.ant.generated"="true"
SET "teami.scm.snapshotUUID"="_1H6J46DxEeCezZrRHbi7ZA"
SET "team.scm.acceptBeforeFetch"="false"
SET "team.scm.workspaceUUID"="_PXKvsJa4EeCjDP0DhNDnlQ"
SET "team.scm.fetchDestination"=""
SET "team.scm.deleteDestinationBeforeFetch"="false"
SET "com.ibm.team.build.internal.engine.template.id"="com.ibm.rational.buildforge.buildagent.engine"
SET "team.scm.clearDestinationBeforeFetch"="false"
SET "repositoryAddress"="https://rtcp-arod.torolab.ibm.com:9443/ccm/"
SET "team.scm.componentLoadRules"=""
SET "team.scm.fetchChangesOnly"="true"
SET "buildResultUUID"="_ERGrsaD0EeCezZrRHbi7ZA"
SET "team.scm.buildOnlyIfChanges"="true"
SET "com.ibm.teami.build.ant.failOnError.level"="40"
SET "com.ibm.teami.build.ant.generated.loadDirectory"="/tmp/rtcp/load/IBM i scenario build"
SET "com.ibm.teami.build.ant.icmd.failOnError"="true"
SET "requestUUID"="_ERGrsKD0EeCezZrRHbi7ZA"
SET "buildDefinitionId"="My Build Definition to build Maillist"
SET "com.ibm.team.build.internal.engine.monitoring.threshold"="3"
SET "com.ibm.teami.build.ant.icmd.failOnError.level"="40"
SET "com.ibm.team.build.internal.template.id"="com.ibm.teami.build.ant"
SET "buildRequesterUserId"="DEV01"
EXEC Locale set to '"en_US"'
PTY allocated pseudo-tty *PtyPipe
ENV ANT_HOME=/qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildengine/eclipse/plugins/org.apache.ant_1.7.1.v20090120-1145
ENV BF_AGENT_PLATFORM=os400 1 6
ENV BF_AGENT_VERSION=7.1.1.4-0-0007
ENV BLD_SYSTEM=/qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem
ENV BLD_TOOLKIT=/qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildtoolkit
ENV HOME=/home/ALFONSO
ENV HOSTID=9.26.104.30
ENV HOSTNAME=I7ADT07.TOROLAB.IBM.COM
ENV HOSTTYPE=powerpc
ENV JAVA_HOME=/QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit
ENV JAZZ_PASSWORD_FILE=/qibm/home/alfonso/pwd_jtsadmpwd.txt
ENV JAZZ_USER=JTSADMIN
ENV LANG=en_US
ENV LC__FASTMSG=true
ENV LOCPATH=/usr/lib/nls/loc
ENV LOGNAME=ALFONSO
ENV MACHTYPE=powerpc-ibm-os400
ENV NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/en_US/%N:/usr/lib/nls/msg/en_US/%N.cat
ENV OSTYPE=os400
ENV PASE_LANG=en_US
ENV PASE_LC__FASTMSG=true
ENV PASE_LOCPATH=/usr/lib/nls/loc
ENV PASE_NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/en_US/%N:/usr/lib/nls/msg/en_US/%N.cat
ENV PASE_PATH=/QOpenSys/usr/bin:/usr/ccs/bin:/QOpenSys/usr/bin/X11:/usr/sbin:.:/usr/bin
ENV PASE_TZ=<UTC>0
ENV PATH=/QOpenSys/usr/bin:/usr/ccs/bin:/QOpenSys/usr/bin/X11:/usr/sbin:.:/usr/bin
ENV QIBM_COBOL_SOURCE_DEBUG_VIEW_FIX=Y
ENV QIBM_DESCRIPTOR_STDERR=CRLN=N
ENV QIBM_DESCRIPTOR_STDIN=CRLN=Y
ENV QIBM_DESCRIPTOR_STDOUT=CRLN=N
ENV QIBM_IFS_OPEN_MAX=66000
ENV QIBM_PASE_CCSID=819
ENV QIBM_USE_DESCRIPTOR_STDIO=I
ENV SHLVL=1
ENV TERMINAL_TYPE=5250
ENV TRACEOPT=UNLINK
ENV TZ=<UTC>0
ENV buildDefinitionId=My Build Definition to build Maillist
ENV buildLabel=20110627-1531380692
ENV buildRequesterUserId=DEV01
ENV buildResultUUID=_ERGrsaD0EeCezZrRHbi7ZA
ENV com.ibm.team.build.internal.engine.monitoring.threshold=3
ENV com.ibm.team.build.internal.engine.template.id=com.ibm.rational.buildforge.buildagent.engine
ENV com.ibm.team.build.internal.template.id=com.ibm.teami.build.ant
ENV com.ibm.teami.build.ant.failOnError.level=40
ENV com.ibm.teami.build.ant.failOnError=true
ENV com.ibm.teami.build.ant.generated.loadDirectory=/tmp/rtcp/load/IBM i scenario build
ENV com.ibm.teami.build.ant.generated=true
ENV com.ibm.teami.build.ant.icmd.failOnError.level=40
ENV com.ibm.teami.build.ant.icmd.failOnError=true
ENV engineUUID=_zvOM8JdfEeC69NrJieKptA
ENV repositoryAddress=https://rtcp-arod.torolab.ibm.com:9443/ccm/
ENV requestUUID=_ERGrsKD0EeCezZrRHbi7ZA
ENV team.scm.acceptBeforeFetch=false
ENV team.scm.buildOnlyIfChanges=true
ENV team.scm.clearDestinationBeforeFetch=false
ENV team.scm.componentLoadRules=
ENV team.scm.deleteDestinationBeforeFetch=false
ENV team.scm.fetchChangesOnly=true
ENV team.scm.fetchDestination=
ENV team.scm.workspaceUUID=_PXKvsJa4EeCjDP0DhNDnlQ
ENV teami.scm.snapshotUUID=_1H6J46DxEeCezZrRHbi7ZA
EXEC ExecPreparse
EXEC spawning shell "/bin/sh"
SCRIPT /QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit/bin/java -classpath /qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildengine/eclipse/plugins/org.apache.ant_1.7.1.v20090120-1145/lib/ant-launcher.jar org.apache.tools.ant.launch.Launcher -f /qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildtoolkit/rtcp_ibmiprebuild.xml -lib /qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildtoolkit "-Dcom.ibm.teami.build.ant.failOnError=true" "-DbuildLabel=20110627-1531380692" "-DengineUUID=_zvOM8JdfEeC69NrJieKptA" "-Dcom.ibm.teami.build.ant.generated=true" "-Dteami.scm.snapshotUUID=_1H6J46DxEeCezZrRHbi7ZA" "-Dteam.scm.acceptBeforeFetch=false" "-Dteam.scm.workspaceUUID=_PXKvsJa4EeCjDP0DhNDnlQ" "-Dteam.scm.fetchDestination=" "-Dteam.scm.deleteDestinationBeforeFetch=false" "-Dcom.ibm.team.build.internal.engine.template.id=com.ibm.rational.buildforge.buildagent.engine" "-Dteam.scm.clearDestinationBeforeFetch=false" "-DrepositoryAddress=https://rtcp-arod.torolab.ibm.com:9443/ccm/" "-Dteam.scm.componentLoadRules=" "-Dteam.scm.fetchChangesOnly=true" "-DbuildResultUUID=_ERGrsaD0EeCezZrRHbi7ZA" "-Dteam.scm.buildOnlyIfChanges=true" "-Dcom.ibm.teami.build.ant.failOnError.level=40" "-Dcom.ibm.teami.build.ant.generated.loadDirectory=/tmp/rtcp/load/IBM i scenario build" "-Dcom.ibm.teami.build.ant.icmd.failOnError=true" "-DrequestUUID=_ERGrsKD0EeCezZrRHbi7ZA" "-DbuildDefinitionId=My Build Definition to build Maillist" "-Dcom.ibm.team.build.internal.engine.monitoring.threshold=3" "-Dcom.ibm.teami.build.ant.icmd.failOnError.level=40" "-Dcom.ibm.team.build.internal.template.id=com.ibm.teami.build.ant" "-DbuildRequesterUserId=DEV01"
EXEC start "/"@"I7ADT07.TOROLAB.IBM.COM"
* Buildfile: /qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildtoolkit/rtcp_ibmiprebuild.xml
*
* default:
* [ibmiPreBuild] Not using a proxy to reach https://rtcp-arod.torolab.ibm.com:9443/ccm/
* [ibmiPreBuild] 2011-06-27 15:30:46 [IBM i Jazz Source Control Build Participant] CRCQP3637I: Commands will run in job "094414/QUSER/QZRCSRVS" on host "I7ADT07.TOROLAB.IBM.COM".
* [ibmiPreBuild] Warning: NLS unused message: LoadCmd_28.explanation in: com.ibm.teami.filesystem.client.internal.messages
* [ibmiPreBuild] Warning: NLS unused message: LoadCmd_28.useraction in: com.ibm.teami.filesystem.client.internal.messages
* [ibmiPreBuild] Warning: NLS unused message: LoadCmd_56.explanation in: com.ibm.teami.filesystem.client.internal.messages
* [ibmiPreBuild] Warning: NLS unused message: LoadCmd_56.useraction in: com.ibm.teami.filesystem.client.internal.messages
* [ibmiPreBuild] 2011-06-27 15:30:46 [IBM i File System Agent] CRCQP5101I: Processing change of type MODIFY
* [ibmiPreBuild] 2011-06-27 15:30:46 [IBM i File System Agent] CRCQP5110I: Processing file BARCPYR.RPGLE
* [ibmiPreBuild] 2011-06-27 15:30:47 [IBM i File System Agent] CRCQP5112I: Processing member
* [ibmiPreBuild] 2011-06-27 15:30:47 [IBM i File System Agent] CRCQP5100I: Running command CHGPFM FILE(AROD_L/QRPGLEINC) MBR(BARCPYR) TEXT('FOOCPYR') SRCTYPE(RPGLE)
* [ibmiPreBuild] 2011-06-27 15:30:47 [IBM i File System Agent] CRCQP5100I: Running command CLRPFM FILE(AROD_L/QRPGLEINC) MBR(BARCPYR)
* [ibmiPreBuild] 2011-06-27 15:30:47 [IBM i File System Agent] CRCQP5033I: Member "AROD_L/QRPGLEINC(BARCPYR)" has encoding "Cp1252" in the repository
* [ibmiPreBuild] 2011-06-27 15:30:47 [IBM i File System Agent] CRCQP5022I: Sequence numbers start at "100" and increment by "100"
* [ibmiPreBuild] IBMiPreBuildTask.scanMetadata(): Starting to update metadata for stream IBM i scenario Stream
* [ibmiPreBuild] IBMiPreBuildTask.scanMetadata(): Finished metadata scanning for stream IBM i scenario Stream
*
* BUILD SUCCESSFUL
* Total time: 12 seconds
EXEC end "/"@"I7ADT07.TOROLAB.IBM.COM"
RESULT 0
EOR
ACTIVITY:Starting Build Specification Build
AUTH set user account to "alfonso"
SET "BF_AGENT_VERSION"="7.1.1.4-0-0007"
SET "BF_AGENT_PLATFORM"="os400 1 6"
SET "com.ibm.teami.build.ant.failOnError"="true"
SET "buildLabel"="20110627-1531380692"
SET "engineUUID"="_zvOM8JdfEeC69NrJieKptA"
SET "com.ibm.teami.build.ant.generated"="true"
SET "teami.scm.snapshotUUID"="_1H6J46DxEeCezZrRHbi7ZA"
SET "team.scm.acceptBeforeFetch"="false"
SET "team.scm.workspaceUUID"="_PXKvsJa4EeCjDP0DhNDnlQ"
SET "team.scm.fetchDestination"=""
SET "team.scm.deleteDestinationBeforeFetch"="false"
SET "com.ibm.team.build.internal.engine.template.id"="com.ibm.rational.buildforge.buildagent.engine"
SET "team.scm.clearDestinationBeforeFetch"="false"
SET "repositoryAddress"="https://rtcp-arod.torolab.ibm.com:9443/ccm/"
SET "team.scm.componentLoadRules"=""
SET "team.scm.fetchChangesOnly"="true"
SET "buildResultUUID"="_ERGrsaD0EeCezZrRHbi7ZA"
SET "team.scm.buildOnlyIfChanges"="true"
SET "com.ibm.teami.build.ant.failOnError.level"="40"
SET "com.ibm.teami.build.ant.generated.loadDirectory"="/tmp/rtcp/load/IBM i scenario build"
SET "com.ibm.teami.build.ant.icmd.failOnError"="true"
SET "requestUUID"="_ERGrsKD0EeCezZrRHbi7ZA"
SET "buildDefinitionId"="My Build Definition to build Maillist"
SET "com.ibm.team.build.internal.engine.monitoring.threshold"="3"
SET "com.ibm.teami.build.ant.icmd.failOnError.level"="40"
SET "com.ibm.team.build.internal.template.id"="com.ibm.teami.build.ant"
SET "buildRequesterUserId"="DEV01"
EXEC Locale set to '"en_US"'
PTY allocated pseudo-tty *PtyPipe
ENV ANT_HOME=/qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildengine/eclipse/plugins/org.apache.ant_1.7.1.v20090120-1145
ENV BF_AGENT_PLATFORM=os400 1 6
ENV BF_AGENT_VERSION=7.1.1.4-0-0007
ENV BLD_SYSTEM=/qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem
ENV BLD_TOOLKIT=/qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildtoolkit
ENV HOME=/home/ALFONSO
ENV HOSTID=9.26.104.30
ENV HOSTNAME=I7ADT07.TOROLAB.IBM.COM
ENV HOSTTYPE=powerpc
ENV JAVA_HOME=/QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit
ENV JAZZ_PASSWORD_FILE=/qibm/home/alfonso/pwd_jtsadmpwd.txt
ENV JAZZ_USER=JTSADMIN
ENV LANG=en_US
ENV LC__FASTMSG=true
ENV LOCPATH=/usr/lib/nls/loc
ENV LOGNAME=ALFONSO
ENV MACHTYPE=powerpc-ibm-os400
ENV NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/en_US/%N:/usr/lib/nls/msg/en_US/%N.cat
ENV OSTYPE=os400
ENV PASE_LANG=en_US
ENV PASE_LC__FASTMSG=true
ENV PASE_LOCPATH=/usr/lib/nls/loc
ENV PASE_NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/en_US/%N:/usr/lib/nls/msg/en_US/%N.cat
ENV PASE_PATH=/QOpenSys/usr/bin:/usr/ccs/bin:/QOpenSys/usr/bin/X11:/usr/sbin:.:/usr/bin
ENV PASE_TZ=<UTC>0
ENV PATH=/QOpenSys/usr/bin:/usr/ccs/bin:/QOpenSys/usr/bin/X11:/usr/sbin:.:/usr/bin
ENV QIBM_COBOL_SOURCE_DEBUG_VIEW_FIX=Y
ENV QIBM_DESCRIPTOR_STDERR=CRLN=N
ENV QIBM_DESCRIPTOR_STDIN=CRLN=Y
ENV QIBM_DESCRIPTOR_STDOUT=CRLN=N
ENV QIBM_IFS_OPEN_MAX=66000
ENV QIBM_PASE_CCSID=819
ENV QIBM_USE_DESCRIPTOR_STDIO=I
ENV SHLVL=1
ENV TERMINAL_TYPE=5250
ENV TRACEOPT=UNLINK
ENV TZ=<UTC>0
ENV buildDefinitionId=My Build Definition to build Maillist
ENV buildLabel=20110627-1531380692
ENV buildRequesterUserId=DEV01
ENV buildResultUUID=_ERGrsaD0EeCezZrRHbi7ZA
ENV com.ibm.team.build.internal.engine.monitoring.threshold=3
ENV com.ibm.team.build.internal.engine.template.id=com.ibm.rational.buildforge.buildagent.engine
ENV com.ibm.team.build.internal.template.id=com.ibm.teami.build.ant
ENV com.ibm.teami.build.ant.failOnError.level=40
ENV com.ibm.teami.build.ant.failOnError=true
ENV com.ibm.teami.build.ant.generated.loadDirectory=/tmp/rtcp/load/IBM i scenario build
ENV com.ibm.teami.build.ant.generated=true
ENV com.ibm.teami.build.ant.icmd.failOnError.level=40
ENV com.ibm.teami.build.ant.icmd.failOnError=true
ENV engineUUID=_zvOM8JdfEeC69NrJieKptA
ENV repositoryAddress=https://rtcp-arod.torolab.ibm.com:9443/ccm/
ENV requestUUID=_ERGrsKD0EeCezZrRHbi7ZA
ENV team.scm.acceptBeforeFetch=false
ENV team.scm.buildOnlyIfChanges=true
ENV team.scm.clearDestinationBeforeFetch=false
ENV team.scm.componentLoadRules=
ENV team.scm.deleteDestinationBeforeFetch=false
ENV team.scm.fetchChangesOnly=true
ENV team.scm.fetchDestination=
ENV team.scm.workspaceUUID=_PXKvsJa4EeCjDP0DhNDnlQ
ENV teami.scm.snapshotUUID=_1H6J46DxEeCezZrRHbi7ZA
EXEC ExecPreparse
EXEC spawning shell "/bin/sh"
SCRIPT /QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit/bin/java -classpath /qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildengine/eclipse/plugins/org.apache.ant_1.7.1.v20090120-1145/lib/ant-launcher.jar org.apache.tools.ant.launch.Launcher -f "/tmp/rtcp/load/IBM i scenario build__PXKvsJa4EeCjDP0DhNDnlQ/master.xml" -lib /qibm/home/alfonso/rtc_toolkit/jazz_latest301/jazz/buildsystem/buildtoolkit -listener com.ibm.teami.build.toolkit.listener.IBMiAntBuildListener -logger com.ibm.iant.IBMiAntLogger
EXEC start "/"@"I7ADT07.TOROLAB.IBM.COM"
* Buildfile: /tmp/rtcp/load/IBM i scenario build__PXKvsJa4EeCjDP0DhNDnlQ/master.xml
*
* default:
*
* all:
* [echo] Starting build for project: Maillist
*
* dependencies:
*
* prebuild:
* [isetup] Setting up build for Project Maillist
* [isetup] Fix Pack Libraries = arod_l arod_o
* [isetup] Referenced Libraries =
* [isetup] Search Path (SP) = Fix Pack Libraries + Referenced Libraries = arod_l arod_o
* [isetup] *LIBL has now been set to : QSYS QSYS2 QHLPSYS QUSRSYS AROD_L AROD_O QGPL QTEMP
* [IAntTaskUtils] Command to run: CHGCURLIB CURLIB(arod_o)
* [isetup] CURLIB has now been set to : AROD_O
*
* Build_Referencel_Files:
* [iBuildSpecTargetTask] Iterated input PF_Source_Members specified for the builder Build_Referencel_Files
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGREFP Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGREFP OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_Physical_Files:
* [iBuildSpecTargetTask] Iterated input PF_Source_Members specified for the builder Build_Physical_Files
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMSTP Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMSTP OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_Logical_Files:
* [iBuildSpecTargetTask] Iterated input LF_Source_Members specified for the builder Build_Logical_Files
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMSTL Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMSTL OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMSTL2 Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMSTL2 OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMSTL3 Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMSTL3 OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGNAML Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGNAML OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_Display_Files:
* [iBuildSpecTargetTask] Iterated input DSPF_Source_Members specified for the builder Build_Display_Files
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGINQD Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGINQD OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMNUD Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMNUD OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMTND Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMTND OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGNAMD Type:*FILE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGNAMD OBJTYPE(*FILE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_RPG_Modules:
* [iBuildSpecTargetTask] Iterated input RPGLE_Source_Members specified for the builder Build_RPG_Modules
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGINQR Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGINQR OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGLBLR Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGLBLR OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMTNR Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMTNR OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGNAMR Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGNAMR OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGRPTR Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGRPTR OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is out-of-date. Need to build.
* [IAntTaskUtils] Command to run: CRTRPGMOD MODULE(*CURLIB/MLGRPTR) SRCFILE(AROD_L/QRPGLESRC) SRCMBR(MLGRPTR) OPTION(*EVENTF)
*
* Build_CL_Modules:
* [iBuildSpecTargetTask] Iterated input CLLE_Source_Members specified for the builder Build_CL_Modules
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:PREBUILD Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/PREBUILD OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:PSTBUILD Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/PSTBUILD OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMNUC Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMNUC OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMTNC Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMTNC OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGRPTC Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGRPTC OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGRPTC2 Type:*MODULE in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGRPTC2 OBJTYPE(*MODULE:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_CL_OPM_Programs:
* [iBuildSpecTargetTask] Iterated input CLP_Source_Members specified for the builder Build_CL_OPM_Programs
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:BUILD Type:*PGM in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/BUILD OBJTYPE(*PGM:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_ServicePgm_MLGMTNS:
* [iBuildSpecTargetTask] Aggregated input Modules specified for the builder Build_ServicePgm_MLGMTNS
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGMTNS Type:*SRVPGM in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGMTNS OBJTYPE(*SRVPGM:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_ServicePgm_MLGRPTS:
* [iBuildSpecTargetTask] Aggregated input Modules specified for the builder Build_ServicePgm_MLGRPTS
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MLGRPTS Type:*SRVPGM in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MLGRPTS OBJTYPE(*SRVPGM:*ALL)
* [ibuild] The existing output object is out-of-date. Need to build.
* [IAntTaskUtils] Command to run: UPDSRVPGM SRVPGM(*CURLIB/MLGRPTS) MODULE(AROD_O/MLGRPTR)
*
* Build_Pgm_MAILLIST:
* [iBuildSpecTargetTask] Aggregated input Modules specified for the builder Build_Pgm_MAILLIST
* [iBuildSpecTargetTask] Aggregated input SrvPgm specified for the builder Build_Pgm_MAILLIST
* [ibuild]
* [ibuild] The specified output object after variable substitution: Name:MAILLIST Type:*PGM in libraries: arod_l arod_o
* [ibuild] Found the existing output object in the system: AROD_O/MAILLIST OBJTYPE(*PGM:*ALL)
* [ibuild] The existing output object is up-to-date. No need to build.
*
* Build_Pgm_MLGRPTC:
* [iBuildSpecTargetTask] Aggregated input Modules specified for the builder Build_Pgm_MLGRPTC
* [iBuildSpecTargetTask] Aggregated input SrvPgm specified for the builder Build_Pgm_MLGRPTC
*
* Build_Pgm_MLGRPTC2:
* [iBuildSpecTargetTask] Aggregated input Modules specified for the builder Build_Pgm_MLGRPTC2
* [iBuildSpecTargetTask] Aggregated input SrvPgm specified for the builder Build_Pgm_MLGRPTC2
*
* main:
*
* postbuild:
* [IAntTaskUtils] Command to run: CHGCURLIB CURLIB(QGPL)
* [iteardown] *CURLIB after TearDown : QGPL
* [iteardown] *LIBL has now been set to after TearDown : QSYS QSYS2 QHLPSYS QUSRSYS QGPL QGPL QTEMP
*
* build:
*
* BUILD SUCCESSFUL
* Total time: 12 seconds
EXEC end "/"@"I7ADT07.TOROLAB.IBM.COM"
RESULT 0
EOR
Status:OK



Listing 2: The build log

You can also control how much information is logged with Ant arguments “-verbose” or “-debug.”  Examine the build log in listing 2. Notice that it contains information such as the following:
  1. The build forge agent version, various repository UUIDs (Universally unique ID), the build label, and so forth
  2. The Java and Ant property values that were applied when the Ant scripts were invoked. 
  3. Search for a string called “* Buildfile:” in the log file to discover which Ant scripts were invoked.  You should find two Ant script instances in the provided build log: one for the invocation of the standard rtcp_ibmiprebuild.xml Ant script, and the second for the invocation of the master.xml Ant script which, in turn, invokes each of the i Project build scripts.
    • The first Ant script instance documents the execution of the prebuild tasks (rtcp_ibmiprebuild.xml) that include loading resources from the repository.  It should include an entry for each loaded resource.
    • The second instance documents the build specification scripts that ran for each of the built i Projects (master.xml).  It should include information on each builder, and on each command. Look for lines preceded by “[IAntTaskUtils] Command to run:” to find each of the remote commands that ran during the build.
You can also examine the build results with the Remote System Explorer perspective.  The Audit Report view (see Figure 13) is scoped to a library. You can use it to display the built object signatures.  The build specification build process tags each new or modified object with a signature that is unique to the build repository snapshot.  The signature is stored in the Attribute field that you define, and it is available on every IBM i object.  To display the audit report on a library, find that library in the Remote Systems view, right-click it, and select Show Audit Report.

Audit Report view

Figure 13: The Audit Report view 

The Object Table view is another view in the Remote System Explorer perspective. Use it to work with built objects.   You can modify the contents of this view by selecting columns to display. Click on the column title to change their order.

Object table

Figure 14: The Object table view

Enabling and examining source code scanning

Dependency builds for IBM i applications are supported only by the Build Specification build style.  Build support for dependency information is implemented as a seamless extension of the build specification.  At build time, all explicit dependencies identified in your build specifications are checked first. Only when these checks fail is the collected dependency information used.  Dependency checks are strictly timestamp-based: A resource requires a rebuild when it does not exist, when it is older than any of the source or object dependencies specified in the build specification, or when it is older than any of the dependencies collected by the source code scanners.

Dependency builds rely on data collected by the source code data collection service in the Rational Team Concert server.  Rational Team Concert Enterprise Extensions provides several source scanners, but of these, only two are applicable to  the IBM i platform:   one for the RPG language and one for the Cobol language. The scanners support both the ILE and the OPM programming models.

The source code data collection service stores the dependency data in source code data that is scoped to a stream. The dependencies are logical, and they are resolved into physical dependencies only at build time.

By default, nothing is scanned. You must manually select which streams to scan.    Use the Source Code Data branch under Enterprise Extensions in the Team Artifacts view to control and monitor data scanning on your streams.  The following screen capture illustrates the source code data actions available. You can use them to select which streams to scan, to manually update or reset scanned information, or to create queries.

Available source code data actions

Figure 15: Available source code data actions

You can search source code data for two-way dependencies, which means that an object either depends on the selected resource, or the selected resource depends on certain objects.  To search for dependencies, locate the member of interest in the i Projects or Navigator view and select Enterprise Extension -> Impact Analysis….  The results are displayed in the Source Code Data view, as shown in the following image. Notice that the information line in the view summarizes the result and type of your impact analysis.

Results of impact analysis

Figure 16: Results of impact analysis

Sometimes source code scanning misses some of the dependencies in your code. If this happens, you can edit the source code data with the Source Code Data editor.  Your changes in the User-defined Data section are maintained across rebuilds and source code data resets.

Source Code Data editor

Figure 17: The Source Code Data editor

The use of source code data during build specification builds is enabled by default.  To disable it, in your build definition, set the ibuild.useautodeps property to false.  

Special permissions are required to work with source code data. Use the Process Configuration tab in the Project Area editor to configure these permissions. 

Project configuration permissions for source code data actions

Figure 18: Project configuration permissions for source code data actions

Scanning occurs either asynchronously (default is every hour) or synchronously when you invoke builds or manually reset the stream source code data.  Your system administrator can change several values using the Web “…./ccm/admin” interface, as illustrated by the following screen capture:

Source code data configuration

Figure 19: Source code data configuration

Summary

The objective of this article was to show how Rational Team Concert and Rational Developer for Power Systems Software provide an environment for the development of IBM i applications in a collaborative team environment, with emphasis on the build process.

The Jazz build system provides a comprehensive build infrastructure through a set of build artifacts: the build engine, the build definition, the build request, and the build result.  This article provided a basic introduction to these artifacts and described the enhancements available as Enterprise Extensions to support the building of IBM i applications.

To develop IBM i applications efficiently, several Rational Developer for Power Systems Software features and concepts were illustrated, including the i Project, the i Project perspective, and the build specification.  Several views in the i Projects and the Remote System Explorer perspectives, which are available to help you develop IBM i applications, were also discussed.