Guillaume RYCKELYNCK c6c2ee9c04 first commit
2024-06-22 22:00:42 +02:00

314 lines
9.6 KiB
Python

class Inconsistency(Exception):
def fix(self):
raise NotImplementedError('Not implemented')
# Scenario 0: unable to parse the GetCapabilities
class UnparseableGetCapabilitiesInconsistency(Inconsistency):
"""
Class for inconsistency when the remote GetCapabilities fails to parse.
"""
error_code = 'ERROR_OWS_GETCAPABILITIES'
error = True
def __init__(self, ows_url, msg):
self.ows_url = ows_url
self.msg = msg
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'ows_url': self.ows_url,
'message': self.msg,
}
def __str__(self):
return "The OWS GetCapabilities is unparseable at %s: %s" % (self.ows_url, self.msg)
# Scenario 1.a: GN -> GS (strict method)
class GnToGsLayerNotFoundInconsistency(Inconsistency):
"""
Class for inconsistency when a metadata contains URL to a layer which is not valid
"""
error_code = 'ERROR_MD_URL_LAYER_NOT_VALID'
error = True
def __init__(self, layer_url, layer_name, md_uuid=None, msg=None):
self.layer_url = layer_url
self.layer_name = layer_name
self.md_uuid = md_uuid
self.msg = msg
def set_md_uuid(self, uuid):
self.md_uuid = uuid
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'layer_url': self.layer_url,
'layer_name': self.layer_name,
'md_uuid': self.md_uuid,
'message': self.msg,
}
def __str__(self):
return "Metadata %s references a layer : %s on %s that does not exist (%s)" \
% (self.md_uuid, self.layer_name, self.layer_url, self.msg)
class GnToGsOtherError(Inconsistency):
"""
Class for errors in underlying libraries (owslib), not directly
managed by this project
"""
error_code = 'ERROR_MD_OTHER'
error = True
def __init__(self, layer_url, layer_name, exc):
self.layer_url = layer_url
self.layer_name = layer_name
self.exc = exc
def set_md_uuid(self, uuid):
self.md_uuid = uuid
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'layer_url': self.layer_url,
'layer_name': self.layer_name,
'md_uuid': self.md_uuid,
'message': str(self.exc),
}
def __str__(self):
return "%s: %s" % (self.exc.__class__.__name__, str(self.exc))
class GnToGsInvalidCapabilitiesUrl(Inconsistency):
"""
Class for inconsistency when a metadata contains URL to a layer which is not valid
"""
error_code = 'ERROR_MD_LAYER_GETCAPABILITIES_NOT_VALID'
error = True
def __init__(self, layer_url, layer_name, is_wms, md_uuid=None, msg=None):
self.layer_url = layer_url
self.layer_name = layer_name
self.md_uuid = md_uuid
self.msg = msg
self.is_wms = is_wms
def set_md_uuid(self, uuid):
self.md_uuid = uuid
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'layer_url': self.layer_url,
'layer_name': self.layer_name,
'md_uuid': self.md_uuid,
'message': self.msg,
'is_wms': self.is_wms,
}
def __str__(self):
return "Metadata %s references a layer : %s on %s which is not a valid %s GetCapabilities URL" \
% (self.md_uuid, self.layer_name, self.layer_url,
"WMS" if self.is_wms else "WFS")
class GnToGsNoOGCWmsDefined(Inconsistency):
"""
Class used to describe a data metadata which misses a URL with OGC:WMS protocol
"""
error_code = 'ERROR_MD_WMS_MISSING'
error = True
def __init__(self, md_uuid):
self.md_uuid = md_uuid
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'md_uuid': self.md_uuid,
'message': "Metadata does not reference any url with protocol OGC:WMS",
}
def __str__(self):
return "Metadata %s does not reference any url with protocol OGC:WMS" \
% self.md_uuid
class GnToGsNoOGCWfsDefined(Inconsistency):
"""
Class used to describe a data metadata which misses a URL with OGC:WFS protocol
"""
error_code = 'ERROR_MD_WFS_MISSING'
error = True
def __init__(self, md_uuid):
self.md_uuid = md_uuid
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'md_uuid': self.md_uuid,
'message': "Metadata does not reference any url with protocol OGC:WFS"
}
def __str__(self):
return "Metadata %s does not reference any url with protocol OGC:WFS" \
% self.md_uuid
class GnToGsNoGetCapabilitiesUrl(Inconsistency):
"""
Class used to describe when a service metadata does not reference a GetCapabilities
service URL.
"""
error_code = 'ERROR_MD_GETCAPABILITIES_MISSING'
error = True
def __init__(self, service_md_uuid, datamd_uuid):
self.service_md_uuid = service_md_uuid
self.data_md_uuid = data_md_uuid
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'service_md_uuid': self.service_md_uuid,
'data_md_uuid': self.data_md_uuid,
'message': "Service Metadata linked to the data metadata has no GetCapabilities URL defined"
}
def __str__(self):
return "Service Metadata \"%s\" linked to the data metadata \"%s\" has no " \
"GetCapabilities URL defined" % (self.servicemd_uuid, self.datamd_uuid)
# Scenario 1.c: GS -> GN
class GsToGnMetadataInvalidInconsistency(Inconsistency):
"""
Class which traces inconsistencies when a layer defines a Metadata URL which is
not reachable or invalid.
"""
error_code = 'ERROR_GS_MD_NOT_VALID'
error = True
layer_index = 0
def __init__(self, md_url, msg, layer_name=None):
self.md_url = md_url
self.layer_name = layer_name
self.msg = msg
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'md_url': self.md_url,
'layer_name': self.layer_name,
'message': self.msg,
'layer_index': self.layer_index,
}
def __str__(self):
return "Metadata %s not found or invalid for layer '%s': %s" % (self.md_url, self.layer_name, self.msg)
class GsMetadataMissingInconsistency(Inconsistency):
"""
Class which traces inconsistencies when a layer is defined in the WMS GetCapabilities
with no metadata URL.
Note: this class is used in both scenarii (2 and 3), hence the name.
"""
error_code = 'ERROR_GS_MD_MISSING'
error = True
def __init__(self, layer_name, layer_idx=None):
self.layer_name = layer_name
self.layer_index = layer_idx
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'layer_index': self.layer_index,
'layer_name': self.layer_name,
'message': "No metadata defined for layer"
}
def __str__(self):
return "No metadata defined for layer %s" % self.layer_name
# Scenario 3: Inconsistency to keep track of errors when trying to insert a metadata
class GsToGnUnableToCreateServiceMetadataInconsistency(Inconsistency):
"""
Class which gathers errors when trying to CSW-T insert a service metadata.
"""
error_code = 'ERROR_GS_MD_CREATE_NOT_VALID'
error = True
def __init__(self, workspace, catalogue_url, caused_by):
self.workspace = workspace
self.catalogue_url = catalogue_url
self.caused_by = caused_by
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'workspace': self.workspace,
'catalogue_url': self.catalogue_url,
'caused_by': self.caused_by,
'message': "Unable to save the service metadata",
}
def __str__(self):
return "Unable to save the service metadata for workspace \"%s\" into %s: %s" % (self.workspace,
self.catalogue_url, self.caused_by)
class GsToGnUnableToUpdateServiceMetadataInconsistency(Inconsistency):
"""
Class which gathers errors when trying to CSW-T update a service metadata.
"""
error_code = 'ERROR_MD_UPDATE_NOT_VALID'
error = True
def __init__(self, workspace, mds_uuid, catalogue_url, caused_by):
self.workspace = workspace
self.catalogue_url = catalogue_url
self.caused_by = caused_by
self.mds_uuid = mds_uuid
def get_error(self):
return {
'error': self.error,
'error_code': self.error_code,
'workspace': self.workspace,
'catalogue_url': self.catalogue_url,
'caused_by': self.caused_by,
'mds_uuid': self.mds_uuid,
'message': "Unable to update the service metadata",
}
def __str__(self):
return "Unable to update the service metadata (uuid: %s) for workspace \"%s\" into %s: %s" % (self.mds_uuid,
self.workspace, self.catalogue_url, self.caused_by)