package org.geoserver.wms;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogFactory;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.Wrapper;
import org.geoserver.config.GeoServer;
import org.geoserver.config.ServiceInfo;
import org.geoserver.config.util.LegacyServiceLoader;
import org.geoserver.config.util.LegacyServicesReader;
import org.geoserver.wms.WMSInfo.WMSInterpolation;
import org.geoserver.wms.WatermarkInfo.Position;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.util.Version;
import org.geotools.util.logging.Logging;
public class WMSLoader extends LegacyServiceLoader<WMSInfo> {
static Logger LOGGER = Logging.getLogger( "org.geoserver.wms" );
public Class<WMSInfo> getServiceClass() {
return WMSInfo.class;
}
public WMSInfo load(LegacyServicesReader reader, GeoServer geoServer)
throws Exception {
WMSInfoImpl wms = new WMSInfoImpl();
wms.setId( "wms" );
Map<String,Object> props = reader.wms();
readCommon( wms, props, geoServer );
WatermarkInfo wm = new WatermarkInfoImpl();
wm.setEnabled( (Boolean) props.get( "globalWatermarking" ) );
wm.setURL( (String) props.get("globalWatermarkingURL" ) );
wm.setTransparency( (Integer) props.get("globalWatermarkingTransparency") );
wm.setPosition( Position.get( (Integer) props.get( "globalWatermarkingPosition" ) ) );
wms.setWatermark( wm );
try {
wms.setInterpolation( WMSInterpolation.valueOf((String) props.get( "allowInterpolation" )) );
} catch(Exception e) {
// fallback on the default value if loading failed
wms.setInterpolation( WMSInterpolation.Nearest);
}
wms.getMetadata().put( "svgRenderer", (Serializable) props.get( "svgRenderer") );
wms.getMetadata().put( "svgAntiAlias",(Serializable) props.get( "svgAntiAlias") );
// max GetFeatureInfo search radius
wms.setMaxBuffer((Integer) props.get("maxBuffer"));
// max memory usage
wms.setMaxRequestMemory((Integer) props.get("maxRequestMemory"));
// the max rendering time
wms.setMaxRenderingTime((Integer) props.get("maxRenderingTime"));
// the max number of rendering errors
wms.setMaxRenderingErrors((Integer) props.get("maxRenderingErrors"));
// base maps
Catalog catalog = geoServer.getCatalog();
// ... we need access to the actual catalog, not a filtered out view of the
// layers accessible to the current user
if(catalog instanceof Wrapper)
catalog = ((Wrapper) catalog).unwrap(Catalog.class);
CatalogFactory factory = catalog.getFactory();
List<Map> baseMaps = (List<Map>) props.get( "BaseMapGroups");
if ( baseMaps != null ) {
O: for ( Map baseMap : baseMaps ) {
LayerGroupInfo bm = factory.createLayerGroup();
bm.setName( (String) baseMap.get( "baseMapTitle" ) );
//process base map layers
List<String> layerNames = (List) baseMap.get( "baseMapLayers");
for ( String layerName : layerNames ) {
ResourceInfo resource = null;
if ( layerName.contains( ":" ) ) {
String[] qname = layerName.split( ":" );
resource = catalog.getResourceByName( qname[0],qname[1], ResourceInfo.class );
}
else {
resource = catalog.getResourceByName( layerName, ResourceInfo.class );
}
if ( resource == null ) {
LOGGER.warning("Ignoring layer group '" + bm.getName() +
"', resource '"+ layerName + "' does not exist" );
continue O;
}
List<LayerInfo> layers = catalog.getLayers(resource);
if ( layers.isEmpty() ) {
LOGGER.warning( "Ignoring layer group '" + bm.getName() +
"', no layer found for resource '" + layerName + "'");
continue O;
}
bm.getLayers().add( layers.get( 0 ) );
}
//process base map styles
List<String> styleNames = (List) baseMap.get( "baseMapStyles" );
if ( styleNames.isEmpty() ) {
//use defaults
for ( LayerInfo l : bm.getLayers() ) {
bm.getStyles().add(null);
}
}
else {
for ( int i = 0; i < styleNames.size(); i++ ) {
String styleName = styleNames.get( i );
styleName = styleName.trim();
StyleInfo style = null;
if ( "".equals( styleName ) ) {
style = null;
}
else {
style = catalog.getStyleByName( styleName );
}
bm.getStyles().add( style );
}
}
bm.getMetadata().put( "rawStyleList", (String)baseMap.get("rawBaseMapStyles"));
//base map enveloper
ReferencedEnvelope e = (ReferencedEnvelope) baseMap.get( "baseMapEnvelope");
if ( e == null ) {
e = new ReferencedEnvelope();
e.setToNull();
}
bm.setBounds( e );
LOGGER.info( "Processed layer group '" + bm.getName() + "'" );
catalog.add( bm );
}
}
wms.getVersions().add( new Version( "1.1.1" ) );
return wms;
}
}