Package com.smartgwt.client.docs
Interface DsFacade
public interface DsFacade
DataSource Facade pattern
The DataSource Facade pattern means implementing a DataSource that fulfills itsDSRequests
by passing them on to another DataSource.
This can be useful for:
- various testing purposes, such as introducing long delays or intermittent failures to see how your code responds
- implementing application-specific caching behaviors that go beyond
DataSource.cacheAllData
or automatic caching done byResultSet
- providing DSResponses that make use of data from two or more DataSources, by sending
DSRequests to those other DataSources, waiting for both to respond, then combining the
response data (note that for something like a SQL join, you should instead use
DataSourceField.includeFrom
if you have Smart GWT Pro or better) - slight modifications of data returned by another DataSource (although consider just
using
OperationBinding.operationId
for this)
This facade pattern can be implemented either server-side or client-side:
- server-side (Smart GWT Pro or better), implement a custom DataSource (see QuickStart Guide) and implement the server-side API DataSource.execute() by calling DataSource.execute() on some other DataSource, then return the DSResponse that results.
- client-side, use
dataProtocol:"clientCustom"
. TheFacadeDataSource
provides a specific implementation that is useful for testing purposes. Alternative, the code below shows the simplest possible code for the facade pattern when implemented client-side viadataProtocol:"clientCustom"
- requests are forwarded to another DataSource, and the responses are returned completely unchanged. - When changes are made to the primary DataSource, DBCs that are using the
facadeDataSource will not automatically update caches, since they are bound to the
facadeDataSource and not to the primary DataSource which was changed. To fix this, add
a call to
facadeDataSource.updateCaches()
as shown below
DataSource facadeDataSource = null; DataSource supplyItemDS = DataSource.get("SupplyItem"); supplyItemDS.addDataChangedHandler(new DataChangedHandler() { @Override public void onDataChanged(DataChangedEvent event) { facadeDataSource.updateCaches(event.getDsResponse()); } }); facadeDataSource = new DataSource() { { setDataProtocol(DSProtocol.CLIENTCUSTOM); setInheritsFrom(supplyItemDS); } @Override public Object transformRequest(final DSRequest dsRequest) { final DataSource superDS = DataSource.get(getInheritsFrom()), selfDS = this; final DSRequest derivedDSRequest = cloneDSRequest(dsRequest); derivedDSRequest.setShowPrompt(false); derivedDSRequest.setCallback(new DSCallback() { @Override public void execute(DSResponse dsResponse, Object data, DSRequest derivedDSRequest) { selfDS.processResponse(dsRequest.getRequestId(), superDS.cloneDSResponse(dsResponse)); } }); superDS.execute(derivedDSRequest); return dsRequest.getData(); } };
Check out this example of the DataSource facade pattern being used to create a DataSource that may work with already loaded data, or may use another DataSource to fulfill its requests.