#!/usr/bin/python
#
# arch-tag: 4f8deb8b-9560-4c60-9f26-1bd6f6b2c3d2
# Time-stamp: <2005-03-09 15:35:19 mike>
#
# Module to validate a 'setLoad' request.
#
from elementtree import ElementTree
from elementsoap.ElementSOAP import *

class ValidationService(SoapService):
    _typemap = {type('') : 'string',
                type(1) : 'int',
                type(1.0) : 'float'}
    
    def __init__(self, url, ns):
        self.url = url
        self.ns = '{' + ns + '}'
        self.action = ns
        SoapService.__init__(self)

    def check(self, bus, port, newstate, debug=0):
        action = self.action + '/checkLoadUpdate'
        request = SoapRequest(self.ns + 'checkLoadUpdate')
        SoapElement(request, self.ns + 'bus', 'string', bus)
        SoapElement(request, self.ns + 'port', 'int', str(port))
        s = SoapElement(request, self.ns + 'newstate')
        for k,v in newstate.items():
            SoapElement(s, self.ns + k,
                        self._typemap[type(v)], str(v))
        if debug:
            print "Request:\n" + ElementTree.tostring(request)
        try:
            response = self.call(action, request)
            if debug:
                print "Response:\n" + ElementTree.tostring(response)
        except SoapFault:
            return 1
        return int(response.findtext(self.ns + 'checkLoadUpdateResult'))
    
class Validator(object):
    def __init__(self, url, ns):
        self.url = url
        self.ns = ns
        self.server = ValidationService(self.url, self.ns)
        
    def __getstate__(self):
        """When pickling, don't save the server attribute"""
        d = {}
        d.update(self.__dict__)
        d['server'] = None
        return d
    
    def __setstate__(self, d):
        """Restore server attribute when unpickling"""
        self.__dict__.update(d)
        self.server = ValidationService(self.url, self.ns)
        
    def __str__(self):
        return '<Validator: %s,%s>' % (self.url, self.ns)

    def check(self, bus, port, newstate):
        return self.server.check(bus, port, newstate)
        
