IBM® Rational Team Concert™ is the collaborative planning, development, integration platform. Organizations are moving to this new platform because of great level of flexibility. IBM Configuration Management Version Control (CMVC) is used for different teams and has a lot data (millions of defects, features, tracks, and so on).
This tutorial explains how to extend the defect management features of CMVC to the Rational Team Concert environment. It describes IBM® Rational® Jazz™ Item Connector Framework, which is used for migrating CMVC data to Rational Team Concert to keep both systems synchronized, based on periodic synchronization.
CMVC is two-tier application that has rich UI and backend. The UI retrieves the data from a database, based on actions in the UI.
The IBM Rational Team Concert Item Connector Framework is the framework provided by IBM® Rational® Jazz™ technology to make connections between an item in a Jazz repository and objects in any external repository.
CMVC is not event-based, so updates cannot be sent to Rational Team Concert based on updated events in CMVC. In contrast, in Rational Team Concert, any update is put in the queue as and when it occurs. So the problem is when data needs to be synchronized on both the sides.
Solution
We took approach of periodic synchronization in which updates from the CMVC are fetched at the end of some specified time interval and pushed to Rational Team Concert, and updates from Rational Team Concert are queued up to be pushed into CMVC. The only condition we have is that data should not be modified at both ends simultaneously, because that would result a conflict.
The CMVC (system is a now-outdated two-tier application for configuration management and defect tracking. CMVC provides the coordination of development activities across all of these phases of the product development lifecycle:
- Configuration management
- Version control
- Change control
- Problem tracking
CMVC encompasses defects, features, tracks, level, releases, files, and user information.
The CMVC Java client API provides a Java interface for client applications to access CMVC server functionality. All CMVC graphical user interface (GUI) clients are now based on this API.
Rational Team Concert overview
IBM Rational Team Concert integrates work item tracking, source control management, continuous builds, iteration planning, and highly configurable process support to adapt to the way you want to work, enabling software developers and architects, project managers, and project owners to work together effectively. Rational Team Concert puts more focus on team cooperation and collaboration. Therefore, it makes development and project management more efficient.
Rational Team Concert provides the flexibility to create your own process template to manage work item types and workflows. You can take advantage of this flexibility to create your own process templates that follow CMVC workflows.
According to the Item Connector Framework provided by Jazz technology, there are two major components to be developed to enable synchronization between a Jazz item and an object from any other repository.
Item Connector Client
This component lies outside of the Jazz server and is used to fetch data from an external repository and push it to Rational Team Concert.
Figure 1. Rational Jazz Team Server components and the Item Connector
External Repository Manager
This component is developed as a Jazz server extension and is used to transfer data from Rational Team Concert to external repository.
See the links in the Resources section for details on the Item Connector framework and creating a new item connection.
This article provides information about how to build a connector, how to import data from CMVC to Rational Team Concert, and how to periodically synchronize data.
Note:
Source code compressed files are attached with the installers.
To start with Rational Team Concert CMVC synchronizer, you need to have a Rational Team Concert client and server installed and running. Configure a development environment on the Rational Team Concert client, and set the server compatible Rational Team Concert-SDK library as the target platform in the client. (This demo is compatible with Rational Team Concert 3.0.1 SDK and CMVC 5.0.)
This has to be a plain Java application that can be run from any machine. The application will fetch the data from CMVC based on the query provided and will import the result into Rational Team Concert.
The incoming connector client comprises these four classes:
- TestSynchronization.java
- CmvcWorkitemObject.java
- CmvcUtil.java
- CMVCObjectSyncThread.java
TestSynchronization.java
This is the main class to start the application. It reads the argument from the property file and starts the synchronizer.
Listing 1. Some of the methods of the TestSynchronization.java class
public ISyncRule getSyncRule(String type) throws
TeamRepositoryException {
IInteropManager interopManager =
getInteropManager(teamRepository);
ISyncRuleHandle[] syncRuleHandles = null;
ISyncRule syncRule = null;
try{
syncRuleHandles = interopManager
.findSyncRulesByExternalTypeNameAndProjectArea(type,
projectArea, null);
if (syncRuleHandles.length == 0) {
throw new TeamRepositoryException("No sync rule is found in
this Project Area.");
} else if (syncRuleHandles.length > 1) {
throw new TeamRepositoryException("More than one sync rule
found.");
}
syncRule = (ISyncRule)teamRepository.itemManager().
fetchCompleteItem(syncRuleHandles[0], IItemManager.REFRESH, null);
} catch(final TeamRepositoryException e) {
System.out.println("Exception while loading sync rule.
+e.getMessage());
}
return syncRule;
} |
Listing 2. Set and Get methods for previous sync time
private void updatePrevSyncTime() {
Date currentTime = new java.util.Date();
Calendar cal = Calendar.getInstance();
cal.setTime(currentTime);
String currentSyncTime = cal.getTime().toString();
DateFormat df1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
currentSyncTime = df1.format(currentTime);
setPrevSyncTime(currentSyncTime);
}
public String getPrevSyncTime() {
return prevSyncTime;
}
public void setPrevSyncTime(String prevSyncTime) {
this.prevSyncTime = prevSyncTime;
} |
CmvcUtil.java
This is a utility class to log into the CMVC family, execute the query, and parse the result in the form of CmvWorkitemObject.
Listing 3. Method to get CMVC artifacts to be synchronized
private static final String SELECT_CLAUSE =
"abstract,compName,name,id,addDate";
public static List<CmvcWorkitemObject>
retrieveCMVCWorkitemListToSynch(final List<String>
cmvcPropNames, final String viewName, final String
prevSyncTime,String whereClause) throws Exception
{
Command command
=CommandFactory.getInstance().getCommand("ReportGeneral");
command.setFamilyInfo(familyInfo);
command.setSessionData(sessionData);
command.addParameterValue("-general", viewName);
command.addParameterValue("-select", SELECT_CLAUSE);
if((whereClause!=null) &&
(!prevSyncTime.equalsIgnoreCase("import"))){
whereClause= whereClause + "AND lastUpdate >= '"+
prevSyncTime+"'";
}
if ((whereClause!=null)&&(whereClause.length()>0))
command.addParameterValue("-where", whereClause);
CommandResults commandResult = null;
try{
commandResult = command.exec();
}catch(Exception e){
e.printStackTrace();
}
return parseCmvcWorkitemResult(commandResult.getMessagesString(),
SELECT_CLAUSE);
} |
CmvcWorkitemObject.java
This is a simple class to hold the data of a CMVC object, such as a defect or feature.
Listing 4. Parsing of the result retrieved from CMVC
public static List<CmvcWorkitemObject> parseCmvcWorkitemResult(
String resultMsg,String selectClause){
if (resultMsg != null && resultMsg.length() > 0) {
final String[] attributes = selectClause.split(COMMA);
String[] values = null;
HashMap<String, String> properties = null;
final String[] workItemInfoList = resultMsg.split(LINE_SEPARATOR);
final ArrayList<CmvcWorkitemObject> workItemList =
new ArrayList<CmvcWorkitemObject>(workItemInfoList.length);
for (final String workItemInfo : workItemInfoList) {
values = workItemInfo.split(FIELD_TOKEN);
int index = 0;
properties = new HashMap<String, String>(attributes.length);
for (final String attribute : attributes) {
properties.put(attribute, values[index++]);
}
workItemList.add(new CmvcWorkitemObject(properties));
}
return workItemList;
}else{
return Collections.emptyList();
}
} |
CMVCObjectSyncThread.java
This class is the core of the incoming connector client, which imports and synchronizes the defect or feature from CMVC to Rational Team Concert.
Listing 5. Method to push CMVC artifacts using item connector framework
Map<String,String> attrMap = cmvcObject.getAttributesMap();
IInteropManager interopMgr = TestSynchronization.interopManager;
URI u;
IExternalState externalState = null;
Map<String, Object> state = null;
try {
u = new URI(cmvcObject.getId());
attrMap.put("unique_identifier", cmvcObject.getId());
attrMap.put("addDate", attrMap.get("addDate").replace('/', '-'));
attrMap.put("id", cmvcObject.getId());
IExternalProxy proxy = interopMgr.findProxybyUri(u, null);
if (proxy == null) {
externalState =
InteropFactory.INSTANCE.createExternalState();
externalState.setState(attrMap);
proxy = InteropFactory.INSTANCE.createExternalProxy();
proxy.setSyncRule(syncRule);
proxy = interopMgr.saveProxyWithStateAndUri(proxy,
externalState, u, null);
}else{
try{
externalState = (IExternalState)
interopMgr.getExternalState(proxy,null);
proxy = (IExternalProxy)proxy.getWorkingCopy();
externalState =
(IExternalState)externalState.getWorkingCopy();
state = externalState.getState();
state.putAll(attrMap);
externalState.setState(state);
externalState =
interopMgr.saveExternalState(externalState,null );
}catch(StaleDataException e){
externalState = (IExternalState)
interopMgr.getExternalState(proxy,null);
externalState =
(IExternalState)externalState.getWorkingCopy();
state = externalState.getState();
state.putAll(attrMap);
externalState.setState(state);
externalState =
interopMgr.saveExternalState(externalState,null );
}
}
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (TeamRepositoryException e) {
e.printStackTrace();
}} |
This plug-in reside on the Rational® Jazz™ Team Server and enables synchronization from Rational Team Concert to CMVC. To enable the periodic synchronization, see Enabling outgoing synchronization in the IBM® Rational® ClearQuest® information center.
It includes following classes:
- CMVCCommands
- CMVCLoginHelper
- CMVCRepository
- RepositoryManager
CMVCCommands
This class sends all of the Rational Team Concert updates to CMVC in the form of a CMVC query, using the CMVC Java API.
Listing 6. Method to create defect in CMVC
public String createDefect(Map<String, Object> state,
CMVCLoginHelper loginInfo) {
Command cmd;
String defectName = null;
try {
cmd = CommandFactory.getInstance().getCommand("DefectOpen");
cmd.setFamilyInfo(loginInfo.getFamilyInfo());
cmd.setSessionData(loginInfo.getSessionData());
for (Iterator<String> it = state.keySet().iterator();
it.hasNext();) {
Object key = it.next();
Object value = state.get(key);
if (value!=null){
if (key.equals("compName"))
key="component";
cmd.addParameterValue((String) key, (String) value);
}
}
System.out.println(cmd.getCmdLine(false));
// execute command
CommandResults commandResult = cmd.exec();
int rc = commandResult.getReturnCode();
if (rc == CommandResults.SUCCESS) {
defectName = commandResult.getValue(cmd.getName(), "name");
}
} catch (Exception e) {
e.printStackTrace();
}
return defectName;
} |
Listing 7. Method to update defect in CMVC
public boolean modifyDefect(Map<String,String>
modifiedAttr,CMVCLoginHelper loginInfo) {
Command cmd;
try {
String id=modifiedAttr.get("id");
String name=getDefectNameFromId(id,loginInfo);
cmd = CommandFactory.getInstance().getCommand("DefectModify");
cmd.setFamilyInfo(loginInfo.getFamilyInfo());
cmd.setSessionData(loginInfo.getSessionData());
cmd.addParameterValue("modify", "\"" + name + "\"");
for (Iterator<String> it = modifiedAttr.keySet().iterator();
it.hasNext();) {
Object key = it.next();
String value = (String)modifiedAttr.get(key);
if ((value!=null)&&(value.trim().length()>0)&&
(!key.equals("id")))
cmd.addParameterValue((String) key, (String) value);
}
// execute command
System.out.println(cmd.getCmdLine(false));
CommandResults commandResult = cmd.exec();
int rc = commandResult.getReturnCode();
if (rc != CommandResults.SUCCESS){
throw new Exception("Command to modify defect was not successfull"
+ commandResult.getFailureMessages());
}else {
return true;
}
} catch (Exception e) {
e.printStackTrace();;
}
return false;
} |
CMVCLoginHelper
This is a utility class to connect to CMVC.
Listing 8. Method to login to CMVC
public boolean loginCMVCFamily() {
try {
CommandResults cmdRes = passwordAuthenticationObject.login(
getFamilyInfo(), sessionDataObject, false, 0,mServerVersion);
int rc1 = cmdRes.getReturnCode();
if (rc1 != CommandResults.SUCCESS)
throw new Exception("Command to login CMVC was not successfull"
+ cmdRes.getFailureMessages());
else{
return true;
}
catch (Exception e) {
e.printStackTrace();
}
return false;
} |
CMVCRepository
This class does all necessary transformation required before sending a command to CMVC. For example Remarks is a mandatory field in CMVC, and is not mapped to the any field in this article. So before sending a command to CMVC, Summary content is also added to the CMVC’s Remarks field to avoid CMVC command failure during defect creation in CMVC.
Listing 9. Method to create final map to send to CMVC
public String Create(Map<String, Object> state){
String defectID = null;
Map<String, Object> tempMap= new HashMap<String, Object>();
try {
Iterator<String> it = state.keySet().iterator();
while(it.hasNext()) {
String key = it.next();
Object value = state.get(key);
if (key.equals("abstract")) {
key = "remarks";
}
tempMap.put(key,value);
}
String defectName = cmd.createDefect(tempMap, loginInfo);
if (defectName!=null)
defectID=cmd.getDefectIdFromName(defectName,loginInfo);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return defectID;
} |
Listing 10. Method to create final map to be updated in CMVC
public boolean update(URI uri, Map<String, ?> newState,List<String>
propertyNames){
Map<String,String> modifiedAttr = new HashMap<String,String>();
boolean updateState = false;
modifiedAttr.put(idPropName, uri.toASCIIString());
try {
for (Iterator<String> it = newState.keySet().iterator();
it.hasNext();) {
String key = it.next();
String value = (String) newState.get(key);
modifiedAttr.put(key, value);
}
if (!modifiedAttr.isEmpty()){
updateState = cmd.modifyDefect(modifiedAttr,loginInfo);
}
} catch (Exception e) {
e.printStackTrace();
}
return updateState;
} |
RepositoryManager
This class is the first point of contact for the Jazz server to trigger outgoing synchronization. It implements the IInteropExternalManager interface and the AbstractInteropExternalManager class. It implements findObject, createObject, and updateState methods and returns the result of any update or creation done in CMVC back to Rational Team Concert.
Listing 11. Method to return creation info
public CreationInfo createObject(String typeName, Map<String, ?>
state,Map<String, Object> returnedState, List<String>
propertyNames,IExternalRepositoryConnection externalConnection,
IProcessArea processArea) {
URI uri = null;
String defectId = null;
try {
boolean login=doCMVCLogin(externalConnection);
if (!login){
throw new RuntimeException(
"Command to login CMVC was not successfull");
}
defectId = gateway.Create( (Map<String, Object>) state);
if (defectId == null) return null;
uri = URI.create(defectId);
Map<String,Object> externalState =
gateway.find(uri.toASCIIString(), propertyNames);
if (externalState == null) {
return null;
}
returnedState.putAll(externalState);
} catch (Exception e) {
throw new RuntimeException(e);
}
return new CreationInfo(uri, null);
} |
Listing 12. Method to retun the result of update called on CMVC
public boolean updateState(String typeName, URI uri, Map<String, ?>
newState, Map<String, ?> lastState, Map<String, Object>
returnedState, List<String> propertyNames,
IExternalRepositoryConnection externalConnection,
IProcessArea processArea) {
boolean isDone=false;
Map<String,Object> newMap = null;
try {
doCMVCLogin(externalConnection);
isDone=gateway.update(uri, newState, propertyNames );
newMap = gateway.find(uri.toASCIIString(),propertyNames);
}catch (Exception ex) {
if (newMap != null) {
returnedState.putAll(newMap);
return false;
} else
throw new RuntimeException(ex);
}
if(isDone)
returnedState.putAll(newState);
return isDone;
} |
There are two compressed files provided with this tutorial (see Downloads):
- IncomingConnectorClient.zip
- ExternalRepositoryManager.zip
Download them, and follow these steps to run the demo (details in the subsections that follow):
- Deploy a work item server extension.
- Create an external repository connection.
- Create a custom attribute.
- Create synchronization rules.
- Run the connector client.
Deploy a work item server extension
Following are the steps for outgoing synchronization process deployment:
- In the Jazz server installation directory (default is /opt/IBM/JazzTeamServer for UNIX systems and C:\Program Files\IBM\JazzTeamServer\server\conf for Microsoft Windows systems), create a new folder, for example:
OutgoingPlugin. Extract all files of ExternalRepositoryManager.zip into the OutgoingPlugin directory.
The Jazz server directory structure will now look like Figure 2.
Figure 2. OutgoingPlugin inside the Jazz Server directory
- Configure the provision_profiles directory inside the server directory:
/opt/IBM/JazzTeamServer/server/conf/jazz/provision_profiles. - Create a new file,
cmvcjazzsync-profile.ini, in the provision_profiles directory. - Enter the absolute path of the Outgoing plug-in directory in that cmvcjazzsync-profile.ini file, as follows:
url=file:/opt/IBM/JazzTeamServer/OutgoingPlugin
featureid= com.ibm.example.repositoryManager.server.feature
If you have configured the Outgoing work item import on a Windows system, put the absolute path as OutgoingPlugin and the featureid as follows:
url=file: ccm/sites/OutgoingPlugin
featureid= com.ibm.example.repositoryManager.server.feature - Reset the server by entering the following link in the Jazz web client https://SERVER-HOST:PORT-NUMBER/jazz/admin/cmd/requestReset
- (Replace server host with your Jazz server name and port number with your port number.)
- Stop the Rational Team Concert server if it is running.
- Start the Rational Team Concert server.
- Go to the admin status page in the web client, and select the Component Status link.
You should see com.ibm.example service on this page, as Figure 3 shows.
Figure 3. Jazz server Component Status page
In case of any problems, check the server logs and refer to the Jazz standard plug-in deployment described in detail at "Instructions on how to provision a new Jazz Server Component" (see Resources for a link).
Create an external repository connection
- To provide CMVC connection information, create an External Repository Connection for this project area using the Synchronization Rules View (Window > Show View > Other > Team > Synchronization Rules).
- Select External Repository Connection > Right Click > New > External Repository Connection.
Figure 4. Dialog window to create an external repository connection
Fill in these properties:
- Name: Can be any name to identify this repository connection
- Connection info: Format is familyname@hostname@port
- User ID:
cmvc.userid. - Password: Password of cmvc.userid (CMVC password)
- Project Area: Select the created project area
- Open the Project Area, select the Process Configuration tab and expand Project Configuration > Configuration Data > Work Items > Types and Attributes. Choose Defect as the type category.
- Select Defect, and click Add to add three custom attributes:
- Field Name: cmvc_id (case-sensitive)
- ID: cmvc_id
- Type: Small String
- Click Save to save the configuration.
Create a synchronization rules
Create the synchronization rules in the project area.
- In the Synchronization Rules View tab, select the project area.
- Right-click on it and select New > Synchronization Rule.
Figure 5. Synchronization Rules view in Rational Team Concert
- When the Synchronization Rule creation window opens, type the name of sync rule:
CMVCDefect(for this example). - In the Type Mapping section, use these values:
- Item type: com.ibm.team.workitem
- Item Type Qualifier: Defect
- Item Manager: workitem manager
- External Repository: Created in a previous step. CMVC repository in this case.
- External Manager: Repositorymanager
- External Type: Defect
- In the Property Mapping section:
- Write
cmvc_idas item property (case -sensitive), set direction to IN, and set ID as external property. Also, select the External identifier check box and click Add. - Write
Filed Againstas item property, direction as IN/OUT , and set compName as external property. Click Add. - Write
Summaryas item property, direction as IN/OUT, and set abstract as external property. Click Add. - Write
Typeas item property, and set direction to IN. Click OK. - Select Type property, uncheck the No Transformation check box, and go to the value mapping section.
- Click Add.
- Write
defectas the item value, and check the default item value check box. - Click OK.
- Write
- In the Property Mapping view, select the Filed Against field, and uncheck the No Transformation check box.
- Go to the Value Transformer combination box, and select Workitem Category transformer from list.
- Save the synchronization rule.
Figure 6. Synchronization rule editor
- Extract the IncomingConnecterClient.zip file anywhere on your desktop. It will list the following files:
- IncomingConnectorClient (Eclipse project, including source code)
- Connector.properties
- lib
- SynchCommand.bat
- Open Connector.properties and configure these parameters required to run the incoming connector:
RTC_USER_NAME: Jazz server authenticated user
RTC_USER_PWD: Jazz server authenticated user password
RTC_REPOSITORY: Jazz server repository url
RTC_PROJECT_AREA: RTC project area name
CMVC_FAMILY_NAME: CMVC family
CMVC_PORT_NO: CMVC family port number.
CMVC_HOST: CMVC family host name
CMVC_USER: CMVC family user name
CMVC_PWD: CMVC family user password
CMVC_QUERY: CMVC query for import and continuous synchronization
CMVC_TYPE_TO_SYNCHRONIZE: Type of CMVC item to be synchronized.
SYNCHRONIZE_SLEEP_TIME: Sleep time for continuous synchronization (in minutes) - Save the file.
- These are the plug-in names that need to be put in the lib folder of demo project, IncomingConnectorClient. These plug-ins are part of Rational Team Concert SDK 3.0.1, which you can download from jazz.net.
- com.ibm.team.calm.foundation.common_3.0.1.v20110602_1036.jar
- com.ibm.team.foundation.client_1.1.1.v20110524_1821.jar
- com.ibm.team.foundation.common_1.1.1.v20110524_1821.jar
- com.ibm.team.foundation.rcp.core_1.1.1.v20110524_1821.jar
- com.ibm.team.foundation.rcp.ui_1.1.1.v20110524_1821.jar
- com.ibm.team.interop.client_3.0.1.v20110602_1036.jar
- com.ibm.team.interop.common_3.0.1.v20110602_1036.jar
- com.ibm.team.process.client_1.2.1.v20110524_1821.jar
- com.ibm.team.process.common_1.2.1.v20110524_1821.jar
- com.ibm.team.repository.client_1.1.1.v20110524_1821.jar
- com.ibm.team.repository.common_1.1.1.v20110524_1821.jar
- com.ibm.team.repository.common.json_1.1.1.v20110524_1821.jar
- com.ibm.team.repository.common.remoteaccess_1.1.1.v20110524_1821.jar
- com.ibm.team.repository.common.remoteaccess.auth_1.1.1.v20110524_1821.jar
- com.ibm.team.repository.common.serialize_1.1.1.v20110524_1821.jar
- com.ibm.team.repository.common.transport_1.1.1.v20110524_1821.jar
- com.ibm.team.workitem.common_3.0.1.v20110602_1036.jar
- org.apache.commons.logging_1.0.4.v200904062259.jar
- org.eclipse.core.jobs_3.4.100.v20090429-1800.jar
- org.eclipse.core.runtime_3.5.0.v20090525.jar
- org.eclipse.emf.common_2.5.0.v200906151043.jar
- org.eclipse.emf.ecore_2.5.0.v200906151043.jar
- org.eclipse.emf.ecore.xmi_2.5.0.v200906151043.jar
- org.eclipse.equinox.common_3.5.1.R35x_v20090807-1100.jar
- org.eclipse.equinox.registry_3.4.100.v20090520-1800.jar
- org.eclipse.jface_3.5.2.M20100120-0800.jar
- org.eclipse.osgi_3.5.2.R35x_v20100126.jar
- commons-codec-1.3.jar
- commons-httpclient-3.0.jar
- httpclient-4.0-beta2.jar
- log4j-1.2.16.jar
- Open the SynchCommand.bat file in Notepad, and configure RTC_JRE and RTC_JAVA.
- Save the file, and then run the SynchCommand.bat script. This will start the synchronizer, and defect data will start importing into Rational Team Concert.
Tip:
Make sure that the Java path is set before running.
| Name | Size | Download method |
|---|---|---|
| ExternalRepositoryManager.zip | 1MB | HTTP |
| IncomingConnectorClient.zip | 506KB | HTTP |
Information about download methods
Learn
- Check these for additional help:
- Find out more about the Jazz Item Connectors, Creating a new Item Connector, and the Components of an Item Connector .
- Get Instructions on how to provision a new Jazz Server Component (Jazz provisioner).
- To configure the project area for synchronization, read Enabling outgoing synchronization.
- More about Rational Team Concert:
- Find Rational Team Concert articles and links to many other resources on IBM developerWorks.
- Check the Rational Team Concert page on Jazz.net.
- Watch the Using Rational Team Concert in a globally distributed team webcast or a demonstration of the Dashboards and reports, or listen to the podcast about IBM Rational Team Concert and Jazz.
- For CMVC-related information:
- Check the CMVC 5.0 InfoCenter.
- Check Migrate CMVC to RTC 3.0.1 for complete CMVC RTC Connector project
- Visit the Rational software area on developerWorks for technical resources and best practices for Rational Software Delivery Platform products.
- Stay current with developerWorks technical events and webcasts focused on a variety of IBM products and IT industry topics.
- Attend a free developerWorks Live! briefing to get up-to-speed quickly on IBM products and tools, as well as IT industry trends.
- Watch developerWorks on-demand demos, ranging from product installation and setup demos for beginners to advanced functionality for experienced developers.
- Improve your skills. Check the Rational training and certification catalog, which includes many types of courses on a wide range of topics. You can take some of them anywhere, any time, and many of the Getting Started ones are free.
Get products and technologies
- Download Rational Team Concert from Jazz.net (requires registration).
- Evaluate IBM software in the way that suits you best: Download it for a trial, try it online, use it in a cloud environment, or spend a few hours in the SOA Sandbox learning how to implement service-oriented architecture efficiently.
Discuss
- Join the Rational Team Concert discussions or ask questions in the Jazz.net forums.
- Rate or review Rational software. It’s quick and easy. Really.
- Share your knowledge and help others who use Rational software by writing a developerWorks article. Find out what makes a good developerWorks article and how to proceed.
- Follow Rational software on Facebook, Twitter (@ibmrational), and YouTube, and add your comments and requests.
- Ask and answer questions and increase your expertise when you get involved in the Rational forums, cafés, and wikis.
- Get social about thought leadership. Join the Rational community to share your Rational software expertise and get connected with your peers.






