Hi all,
I am experiencing a strange behaviour when trying to get sort criteria. I have recentrly started working for a company and the code which is used to process the DSRequest handled it in such a way as to allow only one sort condition...
	This code I cannot change but as you can see, if just takes the first instance from the returned sort data. This code works fine. However I have written a new version of GwtSearchParameter to take its place to handle multiple search, however it does not work. This is the new code...
    
TaskTabPage.java snippet
	TaskDS.java
	GwtSearchParameter.java
	The issue I have is that whenever I call request.getSortBy() from my new code, it throws a java.lang.ClassCastException: java.lang.String cannot be cast to com.google.gwt.core.client.JavaScriptObject yet the orininal code can call request.getSortBy() without issue and I'm totally baffled.
Any ideas as to what I have done wrong?
TIA
Dale
SmartGWT 2.2
GWT 2.0.4
					I am experiencing a strange behaviour when trying to get sort criteria. I have recentrly started working for a company and the code which is used to process the DSRequest handled it in such a way as to allow only one sort condition...
Code:
	
	public class GwtRpcDataSourceUtils {
    /**
     * Private constructor. Class should not be instantiated - all functionality is provided through static methods.
     */
    private GwtRpcDataSourceUtils() {
    }
    
    ...
    ...
    
    public static SearchParameter getSearchParameter(DSRequest request) {
        int startIndex = (request.getStartRow() == null || request.getStartRow() < 0) ? 0 : request.getStartRow();
        int endIndex = (request.getEndRow() == null) ? -1 : request.getEndRow();
        int pageSize = -1;
        if (endIndex != -1) {
            pageSize = (endIndex - startIndex) + 1;
        }
        boolean ascending = true;
        String sortBy = null;
        if (request.getSortBy()[0] != null) {
            sortBy = request.getSortBy()[0].getField();
            ascending = request.getSortBy()[0].getSortDirection().equals(SortDirection.ASCENDING);
        }
        @SuppressWarnings("unchecked")
        Map<String, Serializable> criteria = request.getCriteria() != null ? request.getCriteria().getValues() : null;
        return new GwtSearchParameter(startIndex, pageSize, sortBy, ascending, criteria);
    }
}
TaskTabPage.java snippet
Code:
	
	// Setup the data grid configuration
listGrid.setWidth100();
listGrid.setHeight(1);
listGrid.setAlternateRecordStyles(true);
listGrid.setBodyOverflow(Overflow.VISIBLE);
listGrid.setOverflow(Overflow.VISIBLE);
listGrid.setAutoFetchData(true);
listGrid.setDataSource(TaskDS.getInstance(false));
listGrid.setCriteria(getTaskCriteria());
listGrid.setFixedRecordHeights(false);
listGrid.setSelectionType(SelectionStyle.SINGLE);
listGrid.setDataPageSize(20);
listGrid.setFields(/** various fields **/);
// Configure filter attributes
listGrid.setCanSort(true);
listGrid.setSort(new SortSpecifier[]{
    new SortSpecifier(TaskDS.STAGE, SortDirection.ASCENDING),
    new SortSpecifier(DataSourceConstants.SEQUENCE, SortDirection.ASCENDING)
});
Code:
	
	protected void executeFetch(final String requestId, DSRequest request, final DSResponse response) {
	GwtSearchParameter param = new GwtSearchParameter(request);
	RpcServiceLocator.getTaskRpcService().getTasks(userTasks, param,
		new FetchOperationAsyncCallback<TaskDto>(this, requestId, request, response, getMapper())
	);
}
Code:
	
	package com.serengetisystems.tcrm.client.util;
import com.serengetisystems.srgutils.gwt.util.SearchParameter;
import com.serengetisystems.srgutils.search.PagingParameter;
import com.serengetisystems.srgutils.search.PojoPagingParameter;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.SortDirection;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
/**
 * Wrapper class for old GwtSearchParameter as old version does not allow for multiple sort criteria
 *
 * @author dale.ellis
 * @version 1.0
 * Version History
 * -----------------------------------------------------------------------------------
 * Changed By     When        Description
 * dale.ellis     07/04/11    Initial release
 */
public class GwtSearchParameter implements SearchParameter, PagingParameter, Serializable {
    private LinkedHashMap<String, Boolean> multiSortData = new LinkedHashMap<String, Boolean>();
    private Map<String, Serializable> criteria;
    private int startIndex;
    private int pageSize;
    public GwtSearchParameter() {}
    /**
     *
     * @param criteria
     */
    public GwtSearchParameter(Map<String, Serializable> criteria) {
        this(0, Integer.MAX_VALUE, null, true, criteria);
    }
    /**
     *
     * @param request
     */
    public GwtSearchParameter(DSRequest request) {
        this.criteria = (request.getCriteria() != null ? request.getCriteria().getValues() : null);
        this.startIndex = (request.getStartRow() == null || request.getStartRow() < 0) ? 0 : request.getStartRow();
        this.pageSize = -1;
        int endIndex = (request.getEndRow() == null) ? -1 : request.getEndRow();
        if (endIndex != -1) {
            this.pageSize = (endIndex - startIndex) + 1;
        }
        try {
            SortSpecifier[] sorts = request.getSortBy();
            if (sorts != null) {
                setSort(request.getSortBy());
            }
        } catch (Exception ex) {
            // request.getSortBy() causes java.lang.ClassCastException: java.lang.String cannot be cast to com.google.gwt.core.client.JavaScriptObject
        }
    }
    /**
     *
     * @param startIndex
     * @param pageSize
     * @param sortBy
     * @param ascending
     * @param criteria
     */
    public GwtSearchParameter(int startIndex, int pageSize, String sortBy, boolean ascending, Map<String, Serializable> criteria) {
        this.startIndex = startIndex;
        this.pageSize = pageSize;
        this.criteria = criteria;
        if (sortBy != null) {
            multiSortData.put(sortBy, ascending);
        }
    }
    public int getStartIndex()
    {
        return startIndex;
    }
    /**
     * @inheritDoc
     */
    public int getPageSize()
    {
        return pageSize;
    }
    /**
     * Add a sort into the map
     * @param sortBy
     * @param ascending
     */
    public void addSort(String sortBy, boolean ascending) {
        multiSortData.put(sortBy, ascending);
    }
    public boolean isMultiSort() {
        return (multiSortData.size() > 1);
    }
    @Override
    public String getSortBy() {
        return multiSortData.isEmpty() ? null : multiSortData.keySet().iterator().next();
    }
    public Map<String, Boolean> getMultiSortData() {
        return multiSortData;
    }
    @Override
    public boolean isAscending() {
        if (multiSortData.isEmpty()) {
            return true;
        } else {
            return multiSortData.get(multiSortData.keySet().iterator().next());
        }
    }
    // populates multi sortd
    public void setSort(SortSpecifier[] sortBy) {
        for (SortSpecifier sort : sortBy) {
            addSort(sort.getField(), sort.getSortDirection().equals(SortDirection.ASCENDING));
        }
    }
    /**
     * Returns filter criteria.
     * @return filter criteria.
     */
    public Map<String, Serializable> getCriteria()
    {
        return criteria;
    }
}
Any ideas as to what I have done wrong?
TIA
Dale
SmartGWT 2.2
GWT 2.0.4
Comment