/* Copyright (c) 2001 - 2011 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.gwc.web;
import static org.geoserver.gwc.web.CachedLayerInfo.TYPE.*;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
import org.apache.wicket.model.LoadableDetachableModel;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.WMSLayerInfo;
import org.geoserver.gwc.GWC;
import org.geoserver.gwc.layer.GeoServerTileLayer;
import org.geoserver.gwc.web.CachedLayerInfo.TYPE;
import org.geotools.util.logging.Logging;
import org.geowebcache.layer.TileLayer;
import org.geowebcache.layer.wms.WMSLayer;
/**
* A loadable model for {@link TileLayer}s used by {@link CachedLayerProvider}.
* <p>
* Warning, don't use it in a tabbed form or in any other places where you might need to keep the
* modifications in a resource stable across page loads.
* </p>
*/
@SuppressWarnings("serial")
public class CachedLayerDetachableModel extends LoadableDetachableModel<CachedLayerInfo> {
private static final Logger LOGGER = Logging.getLogger(CachedLayerDetachableModel.class);
private String name;
public CachedLayerDetachableModel(CachedLayerInfo layer) {
super(layer);
this.name = layer.getName();
}
@Override
protected CachedLayerInfo load() {
GWC facade = GWC.get();
return CachedLayerDetachableModel.create(name, facade);
}
static CachedLayerInfo create(final String name, final GWC gwc) {
final TileLayer layer = gwc.getTileLayerByName(name);
CachedLayerInfo info = new CachedLayerInfo();
info.setName(name);
info.setType(getType(layer));
boolean enabled = layer.isEnabled();
info.setEnabled(enabled);
if (gwc.isDiskQuotaAvailable()) {
info.setQuotaLimit(gwc.getQuotaLimit(name));
info.setQuotaUsed(gwc.getUsedQuota(name));
}
if(!enabled && (layer instanceof GeoServerTileLayer)){
String error = ((GeoServerTileLayer)layer).getConfigErrorMessage();
info.setConfigErrorMessage(error);
}
return info;
}
private static TYPE getType(final TileLayer layer) {
if (layer instanceof WMSLayer) {
return WMS;
} else if (layer instanceof GeoServerTileLayer) {
GeoServerTileLayer gtl = (GeoServerTileLayer) layer;
LayerInfo li;
if (null != (li = gtl.getLayerInfo())) {
ResourceInfo resource = li.getResource();
if (resource instanceof FeatureTypeInfo) {
return VECTOR;
} else if (resource instanceof CoverageInfo) {
return RASTER;
} else if (resource instanceof WMSLayerInfo) {
return WMS;
}
} else if (null != gtl.getLayerGroupInfo()) {
return LAYERGROUP;
}
}
LOGGER.info("Unknown TileLayer type, returning OTHER: " + layer.getClass().getName());
return OTHER;
}
public static List<CachedLayerInfo> getItems(GWC gwc) {
List<CachedLayerInfo> lazyList = new LazyCachedLayerInfoList(gwc);
return lazyList;
}
private static class LazyCachedLayerInfoList extends AbstractList<CachedLayerInfo> {
private final GWC gwc;
private final List<String> layerNames;
public LazyCachedLayerInfoList(final GWC gwc) {
this.gwc = gwc;
List<String> names = new ArrayList<String>(gwc.getTileLayerNames());
Collections.sort(names);
this.layerNames = names;
}
@Override
public CachedLayerInfo get(final int index) {
final String name = layerNames.get(index);
return CachedLayerDetachableModel.create(name, gwc);
}
@Override
public int size() {
return layerNames.size();
}
}
}