Florian Kleedorfer created JENA-2320:
----------------------------------------

             Summary: Callback or more detailed report from SHACL validation
                 Key: JENA-2320
                 URL: https://issues.apache.org/jira/browse/JENA-2320
             Project: Apache Jena
          Issue Type: New Feature
          Components: SHACL
            Reporter: Florian Kleedorfer


Summary:
Could we make the ValidationContext constructors protected and use instance 
methods instead of the current static factory methods (at least for 
{{create(ValidationContext)}} so that a subclassed ValidationContext can be 
provided for validation that can also be propagated into the sub-evaluations?

Explanation:

I'm working on code that quite intimately builds on jena's SHACL validation. 
Here's what I'm trying to do: There is a set of nodes V in the data graph G 
that I am trying to find substitutions for by other RDF nodes. A substitution 
is valid if no shape has a violation. Now for figuring out which substitutions 
might be valid, it is not enough to know that shape S is violated on focus node 
F - I need to know why exactly - i.e. which of my substitutions made the 
validation fail. I already have a system in place that notices which nodes in V 
(or their respective substitutes) are looked at during evaluation of S. Also, 
If the violation is of a simple property shape, I can follow the 
{{sh:ResultPath}} of the report from F to get to the node; however, if the 
shape uses an aggregate like {{sh:xOne}}, or a {{sh:node}} the report does not 
help me find the culprit, I just know it's one of the nodes that were looked at.

I have two ideas how this could be fixed for me:

*More detailed report*
An optional, non-standard report could be generated that always allows me to 
figure out which of my substitutions for nodes in V (or lack thereof) caused 
the violation. Maybe it would be enough to pass the validationreport of 
sub-evaluations through to the main one.

or 

*ValidationCallback*
A callback that I can provide for an evaluation, either as a method param to 
{{VLib.validateShape()}}, as an optional member in the ValidationContext, or in 
a ThreadLocal. The latter may be a problem if evaluation is done in multiple 
threads, so maybe that's not such a great idea. 
The callback would need to be called whenever a reportEntry is added to the 
context - also in sub-evaluations that use a new context.

One way with minimal impact on the codebase to achieve at least the second of 
these solutions would be to allow me to extend the {{ValidationContext}} 
(currently not possible because of the private constructors) and to allow me to 
return my subclassed {{ValidationContext}} in 
{{ValidationContext.create(ValidationContext)}} - and maybe also in the other, 
currently static, factory methods. If that was possible, I could easily 
intercept {{reportEntry}} methods, which (I hope) is enough.

If that is an option, I'll provide a PR, so that I can make sure the suggested 
changes really do solve my problem.




--
This message was sent by Atlassian Jira
(v8.20.1#820001)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to