Extending an Adapter
Following on from the previous tutorial — Creating a RET Adapter — we will now extend the Calendar Adapter.
Convenient extension points exist throughout the adapter code. Extension points enable you to extend the functionality of an adapter, tailoring it to your needs.
Download the presentations for this course.
Objectives
In this tutorial, you will achieve the following objectives:
-
Modify tenor dates by implementing new functionality at an extension point.
-
Test the new extension by making and viewing subject requests in the Liberator Explorer
Extension points are adapter features which can be overridden by custom code that is loaded via a configuration class. Each extension point is defined by an interface. This interface is used to determine the behaviour of that particular feature.
Configuring an extension point
All adapter classes in the RET Adapter Toolkit are configured in the same way, where extensions are added via methods on an interface. In the case of the Calendar Adapter, a builder named CalendarConfigurationBuilder
is created by calling the newConfigurationBuilder()
method on CalendarConfiguration
. Extensions are then called via this method. Once all extensions have been set up, we call build()
on the builder to create a CalendarConfiguration
object.
All extension points have a default implementation. So the class CalendarAdapterExample
would run according to its default behaviour - with the following as its main method:
new CalendarAdapter().start();
Take a look at the CalendarAdapterExample
class in your Calendar Adapter workspace. This class creates a CalendarConfigurationBuilder
and also adds two custom implementations to your configuration. The CalendarConfiguration
should be passed as an argument in to the CalendarAdapter
constructor when any defaults have been overridden. When start()
is called the adapter will be initialised, and the extensions as well as any other defaults will be created:
CalendarConfiguration calendarConfiguration = CalendarConfiguration.newConfigurationBuilder()
.setUserManager(new FileBasedUserManager())
.setDataTransformer(new ExampleDataTransformer())
.build();
CalendarAdapter adapter = new CalendarAdapter(calendarConfiguration);
adapter.start();
The source code for the default extensions can be found in <RETAdapterToolikt>/src/
, and serves as a useful starting-point for development.
Extending the Calendar
The Refinitiv Electronic Trading system responds to requests for settlement and tenor dates with a set of ISO 8601 formatted dates.
You can change the format of the dates by implementing the CalendarDataTransformer interface and passing an instance of your class to the CalendarConfigurationBuilder.setDataTransformer()
method.
The example Calendar includes ExampleDataTransformer
, and implementation of CalendarDataTransformer
. In this section we will customise ExampleDataTransformer
to modify the format of tenor dates.
Follow the steps below:
-
Begin by opening the file
src/main/java/com/caplin/example/ret/ExampleDataTransformer.java
-
Next, you will transform the date string values in the Tenor String map —
tenorDates
— using a method that can be used to transform the String map. Instead of an ISO 8601 date format, you will provide dates in the formatyear/day-of-year
.Do this by updating the
onTenorDatesReceived()
method with the following code:@Override public Map<Tenor, String> onTenorDatesReceived(String currencyPair, Map<Tenor, String> tenorDates) { for (Map.Entry<Tenor, String> date : tenorDates.entrySet()) { try { Date retDate = ISO_FORMAT.parse(date.getValue()); date.setValue(CUSTOM_FORMAT.format(retDate)); } catch (ParseException ignored) {} } return tenorDates; }
Save the file when you’re done.
-
Open a command-line interface and rebuild the adapter by executing the following command:
java -jar <cis-blade-toolkit> build CalendarAdapter
-
Now run the adapter using this command:
java -jar <cis-blade-toolkit> run CalendarAdapter -m com.caplin.example.ret.CalendarAdapterExample
The adapter is now ready to receive a request.
-
Finally, test the changes you just made using the Liberator Explorer. Navigate to http://localhost:18080/, click Diagnostics, then click the liberatorexplorer URL link.
If prompted for a username/password, use admin/admin.
-
In the field labelled 'Record', type
/CALENDAR/TENORDATES/GBPUSD
and click Go. This will make a request to the Calendar Adapter to send back Tenor Dates for GBPUSD.You can view the changes to fields in the Tenor column.
Making and Receiving Requests
A simple way to test an adapter is to make a request via the Liberator Explorer as you did earlier with Tenor formats. However, a permissions level might be required when making such requests. In this part we will look at making changes to user permissions by assigning groups.
Follow the steps below:
-
Open the Liberator explorer and log in as an Admin. Do this by navigating to http://localhost:18080/, clicking on Diagnostics, and clicking on the liberatorexplorer URL link.
If you are prompted for a username/password, use admin/admin
. -
Next, open the file
logins.xml
in the Permissioning Adapter and add the groupGlobal
to theadmin
users set of groups:<admins> <user ssoName="admin" password="admin" groups="Global LiberatorStatus" /> </admins>
-
Restart the Permissioning Adapter and Liberator. Do this by opening a Bash terminal on your machine and navigating to your Deployment Framework’s topmost directory. Then execute the following command:
./dfw start
More information on this process is available in this guide: Start and stop components and blades
-
Finally, navigate back to the Liberator Explorer (Step 1). In the Record field, enter the subject
/CALENDAR/TENORDATES/GBPUSD
. You should then receive a response with your custom formatted data (from previous instructions) in the Tenor field.
The object mapping and data service for the subject /CALENDAR/TENORDATES
are configured in the file <workspace>/CalendarAdapter/Blade/overrides/CalendarAdapter/Liberator/etc/rttpd.conf
.
##################################################
#
# Calendar configuration
#
object-map "/CALENDAR/SETTLEMENTDATE/%1" "/CALENDAR/SETTLEMENTDATE/%1/%u"
object-map "/CALENDAR/TENORDATES/%1" "/CALENDAR/TENORDATES/%1/%u"
add-data-service
service-name calendar-data
include-pattern "^/CALENDAR/SETTLEMENTDATE"
include-pattern "^/CALENDAR/TENORDATES"
discard-timeout 300
request-timeout 0
add-source-group
required
add-priority
label CalendarAdapterService
end-priority
end-source-group
end-data-service