def get_handle(self, subpath=None, create_if_not_existing=False): """ Return WebDAV handle to root of configured connector object including configured connector_subpath. """ registry = getUtility(IRegistry) settings = registry.forInterface(IConnectorSettings) adapted = IConnector(self) url = adapted.connector_url or settings.connector_url if adapted.connector_subpath: url += '/{}'.format(adapted.connector_subpath) if subpath: url += '/{}'.format(urllib.quote(subpath)) # system-wide credentials username = settings.connector_username password = settings.connector_password or '' # local credentials override the system credentials if adapted.connector_url: username = adapted.connector_username or '' password = adapted.connector_password or '' if create_if_not_existing: util = getUtility(IConnectorHandle) handle = util.get_handle() if not handle.exists(adapted.connector_subpath): handle.makedir(adapted.connector_subpath, recursive=True) url = '{}/{}'.format(handle.url.strip('/'), adapted.connector_subpath) try: return get_fs_wrapper(url, credentials=dict(username=username, password=password), context=self) except fs.errors.ResourceNotFoundError: LOG.warn(u'Error accessing {}::{}::{}'.format( self.absolute_url(), url, self.REQUEST.get('HTTP_USER_AGENT')), exc_info=True) raise zExceptions.NotFound(url) except fs.errors.ResourceInvalidError: parts = url.rsplit('/', 1) wrapper = get_fs_wrapper(parts[0], credentials=dict( username=username, password=password), context=self) wrapper.__leaf__ = True wrapper.__leaf_filename__ = parts[1] return wrapper except fs.errors.RemoteConnectionError as e: # LOG.error(u'Error accessing {}::{}::{}'.format( # self.absolute_url(), # url, # self.REQUEST.get('HTTP_USER_AGENT')), # exc_info=True) exc = RuntimeError(url) exc.url = url raise exc except Exception as e: print repr(e) LOG.warn(u'Error accessing {}::{}::{}'.format( self.absolute_url(), url, self.REQUEST.get('HTTP_USER_AGENT')), exc_info=True) e.url = url raise e
def parse_folder(self, family, directory, version_suffix=None): """ Parse a given folder for XML schema files (.xsd) or DTD files (.dtd). """ if directory.startswith('/'): directory = 'file://' + directory try: handle = fs.opener.fsopendir(directory) except Exception as e: raise IOError( u'Directory "{}" does not exist ({})'.format(directory, e)) for name in handle.listdir(): fullname = os.path.join(directory, name) LOG.debug(u'Parsing "{}"'.format(fullname)) base, ext = os.path.splitext(name) registered_name = name if version_suffix: basename, ext = os.path.splitext(name) registered_name = '{}-{}{}'.format(basename, version_suffix, ext) key = '{}::{}'.format(family, registered_name) ts = time.time() if ext == '.dtd': with handle.open(name, 'rb') as fp: validator = lxml.etree.DTD(fp) validator_type = 'DTD' elif ext == '.xsd': with handle.open(name, 'rb') as fp: try: schema_doc = lxml.etree.XML(fp.read()) validator = lxml.etree.XMLSchema(schema_doc) except Exception as e: LOG.error(u'Unable to parse XML Schema ({})'.format( e), exc_info=True) continue validator_type = 'XSD' elif ext == '.rng': with handle.open(name, 'rb') as fp: relaxng_doc = lxml.etree.XML(fp.read()) validator = lxml.etree.RelaxNG(relaxng_doc) validator_type = 'RELAXNG' elif ext == '.sch': with handle.open(name, 'rb') as fp: relaxng_doc = lxml.etree.XML(fp.read()) validator = lxml.isoschematron.Schematron(relaxng_doc) validator_type = 'SCHEMATRON' else: continue if key in self.registry: raise ValueError('{} already registered'.format(key)) duration = time.time() - ts self.registry[key] = dict( family=family, name=registered_name, validation=validator, path=fullname, info=handle.getinfo(name), duration=duration, type=validator_type, registered=datetime.datetime.utcnow()) if duration > 3: LOG.warn( 'Slow loading/parsing of ({}, {}), duration: {:0.3f} seconds'.format(key, fullname, duration)) LOG.info('Registered ({}, {}), duration: {:0.3f} seconds'.format( key, fullname, duration))
def parse_folder(self, family, directory, version_suffix=None): """ Parse a given folder for XML schema files (.xsd) or DTD files (.dtd). """ if directory.startswith('/'): directory = 'file://' + directory try: handle = fs.opener.fsopendir(directory) except Exception as e: raise IOError( u'Directory "{}" does not exist ({})'.format(directory, e)) for name in handle.listdir(): fullname = os.path.join(directory, name) LOG.info(u'Parsing "{}"'.format(fullname)) base, ext = os.path.splitext(name) registered_name = name if version_suffix: basename, ext = os.path.splitext(name) registered_name = '{}-{}{}'.format(basename, version_suffix, ext) key = '{}::{}'.format(family, registered_name) ts = time.time() if ext == '.dtd': with handle.open(name, 'rb') as fp: validator = lxml.etree.DTD(fp) validator_type = 'DTD' elif ext == '.xsd': with handle.open(name, 'rb') as fp: try: schema_doc = lxml.etree.XML(fp.read()) validator = lxml.etree.XMLSchema(schema_doc) except Exception as e: LOG.error(u'Unable to parse XML Schema ({})'.format( e), exc_info=True) continue validator_type = 'XSD' elif ext == '.rng': with handle.open(name, 'rb') as fp: relaxng_doc = lxml.etree.XML(fp.read()) validator = lxml.etree.RelaxNG(relaxng_doc) validator_type = 'RELAXNG' elif ext == '.sch': with handle.open(name, 'rb') as fp: relaxng_doc = lxml.etree.XML(fp.read()) validator = lxml.isoschematron.Schematron(relaxng_doc) validator_type = 'SCHEMATRON' else: continue if key in self.registry: raise ValueError('{} already registered'.format(key)) duration = time.time() - ts self.registry[key] = dict( family=family, name=registered_name, validation=validator, path=fullname, info=handle.getinfo(name), duration=duration, type=validator_type, registered=datetime.datetime.utcnow()) if duration > 3: LOG.warn( 'Slow loading/parsing of ({}, {}), duration: {:0.3f} seconds'.format(key, fullname, duration)) LOG.info('Registered ({}, {}), duration: {:0.3f} seconds'.format( key, fullname, duration))