19
19
import com .atomgraph .client .MediaTypes ;
20
20
import com .atomgraph .client .util .DataManager ;
21
21
import com .atomgraph .client .vocabulary .AC ;
22
+ import com .atomgraph .core .exception .BadGatewayException ;
22
23
import com .atomgraph .core .io .ModelProvider ;
23
24
import com .atomgraph .linkeddatahub .apps .model .Dataset ;
24
25
import com .atomgraph .linkeddatahub .client .filter .auth .IDTokenDelegationFilter ;
25
26
import com .atomgraph .linkeddatahub .client .filter .auth .WebIDDelegationFilter ;
26
27
import com .atomgraph .linkeddatahub .model .Agent ;
28
+ import com .atomgraph .linkeddatahub .model .Service ;
27
29
import com .atomgraph .linkeddatahub .server .security .AgentContext ;
28
30
import com .atomgraph .linkeddatahub .server .security .IDTokenSecurityContext ;
31
+ import com .atomgraph .linkeddatahub .vocabulary .LDH ;
29
32
import java .net .URI ;
30
33
import java .net .URISyntaxException ;
31
34
import java .util .ArrayList ;
42
45
import javax .ws .rs .QueryParam ;
43
46
import javax .ws .rs .client .Entity ;
44
47
import javax .ws .rs .client .WebTarget ;
48
+ import javax .ws .rs .container .ContainerRequestContext ;
45
49
import javax .ws .rs .core .Context ;
46
50
import javax .ws .rs .core .HttpHeaders ;
47
51
import javax .ws .rs .core .MediaType ;
50
54
import javax .ws .rs .core .SecurityContext ;
51
55
import javax .ws .rs .core .UriInfo ;
52
56
import javax .ws .rs .ext .Providers ;
57
+ import org .apache .jena .query .Query ;
58
+ import org .apache .jena .query .QueryFactory ;
53
59
import org .apache .jena .query .ResultSet ;
54
60
import org .apache .jena .rdf .model .Model ;
55
61
import org .apache .jena .rdf .model .ModelFactory ;
@@ -70,6 +76,8 @@ public class ProxyResourceBase extends com.atomgraph.client.model.impl.ProxyReso
70
76
private static final Logger log = LoggerFactory .getLogger (ProxyResourceBase .class );
71
77
72
78
private final UriInfo uriInfo ;
79
+ private final ContainerRequestContext crc ;
80
+ private final Service service ;
73
81
private final DataManager dataManager ;
74
82
private final MediaType [] readableMediaTypes ;
75
83
private final Providers providers ;
@@ -82,7 +90,9 @@ public class ProxyResourceBase extends com.atomgraph.client.model.impl.ProxyReso
82
90
* @param request current request
83
91
* @param httpHeaders HTTP header info
84
92
* @param mediaTypes registry of readable/writable media types
93
+ * @param service application's SPARQL service
85
94
* @param securityContext JAX-RS security context
95
+ * @param crc request context
86
96
* @param system system application
87
97
* @param httpServletRequest servlet request
88
98
* @param dataManager RDFdata manager
@@ -91,11 +101,13 @@ public class ProxyResourceBase extends com.atomgraph.client.model.impl.ProxyReso
91
101
* @param dataset optional dataset
92
102
*/
93
103
@ Inject
94
- public ProxyResourceBase (@ Context UriInfo uriInfo , @ Context Request request , @ Context HttpHeaders httpHeaders , MediaTypes mediaTypes , @ Context SecurityContext securityContext ,
104
+ public ProxyResourceBase (@ Context UriInfo uriInfo , @ Context Request request , @ Context HttpHeaders httpHeaders , MediaTypes mediaTypes ,
105
+ Optional <Service > service ,
106
+ @ Context SecurityContext securityContext , @ Context ContainerRequestContext crc ,
95
107
com .atomgraph .linkeddatahub .Application system , @ Context HttpServletRequest httpServletRequest , DataManager dataManager , Optional <AgentContext > agentContext ,
96
108
@ Context Providers providers , Optional <Dataset > dataset )
97
109
{
98
- this (uriInfo , request , httpHeaders , mediaTypes , securityContext ,
110
+ this (uriInfo , request , httpHeaders , mediaTypes , service , securityContext , crc ,
99
111
uriInfo .getQueryParameters ().getFirst (AC .uri .getLocalName ()) == null ?
100
112
dataset .isEmpty () ? null : dataset .get ().getProxied (uriInfo .getAbsolutePath ())
101
113
:
@@ -113,7 +125,9 @@ public ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Co
113
125
* @param request current request
114
126
* @param httpHeaders HTTP header info
115
127
* @param mediaTypes registry of readable/writable media types
128
+ * @param service application's SPARQL service
116
129
* @param securityContext JAX-RS security context
130
+ * @param crc request context
117
131
* @param uri <code>uri</code> URL param
118
132
* @param endpoint <code>endpoint</code> URL param
119
133
* @param accept <code>accept</code> URL param
@@ -124,13 +138,17 @@ public ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Co
124
138
* @param agentContext authenticated agent's context
125
139
* @param providers registry of JAX-RS providers
126
140
*/
127
- protected ProxyResourceBase (@ Context UriInfo uriInfo , @ Context Request request , @ Context HttpHeaders httpHeaders , MediaTypes mediaTypes , @ Context SecurityContext securityContext ,
141
+ protected ProxyResourceBase (@ Context UriInfo uriInfo , @ Context Request request , @ Context HttpHeaders httpHeaders , MediaTypes mediaTypes ,
142
+ Optional <Service > service ,
143
+ @ Context SecurityContext securityContext , @ Context ContainerRequestContext crc ,
128
144
@ QueryParam ("uri" ) URI uri , @ QueryParam ("endpoint" ) URI endpoint , @ QueryParam ("accept" ) MediaType accept , @ QueryParam ("mode" ) URI mode ,
129
145
com .atomgraph .linkeddatahub .Application system , @ Context HttpServletRequest httpServletRequest , DataManager dataManager , Optional <AgentContext > agentContext ,
130
146
@ Context Providers providers )
131
147
{
132
148
super (uriInfo , request , httpHeaders , mediaTypes , uri , endpoint , accept , mode , system .getClient (), httpServletRequest );
133
149
this .uriInfo = uriInfo ;
150
+ this .service = service .get ();
151
+ this .crc = crc ;
134
152
this .dataManager = dataManager ;
135
153
this .providers = providers ;
136
154
this .system = system ;
@@ -186,7 +204,28 @@ public Response get(WebTarget target)
186
204
throw new BadRequestException (ex );
187
205
}
188
206
189
- return super .get (target );
207
+ Query query = QueryFactory .create ("DESCRIBE <" + target .getUri () + ">" );
208
+ Model localModel = getService ().getSPARQLClient ().loadModel (query );
209
+ getContainerRequestContext ().setProperty (LDH .localGraph .getURI (), localModel );
210
+
211
+ try
212
+ {
213
+ Response response = super .get (target );
214
+
215
+ if (response .getEntity () instanceof Model model )
216
+ {
217
+ getContainerRequestContext ().setProperty (LDH .originalGraph .getURI (), ModelFactory .createDefaultModel ().add (model )); // local model without the remote model
218
+ model .add (localModel ); // append the local model to the remote model
219
+ }
220
+
221
+ return response ;
222
+ }
223
+ catch (BadGatewayException ex ) // fallback to the local model in case of error
224
+ {
225
+ getContainerRequestContext ().setProperty (LDH .originalGraph .getURI (), ModelFactory .createDefaultModel ());
226
+ if (!localModel .isEmpty ()) return getResponse (localModel );
227
+ else throw ex ;
228
+ }
190
229
}
191
230
192
231
/**
@@ -242,6 +281,26 @@ public List<Locale> getLanguages()
242
281
return getSystem ().getSupportedLanguages ();
243
282
}
244
283
284
+ /**
285
+ * Returns the SPARQL service of the current application.
286
+ *
287
+ * @return service resource
288
+ */
289
+ public Service getService ()
290
+ {
291
+ return service ;
292
+ }
293
+
294
+ /**
295
+ * Returns request context.
296
+ *
297
+ * @return request context
298
+ */
299
+ public ContainerRequestContext getContainerRequestContext ()
300
+ {
301
+ return crc ;
302
+ }
303
+
245
304
/**
246
305
* Returns request URI information.
247
306
*
0 commit comments