#import xml.parsers.expat
import httplib2
import lxml
from lxml.etree import Element, ElementTree, HTML
# Just to get some example data
#con = httplib2.Http()
#con.add_credentials('wibble', 'fish')
#a, b = con.request("http://localhost/myWebDAV/", method="PROPFIND", headers={'Depth':'1'})
class Response(object):
"""
Response objects are for storing information about resources
"""
def __init__(self):
"""
Response objects are for storing information about resources
"""
self.href = None
self.resourcetype = None
self.creationdate = None
self.getcontentlength = None
self.getlastmodified = None
self.getetag = None
self.executable = None
self.locks = []
self.getcontenttype = None
class Lock(object):
""" This is an object for storing resource lock information
"""
def __init__(self):
self.locktype = None
self.lockscope = None
#class Parser(object):
#def __init__(self):
#"""
#Warning, this has been depreciated. Use LxxmlParser instead
#"""
#self.element_list = []
#self.closed_elements = []
#self.response_objects = []
#self.current_element = None
#self.p = xml.parsers.expat.ParserCreate()
#self.p.StartElementHandler = self.start_element
#self.p.EndElementHandler = self.end_element
#self.p.CharacterDataHandler = self.char_data
#self.is_lock = False
##self.p.StartNamespaceDeclHandler = self.ns_data
#def start_element(self, name, attrs):
##print 'Start element:', name, attrs
#namespace, element_name = name.split(':')
#if element_name == 'response':
## Make a new response object
#new_response = Response()
## Put it into the list
#self.response_objects.append(new_response)
#elif self.is_lock:
## If we are currently dealing with a supportedlock element make
## sure we can deal with the scope and type
#if element_name == 'lockentry':
#self.response_objects[-1].locks.append(Lock())
#elif element_name == 'lockscope' or element_name == 'locktype':
#self.current_element = element_name
#elif element_name == 'supportedlock':
#self.is_lock = True
#else:
#self.current_element = element_name
#def end_element(self, name):
#namespace, element_name = name.split(':')
#if self.is_lock:
#if element_name == 'supportedlock':
## Closing the supportedlock element
#self.is_lock = False
#elif self.current_element == 'lockscope':
## If a lockscope element was found, set the value here
#self.response_objects[-1].locks[-1].lockscope = element_name
#self.current_element = element_name
#elif self.current_element == 'locktype':
## If a locktype element was found, set the value here
#self.response_objects[-1].locks[-1].locktype = element_name
#self.current_element = element_name
#elif self.current_element == 'resourcetype':
#self.response_objects[-1].resourcetype = 'resource'
#elif self.current_element == 'collection':
#self.response_objects[-1].resourcetype = 'collection'
#def char_data(self, data):
#if data.strip():
##self.element_list[-1].text = data
#setattr(self.response_objects[-1], self.current_element, data)
##def ns_data(self, prefix, uri):
##print "Namespace data:", prefix, uri
#def parse(self, data):
#try:
#self.p.Parse(data, 1)
#except Exception, err:
#err
class LxmlParser(object):
def __init__(self):
self.element_list = []
self.closed_elements = []
self.response_objects = []
self.current_element = None
#self.p = lxml.etree.
#self.p.StartElementHandler = self.start_element
#self.p.EndElementHandler = self.end_element
#self.p.CharacterDataHandler = self.char_data
self.is_lock = False
def parse(self, data):
try:
data_elements = HTML(data)
xml_etree = ElementTree(data_elements)
all_response_elements = xml_etree.findall("//response")
for response in all_response_elements:
new_response = Response()
resp_tree = ElementTree(response)
new_response.href = resp_tree.find('//href').text
if resp_tree.find('//collection') is not None:
new_response.resourcetype = 'collection'
else:
new_response.resourcetype = 'resource'
new_response.executable = getattr(resp_tree.find('//executable'), 'text', None)
new_response.creationdate = getattr(resp_tree.find('//creationdate'), 'text', None)
new_response.getcontentlength = getattr(resp_tree.find('//getcontentlength'), 'text', None)
new_response.getlastmodified = getattr(resp_tree.find('//getlastmodified'), 'text', None)
new_response.getetag = getattr(resp_tree.find('//getetag'), 'text', None)
new_response.getcontenttype = getattr(resp_tree.find('//getcontenttype'), 'text', None)
# Now we have the properties that are easy to get, lets get the lock information
lock_tree = resp_tree.findall('//lockentry')
for lock in lock_tree:
lock_tree = ElementTree(lock)
lock_obj = Lock()
lock_obj.locktype = lock_tree.find('//locktype').getchildren()[-1].tag
lock_obj.lockscope = lock_tree.find('//lockscope').getchildren()[-1].tag
new_response.locks.append(lock_obj)
self.response_objects.append(new_response)
except Exception, err:
err