@@ -111,16 +111,19 @@ def execute_check(self, context: ValidationContext):
111111 self .requirement .profile .identifier , self .identifier )
112112 with SHACLValidationContextManager (self , context ) as ctx :
113113 # The check is executed only if the profile is the most specific one
114- logger .debug ("SHACL Validation of profile %s requirement %s started" ,
114+ logger .debug ("SHACL Validation of requirement check %s (profile: %s) started" ,
115115 self .requirement .profile .identifier , self .identifier )
116116 result = self .__do_execute_check__ (ctx )
117- ctx .current_validation_result = self not in result
117+ ctx .current_validation_result = self .identifier not in result
118+ logger .debug ("SHACL Validation of requirement check %s (profile: %s) finished with result %s" ,
119+ self .requirement .profile .identifier , self .identifier , ctx .current_validation_result )
118120 return ctx .current_validation_result
119121 except SHACLValidationAlreadyProcessed :
120- logger .debug ("SHACL Validation of profile %s already processed" , self .requirement .profile .identifier )
122+ logger .debug ("SHACL Validation of requirement check %s (profile: %s) already processed" ,
123+ self .requirement .identifier , self .requirement .profile .identifier )
121124 # The check belongs to a profile which has already been processed
122125 # so we can skip the validation and return the specific result for the check
123- return self not in [i .check for i in context .result .get_issues ()]
126+ return self . identifier not in [i .check . identifier for i in context .result .get_issues ()]
124127 except SHACLValidationSkip as e :
125128 logger .debug ("SHACL Validation of profile %s requirement %s skipped" ,
126129 self .requirement .profile .identifier , self .identifier )
@@ -187,7 +190,9 @@ def __do_execute_check__(self, shacl_context: SHACLValidationContext):
187190 # if the validation fails, process the failed checks
188191 failed_requirements_checks = set ()
189192 failed_requirements_checks_violations : dict [str , SHACLViolation ] = {}
190- failed_requirement_checks_notified = []
193+ failed_requirement_checks_notified = [_ .check .identifier for _ in shacl_context .result .get_issues (
194+ min_severity = shacl_context .settings .requirement_severity )]
195+
191196 logger .debug ("Parsing Validation with result: %s" , shacl_result )
192197 # process the failed checks to extract the requirement checks involved
193198 for violation in shacl_result .violations :
@@ -215,13 +220,18 @@ def __do_execute_check__(self, shacl_context: SHACLValidationContext):
215220 violation_message = violation .get_result_message (shacl_context .rocrate_uri )
216221 registered_check_issues = shacl_context .result .get_issues_by_check (requirementCheck )
217222 skip_requirement_check = False
223+ # check if the violation is already registered
224+ # and skip the requirement check if it is
218225 for check_issue in registered_check_issues :
219226 if check_issue .message == violation_message and \
220227 check_issue .violatingProperty == violating_property and \
221228 check_issue .violatingEntity == violating_entity and \
222229 check_issue .violatingPropertyValue == violation .value :
223230 skip_requirement_check = True
231+ logger .debug ("Skipping requirement check %s: %s" , requirementCheck .identifier ,
232+ violation_message )
224233 break
234+ # if the check is not to be skipped, add the issue to the context
225235 if not skip_requirement_check :
226236 c = shacl_context .result .add_issue (
227237 message = violation .get_result_message (shacl_context .rocrate_uri ),
@@ -240,11 +250,13 @@ def __do_execute_check__(self, shacl_context: SHACLValidationContext):
240250 # all together and not profile by profile
241251 if requirementCheck .identifier not in failed_requirement_checks_notified :
242252 shacl_context .result ._add_executed_check (requirementCheck , False )
243- shacl_context .validator .notify (RequirementCheckValidationEvent (
244- EventType .REQUIREMENT_CHECK_VALIDATION_END ,
245- requirementCheck , validation_result = False ))
246- # failed_requirement_checks_notified.append(requirementCheck.identifier)
247- logger .debug ("Added validation issue to the context: %s" , c )
253+ if requirementCheck .identifier not in failed_requirement_checks_notified and \
254+ requirementCheck .requirement .profile != shacl_context .current_validation_profile :
255+ failed_requirement_checks_notified .append (requirementCheck .identifier )
256+ shacl_context .validator .notify (RequirementCheckValidationEvent (
257+ EventType .REQUIREMENT_CHECK_VALIDATION_END ,
258+ requirementCheck , validation_result = False ))
259+ logger .debug ("Added validation issue to the context: %s" , c )
248260
249261 # if the fail fast mode is enabled, stop the validation after the first failed check
250262 if shacl_context .fail_fast :
@@ -257,7 +269,7 @@ def __do_execute_check__(self, shacl_context: SHACLValidationContext):
257269 if not isinstance (requirementCheck , SHACLCheck ):
258270 logger .debug ("Skipped check is not a SHACLCheck: %s" , requirementCheck .identifier )
259271 continue
260- # if requirementCheck.requirement.profile != shacl_context.current_validation_profile and \
272+ # if requirementCheck.requirement.profile != shacl_context.current_validation_profile and
261273 if requirementCheck .identifier not in failed_requirement_checks_notified :
262274 failed_requirement_checks_notified .append (requirementCheck .identifier )
263275 shacl_context .result ._add_executed_check (requirementCheck , True )
0 commit comments