6. Data Source and Repositories

In Tigase XMPP Server 8.0.0 a new concept of data sources was introduced. It was introduced to create distinction between classes responsible for maintaining connection to actual data source and classes operating on this data source.

6.1. Data sources

Relations between DataSourceBean and DataSources

6.1.1. DataSource

DataSource is an interface which should be implemented by all classes implementing access to data source, i.e. implementing access to database using JDBC connection or to MongoDB. Implementation of DataSource is automatically selected using uri provided in configuration and @Repository.Meta annotation on classes implementing DataSource interface.

6.1.2. DataSourcePool

DataSourcePool is interface which should be implemented by classes acting as a pool of data sources for single domain. There is no requirement to create class implementing this interface, however if implementation of DataSource is blocking and does not support concurrent requests, then creation of DataSourcePool is recommended. An example of such case is implementation of DataRepositoryImpl which executes all requests using single connection and for this class there is DataRepositoryPool implementing DataSourcePool interface and improving performance. Implementation of DataSourcePool is automatically selected using uri provided in configuration and @Repository.Meta annotation on classes implementing DataSourcePool interface.

6.1.3. DataSourceBean

This class is a helper class and provides support for handling multiple data sources. You can think of a DataSourceBean as a map of named DataSource or DataSourcePool instances. This class is also responsible for initialization of data source. Moreover, if data source will change during runtime DataSourceBean is responsible for firing a DataSourceChangedEvent to notify other classes about this change.

6.2. User and authentication repositories

This repositories may be using existing (configured and initialized) data sources. However, it is also possible to that they may have their own connections. Usage of data sources is recommended if possible.

Relations between AuthRepositories and DataSources

Relations between UserRepositories and DataSources

6.2.1. AuthRepository and UserRepository

This are a base interfaces which needs to be implemented by authentication repository (AuthRepository) and by repository of users (UserRepository). Classes implementing this interfaces should be only responsible for retrieving data from data sources.

6.2.2. AuthRepositoryPool and UserRepositoryPool

If class implementing AuthRepositoryPool or UserRepositoryPool is not using data sources or contains blocking or is not good with concurrent access, then it should be wrapped within proper repository pool. Most of implementations provided as part of Tigase XMPP Server do not require to be wrapped within repository pool. If your implementation is blocking or not perform well with concurrent access (ie. due to synchronization), then it should be wrapped within this pool. To wrap implementation within a pool, you need to set pool-cls property of configured user or authentication repository in your configuration file.

6.2.3. AuthRepositoryMDPoolBean and UserRepositoryMDPoolBean

This classes are for classes implementing AuthRepository and UserRepository what DataSourceBean is for classes implementing DataSource interface. This classes holds map of named authentication or user repositories. They are also responsible for initialization of classes implementing this repositories.

6.3. Other repositories

It is possible to implement repositories not implementing AuthRepository or UserRepository. Each type of custom repository should have its own API and its own interface.

Relations between custom repositories and DataSources

6.3.1. DataSourceAware

Custom repositories should implement they own interface specifying its API. This interfaces should extend DataSourceAware interface which is base interface required to be implemented by custom repositories. DataSourceAware has a method setDataSource() which will be called with instance of data source to initialize instance of custom repository. Implementations should be annotated with @Repository.Meta implementation to make the automatically selected for proper type of DataSource implementation.

6.3.2. MDRepositoryBean

It is required to create a class extending MDRepositoryBean implementing same custom interface as the custom repository. This class will be a multi domain pool, allowing you to have separate implementation of custom repository for each domain. Moreover, it will be responsible for creation and initialization of your custom repository instances.