package com.systemtier.web.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSourceField;
import com.smartgwt.client.data.fields.DataSourceDateField;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.util.JSOHelper;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.systemtier.web.client.GwtRpcDataSource;
import java.util.List;
/**
* Example GwtRpcDataSource
implementation.
*
* @author Aleksandras Novikovas
* @author System Tier
* @version 1.0
*/
public class TestDataSource
extends GwtRpcDataSource {
public TestDataSource () {
DataSourceField field;
field = new DataSourceIntegerField ("id", "ID");
field.setPrimaryKey (true);
// AutoIncrement on server.
field.setRequired (false);
addField (field);
field = new DataSourceTextField ("name", "NAME");
field.setRequired (true);
addField (field);
field = new DataSourceDateField ("date", "DATE");
field.setRequired (false);
addField (field);
}
@Override
protected void executeFetch (final String requestId, final DSRequest request, final DSResponse response) {
// These can be used as parameters to create paging.
// request.getStartRow ();
// request.getEndRow ();
// request.getSortBy ();
TestServiceAsync service = GWT.create (TestService.class);
service.fetch (new AsyncCallback> () {
public void onFailure (Throwable caught) {
response.setStatus (RPCResponse.STATUS_FAILURE);
processResponse (requestId, response);
}
public void onSuccess (List result) {
ListGridRecord[] list = new ListGridRecord[result.size ()];
for (int i = 0; i < list.length; i++) {
ListGridRecord record = new ListGridRecord ();
copyValues (result.get (i), record);
list[i] = record;
}
response.setData (list);
processResponse (requestId, response);
}
});
}
@Override
protected void executeAdd (final String requestId, final DSRequest request, final DSResponse response) {
// Retrieve record which should be added.
JavaScriptObject data = request.getData ();
ListGridRecord rec = new ListGridRecord (data);
TestRecord testRec = new TestRecord ();
copyValues (rec, testRec);
TestServiceAsync service = GWT.create (TestService.class);
service.add (testRec, new AsyncCallback () {
public void onFailure (Throwable caught) {
response.setStatus (RPCResponse.STATUS_FAILURE);
processResponse (requestId, response);
}
public void onSuccess (TestRecord result) {
ListGridRecord[] list = new ListGridRecord[1];
ListGridRecord newRec = new ListGridRecord ();
copyValues (result, newRec);
list[0] = newRec;
response.setData (list);
processResponse (requestId, response);
}
});
}
@Override
protected void executeUpdate (final String requestId, final DSRequest request, final DSResponse response) {
// Retrieve record which should be updated.
// Next line would be nice to replace with line:
// ListGridRecord rec = request.getEditedRecord ();
ListGridRecord rec = getEditedRecord (request);
TestRecord testRec = new TestRecord ();
copyValues (rec, testRec);
TestServiceAsync service = GWT.create (TestService.class);
service.update (testRec, new AsyncCallback () {
public void onFailure (Throwable caught) {
response.setStatus (RPCResponse.STATUS_FAILURE);
processResponse (requestId, response);
}
public void onSuccess (TestRecord result) {
ListGridRecord[] list = new ListGridRecord[1];
ListGridRecord updRec = new ListGridRecord ();
copyValues (result, updRec);
list[0] = updRec;
response.setData (list);
processResponse (requestId, response);
}
});
}
@Override
protected void executeRemove (final String requestId, final DSRequest request, final DSResponse response) {
// Retrieve record which should be removed.
JavaScriptObject data = request.getData ();
final ListGridRecord rec = new ListGridRecord (data);
TestRecord testRec = new TestRecord ();
copyValues (rec, testRec);
TestServiceAsync service = GWT.create (TestService.class);
service.remove (testRec, new AsyncCallback () {
public void onFailure (Throwable caught) {
response.setStatus (RPCResponse.STATUS_FAILURE);
processResponse (requestId, response);
}
public void onSuccess (Object result) {
ListGridRecord[] list = new ListGridRecord[1];
// We do not receive removed record from server.
// Return record from request.
list[0] = rec;
response.setData (list);
processResponse (requestId, response);
}
});
}
private static void copyValues (ListGridRecord from, TestRecord to) {
to.setId (from.getAttributeAsInt ("id"));
to.setName (from.getAttributeAsString ("name"));
to.setDate (from.getAttributeAsDate ("date"));
}
private static void copyValues (TestRecord from, ListGridRecord to) {
to.setAttribute ("id", from.getId ());
to.setAttribute ("name", from.getName ());
to.setAttribute ("date", from.getDate ());
}
private ListGridRecord getEditedRecord (DSRequest request) {
// Retrieving values before edit
JavaScriptObject oldValues = request.getAttributeAsJavaScriptObject ("oldValues");
// Creating new record for combining old values with changes
ListGridRecord newRecord = new ListGridRecord ();
// Copying properties from old record
JSOHelper.apply (oldValues, newRecord.getJsObj ());
// Retrieving changed values
JavaScriptObject data = request.getData ();
// Apply changes
JSOHelper.apply (data, newRecord.getJsObj ());
return newRecord;
}
}