package org.ovirt.engine.ui.userportal.client.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.DataSourceField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.DSDataFormat;
import com.smartgwt.client.types.DSProtocol;
import com.smartgwt.client.widgets.grid.ListGridRecord;
/**
* @author Asaf Shakarchi An abstract SmartGWT Datasource for GWT-RPC protocol
*/
public abstract class RPCDataSource<T> extends DataSource {
private List<String> hightlightingFieldNames = new ArrayList<String>();
public RPCDataSource() {
this(null);
}
public RPCDataSource(String name) {
if (name != null) {
System.out.println("Trying to build DS: " + name);
setID(name);
}
setClientOnly(false);
setAutoCacheAllData(false);
setCacheAllData(false);
setDataProtocol(DSProtocol.CLIENTCUSTOM);
setDataFormat(DSDataFormat.CUSTOM);
}
@Override
protected Object transformRequest(DSRequest request) {
try {
DSResponse response = createResponse(request);
switch (request.getOperationType()) {
case FETCH:
executeFetch(request, response);
break;
case ADD:
executeAdd(request, response);
break;
case UPDATE:
executeUpdate(request, response);
break;
case REMOVE:
executeRemove(request, response);
break;
default:
super.transformRequest(request);
break;
}
} catch (Throwable t) {
// CoreGUI.getErrorHandler().handleError("Failure in datasource [" +
// request.getOperationType() + "]", t);
return null;
}
return request.getData();
}
public ListGridRecord[] buildRecords(Collection<T> list) {
if (list == null) {
return null;
}
ListGridRecord[] records = new ListGridRecord[list.size()];
int i = 0;
for (T item : list) {
records[i++] = copyValues(item);
}
return records;
}
@Override
public void addField(DataSourceField field) throws IllegalStateException {
super.addField(field);
field.setHidden(true);
hightlightingFieldNames.add(field.getName());
String name = field.getName() + "-highlight";
String title = field.getTitle();
DataSourceTextField fieldToDisplayHighlighting = new DataSourceTextField(
name, title);
super.addField(fieldToDisplayHighlighting);
}
protected void highlightFilterMatches(final DSRequest request,
final ListGridRecord[] records) {
// Map<String, Object> criteriaMap = request.getCriteria().getValues();
//
// for (String filterName : hightlightingFieldNames) {
// String filterValue = (String) criteriaMap.get(filterName);
// for (ListGridRecord nextRecord : records) {
// String originalData = nextRecord.getAttribute(filterName);
// // String decoratedData = (filterValue != null) ?
// ColoringUtility.highlight(originalData, filterValue)
// // : originalData;
// // nextRecord.setAttribute(filterName + "-highlight", decoratedData);
// }
// }
}
/**
* Extensions should implement this method to retrieve data. Paging
* solutions should use
* {@link #getPageControl(com.smartgwt.client.data.DSRequest)}. All
* implementations should call processResponse() whether they fail or
* succeed. Data should be set on the request via setData. Implementations
* can use buildRecords() to get the list of records.
*
* @param request
* @param response
*/
protected abstract void executeFetch(final DSRequest request,
final DSResponse response);
public abstract T copyValues(ListGridRecord from);
public abstract ListGridRecord copyValues(T from);
/**
* Executed on <code>REMOVE</code> operation.
* <code>processResponse (requestId, response)</code> should be called when
* operation completes (either successful or failure).
*
* @param request
* <code>DSRequest</code> being processed.
* <code>request.getData ()</code> contains record should be
* removed.
* @param response
* <code>DSResponse</code>. <code>setData (list)</code> should be
* called on successful execution of this method. Array should
* contain single element representing removed row.
* <code>setStatus (<0)</code> should be called on failure.
*/
protected void executeRemove(final DSRequest request,
final DSResponse response) {
throw new UnsupportedOperationException(
"This dataSource does not support removal.");
}
protected void executeAdd(final DSRequest request, final DSResponse response) {
throw new UnsupportedOperationException(
"This dataSource does not support addition.");
}
protected void executeUpdate(final DSRequest request,
final DSResponse response) {
throw new UnsupportedOperationException(
"This dataSource does not support updates.");
}
private DSResponse createResponse(DSRequest request) {
DSResponse response = new DSResponse();
response.setAttribute("clientContext",
request.getAttributeAsObject("clientContext"));
// Assume success as the default.
response.setStatus(0);
return response;
}
/**
* Add the specified fields to this data source. When the data source is
* associated with a {@link com.smartgwt.client.widgets.grid.ListGrid}, the
* fields will be displayed in the order they are specified here.
*
* @param fields
* the fields to be added
*/
public void addFields(List<DataSourceField> fields) {
for (DataSourceField field : fields) {
addField(field);
}
}
}