1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.lod;
20
21 import java.io.IOException;
22 import java.io.StringReader;
23 import java.io.StringWriter;
24 import java.net.URI;
25 import java.util.Collections;
26 import java.util.List;
27 import java.util.stream.Stream;
28
29 import org.apache.logging.log4j.LogManager;
30 import org.eclipse.rdf4j.rio.RDFFormat;
31 import org.eclipse.rdf4j.rio.RDFHandlerException;
32 import org.eclipse.rdf4j.rio.RDFParseException;
33 import org.eclipse.rdf4j.rio.RDFParser;
34 import org.eclipse.rdf4j.rio.RDFWriter;
35 import org.eclipse.rdf4j.rio.Rio;
36 import org.glassfish.jersey.server.ResourceConfig;
37 import org.glassfish.jersey.server.ServerProperties;
38 import org.mycore.common.config.MCRConfiguration2;
39 import org.mycore.frontend.jersey.access.MCRRequestScopeACLFilter;
40 import org.mycore.restapi.MCRCORSResponseFilter;
41 import org.mycore.restapi.MCRIgnoreClientAbortInterceptor;
42 import org.mycore.restapi.MCRSessionFilter;
43 import org.mycore.restapi.MCRTransactionFilter;
44 import org.mycore.restapi.converter.MCRWrappedXMLWriter;
45
46 import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource;
47 import jakarta.ws.rs.ApplicationPath;
48 import jakarta.ws.rs.core.Response;
49
50
51
52
53
54
55 @ApplicationPath("/open-data")
56 public class MCRJerseyLodApp extends ResourceConfig {
57
58
59 private static List<RDFFormat> RDF_OUTPUT_FORMATS = List.of(RDFFormat.TURTLE, RDFFormat.JSONLD);
60
61
62
63
64 public MCRJerseyLodApp() {
65 super();
66 initAppName();
67 property(ServerProperties.APPLICATION_NAME, getApplicationName());
68 packages(getRestPackages());
69 property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, true);
70 register(MCRSessionFilter.class);
71 register(MCRTransactionFilter.class);
72 register(MCRLodFeature.class);
73 register(MCRCORSResponseFilter.class);
74 register(MCRRequestScopeACLFilter.class);
75 register(MCRIgnoreClientAbortInterceptor.class);
76 }
77
78
79
80
81 protected void initAppName() {
82 setApplicationName(MCRConfiguration2.getString("MCR.NameOfProject").orElse("MyCoRe") + " LOD-Endpoint");
83 LogManager.getLogger().info("Initiialize {}", getApplicationName());
84 }
85
86
87
88
89
90 protected String[] getRestPackages() {
91 return Stream
92 .concat(
93 Stream.of(MCRWrappedXMLWriter.class.getPackage().getName(),
94 OpenApiResource.class.getPackage().getName()),
95 MCRConfiguration2.getOrThrow("MCR.LOD.Resource.Packages", MCRConfiguration2::splitValue))
96 .toArray(String[]::new);
97 }
98
99
100
101
102
103
104
105
106
107 public static Response returnLinkedData(String rdfxmlString, URI uri, List<String> mimeTypes) {
108 try {
109 for (RDFFormat rdfOutFormat : RDF_OUTPUT_FORMATS) {
110 if (!Collections.disjoint(mimeTypes, rdfOutFormat.getMIMETypes())) {
111 RDFParser rdfParser = Rio.createParser(RDFFormat.RDFXML);
112 StringWriter sw = new StringWriter();
113 RDFWriter rdfWriter = Rio.createWriter(rdfOutFormat, sw);
114 rdfParser.setRDFHandler(rdfWriter);
115 rdfParser.parse(new StringReader(rdfxmlString), uri.toString());
116
117 return Response.ok(sw.toString()).type(rdfOutFormat.getDefaultMIMEType() + ";charset=UTF-8")
118 .build();
119 }
120 }
121 } catch (IOException | RDFParseException | RDFHandlerException e) {
122
123 }
124
125 return Response.ok(rdfxmlString, RDFFormat.RDFXML.getDefaultMIMEType() + ";charset=UTF-8")
126 .build();
127 }
128 }