1
1
package org .nanopub .fdo ;
2
2
3
+ import com .google .gson .Gson ;
4
+ import org .eclipse .rdf4j .model .IRI ;
5
+ import org .eclipse .rdf4j .model .Statement ;
6
+ import org .eclipse .rdf4j .model .ValueFactory ;
7
+ import org .eclipse .rdf4j .model .impl .SimpleValueFactory ;
8
+ import org .eclipse .rdf4j .model .vocabulary .RDF ;
3
9
import org .nanopub .MalformedNanopubException ;
10
+ import org .nanopub .fdo .rest .gson .ParsedSchemaResponse ;
4
11
5
12
import java .io .IOException ;
13
+ import java .net .URI ;
6
14
import java .net .URISyntaxException ;
15
+ import java .net .http .HttpClient ;
16
+ import java .net .http .HttpRequest ;
17
+ import java .net .http .HttpResponse ;
18
+ import java .util .HashSet ;
19
+ import java .util .Set ;
20
+
21
+ import static org .nanopub .fdo .FdoNanopubCreator .FDO_TYPE_PREFIX ;
7
22
8
23
// TODO class that provides the Op.Validate operations.
9
24
// See https://fdo-connect.gitlab.io/ap1/architecture-documentation/main/operation-specification/
10
25
public class ValidateFdo {
11
26
27
+ private static final ValueFactory vf = SimpleValueFactory .getInstance ();
28
+
29
+ private static final IRI SHACL_MAX_COUNT = vf .createIRI ("http://www.w3.org/ns/shacl#maxCount" );
30
+ private static final IRI SHACL_MIN_COUNT = vf .createIRI ("http://www.w3.org/ns/shacl#minCount" );
31
+ private static final IRI SHACL_PATH = vf .createIRI ("http://www.w3.org/ns/shacl#path" );
32
+ private static final IRI SHACL_TARGET = vf .createIRI ("http://www.w3.org/ns/shacl#targetClass" );
33
+ private static final IRI SHACL_PROPERTY = vf .createIRI ("http://www.w3.org/ns/shacl#property" );
34
+ private static final IRI SHACL_NODE_SHAPE = vf .createIRI ("http://www.w3.org/ns/shacl#NodeShape" );
35
+
36
+ private static final IRI TEMP_TYPE = vf .createIRI ("https://w3id.org/kpxl/temptype" );
37
+
38
+ private static HttpClient client = HttpClient .newHttpClient ();
39
+
12
40
private ValidateFdo () {} // no instances allowed
13
41
14
42
// TODO Just a boolean as return value. Later probably an object that also includes errors/warnings.
@@ -17,11 +45,42 @@ public static boolean isValid(FdoMetadata fdoMetadata) throws MalformedNanopubEx
17
45
String profileId = FdoUtils .extractHandle (fdoMetadata .getProfile ());
18
46
String schemaUrl = RetrieveFdo .retrieveMetadataFromHandle (profileId ).getSchemaUrl ();
19
47
20
- // TODO get construct shacl from schema
21
- throw new RuntimeException ("Not yet implemented" );
48
+ HttpRequest req = HttpRequest .newBuilder ().GET ().uri (new URI (schemaUrl )).build ();
49
+ HttpResponse <String > httpResponse = client .send (req , HttpResponse .BodyHandlers .ofString ());
50
+
51
+ Set <Statement > shaclShape = createShaclShapeFromJson (httpResponse );
52
+ Set <Statement > data = addTypeStatement (fdoMetadata );
22
53
23
- // return ShaclValidator.validateShacl(shaclShape, fdoMetadata.getStatements());
54
+ System .out .println ("Validating FdoMetadata " + fdoMetadata .getId ());
55
+ System .out .println ("Against Schema " + schemaUrl );
56
+
57
+ return ShaclValidator .validateShacl (shaclShape , data );
58
+ }
59
+
60
+ private static Set <Statement > addTypeStatement (FdoMetadata fdoMetadata ) {
61
+ Set <Statement > data = fdoMetadata .getStatements ();
62
+ Statement first = data .toArray (new Statement [0 ])[0 ];
63
+ data .add (vf .createStatement (first .getSubject (), RDF .TYPE , TEMP_TYPE ));
64
+ return data ;
24
65
}
25
66
67
+ public static Set <Statement > createShaclShapeFromJson (HttpResponse <String > httpResponse ) {
68
+ ParsedSchemaResponse r = new Gson ().fromJson (httpResponse .body (), ParsedSchemaResponse .class );
69
+
70
+ Set <Statement > shaclShape = new HashSet <>();
71
+ String SUBJ_PREFIX = "https://w3id.org/kpxl/shacl/temp/" ;
72
+ int i = 0 ;
73
+ for (String s : r .required ) {
74
+ i ++;
75
+ shaclShape .add (vf .createStatement (vf .createIRI (SUBJ_PREFIX +i ), SHACL_MAX_COUNT , vf .createLiteral (1 )));
76
+ shaclShape .add (vf .createStatement (vf .createIRI (SUBJ_PREFIX +i ), SHACL_MIN_COUNT , vf .createLiteral (1 )));
77
+ shaclShape .add (vf .createStatement (vf .createIRI (SUBJ_PREFIX +i ), SHACL_PATH , vf .createIRI (FDO_TYPE_PREFIX + s )));
78
+ shaclShape .add (vf .createStatement (vf .createIRI (SUBJ_PREFIX ), SHACL_PROPERTY , vf .createIRI (SUBJ_PREFIX +i )));
79
+ }
80
+ shaclShape .add (vf .createStatement (FdoUtils .createIri (SUBJ_PREFIX ), SHACL_TARGET , TEMP_TYPE ));
81
+ shaclShape .add (vf .createStatement (FdoUtils .createIri (SUBJ_PREFIX ), RDF .TYPE , SHACL_NODE_SHAPE ));
82
+
83
+ return shaclShape ;
84
+ }
26
85
27
86
}
0 commit comments