Defining a new recorder

To capture a new kind of data or an existing kind of data with a new recording technique, define a new recorder.

The only required task for a recorder is to capture data. The recorder does not start or configure a client. If you need to start a client or configure a client so that the client can be recorded by a recorder, see Defining a new client and Defining how a recorder can record a client.

To define a new recorder:

  • Declare a new recorder type in the plugin.xml file. Use the com.ibm.rational.test.lt.recorder.core.recorder extension point.
  • Determine whether the recorder can be run locally, within the workbench, or if it must run remotely in a separate Java virtual machine (JVM).
  • Define a delegate, which is the implementation class of the recorder. The delegate starts and stops the recorder, and captures data.
  • If the recorder is remote, define a remote launcher implementation that provides details about the JVM that runs the delegate.
  • Optionally, define a prerequisite validator that performs basic verification that the recorder can be run on the current computer.
  • Declare which types of recorder packets are emitted by the recorder.

Follow these requirements for implementing the IRecorderDelegate interface:

  • This interface starts and stops the recorder and provides notification about events such as "recorder started," "recorder stopped," and "packet captured." You must provide an implementation of this interface. Optionally, a recorder can support being paused and resumed. If the recorder does not support pause and resume operations, ensure that the implementations of the methods are empty.
  • Most methods are asynchronous. In other words, the framework does not require that the operation be completed when the method returns. For this reason, a recorder delegate must notify the framework when an operation is complete.
  • A recorder can have a configuration. The configuration is built either by using a XML file with the .recconfig extension or by using a wizard. For an example of an XML file, open an existing recording session file, and then click File > Save recording configuration as. The configuration is stored in a RecorderConfiguration object, which is a map of strings to various types of objects. A recorder delegate reads its configuration in its initialize() method.
  • A recorder delegate is given a context in its initialize() method. This context enables the recorder to send notifications of events, record log messages, and send captured packets.
  • Typically, you extend the BaseRecorderDelegate class rather than directly implement IRecorderDelegate interface. The base abstract class provides a basic behavior for most methods, so that you can override only those needed.
  • A recorder must use the getContext().packetCaptured() method to notify the framework when it has captured data.
  • When a recorder constructs a packet, the packet must be filled with a recorder ID. The recorder ID is attributed by the framework and can be retrieved using the getContext().getComponentUniqueId() method.
  • When a recorder constructs a packet, the packet must be filled with time information. The time information must be expressed in a unit that the framework defines. The current time, expressed in the framework units, can be retrieved using the getContext().currentTime() method.
  • A recorder delegate can send messages to the user by invoking the sendUserMessage() method or the getContext().sendMessage(new UserMessage(...)) method if the delegate does not extend the BaseRecorderDelegate class.
  • A recorder delegate can be enabled to communicate with outside entities by setting or retrieving dynamic properties or by receiving messages. A recorder delegate is useful only if you develop a specific UI for the recorder or if you define a client decorator for the recorder.