/* (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.gwc.web.layer;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.gwc.GWC;
import org.geoserver.gwc.config.GWCConfig;
import org.geoserver.gwc.layer.GeoServerTileLayer;
import org.geoserver.gwc.web.GWCIconFactory;
import org.geoserver.web.wicket.GeoServerDataProvider;
import org.geowebcache.grid.GridSetBroker;
import org.geowebcache.layer.TileLayer;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
/**
* @author groldan
*/
class UnconfiguredCachedLayersProvider extends GeoServerDataProvider<TileLayer> {
private static final long serialVersionUID = -8599398086587516574L;
static final Property<TileLayer> TYPE = new AbstractProperty<TileLayer>("type") {
private static final long serialVersionUID = 3215255763580377079L;
@Override
public PackageResourceReference getPropertyValue(TileLayer item) {
return GWCIconFactory.getSpecificLayerIcon(item);
}
@Override
public Comparator<TileLayer> getComparator() {
return new Comparator<TileLayer>() {
@Override
public int compare(TileLayer o1, TileLayer o2) {
PackageResourceReference r1 = getPropertyValue(o1);
PackageResourceReference r2 = getPropertyValue(o2);
return r1.getName().compareTo(r2.getName());
}
};
}
};
static final Property<TileLayer> NAME = new BeanProperty<TileLayer>("name", "name");
static final Property<TileLayer> ENABLED = new BeanProperty<TileLayer>("enabled", "enabled");
static final List<Property<TileLayer>> PROPERTIES = Collections.unmodifiableList(Arrays.asList(
TYPE, NAME, ENABLED));
/**
* Provides a list of transient TileLayers for the LayerInfo and LayerGroupInfo objects in
* Catalog that don't already have a configured TileLayer on their metadata map.
*
* @see org.geoserver.web.wicket.GeoServerDataProvider#getItems()
*/
@Override
protected List<TileLayer> getItems() {
final GWC gwc = GWC.get();
final GWCConfig defaults = gwc.getConfig().saneConfig().clone();
final GridSetBroker gridsets = gwc.getGridSetBroker();
final Catalog catalog = getCatalog();
defaults.setCacheLayersByDefault(true);
List<String> unconfiguredLayerIds = getUnconfiguredLayers();
List<TileLayer> layers = Lists.transform(unconfiguredLayerIds,
new Function<String, TileLayer>() {
@Override
public TileLayer apply(String input) {
GeoServerTileLayer geoServerTileLayer;
LayerInfo layer = catalog.getLayer(input);
if (layer != null) {
geoServerTileLayer = new GeoServerTileLayer(layer, defaults, gridsets);
} else {
LayerGroupInfo layerGroup = catalog.getLayerGroup(input);
geoServerTileLayer = new GeoServerTileLayer(layerGroup, defaults,
gridsets);
}
/*
* Set it to enabled regardless of the default settins, so it only shows up
* as disabled if the actual layer/groupinfo is disabled
*/
geoServerTileLayer.getInfo().setEnabled(true);
return geoServerTileLayer;
}
});
return layers;
}
private List<String> getUnconfiguredLayers() {
Catalog catalog = getCatalog();
List<String> layerIds = new LinkedList<String>();
GWC gwc = GWC.get();
List<LayerInfo> layers = catalog.getLayers();
for (LayerInfo l : layers) {
if (!gwc.hasTileLayer(l)) {
layerIds.add(l.getId());
}
}
List<LayerGroupInfo> layerGroups = catalog.getLayerGroups();
for (LayerGroupInfo lg : layerGroups) {
if (!gwc.hasTileLayer(lg)) {
layerIds.add(lg.getId());
}
}
return layerIds;
}
/**
* @see org.geoserver.web.wicket.GeoServerDataProvider#getProperties()
*/
@Override
protected List<Property<TileLayer>> getProperties() {
return PROPERTIES;
}
/**
* @see org.geoserver.web.wicket.GeoServerDataProvider#newModel(java.lang.Object)
*/
public IModel<TileLayer> newModel(final TileLayer tileLayer) {
return new UnconfiguredTileLayerDetachableModel(((TileLayer) tileLayer).getName());
}
/**
* @see org.geoserver.web.wicket.GeoServerDataProvider#getComparator
*/
@Override
protected Comparator<TileLayer> getComparator(SortParam<?> sort) {
return super.getComparator(sort);
}
private class UnconfiguredTileLayerDetachableModel extends LoadableDetachableModel<TileLayer> {
private static final long serialVersionUID = -8920290470035166218L;
private String name;
public UnconfiguredTileLayerDetachableModel(String layerOrGroupName) {
this.name = layerOrGroupName;
}
@Override
protected TileLayer load() {
final GWC gwc = GWC.get();
final GWCConfig defaults = gwc.getConfig().saneConfig().clone();
defaults.setCacheLayersByDefault(true);
final GridSetBroker gridsets = gwc.getGridSetBroker();
Catalog catalog = getCatalog();
LayerInfo layer = catalog.getLayerByName(name);
if (layer != null) {
return new GeoServerTileLayer(layer, defaults, gridsets);
}
LayerGroupInfo layerGroup = catalog.getLayerGroupByName(name);
return new GeoServerTileLayer(layerGroup, defaults, gridsets);
}
}
}