/*
* Copyright 2014-2016 CyberVision, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kaaproject.kaa.server.admin.client.mvp.activity.grid;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.ColumnSortList;
import com.google.gwt.view.client.AsyncDataProvider;
import com.google.gwt.view.client.HasData;
import org.kaaproject.avro.ui.gwt.client.widget.grid.AbstractGrid;
import org.kaaproject.avro.ui.gwt.client.widget.grid.ColumnFilterEvent;
import org.kaaproject.kaa.server.admin.client.util.HasErrorMessage;
import org.kaaproject.kaa.server.admin.client.util.Utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class AbstractDataProvider<T, K> extends AsyncDataProvider<T>
implements ColumnSortEvent.Handler, ColumnFilterEvent.Handler {
protected List<T> data;
private Map<K, T> dataMap = new HashMap<>();
private boolean loaded = false;
private LoadCallback callback;
private AbstractGrid<T, K> dataGrid;
private DataFilter<T> dataFilter;
public AbstractDataProvider(AbstractGrid<T, K> dataGrid, HasErrorMessage hasErrorMessage) {
this(dataGrid, hasErrorMessage, true);
}
/**
* The constructor.
*/
public AbstractDataProvider(AbstractGrid<T, K> dataGrid, HasErrorMessage hasErrorMessage,
boolean addDisplay) {
this.dataGrid = dataGrid;
callback = new LoadCallback(hasErrorMessage);
dataGrid.getDataGrid().addColumnSortHandler(this);
dataGrid.addColumnFilterEventHandler(this);
if (addDisplay) {
addDataDisplay(dataGrid.getDataGrid());
}
}
protected void addDataDisplay() {
addDataDisplay(dataGrid.getDataGrid());
}
@SuppressWarnings("unchecked")
private K getObjectId(T value) {
return (K) dataGrid.getDataGrid().getKeyProvider().getKey(value);
}
public void setDataFilter(DataFilter<T> dataFilter) {
this.dataFilter = dataFilter;
}
/**
* Add the row.
*
* @param row the row
*/
public void addRow(T row) {
data.add(row);
dataMap.put(getObjectId(row), row);
updateRowCount(data.size(), true);
updateRowData(data.size() - 1, data.subList(data.size() - 1, data.size()));
}
public void updateRow(T row) {
int index = data.indexOf(row);
updateRowData(index, data.subList(index, index + 1));
}
public List<T> getData() {
return data;
}
public T getRowData(K key) {
return dataMap.get(key);
}
public void setLoaded(boolean loaded) {
this.loaded = loaded;
}
public void reload() {
this.loaded = false;
loadData(callback);
}
@Override
protected void onRangeChanged(final HasData<T> display) {
if (!loaded) {
loadData(callback);
} else {
updateData();
}
}
protected abstract void loadData(final LoadCallback callback);
@Override
public void onColumnSort(ColumnSortEvent event) {
updateData();
}
@Override
public void onColumnFilter(ColumnFilterEvent event) {
dataGrid.getDataGrid().setPageStart(0);
updateData();
}
/**
* Update data.
*/
public void updateData() {
List<T> filteredData = dataGrid.filter(data);
if (dataFilter != null) {
List<T> newFilteredData = new ArrayList<>();
for (T value : filteredData) {
if (dataFilter.accept(value)) {
newFilteredData.add(value);
}
}
filteredData = newFilteredData;
}
updateRowCount(filteredData.size(), true);
ColumnSortList sortList = dataGrid.getDataGrid().getColumnSortList();
Column<?, ?> column = (sortList == null || sortList.size() == 0) ? null
: sortList.get(0).getColumn();
boolean isSortAscending = !(sortList == null || sortList.size() == 0)
&& sortList.get(0).isAscending();
if (column != null) {
dataGrid.sort(filteredData, column, isSortAscending);
}
updateRowData(0, filteredData);
}
public class LoadCallback {
private HasErrorMessage hasErrorMessage;
public LoadCallback(HasErrorMessage hasErrorMessage) {
this.hasErrorMessage = hasErrorMessage;
}
public void onFailure(Throwable caught) {
GWT.log("AbstractDataProvider.LoadCallback.onFailure(caught):", caught);
Utils.handleException(caught, hasErrorMessage);
}
/**
* On success result.
*
* @param result the result list
*/
public void onSuccess(List<T> result) {
dataGrid.getSelectionModel().clear();
data = result;
if (data == null) {
data = Collections.<T>emptyList();
}
dataMap.clear();
for (T row : data) {
dataMap.put(getObjectId(row), row);
}
updateData();
loaded = true;
hasErrorMessage.clearError();
}
}
}