/* Copyright (c) 2010 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible at the root * application directory. */ package org.geoserver.wms; import java.util.List; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.LayerInfo; 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, LayerInfo 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)); } } } protected void qualifyRequest(WorkspaceInfo ws, LayerInfo 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); qualifyNames(list, ws); StringBuffer sb = new StringBuffer(); for (String s : list) { sb.append(s).append(","); } sb.setLength(sb.length() - 1); return sb.toString(); } /** * Overriding the base class behavior as we want to avoid qualifying global layer group names */ protected void qualifyNames(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) if (catalog.getLayerByName(qualified) != null || catalog.getLayerGroupByName(baseName) == null) { names.set(i, qualified); } } } }