Typically, custom implementation of a data source is required to change the loading process of a collection of entities. When
creating a class of this source it should be inherited from CollectionDatasourceImpl, or from GroupDatasourceImpl, or HierarchicalDatasourceImpl, and the loadData() method should be overridden.
Example:
public class MyDatasource extends CollectionDatasourceImpl<SomeEntity, UUID> {
private SomeService someService = AppBeans.get(SomeService.NAME);
@Override
protected void loadData(Map<String, Object> params) {
detachListener(data.values());
data.clear();
for (SomeEntity entity : someService.getEntities()) {
data.put(entity.getId(), entity);
attachListener(entity);
}
}
}
In the example above, data is a base class field that stores a collection of loaded instances. The base class methods, detachListener() and attachListener(), control the assignment of a listener to loaded entities. The listener notifies the data source on changes in instance fields.
To create a custom data source declaratively, a class in the datasourceClass attribute of an XML element should be specified. In case of programmatic creation via DsBuilder, a source class is specified by invoking setDsClass().

