/*
* Copyright (c) 2011 PonySDK
* Owners:
* Luciano Broussal <luciano.broussal AT gmail.com>
* Mathieu Barbier <mathieu.barbier AT gmail.com>
* Nicolas Ciaravola <nicolas.ciaravola.pro AT gmail.com>
*
* WebSite:
* http://code.google.com/p/pony-sdk/
*
* 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 com.ponysdk.core.ui.list.dataprovider;
import com.ponysdk.core.server.service.query.Query;
import com.ponysdk.core.server.service.query.Query.QueryMode;
import com.ponysdk.core.server.service.query.SortingType;
import com.ponysdk.core.ui.list.*;
import com.ponysdk.core.ui.list.paging.Pager;
import com.ponysdk.core.ui.list.paging.PagerListener;
import java.util.ArrayList;
import java.util.List;
public abstract class RemoteDataProvider<T> implements PagerListener, FilterListener {
protected final Pager<T> pager;
protected final HasPData<T> hasData;
protected final List<Sortable> sortableList = new ArrayList<>();
protected final List<Resetable> resatableList = new ArrayList<>();
protected final List<HasCriteria> hasCriteriaList = new ArrayList<>();
protected final List<Validable> validableList = new ArrayList<>();
public RemoteDataProvider(final Pager<T> pager, final HasPData<T> hasData) {
this.pager = pager;
this.hasData = hasData;
this.pager.addListener(this);
}
public void registerHasCriteria(final Queriable queriable) {
if (queriable.asSortable() != null) sortableList.add(queriable.asSortable());
if (queriable.asResetable() != null) resatableList.add(queriable.asResetable());
if (queriable.asHasCriteria() != null) hasCriteriaList.add(queriable.asHasCriteria());
if (queriable.asValidable() != null) validableList.add(queriable.asValidable());
}
public List<T> getData() {
final Query query = buildQuery();
query.setPageNum(pager.getCurrentPage());
query.setPageSize(pager.getPageSize());
return getData(query);
}
public List<T> getFullData() {
final Query query = buildQuery();
query.setQueryMode(QueryMode.FULL_RESULT);
return getFullData(query);
}
@Override
public void onPageChange(final int page) {
pager.setCurrentPage(page);
hasData.setData(getData());
}
@Override
public void onFilterChange() {
if (!isValid()) return;
pager.setCurrentPage(0);
hasData.setData(getData());
}
@Override
public void onSort(final Sortable aSortable) {
sortableList.stream().filter(sortable -> !sortable.equals(aSortable)).forEach(sortable -> sortable.sort(SortingType.NONE));
hasData.setData(getData());
}
public boolean isValid() {
boolean valid = true;
for (final Validable validable : validableList) {
valid = valid & validable.isValid().isValid();
}
return valid;
}
public void reset() {
resatableList.forEach(Resetable::reset);
}
public Query buildQuery() {
final Query query = new Query();
for (final HasCriteria criteriable : hasCriteriaList) {
query.addCriteria(criteriable.getCriteria());
}
return query;
}
protected abstract List<T> getData(Query query);
protected abstract List<T> getFullData(Query query);
}