/* (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.web.data.layergroup;
import static org.geoserver.catalog.Predicates.sortBy;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.catalog.util.CloseableIterator;
import org.geoserver.catalog.util.CloseableIteratorAdapter;
import org.geoserver.web.data.layer.LayerProvider;
import org.geoserver.web.wicket.GeoServerDataProvider;
import org.geoserver.web.wicket.GeoServerDataProvider.BeanProperty;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geotools.factory.CommonFactoryFinder;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.SimpleAjaxLink;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.sort.SortBy;
import com.google.common.collect.Lists;
/**
* Base class for a layer listing table with clickable layer names
*/
public abstract class LayerListPanel extends GeoServerTablePanel<LayerInfo> {
protected static abstract class LayerListProvider extends LayerProvider {
private static final long serialVersionUID = -4793382279386643262L;
@Override
protected List<Property<LayerInfo>> getProperties() {
return Arrays.asList( NAME, STORE, WORKSPACE );
}
}
private static final long serialVersionUID = 3638205114048153057L;
static Property<LayerInfo> NAME =
new BeanProperty<LayerInfo>("name", "name");
static Property<LayerInfo> STORE =
new BeanProperty<LayerInfo>("store", "resource.store.name");
static Property<LayerInfo> WORKSPACE =
new BeanProperty<LayerInfo>("workspace", "resource.store.workspace.name");
public LayerListPanel( String id, final WorkspaceInfo workspace ) {
this( id, new LayerListProvider(){
private static final long serialVersionUID = 426375054014475107L;
@Override
public Iterator<LayerInfo> iterator(final long first, final long count) {
Iterator<LayerInfo> 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;
}
}
@Override
protected Filter getFilter() {
FilterFactory ff = CommonFactoryFinder.getFilterFactory2();
final Filter filter;
if (workspace == null) {
filter = super.getFilter();
} else {
filter = ff.and(super.getFilter(), ff.equal(ff.property("resource.store.workspace.id"), ff.literal(workspace.getId()),true));
}
return filter;
}
/**
* Returns the requested page of layer objects after applying any keyword
* filtering set on the page
*/
private Iterator<LayerInfo> filteredItems(Integer first, Integer count) {
final Catalog catalog = getCatalog();
// global sorting
final SortParam<?> sort = getSort();
final Property<LayerInfo> property = getProperty(sort);
SortBy sortOrder = null;
if (sort != null) {
if(property instanceof BeanProperty){
final String sortProperty = ((BeanProperty<LayerInfo>)property).getPropertyPath();
sortOrder = sortBy(sortProperty, sort.isAscending());
}
}
final Filter filter = getFilter();
//our already filtered and closeable iterator
Iterator<LayerInfo> items = catalog.list(LayerInfo.class, filter, first, count, sortOrder);
return items;
}
});
}
protected LayerListPanel(String id, GeoServerDataProvider<LayerInfo> provider) {
super(id, provider);
getTopPager().setVisible(false);
}
@SuppressWarnings("unchecked")
@Override
protected Component getComponentForProperty(String id, final IModel<LayerInfo> itemModel,
Property<LayerInfo> property) {
IModel<?> model = property.getModel( itemModel );
if ( NAME == property ) {
return new SimpleAjaxLink<String>(id, (IModel<String>) model ) {
private static final long serialVersionUID = -2968338284881141281L;
@Override
protected void onClick(AjaxRequestTarget target) {
LayerInfo layer = (LayerInfo) itemModel.getObject();
handleLayer( layer, target );
}
};
}
else {
return new Label( id, model );
}
}
protected void handleLayer( LayerInfo layer, AjaxRequestTarget target ) {
}
}