/* 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.Collection;
import java.util.List;
import java.util.Set;
import org.geoserver.platform.ServiceException;
import org.geoserver.wms.capabilities.Capabilities_1_3_0_Transformer;
import org.geoserver.wms.capabilities.GetCapabilitiesTransformer;
import org.geotools.util.Version;
import org.geotools.xml.transform.TransformerBase;
/**
* WMS GetCapabilities operation default implementation.
*
* @author Gabriel Roldan
*/
public class GetCapabilities {
private final WMS wms;
public GetCapabilities(final WMS wms) {
this.wms = wms;
}
/**
*
* @param request
* get capabilities request, as generated by
* @return
* @see GetCapabilitiesTransformer
* @see Capabilities_1_3_0_Transformer
*/
public TransformerBase run(final GetCapabilitiesRequest request) throws ServiceException {
final Version version = WMS.version(request.getVersion());
if (version == null) {
throw new IllegalArgumentException("version not supplied.");
}
// UpdateSequence handling for WMS: see WMS 1.1.1 page 23
long reqUS = -1;
if (request.getUpdateSequence() != null && !"".equals(request.getUpdateSequence().trim())) {
try {
reqUS = Long.parseLong(request.getUpdateSequence());
} catch (NumberFormatException nfe) {
throw new ServiceException(
"GeoServer only accepts numbers in the updateSequence parameter");
}
}
long geoUS = wms.getUpdateSequence();
if (reqUS > geoUS) {
throw new ServiceException(
"Client supplied an updateSequence that is greater than the current sever updateSequence",
"InvalidUpdateSequence");
}
if (reqUS == geoUS) {
throw new ServiceException("WMS capabilities document is current (updateSequence = "
+ geoUS + ")", "CurrentUpdateSequence");
}
// otherwise it's a normal response...
Set<String> legendFormats = wms.getAvailableLegendGraphicsFormats();
TransformerBase transformer;
String baseUrl = request.getBaseUrl();
if (WMS.VERSION_1_1_1.equals(version)) {
Set<String> mapFormats = wms.getAvailableMapFormatNames();
List<ExtendedCapabilitiesProvider> extCapsProviders;
extCapsProviders = wms.getAvailableExtendedCapabilitiesProviders();
transformer = new GetCapabilitiesTransformer(wms, baseUrl, mapFormats, legendFormats,
extCapsProviders);
} else if (WMS.VERSION_1_3_0.equals(version)) {
Collection<GetMapOutputFormat> mapFormats = wms.getAvailableMapFormats();
Collection<ExtendedCapabilitiesProvider> extCapsProviders =
wms.getAvailableExtendedCapabilitiesProviders();
transformer = new Capabilities_1_3_0_Transformer(wms, baseUrl, mapFormats, extCapsProviders);
} else {
throw new IllegalArgumentException("Unknown version: " + version);
}
return transformer;
}
}