/* (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;
import java.util.List;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.PublishedInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.ows.Request;
import org.geoserver.ows.WorkspaceQualifyingCallback;
import org.geoserver.ows.util.KvpUtils;
import org.geoserver.platform.Operation;
import org.geoserver.platform.Service;
public class WMSWorkspaceQualifier extends WorkspaceQualifyingCallback {
public WMSWorkspaceQualifier(Catalog catalog) {
super(catalog);
}
@Override
protected void qualifyRequest(WorkspaceInfo ws, PublishedInfo l, Service service, Request request) {
if (WebMapService.class.isInstance(service.getService())) {
String layers = (String) request.getRawKvp().get("LAYERS");
if (layers != null) {
request.getRawKvp().put("LAYERS", qualifyLayerNamesKVP(layers, ws));
}
layers = (String) request.getRawKvp().get("QUERY_LAYERS");
if (layers != null) {
request.getRawKvp().put("QUERY_LAYERS", qualifyLayerNamesKVP(layers, ws));
}
String layer = (String) request.getRawKvp().get("LAYER");
if (layer != null) {
request.getRawKvp().put("LAYER", qualifyName(layer, ws));
}
String styles = (String) request.getRawKvp().get("STYLES");
if (styles != null && !styles.trim().isEmpty()) {
request.getRawKvp().put("STYLES", qualifyStyleNamesKVP(styles, ws));
}
String style = (String) request.getRawKvp().get("STYLE");
if (style != null && !style.trim().isEmpty()) {
request.getRawKvp().put("STYLE", qualifyStyleName(style, ws));
}
}
}
protected void qualifyRequest(WorkspaceInfo ws, PublishedInfo l, Operation operation,
Request request) {
GetCapabilitiesRequest gc = parameter(operation, GetCapabilitiesRequest.class);
if (gc != null) {
gc.setNamespace(ws.getName());
return;
}
};
String qualifyLayerNamesKVP(String layers, WorkspaceInfo ws) {
List<String> list = KvpUtils.readFlat(layers);
qualifyLayerNames(list, ws);
return toCommaSeparatedList(list);
}
/**
* Overriding the base class behavior as we want to avoid qualifying global layer group names
*/
protected void qualifyLayerNames(List<String> names, WorkspaceInfo ws) {
for (int i = 0; i < names.size(); i++) {
String baseName = names.get(i);
String qualified = qualifyName(baseName, ws);
// only qualify if it's not a layer group (and prefer local layers to groups in case of
// name clash), but also check for workspace specific layer groups
if (catalog.getLayerByName(qualified) != null
|| catalog.getLayerGroupByName(baseName) == null) {
names.set(i, qualified);
} else if (catalog.getLayerGroupByName(qualified) != null) {
names.set(i, qualified);
}
}
}
String qualifyStyleNamesKVP(String styles, WorkspaceInfo ws) {
List<String> list = KvpUtils.readFlat(styles);
for (int i = 0; i < list.size(); i++) {
String name = list.get(i);
name = qualifyStyleName(name, ws);
list.set(i, name);
}
return toCommaSeparatedList(list);
}
private String qualifyStyleName(String name, WorkspaceInfo ws) {
String qualified = qualifyName(name, ws);
// does the qualified name exist?
if (catalog.getStyleByName(qualified) != null) {
return qualified;
} else {
// use the original name instead
return name;
}
}
private String toCommaSeparatedList(List<String> list) {
return String.join(",", list);
}
}