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()
.