from ZSI.ServiceContainer import ServiceContainer, SOAPRequestHandler
from ZSI.schema import LocalElementDeclaration, ElementDeclaration, TypeDefinition, GTD, GED
from VanHelsing_server import VanHelsing
from VanHelsing_types import ns0
import VanHelsingWrapper
import sys

ResourceInfo= GTD("http://www.dass-it.de/VanHelsing/", "ResourceInfo")(None).pyclass()
listResourcesType= GTD("http://www.dass-it.de/VanHelsing/", "listResourcesType")(None).pyclass()
#print dir(ResourceInfo)

class VanSOAPRequestHandler(SOAPRequestHandler):
    def do_GET(self):
        wsdl=open("VanHelsing.wsdl").read()
        self.send_xml(wsdl)

def AsServer(port=80, services=(), RequestHandlerClass=SOAPRequestHandler):
    address = ("127.0.0.1",port)
    sc = ServiceContainer(address, RequestHandlerClass=RequestHandlerClass)
    for service in services:
        path = service.getPost()
        sc.setNode(service,path)
    sc.serve_forever()


class RealVanHelsing(VanHelsing):
    def soap_listResources(self, ps, **kw):
        request,response=VanHelsing.soap_listResources(self,ps)

        resType=request.get_element_resourceType()
        resDirector=request.get_element_director()
        
        result=VanHelsingWrapper.getResources(resDirector,resType)

        rList=[]

        for rid,name in result:

            resInf=response.new_resource()
            resInf.set_element_director(resDirector)
            resInf.set_element_resId(rid)
            resInf.set_element_resType(resType)
            resInf.set_element_resName(name)
            rList.append(resInf)

        response.set_element_resource(rList)

        return request,response

    def soap_getSimpleResource(self, ps, **kw):
        request,response=VanHelsing.soap_getSimpleResource(self,ps)

        resId=request.get_element_resId()
        resDirector=request.get_element_director()

        print resId
        resource=VanHelsingWrapper.getResourceById(resDirector,resId)
        attributes=VanHelsingWrapper.keyValueList(resource)

        resInf=response.new_resInfo()
        print dir(response)
        resInf.set_element_director(resDirector)
        resInf.set_element_resId(resId)
        resInf.set_element_resType("type")
        resInf.set_element_resName("name")

        response.set_element_resInfo(resInf)

        attrlist=[]

        for k,v in attributes:
            resAttr=response.new_resAttribute()
            resAttr.set_element_key(k)
            resAttr.set_element_value(v)
            attrlist.append(resAttr)
        response.set_element_resAttribute(attrlist)

        return request,response

    def soap_setSimpleResource(self, ps, **kw):
        request,response=VanHelsing.soap_setSimpleResource(self, ps)

        resInfo = request.get_element_resInfo()
        resId = resInfo.get_element_resId()
        director = resInfo.get_element_director()
        attributes = request.get_element_resAttribute()

        resId, status = VanHelsingWrapper.setResourceById(resId, director, attributes, resInfo)
        #response.set_element_resId(resId)
        response.set_element_status(status)

        return request, response
    
    def soap_setFileSetResource(self, ps, **kw):
        request,response=VanHelsing.soap_setFileSetResource(self, ps)
        
        
        return request, response

if 1:
    if len(sys.argv) < 2:
        filename="test.conf"
    else:
        filename=sys.argv[1]   

    VanHelsingWrapper.loadDirectorConfig(filename)

    AsServer(port=8080,services=[ RealVanHelsing() ], RequestHandlerClass=VanSOAPRequestHandler)

