/* (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.rest.service;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.config.GeoServer;
import org.geoserver.config.ServiceInfo;
import org.geoserver.config.util.XStreamPersister;
import org.geoserver.rest.RestBaseController;
import org.geoserver.rest.converters.XStreamMessageConverter;
import org.geoserver.rest.util.MediaTypeExtensions;
import org.geoserver.wms.WMSInfo;
import org.geoserver.wms.WMSXStreamLoader;
import org.geotools.util.logging.Logging;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.servlet.HandlerMapping;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.logging.Logger;
/**
* WMS Settings controller
*/
@RestController
@ControllerAdvice
@RequestMapping(path = RestBaseController.ROOT_PATH + "/services/wms", produces = {
MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE,
MediaType.TEXT_HTML_VALUE})
public class WMSSettingsController extends ServiceSettingsController {
private static final Logger LOGGER = Logging.getLogger(WMSSettingsController.class);
@Autowired
public WMSSettingsController(GeoServer geoServer) { super(geoServer, WMSInfo.class); }
@PutMapping(value = {"/settings", "/workspaces/{workspaceName}/settings"}, consumes = {
MediaType.APPLICATION_JSON_VALUE,
MediaTypeExtensions.TEXT_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE,
MediaType.TEXT_XML_VALUE})
public void serviceSettingsPut(
@RequestBody WMSInfo info,
@PathVariable(required = false) String workspaceName) {
super.serviceSettingsPut(info, workspaceName);
}
@Override
public String getTemplateName(Object object) {
return "wmsSettings";
}
@Override
public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return WMSInfo.class.isAssignableFrom(methodParameter.getParameterType());
}
@Override
public void configurePersister(XStreamPersister persister, XStreamMessageConverter converter) {
persister.setHideFeatureTypeAttributes();
persister.setCallback( new XStreamPersister.Callback() {
@Override
protected ServiceInfo getServiceObject() {
Map<String, String> uriTemplateVars = (Map<String, String>) RequestContextHolder.getRequestAttributes().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
String workspace = uriTemplateVars.get("workspaceName");
ServiceInfo service;
if (workspace != null) {
WorkspaceInfo ws = geoServer.getCatalog().getWorkspaceByName(workspace);
service = geoServer.getService(ws, WMSInfo.class);
} else {
service = geoServer.getService(WMSInfo.class);
}
return service;
}
@Override
protected Class<WMSInfo> getObjectClass() {
return WMSInfo.class;
}
});
WMSXStreamLoader.initXStreamPersister(persister);
}
}