package org.marbot.shopdesigner.client.lib; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.types.DSDataFormat; import com.smartgwt.client.types.DSProtocol; /** * Data source with ability to communicate with server by GWT RPC.
* SmartClient natively supports data protocol "clientCustom". This protocol * means that communication with server should be implemented in *transformRequest (DSRequest request)
method. Here is a few
* things to note on transformRequest
implementation:
* DSResponse
object has to be created and
* processResponse (requestId, response)
must be called to finish
* data request. requestId
should be taken from original
* DSRequest.getRequestId ()
.DSRequest
should be copied to
* DSResponse
.DSResponse
should contain at least "status"
* attribute with error code (<0).DSResponse
should contain at least "data"
* attribute with operation type specific data:
* ListGridRecord[]
retrieved records.ListGridRecord[]
with single added record.
* Operation is called on every newly added record.ListGridRecord[]
with single updated record.
* Operation is called on every updated record.ListGridRecord[]
with single removed record.
* Operation is called on every removed record.DSProtocol.CLIENTCUSTOM
("clientCustom" - natively
* supported by SmartClient but should be added to smartGWT) and with data
* format DSDataFormat.CUSTOM
.
*/
public GwtRpcDataSource () {
setDataProtocol (DSProtocol.CLIENTCUSTOM);
setDataFormat (DSDataFormat.CUSTOM);
setClientOnly (false);
}
/**
* Executes request to server.
*
* @param request DSRequest
being processed.
* @return Object
data from original request.
*/
@Override
protected Object transformRequest (DSRequest request) {
String requestId = request.getRequestId ();
DSResponse response = new DSResponse ();
response.setAttribute ("clientContext", request.getAttributeAsObject ("clientContext"));
// Asume success
response.setStatus (0);
switch (request.getOperationType ()) {
case FETCH:
executeFetch (requestId, request, response);
break;
case ADD:
executeAdd (requestId, request, response);
break;
case UPDATE:
executeUpdate (requestId, request, response);
break;
case REMOVE:
executeRemove (requestId, request, response);
break;
default:
// Operation not implemented.
break;
}
return request.getData ();
}
/**
* Executed on FETCH
operation. processResponse (requestId, response)
* should be called when operation completes (either successful or failure).
*
* @param requestId String
extracted from DSRequest.getRequestId ()
.
* @param request DSRequest
being processed.
* @param response DSResponse
. setData (list)
should be called on
* successful execution of this method. setStatus (<0)
should be called
* on failure.
*/
protected abstract void executeFetch (String requestId, DSRequest request, DSResponse response);
/**
* Executed on ADD
operation. processResponse (requestId, response)
* should be called when operation completes (either successful or failure).
*
* @param requestId String
extracted from DSRequest.getRequestId ()
.
* @param request DSRequest
being processed. request.getData ()
* contains record should be added.
* @param response DSResponse
. setData (list)
should be called on
* successful execution of this method. Array should contain single element representing
* added row. setStatus (<0)
should be called on failure.
*/
protected abstract void executeAdd (String requestId, DSRequest request, DSResponse response);
/**
* Executed on UPDATE
operation. processResponse (requestId, response)
* should be called when operation completes (either successful or failure).
*
* @param requestId String
extracted from DSRequest.getRequestId ()
.
* @param request DSRequest
being processed. request.getData ()
* contains record should be updated.
* @param response DSResponse
. setData (list)
should be called on
* successful execution of this method. Array should contain single element representing
* updated row. setStatus (<0)
should be called on failure.
*/
protected abstract void executeUpdate (String requestId, DSRequest request, DSResponse response);
/**
* Executed on REMOVE
operation. processResponse (requestId, response)
* should be called when operation completes (either successful or failure).
*
* @param requestId String
extracted from DSRequest.getRequestId ()
.
* @param request DSRequest
being processed. request.getData ()
* contains record should be removed.
* @param response DSResponse
. setData (list)
should be called on
* successful execution of this method. Array should contain single element representing
* removed row. setStatus (<0)
should be called on failure.
*/
protected abstract void executeRemove (String requestId, DSRequest request, DSResponse response);
}