diff --git a/bindings/python/mapnik/ogcserver/cgiserver.py b/bindings/python/mapnik/ogcserver/cgiserver.py index 731ffe91a..e00ca3c3d 100644 --- a/bindings/python/mapnik/ogcserver/cgiserver.py +++ b/bindings/python/mapnik/ogcserver/cgiserver.py @@ -19,22 +19,25 @@ # # $Id$ -from os import environ, access +from os import environ from tempfile import gettempdir environ['PYTHON_EGG_CACHE'] = gettempdir() -import jon.cgi as cgi -from exceptions import OGCException import sys -from copy import deepcopy -from traceback import print_tb -from StringIO import StringIO +from jon import cgi +from exceptions import OGCException from wms130 import ExceptionHandler from lxml import etree as ElementTree +from ConfigParser import SafeConfigParser class Handler(cgi.DebugHandler): def __init__(self): + conf = SafeConfigParser() + conf.readfp(open(self.configpath)) + self.conf = conf + mapfactorymodule = __import__(conf.get('server', 'mapfactorymodule')) + self.mapfactory = getattr(mapfactorymodule, conf.get('server', 'mapfactoryclass'))() self.requesthandlers = {} def process(self, req): @@ -60,8 +63,8 @@ class Handler(cgi.DebugHandler): mapnikmodule = __import__('mapnik.ogcserver.' + service) except: raise OGCException('Unsupported service "%s".' % service) - ServiceFactory = getattr(mapnikmodule.ogcserver, service).ServiceFactory - servicehandler, exceptionhandler = ServiceFactory(self.configpath, self.factory, onlineresource, reqparams.get('version', None)) + ServiceHandlerFactory = getattr(mapnikmodule.ogcserver, service).ServiceHandlerFactory + servicehandler, exceptionhandler = ServiceHandlerFactory(self.conf, self.mapfactory, onlineresource, reqparams.get('version', None)) if request not in servicehandler.SERVICE_PARAMS.keys(): raise OGCException('Operation "%s" not supported.' % request, 'OperationNotSupported') ogcparams = servicehandler.processParameters(request, reqparams) @@ -73,10 +76,9 @@ class Handler(cgi.DebugHandler): self.requesthandlers[srkey] = requesthandler response = requesthandler(ogcparams) except OGCException: - exc_type, exc_value, exc_tb = sys.exc_info() eh = exceptionhandler() req.set_header('Content-Type', eh.mimetype) - req.write(ElementTree.tostring(eh.getexcetree(exc_value))) + req.write(ElementTree.tostring(eh.getexcetree(sys.exc_info()[1]))) else: req.set_header('Content-Type', response.content_type) req.write(response.content) \ No newline at end of file diff --git a/bindings/python/mapnik/ogcserver/common.py b/bindings/python/mapnik/ogcserver/common.py index 5cb2d9212..e977852f4 100644 --- a/bindings/python/mapnik/ogcserver/common.py +++ b/bindings/python/mapnik/ogcserver/common.py @@ -200,13 +200,14 @@ class WMSBaseServiceHandler(BaseServiceHandler): m = Map(params['width'], params['height']) if params.has_key('transparent') and params['transparent'] == 'FALSE': m.background = params['bgcolor'] - mo = self.factory() + maplayers = self.mapfactory.getlayers() + mapstyles = self.mapfactory.getstyles() for layername in params['layers']: - for layer in mo['layers']: + for layer in maplayers: if layer.name() == layername: for stylename in layer.styles: - if stylename in mo['styles'].keys(): - m.append_style(stylename, mo['styles'][stylename]) + if stylename in mapstyles.keys(): + m.append_style(stylename, mapstyles[stylename]) m.layers.append(layer) m.zoom_to_box(Envelope(params['bbox'][0], params['bbox'][1], params['bbox'][2], params['bbox'][3])) im = Image(params['width'], params['height']) diff --git a/bindings/python/mapnik/ogcserver/wms.py b/bindings/python/mapnik/ogcserver/wms.py index 466dda569..cd25a4e5c 100644 --- a/bindings/python/mapnik/ogcserver/wms.py +++ b/bindings/python/mapnik/ogcserver/wms.py @@ -26,16 +26,13 @@ from wms111 import ServiceHandler as ServiceHandler111, \ from wms130 import ServiceHandler as ServiceHandler130, \ ExceptionHandler as ExceptionHandler130 -def ServiceFactory(configpath, factory, onlineresource, version): +def ServiceHandlerFactory(conf, mapfactory, onlineresource, version): if not version: version = Version('1.3.0') else: - try: - version = Version(version) - except: - raise OGCException('Parameter "version" is not properly formatted. Format must be "x.x.x".') + version = Version(version) if version >= '1.3.0': - return (ServiceHandler130(configpath, factory, onlineresource), ExceptionHandler130) + return (ServiceHandler130(conf, mapfactory, onlineresource), ExceptionHandler130) else: - return (ServiceHandler111(configpath, factory, onlineresource), ExceptionHandler111) \ No newline at end of file + return (ServiceHandler111(conf, mapfactory, onlineresource), ExceptionHandler111) \ No newline at end of file diff --git a/bindings/python/mapnik/ogcserver/wms111.py b/bindings/python/mapnik/ogcserver/wms111.py index 854110fac..51bb91a96 100644 --- a/bindings/python/mapnik/ogcserver/wms111.py +++ b/bindings/python/mapnik/ogcserver/wms111.py @@ -19,11 +19,9 @@ # # $Id$ -from common import ParameterDefinition, BaseServiceHandler, Response, \ - PIL_TYPE_MAPPING, Version, ListFactory, ColorFactory, \ - CRSFactory, WMSBaseServiceHandler, CRS +from common import ParameterDefinition, Response, Version, ListFactory, \ + ColorFactory, CRSFactory, WMSBaseServiceHandler, CRS from exceptions import OGCException, ServerConfigurationError, BaseExceptionHandler -from ConfigParser import SafeConfigParser from lxml import etree as ElementTree class ServiceHandler(WMSBaseServiceHandler): @@ -104,10 +102,9 @@ class ServiceHandler(WMSBaseServiceHandler): """ - def __init__(self, configpath, factory, opsonlineresource): - self.factory = factory - self.conf = SafeConfigParser() - self.conf.readfp(open(configpath)) + def __init__(self, conf, mapfactory, opsonlineresource): + self.conf = conf + self.mapfactory = mapfactory if self.conf.has_option('service', 'epsg'): self.crs = CRS('EPSG', self.conf.get('service', 'epsg')) else: @@ -144,9 +141,7 @@ class ServiceHandler(WMSBaseServiceHandler): rootlayersrs = rootlayerelem.find('SRS') rootlayersrs.text = str(self.crs) - dict = self.factory() - - for layer in dict['layers']: + for layer in self.mapfactory.getlayers(): layername = ElementTree.Element('Name') layername.text = layer.name() layertitle = ElementTree.Element('Title') diff --git a/bindings/python/mapnik/ogcserver/wms130.py b/bindings/python/mapnik/ogcserver/wms130.py index b833f797a..6ce0d3b5d 100644 --- a/bindings/python/mapnik/ogcserver/wms130.py +++ b/bindings/python/mapnik/ogcserver/wms130.py @@ -19,10 +19,9 @@ # # $Id$ -from common import ParameterDefinition, Response, PIL_TYPE_MAPPING, Version, \ - ListFactory, ColorFactory, CRSFactory, CRS, WMSBaseServiceHandler +from common import ParameterDefinition, Response, Version, ListFactory, \ + ColorFactory, CRSFactory, CRS, WMSBaseServiceHandler from exceptions import OGCException, ServerConfigurationError, BaseExceptionHandler -from ConfigParser import SafeConfigParser from lxml import etree as ElementTree class ServiceHandler(WMSBaseServiceHandler): @@ -109,10 +108,9 @@ class ServiceHandler(WMSBaseServiceHandler): """ - def __init__(self, configpath, factory, opsonlineresource): - self.factory = factory - self.conf = SafeConfigParser() - self.conf.readfp(open(configpath)) + def __init__(self, conf, mapfactory, opsonlineresource): + self.conf = conf + self.mapfactory = mapfactory if self.conf.has_option('service', 'epsg'): self.crs = CRS('EPSG', self.conf.get('service', 'epsg')) else: @@ -150,9 +148,7 @@ class ServiceHandler(WMSBaseServiceHandler): rootlayercrs = rootlayerelem.find('{http://www.opengis.net/wms}CRS') rootlayercrs.text = str(self.crs) - dict = self.factory() - - for layer in dict['layers']: + for layer in self.mapfactory.getlayers(): layername = ElementTree.Element('Name') layername.text = layer.name() layertitle = ElementTree.Element('Title') diff --git a/utils/ogcserver/ogcserver.cgi b/utils/ogcserver/ogcserver.cgi new file mode 100644 index 000000000..6df06f1e1 --- /dev/null +++ b/utils/ogcserver/ogcserver.cgi @@ -0,0 +1,29 @@ +#!/usr/bin/python2.3 +# +# This file is part of Mapnik (c++ mapping toolkit) +# +# Copyright (C) 2006 Jean-Francois Doyon +# +# Mapnik is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# $Id$ + +from mapnik.ogcserver.cgiserver import Handler +from jon import cgi + +class OGCServerHandler(Handler): + configpath = '/etc/ogcserver.conf' + +cgi.CGIRequest(OGCServerHandler).process() diff --git a/utils/ogcserver/ogcserver.conf b/utils/ogcserver/ogcserver.conf new file mode 100644 index 000000000..e38e32f4e --- /dev/null +++ b/utils/ogcserver/ogcserver.conf @@ -0,0 +1,14 @@ +# $Id$ + +[server] +mapfactorymodule=rundemo +mapfactoryclass=MapFactory + +[service] +name=WMS +title=Test OGC Server +abstract=Blah Blah Blah +maxheight=1024 +maxwidth=1024 +epsg=42304 +onlineresource=http://www.mapnik.org/