IBM® Rational® ProjectConsole, part of the IBM Rational® Team Unifying Platform, is a Web-based project management tool that automates reporting on project status and progress. It gathers data from a variety of sources and automatically generates HTML reports containing charts that display trends or distributions. Its interactive Dashboard lets users create charts for inclusion in the HTML reports and dynamically analyze these charts through drill-downs. When creating graphs, however, a group of default colors is selected that may not suit the needs of all users. This article explains how to change which colors are used (and in what order) on the graphs generated by the Dashboard.
A reason for changing these colors
The colors used by default in the Dashboard are initially bright, vivid colors. Normally, bright and vivid colors are great for graphs since they command the attention of the viewer. However, this may not suit the needs of all users. For instance, if ProjectConsole is being used to track the progress of a project, the color red (one of the first two colors used by default) is normally used to report failures, warnings, problems, etc. Figure 1 is an example of this situation
Figure 1. A trend of growth of four metrics
The growth shown on Figure 1 is, in this scenario, a positive trend of the progress of the report. When presenting this information to a manager or an executive, it may be desirable to present this data with other colors to prevent confusion between the positive trend in the progress of the project and the attributes that we have associated with certain colors.
First and foremost, you will need a Java 2 SDK installed on your system. The author used the Sun distribution of Java 2 SDK, SE v1.4.2_07 on Windows XP Professional, but you may use another version as long as you have a Java compiler available (javac) and the Java Archive application (JAR). After installing a version of Java 2 SDK, it is important to check that the executables are in the PATH environment variable. To do this, right-click on the My Computer icon and select Properties. On the Advanced tab of the System Properties dialog box, click Environment Variables. Under System variables, verify that the path to the Java 2 SDK is present. The actual directory will vary with the different versions of Java 2 SDK. Figure 2 shows the directory in the PATH environment variable on the author's system.
Figure 2. The PATH environment variable
At this point, you should perform a quick test. Open the Microsoft Windows Command Prompt and issue the command javac without any parameters. If successful, issue the command jar without any parameters. If either of the commands return an error indicating that the executable could not be found, there are two possible causes: Either an incorrect PATH environment variable or missing executables. If the PATH is incorrectly set, you can manually correct it in the dialog box shown in Figure 2. If you cannot find the Java 2 SDK executables, download them once more and reinstall them.
The generation of the graphs on the Dashboard is done through two JAR files. One is called analyzer.jar and the other is publisher.jar, analyzer.jar handles how the graphs are displayed within the Dashboard while publisher.jar handles the publication of graphs to other supported file formats (like PNG, PCL, PS, etc.). Both of these JARs contain two Java classes called ColorUtil and Chart. Full definition of both classes is listed in the next section. It is important to only make the suggested changes as described or the Dashboard will not work properly. Depending on your particular needs you may only need to modify one of the two JAR files. For instance, if in your implementation of the ProjectConsole, you only use the Dashboard to generate the graphs and these are never published to other formats, you may only want to modify the analyzer.jar file. In this case, it is not worth the additional effort to also modify the publisher.jar file. Note that if that is what you decide to do, subsequent publish actions from the graphs will result in files with the original default colors.
There is an additional file that will be needed but not modified. It is called klg45.jar but we only need to reference it at compile time. It is recommended to create a directory at the root level to store these JAR files while we modify them. Once we are done, we can place our modified files at the original location (though they must have the same name, of course). The author created a folder titled "PjC" at the root level, which is where the three JAR files are stored. The analyzer.jar and klg45.jar are both located at <Install_Dir>\Common\rwp\webapps\projectconsole\pjc while publisher.jar is located at <Install_Dir>\ProjectConsole\bin. <Install_Dir> is C:\Program Files\Rational by default. Once these three files are in the same location, another environment variable must be modified, CLASSPATH. We'll have to append the full path and filename of these JARs to the end of the present value of this environment variable. This is to ensure that all classes can find one another at compile time. In this example, the directory is C:\PjC so we will append C:\PjC\klg45.jar;C:\PjC\analyzer.jar;C:\PjC\publisher.jar Figure 3 displays this modification.
Figure 3. The CLASSPATH environment variable
Before we go further, a breakdown of how colors are handled in the context of the Dashboard graphs. Since the Dashboard has Java applets at its core, all colors are defined in the same terms. In Java, one way of defining colors is in a trio of numbers from 0-255. Each number represents the saturation of red green and blue, respectively. It can get cumbersome to specify Color(255,255,255) for White and Color(0,0,0) for Black, so the Dashboard uses a class, com.rational.dashboard.utilities.ColorUtil, to manage these
definitions. To handle all of the syntax associated with creating a chart, the Dashboard uses another class, com.rational.dashboard.thirdpartycontrols.Chart
Here is another situation where your specific needs will define how much of this procedure you want to follow. If you are content with the colors defined by the ColorUtil class and only wish to change the order in which the colors are used, you can make the modification specific to the Chart class. The remainder of the document assumes that the addition of colors is intended but you may skip any part that refers to the ColorUtil class and the desired result can still be accomplished.
The full definitions of both classes are as follows in Listing 1 and 2, respectively
Listing 1. The ColorUtil class
package com.rational.dashboard.utilities;
import java.awt.Color;
public class ColorUtil
{
public ColorUtil()
{
}
public static final Color SNOW = new Color(255, 250, 250);
public static final Color GHOST_WHITE = new Color(248, 248, 255);
public static final Color WHITE_SMOKE = new Color(245, 245, 245);
public static final Color GAINSBORO = new Color(220, 220, 220);
public static final Color FLORAL_WHITE = new Color(255, 250, 240);
public static final Color OLD_LACE = new Color(253, 245, 230);
public static final Color LINEN = new Color(250, 240, 230);
public static final Color ANTIQUE_WHITE = new Color(250, 235, 215);
public static final Color PAPAYA_WHIP = new Color(255, 239, 213);
public static final Color BLANCHED_ALMOND = new Color(255, 235, 205);
public static final Color BISQUE = new Color(255, 228, 196);
public static final Color PEACH_PUFF = new Color(255, 218, 185);
public static final Color NAVAJO_WHITE = new Color(255, 222, 173);
public static final Color MOCCASIN = new Color(255, 228, 181);
public static final Color CORNSILK = new Color(255, 248, 220);
public static final Color IVORY = new Color(255, 255, 240);
public static final Color LEMON_CHIFFON = new Color(255, 250, 205);
public static final Color SEASHELL = new Color(255, 245, 238);
public static final Color HONEYDEW = new Color(240, 255, 240);
public static final Color MINT_CREAM = new Color(245, 255, 250);
public static final Color AZURE = new Color(240, 255, 255);
public static final Color ALICE_BLUE = new Color(240, 248, 255);
public static final Color LAVENDER = new Color(230, 230, 250);
public static final Color LAVENDER_BLUSH = new Color(255, 240, 245);
public static final Color MISTY_ROSE = new Color(255, 228, 225);
public static final Color WHITE = new Color(255, 255, 255);
public static final Color BLACK = new Color(0, 0, 0);
public static final Color MIDNIGHT_BLUE = new Color(25, 25, 112);
public static final Color NAVY_BLUE = new Color(0, 0, 128);
public static final Color CORNFLOWER_BLUE = new Color(100, 149, 237);
public static final Color DARK_SLATE_BLUE = new Color(240, 255, 255);
public static final Color SLATE_BLUE = new Color(240, 255, 255);
public static final Color MEDIUM_BLUE = new Color(0, 0, 205);
public static final Color ROYAL_BLUE = new Color(65, 105, 225);
public static final Color BLUE = new Color(0, 0, 255);
public static final Color DODGER_BLUE = new Color(30, 144, 255);
public static final Color DEEP_SKY__BLUE = new Color(0, 19, 255);
public static final Color SKY_BLUE = new Color(135, 206, 235);
public static final Color LIGHT_SKY_BLUE = new Color(135, 206, 250);
public static final Color STEEL_BLUE = new Color(70, 130, 180);
public static final Color LIGHT_BLUE = new Color(176, 196, 222);
public static final Color POWDER_BLUE = new Color(176, 224, 230);
public static final Color PALE_TURQUOISE = new Color(175, 238, 238);
public static final Color DARK_TURQUOISE = new Color(0, 206, 209);
public static final Color MEDIUM_TURQUOISE = new Color(72, 209, 204);
public static final Color TURQUOISE = new Color(64, 224, 208);
public static final Color CYAN = new Color(0, 255, 255);
public static final Color LIGHT_CYAN = new Color(224, 255, 255);
public static final Color CADET_BLUE = new Color(95, 158, 160);
public static final Color AQUAMARINE = new Color(127, 255, 212);
public static final Color DARK_GREEN = new Color(0, 100, 0);
public static final Color OLIVE_GREEN = new Color(85, 107, 47);
public static final Color SEA_GREEN = new Color(32, 178, 170);
public static final Color GREEN = new Color(0, 255, 0);
public static final Color CHARTREUSE = new Color(127, 255, 0);
public static final Color LIME_GREEN = new Color(50, 205, 50);
public static final Color DARK_KHAKI = new Color(189, 183, 107);
public static final Color KHAKI = new Color(240, 230, 140);
public static final Color LIGHT_YELLOW = new Color(255, 255, 224);
public static final Color YELLOW = new Color(255, 255, 0);
public static final Color GOLD = new Color(255, 215, 0);
public static final Color GOLDENROD = new Color(218, 165, 32);
public static final Color DARK_GOLDENROD = new Color(184, 134, 11);
public static final Color ROSY_BROWN = new Color(188, 143, 143);
public static final Color INDIAN_RED = new Color(205, 92, 92);
public static final Color SIENNA = new Color(160, 82, 45);
public static final Color PERU = new Color(205, 133, 63);
public static final Color BURLYWOOD = new Color(222, 184, 135);
public static final Color BEIGE = new Color(245, 245, 220);
public static final Color WHEAT = new Color(245, 222, 179);
public static final Color SANDYBROWN = new Color(244, 164, 96);
public static final Color TAN = new Color(210, 180, 140);
public static final Color CHOCOLATE = new Color(210, 105, 30);
public static final Color BROWN = new Color(165, 42, 42);
public static final Color SALMON = new Color(250, 128, 114);
public static final Color ORANGE = new Color(255, 165, 0);
public static final Color DARK_ORANGE = new Color(255, 140, 0);
public static final Color CORAL = new Color(255, 127, 80);
public static final Color LIGHT_CORAL = new Color(240, 128, 128);
public static final Color TOMATO = new Color(255, 99, 71);
public static final Color ORANGE_RED = new Color(255, 69, 0);
public static final Color RED = new Color(255, 0, 0);
public static final Color HOT_PINK = new Color(255, 105, 180);
public static final Color PINK = new Color(255, 192, 203);
public static final Color PALE_VIOLET_RED = new Color(219, 112, 147);
public static final Color MAROON = new Color(176, 48, 96);
public static final Color VIOLET_RED = new Color(208, 32, 144);
public static final Color MAGENTA = new Color(255, 0, 255);
public static final Color VIOLET = new Color(238, 130, 238);
public static final Color PLUM = new Color(221, 160, 221);
public static final Color ORCHID = new Color(218, 112, 214);
public static final Color DARK_VIOLET = new Color(148, 0, 211);
public static final Color BLUE_VIOLET = new Color(138, 43, 226);
public static final Color PURPLE = new Color(160, 32, 240);
public static final Color MEDIUM_PURPLE = new Color(147, 112, 219);
public static final Color THISTLE = new Color(216, 191, 216);
}
|
Listing 2. The Chart class
package com.rational.dashboard.thirdpartycontrols;
import com.klg.jclass.chart.ChartDataModel;
import com.klg.jclass.chart.ChartDataView;
import com.klg.jclass.chart.ChartDataViewSeries;
import com.klg.jclass.chart.ChartText;
import com.klg.jclass.chart.EventTrigger;
import com.klg.jclass.chart.JCAxis;
import com.klg.jclass.chart.JCAxisTitle;
import com.klg.jclass.chart.JCChart;
import com.klg.jclass.chart.JCChartArea;
import com.klg.jclass.chart.JCChartStyle;
import com.klg.jclass.chart.JCDataIndex;
import com.klg.jclass.chart.JCPickEvent;
import com.klg.jclass.chart.JCPickListener;
import com.rational.dashboard.utilities.ColorUtil;
import java.awt.Color;
import java.util.Iterator;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.border.BevelBorder;
public class Chart extends JCChart
{
class SymPick
implements JCPickListener
{
public void pick(JCPickEvent jcpickevent)
{
JCDataIndex jcdataindex = jcpickevent.getPickResult();
boolean flag = false;
if(jcdataindex != null)
{
Object obj = jcdataindex.getObject();
ChartDataView chartdataview = jcdataindex.getDataView();
int i = jcdataindex.getSeriesIndex();
int j = jcdataindex.getPoint();
if(chartdataview != null && (obj instanceof JCChartArea))
{
String s = chartdataview.getPointLabel(j);
setPickedValue(s);
} else
{
setPickedValue(null);
}
}
}
SymPick()
{
}
}
public Chart()
{
mShowValueLabels = false;
colors = (new Color[] {
ColorUtil.BLUE, ColorUtil.RED, ColorUtil.YELLOW, ColorUtil.ORANGE,
ColorUtil.MAGENTA, ColorUtil.GREEN, ColorUtil.CYAN, ColorUtil.BLACK,
ColorUtil.PINK, ColorUtil.AQUAMARINE, ColorUtil.BEIGE,
ColorUtil.DARK_TURQUOISE, ColorUtil.NAVY_BLUE, ColorUtil.ROSY_BROWN,
ColorUtil.BLANCHED_ALMOND, ColorUtil.SANDYBROWN, ColorUtil.DARK_GREEN,
ColorUtil.DARK_ORANGE, ColorUtil.MEDIUM_PURPLE, ColorUtil.ALICE_BLUE,
ColorUtil.DODGER_BLUE, ColorUtil.DARK_TURQUOISE, ColorUtil.THISTLE,
ColorUtil.PLUM, ColorUtil.HOT_PINK, ColorUtil.TOMATO, ColorUtil.BISQUE,
ColorUtil.MIDNIGHT_BLUE, ColorUtil.DARK_GOLDENROD, ColorUtil.SEA_GREEN,
ColorUtil.BURLYWOOD, ColorUtil.VIOLET, ColorUtil.PALE_VIOLET_RED,
ColorUtil.SALMON, ColorUtil.PURPLE, ColorUtil.OLIVE_GREEN,
ColorUtil.ALICE_BLUE, ColorUtil.CHOCOLATE, ColorUtil.LIGHT_YELLOW,
ColorUtil.LAVENDER_BLUSH
});
SymPick sympick = new SymPick();
addPickListener(sympick);
((JLabel)getHeader()).setText("Untitled");
getLegend().setVisible(true);
getDataView(0).setAutoLabel(true);
getDataView(0).setPickFocus(1);
setTrigger(0, new EventTrigger(0, 4));
setTrigger(0, new EventTrigger(4, 4));
setFillColorIndex(2);
setLineColorIndex(2);
setSymbolColorIndex(2);
getLegend().setBorder(new BevelBorder(0));
getChartArea().setBorder(new BevelBorder(0));
}
public void setPickedValue(String s)
{
mszPickedValue = s;
}
public String getPickedValue()
{
return mszPickedValue;
}
public int getPickedIndex(String s)
{
if(s != null)
{
java.util.List list = mChartDataView.getPointLabels();
Iterator iterator = list.iterator();
for(int i = 0; iterator.hasNext(); i++)
{
String s1 = (String)iterator.next();
if(s1.equals(s))
return i;
}
return -1;
} else
{
return -1;
}
}
public void setModel(ChartDataModel chartdatamodel)
{
mChartDataView = addDataView(0);
mChartDataView.setDataSource(chartdatamodel);
mChartDataView.setAutoLabel(true);
getDataView(0).setPickFocus(1);
mChartDataView.getYAxis().getTitle().setPlacement(2);
mChartDataView.getYAxis().getTitle().setRotation(1);
mChartDataView.setHoleValue(0.0D);
setSeriesColor();
}
public boolean getShowValueLabelsStatus()
{
return mShowValueLabels;
}
public void setShowValueLabelsStatus(boolean flag)
{
mShowValueLabels = flag;
}
public void setSeriesColor()
{
if(mChartDataView != null)
{
if(mChartDataView.getNumSeries() > 0)
{
java.util.List list = mChartDataView.getSeries();
Iterator iterator = list.iterator();
int i = 0;
for(int j = colors.length; iterator.hasNext() && i < j; i++)
{
ChartDataViewSeries chartdataviewseries = (ChartDataViewSeries)iterator.next();
chartdataviewseries.getStyle().setFillColor(colors[i]);
chartdataviewseries.getStyle().setLineColor(colors[i]);
chartdataviewseries.getStyle().setSymbolColor(colors[i]);
}
}
setBatched(false);
update();
}
}
boolean mShowValueLabels;
Color colors[];
protected ChartDataView mChartDataView;
protected String mszPickedValue;
}
|
The easiest way to get started is to copy the entire text of Listing 1 into a text file and save it as "ColorUtil.java" and then copy the entire text of Listing 2 into a different text file and call it "Chart.java". The suggested place to keep these files is the same directory where the three JAR files are stored. You can make as many (or as few) modifications to the ColorUtil.java file as you like. To add a new color definition ensure that you use the same syntax already in the file "public static final Color <Color Name> = new Color (<RED component>, <GREEN component>, <BLUE component>);" where Color Name is a Java variable name (start with a letter and not a Java reserved word), and the component values are integers from 0-255, inclusive. Be sure to save your changes to this file or else the new variables will not be available at compile time. There are initially 96 colors in this file but this is of little consequence, since most charts have less than 96 measures to graph. If you want to verify what color you have specified each combination of three numbers, you can launch Microsoft Paint and on the Menu Tool bar; click Colors and then click Edit Colors. In the Edit Colors dialog box, click the Define Custom Colors button. Figure 4. shows the resulting screen with the fields available. Don't concern yourself with the fields Hue, Sat, or Lum as these will automatically adjust with each combination of values in the corresponding Red, Green and Blue fields. The values shown in Figure 4 correspond to ColorUtil.GOLD = new Color(255,215,0)
Figure 4. The Microsoft Paint Edit Colors dialog box
There is only one statement that we are concerned with in the Chart.java file. It is the public constructor because it contains the initialization of a Color array. This statement is presented in Listing 3.
Listing 3. The colors initialization in Chart public constructor
colors = (new Color[] {
ColorUtil.BLUE, ColorUtil.RED, ColorUtil.YELLOW, ColorUtil.ORANGE, ColorUtil.MAGENTA,
ColorUtil.GREEN, ColorUtil.CYAN, ColorUtil.BLACK, ColorUtil.PINK, ColorUtil.AQUAMARINE,
ColorUtil.BEIGE, ColorUtil.DARK_TURQUOISE, ColorUtil.NAVY_BLUE, ColorUtil.ROSY_BROWN,
ColorUtil.BLANCHED_ALMOND, ColorUtil.SANDYBROWN, ColorUtil.DARK_GREEN,
ColorUtil.DARK_ORANGE, ColorUtil.MEDIUM_PURPLE, ColorUtil.ALICE_BLUE,
ColorUtil.DODGER_BLUE, ColorUtil.DARK_TURQUOISE, ColorUtil.THISTLE, ColorUtil.PLUM,
ColorUtil.HOT_PINK, ColorUtil.TOMATO, ColorUtil.BISQUE, ColorUtil.MIDNIGHT_BLUE,
ColorUtil.DARK_GOLDENROD, ColorUtil.SEA_GREEN, ColorUtil.BURLYWOOD, ColorUtil.VIOLET,
ColorUtil.PALE_VIOLET_RED, ColorUtil.SALMON, ColorUtil.PURPLE, ColorUtil.OLIVE_GREEN,
ColorUtil.ALICE_BLUE, ColorUtil.CHOCOLATE, ColorUtil.LIGHT_YELLOW, ColorUtil.LAVENDER_BLUSH
});
|
As you can see, this is the specific order of colors that are used by graphs on the Dashboard. You can change the order in which these are used by rearranging their order in this statement. If you want to include colors that you have added to ColorUtil class, be sure to use the same spelling and upper-case and lower-case combination. Also, be sure to observe the proper syntax in the statement. Do not omit the soft bracket, parenthesis or semi-colon or the file will not compile.
In order for the modified JARs to function as the originals, certain information must be added to the manifest file of each file. Specifically, we will need to create two text files with certain information so different components of the ProjectConsole can continue to communicate correctly. In the directory that contains the three JAR files as well as your modified Java files, create a text file called manifest.analyzer consisting only of the following line:
Main-Class: com.rational.dashboard.analyzer.AnalyzerMain |
Then, create another text file, manifest.publisher, consisting of the following lines:
Main-Class: com.rational.dashboard.displayserver.publisher.Publisher Class-Path: ..\\Classes\\klg45.jar |
Once all changes are made, the classes can be once more compiled. The best way to do this is to start the Command Prompt and change the directory to the location of the JARs in the created directory structure (C:\PjC in the example given). It is then a simple matter of compiling the classes with the javac executable.
If you added new color definitions to the ColorUtil.java file, the first command to issue is javac ColorUtil.java. As a result of this command, a new file should appear in that directory, namely ColorUtil.class. To ensure that your new definitions are available when we compile the Chart.java file, we now need to update the JAR files. Remember that you may only want to update analyzer.jar if you only use the Dashboard to display graphs. This example assumes graphs are published to PNG files for inclusion in ProjectConsole Web reports.
To update the contents of the analyzer JAR, we must first extract its contents with this command to issue for this is:
jar xvf analyzer.jar |
This will take a few seconds and will create several directories and files under the present directory, including "com," "sun," images," "netscape," and "symantec." We should now copy the compiled ColorUtil.class file to the location of the original file with this command:
copy /Y ColorUtil.class com\rational\dashboard\utilities |
Next, we can delete the now obsolete analyzer.jar with the command:
del analyzer.jar |
We can now recreate the analyzer.jar file so it has the newest color definitions with the command:
jar cvfm analyzer.jar manifest.analyzer com images netscape sun symantec |
Finally, we can delete the directories of analyzer.jar, since some of the same directory names are used by publisher.jar. That command is:
rmdir /q /s com netscape images sun symantec |
To update the publisher.jar file, the series of commands is:
jar xvf publisher.jar copy /Y ColorUtil.class com\rational\dashboard\utilities del publisher.jar jar cvfm publisher.jar manifest.publisher com images netscape sun rmdir /q /s com images netscape sun |
Whether you made changes to ColorUtil or not, you should now compile the Chart class. The most important thing to note is that compiling the Chart.java file will result in two class files, since Chart contains an inner class. The command to compile the Chart.java class is javac Chart.java The two class files created are Chart.class and Chart$SymPick.class. Though we made no changes to the SymPick inner class, we will update the JAR files with this file also. First we will update the analyzer.jar file with these commands:
jar xvf analyzer.jar copy /Y Chart*.class com\rational\dashboard\thirdpartycontrols del analyzer.jar jar cvfm analyzer.jar manifest.analyzer com images netscape sun symantec rmdir /q /s com images netscape sun symantec |
Then, we will update the publisher.jar file with these commands:
jar xvf publisher.jar copy /Y Chart*.class com\rational\dashboard\thirdpartycontrols del publisher.jar jar cvfm publisher.jar manifest.publisher com images netscape sun rmdir /q /s com images netscape sun |
The JAR files are now updated with all of the necessary changes. Before copying the files to the original location, check one more time that you have a backup copy of each JAR file. I cannot stress the importance of this since we are making multiple changes and it is much faster to restore the original files than to try to roll back each change. Once you have verified that your backup copies are safely stored somewhere, you may copy analyzer.jar to <Install_Dir>\Common\rwp\webapps\projectconsole\pjc and publisher.jar to <Install_Dir>\ProjectConsole\bin where <Install_Dir> is C:\Program Files\Rational by default.
Note that making changes to the installed ProjectConsole files isn't supported, so keep the files in an accessible location should you ever need to restore them. In addition, if you install a new Service Release, you will need to recreate your changes so save your java source files.
Before the changes can take effect, it is necessary to stop six Windows services, then start them again. These are:
- Rational ProjectConsole Collection Server
- Rational ProjectConsole Dashboard Server
- Rational ProjectConsole Report Server
- Rational Web Platform, HTTP server
- Rational Web Platform, servlet engine
- Rational Web Platform, ReqWeb servlet engine
You may need to clear your browser's cache since the now obsolete Java archive files may still be stored there. Finally, you can do some cleanup. Delete the contents of the directory you used to hold the three JAR files (C:\PjC, in this example). You can also remove the entries from the CLASSPATH environment variable.
You can now create charts in different colors. The colors presented in Figure 5 are arbitrary values; you may use the colors that are standard in your company or your favorite colors, of course.
Figure 5. Same graph with new color scheme
- Participate in the discussion forum.
- Share your questions and views on this article with the author and
other readers in the Rational discussion forum.
- To learn more about ProjectConsole, visit the developerWorks ProjectConsole
zone. You'll find technical documentation, how-to articles,
education, downloads, product information, and more.
- Learn about the IBM Software Development Platform and why Rational products are an important component of it..
- Browse for books on these and other technical topics.
Comments (Undergoing maintenance)






