/* (c) 2014 - 2015 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.kvp;
import java.util.ArrayList;
import java.util.List;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.ows.FlatKvpParser;
import org.geoserver.ows.KvpParser;
import org.geoserver.platform.ServiceException;
import org.geoserver.wms.MapLayerInfo;
import org.geoserver.wms.WMS;
/**
* KVP parser to parse a comma separated list of layer names into a list of {@link MapLayerInfo}
*
* @author Gabriel Roldan
*/
public class MapLayerInfoKvpParser extends KvpParser {
private FlatKvpParser rawNamesParser;
private final WMS wms;
public MapLayerInfoKvpParser(final String key, final WMS wms) {
super(key, MapLayerInfo.class);
this.wms = wms;
rawNamesParser = new FlatKvpParser(key, String.class);
}
/**
* Returns whether the specified resource must be skipped in the context of the current request.
*/
protected boolean skipResource(Object theResource) {
return false;
}
@SuppressWarnings("unchecked")
@Override
public List<MapLayerInfo> parse(final String paramValue) throws Exception {
final List<String> layerNames = (List<String>) rawNamesParser.parse(paramValue);
List<MapLayerInfo> layers = new ArrayList<MapLayerInfo>(layerNames.size());
MapLayerInfo layer = null;
for (String layerName : layerNames) {
LayerInfo layerInfo = wms.getLayerByName(layerName);
if (layerInfo == null) {
LayerGroupInfo groupInfo = wms.getLayerGroupByName(layerName);
if (groupInfo == null || LayerGroupInfo.Mode.CONTAINER.equals(groupInfo.getMode())) {
throw new ServiceException(layerName + ": no such layer on this server",
"LayerNotDefined", getClass().getSimpleName());
} else {
if (skipResource(groupInfo))
continue;
for (LayerInfo li : groupInfo.layers()) {
if (skipResource(li))
continue;
layer = new MapLayerInfo(li);
layers.add(layer);
}
}
} else {
if (skipResource(layerInfo))
continue;
layer = new MapLayerInfo(layerInfo);
layers.add(layer);
}
}
return layers;
}
}