terom@171: """ terom@171: Handles mapping URLs to request handlers terom@171: """ terom@171: terom@171: import http terom@171: import handler terom@171: terom@176: class MapperError (http.ResponseError) : terom@171: """ terom@171: URL could not be mapped terom@171: """ terom@171: terom@171: def __init__ (self, url) : terom@176: super(MapperError, self).__init__("URL not found: %s" % (url, ), status='404 Not Found') terom@171: terom@172: class Mapper (handler.RequestHandler) : terom@171: """ terom@172: Looks up the handler to use based on the URL terom@171: """ terom@171: terom@172: def handle_request (self, request) : terom@171: """ terom@172: Map the given request terom@171: """ terom@171: terom@171: abstract terom@171: terom@171: class Mapping (object) : terom@171: """ terom@171: A mapping object for StaticMapping terom@171: """ terom@171: terom@171: def test (self, request) : terom@171: """ terom@171: Either return a handler, or None terom@171: """ terom@171: terom@171: abstract terom@171: terom@171: class RegexpMapping (object) : terom@171: """ terom@171: A mapping object that uses regular expressions terom@171: """ terom@171: terom@171: def __init__ (self, regexp, handler) : terom@171: pass terom@171: terom@171: def test (self, request) : terom@171: xxx terom@171: terom@171: class SimpleMapping (object) : terom@171: """ terom@171: A mapping object that uses simple expressions terom@171: """ terom@171: terom@171: def __init__ (self, expression, handler) : terom@171: pass terom@171: terom@171: def test (self, request) : terom@171: xxx terom@171: terom@176: class StaticMapper (Mapper) : terom@171: """ terom@171: Translates requests to handlers using a list of pre-determined Mapping's terom@171: """ terom@171: terom@171: def __init__ (self, mappings) : terom@171: # store terom@171: self.mappings = mappings terom@171: terom@173: def handle_request (self, request) : terom@171: """ terom@171: Returns the appropriate handler terom@171: """ terom@171: terom@172: # find handler to use terom@172: handler = None terom@172: terom@171: # just test each mapping in turn terom@171: for mapping in self.mappings : terom@171: handler = mapping.test(request) terom@171: terom@171: if handler : terom@172: break terom@171: terom@172: if not handler : terom@172: # fail, not found terom@176: raise MapperError(request.get_page_name()) terom@171: terom@172: # passthrough terom@172: return handler.handle_request(request) terom@171: terom@171: # "friendly" names terom@171: map = SimpleMapping terom@171: mapre = RegexpMapping terom@171: