/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wms.web.data;
import static org.geoserver.catalog.Predicates.sortBy;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.model.IModel;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.Predicates;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.util.CloseableIterator;
import org.geoserver.catalog.util.CloseableIteratorAdapter;
import org.geoserver.web.data.style.StyleDetachableModel;
import org.geoserver.web.wicket.GeoServerDataProvider;
import org.opengis.filter.Filter;
import org.opengis.filter.sort.SortBy;
import com.google.common.collect.Lists;
/**
* A {@link GeoServerDataProvider} provider for styles
*/
@SuppressWarnings("serial")
public class StyleProvider extends GeoServerDataProvider<StyleInfo> {
public static Property<StyleInfo> NAME =
new BeanProperty<StyleInfo>( "name", "name" );
public static Property<StyleInfo> WORKSPACE =
new BeanProperty<StyleInfo>( "workspace", "workspace.name" );
static List<Property<StyleInfo>> PROPERTIES = Arrays.asList(NAME, WORKSPACE);
public StyleProvider() {
setSort(new SortParam<Object>(NAME.getName(), true));
}
@Override
protected List<StyleInfo> getItems() {
throw new UnsupportedOperationException(
"This method should not be being called! "
+ "We use the catalog streaming API");
}
@Override
protected List<Property<StyleInfo>> getProperties() {
return PROPERTIES;
}
public IModel<StyleInfo> newModel(StyleInfo object) {
return new StyleDetachableModel(object );
}
@Override
public long size() {
Filter filter = getFilter();
int count = getCatalog().count(StyleInfo.class, filter);
return count;
}
@Override
public int fullSize() {
Filter filter = Predicates.acceptAll();
int count = getCatalog().count(StyleInfo.class, filter);
return count;
}
@Override
public Iterator<StyleInfo> iterator(final long first, final long count) {
Iterator<StyleInfo> iterator = filteredItems((int) first, (int) count);
if (iterator instanceof CloseableIterator) {
// don't know how to force wicket to close the iterator, lets return
// a copy. Shouldn't be much overhead as we're paging
try {
return Lists.newArrayList(iterator).iterator();
} finally {
CloseableIteratorAdapter.close(iterator);
}
} else {
return iterator;
}
}
/**
* Returns the requested page of layer objects after applying any keyword
* filtering set on the page
*/
private Iterator<StyleInfo> filteredItems(Integer first, Integer count) {
final Catalog catalog = getCatalog();
// global sorting
final SortParam sort = getSort();
final Property<StyleInfo> property = getProperty(sort);
SortBy sortOrder = null;
if (sort != null) {
if(property instanceof BeanProperty){
final String sortProperty = ((BeanProperty<StyleInfo>)property).getPropertyPath();
sortOrder = sortBy(sortProperty, sort.isAscending());
}
}
final Filter filter = getFilter();
//our already filtered and closeable iterator
Iterator<StyleInfo> items = catalog.list(StyleInfo.class, filter, first, count, sortOrder);
return items;
}
}