# Architecture

The RET Adapter Toolkit is a Java framework for developing a suite of adapters to connect the Caplin Platform to a Refinitiv Electronic Trading backend. The framework includes well defined extension points to allow easy customisation, and the toolkit includes a suite of example adapters to help you get started.

## Deployment architecture

The diagram below shows how Adapters created using the RET Adapter Toolkit connect to the Caplin Platform and to RET:

![RET Adapter Architecture](../images/ret-architecture.svg)

Terms used in the diagram:

* **Liberator**\
[Liberator](../caplin-platform/transformer/index.md) is Caplin’s high-performance internet streaming server. It supports live [subscriptions](../caplin-platform/datasource/datasource-subscriptions.md) and private, bi-directional messaging [channels](../caplin-platform/platform-architecture/channels.md) between web clients and data sources on the Caplin Platform.

  Client applications use Caplin’s [StreamLink](../caplin-platform/streamlink/index.md) library to connect to Liberator. Data sources on the Caplin Platform, including Transformer, use Caplin’s [DataSource](../caplin-platform/datasource/index.md) library to connect to Liberator.
* **PAM**\
The Permissioning and Authentication Module (PAM) of Caplin’s Permissioning Service is a Liberator auth module that subscribes to permissioning data from one or more adapters. For more information on Liberator authentication, see [User authentication and permissioning](../caplin-platform/liberator/liberator-user-authentication-and-permissioning.md).
* **Transformer**\
[Transformer](../caplin-platform/transformer/index.md) is Caplin’s application server. Hosts application modules written in Lua, JavaScript, Java, and C. Caplin sell a range of modules that provide services for [data transformation](../caplin-platform/transformer/transformer-deploy-the-refiner-service-module.md), [client notifications](../caplin-platform/transformer/transformer-installing-the-alerts-service.md), [watchlists](../caplin-platform/transformer/configure-transformer-to-host-synchronised-watchlists.md), and [charting](../caplin-platform/transformer/transformer-setting-up-the-charting-blade.md).
* **RET Permissioning Adapter**\
A Caplin [DataSource](../caplin-platform/datasource/index.md), built using the [PermissioningAdapter,opts="nofollow"](https://docs.caplin.com/developer/api/rettoolkit/4.15.0/com/caplin/motif/fx/ret/permissioning/PermissioningAdapter.html) class, that connects to a central source in your backend system for user authorisation data. For more information, see [Permissioning adapter](ret-adapters-feature-list.md#permissioning-adapter).
* **RET Calendar Adapter**\
A Caplin [DataSource](../caplin-platform/datasource/index.md), built using the [CalendarAdapter](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/calendar/CalendarAdapter.html) class, that provides tenor and settlement dates. For more information, see [Calendar adapter](ret-adapters-feature-list.md#calendar-adapter).
* **RET FX Trading Adapter**\
A Caplin [DataSource](../caplin-platform/datasource/index.md), built using the [TradingAdapter](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/fxtrading/FxTradingAdapter.html) class, that provides FX trading functionality. For more information, see [FX trading adapter](ret-adapters-feature-list.md#fx-trading-adapter).
* **RET Orders Adapter**\
A Caplin [DataSource](../caplin-platform/datasource/index.md), built using the [LimitOrderAdapter](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/orders/LimitOrderAdapter.html) class, that provides FX order management functionality. For more information, see [Limit order adapter](ret-adapters-feature-list.md#limit-order-adapter).
* **RET LBN Adapter**\
A Caplin [DataSource](../caplin-platform/datasource/index.md), built using the [LBNAdapter](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/lbn/LBNAdapter.html) class, that provides historical trading data. For more information, see [LBN adapter](ret-adapters-feature-list.md#lbn-adapter).
* **RET Pricing Adapter**\
A Caplin [DataSource](../caplin-platform/datasource/index.md), built using the [PricingAdapter](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/pricing/PricingAdapter.html) class, that provides live streaming prices. For more information, see [Pricing adapter](ret-adapters-feature-list.md#pricing-adapter).
* **SCS Relay**\
Refinitiv Secure Communication Server (SCS) Relay. Provides a secure channel for communication with Refinitiv Electronic Trading.

## Class framework

The RET Adapter Toolkit contains over 100 packages, with six entry points:

**Entry points to the RET Adapter Toolkit’s class framework**

```plantuml
  !pragma useIntermediatePackages false

  package com.caplin.motif.fx.ret.Calendar {
    class CalendarAdapter {
    }
  }

  package com.caplin.motif.fx.ret.fxtrading {
    class FxTradingAdapter {

    }
  }

  package com.caplin.motif.fx.ret.lbn {
    class LBNAdapter {

    }
  }



  package com.caplin.motif.fx.ret.orders {
    class LimitOrderAdapter {

    }
  }

  package com.caplin.motif.fx.ret.permissioning {
    class PermissioningAdapter {

    }
  }

  package com.caplin.motif.fx.ret.pricing {
    class PricingAdapter {

    }
  }


CalendarAdapter -[hidden]- LimitOrderAdapter
FxTradingAdapter -[hidden]- PermissioningAdapter
LBNAdapter -[hidden]- PricingAdapter

```

For a list of features supported by each of the adapter classes above, see [Adapter features](ret-adapters-feature-list.md).

## Extension points

The constructor of each RET adapter class takes a configuration object that provides extension points to help you customise the adapter for your environment.

For example, the constructor for the [LBNAdapter](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/lbn/LBNAdapter.html) class takes an instance of [LBNConfiguration](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/lbn/config/LBNConfiguration.html), which is built using an instance of [LBNConfigurationBuilder](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/lbn/config/LBNConfigurationBuilder.html):

```plantuml
!pragma useIntermediatePackages false

package com.caplin.motif.fx.ret.lbn {
  class LBNAdapter {
    +LBNAdapter(LBNConfiguration)
    +start()
  }
}

package com.caplin.motif.fx.ret.lbn.config {
  class LBNConfiguration {
    +getAdapterConfigurationManager()
    +getBlotterCriteriaFactory()
    +getBlotterRecordFactory()
    +getBlotterRecordIdFactory()
    +getBlotterTypes()
    +getConfigurationLoader()
    +getCustomFieldValuesSerialiser()
    +getDataSource()
    +getLBNCustomFieldsFactory()
    +getUserManager()
    +newAdapterConfiguration()
    +newConfigurationBuilder()
  }

  class LBNConfigurationBuilder {
    +addBlotterType()
    +build()
    +setAdapterConfigurationListener()
    +setBlotterCriteriaFactory()
    +setBlotterRecordFactory()
    +setBlotterRecordIdFactory()
    +setConfigurationLoader()
    +setCustomFieldValuesSerialiser()
    +setDataSource()
    +setLBNCustomFieldsFactory()
    +setUserManager()
  }
}


LBNAdapter - LBNConfiguration : consumes >
LBNConfigurationBuilder -- LBNConfiguration : builds >
```

The source code below shows the creation of an LBN adapter, extended with a custom [UserManager](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/common/permission/UserManager.html) and custom [BlotterRecordIdFactory](https://docs.caplin.com/developer/api/rettoolkit/latest/com/caplin/motif/fx/ret/lbn/blotter/BlotterRecordIdFactory.html):

**Example LBN adapter, with extensions highlighted**

```java
public class MyLBNAdapter
{
  public static void main(String[] args)
  {
    try {
      // Create configuration object
      LBNConfiguration configuration = LBNConfiguration.newConfigurationBuilder()
      .setUserManager(new MyUserManager())
      .setBlotterRecordIdFactory(new MyRecordIdFactory())
      .build();

      // Initialise Apache Log4J
      final ConfigurationLoader configurationLoader =
        configuration.getConfigurationLoader();
      final Log4jConfiguration log4jConfiguration =
        Log4jConfiguration.newDefaultConfiguration().build();
      log4jConfiguration.initialise(configurationLoader);

      // Create and start the adapter
      LBNAdapter adapter = new LBNAdapter(configuration);
      adapter.start();
    } catch (Exception ex) {
      ex.printStackTrace();
      System.exit(1);
    }
  }
}
```
